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

8.2 KiB
Raw Blame History

[view.interface]

25 Ranges library [ranges]

25.5 Range utilities [range.utility]

25.5.3 View interface [view.interface]

25.5.3.1 General [view.interface.general]

1

#

The class template view_interface is a helper for defining view-like types that offer a container-like interface.

It is parameterized with the type that is derived from it.

🔗

namespace std::ranges {templaterequires is_class_v && same_as<D, remove_cv_t>class view_interface {private:constexpr D& derived() noexcept { // exposition onlyreturn static_cast<D&>(*this); }constexpr const D& derived() const noexcept { // exposition onlyreturn static_cast<const D&>(*this); }public:constexpr bool empty() requires sized_range || forward_range {if constexpr (sized_range)return ranges::size(derived()) == 0; elsereturn ranges::begin(derived()) == ranges::end(derived()); }constexpr bool empty() const requires sized_range || forward_range {if constexpr (sized_range)return ranges::size(derived()) == 0; elsereturn ranges::begin(derived()) == ranges::end(derived()); }constexpr auto cbegin() requires input_range {return ranges::cbegin(derived()); }constexpr auto cbegin() const requires input_range {return ranges::cbegin(derived()); }constexpr auto cend() requires input_range {return ranges::cend(derived()); }constexpr auto cend() const requires input_range {return ranges::cend(derived()); }constexpr explicit operator bool()requires requires { ranges::empty(derived()); } {return !ranges::empty(derived()); }constexpr explicit operator bool() constrequires requires { ranges::empty(derived()); } {return !ranges::empty(derived()); }constexpr auto data() requires contiguous_iterator<iterator_t> {return to_address(ranges::begin(derived())); }constexpr auto data() constrequires range && contiguous_iterator<iterator_t> {return to_address(ranges::begin(derived())); }constexpr auto size() requires forward_range &&sized_sentinel_for<sentinel_t, iterator_t> {return to-unsigned-like(ranges::end(derived()) - ranges::begin(derived())); }constexpr auto size() const requires forward_range &&sized_sentinel_for<sentinel_t, iterator_t> {return to-unsigned-like(ranges::end(derived()) - ranges::begin(derived())); }constexpr decltype(auto) front() requires forward_range; constexpr decltype(auto) front() const requires forward_range; constexpr decltype(auto) back() requires bidirectional_range && common_range; constexpr decltype(auto) back() constrequires bidirectional_range && common_range; template<random_access_range R = D>constexpr decltype(auto) operator[](range_difference_t n) {return ranges::begin(derived())[n]; }template<random_access_range R = const D>constexpr decltype(auto) operator[](range_difference_t n) const {return ranges::begin(derived())[n]; }};}

2

#

The template parameter D for view_interface may be an incomplete type.

Before any member of the resulting specialization ofview_interface other than special member functions is referenced, D shall be complete, and model both derived_from<view_interface> and view.

25.5.3.2 Members [view.interface.members]

🔗

constexpr decltype(auto) front() requires [forward_range](range.refinements#concept:forward_range "25.4.6Other range refinements[range.refinements]")<D>; constexpr decltype(auto) front() const requires [forward_range](range.refinements#concept:forward_range "25.4.6Other range refinements[range.refinements]")<const D>;

1

#

Hardened preconditions: !empty() is true.

2

#

Effects: Equivalent to: return *ranges::begin(derived());

🔗

constexpr decltype(auto) back() requires [bidirectional_range](range.refinements#concept:bidirectional_range "25.4.6Other range refinements[range.refinements]")<D> && [common_range](range.refinements#concept:common_range "25.4.6Other range refinements[range.refinements]")<D>; constexpr decltype(auto) back() const requires [bidirectional_range](range.refinements#concept:bidirectional_range "25.4.6Other range refinements[range.refinements]")<const D> && [common_range](range.refinements#concept:common_range "25.4.6Other range refinements[range.refinements]")<const D>;

3

#

Hardened preconditions: !empty() is true.

4

#

Effects: Equivalent to: return *ranges::prev(ranges::end(derived()));