Bitcoin Core  31.0.0
P2P Digital Currency
type-pointer.h
Go to the documentation of this file.
1 // Copyright (c) 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 
10 namespace mp {
11 template <typename LocalType, typename Value, typename Output>
12 void 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 
19 template <typename LocalType, typename Value, typename Output>
20 void 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 
31 template <typename LocalType, typename Input, typename ReadDest>
32 decltype(auto) CustomReadField(TypeList<LocalType*>,
33  Priority<1>,
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 
45 template <typename LocalType, typename Input, typename ReadDest>
46 decltype(auto) CustomReadField(TypeList<std::shared_ptr<LocalType>>,
47  Priority<0>,
48  InvokeContext& invoke_context,
49  Input&& input,
50  ReadDest&& read_dest)
51 {
52  return read_dest.update([&](auto& value) {
53  if (!CustomHasField(TypeList<LocalType>(), invoke_context, input)) {
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 
67 template <typename LocalType, typename Input, typename ReadDest>
68 decltype(auto) CustomReadField(TypeList<std::shared_ptr<const LocalType>>,
69  Priority<1>,
70  InvokeContext& invoke_context,
71  Input&& input,
72  ReadDest&& read_dest)
73 {
74  return read_dest.update([&](auto& value) {
75  if (!CustomHasField(TypeList<LocalType>(), invoke_context, input)) {
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 
88 template <typename Accessor, typename LocalType, typename ServerContext, typename Fn, typename... Args>
89 void 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
Function parameter type for prioritizing overloaded function calls that would otherwise be ambiguous...
Definition: util.h:108
bool CustomHasField(TypeList< LocalTypes... >, InvokeContext &invoke_context, const Input &input)
Return whether to read a C++ value from a Cap&#39;n Proto field.
Definition: proxy-types.h:207
Definition: common.h:29
Generic utility functions used by capnp code.
Definition: util.h:32
Destination parameter type that can be passed to ReadField function as an alternative to ReadDestEmpl...
Definition: proxy-types.h:145
Functions to serialize / deserialize common bitcoin types.
Definition: common-types.h:57
ArgsManager & args
Definition: bitcoind.cpp:277
ServerInvokeContext< ProxyServer< Interface >, ::capnp::CallContext< Params, Results > > ServerContext
Definition: proxy-io.h:72
void BuildField(TypeList< LocalTypes... >, Context &context, Output &&output, Values &&... values)
Definition: proxy-types.h:250
void MaybeReadField(std::true_type, Args &&... args)
Definition: proxy-types.h:317
decltype(auto) CustomReadField(TypeList< LocalType >, Priority< 1 >, InvokeContext &invoke_context, Input &&input, ReadDest &&read_dest) requires Unserializable< LocalType
Overload multiprocess library&#39;s CustomReadField hook to allow any object with an Unserialize method t...
Definition: common-types.h:100
void CustomBuildField(TypeList< LocalType >, Priority< 1 >, InvokeContext &invoke_context, Value &&value, Output &&output) requires Serializable< LocalType
Overload multiprocess library&#39;s CustomBuildField hook to allow any serializable object to be stored i...
std::decay_t< T > Decay
Type helper abbreviating std::decay.
Definition: util.h:86
decltype(auto) ReadField(TypeList< LocalTypes... >, InvokeContext &invoke_context, Input &&input, Args &&... args)
Definition: proxy-types.h:213
CallContext & call_context
Definition: proxy-io.h:49
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:291
void MaybeBuildField(std::true_type, Args &&... args)
Definition: proxy-types.h:308