5#ifdef __cpp_lib_generator
17 #include <type_traits>
23#ifdef __cpp_lib_generator
24 template<
class Ref,
class V =
void,
class Allocator =
void>
25 using generator = std::generator<Ref, V, Allocator>;
31 template<
class Ref,
class V =
void>
32 class generator :
public std::ranges::view_interface<generator<Ref, V>> {
34 using value = std::conditional_t<std::is_void_v<V>, std::remove_cvref_t<Ref>,
V>;
35 using reference = std::conditional_t<std::is_void_v<V>,
Ref&&,
Ref>;
37 using yielded = std::conditional_t<std::is_reference_v<reference>, reference,
const reference&>;
42 std::add_pointer_t<yielded>
value_ =
nullptr;
44 std::stack<std::coroutine_handle<>>*
active_ =
nullptr;
74 return std::noop_coroutine();
90 except_ = std::current_exception();
110 if (coroutine_.promise().except_) {
111 std::rethrow_exception(coroutine_.promise().except_);
118 return static_cast<reference
>(*coroutine_.promise().value_);
123 coroutine_.promise().except_ =
nullptr;
135 return lhs.coroutine_.done();
138 std::coroutine_handle<promise_type> coroutine_;
143 active_{std::move(
tmp.active_)},
144 coroutine_{std::exchange(
tmp.coroutine_, {})}
148 coroutine_.destroy();
153 std::swap(active_,
other.active_);
154 std::swap(coroutine_,
other.coroutine_);
160 active_->push(coroutine_);
167 return std::default_sentinel;
171 std::coroutine_handle<promise_type>
coroutine) :
175 std::unique_ptr<std::stack<std::coroutine_handle<>>> active_ = std::make_unique<std::stack<std::coroutine_handle<>>>();
176 std::coroutine_handle<promise_type> coroutine_;
#define OSC_ASSERT(expr)
Definition assertions.h:26
Definition generator.h:96
constexpr iterator & operator++()
Definition generator.h:121
iterator & operator=(iterator &&other) noexcept
Definition generator.h:106
iterator(iterator &&other) noexcept
Definition generator.h:105
constexpr iterator & operator++(int)
Definition generator.h:128
reference operator*() const noexcept(std::is_nothrow_copy_constructible_v< reference >)
Definition generator.h:108
iterator(std::coroutine_handle< promise_type > coroutine)
Definition generator.h:101
std::ptrdiff_t difference_type
Definition generator.h:99
friend bool operator==(const iterator &lhs, std::default_sentinel_t)
Definition generator.h:133
value value_type
Definition generator.h:98
Definition generator.h:40
std::add_pointer_t< yielded > value_
Definition generator.h:42
std::exception_ptr except_
Definition generator.h:43
std::suspend_always initial_suspend() const noexcept
Definition generator.h:53
std::stack< std::coroutine_handle<> > * active_
Definition generator.h:44
std::suspend_always yield_value(yielded val)
Definition generator.h:84
void unhandled_exception()
Definition generator.h:88
generator get_return_object() noexcept
Definition generator.h:46
void return_void() const noexcept
Definition generator.h:86
final_awaiter final_suspend() noexcept
Definition generator.h:82
Definition generator.h:32
generator(const generator &)=delete
std::default_sentinel_t end() const noexcept
Definition generator.h:165
std::conditional_t< std::is_reference_v< reference >, reference, const reference & > yielded
Definition generator.h:37
generator & operator=(generator other) noexcept
Definition generator.h:151
iterator begin()
Definition generator.h:157
generator(generator &&tmp) noexcept
Definition generator.h:142
~generator() noexcept
Definition generator.h:146
constexpr U to(T &&value)
Definition conversion.h:56
and
Definition algorithms.h:158
Definition generator.h:56
std::coroutine_handle await_suspend(std::coroutine_handle< promise_type > handle) noexcept
Definition generator.h:62
bool await_ready() noexcept
Definition generator.h:59
void await_resume() noexcept
Definition generator.h:79