Bitcoin Core 29.99.0
P2P Digital Currency
type-message.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_MESSAGE_H
6#define MP_PROXY_TYPE_MESSAGE_H
7
8#include <mp/util.h>
9
10namespace mp {
15template <typename LocalType, typename Value, typename Output>
16void 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
26template <typename LocalType, typename Reader, typename ReadDest>
27decltype(auto) CustomReadField(TypeList<LocalType>, Priority<2>, InvokeContext& invoke_context, Reader&& reader,
28 ReadDest&& read_dest,
29 decltype(CustomReadMessage(invoke_context, reader.get(),
30 std::declval<LocalType&>()))* enable = nullptr)
31{
32 return read_dest.update([&](auto& value) { if (reader.has()) CustomReadMessage(invoke_context, reader.get(), value); });
33}
34
37template <typename Accessor, typename Message>
38decltype(auto) MaybeInit(Message&& message, decltype(Accessor::get(message))* enable = nullptr)
39{
40 return Accessor::init(message);
41}
42
43template <typename Accessor>
44::capnp::Void MaybeInit(...)
45{
46 return {};
47}
48
53template <typename Accessor, typename... LocalTypes, typename ServerContext, typename Fn, typename... Args>
54auto 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
std::unique_ptr< interfaces::Init > init
ArgsManager & args
Definition: bitcoind.cpp:277
Functions to serialize / deserialize common bitcoin types.
Definition: common-types.h:57
void CustomPassField()
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:71
void CustomReadMessage(InvokeContext &invoke_context, const ipc::capnp::messages::BlockValidationState::Reader &reader, BlockValidationState &dest)
Definition: mining.cpp:29
decltype(auto) MaybeInit(Message &&message, decltype(Accessor::get(message)) *enable=nullptr)
Helper for CustomPassField below.
Definition: type-message.h:38
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
void CustomBuildMessage(InvokeContext &invoke_context, const BlockValidationState &src, ipc::capnp::messages::BlockValidationState::Builder &&builder)
Definition: mining.cpp:11
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
Function parameter type for prioritizing overloaded function calls that would otherwise be ambiguous.
Definition: util.h:109
Generic utility functions used by capnp code.
Definition: util.h:33