1414#define ORC_RT_WRAPPERFUNCTION_H
1515
1616#include " orc-rt-c/WrapperFunction.h"
17+ #include " orc-rt/CallableTraitsHelper.h"
1718#include " orc-rt/Error.h"
1819#include " orc-rt/bind.h"
1920
@@ -105,37 +106,16 @@ class WrapperFunctionBuffer {
105106
106107namespace detail {
107108
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;
116115};
117116
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>;
139119
140120template <typename Serializer> class StructuredYieldBase {
141121public:
@@ -151,8 +131,11 @@ template <typename Serializer> class StructuredYieldBase {
151131 std::decay_t <Serializer> S;
152132};
153133
134+ template <typename RetT, typename Serializer> class StructuredYield ;
135+
154136template <typename RetT, typename Serializer>
155- class StructuredYield : public StructuredYieldBase <Serializer> {
137+ class StructuredYield <std::tuple<RetT>, Serializer>
138+ : public StructuredYieldBase<Serializer> {
156139public:
157140 using StructuredYieldBase<Serializer>::StructuredYieldBase;
158141 void operator ()(RetT &&R) {
@@ -167,7 +150,7 @@ class StructuredYield : public StructuredYieldBase<Serializer> {
167150};
168151
169152template <typename Serializer>
170- class StructuredYield <void , Serializer>
153+ class StructuredYield <std::tuple<> , Serializer>
171154 : public StructuredYieldBase<Serializer> {
172155public:
173156 using StructuredYieldBase<Serializer>::StructuredYieldBase;
@@ -180,7 +163,7 @@ class StructuredYield<void, Serializer>
180163template <typename T, typename Serializer> struct ResultDeserializer ;
181164
182165template <typename T, typename Serializer>
183- struct ResultDeserializer <Expected<T>, Serializer> {
166+ struct ResultDeserializer <std::tuple< Expected<T> >, Serializer> {
184167 static Expected<T> deserialize (WrapperFunctionBuffer ResultBytes,
185168 Serializer &S) {
186169 T Val;
@@ -191,7 +174,8 @@ struct ResultDeserializer<Expected<T>, Serializer> {
191174 }
192175};
193176
194- template <typename Serializer> struct ResultDeserializer <Error, Serializer> {
177+ template <typename Serializer>
178+ struct ResultDeserializer <std::tuple<Error>, Serializer> {
195179 static Error deserialize (WrapperFunctionBuffer ResultBytes, Serializer &S) {
196180 assert (ResultBytes.empty ());
197181 return Error::success ();
@@ -213,11 +197,13 @@ struct WrapperFunction {
213197 typename ... ArgTs>
214198 static void call (Caller &&C, Serializer &&S, ResultHandler &&RH,
215199 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" );
217203 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 ;
221207
222208 if (auto ArgBytes = S.argumentSerializer ()(std::forward<ArgTs>(Args)...)) {
223209 C (
@@ -227,9 +213,8 @@ struct WrapperFunction {
227213 if (const char *ErrMsg = ResultBytes.getOutOfBandError ())
228214 RH (make_error<StringError>(ErrMsg));
229215 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));
233218 },
234219 std::move (*ArgBytes));
235220 } else
@@ -246,10 +231,12 @@ struct WrapperFunction {
246231 orc_rt_WrapperFunctionReturn Return,
247232 WrapperFunctionBuffer ArgBytes, Serializer &&S,
248233 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;
253240
254241 if (ArgBytes.getOutOfBandError ())
255242 return Return (Session, CallCtx, ArgBytes.release ());
@@ -258,7 +245,7 @@ struct WrapperFunction {
258245 if (std::apply (bind_front (S.argumentDeserializer (), std::move (ArgBytes)),
259246 Args))
260247 std::apply (bind_front (std::forward<Handler>(H),
261- detail::StructuredYield<RetType , Serializer>(
248+ detail::StructuredYield<RetTupleType , Serializer>(
262249 Session, CallCtx, Return, std::move (S))),
263250 std::move (Args));
264251 else
0 commit comments