Bitcoin Core 29.99.0
P2P Digital Currency
type-pointer.h
Go to the documentation of this file.
1// Copyright (c) 2025 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 MP_PROXY_TYPE_POINTER_H
6#define MP_PROXY_TYPE_POINTER_H
7
8#include <mp/util.h>
9
10namespace mp {
11template <typename LocalType, typename Value, typename Output>
12void CustomBuildField(TypeList<LocalType*>, Priority<3>, InvokeContext& invoke_context, Value&& value, Output&& output)
13{
14 if (value) {
15 BuildField(TypeList<LocalType>(), invoke_context, output, *value);
16 }
17}
18
19template <typename LocalType, typename Value, typename Output>
20void CustomBuildField(TypeList<std::shared_ptr<LocalType>>,
22 InvokeContext& invoke_context,
23 Value&& value,
24 Output&& output)
25{
26 if (value) {
27 BuildField(TypeList<LocalType>(), invoke_context, output, *value);
28 }
29}
30
31template <typename LocalType, typename Input, typename ReadDest>
34 InvokeContext& invoke_context,
35 Input&& input,
36 ReadDest&& read_dest)
37{
38 return read_dest.update([&](auto& value) {
39 if (value) {
40 ReadField(TypeList<LocalType>(), invoke_context, std::forward<Input>(input), ReadDestUpdate(*value));
41 }
42 });
43}
44
45template <typename LocalType, typename Input, typename ReadDest>
46decltype(auto) CustomReadField(TypeList<std::shared_ptr<LocalType>>,
48 InvokeContext& invoke_context,
49 Input&& input,
50 ReadDest&& read_dest)
51{
52 return read_dest.update([&](auto& value) {
53 if (!input.has()) {
54 value.reset();
55 } else if (value) {
56 ReadField(TypeList<LocalType>(), invoke_context, input, ReadDestUpdate(*value));
57 } else {
58 ReadField(TypeList<LocalType>(), invoke_context, input,
59 ReadDestEmplace(TypeList<LocalType>(), [&](auto&&... args) -> auto& {
60 value = std::make_shared<LocalType>(std::forward<decltype(args)>(args)...);
61 return *value;
62 }));
63 }
64 });
65}
66
67template <typename LocalType, typename Input, typename ReadDest>
68decltype(auto) CustomReadField(TypeList<std::shared_ptr<const LocalType>>,
70 InvokeContext& invoke_context,
71 Input&& input,
72 ReadDest&& read_dest)
73{
74 return read_dest.update([&](auto& value) {
75 if (!input.has()) {
76 value.reset();
77 return;
78 }
79 ReadField(TypeList<LocalType>(), invoke_context, std::forward<Input>(input),
80 ReadDestEmplace(TypeList<LocalType>(), [&](auto&&... args) -> auto& {
81 value = std::make_shared<LocalType>(std::forward<decltype(args)>(args)...);
82 return *value;
83 }));
84 });
85}
86
88template <typename Accessor, typename LocalType, typename ServerContext, typename Fn, typename... Args>
89void PassField(Priority<1>, TypeList<LocalType*>, ServerContext& server_context, const Fn& fn, Args&&... args)
90{
91 const auto& params = server_context.call_context.getParams();
92 const auto& input = Make<StructField, Accessor>(params);
93
94 if (!input.want()) {
95 fn.invoke(server_context, std::forward<Args>(args)..., nullptr);
96 return;
97 }
98
99 InvokeContext& invoke_context = server_context;
100 Decay<LocalType> param;
101
102 MaybeReadField(std::integral_constant<bool, Accessor::in>(), TypeList<LocalType>(), invoke_context, input,
103 ReadDestUpdate(param));
104
105 fn.invoke(server_context, std::forward<Args>(args)..., &param);
106
107 auto&& results = server_context.call_context.getResults();
108 MaybeBuildField(std::integral_constant<bool, Accessor::out>(), TypeList<LocalType>(), invoke_context,
109 Make<StructField, Accessor>(results), param);
110}
111} // namespace mp
112
113#endif // MP_PROXY_TYPE_POINTER_H
ArgsManager & args
Definition: bitcoind.cpp:277
Functions to serialize / deserialize common bitcoin types.
Definition: common-types.h:57
void MaybeBuildField(std::true_type, Args &&... args)
Definition: proxy-types.h:233
void MaybeReadField(std::true_type, Args &&... args)
Definition: proxy-types.h:242
void BuildField(TypeList< LocalTypes... >, Context &context, Output &&output, Values &&... values)
Definition: proxy-types.h:175
auto PassField(Priority< 1 >, TypeList< LocalType & >, ServerContext &server_context, Fn &&fn, Args &&... args) -> Require< typename decltype(Accessor::get(server_context.call_context.getParams()))::Calls >
PassField override for callable interface reference arguments.
Definition: proxy-types.h:216
decltype(auto) CustomReadField(TypeList< LocalType >, Priority< 1 >, InvokeContext &invoke_context, Input &&input, ReadDest &&read_dest)
Overload multiprocess library's CustomReadField hook to allow any object with an Unserialize method t...
Definition: common-types.h:83
ServerInvokeContext< ProxyServer< Interface >, ::capnp::CallContext< Params, Results > > ServerContext
Definition: proxy-io.h:56
decltype(auto) ReadField(TypeList< LocalTypes... >, Args &&... args)
Definition: proxy-types.h:145
std::decay_t< T > Decay
Type helper abbreviating std::decay.
Definition: util.h:86
void CustomBuildField(TypeList< LocalType >, Priority< 1 >, InvokeContext &invoke_context, Value &&value, Output &&output)
Overload multiprocess library's CustomBuildField hook to allow any serializable object to be stored i...
Definition: common-types.h:63
Specialization of above (base case)
Definition: util.h:115
Function parameter type for prioritizing overloaded function calls that would otherwise be ambiguous.
Definition: util.h:109
Destination parameter type that can be passed to ReadField function as an alternative to ReadDestEmpl...
Definition: proxy-types.h:120
CallContext & call_context
Definition: proxy-io.h:46
Generic utility functions used by capnp code.
Definition: util.h:33