From Jason Turner

[coro.generator]

Diff to HTML by rtfpessoa

Files changed (1) hide show
  1. tmp/tmpel_i1v3a/{from.md → to.md} +676 -0
tmp/tmpel_i1v3a/{from.md → to.md} RENAMED
@@ -0,0 +1,676 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ## Range generators <a id="coro.generator">[[coro.generator]]</a>
2
+
3
+ ### Overview <a id="coroutine.generator.overview">[[coroutine.generator.overview]]</a>
4
+
5
+ Class template `generator` presents a view of the elements yielded by
6
+ the evaluation of a coroutine.
7
+
8
+ A `generator` generates a sequence of elements by repeatedly resuming
9
+ the coroutine from which it was returned. Elements of the sequence are
10
+ produced by the coroutine each time a `co_yield` statement is evaluated.
11
+ When the `co_yield` statement is of the form `co_yield elements_of(r)`,
12
+ each element of the range `r` is successively produced as an element of
13
+ the sequence.
14
+
15
+ [*Example 1*:
16
+
17
+ ``` cpp
18
+ generator<int> ints(int start = 0) {
19
+ while (true)
20
+ co_yield start++;
21
+ }
22
+
23
+ void f() {
24
+ for (auto i : ints() | views::take(3))
25
+ cout << i << ' '; // prints 0 1 2
26
+ }
27
+ ```
28
+
29
+ — *end example*]
30
+
31
+ ### Header `<generator>` synopsis <a id="generator.syn">[[generator.syn]]</a>
32
+
33
+ ``` cpp
34
+ namespace std {
35
+ // [coro.generator.class], class template generator
36
+ template<class Ref, class V = void, class Allocator = void>
37
+ class generator;
38
+
39
+ namespace pmr {
40
+ template<class R, class V = void>
41
+ using generator = std::generator<R, V, polymorphic_allocator<>>;
42
+ }
43
+ }
44
+ ```
45
+
46
+ ### Class template `generator` <a id="coro.generator.class">[[coro.generator.class]]</a>
47
+
48
+ ``` cpp
49
+ namespace std {
50
+ template<class Ref, class V = void, class Allocator = void>
51
+ class generator : public ranges::view_interface<generator<Ref, V, Allocator>> {
52
+ private:
53
+ using value = conditional_t<is_void_v<V>, remove_cvref_t<Ref>, V>; // exposition only
54
+ using reference = conditional_t<is_void_v<V>, Ref&&, Ref>; // exposition only
55
+
56
+ // [coro.generator.iterator], class generator::iterator
57
+ class iterator; // exposition only
58
+
59
+ public:
60
+ using yielded =
61
+ conditional_t<is_reference_v<reference>, reference, const reference&>;
62
+
63
+ // [coro.generator.promise], class generator::promise_type
64
+ class promise_type;
65
+
66
+ generator(const generator&) = delete;
67
+ generator(generator&& other) noexcept;
68
+
69
+ ~generator();
70
+
71
+ generator& operator=(generator other) noexcept;
72
+
73
+ iterator begin();
74
+ default_sentinel_t end() const noexcept;
75
+
76
+ private:
77
+ coroutine_handle<promise_type> coroutine_ = nullptr; // exposition only
78
+ unique_ptr<stack<coroutine_handle<>>> active_; // exposition only
79
+ };
80
+ }
81
+ ```
82
+
83
+ *Mandates:*
84
+
85
+ - If `Allocator` is not `void`, `allocator_traits<Allocator>::pointer`
86
+ is a pointer type.
87
+ - *`value`* is a cv-unqualified object type.
88
+ - *`reference`* is either a reference type, or a cv-unqualified object
89
+ type that models `copy_constructible`.
90
+ - Let `RRef` denote `remove_reference_t<reference>&&` if *`reference`*
91
+ is a reference type, and *`reference`* otherwise. Each of:
92
+ - `common_reference_with<reference&&, value&>`,
93
+ - `common_reference_with<reference&&, RRef&&>`, and
94
+ - `\texttt{common_reference_with}<RRef&&, const \exposid{value}&>`
95
+
96
+ is modeled.
97
+ \[*Note 1*: These requirements ensure the exposition-only *`iterator`*
98
+ type can model `indirectly_readable` and thus
99
+ `input_iterator`. — *end note*]
100
+
101
+ If `Allocator` is not `void`, it shall meet the *Cpp17Allocator*
102
+ requirements.
103
+
104
+ Specializations of `generator` model `view` and `input_range`.
105
+
106
+ The behavior of a program that adds a specialization for `generator` is
107
+ undefined.
108
+
109
+ ### Members <a id="coro.generator.members">[[coro.generator.members]]</a>
110
+
111
+ ``` cpp
112
+ generator(generator&& other) noexcept;
113
+ ```
114
+
115
+ *Effects:* Initializes *coroutine\_* with
116
+ `exchange(other.`*`coroutine_`*`, {})` and *active\_* with
117
+ `exchange(other.active_, nullptr)`.
118
+
119
+ [*Note 1*: Iterators previously obtained from `other` are not
120
+ invalidated; they become iterators into `*this`. — *end note*]
121
+
122
+ ``` cpp
123
+ ~generator();
124
+ ```
125
+
126
+ *Effects:* Equivalent to:
127
+
128
+ ``` cpp
129
+ if (coroutine_) {
130
+ coroutine_.destroy();
131
+ }
132
+ ```
133
+
134
+ [*Note 2*: Ownership of recursively yielded generators is held in
135
+ awaitable objects in the coroutine frame of the yielding generator, so
136
+ destroying the root generator effectively destroys the entire stack of
137
+ yielded generators. — *end note*]
138
+
139
+ ``` cpp
140
+ generator& operator=(generator other) noexcept;
141
+ ```
142
+
143
+ *Effects:* Equivalent to:
144
+
145
+ ``` cpp
146
+ swap(coroutine_, other.coroutine_);
147
+ swap(active_, other.active_);
148
+ ```
149
+
150
+ *Returns:* `*this`.
151
+
152
+ [*Note 3*: Iterators previously obtained from `other` are not
153
+ invalidated; they become iterators into `*this`. — *end note*]
154
+
155
+ ``` cpp
156
+ iterator begin();
157
+ ```
158
+
159
+ *Preconditions:* *coroutine\_* refers to a coroutine suspended at its
160
+ initial suspend point [[dcl.fct.def.coroutine]].
161
+
162
+ *Effects:* Pushes *coroutine\_* into `*`*`active_`*, then evaluates
163
+ *`coroutine_`*`.resume()`.
164
+
165
+ *Returns:* An *iterator* object whose member *coroutine\_* refers to the
166
+ same coroutine as does *coroutine\_*.
167
+
168
+ [*Note 4*: A program that calls `begin` more than once on the same
169
+ generator has undefined behavior. — *end note*]
170
+
171
+ ``` cpp
172
+ default_sentinel_t end() const noexcept;
173
+ ```
174
+
175
+ *Returns:* `default_sentinel`.
176
+
177
+ ### Class `generator::promise_type` <a id="coro.generator.promise">[[coro.generator.promise]]</a>
178
+
179
+ ``` cpp
180
+ namespace std {
181
+ template<class Ref, class V, class Allocator>
182
+ class generator<Ref, V, Allocator>::promise_type {
183
+ public:
184
+ generator get_return_object() noexcept;
185
+
186
+ suspend_always initial_suspend() const noexcept { return {}; }
187
+ auto final_suspend() noexcept;
188
+
189
+ suspend_always yield_value(yielded val) noexcept;
190
+
191
+ auto yield_value(const remove_reference_t<yielded>& lval)
192
+ requires is_rvalue_reference_v<yielded> &&
193
+ constructible_from<remove_cvref_t<yielded>, const remove_reference_t<yielded>&>;
194
+
195
+ template<class R2, class V2, class Alloc2, class Unused>
196
+ requires same_as<typename generator<R2, V2, Alloc2>::yielded, yielded>
197
+ auto yield_value(ranges::elements_of<generator<R2, V2, Alloc2>&&, Unused> g) noexcept;
198
+
199
+ template<ranges::input_range R, class Alloc>
200
+ requires convertible_to<ranges::range_reference_t<R>, yielded>
201
+ auto yield_value(ranges::elements_of<R, Alloc> r) noexcept;
202
+
203
+ void await_transform() = delete;
204
+
205
+ void return_void() const noexcept {}
206
+ void unhandled_exception();
207
+
208
+ void* operator new(size_t size)
209
+ requires same_as<Allocator, void> || default_initializable<Allocator>;
210
+
211
+ template<class Alloc, class... Args>
212
+ requires same_as<Allocator, void> || convertible_to<const Alloc&, Allocator>
213
+ void* operator new(size_t size, allocator_arg_t, const Alloc& alloc, const Args&...);
214
+
215
+ template<class This, class Alloc, class... Args>
216
+ requires same_as<Allocator, void> || convertible_to<const Alloc&, Allocator>
217
+ void* operator new(size_t size, const This&, allocator_arg_t, const Alloc& alloc,
218
+ const Args&...);
219
+
220
+ void operator delete(void* pointer, size_t size) noexcept;
221
+
222
+ private:
223
+ add_pointer_t<yielded> value_ = nullptr; // exposition only
224
+ exception_ptr except_; // exposition only
225
+ };
226
+ }
227
+ ```
228
+
229
+ ``` cpp
230
+ generator get_return_object() noexcept;
231
+ ```
232
+
233
+ *Returns:* A `generator` object whose member *coroutine\_* is
234
+ `coroutine_handle<promise_type>::from_promise(*this)`, and whose member
235
+ *active\_* points to an empty stack.
236
+
237
+ ``` cpp
238
+ auto final_suspend() noexcept;
239
+ ```
240
+
241
+ *Preconditions:* A handle referring to the coroutine whose promise
242
+ object is `*this` is at the top of `*`*`active_`* of some `generator`
243
+ object `x`. This function is called by that coroutine upon reaching its
244
+ final suspend point [[dcl.fct.def.coroutine]].
245
+
246
+ *Returns:* An awaitable object of unspecified type [[expr.await]] whose
247
+ member functions arrange for the calling coroutine to be suspended, pop
248
+ the coroutine handle from the top of `*x.`*`active_`*, and resume
249
+ execution of the coroutine referred to by `x.`*`active_`*`->top()` if
250
+ `*x.`*`active_`* is not empty. If it is empty, control flow returns to
251
+ the current coroutine caller or resumer [[dcl.fct.def.coroutine]].
252
+
253
+ ``` cpp
254
+ suspend_always yield_value(yielded val) noexcept;
255
+ ```
256
+
257
+ *Effects:* Equivalent to *`value_`*` = addressof(val)`.
258
+
259
+ *Returns:* `{}`.
260
+
261
+ ``` cpp
262
+ auto yield_value(const remove_reference_t<yielded>& lval)
263
+ requires is_rvalue_reference_v<yielded> &&
264
+ constructible_from<remove_cvref_t<yielded>, const remove_reference_t<yielded>&>;
265
+ ```
266
+
267
+ *Preconditions:* A handle referring to the coroutine whose promise
268
+ object is `*this` is at the top of `*`*`active_`* of some `generator`
269
+ object.
270
+
271
+ *Returns:* An awaitable object of an unspecified type [[expr.await]]
272
+ that stores an object of type `remove_cvref_t<yielded>`
273
+ direct-non-list-initialized with `lval`, whose member functions arrange
274
+ for *value\_* to point to that stored object and then suspend the
275
+ coroutine.
276
+
277
+ *Throws:* Any exception thrown by the initialization of the stored
278
+ object.
279
+
280
+ *Remarks:* A *yield-expression* that calls this function has type `void`
281
+ [[expr.yield]].
282
+
283
+ ``` cpp
284
+ template<class R2, class V2, class Alloc2, class Unused>
285
+ requires same_as<typename generator<R2, V2, Alloc2>::yielded, yielded>
286
+ auto yield_value(ranges::elements_of<generator<R2, V2, Alloc2>&&, Unused> g) noexcept;
287
+ ```
288
+
289
+ *Preconditions:* A handle referring to the coroutine whose promise
290
+ object is `*this` is at the top of `*`*`active_`* of some `generator`
291
+ object `x`. The coroutine referred to by `g.range.`*`coroutine_`* is
292
+ suspended at its initial suspend point.
293
+
294
+ *Returns:* An awaitable object of an unspecified type [[expr.await]]
295
+ into which `g.range` is moved, whose member `await_ready` returns
296
+ `false`, whose member `await_suspend` pushes
297
+ `g.range.`\textit{coroutine\_} into `*x.`*`active_`* and resumes
298
+ execution of the coroutine referred to by `g.range.`*`coroutine_`*, and
299
+ whose member `await_resume` evaluates `rethrow_exception(`*`except_`*`)`
300
+ if `bool(`*`except_`*`)` is `true`. If `bool(`*`except_`*`)` is `false`,
301
+ the `await_resume` member has no effects.
302
+
303
+ *Remarks:* A *yield-expression* that calls this function has type `void`
304
+ [[expr.yield]].
305
+
306
+ ``` cpp
307
+ template<ranges::input_range R, class Alloc>
308
+ requires convertible_to<ranges::range_reference_t<R>, yielded>
309
+ auto yield_value(ranges::elements_of<R, Alloc> r) noexcept;
310
+ ```
311
+
312
+ *Effects:* Equivalent to:
313
+
314
+ ``` cpp
315
+ auto nested = [](allocator_arg_t, Alloc, ranges::iterator_t<R> i, ranges::sentinel_t<R> s)
316
+ -> generator<yielded, ranges::range_value_t<R>, Alloc> {
317
+ for (; i != s; ++i) {
318
+ co_yield static_cast<yielded>(*i);
319
+ }
320
+ };
321
+ return yield_value(ranges::elements_of(nested(
322
+ allocator_arg, r.allocator, ranges::begin(r.range), ranges::end(r.range))));
323
+ ```
324
+
325
+ [*Note 1*: A *yield-expression* that calls this function has type
326
+ `void` [[expr.yield]]. — *end note*]
327
+
328
+ ``` cpp
329
+ void unhandled_exception();
330
+ ```
331
+
332
+ *Preconditions:* A handle referring to the coroutine whose promise
333
+ object is `*this` is at the top of `*`*`active_`* of some `generator`
334
+ object `x`.
335
+
336
+ *Effects:* If the handle referring to the coroutine whose promise object
337
+ is `*this` is the sole element of `*x.`*`active_`*, equivalent to
338
+ `throw`, otherwise, assigns `current_exception()` to *except\_*.
339
+
340
+ ``` cpp
341
+ void* operator new(size_t size)
342
+ requires same_as<Allocator, void> || default_initializable<Allocator>;
343
+
344
+ template<class Alloc, class... Args>
345
+ requires same_as<Allocator, void> || convertible_to<const Alloc&, Allocator>
346
+ void* operator new(size_t size, allocator_arg_t, const Alloc& alloc, const Args&...);
347
+
348
+ template<class This, class Alloc, class... Args>
349
+ requires same_as<Allocator, void> || convertible_to<const Alloc&, Allocator>
350
+ void* operator new(size_t size, const This&, allocator_arg_t, const Alloc& alloc,
351
+ const Args&...);
352
+ ```
353
+
354
+ Let `A` be
355
+
356
+ - `Allocator`, if it is not `void`,
357
+ - `Alloc` for the overloads with a template parameter `Alloc`, or
358
+ - `allocator<void>` otherwise.
359
+
360
+ Let `B` be `allocator_traits<A>::template rebind_alloc<U>` where `U` is
361
+ an unspecified type whose size and alignment are both
362
+ \_\_STDCPP_DEFAULT_NEW_ALIGNMENT\_\_.
363
+
364
+ *Mandates:* `allocator_traits<B>::pointer` is a pointer type.
365
+
366
+ *Effects:* Initializes an allocator `b` of type `B` with `A(alloc)`, for
367
+ the overloads with a function parameter `alloc`, and with `A()`
368
+ otherwise. Uses `b` to allocate storage for the smallest array of `U`
369
+ sufficient to provide storage for a coroutine state of size `size`, and
370
+ unspecified additional state necessary to ensure that `operator delete`
371
+ can later deallocate this memory block with an allocator equal to `b`.
372
+
373
+ *Returns:* A pointer to the allocated storage.
374
+
375
+ ``` cpp
376
+ void operator delete(void* pointer, size_t size) noexcept;
377
+ ```
378
+
379
+ *Preconditions:* `pointer` was returned from an invocation of one of the
380
+ above overloads of `operator new` with a `size` argument equal to
381
+ `size`.
382
+
383
+ *Effects:* Deallocates the storage pointed to by `pointer` using an
384
+ allocator equivalent to that used to allocate it.
385
+
386
+ ### Class `generator::iterator` <a id="coro.generator.iterator">[[coro.generator.iterator]]</a>
387
+
388
+ ``` cpp
389
+ namespace std {
390
+ template<class Ref, class V, class Allocator>
391
+ class generator<Ref, V, Allocator>::iterator {
392
+ public:
393
+ using value_type = value;
394
+ using difference_type = ptrdiff_t;
395
+
396
+ iterator(iterator&& other) noexcept;
397
+ iterator& operator=(iterator&& other) noexcept;
398
+
399
+ reference operator*() const noexcept(is_nothrow_copy_constructible_v<reference>);
400
+ iterator& operator++();
401
+ void operator++(int);
402
+
403
+ friend bool operator==(const iterator& i, default_sentinel_t);
404
+
405
+ private:
406
+ coroutine_handle<promise_type> coroutine_; // exposition only
407
+ };
408
+ }
409
+ ```
410
+
411
+ ``` cpp
412
+ iterator(iterator&& other) noexcept;
413
+ ```
414
+
415
+ *Effects:* Initializes *coroutine\_* with
416
+ `exchange(other.`*`coroutine_`*`, {})`.
417
+
418
+ ``` cpp
419
+ iterator& operator=(iterator&& other) noexcept;
420
+ ```
421
+
422
+ *Effects:* Equivalent to
423
+ *`coroutine_`*` = exchange(other.`*`coroutine_`*`, {})`.
424
+
425
+ *Returns:* `*this`.
426
+
427
+ ``` cpp
428
+ reference operator*() const noexcept(is_nothrow_copy_constructible_v<reference>);
429
+ ```
430
+
431
+ *Preconditions:* For some `generator` object `x`, *coroutine\_* is in
432
+ `*x.`*`active_`* and `x.`*`active_`*`->top()` refers to a suspended
433
+ coroutine with promise object `p`.
434
+
435
+ *Effects:* Equivalent to:
436
+ `return static_cast<`*`reference`*`>(*p.`*`value_`*`);`
437
+
438
+ ``` cpp
439
+ iterator& operator++();
440
+ ```
441
+
442
+ *Preconditions:* For some `generator` object `x`, *coroutine\_* is in
443
+ `*x.`*`active_`*.
444
+
445
+ *Effects:* Equivalent to `x.`*`active_`*`->top().resume()`.
446
+
447
+ *Returns:* `*this`.
448
+
449
+ ``` cpp
450
+ void operator++(int);
451
+ ```
452
+
453
+ *Effects:* Equivalent to `++*this`.
454
+
455
+ ``` cpp
456
+ friend bool operator==(const iterator& i, default_sentinel_t);
457
+ ```
458
+
459
+ *Effects:* Equivalent to: `return i.`*`coroutine_`*`.done();`
460
+
461
+ <!-- Link reference definitions -->
462
+ [basic.lookup.argdep]: basic.md#basic.lookup.argdep
463
+ [concepts.equality]: concepts.md#concepts.equality
464
+ [containers]: containers.md#containers
465
+ [conv.rval]: expr.md#conv.rval
466
+ [coro.generator]: #coro.generator
467
+ [coro.generator.class]: #coro.generator.class
468
+ [coro.generator.iterator]: #coro.generator.iterator
469
+ [coro.generator.members]: #coro.generator.members
470
+ [coro.generator.promise]: #coro.generator.promise
471
+ [coroutine.generator.overview]: #coroutine.generator.overview
472
+ [customization.point.object]: library.md#customization.point.object
473
+ [dcl.fct.def.coroutine]: dcl.md#dcl.fct.def.coroutine
474
+ [dcl.init.general]: dcl.md#dcl.init.general
475
+ [expr.await]: expr.md#expr.await
476
+ [expr.const]: expr.md#expr.const
477
+ [expr.yield]: expr.md#expr.yield
478
+ [generator.syn]: #generator.syn
479
+ [iterator.concept.bidir]: iterators.md#iterator.concept.bidir
480
+ [iterator.concept.forward]: iterators.md#iterator.concept.forward
481
+ [iterator.concept.iterator]: iterators.md#iterator.concept.iterator
482
+ [iterator.concept.output]: iterators.md#iterator.concept.output
483
+ [iterator.concept.random.access]: iterators.md#iterator.concept.random.access
484
+ [iterator.concept.sizedsentinel]: iterators.md#iterator.concept.sizedsentinel
485
+ [iterator.concept.winc]: iterators.md#iterator.concept.winc
486
+ [iterator.requirements.general]: iterators.md#iterator.requirements.general
487
+ [namespace.std]: library.md#namespace.std
488
+ [range.access]: #range.access
489
+ [range.access.begin]: #range.access.begin
490
+ [range.access.cbegin]: #range.access.cbegin
491
+ [range.access.cend]: #range.access.cend
492
+ [range.access.crbegin]: #range.access.crbegin
493
+ [range.access.crend]: #range.access.crend
494
+ [range.access.end]: #range.access.end
495
+ [range.access.general]: #range.access.general
496
+ [range.access.rbegin]: #range.access.rbegin
497
+ [range.access.rend]: #range.access.rend
498
+ [range.adaptor.helpers]: #range.adaptor.helpers
499
+ [range.adaptor.object]: #range.adaptor.object
500
+ [range.adaptors]: #range.adaptors
501
+ [range.adaptors.general]: #range.adaptors.general
502
+ [range.adjacent]: #range.adjacent
503
+ [range.adjacent.iterator]: #range.adjacent.iterator
504
+ [range.adjacent.overview]: #range.adjacent.overview
505
+ [range.adjacent.sentinel]: #range.adjacent.sentinel
506
+ [range.adjacent.transform]: #range.adjacent.transform
507
+ [range.adjacent.transform.iterator]: #range.adjacent.transform.iterator
508
+ [range.adjacent.transform.overview]: #range.adjacent.transform.overview
509
+ [range.adjacent.transform.sentinel]: #range.adjacent.transform.sentinel
510
+ [range.adjacent.transform.view]: #range.adjacent.transform.view
511
+ [range.adjacent.view]: #range.adjacent.view
512
+ [range.all]: #range.all
513
+ [range.all.general]: #range.all.general
514
+ [range.as.const]: #range.as.const
515
+ [range.as.const.overview]: #range.as.const.overview
516
+ [range.as.const.view]: #range.as.const.view
517
+ [range.as.rvalue]: #range.as.rvalue
518
+ [range.as.rvalue.overview]: #range.as.rvalue.overview
519
+ [range.as.rvalue.view]: #range.as.rvalue.view
520
+ [range.cartesian]: #range.cartesian
521
+ [range.cartesian.iterator]: #range.cartesian.iterator
522
+ [range.cartesian.overview]: #range.cartesian.overview
523
+ [range.cartesian.view]: #range.cartesian.view
524
+ [range.chunk]: #range.chunk
525
+ [range.chunk.by]: #range.chunk.by
526
+ [range.chunk.by.iter]: #range.chunk.by.iter
527
+ [range.chunk.by.overview]: #range.chunk.by.overview
528
+ [range.chunk.by.view]: #range.chunk.by.view
529
+ [range.chunk.fwd.iter]: #range.chunk.fwd.iter
530
+ [range.chunk.inner.iter]: #range.chunk.inner.iter
531
+ [range.chunk.outer.iter]: #range.chunk.outer.iter
532
+ [range.chunk.outer.value]: #range.chunk.outer.value
533
+ [range.chunk.overview]: #range.chunk.overview
534
+ [range.chunk.view.fwd]: #range.chunk.view.fwd
535
+ [range.chunk.view.input]: #range.chunk.view.input
536
+ [range.common]: #range.common
537
+ [range.common.overview]: #range.common.overview
538
+ [range.common.view]: #range.common.view
539
+ [range.counted]: #range.counted
540
+ [range.dangling]: #range.dangling
541
+ [range.drop]: #range.drop
542
+ [range.drop.overview]: #range.drop.overview
543
+ [range.drop.view]: #range.drop.view
544
+ [range.drop.while]: #range.drop.while
545
+ [range.drop.while.overview]: #range.drop.while.overview
546
+ [range.drop.while.view]: #range.drop.while.view
547
+ [range.elements]: #range.elements
548
+ [range.elements.iterator]: #range.elements.iterator
549
+ [range.elements.overview]: #range.elements.overview
550
+ [range.elements.sentinel]: #range.elements.sentinel
551
+ [range.elements.view]: #range.elements.view
552
+ [range.elementsof]: #range.elementsof
553
+ [range.empty]: #range.empty
554
+ [range.empty.overview]: #range.empty.overview
555
+ [range.empty.view]: #range.empty.view
556
+ [range.enumerate]: #range.enumerate
557
+ [range.enumerate.iterator]: #range.enumerate.iterator
558
+ [range.enumerate.overview]: #range.enumerate.overview
559
+ [range.enumerate.sentinel]: #range.enumerate.sentinel
560
+ [range.enumerate.view]: #range.enumerate.view
561
+ [range.factories]: #range.factories
562
+ [range.factories.general]: #range.factories.general
563
+ [range.filter]: #range.filter
564
+ [range.filter.iterator]: #range.filter.iterator
565
+ [range.filter.overview]: #range.filter.overview
566
+ [range.filter.sentinel]: #range.filter.sentinel
567
+ [range.filter.view]: #range.filter.view
568
+ [range.iota]: #range.iota
569
+ [range.iota.iterator]: #range.iota.iterator
570
+ [range.iota.overview]: #range.iota.overview
571
+ [range.iota.sentinel]: #range.iota.sentinel
572
+ [range.iota.view]: #range.iota.view
573
+ [range.istream]: #range.istream
574
+ [range.istream.iterator]: #range.istream.iterator
575
+ [range.istream.overview]: #range.istream.overview
576
+ [range.istream.view]: #range.istream.view
577
+ [range.join]: #range.join
578
+ [range.join.iterator]: #range.join.iterator
579
+ [range.join.overview]: #range.join.overview
580
+ [range.join.sentinel]: #range.join.sentinel
581
+ [range.join.view]: #range.join.view
582
+ [range.join.with]: #range.join.with
583
+ [range.join.with.iterator]: #range.join.with.iterator
584
+ [range.join.with.overview]: #range.join.with.overview
585
+ [range.join.with.sentinel]: #range.join.with.sentinel
586
+ [range.join.with.view]: #range.join.with.view
587
+ [range.lazy.split]: #range.lazy.split
588
+ [range.lazy.split.inner]: #range.lazy.split.inner
589
+ [range.lazy.split.outer]: #range.lazy.split.outer
590
+ [range.lazy.split.outer.value]: #range.lazy.split.outer.value
591
+ [range.lazy.split.overview]: #range.lazy.split.overview
592
+ [range.lazy.split.view]: #range.lazy.split.view
593
+ [range.move.wrap]: #range.move.wrap
594
+ [range.nonprop.cache]: #range.nonprop.cache
595
+ [range.owning.view]: #range.owning.view
596
+ [range.prim.cdata]: #range.prim.cdata
597
+ [range.prim.data]: #range.prim.data
598
+ [range.prim.empty]: #range.prim.empty
599
+ [range.prim.size]: #range.prim.size
600
+ [range.prim.ssize]: #range.prim.ssize
601
+ [range.range]: #range.range
602
+ [range.ref.view]: #range.ref.view
603
+ [range.refinements]: #range.refinements
604
+ [range.repeat]: #range.repeat
605
+ [range.repeat.iterator]: #range.repeat.iterator
606
+ [range.repeat.overview]: #range.repeat.overview
607
+ [range.repeat.view]: #range.repeat.view
608
+ [range.req]: #range.req
609
+ [range.req.general]: #range.req.general
610
+ [range.reverse]: #range.reverse
611
+ [range.reverse.overview]: #range.reverse.overview
612
+ [range.reverse.view]: #range.reverse.view
613
+ [range.single]: #range.single
614
+ [range.single.overview]: #range.single.overview
615
+ [range.single.view]: #range.single.view
616
+ [range.sized]: #range.sized
617
+ [range.slide]: #range.slide
618
+ [range.slide.iterator]: #range.slide.iterator
619
+ [range.slide.overview]: #range.slide.overview
620
+ [range.slide.sentinel]: #range.slide.sentinel
621
+ [range.slide.view]: #range.slide.view
622
+ [range.split]: #range.split
623
+ [range.split.iterator]: #range.split.iterator
624
+ [range.split.overview]: #range.split.overview
625
+ [range.split.sentinel]: #range.split.sentinel
626
+ [range.split.view]: #range.split.view
627
+ [range.stride]: #range.stride
628
+ [range.stride.iterator]: #range.stride.iterator
629
+ [range.stride.overview]: #range.stride.overview
630
+ [range.stride.view]: #range.stride.view
631
+ [range.subrange]: #range.subrange
632
+ [range.subrange.access]: #range.subrange.access
633
+ [range.subrange.ctor]: #range.subrange.ctor
634
+ [range.subrange.general]: #range.subrange.general
635
+ [range.summary]: #range.summary
636
+ [range.take]: #range.take
637
+ [range.take.overview]: #range.take.overview
638
+ [range.take.sentinel]: #range.take.sentinel
639
+ [range.take.view]: #range.take.view
640
+ [range.take.while]: #range.take.while
641
+ [range.take.while.overview]: #range.take.while.overview
642
+ [range.take.while.sentinel]: #range.take.while.sentinel
643
+ [range.take.while.view]: #range.take.while.view
644
+ [range.transform]: #range.transform
645
+ [range.transform.iterator]: #range.transform.iterator
646
+ [range.transform.overview]: #range.transform.overview
647
+ [range.transform.sentinel]: #range.transform.sentinel
648
+ [range.transform.view]: #range.transform.view
649
+ [range.utility]: #range.utility
650
+ [range.utility.conv]: #range.utility.conv
651
+ [range.utility.conv.adaptors]: #range.utility.conv.adaptors
652
+ [range.utility.conv.general]: #range.utility.conv.general
653
+ [range.utility.conv.to]: #range.utility.conv.to
654
+ [range.utility.general]: #range.utility.general
655
+ [range.utility.helpers]: #range.utility.helpers
656
+ [range.view]: #range.view
657
+ [range.zip]: #range.zip
658
+ [range.zip.iterator]: #range.zip.iterator
659
+ [range.zip.overview]: #range.zip.overview
660
+ [range.zip.sentinel]: #range.zip.sentinel
661
+ [range.zip.transform]: #range.zip.transform
662
+ [range.zip.transform.iterator]: #range.zip.transform.iterator
663
+ [range.zip.transform.overview]: #range.zip.transform.overview
664
+ [range.zip.transform.sentinel]: #range.zip.transform.sentinel
665
+ [range.zip.transform.view]: #range.zip.transform.view
666
+ [range.zip.view]: #range.zip.view
667
+ [ranges]: #ranges
668
+ [ranges.general]: #ranges.general
669
+ [ranges.syn]: #ranges.syn
670
+ [string.view]: strings.md#string.view
671
+ [term.array.type]: dcl.md#term.array.type
672
+ [term.perfect.forwarding.call.wrapper]: utilities.md#term.perfect.forwarding.call.wrapper
673
+ [view.interface]: #view.interface
674
+ [view.interface.general]: #view.interface.general
675
+ [view.interface.members]: #view.interface.members
676
+ [views.span]: containers.md#views.span