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{};