From Jason Turner

[coro.generator]

Diff to HTML by rtfpessoa

Files changed (1) hide show
  1. tmp/tmp6qsf25ns/{from.md → to.md} +44 -22
tmp/tmp6qsf25ns/{from.md → to.md} RENAMED
@@ -31,29 +31,29 @@ void f() {
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:
@@ -112,11 +112,11 @@ undefined.
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
@@ -176,12 +176,12 @@ default_sentinel_t end() const noexcept;
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;
@@ -193,29 +193,30 @@ namespace std {
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
 
@@ -282,10 +283,13 @@ object.
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
@@ -298,24 +302,24 @@ into which `g.range` is moved, whose member `await_ready` returns
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(
@@ -340,15 +344,13 @@ is `*this` is the sole element of `*x.`*`active_`*, equivalent to
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
@@ -359,11 +361,14 @@ Let `A` be
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
@@ -385,12 +390,12 @@ 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;
@@ -457,10 +462,11 @@ 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
@@ -474,10 +480,11 @@ friend bool operator==(const iterator& i, default_sentinel_t);
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
@@ -509,16 +516,22 @@ friend bool operator==(const iterator& i, default_sentinel_t);
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
@@ -534,10 +547,14 @@ friend bool operator==(const iterator& i, default_sentinel_t);
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
@@ -595,10 +612,11 @@ friend bool operator==(const iterator& i, default_sentinel_t);
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
@@ -639,10 +657,14 @@ friend bool operator==(const iterator& i, default_sentinel_t);
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
 
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 Val = void, class Allocator = void>
37
  class generator;
38
 
39
  namespace pmr {
40
+ template<class Ref, class Val = void>
41
+ using generator = std::generator<Ref, Val, 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 Val = void, class Allocator = void>
51
+ class generator : public ranges::view_interface<generator<Ref, Val, Allocator>> {
52
  private:
53
+ using value = conditional_t<is_void_v<Val>, remove_cvref_t<Ref>, Val>; // exposition only
54
+ using reference = conditional_t<is_void_v<Val>, Ref&&, Ref>; // exposition only
55
 
56
  // [coro.generator.iterator], class generator::iterator
57
  class iterator; // exposition only
58
 
59
  public:
 
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
 
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 Val, class Allocator>
182
+ class generator<Ref, Val, 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;
 
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
+ template<class R2, class V2, class Alloc2, class Unused>
199
+ requires same_as<typename generator<R2, V2, Alloc2>::yielded, yielded>
200
+ auto yield_value(ranges::elements_of<generator<R2, V2, Alloc2>&, Unused> g) noexcept;
201
 
202
  template<ranges::input_range R, class Alloc>
203
  requires convertible_to<ranges::range_reference_t<R>, yielded>
204
+ auto yield_value(ranges::elements_of<R, Alloc> r);
205
 
206
  void await_transform() = delete;
207
 
208
  void return_void() const noexcept {}
209
  void unhandled_exception();
210
 
211
  void* operator new(size_t size)
212
  requires same_as<Allocator, void> || default_initializable<Allocator>;
213
 
214
  template<class Alloc, class... Args>
 
215
  void* operator new(size_t size, allocator_arg_t, const Alloc& alloc, const Args&...);
216
 
217
  template<class This, class Alloc, class... Args>
 
218
  void* operator new(size_t size, const This&, allocator_arg_t, const Alloc& alloc,
219
  const Args&...);
220
 
221
  void operator delete(void* pointer, size_t size) noexcept;
222
 
 
283
 
284
  ``` cpp
285
  template<class R2, class V2, class Alloc2, class Unused>
286
  requires same_as<typename generator<R2, V2, Alloc2>::yielded, yielded>
287
  auto yield_value(ranges::elements_of<generator<R2, V2, Alloc2>&&, Unused> g) noexcept;
288
+ template<class R2, class V2, class Alloc2, class Unused>
289
+ requires same_as<typename generator<R2, V2, Alloc2>::yielded, yielded>
290
+ auto yield_value(ranges::elements_of<generator<R2, V2, Alloc2>&, Unused> g) noexcept;
291
  ```
292
 
293
  *Preconditions:* A handle referring to the coroutine whose promise
294
  object is `*this` is at the top of `*`*`active_`* of some `generator`
295
  object `x`. The coroutine referred to by `g.range.`*`coroutine_`* is
 
302
  execution of the coroutine referred to by `g.range.`*`coroutine_`*, and
303
  whose member `await_resume` evaluates `rethrow_exception(`*`except_`*`)`
304
  if `bool(`*`except_`*`)` is `true`. If `bool(`*`except_`*`)` is `false`,
305
  the `await_resume` member has no effects.
306
 
307
+ *Remarks:* A *yield-expression* that calls one of these functions has
308
+ type `void` [[expr.yield]].
309
 
310
  ``` cpp
311
  template<ranges::input_range R, class Alloc>
312
  requires convertible_to<ranges::range_reference_t<R>, yielded>
313
+ auto yield_value(ranges::elements_of<R, Alloc> r);
314
  ```
315
 
316
  *Effects:* Equivalent to:
317
 
318
  ``` cpp
319
  auto nested = [](allocator_arg_t, Alloc, ranges::iterator_t<R> i, ranges::sentinel_t<R> s)
320
+ -> generator<yielded, void, Alloc> {
321
  for (; i != s; ++i) {
322
  co_yield static_cast<yielded>(*i);
323
  }
324
  };
325
  return yield_value(ranges::elements_of(nested(
 
344
  ``` cpp
345
  void* operator new(size_t size)
346
  requires same_as<Allocator, void> || default_initializable<Allocator>;
347
 
348
  template<class Alloc, class... Args>
 
349
  void* operator new(size_t size, allocator_arg_t, const Alloc& alloc, const Args&...);
350
 
351
  template<class This, class Alloc, class... Args>
 
352
  void* operator new(size_t size, const This&, allocator_arg_t, const Alloc& alloc,
353
  const Args&...);
354
  ```
355
 
356
  Let `A` be
 
361
 
362
  Let `B` be `allocator_traits<A>::template rebind_alloc<U>` where `U` is
363
  an unspecified type whose size and alignment are both
364
  \_\_STDCPP_DEFAULT_NEW_ALIGNMENT\_\_.
365
 
366
+ *Mandates:* `allocator_traits<B>::pointer` is a pointer type. For the
367
+ overloads with a template parameter `Alloc`,
368
+ `same_as<Allocator, void> || convertible_to<const Alloc&, Allocator>` is
369
+ modeled.
370
 
371
  *Effects:* Initializes an allocator `b` of type `B` with `A(alloc)`, for
372
  the overloads with a function parameter `alloc`, and with `A()`
373
  otherwise. Uses `b` to allocate storage for the smallest array of `U`
374
  sufficient to provide storage for a coroutine state of size `size`, and
 
390
 
391
  ### Class `generator::iterator` <a id="coro.generator.iterator">[[coro.generator.iterator]]</a>
392
 
393
  ``` cpp
394
  namespace std {
395
+ template<class Ref, class Val, class Allocator>
396
+ class generator<Ref, Val, Allocator>::iterator {
397
  public:
398
  using value_type = value;
399
  using difference_type = ptrdiff_t;
400
 
401
  iterator(iterator&& other) noexcept;
 
462
  ```
463
 
464
  *Effects:* Equivalent to: `return i.`*`coroutine_`*`.done();`
465
 
466
  <!-- Link reference definitions -->
467
+ [algorithms]: algorithms.md#algorithms
468
  [basic.lookup.argdep]: basic.md#basic.lookup.argdep
469
  [concepts.equality]: concepts.md#concepts.equality
470
  [containers]: containers.md#containers
471
  [conv.rval]: expr.md#conv.rval
472
  [coro.generator]: #coro.generator
 
480
  [dcl.init.general]: dcl.md#dcl.init.general
481
  [expr.await]: expr.md#expr.await
482
  [expr.const]: expr.md#expr.const
483
  [expr.yield]: expr.md#expr.yield
484
  [generator.syn]: #generator.syn
485
+ [intro.races]: basic.md#intro.races
486
  [iterator.concept.bidir]: iterators.md#iterator.concept.bidir
487
  [iterator.concept.forward]: iterators.md#iterator.concept.forward
488
  [iterator.concept.iterator]: iterators.md#iterator.concept.iterator
489
  [iterator.concept.output]: iterators.md#iterator.concept.output
490
  [iterator.concept.random.access]: iterators.md#iterator.concept.random.access
 
516
  [range.adjacent.transform.sentinel]: #range.adjacent.transform.sentinel
517
  [range.adjacent.transform.view]: #range.adjacent.transform.view
518
  [range.adjacent.view]: #range.adjacent.view
519
  [range.all]: #range.all
520
  [range.all.general]: #range.all.general
521
+ [range.approximately.sized]: #range.approximately.sized
522
  [range.as.const]: #range.as.const
523
  [range.as.const.overview]: #range.as.const.overview
524
  [range.as.const.view]: #range.as.const.view
525
  [range.as.rvalue]: #range.as.rvalue
526
  [range.as.rvalue.overview]: #range.as.rvalue.overview
527
  [range.as.rvalue.view]: #range.as.rvalue.view
528
+ [range.cache.latest]: #range.cache.latest
529
+ [range.cache.latest.iterator]: #range.cache.latest.iterator
530
+ [range.cache.latest.overview]: #range.cache.latest.overview
531
+ [range.cache.latest.sentinel]: #range.cache.latest.sentinel
532
+ [range.cache.latest.view]: #range.cache.latest.view
533
  [range.cartesian]: #range.cartesian
534
  [range.cartesian.iterator]: #range.cartesian.iterator
535
  [range.cartesian.overview]: #range.cartesian.overview
536
  [range.cartesian.view]: #range.cartesian.view
537
  [range.chunk]: #range.chunk
 
547
  [range.chunk.view.fwd]: #range.chunk.view.fwd
548
  [range.chunk.view.input]: #range.chunk.view.input
549
  [range.common]: #range.common
550
  [range.common.overview]: #range.common.overview
551
  [range.common.view]: #range.common.view
552
+ [range.concat]: #range.concat
553
+ [range.concat.iterator]: #range.concat.iterator
554
+ [range.concat.overview]: #range.concat.overview
555
+ [range.concat.view]: #range.concat.view
556
  [range.counted]: #range.counted
557
  [range.dangling]: #range.dangling
558
  [range.drop]: #range.drop
559
  [range.drop.overview]: #range.drop.overview
560
  [range.drop.view]: #range.drop.view
 
612
  [range.owning.view]: #range.owning.view
613
  [range.prim.cdata]: #range.prim.cdata
614
  [range.prim.data]: #range.prim.data
615
  [range.prim.empty]: #range.prim.empty
616
  [range.prim.size]: #range.prim.size
617
+ [range.prim.size.hint]: #range.prim.size.hint
618
  [range.prim.ssize]: #range.prim.ssize
619
  [range.range]: #range.range
620
  [range.ref.view]: #range.ref.view
621
  [range.refinements]: #range.refinements
622
  [range.repeat]: #range.repeat
 
657
  [range.take.view]: #range.take.view
658
  [range.take.while]: #range.take.while
659
  [range.take.while.overview]: #range.take.while.overview
660
  [range.take.while.sentinel]: #range.take.while.sentinel
661
  [range.take.while.view]: #range.take.while.view
662
+ [range.to.input]: #range.to.input
663
+ [range.to.input.iterator]: #range.to.input.iterator
664
+ [range.to.input.overview]: #range.to.input.overview
665
+ [range.to.input.view]: #range.to.input.view
666
  [range.transform]: #range.transform
667
  [range.transform.iterator]: #range.transform.iterator
668
  [range.transform.overview]: #range.transform.overview
669
  [range.transform.sentinel]: #range.transform.sentinel
670
  [range.transform.view]: #range.transform.view