31concept HandleLike =
requires(T handle, Invoker *invoker,
Runtime *runtime) {
32 typename std::decay_t<T>::ReturnType;
33 { handle.set_invoker(invoker) } -> std::same_as<void>;
35 handle.extract_result()
36 } -> std::same_as<typename std::decay_t<T>::ReturnType>;
37 { handle.cancel(runtime) } -> std::same_as<void>;
41concept OpFinishHandleLike =
42 HandleLike<T> &&
requires(T handle, io_uring_cqe *cqe) {
43 { handle.handle(cqe) } -> std::same_as<bool>;
47concept PrepFuncLike =
requires(T prep_func, Ring *ring) {
48 { prep_func(ring) } -> std::same_as<io_uring_sqe *>;
52concept CQEHandlerLike =
requires(T handler, io_uring_cqe *cqe) {
53 typename std::decay_t<T>::ReturnType;
54 { handler.handle_cqe(cqe) }
noexcept -> std::same_as<void>;
56 handler.extract_result()
57 }
noexcept -> std::same_as<typename std::decay_t<T>::ReturnType>;
61concept AwaiterLike =
requires(T awaiter) {
62 typename std::decay_t<T>::HandleType;
65 } -> std::same_as<typename std::decay_t<T>::HandleType *>;
66 { awaiter.init_finish_handle() } -> std::same_as<void>;
67 { awaiter.register_operation(0) } -> std::same_as<void>;
68 { awaiter.await_ready() }
noexcept -> std::same_as<bool>;
69 { awaiter.await_suspend(std::declval<std::coroutine_handle<>>()) }
noexcept;
71 awaiter.await_resume()
72 } -> std::same_as<typename std::decay_t<T>::HandleType::ReturnType>;
77 std::ranges::range<T> && AwaiterLike<std::ranges::range_value_t<T>>;
80concept BufferRingLike =
requires(T br, io_uring_cqe *cqe) {
81 typename std::decay_t<T>::ReturnType;
82 { br.bgid() } -> std::same_as<uint16_t>;
85 } -> std::same_as<typename std::decay_t<T>::ReturnType>;
89concept BufferLike = std::derived_from<std::decay_t<T>, BufferBase>;
92concept FdLike = std::same_as<std::decay_t<T>,
int> ||
93 std::same_as<std::decay_t<T>, detail::FixedFd>;
95template <
typename T,
typename... Us>
96concept AnySameAs = (std::same_as<T, Us> || ...);
The event loop runtime for executing asynchronous.
The main namespace for the Condy library.