Condy v1.1.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
14namespace detail {
15
16struct FixedFd;
17
18}
19
20template <typename T>
21concept HandleLike = requires(T handle, Invoker *invoker) {
22 typename T::ReturnType;
23 { handle.set_invoker(invoker) } -> std::same_as<void>;
24 { handle.extract_result() } -> std::same_as<typename T::ReturnType>;
25 { handle.cancel() } -> std::same_as<void>;
26};
27
28template <typename T>
29concept OpFinishHandleLike = HandleLike<T> && requires(T handle) {
30 { handle.invoke() } -> std::same_as<void>;
31 { handle.set_result(0, 0) } -> std::same_as<void>;
32};
33
34template <typename T>
35concept AwaiterLike = requires(T awaiter) {
36 typename T::HandleType;
37 { awaiter.get_handle() } -> std::same_as<typename T::HandleType *>;
38 { awaiter.init_finish_handle() } -> std::same_as<void>;
39 { awaiter.register_operation(0) } -> std::same_as<void>;
40 { awaiter.await_ready() } -> std::same_as<bool>;
41 { awaiter.await_suspend(std::declval<std::coroutine_handle<>>()) };
42 {
43 awaiter.await_resume()
44 } -> std::same_as<typename T::HandleType::ReturnType>;
45};
46
47template <typename T>
48concept AwaiterRange =
49 std::ranges::range<T> && AwaiterLike<std::ranges::range_value_t<T>>;
50
51template <typename T>
52concept BufferRingLike = requires(T br) {
53 typename T::ReturnType;
54 { br.bgid() } -> std::same_as<uint16_t>;
55 { br.handle_finish(0, 0) } -> std::same_as<typename T::ReturnType>;
56};
57
58template <typename T>
59concept BundledBufferRing =
60 std::same_as<std::decay_t<T>, BundledProvidedBufferPool> ||
61 std::same_as<std::decay_t<T>, BundledProvidedBufferQueue>;
62
63template <typename T>
64concept NotBundledBufferRing = BufferRingLike<T> && !BundledBufferRing<T>;
65
66template <typename T>
67concept BufferLike = std::derived_from<std::decay_t<T>, BufferBase>;
68
69template <typename T>
70concept FdLike = std::same_as<std::decay_t<T>, int> ||
71 std::same_as<std::decay_t<T>, detail::FixedFd>;
72
73} // 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.