54 using transform_t = std::conditional_t<std::is_void_v<Transform>, std::identity, Transform>;
57 std::optional<GeneratorBase<T>> inner;
63 auto h = std::coroutine_handle<promise>::from_promise(*
this);
66 std::suspend_always initial_suspend()
70 std::suspend_always final_suspend()
noexcept
74 void unhandled_exception()
76 this->value =
failure{std::current_exception()};
81 template<
typename From>
82 requires requires(transform_t t, From && f) {
84 t(std::forward<From>(f))
85 } -> std::convertible_to<T>;
87 std::suspend_always yield_value(From && from)
89 this->value.template emplace<1>(convert(std::forward<From>(from)));
96 template<
typename From>
97 requires requires(transform_t t, From && f) {
100 std::suspend_always yield_value(From && from)
103 this->value = inner->active;
118 template<
typename,
typename>
119 friend struct Generator;
120 template<
typename,
typename>
121 friend struct promise;
126 GeneratorBase(GeneratorBase && other)
131 GeneratorBase & operator=(GeneratorBase && other)
133 GeneratorBase(std::move(other)).swap(*
this);
144 std::optional<T> next()
150 while (active.handle) {
151 active.handle.resume();
152 auto & p = *active.state;
155 auto result = std::visit(
167 [&](
link<T> & inner) -> std::optional<T> {
168 auto base = inner.state;
169 while (base->parent.handle) {
170 base = base->parent.state;
172 base->parent = active;
177 [&](T & value) -> std::optional<T> {
return std::move(value); },
186 [&](
failure & f) -> std::optional<T> {
188 std::rethrow_exception(f.e);
202 std::coroutine_handle<> h{};
211 void swap(GeneratorBase & other)
213 std::swap(h, other.h);
214 std::swap(active, other.active);