#pragma once #include #include #include "detail/arrow_proxy.h" namespace iterator { template class zip_iterator { public: using value_type = std::tuple; using reference = std::tuple; using pointer = void; // tuple cannot be accessed by member using difference_type = std::common_type_t; using iterator_category = std::common_type_t; private: std::tuple iterators_; public: zip_iterator() = default; zip_iterator(Iterators &&... iters) : iterators_(iters...) {} reference operator*() const { return reference(*std::get(iterators_)...); } pointer operator->() const; zip_iterator & operator++() { [[maybe_unused]] auto l = {(++(std::get(iterators_)), 0)...}; return *this; } zip_iterator operator++(int) { zip_iterator tmp = *this; operator++(); return tmp; } zip_iterator & operator--() { [[maybe_unused]] auto l = {(--(std::get(iterators_)), 0)...}; return *this; } zip_iterator operator--(int) { zip_iterator tmp = *this; operator--(); return tmp; } zip_iterator & operator+=(difference_type d) { [[maybe_unused]] auto l = { ((std::get(iterators_) += d), 0)...}; return *this; } zip_iterator operator+(difference_type d) { return zip_iterator{*this} += d; } reference operator[](difference_type d) { return *(*this + d); } zip_iterator & operator-=(difference_type d) { [[maybe_unused]] auto l = { ((std::get(iterators_) -= d), 0)...}; return *this; } zip_iterator operator-(difference_type d) { return zip_iterator{*this} -= d; } difference_type operator-(zip_iterator const & other) { return std::get<0>(iterators_) - std::get<0>(other.iterators_); } bool operator==(zip_iterator const & rhs) const { return iterators_ == rhs.iterators_; } bool operator!=(zip_iterator const & rhs) const { return iterators_ != rhs.iterators_; } bool operator<(zip_iterator const & rhs) const { return iterators_ < rhs.iterators_; } bool operator<=(zip_iterator const & rhs) const { return iterators_ <= rhs.iterators_; } bool operator>(zip_iterator const & rhs) const { return iterators_ > rhs.iterators_; } bool operator>=(zip_iterator const & rhs) const { return iterators_ >= rhs.iterators_; } }; template zip_iterator operator+(typename zip_iterator::difference_type d, zip_iterator iter) { return iter += d; } } template iterator::zip_iterator make_zip_iterator(Is &&... iters) { return {std::forward(iters)...}; }