zip_iterator.hpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #pragma once
  2. #include <iterator>
  3. #include <tuple>
  4. #include "detail/arrow_proxy.h"
  5. namespace iterator {
  6. template <typename... Iterators> class zip_iterator {
  7. public:
  8. using value_type = std::tuple<typename Iterators::value_type...>;
  9. using reference = std::tuple<typename Iterators::reference...>;
  10. using pointer = void; // tuple cannot be accessed by member
  11. using difference_type =
  12. std::common_type_t<typename Iterators::difference_type...>;
  13. using iterator_category =
  14. std::common_type_t<typename Iterators::iterator_category...>;
  15. private:
  16. std::tuple<Iterators...> iterators_;
  17. public:
  18. zip_iterator() = default;
  19. zip_iterator(Iterators &&... iters) : iterators_(iters...) {}
  20. reference operator*() const {
  21. return reference(*std::get<Iterators>(iterators_)...);
  22. }
  23. zip_iterator & operator++() {
  24. [[maybe_unused]] auto l = {(++(std::get<Iterators>(iterators_)), 0)...};
  25. return *this;
  26. }
  27. zip_iterator operator++(int) {
  28. zip_iterator tmp = *this;
  29. operator++();
  30. return tmp;
  31. }
  32. zip_iterator & operator--() {
  33. [[maybe_unused]] auto l = {(--(std::get<Iterators>(iterators_)), 0)...};
  34. return *this;
  35. }
  36. zip_iterator operator--(int) {
  37. zip_iterator tmp = *this;
  38. operator--();
  39. return tmp;
  40. }
  41. zip_iterator & operator+=(difference_type d) {
  42. [[maybe_unused]] auto l = {
  43. ((std::get<Iterators>(iterators_) += d), 0)...};
  44. return *this;
  45. }
  46. zip_iterator operator+(difference_type d) {
  47. return zip_iterator{*this} += d;
  48. }
  49. reference operator[](difference_type d) { return *(*this + d); }
  50. zip_iterator & operator-=(difference_type d) {
  51. [[maybe_unused]] auto l = {
  52. ((std::get<Iterators>(iterators_) -= d), 0)...};
  53. return *this;
  54. }
  55. zip_iterator operator-(difference_type d) {
  56. return zip_iterator{*this} -= d;
  57. }
  58. difference_type operator-(zip_iterator const & other) {
  59. return std::get<0>(iterators_) - std::get<0>(other.iterators_);
  60. }
  61. bool operator==(zip_iterator const & rhs) const {
  62. return iterators_ == rhs.iterators_;
  63. }
  64. bool operator!=(zip_iterator const & rhs) const {
  65. return iterators_ != rhs.iterators_;
  66. }
  67. bool operator<(zip_iterator const & rhs) const {
  68. return iterators_ < rhs.iterators_;
  69. }
  70. bool operator<=(zip_iterator const & rhs) const {
  71. return iterators_ <= rhs.iterators_;
  72. }
  73. bool operator>(zip_iterator const & rhs) const {
  74. return iterators_ > rhs.iterators_;
  75. }
  76. bool operator>=(zip_iterator const & rhs) const {
  77. return iterators_ <= rhs.iterators_;
  78. }
  79. };
  80. template <typename... Is>
  81. zip_iterator<Is...> operator+(typename zip_iterator<Is...>::difference_type d,
  82. zip_iterator<Is...> iter) {
  83. return iter += d;
  84. }
  85. }
  86. template <typename... Is>
  87. iterator::zip_iterator<Is...> make_zip_iterator(Is &&... iters) {
  88. return {std::forward<Is>(iters)...};
  89. }