Guest User

a

a guest
Jul 13th, 2025
35
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.10 KB | None | 0 0
  1. #pragma once
  2.  
  3. #include <algorithm>
  4.  
  5. namespace Views
  6. {
  7.     template <typename It, typename Pred> class FilterIterator
  8.     {
  9.         It   mCur;
  10.         It   mEnd;
  11.         Pred mPred;
  12.  
  13.         void satisfy() noexcept
  14.         {
  15.             while (mCur != mEnd && !mPred(*mCur))
  16.                 ++mCur;
  17.         }
  18.  
  19.       public:
  20.         using iterator_category = std::forward_iterator_tag;
  21.         using value_type = typename std::iterator_traits<It>::value_type;
  22.         using difference_type =
  23.             typename std::iterator_traits<It>::difference_type;
  24.         using pointer   = typename std::iterator_traits<It>::pointer;
  25.         using reference = typename std::iterator_traits<It>::reference;
  26.  
  27.         FilterIterator(It first, It last, Pred p)
  28.             : mCur(first), mEnd(last), mPred(std::move(p))
  29.         {
  30.             satisfy();
  31.         }
  32.  
  33.         reference operator*() const
  34.         {
  35.             return *mCur;
  36.         }
  37.         pointer operator->() const
  38.         {
  39.             return &*mCur;
  40.         }
  41.  
  42.         FilterIterator& operator++()
  43.         {
  44.             ++mCur;
  45.             satisfy();
  46.             return *this;
  47.         }
  48.         FilterIterator operator++(int)
  49.         {
  50.             auto tmp = *this;
  51.             ++*this;
  52.             return tmp;
  53.         }
  54.  
  55.         friend bool operator==(const FilterIterator& a,
  56.                                const FilterIterator& b)
  57.         {
  58.             return a.mCur == b.mCur;
  59.         }
  60.         friend bool operator!=(const FilterIterator& a,
  61.                                const FilterIterator& b)
  62.         {
  63.             return !(a == b);
  64.         }
  65.     };
  66.     template <typename Range, typename F> class TransformView;
  67.  
  68.     template <typename It, typename F> class TransformIterator
  69.     {
  70.         It mIt;
  71.         F  mF;
  72.  
  73.       public:
  74.         using iterator_category = std::forward_iterator_tag;
  75.         using value_type        = decltype(mF(*mIt));
  76.         using difference_type =
  77.             typename std::iterator_traits<It>::difference_type;
  78.         // no pointer/reference aliases: --> returns by value
  79.  
  80.         TransformIterator(It it, F fun) : mIt(it), mF(std::move(fun))
  81.         {
  82.         }
  83.  
  84.         auto operator*() const
  85.         {
  86.             return mF(*mIt);
  87.         }
  88.         auto operator->() const = delete;
  89.  
  90.         TransformIterator& operator++()
  91.         {
  92.             ++mIt;
  93.             return *this;
  94.         }
  95.         TransformIterator operator++(int)
  96.         {
  97.             auto tmp = *this;
  98.             ++*this;
  99.             return tmp;
  100.         }
  101.  
  102.         friend bool operator==(const TransformIterator& a,
  103.                                const TransformIterator& b)
  104.         {
  105.             return a.mIt == b.mIt;
  106.         }
  107.         friend bool operator!=(const TransformIterator& a,
  108.                                const TransformIterator& b)
  109.         {
  110.             return !(a == b);
  111.         }
  112.     };
  113.  
  114.     template <typename Range, typename Pred> class FilterView
  115.     {
  116.         Range* mRange;
  117.         Pred   mPred;
  118.  
  119.       public:
  120.         FilterView(Range& r, Pred p) : mRange(&r), mPred(std::move(p))
  121.         {
  122.         }
  123.  
  124.         auto begin()
  125.         {
  126.             return FilterIterator(mRange->begin(), mRange->end(), mPred);
  127.         }
  128.         auto end()
  129.         {
  130.             return FilterIterator(mRange->end(), mRange->end(), mPred);
  131.         }
  132.  
  133.         template <typename T> T First()
  134.         {
  135.             if (begin() == end())
  136.             {
  137.                 return T{};
  138.             }
  139.             return *begin();
  140.         }
  141.  
  142.         // chaining
  143.         template <typename P2> auto Where(P2 p2)
  144.         {
  145.             return FilterView<FilterView, P2>(*this, std::move(p2));
  146.         }
  147.  
  148.         template <typename F> auto Select(F f)
  149.         {
  150.             return TransformView<FilterView, F>(*this, std::move(f));
  151.         }
  152.     };
  153.  
  154.     template <typename Range, typename F> class TransformView
  155.     {
  156.         Range* mRange;
  157.         F      mF;
  158.  
  159.       public:
  160.         TransformView(Range& r, F fun) : mRange(&r), mF(std::move(fun))
  161.         {
  162.         }
  163.  
  164.         auto begin()
  165.         {
  166.             return TransformIterator(mRange->begin(), mF);
  167.         }
  168.         auto end()
  169.         {
  170.             return TransformIterator(mRange->end(), mF);
  171.         }
  172.  
  173.         template <typename T> T First()
  174.         {
  175.             if (begin() == end())
  176.             {
  177.                 return T{};
  178.             }
  179.             return *begin();
  180.         }
  181.  
  182.         template <typename P2> auto Where(P2 p2)
  183.         {
  184.             return FilterView<TransformView, P2>(*this, std::move(p2));
  185.         }
  186.  
  187.         template <typename F2> auto Select(F2 f2)
  188.         {
  189.             return TransformView<TransformView, F2>(*this, std::move(f2));
  190.         }
  191.     };
  192.  
  193.     template <typename Range, typename Pred>
  194.     auto MakeFilterView(Range& r, Pred p)
  195.     {
  196.         return FilterView<Range, Pred>(r, std::move(p));
  197.     }
  198.  
  199.     template <typename Range, typename F> auto MakeTransformView(Range& r, F f)
  200.     {
  201.         return TransformView<Range, F>(r, std::move(f));
  202.     }
  203. } // namespace Views
Advertisement
Add Comment
Please, Sign In to add comment