Bitcoin Core  31.0.0
P2P Digital Currency
type-message.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_MESSAGE_H
6 #define MP_PROXY_TYPE_MESSAGE_H
7 
8 #include <mp/util.h>
9 
10 namespace mp {
15 template <typename LocalType, typename Value, typename Output>
16 void CustomBuildField(TypeList<LocalType>, Priority<2>, InvokeContext& invoke_context, Value&& value, Output&& output,
17  decltype(CustomBuildMessage(invoke_context, value, std::move(output.get())))* enable = nullptr)
18 {
19  CustomBuildMessage(invoke_context, value, std::move(output.init()));
20 }
21 
26 template <typename LocalType, typename Input, typename ReadDest>
27 decltype(auto) CustomReadField(TypeList<LocalType>, Priority<2>, InvokeContext& invoke_context, Input&& input,
28  ReadDest&& read_dest,
29  decltype(CustomReadMessage(invoke_context, input.get(),
30  std::declval<LocalType&>()))* enable = nullptr)
31 {
32  return read_dest.update([&](auto& value) { if (CustomHasField(TypeList<LocalType>(), invoke_context, input)) CustomReadMessage(invoke_context, input.get(), value); });
33 }
34 
37 template <typename Accessor, typename Message>
38 decltype(auto) MaybeInit(Message&& message, decltype(Accessor::get(message))* enable = nullptr)
39 {
40  return Accessor::init(message);
41 }
42 
43 template <typename Accessor>
44 ::capnp::Void MaybeInit(...)
45 {
46  return {};
47 }
48 
53 template <typename Accessor, typename... LocalTypes, typename ServerContext, typename Fn, typename... Args>
54 auto CustomPassField(TypeList<LocalTypes...>, ServerContext& server_context, Fn&& fn, Args&&... args)
55  -> decltype(CustomPassMessage(server_context, MaybeGet<Accessor>(server_context.call_context.getParams()),
56  MaybeGet<Accessor>(server_context.call_context.getResults()), nullptr))
57 {
58  CustomPassMessage(server_context, MaybeGet<Accessor>(server_context.call_context.getParams()),
59  MaybeInit<Accessor>(server_context.call_context.getResults()),
60  [&](LocalTypes... param) { fn.invoke(server_context, std::forward<Args>(args)..., param...); });
61 }
62 } // namespace mp
63 
64 #endif // MP_PROXY_TYPE_MESSAGE_H
void CustomBuildMessage(InvokeContext &invoke_context, const test::FooMessage &src, test::messages::FooMessage::Builder &&builder)
Definition: foo-types.h:69
decltype(auto) MaybeInit(Message &&message, decltype(Accessor::get(message)) *enable=nullptr)
Helper for CustomPassField below.
Definition: type-message.h:38
void CustomPassMessage(InvokeContext &invoke_context, const test::messages::FooMutable::Reader &reader, test::messages::FooMutable::Builder builder, std::function< void(test::FooMutable &)> &&fn)
Definition: foo-types.h:97
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
void CustomPassField()
Accessor type holding flags that determine how to access a message field.
Definition: proxy.h:315
Definition: common.h:29
Generic utility functions used by capnp code.
Definition: util.h:32
Functions to serialize / deserialize common bitcoin types.
Definition: common-types.h:57
ArgsManager & args
Definition: bitcoind.cpp:277
std::unique_ptr< interfaces::Init > init
ServerInvokeContext< ProxyServer< Interface >, ::capnp::CallContext< Params, Results > > ServerContext
Definition: proxy-io.h:72
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...
void CustomReadMessage(InvokeContext &invoke_context, const test::messages::FooMessage::Reader &reader, test::FooMessage &dest)
Definition: foo-types.h:76