@@ -33,47 +33,61 @@ template <typename... SPSArgTs> struct WFSPSHelper {
3333 return std::move (R);
3434 }
3535
36- template <typename T> static const T &toSerializable (const T &Arg) noexcept {
37- return Arg;
38- }
36+ template <typename T> struct Serializable {
37+ typedef std::decay_t <T> serializable_type;
38+ static const T &to (const T &Arg) noexcept { return Arg; }
39+ static T &&from(T &&Arg) noexcept { return std::forward<T>(Arg); }
40+ };
3941
40- static SPSSerializableError toSerializable (Error Err) {
41- return SPSSerializableError (std::move (Err));
42- }
42+ template <typename T> struct Serializable <T *> {
43+ typedef ExecutorAddr serializable_type;
44+ static ExecutorAddr to (T *Arg) { return ExecutorAddr::fromPtr (Arg); }
45+ static T *from (ExecutorAddr A) { return A.toPtr <T *>(); }
46+ };
4347
44- template <typename T>
45- static SPSSerializableExpected<T> toSerializable (Expected<T> Arg) {
46- return SPSSerializableExpected<T>(std::move (Arg));
47- }
48+ template <> struct Serializable <Error> {
49+ typedef SPSSerializableError serializable_type;
50+ static SPSSerializableError to (Error Err) {
51+ return SPSSerializableError (std::move (Err));
52+ }
53+ static Error from (SPSSerializableError Err) { return Err.toError (); }
54+ };
55+
56+ template <typename T> struct Serializable <Expected<T>> {
57+ typedef SPSSerializableExpected<T> serializable_type;
58+ static SPSSerializableExpected<T> to (Expected<T> Val) {
59+ return SPSSerializableExpected<T>(std::move (Val));
60+ }
61+ static Expected<T> from (SPSSerializableExpected<T> Val) {
62+ return Val.toExpected ();
63+ }
64+ };
4865
4966 template <typename ... Ts> struct DeserializableTuple ;
5067
5168 template <typename ... Ts> struct DeserializableTuple <std::tuple<Ts...>> {
52- typedef std::tuple<
53- std::decay_t <decltype (toSerializable(std::declval<Ts>()))>...>
54- type;
69+ typedef std::tuple<typename Serializable<Ts>::serializable_type...> type;
5570 };
5671
5772 template <typename ... Ts>
5873 using DeserializableTuple_t = typename DeserializableTuple<Ts...>::type;
5974
60- template <typename T> static T &&fromSerializable(T &&Arg) noexcept {
61- return std::forward<T>(Arg);
62- }
63-
64- static Error fromSerializable (SPSSerializableError Err) {
65- return Err.toError ();
66- }
67-
68- template <typename T>
69- static Expected<T> fromSerializable (SPSSerializableExpected<T> Val) {
70- return Val.toExpected ();
75+ template <typename ArgTuple, typename ... SerializableArgs, std::size_t ... Is>
76+ std::optional<ArgTuple>
77+ applySerializationConversions (std::tuple<SerializableArgs...> &Inputs,
78+ std::index_sequence<Is...>) {
79+ static_assert (sizeof ...(SerializableArgs) ==
80+ std::index_sequence<Is...>::size (),
81+ " Tuple sizes don't match" );
82+ return std::optional<ArgTuple>(
83+ std::in_place, Serializable<std::tuple_element_t <Is, ArgTuple>>::from (
84+ std::move (std::get<Is>(Inputs)))...);
7185 }
7286
7387public:
7488 template <typename ... ArgTs>
7589 std::optional<WrapperFunctionBuffer> serialize (ArgTs &&...Args) {
76- return serializeImpl (toSerializable (std::forward<ArgTs>(Args))...);
90+ return serializeImpl (Serializable<ArgTs>:: to (std::forward<ArgTs>(Args))...);
7791 }
7892
7993 template <typename ArgTuple>
@@ -85,12 +99,8 @@ template <typename... SPSArgTs> struct WFSPSHelper {
8599 if (!SPSSerializationTraits<SPSTuple<SPSArgTs...>,
86100 decltype (Args)>::deserialize (IB, Args))
87101 return std::nullopt ;
88- return std::apply (
89- [](auto &&...A ) {
90- return std::optional<ArgTuple>(std::in_place,
91- std::move (fromSerializable (A))...);
92- },
93- std::move (Args));
102+ return applySerializationConversions<ArgTuple>(
103+ Args, std::make_index_sequence<std::tuple_size_v<ArgTuple>>());
94104 }
95105};
96106
0 commit comments