6
6
#define BITCOIN_IPC_CAPNP_COMMON_TYPES_H
7
7
8
8
#include < clientversion.h>
9
+ #include < serialize.h>
9
10
#include < streams.h>
10
11
#include < univalue.h>
11
12
16
17
17
18
namespace ipc {
18
19
namespace capnp {
19
- // ! Use SFINAE to define Serializeable<T> trait which is true if type T has a
20
- // ! Serialize(stream) method, false otherwise.
21
- template <typename T>
22
- struct Serializable {
23
- private:
24
- template <typename C>
25
- static std::true_type test (decltype (std::declval<C>().Serialize(std::declval<std::nullptr_t &>()))*);
26
- template <typename >
27
- static std::false_type test (...);
28
-
29
- public:
30
- static constexpr bool value = decltype (test<T>(nullptr ))::value;
31
- };
32
-
33
- // ! Use SFINAE to define Unserializeable<T> trait which is true if type T has
34
- // ! an Unserialize(stream) method, false otherwise.
35
- template <typename T>
36
- struct Unserializable {
37
- private:
38
- template <typename C>
39
- static std::true_type test (decltype (std::declval<C>().Unserialize(std::declval<std::nullptr_t &>()))*);
40
- template <typename >
41
- static std::false_type test (...);
42
-
43
- public:
44
- static constexpr bool value = decltype (test<T>(nullptr ))::value;
45
- };
46
20
} // namespace capnp
47
21
} // namespace ipc
48
22
49
23
// ! Functions to serialize / deserialize common bitcoin types.
50
24
namespace mp {
51
25
// ! Overload multiprocess library's CustomBuildField hook to allow any
52
26
// ! serializable object to be stored in a capnproto Data field or passed to a
53
- // ! canproto interface. Use Priority<1> so this hook has medium priority, and
27
+ // ! capnproto interface. Use Priority<1> so this hook has medium priority, and
54
28
// ! higher priority hooks could take precedence over this one.
55
29
template <typename LocalType, typename Value, typename Output>
56
- void CustomBuildField (
57
- TypeList<LocalType>, Priority<1 >, InvokeContext& invoke_context, Value&& value, Output&& output,
58
- // Enable if serializeable and if LocalType is not cv or reference
59
- // qualified. If LocalType is cv or reference qualified, it is important to
60
- // fall back to lower-priority Priority<0> implementation of this function
61
- // that strips cv references, to prevent this CustomBuildField overload from
62
- // taking precedence over more narrow overloads for specific LocalTypes.
63
- std::enable_if_t <ipc::capnp::Serializable<LocalType>::value &&
64
- std::is_same_v<LocalType, std::remove_cv_t <std::remove_reference_t <LocalType>>>>* enable = nullptr )
30
+ void CustomBuildField (TypeList<LocalType>, Priority<1 >, InvokeContext& invoke_context, Value&& value, Output&& output)
31
+ // Enable if serializeable and if LocalType is not cv or reference qualified. If
32
+ // LocalType is cv or reference qualified, it is important to fall back to
33
+ // lower-priority Priority<0> implementation of this function that strips cv
34
+ // references, to prevent this CustomBuildField overload from taking precedence
35
+ // over more narrow overloads for specific LocalTypes.
36
+ requires Serializable<LocalType, DataStream> && std::is_same_v<LocalType, std::remove_cv_t<std::remove_reference_t<LocalType>>>
65
37
{
66
38
DataStream stream;
67
39
value.Serialize (stream);
@@ -71,12 +43,11 @@ void CustomBuildField(
71
43
72
44
// ! Overload multiprocess library's CustomReadField hook to allow any object
73
45
// ! with an Unserialize method to be read from a capnproto Data field or
74
- // ! returned from canproto interface. Use Priority<1> so this hook has medium
46
+ // ! returned from capnproto interface. Use Priority<1> so this hook has medium
75
47
// ! priority, and higher priority hooks could take precedence over this one.
76
48
template <typename LocalType, typename Input, typename ReadDest>
77
- decltype (auto )
78
- CustomReadField (TypeList<LocalType>, Priority<1 >, InvokeContext& invoke_context, Input&& input, ReadDest&& read_dest,
79
- std::enable_if_t <ipc::capnp::Unserializable<LocalType>::value>* enable = nullptr )
49
+ decltype (auto ) CustomReadField(TypeList<LocalType>, Priority<1 >, InvokeContext& invoke_context, Input&& input, ReadDest&& read_dest)
50
+ requires Unserializable<LocalType, DataStream>
80
51
{
81
52
return read_dest.update ([&](auto & value) {
82
53
if (!input.has ()) return ;
@@ -86,6 +57,8 @@ CustomReadField(TypeList<LocalType>, Priority<1>, InvokeContext& invoke_context,
86
57
});
87
58
}
88
59
60
+ // ! Overload CustomBuildField and CustomReadField to serialize UniValue
61
+ // ! parameters and return values as JSON strings.
89
62
template <typename Value, typename Output>
90
63
void CustomBuildField (TypeList<UniValue>, Priority<1 >, InvokeContext& invoke_context, Value&& value, Output&& output)
91
64
{
0 commit comments