Iros
 
Loading...
Searching...
No Matches
ipc_protocol.h
Go to the documentation of this file.
1#pragma once
2
8#include "di/meta/algorithm.h"
9#include "di/meta/core.h"
10#include "di/meta/function.h"
11#include "di/meta/language.h"
12#include "di/meta/list.h"
13#include "di/meta/operations.h"
14#include "di/meta/util.h"
16#include "di/util/move.h"
18
19namespace di::concepts {
20template<typename T>
21concept MessageWithReply = requires { typename T::Reply; } && !di::SameAs<T, typename T::Reply>;
22}
23
24namespace di::meta {
25namespace detail {
26 template<typename T>
28 using Type = void;
29 };
30
31 template<concepts::MessageWithReply T>
33 using Type = typename T::Reply;
34 };
35}
36
37template<typename T>
39}
40
41namespace di::execution {
42template<concepts::TypeList ClientMessages, concepts::TypeList ServerMessages>
43struct Protocol {
44 using Client = ClientMessages;
45 using Server = ServerMessages;
46};
47}
48
49namespace di::meta {
50template<typename T>
51requires(requires { typename T::Protocol; })
52using Protocol = typename T::Protocol;
53}
54
55namespace di::concepts {
56template<typename T>
58}
59
60template<typename T>
61constexpr inline bool is_client = requires { typename T::is_client; };
62
63template<typename T>
64constexpr inline bool is_server = requires { typename T::is_server; };
65
66namespace di::meta {
67namespace detail {
69
70 template<concepts::TypeList Messages>
72}
73
74template<concepts::HasProtocol T>
78
79template<concepts::HasProtocol T>
83
84template<concepts::HasProtocol T>
86
87template<concepts::HasProtocol T>
89}
90
91namespace di::concepts {
92template<typename T, typename Message>
94}
95
96namespace di::execution {
97namespace send_ns {
98 struct Function {
99 template<concepts::HasProtocol SendToken, typename Message, typename... Args,
100 typename MessageTypes = meta::MessageTypes<SendToken>>
101 requires(meta::Contains<MessageTypes, Message> && concepts::TagInvocable<Function, SendToken, Message, Args...>)
102 auto operator()(SendToken send_token, Message&& message, Args&&... args) const -> concepts::Sender auto {
103 return tag_invoke(*this, di::move(send_token), di::forward<Message>(message), di::forward<Args>(args)...);
104 }
105 };
106}
107
108constexpr inline auto send = send_ns::Function {};
109
110namespace ipc {
111 template<concepts::AsyncReadable Reader>
112 struct Receiver : NamedArgument<InPlaceTemplate<Receiver>, di::meta::RemoveReference<Reader>> {};
113
114 template<typename Reader>
116
117 template<concepts::AsyncWritable Writer>
118 struct Transmitter : NamedArgument<InPlaceTemplate<Transmitter>, Writer> {};
119
120 template<typename Writer>
122
123 template<concepts::AsyncReadable RW>
126
127 template<typename RW>
129
130 template<concepts::MoveConstructible F>
131 struct Transmit : NamedArgument<InPlaceTemplate<Transmit>, F> {};
132
133 template<typename F>
135
136 template<concepts::MoveConstructible F>
137 struct Receive : NamedArgument<InPlaceTemplate<Receive>, F> {};
138
139 template<typename F>
141
142 template<concepts::Allocator Alloc>
145
146 template<typename Alloc>
148
152}
153}
154
155namespace di {
156namespace ipc = execution::ipc;
157
159using execution::send;
160}
Definition async_write_some.h:36
Definition operations.h:34
Definition ipc_protocol.h:57
Definition core.h:139
Definition ipc_protocol.h:21
Definition ipc_protocol.h:93
Definition sender.h:11
Definition tag_invoke.h:33
Definition list.h:119
constexpr bool is_server
Definition ipc_protocol.h:64
constexpr bool is_client
Definition ipc_protocol.h:61
Definition any_storable.h:9
Definition ipc_protocol.h:110
Transmit(F &&) -> Transmit< F >
Receiver(Reader &&) -> Receiver< Reader >
ReceiverTransmitter(RW &&) -> ReceiverTransmitter< di::meta::RemoveReference< RW > >
Receive(F &&) -> Receive< F >
Transmitter(Writer &&) -> Transmitter< di::meta::RemoveReference< Writer > >
meta::List< InPlaceTemplate< Receiver >, InPlaceTemplate< Transmitter >, InPlaceTemplate< ReceiverTransmitter >, InPlaceTemplate< Transmit >, InPlaceTemplate< Receive >, InPlaceTemplate< Allocator > > BaseNamedArguments
Definition ipc_protocol.h:149
Allocator(Alloc &) -> Allocator< Alloc >
Definition ipc_protocol.h:97
Definition bulk.h:30
constexpr auto send
Definition ipc_protocol.h:108
meta::List< ReadSome > Reader
Definition reader.h:34
meta::List< WriteSome, Flush > Writer
Definition writer.h:59
Definition json_deserializer.h:532
Definition const_sentinel.h:8
Filter< Transform< Messages, meta::Quote< MessageReply > >, Not< SameAs< void > > > MessagesReplies
Definition ipc_protocol.h:71
Definition merge_interfaces.h:6
detail::ConditionalHelper< value, T, U >::Type Conditional
Definition core.h:88
T::Type Type
Definition core.h:26
Concat< typename meta::Protocol< T >::Client, typename meta::Protocol< T >::Server > AllMessageTypesWithoutReplies
Definition ipc_protocol.h:88
Fold< List, meta::List<>, detail::FilterReducer< Pred > > Filter
Definition algorithm.h:152
typename T::Protocol Protocol
Definition ipc_protocol.h:52
Concat< MessageTypesWithoutReplies< T >, detail::MessagesReplies< PeerMessageTypesWithoutReplies< T > > > MessageTypes
Definition ipc_protocol.h:85
Conditional< is_client< T >, typename meta::Protocol< T >::Client, Conditional< is_server< T >, typename meta::Protocol< T >::Server, detail::MustBeClientOrServer > > MessageTypesWithoutReplies
Definition ipc_protocol.h:75
Type< detail::MessageReplyHelper< T > > MessageReply
Definition ipc_protocol.h:38
Type< detail::ConcatHelper< Lists... > > Concat
Definition algorithm.h:80
Conditional< is_client< T >, typename meta::Protocol< T >::Server, Conditional< is_server< T >, typename meta::Protocol< T >::Client, detail::MustBeClientOrServer > > PeerMessageTypesWithoutReplies
Definition ipc_protocol.h:80
Definition zstring_parser.h:9
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
Definition ipc_protocol.h:43
ClientMessages Client
Definition ipc_protocol.h:44
ServerMessages Server
Definition ipc_protocol.h:45
Definition ipc_protocol.h:144
Definition ipc_protocol.h:137
Definition ipc_protocol.h:125
Definition ipc_protocol.h:112
Definition ipc_protocol.h:131
Definition ipc_protocol.h:118
Definition ipc_protocol.h:98
Definition core.h:5
Definition function.h:128
Definition ipc_protocol.h:27
typename T::Reply Type
Definition ipc_protocol.h:33
void Type
Definition ipc_protocol.h:28
Definition ipc_protocol.h:68
Definition in_place_template.h:5