75static_assert(__cplusplus >= 201703L,
76 " must be c++17 or greater");
78#include "barretenberg/common/assert.hpp"
96 using tuple_indexes = std::make_index_sequence<std::tuple_size_v<std::remove_reference_t<T>>>;
105 for_each_in_tuple([](
auto&& x) {
return x++; }, iter);
107 auto end = apply2([](
auto x,
auto y) {
return x == y; }, iter, iter_end);
108 if (if_any_in(end)) {
109 apply2([](
auto& x,
auto y) {
return x = y; }, iter, iter_end);
115 bool operator!=(
const zip_iterator& other)
const {
return other.iter != iter; }
116 auto operator*()
const
118 return std::forward<
decltype(get_refs(iter, tuple_indexes{}))>(get_refs(iter, tuple_indexes{}));
123 std::size_t index = 0;
125 template <std::size_t... I>
auto get_refs(T t, std::index_sequence<I...>)
const
127 return std::make_tuple(std::ref(*std::get<I>(t))...);
130 template <
class F,
class A, std::size_t... I>
auto apply2_impl(F&& f, A&& a, A&& b, std::index_sequence<I...>)
132 return std::make_tuple(f(std::get<I>(a), std::get<I>(b))...);
134 template <
class F,
class A>
auto apply2(F&& f, A&& a, A&& b)
136 return apply2_impl(std::forward<F>(f), std::forward<A>(a), std::forward<A>(b), tuple_indexes{});
138 template <
class A, std::size_t... I>
bool if_any_impl(
const A& t, std::index_sequence<I...>)
const
140 return (... || std::get<I>(t));
144 template <
class A>
bool if_any_in(A&& t)
const {
return if_any_impl(std::forward<A>(t), tuple_indexes{}); }
146 template <
class F,
class Tuple, std::size_t... I>
147 auto for_each_in_impl(F&& f, Tuple&& t, std::index_sequence<I...>)
const
149 return std::make_tuple(f(std::get<I>(t))...);
152 template <
class F,
class A>
void for_each_in_tuple(F&& f, A&& t)
const
154 for_each_in_impl(std::forward<F>(f), std::forward<A>(t), tuple_indexes{});
158enum class ZipAllowDifferentSizes { FLAG };
160 using arg_indexes = std::make_index_sequence<
sizeof...(S)>;
164 : args(std::forward<S>(args)...)
167 ASSERT(size() == max_size_impl(arg_indexes{}));
169 zip_view(ZipAllowDifferentSizes , S... args)
170 : args(std::forward<S>(args)...)
174 auto begin()
const {
return get_begins(arg_indexes{}); }
175 auto end()
const {
return get_ends(arg_indexes{}); }
176 [[nodiscard]] std::size_t size()
const {
return size_impl(arg_indexes{}); }
179 std::tuple<S...> args;
180 template <std::size_t... I>
auto get_begins(std::index_sequence<I...>)
const
182 return zip_iterator(std::make_tuple(std::get<I>(args).begin()...), std::make_tuple(std::get<I>(args).end()...));
184 template <std::size_t... I>
auto get_ends(std::index_sequence<I...>)
const
186 return zip_iterator(std::make_tuple(std::get<I>(args).end()...), std::make_tuple(std::get<I>(args).end()...));
188 template <std::size_t... I>
auto size_impl(std::index_sequence<I...>)
const
190 return std::min({ std::size_t(std::get<I>(args).size())... });
192 template <std::size_t... I>
auto max_size_impl(std::index_sequence<I...>)
const
194 return std::max({ std::size_t(std::get<I>(args).size())... });
197 template <
class A, std::size_t... I>
bool if_any_impl(
const A& t, std::index_sequence<I...>)
const
199 return (... || std::get<I>(t));
207template <
class... S>
zip_view(ZipAllowDifferentSizes, S&&...) ->
zip_view<S...>;
The zip_iterator class.
Definition: zip_view.hpp:93
Definition: zip_view.hpp:159