From Jason Turner

[view.interface]

Diff to HTML by rtfpessoa

Files changed (1) hide show
  1. tmp/tmpr_gherq_/{from.md → to.md} +99 -0
tmp/tmpr_gherq_/{from.md → to.md} RENAMED
@@ -0,0 +1,99 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ### View interface <a id="view.interface">[[view.interface]]</a>
2
+
3
+ The class template `view_interface` is a helper for defining `view`-like
4
+ types that offer a container-like interface. It is parameterized with
5
+ the type that is derived from it.
6
+
7
+ ``` cpp
8
+ namespace std::ranges {
9
+ template<class D>
10
+ requires is_class_v<D> && same_as<D, remove_cv_t<D>>
11
+ class view_interface : public view_base {
12
+ private:
13
+ constexpr D& derived() noexcept { // exposition only
14
+ return static_cast<D&>(*this);
15
+ }
16
+ constexpr const D& derived() const noexcept { // exposition only
17
+ return static_cast<const D&>(*this);
18
+ }
19
+ public:
20
+ constexpr bool empty() requires forward_range<D> {
21
+ return ranges::begin(derived()) == ranges::end(derived());
22
+ }
23
+ constexpr bool empty() const requires forward_range<const D> {
24
+ return ranges::begin(derived()) == ranges::end(derived());
25
+ }
26
+
27
+ constexpr explicit operator bool()
28
+ requires requires { ranges::empty(derived()); } {
29
+ return !ranges::empty(derived());
30
+ }
31
+ constexpr explicit operator bool() const
32
+ requires requires { ranges::empty(derived()); } {
33
+ return !ranges::empty(derived());
34
+ }
35
+
36
+ constexpr auto data() requires contiguous_iterator<iterator_t<D>> {
37
+ return to_address(ranges::begin(derived()));
38
+ }
39
+ constexpr auto data() const
40
+ requires range<const D> && contiguous_iterator<iterator_t<const D>> {
41
+ return to_address(ranges::begin(derived()));
42
+ }
43
+
44
+ constexpr auto size() requires forward_range<D> &&
45
+ sized_sentinel_for<sentinel_t<D>, iterator_t<D>> {
46
+ return ranges::end(derived()) - ranges::begin(derived());
47
+ }
48
+ constexpr auto size() const requires forward_range<const D> &&
49
+ sized_sentinel_for<sentinel_t<const D>, iterator_t<const D>> {
50
+ return ranges::end(derived()) - ranges::begin(derived());
51
+ }
52
+
53
+ constexpr decltype(auto) front() requires forward_range<D>;
54
+ constexpr decltype(auto) front() const requires forward_range<const D>;
55
+
56
+ constexpr decltype(auto) back() requires bidirectional_range<D> && common_range<D>;
57
+ constexpr decltype(auto) back() const
58
+ requires bidirectional_range<const D> && common_range<const D>;
59
+
60
+ template<random_access_range R = D>
61
+ constexpr decltype(auto) operator[](range_difference_t<R> n) {
62
+ return ranges::begin(derived())[n];
63
+ }
64
+ template<random_access_range R = const D>
65
+ constexpr decltype(auto) operator[](range_difference_t<R> n) const {
66
+ return ranges::begin(derived())[n];
67
+ }
68
+ };
69
+ }
70
+ ```
71
+
72
+ The template parameter `D` for `view_interface` may be an incomplete
73
+ type. Before any member of the resulting specialization of
74
+ `view_interface` other than special member functions is referenced, `D`
75
+ shall be complete, and model both `derived_from<view_interface<D>>` and
76
+ `view`.
77
+
78
+ #### Members <a id="view.interface.members">[[view.interface.members]]</a>
79
+
80
+ ``` cpp
81
+ constexpr decltype(auto) front() requires forward_range<D>;
82
+ constexpr decltype(auto) front() const requires forward_range<const D>;
83
+ ```
84
+
85
+ *Preconditions:* `!empty()`.
86
+
87
+ *Effects:* Equivalent to: `return *ranges::begin(`*`derived`*`());`
88
+
89
+ ``` cpp
90
+ constexpr decltype(auto) back() requires bidirectional_range<D> && common_range<D>;
91
+ constexpr decltype(auto) back() const
92
+ requires bidirectional_range<const D> && common_range<const D>;
93
+ ```
94
+
95
+ *Preconditions:* `!empty()`.
96
+
97
+ *Effects:* Equivalent to:
98
+ `return *ranges::prev(ranges::end(`*`derived`*`()));`
99
+