Condy v1.6.0
C++ Asynchronous System Call Layer for Linux
Loading...
Searching...
No Matches
concepts.hpp
Go to the documentation of this file.
1
4
5#pragma once
6
7#include <concepts>
8#include <coroutine>
9#include <cstdint>
10#include <ranges>
11#include <type_traits>
12#include <utility>
13
14struct io_uring_cqe;
15struct io_uring_sqe;
16
17namespace condy {
18
19class Ring;
20class Invoker;
21class BufferBase;
22class Runtime;
23
24namespace detail {
25
26struct FixedFd;
27
28} // namespace detail
29
30template <typename T>
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>;
34 {
35 handle.extract_result()
36 } -> std::same_as<typename std::decay_t<T>::ReturnType>;
37 { handle.cancel(runtime) } -> std::same_as<void>;
38};
39
40template <typename T>
41concept OpFinishHandleLike =
42 HandleLike<T> && requires(T handle, io_uring_cqe *cqe) {
43 { handle.handle(cqe) } -> std::same_as<bool>;
44 };
45
46template <typename T>
47concept PrepFuncLike = requires(T prep_func, Ring *ring) {
48 { prep_func(ring) } -> std::same_as<io_uring_sqe *>;
49};
50
51template <typename T>
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>;
55 {
56 handler.extract_result()
57 } noexcept -> std::same_as<typename std::decay_t<T>::ReturnType>;
58};
59
60template <typename T>
61concept AwaiterLike = requires(T awaiter) {
62 typename std::decay_t<T>::HandleType;
63 {
64 awaiter.get_handle()
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;
70 {
71 awaiter.await_resume()
72 } -> std::same_as<typename std::decay_t<T>::HandleType::ReturnType>;
73};
74
75template <typename T>
76concept AwaiterRange =
77 std::ranges::range<T> && AwaiterLike<std::ranges::range_value_t<T>>;
78
79template <typename 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>;
83 {
84 br.handle_finish(cqe)
85 } -> std::same_as<typename std::decay_t<T>::ReturnType>;
86};
87
88template <typename T>
89concept BufferLike = std::derived_from<std::decay_t<T>, BufferBase>;
90
91template <typename T>
92concept FdLike = std::same_as<std::decay_t<T>, int> ||
93 std::same_as<std::decay_t<T>, detail::FixedFd>;
94
95template <typename T, typename... Us>
96concept AnySameAs = (std::same_as<T, Us> || ...);
97
98} // namespace condy
The event loop runtime for executing asynchronous.
Definition runtime.hpp:91
The main namespace for the Condy library.
Definition condy.hpp:30