Condy v1.5.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 "condy/buffers.hpp"
9#include "condy/invoker.hpp"
10#include <coroutine>
11
12namespace condy {
13
14class Ring;
15
16namespace detail {
17
18struct FixedFd;
19struct Action;
20class BundledProvidedBufferPool;
21class BundledProvidedBufferQueue;
22
23} // namespace detail
24
25template <typename T>
26concept HandleLike = requires(T handle, Invoker *invoker) {
27 typename std::decay_t<T>::ReturnType;
28 { handle.set_invoker(invoker) } -> std::same_as<void>;
29 {
30 handle.extract_result()
31 } -> std::same_as<typename std::decay_t<T>::ReturnType>;
32 { handle.cancel() } -> std::same_as<void>;
33};
34
35template <typename T>
36concept OpFinishHandleLike =
37 HandleLike<T> && requires(T handle, io_uring_cqe *cqe) {
38 { handle.invoke() } -> std::same_as<void>;
39 { handle.handle_cqe(cqe) } -> std::same_as<detail::Action>;
40 };
41
42template <typename T>
43concept PrepFuncLike = requires(T prep_func, Ring *ring) {
44 { prep_func(ring) } -> std::same_as<io_uring_sqe *>;
45};
46
47template <typename T>
48concept CQEHandlerLike = requires(T handler, io_uring_cqe *cqe) {
49 typename std::decay_t<T>::ReturnType;
50 { handler.handle_cqe(cqe) } -> std::same_as<void>;
51 {
52 handler.extract_result()
53 } -> std::same_as<typename std::decay_t<T>::ReturnType>;
54};
55
56template <typename T>
57concept AwaiterLike = requires(T awaiter) {
58 typename std::decay_t<T>::HandleType;
59 {
60 awaiter.get_handle()
61 } -> std::same_as<typename std::decay_t<T>::HandleType *>;
62 { awaiter.init_finish_handle() } -> std::same_as<void>;
63 { awaiter.register_operation(0) } -> std::same_as<void>;
64 { awaiter.await_ready() } -> std::same_as<bool>;
65 { awaiter.await_suspend(std::declval<std::coroutine_handle<>>()) };
66 {
67 awaiter.await_resume()
68 } -> std::same_as<typename std::decay_t<T>::HandleType::ReturnType>;
69};
70
71template <typename T>
72concept AwaiterRange =
73 std::ranges::range<T> && AwaiterLike<std::ranges::range_value_t<T>>;
74
75template <typename T>
76concept BufferRingLike = requires(T br) {
77 typename std::decay_t<T>::ReturnType;
78 { br.bgid() } -> std::same_as<uint16_t>;
79 {
80 br.handle_finish(0, 0)
81 } -> std::same_as<typename std::decay_t<T>::ReturnType>;
82};
83
84template <typename T>
85concept BundledBufferRing =
86 std::same_as<std::decay_t<T>, detail::BundledProvidedBufferPool> ||
87 std::same_as<std::decay_t<T>, detail::BundledProvidedBufferQueue>;
88
89template <typename T>
90concept NotBundledBufferRing = BufferRingLike<T> && !BundledBufferRing<T>;
91
92template <typename T>
93concept BufferLike = std::derived_from<std::decay_t<T>, BufferBase>;
94
95template <typename T>
96concept FdLike = std::same_as<std::decay_t<T>, int> ||
97 std::same_as<std::decay_t<T>, detail::FixedFd>;
98
99} // namespace condy
Basic buffer types and conversion utilities.
Polymorphic invocation utilities.
The main namespace for the Condy library.
Definition condy.hpp:28