89 using value_type =
decltype(
94 using It =
typename decltype(t)::type;
95 return hana::type_c<std::iter_value_t<It>>;
98 hana::template_<std::tuple>
111 using difference_type = std::ptrdiff_t;
113 using iterator_category =
decltype(
117 [](
auto el) {
return hana::type_c<iterator_category_t<
typename decltype(+el)::type>>; }
120 return _iterator_category_tag_index(el);
122 hana::type_c<std::random_access_iterator_tag>
129 zip_iterator(T iterators):
130 iterators(iterators) {}
132 zip_iterator(
const zip_iterator& other):
133 iterators(other.iterators) {}
135 zip_iterator(zip_iterator&& other):
136 iterators(std::move(other.iterators)) {}
138 zip_iterator& operator=(zip_iterator&& other) {
139 iterators = std::move(other.iterators);
143 zip_iterator copy() {
144 return { iterators };
147 bool operator==(
const zip_iterator& other)
const {
148 return std::get<0>(iterators) == std::get<0>(other.iterators);
151 bool operator!=(
const zip_iterator& other)
const {
152 return std::get<0>(iterators) != std::get<0>(other.iterators);
155 zip_iterator& operator++() {
156 std::apply([](
auto& ...args) { ((++args),...); }, iterators);
160 zip_iterator operator++(
int) {
161 return map(iterators, [&] (
auto& iter) {
return iter++; });
165 std::apply([&](
auto& ...args) { ((--args),...); }, iterators);
168 zip_iterator operator+(std::ptrdiff_t offset) {
169 return cmap(iterators, [&] (
auto& iter) {
return iter + offset; });
172 zip_iterator operator-(std::ptrdiff_t offset) {
173 return cmap(iterators, [&] (
auto& iter) {
return iter - offset; });
176 zip_iterator& operator=(
const zip_iterator& other) {
177 iterators = other.iterators;
182 return cmap(iterators, [] (
const auto& iter) {
return *iter; });
199 using difference_type = ZEN_NAMESPACE::zip_iterator<T>::difference_type;
200 using value_type = ZEN_NAMESPACE::zip_iterator<T>::value_type;
201 using pointer = ZEN_NAMESPACE::zip_iterator<T>::pointer;
202 using reference = ZEN_NAMESPACE::zip_iterator<T>::reference;
203 using iterator_category = ZEN_NAMESPACE::zip_iterator<T>::iterator_category;