35 : m_value(
nullptr), m_exception(
nullptr), m_root(this), m_parentOrLeaf(this) {}
54 m_value = std::addressof(value);
59 m_value = std::addressof(value);
64 return yield_value(generator);
69 awaitable(
promise_type* childPromise) : m_childPromise(childPromise) {}
71 bool await_ready()
noexcept {
return this->m_childPromise ==
nullptr; }
73 void await_suspend(std::coroutine_handle<promise_type> )
noexcept {}
76 if (this->m_childPromise !=
nullptr) {
77 this->m_childPromise->throw_if_exception();
85 if (generator.m_promise !=
nullptr) {
86 m_root->m_parentOrLeaf = generator.m_promise;
87 generator.m_promise->m_root = m_root;
88 generator.m_promise->m_parentOrLeaf =
this;
89 generator.m_promise->resume();
91 if (!generator.m_promise->is_complete()) {
92 return awaitable{generator.m_promise};
95 m_root->m_parentOrLeaf =
this;
98 return awaitable{
nullptr};
104 std::coroutine_handle<promise_type>::from_promise(*this).destroy();
108 if (m_exception !=
nullptr) {
109 std::rethrow_exception(m_exception);
114 return std::coroutine_handle<promise_type>::from_promise(*this).done();
118 assert(
this == m_root);
119 assert(!is_complete());
120 return *m_parentOrLeaf->m_value;
124 assert(!m_parentOrLeaf->is_complete());
126 m_parentOrLeaf->resume();
128 while (m_parentOrLeaf !=
this && m_parentOrLeaf->is_complete()) {
129 m_parentOrLeaf = m_parentOrLeaf->m_parentOrLeaf;
130 m_parentOrLeaf->resume();
135 void resume() noexcept {
136 std::coroutine_handle<promise_type>::from_promise(*this).resume();
140 std::exception_ptr m_exception;
141 promise_type* m_root;
142 promise_type* m_parentOrLeaf;
148 : m_promise(std::exchange(other.m_promise,
nullptr)) {}
151 if (
this != &other) {
152 if (m_promise !=
nullptr) {
153 m_promise->destroy();
155 m_promise = std::exchange(other.m_promise,
nullptr);
164 if (m_promise !=
nullptr) {
165 m_promise->destroy();
174 using reference = std::conditional_t<std::is_reference_v<T>, T, T&>;
182 return m_promise == other.m_promise;
186 return m_promise != other.m_promise;
190 assert(m_promise !=
nullptr);
193 if (m_promise->is_complete()) {
194 auto* temp = m_promise;
196 temp->throw_if_exception();
205 assert(m_promise !=
nullptr);
206 return static_cast<reference>(m_promise->value());
216 if (m_promise !=
nullptr) {
218 if (!m_promise->is_complete()) {
222 m_promise->throw_if_exception();
236 : m_promise(&h.promise()) {}
238 promise_type* m_promise;
Definition recursive_gen.hpp:169
iterator() noexcept
Definition recursive_gen.hpp:177
bool operator==(const iterator &other) const noexcept
Definition recursive_gen.hpp:181
iterator(promise_type *promise) noexcept
Definition recursive_gen.hpp:179
bool operator!=(const iterator &other) const noexcept
Definition recursive_gen.hpp:185
std::add_pointer_t< T > pointer
Definition recursive_gen.hpp:175
std::ptrdiff_t difference_type
Definition recursive_gen.hpp:172
reference operator*() const noexcept
Definition recursive_gen.hpp:204
iterator & operator++()
Definition recursive_gen.hpp:189
std::input_iterator_tag iterator_category
Definition recursive_gen.hpp:171
std::conditional_t< std::is_reference_v< T >, T, T & > reference
Definition recursive_gen.hpp:174
pointer operator->() const noexcept
Definition recursive_gen.hpp:209
std::remove_reference_t< T > value_type
Definition recursive_gen.hpp:173
void operator++(int)
Definition recursive_gen.hpp:202
Definition recursive_gen.hpp:32
std::suspend_always yield_value(T &value) noexcept
Definition recursive_gen.hpp:53
std::suspend_always yield_value(T &&value) noexcept
Definition recursive_gen.hpp:58
promise_type & operator=(const promise_type &)=delete
void pull() noexcept
Definition recursive_gen.hpp:123
bool is_complete() noexcept
Definition recursive_gen.hpp:113
promise_type(const promise_type &)=delete
RecursiveGenerator get_return_object() noexcept
Definition recursive_gen.hpp:43
std::suspend_always final_suspend() noexcept
Definition recursive_gen.hpp:48
void unhandled_exception() noexcept
Definition recursive_gen.hpp:51
std::suspend_never await_transform(U &&)=delete
void return_void() noexcept
Definition recursive_gen.hpp:49
promise_type() noexcept
Definition recursive_gen.hpp:34
void destroy() noexcept
Definition recursive_gen.hpp:103
std::suspend_always initial_suspend() noexcept
Definition recursive_gen.hpp:47
void throw_if_exception()
Definition recursive_gen.hpp:107
promise_type(promise_type &&)=delete
T & value() noexcept
Definition recursive_gen.hpp:117
auto yield_value(RecursiveGenerator &generator) noexcept
Definition recursive_gen.hpp:67
promise_type & operator=(promise_type &&)=delete
auto yield_value(RecursiveGenerator &&generator) noexcept
Definition recursive_gen.hpp:63
Recursive generator using C++20 coroutines with symmetric transfer.
Definition recursive_gen.hpp:30
RecursiveGenerator & operator=(RecursiveGenerator &&other) noexcept
Definition recursive_gen.hpp:150
RecursiveGenerator() noexcept
Definition recursive_gen.hpp:145
RecursiveGenerator(RecursiveGenerator &&other) noexcept
Definition recursive_gen.hpp:147
iterator begin()
Definition recursive_gen.hpp:215
~RecursiveGenerator()
Definition recursive_gen.hpp:163
RecursiveGenerator & operator=(const RecursiveGenerator &)=delete
void swap(RecursiveGenerator &other) noexcept
Definition recursive_gen.hpp:230
iterator end() noexcept
Definition recursive_gen.hpp:228
RecursiveGenerator(const RecursiveGenerator &)=delete
Python-like utilities and data structures for C++.
Definition dict.hpp:18
void swap(RecursiveGenerator< T > &a, RecursiveGenerator< T > &b) noexcept
Definition recursive_gen.hpp:241