Bitcoin Core 28.0.0
P2P Digital Currency
Loading...
Searching...
No Matches
common-types.h
Go to the documentation of this file.
1// Copyright (c) 2023 The Bitcoin Core developers
2// Distributed under the MIT software license, see the accompanying
3// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5#ifndef BITCOIN_IPC_CAPNP_COMMON_TYPES_H
6#define BITCOIN_IPC_CAPNP_COMMON_TYPES_H
7
8#include <clientversion.h>
9#include <streams.h>
10#include <univalue.h>
11
12#include <cstddef>
13#include <mp/proxy-types.h>
14#include <type_traits>
15#include <utility>
16
17namespace ipc {
18namespace capnp {
21template <typename T>
23private:
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
29public:
30 static constexpr bool value = decltype(test<T>(nullptr))::value;
31};
32
35template <typename T>
37private:
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
43public:
44 static constexpr bool value = decltype(test<T>(nullptr))::value;
45};
46} // namespace capnp
47} // namespace ipc
48
50namespace mp {
55template <typename LocalType, typename Value, typename Output>
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.
64 std::is_same_v<LocalType, std::remove_cv_t<std::remove_reference_t<LocalType>>>>* enable = nullptr)
65{
66 DataStream stream;
67 value.Serialize(stream);
68 auto result = output.init(stream.size());
69 memcpy(result.begin(), stream.data(), stream.size());
70}
71
76template <typename LocalType, typename Input, typename ReadDest>
77decltype(auto)
78CustomReadField(TypeList<LocalType>, Priority<1>, InvokeContext& invoke_context, Input&& input, ReadDest&& read_dest,
79 std::enable_if_t<ipc::capnp::Unserializable<LocalType>::value>* enable = nullptr)
80{
81 return read_dest.update([&](auto& value) {
82 if (!input.has()) return;
83 auto data = input.get();
84 SpanReader stream({data.begin(), data.end()});
85 value.Unserialize(stream);
86 });
87}
88
89template <typename Value, typename Output>
90void CustomBuildField(TypeList<UniValue>, Priority<1>, InvokeContext& invoke_context, Value&& value, Output&& output)
91{
92 std::string str = value.write();
93 auto result = output.init(str.size());
94 memcpy(result.begin(), str.data(), str.size());
95}
96
97template <typename Input, typename ReadDest>
98decltype(auto) CustomReadField(TypeList<UniValue>, Priority<1>, InvokeContext& invoke_context, Input&& input,
99 ReadDest&& read_dest)
100{
101 return read_dest.update([&](auto& value) {
102 auto data = input.get();
103 value.read(std::string_view{data.begin(), data.size()});
104 });
105}
106} // namespace mp
107
108#endif // BITCOIN_IPC_CAPNP_COMMON_TYPES_H
Double ended buffer combining vector and stream-like interfaces.
Definition streams.h:147
size_type size() const
Definition streams.h:181
value_type * data()
Definition streams.h:188
Minimal stream for reading from an existing byte array by Span.
Definition streams.h:101
If none of the specialized versions above matched, default to calling member function.
Definition serialize.h:747
Definition ipc.h:12
Functions to serialize / deserialize common bitcoin types.
void CustomBuildField(TypeList< LocalType >, Priority< 1 >, InvokeContext &invoke_context, Value &&value, Output &&output, std::enable_if_t< ipc::capnp::Serializable< LocalType >::value &&std::is_same_v< LocalType, std::remove_cv_t< std::remove_reference_t< LocalType > > > > *enable=nullptr)
Overload multiprocess library's CustomBuildField hook to allow any serializable object to be stored i...
decltype(auto) CustomReadField(TypeList< LocalType >, Priority< 1 >, InvokeContext &invoke_context, Input &&input, ReadDest &&read_dest, std::enable_if_t< ipc::capnp::Unserializable< LocalType >::value > *enable=nullptr)
Overload multiprocess library's CustomReadField hook to allow any object with an Unserialize method t...
void Serialize(Stream &, V)=delete
void Unserialize(Stream &, V)=delete
Use SFINAE to define Serializeable<T> trait which is true if type T has a Serialize(stream) method,...
static std::true_type test(decltype(std::declval< C >().Serialize(std::declval< std::nullptr_t & >())) *)
static std::false_type test(...)
static constexpr bool value
Use SFINAE to define Unserializeable<T> trait which is true if type T has an Unserialize(stream) meth...
static std::false_type test(...)
static constexpr bool value
static std::true_type test(decltype(std::declval< C >().Unserialize(std::declval< std::nullptr_t & >())) *)