[range.chunk.view.input] (original) (raw)

25 Ranges library [ranges]

25.7 Range adaptors [range.adaptors]

25.7.29 Chunk view [range.chunk]

25.7.29.2 Class template chunk_view for input ranges [range.chunk.view.input]

namespace std::ranges { template<class I> constexpr I div-ceil(I num, I denom) { I r = num / denom;if (num % denom) ++r;return r;} template<view V> requires input_range<V> class chunk_view : public view_interface<chunk_view<V>> { V base_; range_difference_t<V> n_; range_difference_t<V> remainder_ = 0; non-propagating-cache<iterator_t<V>> current_; class outer-iterator; class inner-iterator; public: constexpr explicit chunk_view(V base, range_difference_t<V> n);constexpr V base() const & requires copy_constructible<V> { return base_; } constexpr V base() && { return std::move(base_); } constexpr outer-iterator begin();constexpr default_sentinel_t end() const noexcept;constexpr auto size() requires sized_range<V>;constexpr auto size() const requires sized_range<const V>;constexpr auto reserve_hint() requires approximately_sized_range<V>;constexpr auto reserve_hint() const requires approximately_sized_range<const V>;};template<class R> chunk_view(R&&, range_difference_t<R>) -> chunk_view<views::all_t<R>>;}

constexpr explicit chunk_view(V base, range_difference_t<V> n);

Preconditions: n > 0 is true.

Effects: Initializes base_ with std​::​move(base) and_n__ with n.

constexpr _outer-iterator_ begin();

Effects: Equivalent to:current_ = ranges::begin(base_);remainder_ = n_;return outer-iterator(*this);

constexpr default_sentinel_t end() const noexcept;

Returns: default_sentinel.

Effects: Equivalent to:return to-unsigned-like(div-ceil(ranges::distance(base_), n_));

Effects: Equivalent to:auto s = static_cast<range_difference_t<decltype((_base__))>>(ranges::reserve_hint(base_));return to-unsigned-like(div-ceil(s, n_));