Advertisement
cristi1990an

simple zip impl

Feb 5th, 2023
889
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.78 KB | Source Code | 0 0
  1. template<typename Range>
  2. using all_result_t = decltype(std::views::all(std::declval<Range>()));
  3.  
  4. template<typename ... Ranges>
  5. class zip
  6. {
  7. public:
  8.     struct iterator
  9.     {
  10.         friend constexpr auto operator==(const iterator& lhs, const iterator& rhs)
  11.         {
  12.             return [&]<std::size_t ... I>(std::index_sequence<I...>)
  13.             {
  14.                 return ((std::get<I>(lhs.iterators_) == std::get<I>(rhs.iterators_)) || ...);
  15.             }(std::make_index_sequence<sizeof...(Ranges)>());
  16.         }
  17.  
  18.         constexpr void operator++() noexcept
  19.         {
  20.             [&] <std::size_t ... I>(std::index_sequence<I...>)
  21.             {
  22.                 (++std::get<I>(iterators_), ...);
  23.             }(std::make_index_sequence<sizeof...(Ranges)>());
  24.         }
  25.  
  26.         constexpr auto operator*() noexcept
  27.         {
  28.             return [&] <std::size_t ... I>(std::index_sequence<I...>)
  29.             {
  30.                 return std::forward_as_tuple(*std::get<I>(iterators_) ... );
  31.             }(std::make_index_sequence<sizeof...(Ranges)>());
  32.         }
  33.         std::tuple<std::ranges::iterator_t<all_result_t<Ranges>> ...> iterators_{};
  34.     };
  35.  
  36.     zip() = delete;
  37.  
  38.     template<std::ranges::input_range ... Ranges2>
  39.     explicit constexpr zip(Ranges2&& ... ranges)
  40.         : ranges_{ std::forward<Ranges2>(ranges) ... }
  41.     {
  42.  
  43.     }
  44.  
  45.     constexpr iterator begin() noexcept
  46.     {
  47.         return [&]<std::size_t ... I>(std::index_sequence<I...>)
  48.         {
  49.             return iterator{ .iterators_ = { std::ranges::begin(std::get<I>(ranges_)) ... } };
  50.         }(std::make_index_sequence<sizeof...(Ranges)>());
  51.     }
  52.  
  53.     constexpr iterator end() noexcept
  54.     {
  55.         return [&]<std::size_t ... I>(std::index_sequence<I...>)
  56.         {
  57.             return iterator{ .iterators_ = { std::ranges::end(std::get<I>(ranges_)) ... } };
  58.         }(std::make_index_sequence<sizeof...(Ranges)>());
  59.     }
  60.  
  61. private:
  62.     std::tuple<Ranges ...> ranges_;
  63. };
  64.  
  65. template<std::ranges::input_range ... Ranges>
  66. zip(Ranges&& ...) -> zip <all_result_t<Ranges>...>;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement