|
|
@@ -3,105 +3,78 @@
|
|
|
#include <iterator>
|
|
|
#include <tuple>
|
|
|
|
|
|
-#include "detail/arrow_proxy.h"
|
|
|
+#include "proxy.h"
|
|
|
|
|
|
-namespace iterator {
|
|
|
- template <typename... Iterators> class zip_iterator {
|
|
|
+namespace iterator::zip {
|
|
|
+ template <typename... Iters> struct impl {
|
|
|
public:
|
|
|
- using value_type = std::tuple<typename Iterators::value_type...>;
|
|
|
- using reference = std::tuple<typename Iterators::reference...>;
|
|
|
- using pointer = void; // tuple cannot be accessed by member
|
|
|
- using difference_type =
|
|
|
- std::common_type_t<typename Iterators::difference_type...>;
|
|
|
- using iterator_category =
|
|
|
- std::common_type_t<typename Iterators::iterator_category...>;
|
|
|
-
|
|
|
- private:
|
|
|
- std::tuple<Iterators...> iterators_;
|
|
|
+ using difference_type = std::common_type_t<
|
|
|
+ typename std::iterator_traits<Iters>::difference_type...>;
|
|
|
|
|
|
public:
|
|
|
- zip_iterator() = default;
|
|
|
- zip_iterator(Iterators &&... iters) : iterators_(iters...) {}
|
|
|
-
|
|
|
- reference operator*() const {
|
|
|
- return reference(*std::get<Iterators>(iterators_)...);
|
|
|
- }
|
|
|
-
|
|
|
- pointer operator->() const;
|
|
|
+ std::tuple<Iters...> data;
|
|
|
|
|
|
- zip_iterator & operator++() {
|
|
|
- [[maybe_unused]] auto l = {(++(std::get<Iterators>(iterators_)), 0)...};
|
|
|
- return *this;
|
|
|
- }
|
|
|
-
|
|
|
- zip_iterator operator++(int) {
|
|
|
- zip_iterator tmp = *this;
|
|
|
- operator++();
|
|
|
- return tmp;
|
|
|
- }
|
|
|
+ public:
|
|
|
+ impl() = default;
|
|
|
+ impl(Iters &&... iters) : data(iters...) {}
|
|
|
|
|
|
- zip_iterator & operator--() {
|
|
|
- [[maybe_unused]] auto l = {(--(std::get<Iterators>(iterators_)), 0)...};
|
|
|
- return *this;
|
|
|
+ auto operator*() const {
|
|
|
+ return std::make_tuple(*std::get<Iters>(data)...);
|
|
|
}
|
|
|
|
|
|
- zip_iterator operator--(int) {
|
|
|
- zip_iterator tmp = *this;
|
|
|
- operator--();
|
|
|
- return tmp;
|
|
|
+ void operator++(int) {
|
|
|
+ [[maybe_unused]] auto l = {(++(std::get<Iters>(data)), 0)...};
|
|
|
}
|
|
|
|
|
|
- zip_iterator & operator+=(difference_type d) {
|
|
|
- [[maybe_unused]] auto l = {
|
|
|
- ((std::get<Iterators>(iterators_) += d), 0)...};
|
|
|
- return *this;
|
|
|
+ void operator--(int) {
|
|
|
+ [[maybe_unused]] auto l = {(--(std::get<Iters>(data)), 0)...};
|
|
|
}
|
|
|
|
|
|
- zip_iterator operator+(difference_type d) {
|
|
|
- return zip_iterator{*this} += d;
|
|
|
+ void operator+=(difference_type d) {
|
|
|
+ [[maybe_unused]] auto l = {((std::get<Iters>(data) += d), 0)...};
|
|
|
}
|
|
|
|
|
|
- reference operator[](difference_type d) { return *(*this + d); }
|
|
|
+ bool operator==(impl const & other) const { return data == other.data; }
|
|
|
|
|
|
- zip_iterator & operator-=(difference_type d) {
|
|
|
- [[maybe_unused]] auto l = {
|
|
|
- ((std::get<Iterators>(iterators_) -= d), 0)...};
|
|
|
- return *this;
|
|
|
+ auto operator-(impl const & other) const {
|
|
|
+ return std::get<0>(data) - std::get<0>(other.data);
|
|
|
}
|
|
|
+ };
|
|
|
+}
|
|
|
|
|
|
- zip_iterator operator-(difference_type d) {
|
|
|
- return zip_iterator{*this} -= d;
|
|
|
- }
|
|
|
+namespace std {
|
|
|
+ template <typename... Iters>
|
|
|
+ struct iterator_traits<::iterator::zip::impl<Iters...>> {
|
|
|
+ using difference_type =
|
|
|
+ common_type_t<typename iterator_traits<Iters>::difference_type...>;
|
|
|
+ using iterator_category =
|
|
|
+ common_type_t<typename iterator_traits<Iters>::iterator_category...>;
|
|
|
+ };
|
|
|
+}
|
|
|
|
|
|
- difference_type operator-(zip_iterator const & other) {
|
|
|
- return std::get<0>(iterators_) - std::get<0>(other.iterators_);
|
|
|
- }
|
|
|
+namespace iterator {
|
|
|
+ template <typename... Iters>
|
|
|
+ class zip_iterator
|
|
|
+ : public proxy<zip::impl<Iters...>, zip_iterator<Iters...>> {
|
|
|
+ private:
|
|
|
+ using super = proxy<zip::impl<Iters...>, zip_iterator<Iters...>>;
|
|
|
|
|
|
- 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_;
|
|
|
- }
|
|
|
+ public:
|
|
|
+ zip_iterator() = default;
|
|
|
+ zip_iterator(Iters &&... iters) : super(std::forward<Iters>(iters)...) {}
|
|
|
};
|
|
|
+}
|
|
|
|
|
|
- template <typename... Is>
|
|
|
- zip_iterator<Is...> operator+(typename zip_iterator<Is...>::difference_type d,
|
|
|
- zip_iterator<Is...> iter) {
|
|
|
- return iter += d;
|
|
|
- }
|
|
|
+namespace std {
|
|
|
+ template <typename... T>
|
|
|
+ struct iterator_traits<::iterator::zip_iterator<T...>>
|
|
|
+ : std::iterator_traits<
|
|
|
+ ::iterator::facade<::iterator::zip_iterator<T...>>> {
|
|
|
+ // This shouldn't need to be implemented, but for some reason my traits
|
|
|
+ // are not correctly deducing here.
|
|
|
+ using iterator_category =
|
|
|
+ common_type_t<typename iterator_traits<T>::iterator_category...>;
|
|
|
+ };
|
|
|
}
|
|
|
|
|
|
template <typename... Is>
|