Files
cppdraft_translate/cppdraft/range/adjacent/view.md
2025-10-25 03:02:53 +03:00

5.1 KiB
Raw Blame History

[range.adjacent.view]

25 Ranges library [ranges]

25.7 Range adaptors [range.adaptors]

25.7.27 Adjacent view [range.adjacent]

25.7.27.2 Class template adjacent_view [range.adjacent.view]

🔗

namespace std::ranges {template<forward_range V, size_t N>requires view && (N > 0)class adjacent_view : public view_interface<adjacent_view<V, N>> { V base_ = V(); // exposition only// [range.adjacent.iterator], class template adjacent_view::iteratortemplate class iterator; // exposition only// [range.adjacent.sentinel], class template adjacent_view::sentineltemplate class sentinel; // exposition onlystruct as-sentinel{}; // exposition onlypublic: adjacent_view() requires default_initializable = default; constexpr explicit adjacent_view(V base); constexpr V base() const & requires copy_constructible { return base_; }constexpr V base() && { return std::move(base_); }constexpr auto begin() requires (simple-view) {return iterator(ranges::begin(base_), ranges::end(base_)); }constexpr auto begin() const requires range {return iterator(ranges::begin(base_), ranges::end(base_)); }constexpr auto end() requires (simple-view) {if constexpr (common_range) {return iterator(as-sentinel{}, ranges::begin(base_), ranges::end(base_)); } else {return sentinel(ranges::end(base_)); }}constexpr auto end() const requires range {if constexpr (common_range) {return iterator(as-sentinel{}, ranges::begin(base_), ranges::end(base_)); } else {return sentinel(ranges::end(base_)); }}constexpr auto size() requires sized_range; constexpr auto size() const requires sized_range; constexpr auto reserve_hint() requires approximately_sized_range; constexpr auto reserve_hint() const requires approximately_sized_range; };}

🔗

constexpr explicit adjacent_view(V base);

1

#

Effects: Initializes base_ with std::move(base).

🔗

constexpr auto size() requires [sized_range](range.sized#concept:sized_range "25.4.4Sized ranges[range.sized]")<V>; constexpr auto size() const requires [sized_range](range.sized#concept:sized_range "25.4.4Sized ranges[range.sized]")<const V>;

2

#

Effects: Equivalent to:using ST = decltype(ranges::size(base_));using CT = common_type_t<ST, size_t>;auto sz = static_cast(ranges::size(base_)); sz -= std::min(sz, N - 1);return static_cast(sz);

🔗

constexpr auto reserve_hint() requires [approximately_sized_range](range.approximately.sized#concept:approximately_sized_range "25.4.3Approximately sized ranges[range.approximately.sized]")<V>; constexpr auto reserve_hint() const requires [approximately_sized_range](range.approximately.sized#concept:approximately_sized_range "25.4.3Approximately sized ranges[range.approximately.sized]")<const V>;

3

#

Effects: Equivalent to:using DT = range_difference_t<decltype((base_))>;using CT = common_type_t<DT, size_t>;auto sz = static_cast(ranges::reserve_hint(base_)); sz -= std::min(sz, N - 1);return to-unsigned-like(sz);