33 #include <boost/iterator/iterator_facade.hpp>
37 template <
class Ituple,
class Rtuple,
class Idx>
40 template <
class Ituple,
class Rtuple, std::size_t... Idxs>
42 public boost::iterator_facade<ZipIteratorBase<Ituple, Rtuple, std::index_sequence<Idxs...>>,
44 boost::forward_traversal_tag,
67 friend class boost::iterator_core_access;
74 return std::forward_as_tuple(*std::get<Idxs>(_iters)...);
80 return _iters == other._iters;
86 advance(difference_type n)
88 ((std::get<Idxs>(_iters) += n), ...);
96 (++std::get<Idxs>(_iters), ...);
104 (--std::get<Idxs>(_iters), ...);
118 template <
class It0,
class... Its>
121 std::tuple<typename std::iterator_traits<It0>::reference&&,
122 typename std::iterator_traits<Its>::reference&&...>,
123 std::make_index_sequence<1 + sizeof...(Its)>>
127 std::tuple<typename std::iterator_traits<It0>::reference&&,
128 typename std::iterator_traits<Its>::reference&&...>,
129 std::make_index_sequence<1 +
sizeof...(Its)>>;
132 Base({std::forward<It0>(it0), std::forward<Its>(its)...})
137 using Base::operator=;
170 #include <boost/iterator/counting_iterator.hpp>
171 #include <boost/iterator/zip_iterator.hpp>
175 template <
class Container,
class... Containers>
179 if constexpr (
sizeof...(Containers))
181 const auto initlist = {
c.size(), cs.size()...};
182 const auto [
lo,
hi] = std::minmax(initlist);
185 throw std::invalid_argument{
"All containers have to be of the same size!"};
189 ZipIterator(boost::counting_iterator<std::size_t>(0),
c.begin(), cs.begin()...),
190 ZipIterator(boost::counting_iterator<std::size_t>(
c.size()),
c.end(), cs.end()...)};
193 template <
class Container,
class... Containers>
197 if constexpr (
sizeof...(Containers))
199 const auto initlist = {
c.size(), cs.size()...};
200 const auto [
lo,
hi] = std::minmax(initlist);
203 throw std::invalid_argument{
"All containers have to be of the same size!"};
210 template <
class Container>