@@ -33,47 +33,61 @@ template <typename... SPSArgTs> struct WFSPSHelper {
33
33
return std::move (R);
34
34
}
35
35
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
+ };
39
41
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
+ };
43
47
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
+ };
48
65
49
66
template <typename ... Ts> struct DeserializableTuple ;
50
67
51
68
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;
55
70
};
56
71
57
72
template <typename ... Ts>
58
73
using DeserializableTuple_t = typename DeserializableTuple<Ts...>::type;
59
74
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)))...);
71
85
}
72
86
73
87
public:
74
88
template <typename ... ArgTs>
75
89
std::optional<WrapperFunctionBuffer> serialize (ArgTs &&...Args) {
76
- return serializeImpl (toSerializable (std::forward<ArgTs>(Args))...);
90
+ return serializeImpl (Serializable<ArgTs>:: to (std::forward<ArgTs>(Args))...);
77
91
}
78
92
79
93
template <typename ArgTuple>
@@ -85,12 +99,8 @@ template <typename... SPSArgTs> struct WFSPSHelper {
85
99
if (!SPSSerializationTraits<SPSTuple<SPSArgTs...>,
86
100
decltype (Args)>::deserialize (IB, Args))
87
101
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>>());
94
104
}
95
105
};
96
106
0 commit comments