14
14
#define ORC_RT_WRAPPERFUNCTION_H
15
15
16
16
#include " orc-rt-c/WrapperFunction.h"
17
+ #include " orc-rt/CallableTraitsHelper.h"
17
18
#include " orc-rt/Error.h"
18
19
#include " orc-rt/bind.h"
19
20
@@ -105,37 +106,16 @@ class WrapperFunctionBuffer {
105
106
106
107
namespace detail {
107
108
108
- template <typename C>
109
- struct WFCallableTraits
110
- : public WFCallableTraits<
111
- decltype (&std::remove_cv_t <std::remove_reference_t <C>>::operator ())> {
112
- };
113
-
114
- template <typename RetT> struct WFCallableTraits <RetT()> {
115
- typedef void HeadArgType;
109
+ template <typename RetT, typename ReturnT, typename ... ArgTs>
110
+ struct WFHandlerTraitsImpl {
111
+ static_assert (std::is_void_v<RetT>,
112
+ " Async wrapper function handler must return void" );
113
+ typedef ReturnT YieldType;
114
+ typedef std::tuple<ArgTs...> ArgTupleType;
116
115
};
117
116
118
- template <typename RetT, typename ArgT, typename ... ArgTs>
119
- struct WFCallableTraits <RetT(ArgT, ArgTs...)> {
120
- typedef ArgT HeadArgType;
121
- typedef std::tuple<ArgTs...> TailArgTuple;
122
- };
123
-
124
- template <typename RetT, typename ... ArgTs>
125
- struct WFCallableTraits <RetT (*)(ArgTs...)>
126
- : public WFCallableTraits<RetT(ArgTs...)> {};
127
-
128
- template <typename RetT, typename ... ArgTs>
129
- struct WFCallableTraits <RetT (&)(ArgTs...)>
130
- : public WFCallableTraits<RetT(ArgTs...)> {};
131
-
132
- template <typename ClassT, typename RetT, typename ... ArgTs>
133
- struct WFCallableTraits <RetT (ClassT::*)(ArgTs...)>
134
- : public WFCallableTraits<RetT(ArgTs...)> {};
135
-
136
- template <typename ClassT, typename RetT, typename ... ArgTs>
137
- struct WFCallableTraits <RetT (ClassT::*)(ArgTs...) const >
138
- : public WFCallableTraits<RetT(ArgTs...)> {};
117
+ template <typename C>
118
+ using WFHandlerTraits = CallableTraitsHelper<WFHandlerTraitsImpl, C>;
139
119
140
120
template <typename Serializer> class StructuredYieldBase {
141
121
public:
@@ -151,8 +131,11 @@ template <typename Serializer> class StructuredYieldBase {
151
131
std::decay_t <Serializer> S;
152
132
};
153
133
134
+ template <typename RetT, typename Serializer> class StructuredYield ;
135
+
154
136
template <typename RetT, typename Serializer>
155
- class StructuredYield : public StructuredYieldBase <Serializer> {
137
+ class StructuredYield <std::tuple<RetT>, Serializer>
138
+ : public StructuredYieldBase<Serializer> {
156
139
public:
157
140
using StructuredYieldBase<Serializer>::StructuredYieldBase;
158
141
void operator ()(RetT &&R) {
@@ -167,7 +150,7 @@ class StructuredYield : public StructuredYieldBase<Serializer> {
167
150
};
168
151
169
152
template <typename Serializer>
170
- class StructuredYield <void , Serializer>
153
+ class StructuredYield <std::tuple<> , Serializer>
171
154
: public StructuredYieldBase<Serializer> {
172
155
public:
173
156
using StructuredYieldBase<Serializer>::StructuredYieldBase;
@@ -180,7 +163,7 @@ class StructuredYield<void, Serializer>
180
163
template <typename T, typename Serializer> struct ResultDeserializer ;
181
164
182
165
template <typename T, typename Serializer>
183
- struct ResultDeserializer <Expected<T>, Serializer> {
166
+ struct ResultDeserializer <std::tuple< Expected<T> >, Serializer> {
184
167
static Expected<T> deserialize (WrapperFunctionBuffer ResultBytes,
185
168
Serializer &S) {
186
169
T Val;
@@ -191,7 +174,8 @@ struct ResultDeserializer<Expected<T>, Serializer> {
191
174
}
192
175
};
193
176
194
- template <typename Serializer> struct ResultDeserializer <Error, Serializer> {
177
+ template <typename Serializer>
178
+ struct ResultDeserializer <std::tuple<Error>, Serializer> {
195
179
static Error deserialize (WrapperFunctionBuffer ResultBytes, Serializer &S) {
196
180
assert (ResultBytes.empty ());
197
181
return Error::success ();
@@ -213,11 +197,13 @@ struct WrapperFunction {
213
197
typename ... ArgTs>
214
198
static void call (Caller &&C, Serializer &&S, ResultHandler &&RH,
215
199
ArgTs &&...Args) {
216
- typedef detail::WFCallableTraits<ResultHandler> ResultHandlerTraits;
200
+ typedef CallableArgInfo<ResultHandler> ResultHandlerTraits;
201
+ static_assert (std::is_void_v<typename ResultHandlerTraits::return_type>,
202
+ " Result handler should return void" );
217
203
static_assert (
218
- std::tuple_size_v<typename ResultHandlerTraits::TailArgTuple > == 0 ,
219
- " Expected one argument to result-handler " );
220
- typedef typename ResultHandlerTraits::HeadArgType ResultType ;
204
+ std::tuple_size_v<typename ResultHandlerTraits::args_tuple_type > == 1 ,
205
+ " Result-handler should have exactly one argument " );
206
+ typedef typename ResultHandlerTraits::args_tuple_type ResultTupleType ;
221
207
222
208
if (auto ArgBytes = S.argumentSerializer ()(std::forward<ArgTs>(Args)...)) {
223
209
C (
@@ -227,9 +213,8 @@ struct WrapperFunction {
227
213
if (const char *ErrMsg = ResultBytes.getOutOfBandError ())
228
214
RH (make_error<StringError>(ErrMsg));
229
215
else
230
- RH (detail::ResultDeserializer<
231
- ResultType, Serializer>::deserialize (std::move (ResultBytes),
232
- S));
216
+ RH (detail::ResultDeserializer<ResultTupleType, Serializer>::
217
+ deserialize (std::move (ResultBytes), S));
233
218
},
234
219
std::move (*ArgBytes));
235
220
} else
@@ -246,10 +231,12 @@ struct WrapperFunction {
246
231
orc_rt_WrapperFunctionReturn Return,
247
232
WrapperFunctionBuffer ArgBytes, Serializer &&S,
248
233
Handler &&H) {
249
- typedef detail::WFCallableTraits<Handler> HandlerTraits;
250
- typedef typename HandlerTraits::HeadArgType Yield;
251
- typedef typename HandlerTraits::TailArgTuple ArgTuple;
252
- typedef typename detail::WFCallableTraits<Yield>::HeadArgType RetType;
234
+ typedef detail::WFHandlerTraits<Handler> HandlerTraits;
235
+ typedef typename HandlerTraits::ArgTupleType ArgTuple;
236
+ typedef typename HandlerTraits::YieldType Yield;
237
+ static_assert (std::is_void_v<typename CallableArgInfo<Yield>::return_type>,
238
+ " Return callback must return void" );
239
+ typedef typename CallableArgInfo<Yield>::args_tuple_type RetTupleType;
253
240
254
241
if (ArgBytes.getOutOfBandError ())
255
242
return Return (Session, CallCtx, ArgBytes.release ());
@@ -258,7 +245,7 @@ struct WrapperFunction {
258
245
if (std::apply (bind_front (S.argumentDeserializer (), std::move (ArgBytes)),
259
246
Args))
260
247
std::apply (bind_front (std::forward<Handler>(H),
261
- detail::StructuredYield<RetType , Serializer>(
248
+ detail::StructuredYield<RetTupleType , Serializer>(
262
249
Session, CallCtx, Return, std::move (S))),
263
250
std::move (Args));
264
251
else
0 commit comments