22 template <
class Container>
23 using iterator_t =
typename Container::iterator;
26 template <
class Container>
27 using it_reference_t =
decltype(std::declval<Container>()[0]);
31 using value = std::tuple<it_reference_t<Containers>...>;
32 using value_type = std::tuple<std::size_t, it_reference_t<Containers>...>;
64 incr_all(std::index_sequence_for<Containers...>());
89 return std::tuple_cat(std::make_tuple(_idx), to_value(std::index_sequence_for<Containers...>()));
113 return lhs._idx == rhs._idx;
126 return lhs._idx != rhs._idx;
135 template <std::size_t... Is>
136 void incr_all(std::index_sequence<Is...>) {
137 (++std::get<Is>(_current), ...);
140 while (_idx < _max && !all_set(std::index_sequence<Is...>{})) {
141 (++std::get<Is>(_current), ...);
152 template <std::size_t... Is>
153 bool all_set(std::index_sequence<Is...>) {
154 return (... && std::get<Is>(_current)[0].has_value());
163 template <std::size_t... Is>
164 value to_value(std::index_sequence<Is...>) {
165 return std::tuple<it_reference_t<Containers>...>(*(std::get<Is>(_current))...);
172 static constexpr std::index_sequence_for<Containers...> _seq{};