15 template<
typename Ref,
typename Value>
18 template<
typename Ref,
typename Value>
21 template<
typename Ref>
24 template<concepts::Reference Yield>
25 class GeneratorPromiseBase {
28 auto await_ready() noexcept ->
bool {
return false; }
30 void await_resume() noexcept {}
35 auto final_suspend() noexcept {
return FinalAwaiter {}; }
37 auto yield_value(Yield
value)
noexcept {
38 m_pointer = util::addressof(
value);
42 void await_transform() =
delete;
44 void return_void() noexcept {}
49 template<
typename,
typename>
50 friend class GeneratorIterator;
55 template<
typename Ref,
typename Value>
56 class GeneratorIterator
57 :
public container::IteratorBase<GeneratorIterator<Ref, Value>, InputIteratorTag, GeneratorValue<Ref, Value>,
63 GeneratorIterator(InPlace, Handle coroutine) : m_coroutine(coroutine) {}
65 GeneratorIterator(GeneratorIterator&& other) : m_coroutine(util::
exchange(other.m_coroutine, {})) {}
67 auto operator=(GeneratorIterator&& other) -> GeneratorIterator& {
72 auto operator*() const -> Ref {
74 return static_cast<Ref
>(*m_coroutine.promise().m_pointer);
83 friend auto operator==(GeneratorIterator
const& a, container::DefaultSentinel) ->
bool {
84 return a.m_coroutine.done();
91template<
typename Ref,
typename Value =
void>
93 using BasePromiseType = detail::GeneratorPromiseBase<detail::GeneratorYield<Ref>>;
95 struct PromiseType : BasePromiseType {
96 auto get_return_object()
noexcept ->
Generator {
108 m_coroutine.destroy();
113 util::swap(this->m_coroutine, other.m_coroutine);
119 m_coroutine.resume();
121 m_coroutine.address()) };
#define DI_ASSERT(...)
Definition assert_bool.h:7
Definition view_interface.h:26
Definition generator.h:92
auto operator=(Generator other) -> Generator &
Definition generator.h:112
auto begin()
Definition generator.h:117
PromiseType promise_type
Definition generator.h:102
auto end() const
Definition generator.h:124
Generator(Generator &&other)
Definition generator.h:104
~Generator()
Definition generator.h:106
constexpr auto default_sentinel
Definition default_sentinel.h:6
constexpr auto value
Definition value.h:34
constexpr auto exchange(T &object, U &&new_value) -> T
Definition exchange.h:8
constexpr struct di::util::SwapFunction swap
void unreachable()
Definition unreachable.h:4
Definition any_storable.h:9
constexpr auto exchange(T &object, U &&new_value) -> T
Definition exchange.h:8
std::coroutine_handle< Promise > CoroutineHandle
Definition coroutine.h:164
constexpr auto in_place
Definition in_place.h:8
std::suspend_always SuspendAlways
Definition coroutine.h:169