Bitcoin Core
31.1.0
P2P Digital Currency
Toggle main menu visibility
Loading...
Searching...
No Matches
src
ipc
capnp
common-types.h
Go to the documentation of this file.
1
// Copyright (c) 2023-present 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 <
interfaces/types.h
>
10
#include <
primitives/transaction.h
>
11
#include <
serialize.h
>
12
#include <
streams.h
>
13
#include <
univalue.h
>
14
15
#include <cstddef>
16
#include <
mp/proxy-types.h
>
17
#include <
mp/type-chrono.h
>
18
#include <
mp/type-context.h
>
19
#include <
mp/type-data.h
>
20
#include <
mp/type-decay.h
>
21
#include <
mp/type-interface.h
>
22
#include <
mp/type-message.h
>
23
#include <
mp/type-number.h
>
24
#include <
mp/type-optional.h
>
25
#include <
mp/type-pointer.h
>
26
#include <
mp/type-string.h
>
27
#include <
mp/type-struct.h
>
28
#include <
mp/type-threadmap.h
>
29
#include <
mp/type-vector.h
>
30
#include <type_traits>
31
#include <utility>
32
33
namespace
ipc
{
34
namespace
capnp
{
42
template
<
typename
S>
43
auto
Wrap
(
S
& s)
44
{
45
return
ParamsStream
{s,
TX_WITH_WITNESS
};
46
}
47
51
template
<
typename
T>
52
concept
Deserializable
= std::is_constructible_v<T, ::deserialize_type, ::DataStream&>;
53
}
// namespace capnp
54
}
// namespace ipc
55
57
namespace
mp
{
62
template
<
typename
LocalType,
typename
Value,
typename
Output>
63
void
CustomBuildField
(
TypeList<LocalType>
,
Priority<1>
,
InvokeContext
& invoke_context, Value&& value, Output&& output)
64
// Enable if serializeable and if LocalType is not cv or reference qualified. If
65
// LocalType is cv or reference qualified, it is important to fall back to
66
// lower-priority Priority<0> implementation of this function that strips cv
67
// references, to prevent this CustomBuildField overload from taking precedence
68
// over more narrow overloads for specific LocalTypes.
69
requires
Serializable<LocalType, DataStream>
&& std::is_same_v<LocalType, std::remove_cv_t<std::remove_reference_t<LocalType>>>
70
{
71
DataStream
stream;
72
auto
wrapper{
ipc::capnp::Wrap
(stream)};
73
value.Serialize(wrapper);
74
auto
result = output.init(stream.
size
());
75
memcpy(result.begin(), stream.
data
(), stream.
size
());
76
}
77
82
template
<
typename
LocalType,
typename
Input,
typename
ReadDest>
83
decltype
(
auto
)
CustomReadField
(
TypeList<LocalType>
,
Priority<1>
,
InvokeContext
& invoke_context, Input&& input, ReadDest&& read_dest)
84
requires
Unserializable<LocalType, DataStream>
&& (!
ipc::capnp::Deserializable<LocalType>
)
85
{
86
return
read_dest.update([&](
auto
& value) {
87
if
(!input.has())
return
;
88
auto
data = input.get();
89
SpanReader
stream({data.begin(), data.end()});
90
auto
wrapper{
ipc::capnp::Wrap
(stream)};
91
value.Unserialize(wrapper);
92
});
93
}
94
99
template
<
typename
LocalType,
typename
Input,
typename
ReadDest>
100
decltype
(
auto
)
CustomReadField
(
TypeList<LocalType>
,
Priority<1>
,
InvokeContext
& invoke_context, Input&& input, ReadDest&& read_dest)
101
requires
ipc::capnp::Deserializable<LocalType>
102
{
103
assert
(input.has());
104
auto
data = input.get();
105
SpanReader
stream({data.begin(), data.end()});
106
auto
wrapper{
ipc::capnp::Wrap
(stream)};
107
return
read_dest.construct(
::deserialize
, wrapper);
108
}
109
112
template
<
typename
Value,
typename
Output>
113
void
CustomBuildField
(
TypeList<UniValue>
,
Priority<1>
,
InvokeContext
& invoke_context, Value&& value, Output&& output)
114
{
115
std::string str = value.write();
116
auto
result = output.init(str.size());
117
memcpy(result.begin(), str.data(), str.size());
118
}
119
120
template
<
typename
Input,
typename
ReadDest>
121
decltype
(
auto
)
CustomReadField
(
TypeList<UniValue>
,
Priority<1>
,
InvokeContext
& invoke_context, Input&& input,
122
ReadDest&& read_dest)
123
{
124
return
read_dest.update([&](
auto
& value) {
125
auto
data = input.get();
126
value.read(std::string_view{data.begin(), data.size()});
127
});
128
}
129
130
}
// namespace mp
131
132
#endif
// BITCOIN_IPC_CAPNP_COMMON_TYPES_H
DataStream
Double ended buffer combining vector and stream-like interfaces.
Definition
streams.h:133
DataStream::size
size_type size() const
Definition
streams.h:167
DataStream::data
value_type * data()
Definition
streams.h:174
ParamsStream
Wrapper that overrides the GetParams() function of a stream.
Definition
serialize.h:1107
SpanReader
Minimal stream for reading from an existing byte array by std::span.
Definition
streams.h:83
clientversion.h
Serializable
If none of the specialized versions above matched, default to calling member function.
Definition
serialize.h:740
Unserializable
Definition
serialize.h:749
ipc::capnp::Deserializable
Definition
common-types.h:52
types.h
ipc::capnp
Definition
common-types.h:34
ipc::capnp::Wrap
auto Wrap(S &s)
Definition
common-types.h:43
ipc
Definition
ipc.h:12
mp
Functions to serialize / deserialize common bitcoin types.
Definition
common-types.h:57
mp::CustomReadField
decltype(auto) CustomReadField(TypeList< LocalType >, Priority< 1 >, InvokeContext &invoke_context, Input &&input, ReadDest &&read_dest)
Definition
common-types.h:83
mp::CustomBuildField
void CustomBuildField(TypeList< LocalType >, Priority< 1 >, InvokeContext &invoke_context, Value &&value, Output &&output)
Definition
common-types.h:63
S
#define S(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p)
Definition
precomputed_ecmult.c:8
transaction.h
TX_WITH_WITNESS
static constexpr TransactionSerParams TX_WITH_WITNESS
Definition
transaction.h:180
proxy-types.h
serialize.h
deserialize
constexpr deserialize_type deserialize
Definition
serialize.h:49
streams.h
mp::InvokeContext
Definition
proxy-io.h:30
mp::Priority
Definition
util.h:109
mp::TypeList
Generic utility functions used by capnp code.
Definition
util.h:33
type-chrono.h
type-context.h
type-data.h
type-decay.h
type-interface.h
type-message.h
type-number.h
type-optional.h
type-pointer.h
type-string.h
type-struct.h
type-threadmap.h
type-vector.h
univalue.h
assert
assert(!tx.IsCoinBase())
Generated on
for Bitcoin Core by
1.17.0