#A Using ranges::view concept
| 15 | |
| 16 | template<std::ranges::view R> // #A Using ranges::view concept |
| 17 | class custom_take_view |
| 18 | : public std::ranges::view_interface<custom_take_view<R>> { |
| 19 | // #B Necessary data members |
| 20 | R base_{}; |
| 21 | std::ranges::range_difference_t<R> count_{}; |
| 22 | |
| 23 | public: |
| 24 | // #C Default constructible |
| 25 | custom_take_view() = default; |
| 26 | |
| 27 | // #D Constructor for range and count |
| 28 | constexpr custom_take_view( |
| 29 | R base, |
| 30 | std::ranges::range_difference_t<R> count) |
| 31 | : base_{std::move(base)} |
| 32 | , count_{count} |
| 33 | {} |
| 34 | |
| 35 | // #E view_interface members |
| 36 | constexpr R base() const& { return base_; } |
| 37 | constexpr R base() && { return std::move(base_); } |
| 38 | |
| 39 | // #F Actual begin and end |
| 40 | constexpr auto begin() { return std::ranges::begin(base_); } |
| 41 | constexpr auto end() |
| 42 | { |
| 43 | return std::ranges::next(std::ranges::begin(base_), count_); |
| 44 | } |
| 45 | }; |
| 46 | |
| 47 | template<std::ranges::range R> // #G Deduction guide |
| 48 | custom_take_view(R&& base, std::ranges::range_difference_t<R>) |