From Jason Turner

[range.enumerate.iterator]

Diff to HTML by rtfpessoa

Files changed (1) hide show
  1. tmp/tmp4rn0jxyv/{from.md → to.md} +251 -0
tmp/tmp4rn0jxyv/{from.md → to.md} RENAMED
@@ -0,0 +1,251 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #### Class template `enumerate_view::iterator` <a id="range.enumerate.iterator">[[range.enumerate.iterator]]</a>
2
+
3
+ ``` cpp
4
+ namespace std::ranges {
5
+ template<view V>
6
+ requires range-with-movable-references<V>
7
+ template<bool Const>
8
+ class enumerate_view<V>::iterator {
9
+ using Base = maybe-const<Const, V>; // exposition only
10
+
11
+ public:
12
+ using iterator_category = input_iterator_tag;
13
+ using iterator_concept = see below;
14
+ using difference_type = range_difference_t<Base>;
15
+ using value_type = tuple<difference_type, range_value_t<Base>>;
16
+
17
+ private:
18
+ using reference-type = // exposition only
19
+ tuple<difference_type, range_reference_t<Base>>;
20
+ iterator_t<Base> current_ = iterator_t<Base>(); // exposition only
21
+ difference_type pos_ = 0; // exposition only
22
+
23
+ constexpr explicit
24
+ iterator(iterator_t<Base> current, difference_type pos); // exposition only
25
+
26
+ public:
27
+ iterator() requires default_initializable<iterator_t<Base>> = default;
28
+ constexpr iterator(iterator<!Const> i)
29
+ requires Const && convertible_to<iterator_t<V>, iterator_t<Base>>;
30
+
31
+ constexpr const iterator_t<Base>& base() const & noexcept;
32
+ constexpr iterator_t<Base> base() &&;
33
+
34
+ constexpr difference_type index() const noexcept;
35
+
36
+ constexpr auto operator*() const {
37
+ return reference-type(pos_, *current_);
38
+ }
39
+
40
+ constexpr iterator& operator++();
41
+ constexpr void operator++(int);
42
+ constexpr iterator operator++(int) requires forward_range<Base>;
43
+
44
+ constexpr iterator& operator--() requires bidirectional_range<Base>;
45
+ constexpr iterator operator--(int) requires bidirectional_range<Base>;
46
+
47
+ constexpr iterator& operator+=(difference_type x)
48
+ requires random_access_range<Base>;
49
+ constexpr iterator& operator-=(difference_type x)
50
+ requires random_access_range<Base>;
51
+
52
+ constexpr auto operator[](difference_type n) const
53
+ requires random_access_range<Base>
54
+ { return reference-type(pos_ + n, current_[n]); }
55
+
56
+ friend constexpr bool operator==(const iterator& x, const iterator& y) noexcept;
57
+ friend constexpr strong_ordering operator<=>(const iterator& x, const iterator& y) noexcept;
58
+
59
+ friend constexpr iterator operator+(const iterator& x, difference_type y)
60
+ requires random_access_range<Base>;
61
+ friend constexpr iterator operator+(difference_type x, const iterator& y)
62
+ requires random_access_range<Base>;
63
+ friend constexpr iterator operator-(const iterator& x, difference_type y)
64
+ requires random_access_range<Base>;
65
+ friend constexpr difference_type operator-(const iterator& x, const iterator& y);
66
+
67
+ friend constexpr auto iter_move(const iterator& i)
68
+ noexcept(noexcept(ranges::iter_move(i.current_)) &&
69
+ is_nothrow_move_constructible_v<range_rvalue_reference_t<Base>>) {
70
+ return tuple<difference_type,
71
+ range_rvalue_reference_t<Base>>(i.pos_, ranges::iter_move(i.current_));
72
+ }
73
+ };
74
+ }
75
+ ```
76
+
77
+ The member *typedef-name* `iterator::iterator_concept` is defined as
78
+ follows:
79
+
80
+ - If *`Base`* models `random_access_range`, then `iterator_concept`
81
+ denotes `random_access_iterator_tag`.
82
+ - Otherwise, if *`Base`* models `bidirectional_range`, then
83
+ `iterator_concept` denotes `bidirectional_iterator_tag`.
84
+ - Otherwise, if *`Base`* models `forward_range`, then `iterator_concept`
85
+ denotes `forward_iterator_tag`.
86
+ - Otherwise, `iterator_concept` denotes `input_iterator_tag`.
87
+
88
+ ``` cpp
89
+ constexpr explicit iterator(iterator_t<Base> current, difference_type pos);
90
+ ```
91
+
92
+ *Effects:* Initializes *current\_* with `std::move(current)` and *pos\_*
93
+ with `pos`.
94
+
95
+ ``` cpp
96
+ constexpr iterator(iterator<!Const> i)
97
+ requires Const && convertible_to<iterator_t<V>, iterator_t<Base>>;
98
+ ```
99
+
100
+ *Effects:* Initializes *current\_* with `std::move(i.`*`current_`*`)`
101
+ and *pos\_* with `i.`*`pos_`*.
102
+
103
+ ``` cpp
104
+ constexpr const iterator_t<Base>& base() const & noexcept;
105
+ ```
106
+
107
+ *Effects:* Equivalent to: `return `*`current_`*`;`
108
+
109
+ ``` cpp
110
+ constexpr iterator_t<Base> base() &&;
111
+ ```
112
+
113
+ *Effects:* Equivalent to: `return std::move(`*`current_`*`);`
114
+
115
+ ``` cpp
116
+ constexpr difference_type index() const noexcept;
117
+ ```
118
+
119
+ *Effects:* Equivalent to: `return `*`pos_`*`;`
120
+
121
+ ``` cpp
122
+ constexpr iterator& operator++();
123
+ ```
124
+
125
+ *Effects:* Equivalent to:
126
+
127
+ ``` cpp
128
+ ++current_;
129
+ ++pos_;
130
+ return *this;
131
+ ```
132
+
133
+ ``` cpp
134
+ constexpr void operator++(int);
135
+ ```
136
+
137
+ *Effects:* Equivalent to `++*this`.
138
+
139
+ ``` cpp
140
+ constexpr iterator operator++(int) requires forward_range<Base>;
141
+ ```
142
+
143
+ *Effects:* Equivalent to:
144
+
145
+ ``` cpp
146
+ auto temp = *this;
147
+ ++*this;
148
+ return temp;
149
+ ```
150
+
151
+ ``` cpp
152
+ constexpr iterator& operator--() requires bidirectional_range<Base>;
153
+ ```
154
+
155
+ *Effects:* Equivalent to:
156
+
157
+ ``` cpp
158
+ --current_;
159
+ --pos_;
160
+ return *this;
161
+ ```
162
+
163
+ ``` cpp
164
+ constexpr iterator operator--(int) requires bidirectional_range<Base>;
165
+ ```
166
+
167
+ *Effects:* Equivalent to:
168
+
169
+ ``` cpp
170
+ auto temp = *this;
171
+ --*this;
172
+ return temp;
173
+ ```
174
+
175
+ ``` cpp
176
+ constexpr iterator& operator+=(difference_type n)
177
+ requires random_access_range<Base>;
178
+ ```
179
+
180
+ *Effects:* Equivalent to:
181
+
182
+ ``` cpp
183
+ current_ += n;
184
+ pos_ += n;
185
+ return *this;
186
+ ```
187
+
188
+ ``` cpp
189
+ constexpr iterator& operator-=(difference_type n)
190
+ requires random_access_range<Base>;
191
+ ```
192
+
193
+ *Effects:* Equivalent to:
194
+
195
+ ``` cpp
196
+ current_ -= n;
197
+ pos_ -= n;
198
+ return *this;
199
+ ```
200
+
201
+ ``` cpp
202
+ friend constexpr bool operator==(const iterator& x, const iterator& y) noexcept;
203
+ ```
204
+
205
+ *Effects:* Equivalent to: `return x.`*`pos_`*` == y.`*`pos_`*`;`
206
+
207
+ ``` cpp
208
+ friend constexpr strong_ordering operator<=>(const iterator& x, const iterator& y) noexcept;
209
+ ```
210
+
211
+ *Effects:* Equivalent to: `return x.`*`pos_`*` <=> y.`*`pos_`*`;`
212
+
213
+ ``` cpp
214
+ friend constexpr iterator operator+(const iterator& x, difference_type y)
215
+ requires random_access_range<Base>;
216
+ ```
217
+
218
+ *Effects:* Equivalent to:
219
+
220
+ ``` cpp
221
+ auto temp = x;
222
+ temp += y;
223
+ return temp;
224
+ ```
225
+
226
+ ``` cpp
227
+ friend constexpr iterator operator+(difference_type x, const iterator& y)
228
+ requires random_access_range<Base>;
229
+ ```
230
+
231
+ *Effects:* Equivalent to: `return y + x;`
232
+
233
+ ``` cpp
234
+ friend constexpr iterator operator-(const iterator& x, difference_type y)
235
+ requires random_access_range<Base>;
236
+ ```
237
+
238
+ *Effects:* Equivalent to:
239
+
240
+ ``` cpp
241
+ auto temp = x;
242
+ temp -= y;
243
+ return temp;
244
+ ```
245
+
246
+ ``` cpp
247
+ friend constexpr difference_type operator-(const iterator& x, const iterator& y);
248
+ ```
249
+
250
+ *Effects:* Equivalent to: `return x.`*`pos_`*` - y.`*`pos_`*`;`
251
+