Files
2025-10-25 03:02:53 +03:00

8.2 KiB
Raw Permalink Blame History

[range.subrange.general]

25 Ranges library [ranges]

25.5 Range utilities [range.utility]

25.5.4 Sub-ranges [range.subrange]

25.5.4.1 General [range.subrange.general]

1

#

The subrange class template combines together an iterator and a sentinel into a single object that models theview concept.

Additionally, it models thesized_range concept when the final template parameter issubrange_kind::sized.

🔗

namespace std::ranges {template<class From, class To>concept uses-nonqualification-pointer-conversion = // exposition only is_pointer_v && is_pointer_v &&convertible_to<remove_pointer_t()[], remove_pointer_t()[]>; template<class From, class To>concept convertible-to-non-slicing = // exposition onlyconvertible_to<From, To> &&uses-nonqualification-pointer-conversion<decay_t, decay_t>; template<class T, class U, class V>concept pair-like-convertible-from = // exposition onlyrange && !is_reference_v && pair-like &&constructible_from<T, U, V> &&convertible-to-non-slicing<U, tuple_element_t<0, T>> &&convertible_to<V, tuple_element_t<1, T>>; template<input_or_output_iterator I, sentinel_for S = I, subrange_kind K =sized_sentinel_for<S, I> ? subrange_kind::sized : subrange_kind::unsized>requires (K == subrange_kind::sized || sized_sentinel_for<S, I>)class subrange : public view_interface<subrange<I, S, K>> {private:static constexpr bool StoreSize = // exposition only K == subrange_kind::sized && sized_sentinel_for<S, I>; I begin_ = I(); // exposition only S end_ = S(); // exposition only**make-unsigned-like-t<iter_difference_t> size_ = 0; // exposition only; present only// if StoreSize is truepublic: subrange() requires default_initializable = default; constexpr subrange(convertible-to-non-slicing auto i, S s) requires (!StoreSize); constexpr subrange(convertible-to-non-slicing auto i, S s, make-unsigned-like-t<iter_difference_t> n)requires (K == subrange_kind::sized); template<different-from R>requires borrowed_range &&convertible-to-non-slicing<iterator_t, I> &&convertible_to<sentinel_t, S>constexpr subrange(R&& r) requires (!StoreSize || sized_range); template<borrowed_range R>requires convertible-to-non-slicing<iterator_t, I> &&convertible_to<sentinel_t, S>constexpr subrange(R&& r, make-unsigned-like-t<iter_difference_t> n)requires (K == subrange_kind::sized): subrange{ranges::begin(r), ranges::end(r), n} {}template<different-from PairLike>requires pair-like-convertible-from<PairLike, const I&, const S&>constexpr operator PairLike() const; constexpr I begin() const requires copyable; constexpr I begin() requires (copyable); constexpr S end() const; constexpr bool empty() const; constexpr make-unsigned-like-t<iter_difference_t> size() constrequires (K == subrange_kind::sized); constexpr subrange next(iter_difference_t n = 1) const &requires forward_iterator; constexpr subrange next(iter_difference_t n = 1) &&; constexpr subrange prev(iter_difference_t n = 1) constrequires bidirectional_iterator; constexpr subrange& advance(iter_difference_t n); }; template<input_or_output_iterator I, sentinel_for S> subrange(I, S) -> subrange<I, S>; template<input_or_output_iterator I, sentinel_for S> subrange(I, S, make-unsigned-like-t<iter_difference_t>) -> subrange<I, S, subrange_kind::sized>; template<borrowed_range R> subrange(R&&) -> subrange<iterator_t, sentinel_t, (sized_range || sized_sentinel_for<sentinel_t, iterator_t>)? subrange_kind::sized : subrange_kind::unsized>; template<borrowed_range R> subrange(R&&, make-unsigned-like-t<range_difference_t>) -> subrange<iterator_t, sentinel_t, subrange_kind::sized>;}