13 #ifndef __PROCESS_DEFER_HPP__
14 #define __PROCESS_DEFER_HPP__
63 #define FORWARD_A(Z, N, DATA) std::forward<A ## N>(a ## N)
66 #define FORWARD_P(Z, N, DATA) std::forward<P ## N>(p ## N)
68 #define TEMPLATE(Z, N, DATA) \
69 template <typename T, \
70 ENUM_PARAMS(N, typename P), \
71 ENUM_PARAMS(N, typename A)> \
72 auto defer(const PID<T>& pid, \
73 void (T::*method)(ENUM_PARAMS(N, P)), \
74 ENUM_BINARY_PARAMS(N, A, &&a)) \
75 -> _Deferred<decltype( \
77 &std::function<void(ENUM_PARAMS(N, P))>::operator(), \
78 std::function<void(ENUM_PARAMS(N, P))>(), \
79 ENUM(N, FORWARD_A, _)))> \
81 std::function<void(ENUM_PARAMS(N, P))> f( \
82 [=](ENUM_BINARY_PARAMS(N, P, &&p)) { \
83 dispatch(pid, method, ENUM(N, FORWARD_P, _)); \
85 return lambda::partial( \
86 &std::function<void(ENUM_PARAMS(N, P))>::operator(), \
88 ENUM(N, FORWARD_A, _)); \
91 template <typename T, \
92 ENUM_PARAMS(N, typename P), \
93 ENUM_PARAMS(N, typename A)> \
94 auto defer(const Process<T>& process, \
95 void (T::*method)(ENUM_PARAMS(N, P)), \
96 ENUM_BINARY_PARAMS(N, A, &&a)) \
97 -> decltype(defer(process.self(), method, ENUM(N, FORWARD_A, _))) \
99 return defer(process.self(), method, ENUM(N, FORWARD_A, _)); \
102 template <typename T, \
103 ENUM_PARAMS(N, typename P), \
104 ENUM_PARAMS(N, typename A)> \
105 auto defer(const Process<T>* process, \
106 void (T::*method)(ENUM_PARAMS(N, P)), \
107 ENUM_BINARY_PARAMS(N, A, &&a)) \
108 -> decltype(defer(process->self(), method, ENUM(N, FORWARD_A, _))) \
110 return defer(process->self(), method, ENUM(N, FORWARD_A, _)); \
119 template <
typename R,
typename T>
125 template <
typename R,
typename T>
131 template <
typename R,
typename T>
137 #define TEMPLATE(Z, N, DATA) \
138 template <typename R, \
140 ENUM_PARAMS(N, typename P), \
141 ENUM_PARAMS(N, typename A)> \
142 auto defer(const PID<T>& pid, \
143 Future<R> (T::*method)(ENUM_PARAMS(N, P)), \
144 ENUM_BINARY_PARAMS(N, A, &&a)) \
145 -> _Deferred<decltype( \
147 &std::function<Future<R>(ENUM_PARAMS(N, P))>::operator(), \
148 std::function<Future<R>(ENUM_PARAMS(N, P))>(), \
149 ENUM(N, FORWARD_A, _)))> \
151 std::function<Future<R>(ENUM_PARAMS(N, P))> f( \
152 [=](ENUM_BINARY_PARAMS(N, P, &&p)) { \
153 return dispatch(pid, method, ENUM(N, FORWARD_P, _)); \
155 return lambda::partial( \
156 &std::function<Future<R>(ENUM_PARAMS(N, P))>::operator(), \
158 ENUM(N, FORWARD_A, _)); \
161 template <typename R, \
163 ENUM_PARAMS(N, typename P), \
164 ENUM_PARAMS(N, typename A)> \
165 auto defer(const Process<T>& process, \
166 Future<R> (T::*method)(ENUM_PARAMS(N, P)), \
167 ENUM_BINARY_PARAMS(N, A, &&a)) \
168 -> decltype(defer(process.self(), method, ENUM(N, FORWARD_A, _))) \
170 return defer(process.self(), method, ENUM(N, FORWARD_A, _)); \
173 template <typename R, \
175 ENUM_PARAMS(N, typename P), \
176 ENUM_PARAMS(N, typename A)> \
177 auto defer(const Process<T>* process, \
178 Future<R> (T::*method)(ENUM_PARAMS(N, P)), \
179 ENUM_BINARY_PARAMS(N, A, &&a)) \
180 -> decltype(defer(process->self(), method, ENUM(N, FORWARD_A, _))) \
182 return defer(process->self(), method, ENUM(N, FORWARD_A, _)); \
191 template <
typename R,
typename T>
197 template <
typename R,
typename T>
203 template <
typename R,
typename T>
209 #define TEMPLATE(Z, N, DATA) \
210 template <typename R, \
212 ENUM_PARAMS(N, typename P), \
213 ENUM_PARAMS(N, typename A)> \
214 auto defer(const PID<T>& pid, \
215 R (T::*method)(ENUM_PARAMS(N, P)), \
216 ENUM_BINARY_PARAMS(N, A, &&a)) \
217 -> _Deferred<decltype( \
219 &std::function<Future<R>(ENUM_PARAMS(N, P))>::operator(), \
220 std::function<Future<R>(ENUM_PARAMS(N, P))>(), \
221 ENUM(N, FORWARD_A, _)))> \
223 std::function<Future<R>(ENUM_PARAMS(N, P))> f( \
224 [=](ENUM_BINARY_PARAMS(N, P, &&p)) { \
225 return dispatch(pid, method, ENUM(N, FORWARD_P, _)); \
227 return lambda::partial( \
228 &std::function<Future<R>(ENUM_PARAMS(N, P))>::operator(), \
230 ENUM(N, FORWARD_A, _)); \
233 template <typename R, \
235 ENUM_PARAMS(N, typename P), \
236 ENUM_PARAMS(N, typename A)> \
238 defer(const Process<T>& process, \
239 R (T::*method)(ENUM_PARAMS(N, P)), \
240 ENUM_BINARY_PARAMS(N, A, &&a)) \
241 -> decltype(defer(process.self(), method, ENUM(N, FORWARD_A, _))) \
243 return defer(process.self(), method, ENUM(N, FORWARD_A, _)); \
246 template <typename R, \
248 ENUM_PARAMS(N, typename P), \
249 ENUM_PARAMS(N, typename A)> \
251 defer(const Process<T>* process, \
252 R (T::*method)(ENUM_PARAMS(N, P)), \
253 ENUM_BINARY_PARAMS(N, A, &&a)) \
254 -> decltype(defer(process->self(), method, ENUM(N, FORWARD_A, _))) \
256 return defer(process->self(), method, ENUM(N, FORWARD_A, _)); \
268 template <
typename F>
269 _Deferred<F>
defer(
const UPID& pid, F&&
f)
275 template <
typename F>
287 #endif // __PROCESS_DEFER_HPP__
F && f
Definition: defer.hpp:270
REPEAT_FROM_TO(1, 13, TEMPLATE, _) class AsyncExecutorProcess
Definition: async.hpp:63
Definition: deferred.hpp:29
void dispatch(const PID< T > &pid, void(T::*method)())
Definition: dispatch.hpp:174
thread_local ProcessBase * __process__
Definition: deferred.hpp:64
Result< Process > process(pid_t pid)
Definition: freebsd.hpp:30
A "process identifier" used to uniquely identify a process when dispatching messages.
Definition: pid.hpp:279
#define TEMPLATE(Z, N, DATA)
Definition: async.hpp:255
PID< T > self() const
Returns the PID of the process.
Definition: process.hpp:502
#define __executor__
Definition: executor.hpp:108
Definition: process.hpp:493
Deferred< void()> defer(const PID< T > &pid, void(T::*method)())
Definition: defer.hpp:35
const UPID & self() const
Definition: process.hpp:79