From Jason Turner

[const.iterators]

Diff to HTML by rtfpessoa

Files changed (1) hide show
  1. tmp/tmpi436l8bs/{from.md → to.md} +411 -0
tmp/tmpi436l8bs/{from.md → to.md} RENAMED
@@ -0,0 +1,411 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ### Constant iterators and sentinels <a id="const.iterators">[[const.iterators]]</a>
2
+
3
+ #### General <a id="const.iterators.general">[[const.iterators.general]]</a>
4
+
5
+ Class template `basic_const_iterator` is an iterator adaptor with the
6
+ same behavior as the underlying iterator except that its indirection
7
+ operator implicitly converts the value returned by the underlying
8
+ iterator’s indirection operator to a type such that the adapted iterator
9
+ is a constant iterator [[iterator.requirements]]. Some generic
10
+ algorithms can be called with constant iterators to avoid mutation.
11
+
12
+ Specializations of `basic_const_iterator` are constant iterators.
13
+
14
+ #### Alias templates <a id="const.iterators.alias">[[const.iterators.alias]]</a>
15
+
16
+ ``` cpp
17
+ template<indirectly_readable It>
18
+ using iter_const_reference_t =
19
+ common_reference_t<const iter_value_t<It>&&, iter_reference_t<It>>;
20
+
21
+ template<class It>
22
+ concept constant-iterator = // exposition only
23
+ input_iterator<It> && same_as<iter_const_reference_t<It>, iter_reference_t<It>>;
24
+
25
+ template<input_iterator I>
26
+ using const_iterator = see below;
27
+ ```
28
+
29
+ *Result:* If `I` models `constant-iterator`, `I`. Otherwise,
30
+ `basic_const_iterator<I>`.
31
+
32
+ ``` cpp
33
+ template<semiregular S>
34
+ using const_sentinel = see below;
35
+ ```
36
+
37
+ *Result:* If `S` models `input_iterator`, `const_iterator<S>`.
38
+ Otherwise, `S`.
39
+
40
+ #### Class template `basic_const_iterator` <a id="const.iterators.iterator">[[const.iterators.iterator]]</a>
41
+
42
+ ``` cpp
43
+ namespace std {
44
+ template<class I>
45
+ concept not-a-const-iterator = see below; // exposition only
46
+
47
+ template<indirectly_readable I>
48
+ using iter-const-rvalue-reference-t = // exposition only
49
+ common_reference_t<const iter_value_t<I>&&, iter_rvalue_reference_t<I>>;
50
+
51
+ template<input_iterator Iterator>
52
+ class basic_const_iterator {
53
+ Iterator current_ = Iterator(); // exposition only
54
+ using reference = iter_const_reference_t<Iterator>; // exposition only
55
+ using rvalue-reference = // exposition only
56
+ iter-const-rvalue-reference-t<Iterator>;
57
+
58
+ public:
59
+ using iterator_concept = see below;
60
+ using iterator_category = see below; // not always present
61
+ using value_type = iter_value_t<Iterator>;
62
+ using difference_type = iter_difference_t<Iterator>;
63
+
64
+ basic_const_iterator() requires default_initializable<Iterator> = default;
65
+ constexpr basic_const_iterator(Iterator current);
66
+ template<convertible_to<Iterator> U>
67
+ constexpr basic_const_iterator(basic_const_iterator<U> current);
68
+ template<different-from<basic_const_iterator> T>
69
+ requires convertible_to<T, Iterator>
70
+ constexpr basic_const_iterator(T&& current);
71
+
72
+ constexpr const Iterator& base() const & noexcept;
73
+ constexpr Iterator base() &&;
74
+
75
+ constexpr reference operator*() const;
76
+ constexpr const auto* operator->() const
77
+ requires is_lvalue_reference_v<iter_reference_t<Iterator>> &&
78
+ same_as<remove_cvref_t<iter_reference_t<Iterator>>, value_type>;
79
+
80
+ constexpr basic_const_iterator& operator++();
81
+ constexpr void operator++(int);
82
+ constexpr basic_const_iterator operator++(int) requires forward_iterator<Iterator>;
83
+
84
+ constexpr basic_const_iterator& operator--() requires bidirectional_iterator<Iterator>;
85
+ constexpr basic_const_iterator operator--(int) requires bidirectional_iterator<Iterator>;
86
+
87
+ constexpr basic_const_iterator& operator+=(difference_type n)
88
+ requires random_access_iterator<Iterator>;
89
+ constexpr basic_const_iterator& operator-=(difference_type n)
90
+ requires random_access_iterator<Iterator>;
91
+
92
+ constexpr reference operator[](difference_type n) const
93
+ requires random_access_iterator<Iterator>;
94
+
95
+ template<sentinel_for<Iterator> S>
96
+ constexpr bool operator==(const S& s) const;
97
+
98
+ constexpr bool operator<(const basic_const_iterator& y) const
99
+ requires random_access_iterator<Iterator>;
100
+ constexpr bool operator>(const basic_const_iterator& y) const
101
+ requires random_access_iterator<Iterator>;
102
+ constexpr bool operator<=(const basic_const_iterator& y) const
103
+ requires random_access_iterator<Iterator>;
104
+ constexpr bool operator>=(const basic_const_iterator& y) const
105
+ requires random_access_iterator<Iterator>;
106
+ constexpr auto operator<=>(const basic_const_iterator& y) const
107
+ requires random_access_iterator<Iterator> && three_way_comparable<Iterator>;
108
+
109
+ template<different-from<basic_const_iterator> I>
110
+ constexpr bool operator<(const I& y) const
111
+ requires random_access_iterator<Iterator> && totally_ordered_with<Iterator, I>;
112
+ template<different-from<basic_const_iterator> I>
113
+ constexpr bool operator>(const I& y) const
114
+ requires random_access_iterator<Iterator> && totally_ordered_with<Iterator, I>;
115
+ template<different-from<basic_const_iterator> I>
116
+ constexpr bool operator<=(const I& y) const
117
+ requires random_access_iterator<Iterator> && totally_ordered_with<Iterator, I>;
118
+ template<different-from<basic_const_iterator> I>
119
+ constexpr bool operator>=(const I& y) const
120
+ requires random_access_iterator<Iterator> && totally_ordered_with<Iterator, I>;
121
+ template<different-from<basic_const_iterator> I>
122
+ constexpr auto operator<=>(const I& y) const
123
+ requires random_access_iterator<Iterator> && totally_ordered_with<Iterator, I> &&
124
+ three_way_comparable_with<Iterator, I>;
125
+ template<not-a-const-iterator I>
126
+ friend constexpr bool operator<(const I& x, const basic_const_iterator& y)
127
+ requires random_access_iterator<Iterator> && totally_ordered_with<Iterator, I>;
128
+ template<not-a-const-iterator I>
129
+ friend constexpr bool operator>(const I& x, const basic_const_iterator& y)
130
+ requires random_access_iterator<Iterator> && totally_ordered_with<Iterator, I>;
131
+ template<not-a-const-iterator I>
132
+ friend constexpr bool operator<=(const I& x, const basic_const_iterator& y)
133
+ requires random_access_iterator<Iterator> && totally_ordered_with<Iterator, I>;
134
+ template<not-a-const-iterator I>
135
+ friend constexpr bool operator>=(const I& x, const basic_const_iterator& y)
136
+ requires random_access_iterator<Iterator> && totally_ordered_with<Iterator, I>;
137
+
138
+ friend constexpr basic_const_iterator operator+(const basic_const_iterator& i,
139
+ difference_type n)
140
+ requires random_access_iterator<Iterator>;
141
+ friend constexpr basic_const_iterator operator+(difference_type n,
142
+ const basic_const_iterator& i)
143
+ requires random_access_iterator<Iterator>;
144
+ friend constexpr basic_const_iterator operator-(const basic_const_iterator& i,
145
+ difference_type n)
146
+ requires random_access_iterator<Iterator>;
147
+ template<sized_sentinel_for<Iterator> S>
148
+ constexpr difference_type operator-(const S& y) const;
149
+ template<not-a-const-iterator S>
150
+ requires sized_sentinel_for<S, Iterator>
151
+ friend constexpr difference_type operator-(const S& x, const basic_const_iterator& y);
152
+ friend constexpr rvalue-reference iter_move(const basic_const_iterator& i)
153
+ noexcept(noexcept(static_cast<rvalue-reference>(ranges::iter_move(i.current_))))
154
+ {
155
+ return static_cast<rvalue-reference>(ranges::iter_move(i.current_));
156
+ }
157
+ };
158
+ }
159
+ ```
160
+
161
+ Given some type `I`, the concept *not-a-const-iterator* is defined as
162
+ `false` if `I` is a specialization of `basic_const_iterator` and `true`
163
+ otherwise.
164
+
165
+ #### Member types <a id="const.iterators.types">[[const.iterators.types]]</a>
166
+
167
+ `basic_const_iterator<Iterator>::iterator_concept` is defined as
168
+ follows:
169
+
170
+ - If `Iterator` models `contiguous_iterator`, then `iterator_concept`
171
+ denotes `contiguous_iterator_tag`.
172
+ - Otherwise, if `Iterator` models `random_access_iterator`, then
173
+ `iterator_concept` denotes `random_access_iterator_tag`.
174
+ - Otherwise, if `Iterator` models `bidirectional_iterator`, then
175
+ `iterator_concept` denotes `bidirectional_iterator_tag`.
176
+ - Otherwise, if `Iterator` models `forward_iterator`, then
177
+ `iterator_concept` denotes `forward_iterator_tag`.
178
+ - Otherwise, `iterator_concept` denotes `input_iterator_tag`.
179
+
180
+ The member *typedef-name* `iterator_category` is defined if and only if
181
+ `Iterator` models `forward_iterator`. In that case,
182
+ `basic_const_iterator<Iterator>::iterator_category` denotes the type
183
+ `iterator_traits<{}Iterator>::iterator_category`.
184
+
185
+ #### Operations <a id="const.iterators.ops">[[const.iterators.ops]]</a>
186
+
187
+ ``` cpp
188
+ constexpr basic_const_iterator(Iterator current);
189
+ ```
190
+
191
+ *Effects:* Initializes *current\_* with `std::move(current)`.
192
+
193
+ ``` cpp
194
+ template<convertible_to<Iterator> U>
195
+ constexpr basic_const_iterator(basic_const_iterator<U> current);
196
+ ```
197
+
198
+ *Effects:* Initializes *current\_* with
199
+ `std::move(current.`*`current_`*`)`.
200
+
201
+ ``` cpp
202
+ template<different-from<basic_const_iterator> T>
203
+ requires convertible_to<T, Iterator>
204
+ constexpr basic_const_iterator(T&& current);
205
+ ```
206
+
207
+ *Effects:* Initializes *current\_* with `std::forward<T>(current)`.
208
+
209
+ ``` cpp
210
+ constexpr const Iterator& base() const & noexcept;
211
+ ```
212
+
213
+ *Effects:* Equivalent to: `return `*`current_`*`;`
214
+
215
+ ``` cpp
216
+ constexpr Iterator base() &&;
217
+ ```
218
+
219
+ *Effects:* Equivalent to: `return std::move(`*`current_`*`);`
220
+
221
+ ``` cpp
222
+ constexpr reference operator*() const;
223
+ ```
224
+
225
+ *Effects:* Equivalent to:
226
+ `return static_cast<`*`reference`*`>(*`*`current_`*`);`
227
+
228
+ ``` cpp
229
+ constexpr const auto* operator->() const
230
+ requires is_lvalue_reference_v<iter_reference_t<Iterator>> &&
231
+ same_as<remove_cvref_t<iter_reference_t<Iterator>>, value_type>;
232
+ ```
233
+
234
+ *Returns:* If `Iterator` models `contiguous_iterator`,
235
+ `to_address(`*`current_`*`)`; otherwise, `addressof(*`*`current_`*`)`.
236
+
237
+ ``` cpp
238
+ constexpr basic_const_iterator& operator++();
239
+ ```
240
+
241
+ *Effects:* Equivalent to:
242
+
243
+ ``` cpp
244
+ ++current_;
245
+ return *this;
246
+ ```
247
+
248
+ ``` cpp
249
+ constexpr void operator++(int);
250
+ ```
251
+
252
+ *Effects:* Equivalent to: `++`*`current_`*`;`
253
+
254
+ ``` cpp
255
+ constexpr basic_const_iterator operator++(int) requires forward_iterator<Iterator>;
256
+ ```
257
+
258
+ *Effects:* Equivalent to:
259
+
260
+ ``` cpp
261
+ auto tmp = *this;
262
+ ++*this;
263
+ return tmp;
264
+ ```
265
+
266
+ ``` cpp
267
+ constexpr basic_const_iterator& operator--() requires bidirectional_iterator<Iterator>;
268
+ ```
269
+
270
+ *Effects:* Equivalent to:
271
+
272
+ ``` cpp
273
+ --current_;
274
+ return *this;
275
+ ```
276
+
277
+ ``` cpp
278
+ constexpr basic_const_iterator operator--(int) requires bidirectional_iterator<Iterator>;
279
+ ```
280
+
281
+ *Effects:* Equivalent to:
282
+
283
+ ``` cpp
284
+ auto tmp = *this;
285
+ --*this;
286
+ return tmp;
287
+ ```
288
+
289
+ ``` cpp
290
+ constexpr basic_const_iterator& operator+=(difference_type n)
291
+ requires random_access_iterator<Iterator>;
292
+ constexpr basic_const_iterator& operator-=(difference_type n)
293
+ requires random_access_iterator<Iterator>;
294
+ ```
295
+
296
+ Let *`op`* be the operator.
297
+
298
+ *Effects:* Equivalent to:
299
+
300
+ ``` cpp
301
+ current_ op n;
302
+ return *this;
303
+ ```
304
+
305
+ ``` cpp
306
+ constexpr reference operator[](difference_type n) const requires random_access_iterator<Iterator>
307
+ ```
308
+
309
+ *Effects:* Equivalent to:
310
+ `return static_cast<`*`reference`*`>(`*`current_`*`[n]);`
311
+
312
+ ``` cpp
313
+ template<sentinel_for<Iterator> S>
314
+ constexpr bool operator==(const S& s) const;
315
+ ```
316
+
317
+ *Effects:* Equivalent to: `return `*`current_`*` == s;`
318
+
319
+ ``` cpp
320
+ constexpr bool operator<(const basic_const_iterator& y) const
321
+ requires random_access_iterator<Iterator>;
322
+ constexpr bool operator>(const basic_const_iterator& y) const
323
+ requires random_access_iterator<Iterator>;
324
+ constexpr bool operator<=(const basic_const_iterator& y) const
325
+ requires random_access_iterator<Iterator>;
326
+ constexpr bool operator>=(const basic_const_iterator& y) const
327
+ requires random_access_iterator<Iterator>;
328
+ constexpr auto operator<=>(const basic_const_iterator& y) const
329
+ requires random_access_iterator<Iterator> && three_way_comparable<Iterator>;
330
+ ```
331
+
332
+ Let *`op`* be the operator.
333
+
334
+ *Effects:* Equivalent to:
335
+ `return `*`current_`*` `*`op`*` `*`y.current_`*`;`
336
+
337
+ ``` cpp
338
+ template<different-from<basic_const_iterator> I>
339
+ constexpr bool operator<(const I& y) const
340
+ requires random_access_iterator<Iterator> && totally_ordered_with<Iterator, I>;
341
+ template<different-from<basic_const_iterator> I>
342
+ constexpr bool operator>(const I& y) const
343
+ requires random_access_iterator<Iterator> && totally_ordered_with<Iterator, I>;
344
+ template<different-from<basic_const_iterator> I>
345
+ constexpr bool operator<=(const I& y) const
346
+ requires random_access_iterator<Iterator> && totally_ordered_with<Iterator, I>;
347
+ template<different-from<basic_const_iterator> I>
348
+ constexpr bool operator>=(const I& y) const
349
+ requires random_access_iterator<Iterator> && totally_ordered_with<Iterator, I>;
350
+ template<different-from<basic_const_iterator> I>
351
+ constexpr auto operator<=>(const I& y) const
352
+ requires random_access_iterator<Iterator> && totally_ordered_with<Iterator, I> &&
353
+ three_way_comparable_with<Iterator, I>;
354
+ ```
355
+
356
+ Let *`op`* be the operator.
357
+
358
+ *Effects:* Equivalent to: `return `*`current_`*` `*`op`*` y;`
359
+
360
+ ``` cpp
361
+ template<not-a-const-iterator I>
362
+ friend constexpr bool operator<(const I& x, const basic_const_iterator& y)
363
+ requires random_access_iterator<Iterator> && totally_ordered_with<Iterator, I>;
364
+ template<not-a-const-iterator I>
365
+ friend constexpr bool operator>(const I& x, const basic_const_iterator& y)
366
+ requires random_access_iterator<Iterator> && totally_ordered_with<Iterator, I>;
367
+ template<not-a-const-iterator I>
368
+ friend constexpr bool operator<=(const I& x, const basic_const_iterator& y)
369
+ requires random_access_iterator<Iterator> && totally_ordered_with<Iterator, I>;
370
+ template<not-a-const-iterator I>
371
+ friend constexpr bool operator>=(const I& x, const basic_const_iterator& y)
372
+ requires random_access_iterator<Iterator> && totally_ordered_with<Iterator, I>;
373
+ ```
374
+
375
+ Let *`op`* be the operator.
376
+
377
+ *Returns:* Equivalent to: `return x `*`op`*` y.`*`current_`*`;`
378
+
379
+ ``` cpp
380
+ friend constexpr basic_const_iterator operator+(const basic_const_iterator& i, difference_type n)
381
+ requires random_access_iterator<Iterator>;
382
+ friend constexpr basic_const_iterator operator+(difference_type n, const basic_const_iterator& i)
383
+ requires random_access_iterator<Iterator>;
384
+ ```
385
+
386
+ *Effects:* Equivalent to:
387
+ `return basic_const_iterator(i.`*`current_`*` + n);`
388
+
389
+ ``` cpp
390
+ friend constexpr basic_const_iterator operator-(const basic_const_iterator& i, difference_type n)
391
+ requires random_access_iterator<Iterator>;
392
+ ```
393
+
394
+ *Effects:* Equivalent to:
395
+ `return basic_const_iterator(i.`*`current_`*` - n);`
396
+
397
+ ``` cpp
398
+ template<sized_sentinel_for<Iterator> S>
399
+ constexpr difference_type operator-(const S& y) const;
400
+ ```
401
+
402
+ *Effects:* Equivalent to: `return `*`current_`*` - y;`
403
+
404
+ ``` cpp
405
+ template<not-a-const-iterator S>
406
+ requires sized_sentinel_for<S, Iterator>
407
+ friend constexpr difference_type operator-(const S& x, const basic_const_iterator& y);
408
+ ```
409
+
410
+ *Effects:* Equivalent to: `return x - y.`*`current_`*`;`
411
+