32 using value_type = std::tuple<decltype(*std::declval<T>().begin())...>;
34 using pointer = std::tuple<decltype(*std::declval<T>().begin())...> *;
35 using reference = std::tuple<decltype(*std::declval<T>().begin())...> &;
38 std::tuple<decltype(std::declval<T>().begin())...>
_iterators;
40 template <std::size_t... I>
auto deref(std::index_sequence<I...>)
const {
44 template <std::size_t... I>
void increment(std::index_sequence<I...>) {
58 increment(std::index_sequence_for<T...>{});
66 increment(std::index_sequence_for<T...>{});
87 std::make_index_sequence<sizeof...(seqs)>{})},
88 _end{make_tuple_end(_seqs,
89 std::make_index_sequence<
sizeof...(seqs)>{})} {
90 validate_lengths(std::make_index_sequence<
sizeof...(seqs)>{});
101 template <std::size_t... Is>
103 if constexpr (
sizeof...(Is) > 1) {
104 const std::array lengths{
105 std::distance(std::get<Is>(_seqs).begin(),
106 std::get<Is>(_seqs).end())...};
107 for (std::size_t i = 1; i < lengths.size(); ++i)
108 if (lengths[i] != lengths[0])
109 throw std::invalid_argument(
"zip requires equally sized ranges");
113 template <
typename Tuple, std::size_t... Is>
115 return std::make_tuple(std::get<Is>(t).begin()...);
118 template <
typename Tuple, std::size_t... Is>
120 return std::make_tuple(std::get<Is>(t).end()...);
135template <
typename... T>
auto zip(T &&...seqs) {
std::tuple< decltype(*std::declval< T >().begin())... > & reference
Definition zip.hpp:35
std::forward_iterator_tag iterator_category
Definition zip.hpp:31
void increment(std::index_sequence< I... >)
Definition zip.hpp:44
auto deref(std::index_sequence< I... >) const
Definition zip.hpp:40
std::tuple< decltype(*std::declval< T >().begin())... > value_type
Definition zip.hpp:32
auto operator*() const
Provides the operator* operation.
Definition zip.hpp:79
std::tuple< decltype(std::declval< T >().begin())... > _iterators
Definition zip.hpp:38
bool operator!=(const iterator &other) const
Provides the operator!= operation.
Definition zip.hpp:73
iterator(decltype(_iterators) iterators)
Provides the iterator operation.
Definition zip.hpp:52
iterator & operator++()
Provides the operator++ operation.
Definition zip.hpp:57
std::tuple< decltype(*std::declval< T >().begin())... > * pointer
Definition zip.hpp:34
std::tuple< decltype(*std::declval< T >().begin())... > difference_type
Definition zip.hpp:33
iterator operator++(int)
Provides the operator++ operation.
Definition zip.hpp:64
auto constexpr make_tuple_begin(Tuple &&t, std::index_sequence< Is... >)
Definition zip.hpp:114
zip_helper(T &&...seqs)
Provides the zip_helper operation.
Definition zip.hpp:84
iterator end() const
Provides the end operation.
Definition zip.hpp:98
iterator begin() const
Provides the begin operation.
Definition zip.hpp:95
iterator _end
Definition zip.hpp:126
auto constexpr make_tuple_end(Tuple &&t, std::index_sequence< Is... >)
Definition zip.hpp:119
void validate_lengths(std::index_sequence< Is... >) const
Definition zip.hpp:102
iterator _begin
Definition zip.hpp:125
std::tuple< T... > _seqs
Definition zip.hpp:124
Definition blocktensor.hpp:24
auto zip(T &&...seqs)
Provides the zip operation.
Definition zip.hpp:135