zip_iterator.hpp 1001 B

1234567891011121314151617181920212223242526272829303132333435
  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. };
  24. }
  25. template <typename... Iterators>
  26. iterator::zip_iterator<Iterators...> make_zip_iterator(Iterators &&... iters) {
  27. return {std::forward<Iterators>(iters)...};
  28. }