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