20template <
typename T =
void>
29 requires (std::is_convertible_v<U, T>)
31 _value = std::forward<U>(value);
32 _ready.store(
true, std::memory_order_release);
33 auto h = _waiter.exchange(
nullptr, std::memory_order_acq_rel);
41 _ready.store(
false, std::memory_order_release);
42 _waiter.store(
nullptr, std::memory_order_release);
46 [[nodiscard]]
bool isReady() const noexcept {
47 return _ready.load(std::memory_order_acquire);
54 return event.isReady();
61 event._waiter.store(h, std::memory_order_release);
62 return !
event.isReady();
66 event._ready.store(
false, std::memory_order_release);
67 return std::move(
event._value);
77 [[nodiscard]]
Awaiter operator co_await()
noexcept {
82 std::atomic<std::coroutine_handle<>> _waiter{
nullptr};
84 std::atomic<bool> _ready{
false};
97 _ready.store(
true, std::memory_order_release);
98 auto h = _waiter.exchange(
nullptr, std::memory_order_acq_rel);
106 _ready.store(
false, std::memory_order_release);
107 _waiter.store(
nullptr, std::memory_order_release);
112 return _ready.load(std::memory_order_acquire);
119 return event.isReady();
126 event._waiter.store(h, std::memory_order_release);
127 return !
event.isReady();
134 [[nodiscard]] Awaiter
wait() noexcept {
135 return Awaiter{*
this};
139 [[nodiscard]] Awaiter
operator co_await()
noexcept {
140 return Awaiter{*
this};
144 std::atomic<std::coroutine_handle<>> _waiter{
nullptr};
145 std::atomic<bool> _ready{
false};
bool isReady() const noexcept
Check if event has been signaled.
Definition AsyncEvent.hpp:111
void reset() noexcept
Reset event to unsignaled state.
Definition AsyncEvent.hpp:105
Awaiter wait() noexcept
Awaiter factory for co_await syntax.
Definition AsyncEvent.hpp:134
void emit() noexcept
Signal the event and resume waiting coroutine.
Definition AsyncEvent.hpp:96
constexpr AsyncEvent()=default
void ValueType
Definition AsyncEvent.hpp:91
Lock-free single-waiter asynchronous event channel for C++20 coroutines. Enables event-driven corouti...
Definition AsyncEvent.hpp:21
Awaiter wait() noexcept
Awaiter factory for co_await syntax.
Definition AsyncEvent.hpp:72
bool isReady() const noexcept
Check if event has been signaled.
Definition AsyncEvent.hpp:46
T ValueType
Definition AsyncEvent.hpp:23
void reset() noexcept
Reset event to unsignaled state.
Definition AsyncEvent.hpp:40
void emit(U &&value)
Emit event value and resume waiting coroutine.
Definition AsyncEvent.hpp:30
constexpr AsyncEvent()=default
Definition AsyncEvent.hpp:14
Definition AsyncEvent.hpp:50
bool await_suspend(std::coroutine_handle<> h) noexcept
Definition AsyncEvent.hpp:57
bool await_ready() const noexcept
Definition AsyncEvent.hpp:53
T await_resume()
Definition AsyncEvent.hpp:65
AsyncEvent & event
Definition AsyncEvent.hpp:51
bool await_ready() const noexcept
Definition AsyncEvent.hpp:118
AsyncEvent< void > & event
Definition AsyncEvent.hpp:116
bool await_suspend(std::coroutine_handle<> h) noexcept
Definition AsyncEvent.hpp:122
constexpr void await_resume() const noexcept
Definition AsyncEvent.hpp:130