Advertisement
ulfben

concatenate ranges

May 13th, 2024
932
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.80 KB | None | 0 0
  1. #include <vector>
  2. #include <list>
  3. #include <span>
  4. #include <iterator>
  5.  
  6. template<typename T>
  7. class concat_view {
  8. public:
  9.     using value_type = T;
  10.     using const_pointer = const value_type*;
  11.     using const_reference = const value_type&;
  12.  
  13.     concat_view(std::initializer_list<std::span<const T>> spans) : spans_(spans) {}
  14.  
  15.     class iterator {
  16.     public:
  17.         using value_type = T;
  18.         using difference_type = std::ptrdiff_t;
  19.         using pointer = const T*;
  20.         using reference = const T&;
  21.         using iterator_category = std::input_iterator_tag;
  22.  
  23.         iterator(std::vector<std::span<const T>> const& spans, size_t outer, size_t inner)
  24.             : spans_(spans), outer_(outer), inner_(inner) {
  25.             advance_past_empty_spans();
  26.         }
  27.  
  28.         reference operator*() const {
  29.             return spans_[outer_][inner_];
  30.         }
  31.  
  32.         iterator& operator++() {
  33.             ++inner_;
  34.             advance_past_empty_spans();
  35.             return *this;
  36.         }
  37.  
  38.         bool operator==(const iterator& other) const {
  39.             return outer_ == other.outer_ && inner_ == other.inner_;
  40.         }
  41.  
  42.         bool operator!=(const iterator& other) const {
  43.             return !(*this == other);
  44.         }
  45.  
  46.     private:
  47.         std::vector<std::span<const T>> spans_;
  48.         size_t outer_ = 0;
  49.         size_t inner_ = 0;
  50.  
  51.         void advance_past_empty_spans() {
  52.             while (outer_ < spans_.size() && inner_ == spans_[outer_].size()) {
  53.                 ++outer_;
  54.                 inner_ = 0;
  55.             }
  56.         }
  57.     };
  58.  
  59.     iterator begin() const {
  60.         return iterator(spans_, 0, 0);
  61.     }
  62.  
  63.     iterator end() const {
  64.         return iterator(spans_, spans_.size(), 0);
  65.     }
  66.  
  67. private:
  68.     std::vector<std::span<const T>> spans_;
  69. };
  70.  
  71.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement