From Jason Turner

[range.reverse]

Diff to HTML by rtfpessoa

Files changed (1) hide show
  1. tmp/tmpm2b1ooe0/{from.md → to.md} +12 -14
tmp/tmpm2b1ooe0/{from.md → to.md} RENAMED
@@ -1,24 +1,21 @@
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:
@@ -31,13 +28,12 @@ The name `views::reverse` denotes a range adaptor object
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>
@@ -47,12 +43,13 @@ 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_); }
@@ -65,10 +62,11 @@ namespace std::ranges {
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
 
@@ -101,15 +99,15 @@ the `reverse_view` for use on subsequent calls.
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
 
 
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 that
6
+ 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
15
+ `subrange<reverse_iterator<I>, reverse_iterator<I>, K>` for some
16
+ iterator type `I` and value `K` of type `subrange_kind`,
 
 
 
17
  - if `K` is `subrange_kind::sized`, equivalent to:
18
  ``` cpp
19
  subrange<I, I, K>(E.end().base(), E.begin().base(), E.size())
20
  ```
21
  - otherwise, equivalent to:
 
28
 
29
  [*Example 1*:
30
 
31
  ``` cpp
32
  vector<int> is {0,1,2,3,4};
33
+ for (int i : is | views::reverse)
34
+ cout << i << ' '; // prints 4 3 2 1 0
 
35
  ```
36
 
37
  — *end example*]
38
 
39
  #### Class template `reverse_view` <a id="range.reverse.view">[[range.reverse.view]]</a>
 
43
  template<view V>
44
  requires bidirectional_range<V>
45
  class reverse_view : public view_interface<reverse_view<V>> {
46
  private:
47
  V base_ = V(); // exposition only
48
+
49
  public:
50
+ reverse_view() requires default_initializable<V> = default;
51
 
52
  constexpr explicit reverse_view(V r);
53
 
54
  constexpr V base() const & requires copy_constructible<V> { return base_; }
55
  constexpr V base() && { return std::move(base_); }
 
62
  constexpr auto end() const requires common_range<const V>;
63
 
64
  constexpr auto size() requires sized_range<V> {
65
  return ranges::size(base_);
66
  }
67
+
68
  constexpr auto size() const requires sized_range<const V> {
69
  return ranges::size(base_);
70
  }
71
  };
72
 
 
99
  constexpr reverse_iterator<iterator_t<V>> begin() requires common_range<V>;
100
  constexpr auto begin() const requires common_range<const V>;
101
  ```
102
 
103
  *Effects:* Equivalent to:
104
+ `return make_reverse_iterator(ranges::end(`*`base_`*`));`
105
 
106
  ``` cpp
107
  constexpr reverse_iterator<iterator_t<V>> end();
108
  constexpr auto end() const requires common_range<const V>;
109
  ```
110
 
111
  *Effects:* Equivalent to:
112
+ `return make_reverse_iterator(ranges::begin(`*`base_`*`));`
113