From Jason Turner

[range.reverse]

Diff to HTML by rtfpessoa

Files changed (1) hide show
  1. tmp/tmp3q1mhzye/{from.md → to.md} +115 -0
tmp/tmp3q1mhzye/{from.md → to.md} RENAMED
@@ -0,0 +1,115 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ### Reverse view <a id="range.reverse">[[range.reverse]]</a>
2
+
3
+ #### Overview <a id="range.reverse.overview">[[range.reverse.overview]]</a>
4
+
5
+ `reverse_view` takes a bidirectional `view` and produces another `view`
6
+ that iterates the same elements in reverse order.
7
+
8
+ The name `views::reverse` denotes a range adaptor object
9
+ [[range.adaptor.object]]. Given a subexpression `E`, the expression
10
+ `views::reverse(E)` is expression-equivalent to:
11
+
12
+ - If the type of `E` is a (possibly cv-qualified) specialization of
13
+ `reverse_view`, equivalent to `E.base()`.
14
+ - Otherwise, if the type of `E` is cv-qualified
15
+ ``` cpp
16
+ subrange<reverse_iterator<I>, reverse_iterator<I>, K>
17
+ ```
18
+
19
+ for some iterator type `I` and value `K` of type `subrange_kind`,
20
+ - if `K` is `subrange_kind::sized`, equivalent to:
21
+ ``` cpp
22
+ subrange<I, I, K>(E.end().base(), E.begin().base(), E.size())
23
+ ```
24
+ - otherwise, equivalent to:
25
+ ``` cpp
26
+ subrange<I, I, K>(E.end().base(), E.begin().base())
27
+ ```
28
+
29
+ However, in either case `E` is evaluated only once.
30
+ - Otherwise, equivalent to `reverse_view{E}`.
31
+
32
+ [*Example 1*:
33
+
34
+ ``` cpp
35
+ vector<int> is {0,1,2,3,4};
36
+ reverse_view rv {is};
37
+ for (int i : rv)
38
+ cout << i << ' '; // prints: 4 3 2 1 0
39
+ ```
40
+
41
+ — *end example*]
42
+
43
+ #### Class template `reverse_view` <a id="range.reverse.view">[[range.reverse.view]]</a>
44
+
45
+ ``` cpp
46
+ namespace std::ranges {
47
+ template<view V>
48
+ requires bidirectional_range<V>
49
+ class reverse_view : public view_interface<reverse_view<V>> {
50
+ private:
51
+ V base_ = V(); // exposition only
52
+ public:
53
+ reverse_view() = default;
54
+
55
+ constexpr explicit reverse_view(V r);
56
+
57
+ constexpr V base() const& requires copy_constructible<V> { return base_; }
58
+ constexpr V base() && { return std::move(base_); }
59
+
60
+ constexpr reverse_iterator<iterator_t<V>> begin();
61
+ constexpr reverse_iterator<iterator_t<V>> begin() requires common_range<V>;
62
+ constexpr auto begin() const requires common_range<const V>;
63
+
64
+ constexpr reverse_iterator<iterator_t<V>> end();
65
+ constexpr auto end() const requires common_range<const V>;
66
+
67
+ constexpr auto size() requires sized_range<V> {
68
+ return ranges::size(base_);
69
+ }
70
+ constexpr auto size() const requires sized_range<const V> {
71
+ return ranges::size(base_);
72
+ }
73
+ };
74
+
75
+ template<class R>
76
+ reverse_view(R&&) -> reverse_view<views::all_t<R>>;
77
+ }
78
+ ```
79
+
80
+ ``` cpp
81
+ constexpr explicit reverse_view(V base);
82
+ ```
83
+
84
+ *Effects:* Initializes *base\_* with `std::move(base)`.
85
+
86
+ ``` cpp
87
+ constexpr reverse_iterator<iterator_t<V>> begin();
88
+ ```
89
+
90
+ *Returns:*
91
+
92
+ ``` cpp
93
+ make_reverse_iterator(ranges::next(ranges::begin(base_), ranges::end(base_)))
94
+ ```
95
+
96
+ *Remarks:* In order to provide the amortized constant time complexity
97
+ required by the `range` concept, this function caches the result within
98
+ the `reverse_view` for use on subsequent calls.
99
+
100
+ ``` cpp
101
+ constexpr reverse_iterator<iterator_t<V>> begin() requires common_range<V>;
102
+ constexpr auto begin() const requires common_range<const V>;
103
+ ```
104
+
105
+ *Effects:* Equivalent to:
106
+ `return make_reverse_iterator(ranges::end(base_));`
107
+
108
+ ``` cpp
109
+ constexpr reverse_iterator<iterator_t<V>> end();
110
+ constexpr auto end() const requires common_range<const V>;
111
+ ```
112
+
113
+ *Effects:* Equivalent to:
114
+ `return make_reverse_iterator(ranges::begin(base_));`
115
+