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_type = std::tuple<it_reference_t<Containers>...>;
63 incr_all(std::index_sequence_for<Containers...>{});
88 return to_value(std::index_sequence_for<Containers...>{});
112 return lhs._idx == rhs._idx;
125 return lhs._idx != rhs._idx;
134 template <std::size_t... Is>
135 void incr_all(std::index_sequence<Is...>) {
136 (++std::get<Is>(_current), ...);
139 while (_idx < _max && !all_set(std::index_sequence<Is...>{})) {
140 (++std::get<Is>(_current), ...);
151 template <std::size_t... Is>
152 bool all_set(std::index_sequence<Is...>) {
153 return (... && std::get<Is>(_current)[0].has_value());
162 template <std::size_t... Is>
163 value_type to_value(std::index_sequence<Is...>) {
164 return std::tuple<it_reference_t<Containers>...>(*(std::get<Is>(_current))...);
171 static constexpr std::index_sequence_for<Containers...> _seq{};