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

6.3 KiB

[view.interface.general]

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.