1#ifndef MRS_LIB_CORO_EVENT_HPP_
2#define MRS_LIB_CORO_EVENT_HPP_
12#include "mrs_lib/coro/internal/continuation.hpp"
13#include "mrs_lib/coro/internal/immediate_awaitable.hpp"
16namespace mrs_lib::coro
31 std::pair<Event, EventAwaitable> make_event();
36 class EventError : std::logic_error
41 empty_awaitable_state,
44 EventError(Type type);
47 static const char* get_msg(Type type);
58 class EventState :
public std::enable_shared_from_this<EventState>
71 struct StopCallbackCallable
124 Status status_ = Status::unset;
127 std::optional<std::stop_callback<StopCallbackCallable>> stop_callback_{};
135 class LowLevelEventAwaitable
138 class [[nodiscard]] Awaiter
141 explicit Awaiter(std::shared_ptr<internal::EventState> state,
bool token_cancellable, std::function<
void()> callback);
144 template <
typename T>
145 bool await_suspend(std::coroutine_handle<T> handle)
153 std::shared_ptr<internal::EventState> state_;
154 bool is_token_cancellable_ =
true;
155 std::function<void()> callback_;
158 enum class StopTokenBehavior
193 explicit LowLevelEventAwaitable(std::shared_ptr<internal::EventState> state);
195 std::shared_ptr<internal::EventState> state_;
197 friend std::pair<Event, EventAwaitable> mrs_lib::coro::make_event();
221 Event(
const Event&) =
delete;
222 Event& operator=(
const Event&) =
delete;
224 Event(Event&& other)
noexcept;
225 Event& operator=(Event&& other)
noexcept;
244 explicit Event(std::shared_ptr<internal::EventState> state);
246 std::shared_ptr<internal::EventState> state_;
248 friend std::pair<Event, EventAwaitable>
make_event();
Event awaitable that can be awaited by coroutines, resuming them once triggered.
Definition event.hpp:261
EventAwaitable(internal::LowLevelEventAwaitable internal_awaitable)
Create EventAwaitable from a low level awaitable.
Definition event.cpp:245
auto wait() &&-> internal::ImmediateAwaitable< internal::LowLevelEventAwaitable::Awaiter >
Wait for the event to trigger / cancel.
Definition event.cpp:249
Event that can be used to trigger coroutines.
Definition event.hpp:217
bool try_trigger()
Try triggering the event.
Definition event.cpp:219
friend std::pair< Event, EventAwaitable > make_event()
Create Event and its bound awaitable.
Definition event.cpp:17
bool try_cancel()
Try cancelling the event.
Definition event.cpp:229
Owning coroutine handle supporting cancellation.
Definition continuation.hpp:54
Internal class for handling events.
Definition event.hpp:59
bool try_cancel()
Try cancelling the event state.
Definition event.cpp:73
bool try_trigger()
Try triggering the event state.
Definition event.cpp:50
bool is_ready()
Check if the event was already triggered.
Definition event.cpp:136
bool add_continuation(CancellableContinuation continuation, bool token_cancelable, std::function< void()> callback)
Store or resume the continuation as target for this event.
Definition event.cpp:93
Internal awaitable used to wait for events.
Definition event.hpp:136
ImmediateAwaitable< Awaiter > get_awaitable() &&
Create awaitable for this event with default configuration.
ImmediateAwaitable< Awaiter > get_awaitable(StopTokenBehavior stop_token_behavior, std::function< void()> callback) &&
Create awaitable for this event.