/tmp/bitcoin/src/ipc/capnp/common-types.h
Line | Count | Source |
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 { |
35 | | //! Construct a ParamStream wrapping a data stream with serialization parameters |
36 | | //! needed to pass transaction objects between bitcoin processes. |
37 | | //! In the future, more params may be added here to serialize other objects that |
38 | | //! require serialization parameters. Params should just be chosen to serialize |
39 | | //! objects completely and ensure that serializing and deserializing objects |
40 | | //! with the specified parameters produces equivalent objects. It's also |
41 | | //! harmless to specify serialization parameters here that are not used. |
42 | | template <typename S> |
43 | | auto Wrap(S& s) |
44 | 8 | { |
45 | 8 | return ParamsStream{s, TX_WITH_WITNESS}; |
46 | 8 | } auto ipc::capnp::Wrap<DataStream>(DataStream&) Line | Count | Source | 44 | 4 | { | 45 | 4 | return ParamsStream{s, TX_WITH_WITNESS}; | 46 | 4 | } |
auto ipc::capnp::Wrap<SpanReader>(SpanReader&) Line | Count | Source | 44 | 4 | { | 45 | 4 | return ParamsStream{s, TX_WITH_WITNESS}; | 46 | 4 | } |
|
47 | | |
48 | | //! Detect if type has a deserialize_type constructor, which is |
49 | | //! used to deserialize types like CTransaction that can't be unserialized into |
50 | | //! existing objects because they are immutable. |
51 | | template <typename T> |
52 | | concept Deserializable = std::is_constructible_v<T, ::deserialize_type, ::DataStream&>; |
53 | | } // namespace capnp |
54 | | } // namespace ipc |
55 | | |
56 | | //! Functions to serialize / deserialize common bitcoin types. |
57 | | namespace mp { |
58 | | //! Overload multiprocess library's CustomBuildField hook to allow any |
59 | | //! serializable object to be stored in a capnproto Data field or passed to a |
60 | | //! capnproto interface. Use Priority<1> so this hook has medium priority, and |
61 | | //! higher priority hooks could take precedence over this one. |
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 | 4 | { |
71 | 4 | DataStream stream; |
72 | 4 | auto wrapper{ipc::capnp::Wrap(stream)}; |
73 | 4 | value.Serialize(wrapper); |
74 | 4 | auto result = output.init(stream.size()); |
75 | 4 | memcpy(result.begin(), stream.data(), stream.size()); |
76 | 4 | } void mp::CustomBuildField<COutPoint, COutPoint, mp::StructField<mp::Accessor<mp::ipc_test_fields::Arg, 17>, capnp::Request<gen::FooInterface::PassOutPointParams, gen::FooInterface::PassOutPointResults>>>(mp::TypeList<COutPoint>, mp::Priority<1>, mp::InvokeContext&, COutPoint&&, mp::StructField<mp::Accessor<mp::ipc_test_fields::Arg, 17>, capnp::Request<gen::FooInterface::PassOutPointParams, gen::FooInterface::PassOutPointResults>>&&) requires Serializable<COutPoint, DataStream> && std::is_same_v<COutPoint, std::remove_cv<std::remove_reference<COutPoint>::type>::type> Line | Count | Source | 70 | 1 | { | 71 | 1 | DataStream stream; | 72 | 1 | auto wrapper{ipc::capnp::Wrap(stream)}; | 73 | 1 | value.Serialize(wrapper); | 74 | 1 | auto result = output.init(stream.size()); | 75 | 1 | memcpy(result.begin(), stream.data(), stream.size()); | 76 | 1 | } |
void mp::CustomBuildField<CTransaction, CTransaction const&, mp::StructField<mp::Accessor<mp::ipc_test_fields::Arg, 17>, capnp::Request<gen::FooInterface::PassTransactionParams, gen::FooInterface::PassTransactionResults>>&>(mp::TypeList<CTransaction>, mp::Priority<1>, mp::InvokeContext&, CTransaction const&, mp::StructField<mp::Accessor<mp::ipc_test_fields::Arg, 17>, capnp::Request<gen::FooInterface::PassTransactionParams, gen::FooInterface::PassTransactionResults>>&) requires Serializable<CTransaction, DataStream> && std::is_same_v<CTransaction, std::remove_cv<std::remove_reference<CTransaction>::type>::type> Line | Count | Source | 70 | 1 | { | 71 | 1 | DataStream stream; | 72 | 1 | auto wrapper{ipc::capnp::Wrap(stream)}; | 73 | 1 | value.Serialize(wrapper); | 74 | 1 | auto result = output.init(stream.size()); | 75 | 1 | memcpy(result.begin(), stream.data(), stream.size()); | 76 | 1 | } |
void mp::CustomBuildField<COutPoint, COutPoint, mp::StructField<mp::Accessor<mp::ipc_test_fields::Result, 18>, gen::FooInterface::PassOutPointResults::Builder>&>(mp::TypeList<COutPoint>, mp::Priority<1>, mp::InvokeContext&, COutPoint&&, mp::StructField<mp::Accessor<mp::ipc_test_fields::Result, 18>, gen::FooInterface::PassOutPointResults::Builder>&) requires Serializable<COutPoint, DataStream> && std::is_same_v<COutPoint, std::remove_cv<std::remove_reference<COutPoint>::type>::type> Line | Count | Source | 70 | 1 | { | 71 | 1 | DataStream stream; | 72 | 1 | auto wrapper{ipc::capnp::Wrap(stream)}; | 73 | 1 | value.Serialize(wrapper); | 74 | 1 | auto result = output.init(stream.size()); | 75 | 1 | memcpy(result.begin(), stream.data(), stream.size()); | 76 | 1 | } |
void mp::CustomBuildField<CTransaction, CTransaction const&, mp::StructField<mp::Accessor<mp::ipc_test_fields::Result, 18>, gen::FooInterface::PassTransactionResults::Builder>&>(mp::TypeList<CTransaction>, mp::Priority<1>, mp::InvokeContext&, CTransaction const&, mp::StructField<mp::Accessor<mp::ipc_test_fields::Result, 18>, gen::FooInterface::PassTransactionResults::Builder>&) requires Serializable<CTransaction, DataStream> && std::is_same_v<CTransaction, std::remove_cv<std::remove_reference<CTransaction>::type>::type> Line | Count | Source | 70 | 1 | { | 71 | 1 | DataStream stream; | 72 | 1 | auto wrapper{ipc::capnp::Wrap(stream)}; | 73 | 1 | value.Serialize(wrapper); | 74 | 1 | auto result = output.init(stream.size()); | 75 | 1 | memcpy(result.begin(), stream.data(), stream.size()); | 76 | 1 | } |
Unexecuted instantiation: void mp::CustomBuildField<uint256, uint256, mp::StructField<mp::Accessor<mp::mining_fields::CurrentTip, 17>, capnp::Request<ipc::capnp::messages::Mining::WaitTipChangedParams, ipc::capnp::messages::Mining::WaitTipChangedResults>>>(mp::TypeList<uint256>, mp::Priority<1>, mp::InvokeContext&, uint256&&, mp::StructField<mp::Accessor<mp::mining_fields::CurrentTip, 17>, capnp::Request<ipc::capnp::messages::Mining::WaitTipChangedParams, ipc::capnp::messages::Mining::WaitTipChangedResults>>&&) requires Serializable<uint256, DataStream> && std::is_same_v<uint256, std::remove_cv<std::remove_reference<uint256>::type>::type> Unexecuted instantiation: void mp::CustomBuildField<CBlock, CBlock const&, mp::StructField<mp::Accessor<mp::mining_fields::Block, 17>, capnp::Request<ipc::capnp::messages::Mining::CheckBlockParams, ipc::capnp::messages::Mining::CheckBlockResults>>&>(mp::TypeList<CBlock>, mp::Priority<1>, mp::InvokeContext&, CBlock const&, mp::StructField<mp::Accessor<mp::mining_fields::Block, 17>, capnp::Request<ipc::capnp::messages::Mining::CheckBlockParams, ipc::capnp::messages::Mining::CheckBlockResults>>&) requires Serializable<CBlock, DataStream> && std::is_same_v<CBlock, std::remove_cv<std::remove_reference<CBlock>::type>::type> Unexecuted instantiation: void mp::CustomBuildField<CTransaction, CTransaction const&, mp::StructField<mp::Accessor<mp::mining_fields::Coinbase, 17>, capnp::Request<ipc::capnp::messages::BlockTemplate::SubmitSolutionParams, ipc::capnp::messages::BlockTemplate::SubmitSolutionResults>>&>(mp::TypeList<CTransaction>, mp::Priority<1>, mp::InvokeContext&, CTransaction const&, mp::StructField<mp::Accessor<mp::mining_fields::Coinbase, 17>, capnp::Request<ipc::capnp::messages::BlockTemplate::SubmitSolutionParams, ipc::capnp::messages::BlockTemplate::SubmitSolutionResults>>&) requires Serializable<CTransaction, DataStream> && std::is_same_v<CTransaction, std::remove_cv<std::remove_reference<CTransaction>::type>::type> Unexecuted instantiation: void mp::CustomBuildField<uint256, uint256&, mp::StructField<mp::Accessor<mp::common_fields::Hash, 19>, ipc::capnp::messages::BlockRef::Builder>&>(mp::TypeList<uint256>, mp::Priority<1>, mp::InvokeContext&, uint256&, mp::StructField<mp::Accessor<mp::common_fields::Hash, 19>, ipc::capnp::messages::BlockRef::Builder>&) requires Serializable<uint256, DataStream> && std::is_same_v<uint256, std::remove_cv<std::remove_reference<uint256>::type>::type> Unexecuted instantiation: void mp::CustomBuildField<CBlockHeader, CBlockHeader, mp::StructField<mp::Accessor<mp::mining_fields::Result, 18>, ipc::capnp::messages::BlockTemplate::GetBlockHeaderResults::Builder>&>(mp::TypeList<CBlockHeader>, mp::Priority<1>, mp::InvokeContext&, CBlockHeader&&, mp::StructField<mp::Accessor<mp::mining_fields::Result, 18>, ipc::capnp::messages::BlockTemplate::GetBlockHeaderResults::Builder>&) requires Serializable<CBlockHeader, DataStream> && std::is_same_v<CBlockHeader, std::remove_cv<std::remove_reference<CBlockHeader>::type>::type> Unexecuted instantiation: void mp::CustomBuildField<CBlock, CBlock, mp::StructField<mp::Accessor<mp::mining_fields::Result, 18>, ipc::capnp::messages::BlockTemplate::GetBlockResults::Builder>&>(mp::TypeList<CBlock>, mp::Priority<1>, mp::InvokeContext&, CBlock&&, mp::StructField<mp::Accessor<mp::mining_fields::Result, 18>, ipc::capnp::messages::BlockTemplate::GetBlockResults::Builder>&) requires Serializable<CBlock, DataStream> && std::is_same_v<CBlock, std::remove_cv<std::remove_reference<CBlock>::type>::type> Unexecuted instantiation: void mp::CustomBuildField<uint256, uint256&, mp::StructField<mp::Accessor<mp::mining_fields::Witness, 19>, ipc::capnp::messages::CoinbaseTx::Builder>&>(mp::TypeList<uint256>, mp::Priority<1>, mp::InvokeContext&, uint256&, mp::StructField<mp::Accessor<mp::mining_fields::Witness, 19>, ipc::capnp::messages::CoinbaseTx::Builder>&) requires Serializable<uint256, DataStream> && std::is_same_v<uint256, std::remove_cv<std::remove_reference<uint256>::type>::type> Unexecuted instantiation: void mp::CustomBuildField<CTxOut, CTxOut&, mp::ListOutput<capnp::List<capnp::Data, (capnp::Kind)1>>>(mp::TypeList<CTxOut>, mp::Priority<1>, mp::InvokeContext&, CTxOut&, mp::ListOutput<capnp::List<capnp::Data, (capnp::Kind)1>>&&) requires Serializable<CTxOut, DataStream> && std::is_same_v<CTxOut, std::remove_cv<std::remove_reference<CTxOut>::type>::type> Unexecuted instantiation: void mp::CustomBuildField<uint256, uint256&, mp::ListOutput<capnp::List<capnp::Data, (capnp::Kind)1>>>(mp::TypeList<uint256>, mp::Priority<1>, mp::InvokeContext&, uint256&, mp::ListOutput<capnp::List<capnp::Data, (capnp::Kind)1>>&&) requires Serializable<uint256, DataStream> && std::is_same_v<uint256, std::remove_cv<std::remove_reference<uint256>::type>::type> |
77 | | |
78 | | //! Overload multiprocess library's CustomReadField hook to allow any object |
79 | | //! with an Unserialize method to be read from a capnproto Data field or |
80 | | //! returned from capnproto interface. Use Priority<1> so this hook has medium |
81 | | //! priority, and higher priority hooks could take precedence over this one. |
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 | 2 | { |
86 | 2 | return read_dest.update([&](auto& value) { |
87 | 2 | if (!input.has()) return; |
88 | 2 | auto data = input.get(); |
89 | 2 | SpanReader stream({data.begin(), data.end()}); |
90 | 2 | auto wrapper{ipc::capnp::Wrap(stream)}; |
91 | 2 | value.Unserialize(wrapper); |
92 | 2 | }); auto decltype(auto) mp::CustomReadField<COutPoint, mp::StructField<mp::Accessor<mp::ipc_test_fields::Result, 18>, capnp::Response<gen::FooInterface::PassOutPointResults>>, mp::ReadDestUpdate<COutPoint>>(mp::TypeList<COutPoint>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::ipc_test_fields::Result, 18>, capnp::Response<gen::FooInterface::PassOutPointResults>>&&, mp::ReadDestUpdate<COutPoint>&&) requires Unserializable<COutPoint, DataStream> && !ipc::capnp::Deserializable<COutPoint>::'lambda'(COutPoint&)::operator()<COutPoint>(COutPoint&) const Line | Count | Source | 86 | 1 | return read_dest.update([&](auto& value) { | 87 | 1 | if (!input.has()) return; | 88 | 1 | auto data = input.get(); | 89 | 1 | SpanReader stream({data.begin(), data.end()}); | 90 | 1 | auto wrapper{ipc::capnp::Wrap(stream)}; | 91 | 1 | value.Unserialize(wrapper); | 92 | 1 | }); |
auto decltype(auto) mp::CustomReadField<COutPoint, mp::StructField<mp::Accessor<mp::ipc_test_fields::Arg, 17>, gen::FooInterface::PassOutPointParams::Reader const>, mp::ReadDestEmplace<COutPoint, void mp::PassField<mp::Accessor<mp::ipc_test_fields::Arg, 17>, COutPoint, mp::ServerInvokeContext<mp::ProxyServer<gen::FooInterface>, capnp::CallContext<gen::FooInterface::PassOutPointParams, gen::FooInterface::PassOutPointResults>>, mp::ServerRet<mp::Accessor<mp::ipc_test_fields::Result, 18>, mp::ServerCall> const&, mp::TypeList<>>(mp::Priority<0>, mp::TypeList<COutPoint>, mp::ServerInvokeContext<mp::ProxyServer<gen::FooInterface>, capnp::CallContext<gen::FooInterface::PassOutPointParams, gen::FooInterface::PassOutPointResults>>&, mp::ServerRet<mp::Accessor<mp::ipc_test_fields::Result, 18>, mp::ServerCall> const&, mp::TypeList<>&&)::'lambda'(auto&&...)>>(mp::TypeList<COutPoint>, mp::Priority<1>, mp::InvokeContext&, COutPoint&&, mp::ServerInvokeContext<mp::ProxyServer<gen::FooInterface>, capnp::CallContext<gen::FooInterface::PassOutPointParams, gen::FooInterface::PassOutPointResults>>&&) requires Unserializable<COutPoint, DataStream> && !ipc::capnp::Deserializable<COutPoint>::'lambda'(COutPoint&)::operator()<COutPoint>(COutPoint&) const Line | Count | Source | 86 | 1 | return read_dest.update([&](auto& value) { | 87 | 1 | if (!input.has()) return; | 88 | 1 | auto data = input.get(); | 89 | 1 | SpanReader stream({data.begin(), data.end()}); | 90 | 1 | auto wrapper{ipc::capnp::Wrap(stream)}; | 91 | 1 | value.Unserialize(wrapper); | 92 | 1 | }); |
Unexecuted instantiation: auto decltype(auto) mp::CustomReadField<uint256, mp::StructField<mp::Accessor<mp::common_fields::Hash, 19>, ipc::capnp::messages::BlockRef::Reader const>, mp::ReadDestUpdate<uint256>>(mp::TypeList<uint256>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::common_fields::Hash, 19>, ipc::capnp::messages::BlockRef::Reader const>&&, mp::ReadDestUpdate<uint256>&&) requires Unserializable<uint256, DataStream> && !ipc::capnp::Deserializable<uint256>::'lambda'(uint256&)::operator()<uint256>(uint256&) const Unexecuted instantiation: auto decltype(auto) mp::CustomReadField<CBlockHeader, mp::StructField<mp::Accessor<mp::mining_fields::Result, 18>, capnp::Response<ipc::capnp::messages::BlockTemplate::GetBlockHeaderResults>>, mp::ReadDestUpdate<CBlockHeader>>(mp::TypeList<CBlockHeader>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::Result, 18>, capnp::Response<ipc::capnp::messages::BlockTemplate::GetBlockHeaderResults>>&&, mp::ReadDestUpdate<CBlockHeader>&&) requires Unserializable<CBlockHeader, DataStream> && !ipc::capnp::Deserializable<CBlockHeader>::'lambda'(CBlockHeader&)::operator()<CBlockHeader>(CBlockHeader&) const Unexecuted instantiation: auto decltype(auto) mp::CustomReadField<CBlock, mp::StructField<mp::Accessor<mp::mining_fields::Result, 18>, capnp::Response<ipc::capnp::messages::BlockTemplate::GetBlockResults>>, mp::ReadDestUpdate<CBlock>>(mp::TypeList<CBlock>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::Result, 18>, capnp::Response<ipc::capnp::messages::BlockTemplate::GetBlockResults>>&&, mp::ReadDestUpdate<CBlock>&&) requires Unserializable<CBlock, DataStream> && !ipc::capnp::Deserializable<CBlock>::'lambda'(CBlock&)::operator()<CBlock>(CBlock&) const Unexecuted instantiation: auto decltype(auto) mp::CustomReadField<uint256, mp::StructField<mp::Accessor<mp::mining_fields::Witness, 19>, ipc::capnp::messages::CoinbaseTx::Reader const>&, mp::ReadDestUpdate<uint256>>(mp::TypeList<uint256>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::Witness, 19>, ipc::capnp::messages::CoinbaseTx::Reader const>&, mp::ReadDestUpdate<uint256>&&) requires Unserializable<uint256, DataStream> && !ipc::capnp::Deserializable<uint256>::'lambda'(uint256&)::operator()<uint256>(uint256&) const Unexecuted instantiation: auto decltype(auto) mp::CustomReadField<uint256, mp::StructField<mp::Accessor<mp::mining_fields::Witness, 19>, ipc::capnp::messages::CoinbaseTx::Reader const>&, mp::ReadDestEmplace<uint256, auto decltype(auto) mp::CustomReadField<uint256, mp::StructField<mp::Accessor<mp::mining_fields::Witness, 19>, ipc::capnp::messages::CoinbaseTx::Reader const>, mp::ReadDestUpdate<std::optional<uint256>>>(mp::TypeList<std::optional<uint256>>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::Witness, 19>, ipc::capnp::messages::CoinbaseTx::Reader const>&&, mp::ReadDestUpdate<std::optional<uint256>>&&)::'lambda'(uint256&)::operator()<std::optional<uint256>>(uint256&) const::'lambda'(auto&&...)>>(mp::TypeList<uint256>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::Witness, 19>, ipc::capnp::messages::CoinbaseTx::Reader const>&&, mp::ReadDestUpdate<std::optional<uint256>>&&) requires Unserializable<uint256, DataStream> && !ipc::capnp::Deserializable<uint256>::'lambda'(uint256&)::operator()<uint256>(uint256&) const Unexecuted instantiation: auto decltype(auto) mp::CustomReadField<CTxOut, mp::ValueField<capnp::Data::Reader>, mp::ReadDestEmplace<CTxOut, auto decltype(auto) mp::CustomReadField<CTxOut, mp::StructField<mp::Accessor<mp::mining_fields::RequiredOutputs, 19>, ipc::capnp::messages::CoinbaseTx::Reader const>, mp::ReadDestUpdate<std::vector<CTxOut, std::allocator<CTxOut>>>>(mp::TypeList<std::vector<CTxOut, std::allocator<CTxOut>>>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::RequiredOutputs, 19>, ipc::capnp::messages::CoinbaseTx::Reader const>&&, mp::ReadDestUpdate<std::vector<CTxOut, std::allocator<CTxOut>>>&&)::'lambda'(CTxOut&)::operator()<std::vector<CTxOut, std::allocator<CTxOut>>>(CTxOut&) const::'lambda'(auto&&...)>>(mp::TypeList<CTxOut>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::RequiredOutputs, 19>, ipc::capnp::messages::CoinbaseTx::Reader const>&&, mp::ReadDestUpdate<std::vector<CTxOut, std::allocator<CTxOut>>>&&) requires Unserializable<CTxOut, DataStream> && !ipc::capnp::Deserializable<CTxOut>::'lambda'(CTxOut&)::operator()<CTxOut>(CTxOut&) const Unexecuted instantiation: auto decltype(auto) mp::CustomReadField<uint256, mp::ValueField<capnp::Data::Reader>, mp::ReadDestEmplace<uint256, auto decltype(auto) mp::CustomReadField<uint256, mp::StructField<mp::Accessor<mp::mining_fields::Result, 18>, capnp::Response<ipc::capnp::messages::BlockTemplate::GetCoinbaseMerklePathResults>>, mp::ReadDestUpdate<std::vector<uint256, std::allocator<uint256>>>>(mp::TypeList<std::vector<uint256, std::allocator<uint256>>>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::Result, 18>, capnp::Response<ipc::capnp::messages::BlockTemplate::GetCoinbaseMerklePathResults>>&&, mp::ReadDestUpdate<std::vector<uint256, std::allocator<uint256>>>&&)::'lambda'(uint256&)::operator()<std::vector<uint256, std::allocator<uint256>>>(uint256&) const::'lambda'(auto&&...)>>(mp::TypeList<uint256>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::Result, 18>, capnp::Response<ipc::capnp::messages::BlockTemplate::GetCoinbaseMerklePathResults>>&&, mp::ReadDestUpdate<std::vector<uint256, std::allocator<uint256>>>&&) requires Unserializable<uint256, DataStream> && !ipc::capnp::Deserializable<uint256>::'lambda'(uint256&)::operator()<uint256>(uint256&) const Unexecuted instantiation: auto decltype(auto) mp::CustomReadField<uint256, mp::StructField<mp::Accessor<mp::mining_fields::CurrentTip, 17>, ipc::capnp::messages::Mining::WaitTipChangedParams::Reader const>, mp::ReadDestEmplace<uint256, void mp::PassField<mp::Accessor<mp::mining_fields::CurrentTip, 17>, uint256, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Mining>, capnp::CallContext<ipc::capnp::messages::Mining::WaitTipChangedParams, ipc::capnp::messages::Mining::WaitTipChangedResults>>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Timeout, 1>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 18>, mp::ServerCall>> const&, mp::TypeList<std::chrono::duration<double, std::ratio<1l, 1000l>>>>(mp::Priority<0>, mp::TypeList<uint256>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Mining>, capnp::CallContext<ipc::capnp::messages::Mining::WaitTipChangedParams, ipc::capnp::messages::Mining::WaitTipChangedResults>>&, mp::ServerField<1, mp::Accessor<mp::mining_fields::Timeout, 1>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 18>, mp::ServerCall>> const&, mp::TypeList<std::chrono::duration<double, std::ratio<1l, 1000l>>>&&)::'lambda'(auto&&...)>>(mp::TypeList<uint256>, mp::Priority<1>, mp::InvokeContext&, uint256&&, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Mining>, capnp::CallContext<ipc::capnp::messages::Mining::WaitTipChangedParams, ipc::capnp::messages::Mining::WaitTipChangedResults>>&&) requires Unserializable<uint256, DataStream> && !ipc::capnp::Deserializable<uint256>::'lambda'(uint256&)::operator()<uint256>(uint256&) const Unexecuted instantiation: auto decltype(auto) mp::CustomReadField<CBlock, mp::StructField<mp::Accessor<mp::mining_fields::Block, 17>, ipc::capnp::messages::Mining::CheckBlockParams::Reader const>, mp::ReadDestEmplace<CBlock, void mp::PassField<mp::Accessor<mp::mining_fields::Block, 17>, CBlock const&, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Mining>, capnp::CallContext<ipc::capnp::messages::Mining::CheckBlockParams, ipc::capnp::messages::Mining::CheckBlockResults>>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Reason, 18>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Debug, 18>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 2>, mp::ServerCall>>>> const&, mp::TypeList<node::BlockCheckOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>&>>(mp::Priority<0>, mp::TypeList<CBlock const&>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Mining>, capnp::CallContext<ipc::capnp::messages::Mining::CheckBlockParams, ipc::capnp::messages::Mining::CheckBlockResults>>&, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Reason, 18>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Debug, 18>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 2>, mp::ServerCall>>>> const&, mp::TypeList<node::BlockCheckOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>&>&&)::'lambda'(auto&&...)>>(mp::TypeList<CBlock>, mp::Priority<1>, mp::InvokeContext&, CBlock const&, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Mining>, capnp::CallContext<ipc::capnp::messages::Mining::CheckBlockParams, ipc::capnp::messages::Mining::CheckBlockResults>>&&) requires Unserializable<CBlock, DataStream> && !ipc::capnp::Deserializable<CBlock>::'lambda'(CBlock&)::operator()<CBlock>(CBlock&) const |
93 | 2 | } decltype(auto) mp::CustomReadField<COutPoint, mp::StructField<mp::Accessor<mp::ipc_test_fields::Result, 18>, capnp::Response<gen::FooInterface::PassOutPointResults>>, mp::ReadDestUpdate<COutPoint>>(mp::TypeList<COutPoint>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::ipc_test_fields::Result, 18>, capnp::Response<gen::FooInterface::PassOutPointResults>>&&, mp::ReadDestUpdate<COutPoint>&&) requires Unserializable<COutPoint, DataStream> && !ipc::capnp::Deserializable<COutPoint> Line | Count | Source | 85 | 1 | { | 86 | 1 | return read_dest.update([&](auto& value) { | 87 | 1 | if (!input.has()) return; | 88 | 1 | auto data = input.get(); | 89 | 1 | SpanReader stream({data.begin(), data.end()}); | 90 | 1 | auto wrapper{ipc::capnp::Wrap(stream)}; | 91 | 1 | value.Unserialize(wrapper); | 92 | 1 | }); | 93 | 1 | } |
decltype(auto) mp::CustomReadField<COutPoint, mp::StructField<mp::Accessor<mp::ipc_test_fields::Arg, 17>, gen::FooInterface::PassOutPointParams::Reader const>, mp::ReadDestEmplace<COutPoint, void mp::PassField<mp::Accessor<mp::ipc_test_fields::Arg, 17>, COutPoint, mp::ServerInvokeContext<mp::ProxyServer<gen::FooInterface>, capnp::CallContext<gen::FooInterface::PassOutPointParams, gen::FooInterface::PassOutPointResults>>, mp::ServerRet<mp::Accessor<mp::ipc_test_fields::Result, 18>, mp::ServerCall> const&, mp::TypeList<>>(mp::Priority<0>, mp::TypeList<COutPoint>, mp::ServerInvokeContext<mp::ProxyServer<gen::FooInterface>, capnp::CallContext<gen::FooInterface::PassOutPointParams, gen::FooInterface::PassOutPointResults>>&, mp::ServerRet<mp::Accessor<mp::ipc_test_fields::Result, 18>, mp::ServerCall> const&, mp::TypeList<>&&)::'lambda'(auto&&...)>>(mp::TypeList<COutPoint>, mp::Priority<1>, mp::InvokeContext&, COutPoint&&, mp::ServerInvokeContext<mp::ProxyServer<gen::FooInterface>, capnp::CallContext<gen::FooInterface::PassOutPointParams, gen::FooInterface::PassOutPointResults>>&&) requires Unserializable<COutPoint, DataStream> && !ipc::capnp::Deserializable<COutPoint> Line | Count | Source | 85 | 1 | { | 86 | 1 | return read_dest.update([&](auto& value) { | 87 | 1 | if (!input.has()) return; | 88 | 1 | auto data = input.get(); | 89 | 1 | SpanReader stream({data.begin(), data.end()}); | 90 | 1 | auto wrapper{ipc::capnp::Wrap(stream)}; | 91 | 1 | value.Unserialize(wrapper); | 92 | 1 | }); | 93 | 1 | } |
Unexecuted instantiation: decltype(auto) mp::CustomReadField<uint256, mp::StructField<mp::Accessor<mp::common_fields::Hash, 19>, ipc::capnp::messages::BlockRef::Reader const>, mp::ReadDestUpdate<uint256>>(mp::TypeList<uint256>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::common_fields::Hash, 19>, ipc::capnp::messages::BlockRef::Reader const>&&, mp::ReadDestUpdate<uint256>&&) requires Unserializable<uint256, DataStream> && !ipc::capnp::Deserializable<uint256> Unexecuted instantiation: decltype(auto) mp::CustomReadField<CBlockHeader, mp::StructField<mp::Accessor<mp::mining_fields::Result, 18>, capnp::Response<ipc::capnp::messages::BlockTemplate::GetBlockHeaderResults>>, mp::ReadDestUpdate<CBlockHeader>>(mp::TypeList<CBlockHeader>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::Result, 18>, capnp::Response<ipc::capnp::messages::BlockTemplate::GetBlockHeaderResults>>&&, mp::ReadDestUpdate<CBlockHeader>&&) requires Unserializable<CBlockHeader, DataStream> && !ipc::capnp::Deserializable<CBlockHeader> Unexecuted instantiation: decltype(auto) mp::CustomReadField<CBlock, mp::StructField<mp::Accessor<mp::mining_fields::Result, 18>, capnp::Response<ipc::capnp::messages::BlockTemplate::GetBlockResults>>, mp::ReadDestUpdate<CBlock>>(mp::TypeList<CBlock>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::Result, 18>, capnp::Response<ipc::capnp::messages::BlockTemplate::GetBlockResults>>&&, mp::ReadDestUpdate<CBlock>&&) requires Unserializable<CBlock, DataStream> && !ipc::capnp::Deserializable<CBlock> Unexecuted instantiation: decltype(auto) mp::CustomReadField<uint256, mp::StructField<mp::Accessor<mp::mining_fields::Witness, 19>, ipc::capnp::messages::CoinbaseTx::Reader const>&, mp::ReadDestUpdate<uint256>>(mp::TypeList<uint256>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::Witness, 19>, ipc::capnp::messages::CoinbaseTx::Reader const>&, mp::ReadDestUpdate<uint256>&&) requires Unserializable<uint256, DataStream> && !ipc::capnp::Deserializable<uint256> Unexecuted instantiation: decltype(auto) mp::CustomReadField<uint256, mp::StructField<mp::Accessor<mp::mining_fields::Witness, 19>, ipc::capnp::messages::CoinbaseTx::Reader const>&, mp::ReadDestEmplace<uint256, auto decltype(auto) mp::CustomReadField<uint256, mp::StructField<mp::Accessor<mp::mining_fields::Witness, 19>, ipc::capnp::messages::CoinbaseTx::Reader const>, mp::ReadDestUpdate<std::optional<uint256>>>(mp::TypeList<std::optional<uint256>>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::Witness, 19>, ipc::capnp::messages::CoinbaseTx::Reader const>&&, mp::ReadDestUpdate<std::optional<uint256>>&&)::'lambda'(uint256&)::operator()<std::optional<uint256>>(uint256&) const::'lambda'(auto&&...)>>(mp::TypeList<uint256>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::Witness, 19>, ipc::capnp::messages::CoinbaseTx::Reader const>&&, mp::ReadDestUpdate<std::optional<uint256>>&&) requires Unserializable<uint256, DataStream> && !ipc::capnp::Deserializable<uint256> Unexecuted instantiation: decltype(auto) mp::CustomReadField<CTxOut, mp::ValueField<capnp::Data::Reader>, mp::ReadDestEmplace<CTxOut, auto decltype(auto) mp::CustomReadField<CTxOut, mp::StructField<mp::Accessor<mp::mining_fields::RequiredOutputs, 19>, ipc::capnp::messages::CoinbaseTx::Reader const>, mp::ReadDestUpdate<std::vector<CTxOut, std::allocator<CTxOut>>>>(mp::TypeList<std::vector<CTxOut, std::allocator<CTxOut>>>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::RequiredOutputs, 19>, ipc::capnp::messages::CoinbaseTx::Reader const>&&, mp::ReadDestUpdate<std::vector<CTxOut, std::allocator<CTxOut>>>&&)::'lambda'(CTxOut&)::operator()<std::vector<CTxOut, std::allocator<CTxOut>>>(CTxOut&) const::'lambda'(auto&&...)>>(mp::TypeList<CTxOut>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::RequiredOutputs, 19>, ipc::capnp::messages::CoinbaseTx::Reader const>&&, mp::ReadDestUpdate<std::vector<CTxOut, std::allocator<CTxOut>>>&&) requires Unserializable<CTxOut, DataStream> && !ipc::capnp::Deserializable<CTxOut> Unexecuted instantiation: decltype(auto) mp::CustomReadField<uint256, mp::ValueField<capnp::Data::Reader>, mp::ReadDestEmplace<uint256, auto decltype(auto) mp::CustomReadField<uint256, mp::StructField<mp::Accessor<mp::mining_fields::Result, 18>, capnp::Response<ipc::capnp::messages::BlockTemplate::GetCoinbaseMerklePathResults>>, mp::ReadDestUpdate<std::vector<uint256, std::allocator<uint256>>>>(mp::TypeList<std::vector<uint256, std::allocator<uint256>>>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::Result, 18>, capnp::Response<ipc::capnp::messages::BlockTemplate::GetCoinbaseMerklePathResults>>&&, mp::ReadDestUpdate<std::vector<uint256, std::allocator<uint256>>>&&)::'lambda'(uint256&)::operator()<std::vector<uint256, std::allocator<uint256>>>(uint256&) const::'lambda'(auto&&...)>>(mp::TypeList<uint256>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::Result, 18>, capnp::Response<ipc::capnp::messages::BlockTemplate::GetCoinbaseMerklePathResults>>&&, mp::ReadDestUpdate<std::vector<uint256, std::allocator<uint256>>>&&) requires Unserializable<uint256, DataStream> && !ipc::capnp::Deserializable<uint256> Unexecuted instantiation: decltype(auto) mp::CustomReadField<uint256, mp::StructField<mp::Accessor<mp::mining_fields::CurrentTip, 17>, ipc::capnp::messages::Mining::WaitTipChangedParams::Reader const>, mp::ReadDestEmplace<uint256, void mp::PassField<mp::Accessor<mp::mining_fields::CurrentTip, 17>, uint256, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Mining>, capnp::CallContext<ipc::capnp::messages::Mining::WaitTipChangedParams, ipc::capnp::messages::Mining::WaitTipChangedResults>>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Timeout, 1>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 18>, mp::ServerCall>> const&, mp::TypeList<std::chrono::duration<double, std::ratio<1l, 1000l>>>>(mp::Priority<0>, mp::TypeList<uint256>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Mining>, capnp::CallContext<ipc::capnp::messages::Mining::WaitTipChangedParams, ipc::capnp::messages::Mining::WaitTipChangedResults>>&, mp::ServerField<1, mp::Accessor<mp::mining_fields::Timeout, 1>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 18>, mp::ServerCall>> const&, mp::TypeList<std::chrono::duration<double, std::ratio<1l, 1000l>>>&&)::'lambda'(auto&&...)>>(mp::TypeList<uint256>, mp::Priority<1>, mp::InvokeContext&, uint256&&, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Mining>, capnp::CallContext<ipc::capnp::messages::Mining::WaitTipChangedParams, ipc::capnp::messages::Mining::WaitTipChangedResults>>&&) requires Unserializable<uint256, DataStream> && !ipc::capnp::Deserializable<uint256> Unexecuted instantiation: decltype(auto) mp::CustomReadField<CBlock, mp::StructField<mp::Accessor<mp::mining_fields::Block, 17>, ipc::capnp::messages::Mining::CheckBlockParams::Reader const>, mp::ReadDestEmplace<CBlock, void mp::PassField<mp::Accessor<mp::mining_fields::Block, 17>, CBlock const&, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Mining>, capnp::CallContext<ipc::capnp::messages::Mining::CheckBlockParams, ipc::capnp::messages::Mining::CheckBlockResults>>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Reason, 18>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Debug, 18>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 2>, mp::ServerCall>>>> const&, mp::TypeList<node::BlockCheckOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>&>>(mp::Priority<0>, mp::TypeList<CBlock const&>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Mining>, capnp::CallContext<ipc::capnp::messages::Mining::CheckBlockParams, ipc::capnp::messages::Mining::CheckBlockResults>>&, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Reason, 18>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Debug, 18>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 2>, mp::ServerCall>>>> const&, mp::TypeList<node::BlockCheckOptions const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>&>&&)::'lambda'(auto&&...)>>(mp::TypeList<CBlock>, mp::Priority<1>, mp::InvokeContext&, CBlock const&, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Mining>, capnp::CallContext<ipc::capnp::messages::Mining::CheckBlockParams, ipc::capnp::messages::Mining::CheckBlockResults>>&&) requires Unserializable<CBlock, DataStream> && !ipc::capnp::Deserializable<CBlock> |
94 | | |
95 | | //! Overload multiprocess library's CustomReadField hook to allow any object |
96 | | //! with a deserialize constructor to be read from a capnproto Data field or |
97 | | //! returned from capnproto interface. Use Priority<1> so this hook has medium |
98 | | //! priority, and higher priority hooks could take precedence over this one. |
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 | 2 | { |
103 | 2 | assert(input.has()); |
104 | 2 | auto data = input.get(); |
105 | 2 | SpanReader stream({data.begin(), data.end()}); |
106 | 2 | auto wrapper{ipc::capnp::Wrap(stream)}; |
107 | 2 | return read_dest.construct(::deserialize, wrapper); |
108 | 2 | } decltype(auto) mp::CustomReadField<CTransaction, mp::StructField<mp::Accessor<mp::ipc_test_fields::Result, 18>, capnp::Response<gen::FooInterface::PassTransactionResults>>, mp::ReadDestEmplace<CTransaction, auto decltype(auto) mp::CustomReadField<CTransaction, mp::StructField<mp::Accessor<mp::ipc_test_fields::Result, 18>, capnp::Response<gen::FooInterface::PassTransactionResults>>, mp::ReadDestUpdate<std::shared_ptr<CTransaction const>>>(mp::TypeList<std::shared_ptr<CTransaction const>>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::ipc_test_fields::Result, 18>, capnp::Response<gen::FooInterface::PassTransactionResults>>&&, mp::ReadDestUpdate<std::shared_ptr<CTransaction const>>&&)::'lambda'(CTransaction&)::operator()<std::shared_ptr<CTransaction const>>(CTransaction&) const::'lambda'(auto&&...)>>(mp::TypeList<CTransaction>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::ipc_test_fields::Result, 18>, capnp::Response<gen::FooInterface::PassTransactionResults>>&&, mp::ReadDestUpdate<std::shared_ptr<CTransaction const>>&&) requires ipc::capnp::Deserializable<CTransaction> Line | Count | Source | 102 | 1 | { | 103 | 1 | assert(input.has()); | 104 | 1 | auto data = input.get(); | 105 | 1 | SpanReader stream({data.begin(), data.end()}); | 106 | 1 | auto wrapper{ipc::capnp::Wrap(stream)}; | 107 | 1 | return read_dest.construct(::deserialize, wrapper); | 108 | 1 | } |
decltype(auto) mp::CustomReadField<CTransaction, mp::StructField<mp::Accessor<mp::ipc_test_fields::Arg, 17>, gen::FooInterface::PassTransactionParams::Reader const>, mp::ReadDestEmplace<CTransaction, auto decltype(auto) mp::CustomReadField<CTransaction, mp::StructField<mp::Accessor<mp::ipc_test_fields::Arg, 17>, gen::FooInterface::PassTransactionParams::Reader const>, mp::ReadDestEmplace<std::shared_ptr<CTransaction const>, void mp::PassField<mp::Accessor<mp::ipc_test_fields::Arg, 17>, std::shared_ptr<CTransaction const>, mp::ServerInvokeContext<mp::ProxyServer<gen::FooInterface>, capnp::CallContext<gen::FooInterface::PassTransactionParams, gen::FooInterface::PassTransactionResults>>, mp::ServerRet<mp::Accessor<mp::ipc_test_fields::Result, 18>, mp::ServerCall> const&, mp::TypeList<>>(mp::Priority<0>, mp::TypeList<std::shared_ptr<CTransaction const>>, mp::ServerInvokeContext<mp::ProxyServer<gen::FooInterface>, capnp::CallContext<gen::FooInterface::PassTransactionParams, gen::FooInterface::PassTransactionResults>>&, mp::ServerRet<mp::Accessor<mp::ipc_test_fields::Result, 18>, mp::ServerCall> const&, mp::TypeList<>&&)::'lambda'(auto&&...)>>(mp::TypeList<std::shared_ptr<CTransaction const>>, mp::Priority<1>, mp::InvokeContext&, std::shared_ptr<CTransaction const>&&, mp::ServerInvokeContext<mp::ProxyServer<gen::FooInterface>, capnp::CallContext<gen::FooInterface::PassTransactionParams, gen::FooInterface::PassTransactionResults>>&&)::'lambda'(CTransaction&)::operator()<std::shared_ptr<CTransaction const>>(CTransaction&) const::'lambda'(auto&&...)>>(mp::TypeList<CTransaction>, mp::Priority<1>, mp::InvokeContext&, std::shared_ptr<CTransaction const>&&, mp::ServerInvokeContext<mp::ProxyServer<gen::FooInterface>, capnp::CallContext<gen::FooInterface::PassTransactionParams, gen::FooInterface::PassTransactionResults>>&&) requires ipc::capnp::Deserializable<CTransaction> Line | Count | Source | 102 | 1 | { | 103 | 1 | assert(input.has()); | 104 | 1 | auto data = input.get(); | 105 | 1 | SpanReader stream({data.begin(), data.end()}); | 106 | 1 | auto wrapper{ipc::capnp::Wrap(stream)}; | 107 | 1 | return read_dest.construct(::deserialize, wrapper); | 108 | 1 | } |
Unexecuted instantiation: decltype(auto) mp::CustomReadField<CTransaction, mp::StructField<mp::Accessor<mp::mining_fields::Coinbase, 17>, ipc::capnp::messages::BlockTemplate::SubmitSolutionParams::Reader const>, mp::ReadDestEmplace<CTransaction, auto decltype(auto) mp::CustomReadField<CTransaction, mp::StructField<mp::Accessor<mp::mining_fields::Coinbase, 17>, ipc::capnp::messages::BlockTemplate::SubmitSolutionParams::Reader const>, mp::ReadDestEmplace<std::shared_ptr<CTransaction const>, void mp::PassField<mp::Accessor<mp::mining_fields::Coinbase, 17>, std::shared_ptr<CTransaction const>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::SubmitSolutionParams, ipc::capnp::messages::BlockTemplate::SubmitSolutionResults>>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 2>, mp::ServerCall> const&, mp::TypeList<>, unsigned int, unsigned int, unsigned int>(mp::Priority<0>, mp::TypeList<std::shared_ptr<CTransaction const>>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::SubmitSolutionParams, ipc::capnp::messages::BlockTemplate::SubmitSolutionResults>>&, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 2>, mp::ServerCall> const&, mp::TypeList<>&&, unsigned int&&, unsigned int&&, unsigned int&&)::'lambda'(auto&&...)>>(mp::TypeList<std::shared_ptr<CTransaction const>>, mp::Priority<1>, mp::InvokeContext&, std::shared_ptr<CTransaction const>&&, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::SubmitSolutionParams, ipc::capnp::messages::BlockTemplate::SubmitSolutionResults>>&&)::'lambda'(CTransaction&)::operator()<std::shared_ptr<CTransaction const>>(CTransaction&) const::'lambda'(auto&&...)>>(mp::TypeList<CTransaction>, mp::Priority<1>, mp::InvokeContext&, std::shared_ptr<CTransaction const>&&, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::SubmitSolutionParams, ipc::capnp::messages::BlockTemplate::SubmitSolutionResults>>&&) requires ipc::capnp::Deserializable<CTransaction> |
109 | | |
110 | | //! Overload CustomBuildField and CustomReadField to serialize UniValue |
111 | | //! parameters and return values as JSON strings. |
112 | | template <typename Value, typename Output> |
113 | | void CustomBuildField(TypeList<UniValue>, Priority<1>, InvokeContext& invoke_context, Value&& value, Output&& output) |
114 | 10 | { |
115 | 10 | std::string str = value.write(); |
116 | 10 | auto result = output.init(str.size()); |
117 | 10 | memcpy(result.begin(), str.data(), str.size()); |
118 | 10 | } void mp::CustomBuildField<UniValue, mp::StructField<mp::Accessor<mp::ipc_test_fields::Arg, 17>, capnp::Request<gen::FooInterface::PassUniValueParams, gen::FooInterface::PassUniValueResults>>>(mp::TypeList<UniValue>, mp::Priority<1>, mp::InvokeContext&, UniValue&&, mp::StructField<mp::Accessor<mp::ipc_test_fields::Arg, 17>, capnp::Request<gen::FooInterface::PassUniValueParams, gen::FooInterface::PassUniValueResults>>&&) Line | Count | Source | 114 | 1 | { | 115 | 1 | std::string str = value.write(); | 116 | 1 | auto result = output.init(str.size()); | 117 | 1 | memcpy(result.begin(), str.data(), str.size()); | 118 | 1 | } |
void mp::CustomBuildField<UniValue, mp::StructField<mp::Accessor<mp::ipc_test_fields::Result, 18>, gen::FooInterface::PassUniValueResults::Builder>&>(mp::TypeList<UniValue>, mp::Priority<1>, mp::InvokeContext&, UniValue&&, mp::StructField<mp::Accessor<mp::ipc_test_fields::Result, 18>, gen::FooInterface::PassUniValueResults::Builder>&) Line | Count | Source | 114 | 1 | { | 115 | 1 | std::string str = value.write(); | 116 | 1 | auto result = output.init(str.size()); | 117 | 1 | memcpy(result.begin(), str.data(), str.size()); | 118 | 1 | } |
void mp::CustomBuildField<UniValue, mp::StructField<mp::Accessor<mp::rpc_fields::Request, 17>, capnp::Request<ipc::capnp::messages::Rpc::ExecuteRpcParams, ipc::capnp::messages::Rpc::ExecuteRpcResults>>>(mp::TypeList<UniValue>, mp::Priority<1>, mp::InvokeContext&, UniValue&&, mp::StructField<mp::Accessor<mp::rpc_fields::Request, 17>, capnp::Request<ipc::capnp::messages::Rpc::ExecuteRpcParams, ipc::capnp::messages::Rpc::ExecuteRpcResults>>&&) Line | Count | Source | 114 | 4 | { | 115 | 4 | std::string str = value.write(); | 116 | 4 | auto result = output.init(str.size()); | 117 | 4 | memcpy(result.begin(), str.data(), str.size()); | 118 | 4 | } |
void mp::CustomBuildField<UniValue, mp::StructField<mp::Accessor<mp::rpc_fields::Result, 18>, ipc::capnp::messages::Rpc::ExecuteRpcResults::Builder>&>(mp::TypeList<UniValue>, mp::Priority<1>, mp::InvokeContext&, UniValue&&, mp::StructField<mp::Accessor<mp::rpc_fields::Result, 18>, ipc::capnp::messages::Rpc::ExecuteRpcResults::Builder>&) Line | Count | Source | 114 | 4 | { | 115 | 4 | std::string str = value.write(); | 116 | 4 | auto result = output.init(str.size()); | 117 | 4 | memcpy(result.begin(), str.data(), str.size()); | 118 | 4 | } |
|
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 | 10 | { |
124 | 10 | return read_dest.update([&](auto& value) { |
125 | 10 | auto data = input.get(); |
126 | 10 | value.read(std::string_view{data.begin(), data.size()}); |
127 | 10 | }); auto decltype(auto) mp::CustomReadField<mp::StructField<mp::Accessor<mp::ipc_test_fields::Result, 18>, capnp::Response<gen::FooInterface::PassUniValueResults>>, mp::ReadDestUpdate<UniValue>>(mp::TypeList<UniValue>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::ipc_test_fields::Result, 18>, capnp::Response<gen::FooInterface::PassUniValueResults>>&&, mp::ReadDestUpdate<UniValue>&&)::'lambda'(mp::StructField<mp::Accessor<mp::ipc_test_fields::Result, 18>, capnp::Response<gen::FooInterface::PassUniValueResults>>&)::operator()<UniValue>(mp::StructField<mp::Accessor<mp::ipc_test_fields::Result, 18>, capnp::Response<gen::FooInterface::PassUniValueResults>>&) const Line | Count | Source | 124 | 1 | return read_dest.update([&](auto& value) { | 125 | 1 | auto data = input.get(); | 126 | 1 | value.read(std::string_view{data.begin(), data.size()}); | 127 | 1 | }); |
auto decltype(auto) mp::CustomReadField<mp::StructField<mp::Accessor<mp::ipc_test_fields::Arg, 17>, gen::FooInterface::PassUniValueParams::Reader const>, mp::ReadDestEmplace<UniValue, void mp::PassField<mp::Accessor<mp::ipc_test_fields::Arg, 17>, UniValue, mp::ServerInvokeContext<mp::ProxyServer<gen::FooInterface>, capnp::CallContext<gen::FooInterface::PassUniValueParams, gen::FooInterface::PassUniValueResults>>, mp::ServerRet<mp::Accessor<mp::ipc_test_fields::Result, 18>, mp::ServerCall> const&, mp::TypeList<>>(mp::Priority<0>, mp::TypeList<UniValue>, mp::ServerInvokeContext<mp::ProxyServer<gen::FooInterface>, capnp::CallContext<gen::FooInterface::PassUniValueParams, gen::FooInterface::PassUniValueResults>>&, mp::ServerRet<mp::Accessor<mp::ipc_test_fields::Result, 18>, mp::ServerCall> const&, mp::TypeList<>&&)::'lambda'(auto&&...)>>(mp::TypeList<UniValue>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::ipc_test_fields::Arg, 17>, gen::FooInterface::PassUniValueParams::Reader const>&&, UniValue&&)::'lambda'(mp::StructField<mp::Accessor<mp::ipc_test_fields::Arg, 17>, gen::FooInterface::PassUniValueParams::Reader const>&)::operator()<UniValue>(mp::StructField<mp::Accessor<mp::ipc_test_fields::Arg, 17>, gen::FooInterface::PassUniValueParams::Reader const>&) const Line | Count | Source | 124 | 1 | return read_dest.update([&](auto& value) { | 125 | 1 | auto data = input.get(); | 126 | 1 | value.read(std::string_view{data.begin(), data.size()}); | 127 | 1 | }); |
auto decltype(auto) mp::CustomReadField<mp::StructField<mp::Accessor<mp::rpc_fields::Result, 18>, capnp::Response<ipc::capnp::messages::Rpc::ExecuteRpcResults>>, mp::ReadDestUpdate<UniValue>>(mp::TypeList<UniValue>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::rpc_fields::Result, 18>, capnp::Response<ipc::capnp::messages::Rpc::ExecuteRpcResults>>&&, mp::ReadDestUpdate<UniValue>&&)::'lambda'(mp::StructField<mp::Accessor<mp::rpc_fields::Result, 18>, capnp::Response<ipc::capnp::messages::Rpc::ExecuteRpcResults>>&)::operator()<UniValue>(mp::StructField<mp::Accessor<mp::rpc_fields::Result, 18>, capnp::Response<ipc::capnp::messages::Rpc::ExecuteRpcResults>>&) const Line | Count | Source | 124 | 4 | return read_dest.update([&](auto& value) { | 125 | 4 | auto data = input.get(); | 126 | 4 | value.read(std::string_view{data.begin(), data.size()}); | 127 | 4 | }); |
auto decltype(auto) mp::CustomReadField<mp::StructField<mp::Accessor<mp::rpc_fields::Request, 17>, ipc::capnp::messages::Rpc::ExecuteRpcParams::Reader const>, mp::ReadDestEmplace<UniValue, void mp::PassField<mp::Accessor<mp::rpc_fields::Request, 17>, UniValue, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Rpc>, capnp::CallContext<ipc::capnp::messages::Rpc::ExecuteRpcParams, ipc::capnp::messages::Rpc::ExecuteRpcResults>>, mp::ServerField<1, mp::Accessor<mp::rpc_fields::Uri, 17>, mp::ServerField<1, mp::Accessor<mp::rpc_fields::User, 17>, mp::ServerRet<mp::Accessor<mp::rpc_fields::Result, 18>, mp::ServerCall>>> const&, mp::TypeList<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>>(mp::Priority<0>, mp::TypeList<UniValue>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Rpc>, capnp::CallContext<ipc::capnp::messages::Rpc::ExecuteRpcParams, ipc::capnp::messages::Rpc::ExecuteRpcResults>>&, mp::ServerField<1, mp::Accessor<mp::rpc_fields::Uri, 17>, mp::ServerField<1, mp::Accessor<mp::rpc_fields::User, 17>, mp::ServerRet<mp::Accessor<mp::rpc_fields::Result, 18>, mp::ServerCall>>> const&, mp::TypeList<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>&&)::'lambda'(auto&&...)>>(mp::TypeList<UniValue>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::rpc_fields::Request, 17>, ipc::capnp::messages::Rpc::ExecuteRpcParams::Reader const>&&, UniValue&&)::'lambda'(mp::StructField<mp::Accessor<mp::rpc_fields::Request, 17>, ipc::capnp::messages::Rpc::ExecuteRpcParams::Reader const>&)::operator()<UniValue>(mp::StructField<mp::Accessor<mp::rpc_fields::Request, 17>, ipc::capnp::messages::Rpc::ExecuteRpcParams::Reader const>&) const Line | Count | Source | 124 | 4 | return read_dest.update([&](auto& value) { | 125 | 4 | auto data = input.get(); | 126 | 4 | value.read(std::string_view{data.begin(), data.size()}); | 127 | 4 | }); |
|
128 | 10 | } decltype(auto) mp::CustomReadField<mp::StructField<mp::Accessor<mp::ipc_test_fields::Result, 18>, capnp::Response<gen::FooInterface::PassUniValueResults>>, mp::ReadDestUpdate<UniValue>>(mp::TypeList<UniValue>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::ipc_test_fields::Result, 18>, capnp::Response<gen::FooInterface::PassUniValueResults>>&&, mp::ReadDestUpdate<UniValue>&&) Line | Count | Source | 123 | 1 | { | 124 | 1 | return read_dest.update([&](auto& value) { | 125 | 1 | auto data = input.get(); | 126 | 1 | value.read(std::string_view{data.begin(), data.size()}); | 127 | 1 | }); | 128 | 1 | } |
decltype(auto) mp::CustomReadField<mp::StructField<mp::Accessor<mp::ipc_test_fields::Arg, 17>, gen::FooInterface::PassUniValueParams::Reader const>, mp::ReadDestEmplace<UniValue, void mp::PassField<mp::Accessor<mp::ipc_test_fields::Arg, 17>, UniValue, mp::ServerInvokeContext<mp::ProxyServer<gen::FooInterface>, capnp::CallContext<gen::FooInterface::PassUniValueParams, gen::FooInterface::PassUniValueResults>>, mp::ServerRet<mp::Accessor<mp::ipc_test_fields::Result, 18>, mp::ServerCall> const&, mp::TypeList<>>(mp::Priority<0>, mp::TypeList<UniValue>, mp::ServerInvokeContext<mp::ProxyServer<gen::FooInterface>, capnp::CallContext<gen::FooInterface::PassUniValueParams, gen::FooInterface::PassUniValueResults>>&, mp::ServerRet<mp::Accessor<mp::ipc_test_fields::Result, 18>, mp::ServerCall> const&, mp::TypeList<>&&)::'lambda'(auto&&...)>>(mp::TypeList<UniValue>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::ipc_test_fields::Arg, 17>, gen::FooInterface::PassUniValueParams::Reader const>&&, UniValue&&) Line | Count | Source | 123 | 1 | { | 124 | 1 | return read_dest.update([&](auto& value) { | 125 | 1 | auto data = input.get(); | 126 | 1 | value.read(std::string_view{data.begin(), data.size()}); | 127 | 1 | }); | 128 | 1 | } |
decltype(auto) mp::CustomReadField<mp::StructField<mp::Accessor<mp::rpc_fields::Result, 18>, capnp::Response<ipc::capnp::messages::Rpc::ExecuteRpcResults>>, mp::ReadDestUpdate<UniValue>>(mp::TypeList<UniValue>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::rpc_fields::Result, 18>, capnp::Response<ipc::capnp::messages::Rpc::ExecuteRpcResults>>&&, mp::ReadDestUpdate<UniValue>&&) Line | Count | Source | 123 | 4 | { | 124 | 4 | return read_dest.update([&](auto& value) { | 125 | 4 | auto data = input.get(); | 126 | 4 | value.read(std::string_view{data.begin(), data.size()}); | 127 | 4 | }); | 128 | 4 | } |
decltype(auto) mp::CustomReadField<mp::StructField<mp::Accessor<mp::rpc_fields::Request, 17>, ipc::capnp::messages::Rpc::ExecuteRpcParams::Reader const>, mp::ReadDestEmplace<UniValue, void mp::PassField<mp::Accessor<mp::rpc_fields::Request, 17>, UniValue, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Rpc>, capnp::CallContext<ipc::capnp::messages::Rpc::ExecuteRpcParams, ipc::capnp::messages::Rpc::ExecuteRpcResults>>, mp::ServerField<1, mp::Accessor<mp::rpc_fields::Uri, 17>, mp::ServerField<1, mp::Accessor<mp::rpc_fields::User, 17>, mp::ServerRet<mp::Accessor<mp::rpc_fields::Result, 18>, mp::ServerCall>>> const&, mp::TypeList<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>>(mp::Priority<0>, mp::TypeList<UniValue>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Rpc>, capnp::CallContext<ipc::capnp::messages::Rpc::ExecuteRpcParams, ipc::capnp::messages::Rpc::ExecuteRpcResults>>&, mp::ServerField<1, mp::Accessor<mp::rpc_fields::Uri, 17>, mp::ServerField<1, mp::Accessor<mp::rpc_fields::User, 17>, mp::ServerRet<mp::Accessor<mp::rpc_fields::Result, 18>, mp::ServerCall>>> const&, mp::TypeList<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>&&)::'lambda'(auto&&...)>>(mp::TypeList<UniValue>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::rpc_fields::Request, 17>, ipc::capnp::messages::Rpc::ExecuteRpcParams::Reader const>&&, UniValue&&) Line | Count | Source | 123 | 4 | { | 124 | 4 | return read_dest.update([&](auto& value) { | 125 | 4 | auto data = input.get(); | 126 | 4 | value.read(std::string_view{data.begin(), data.size()}); | 127 | 4 | }); | 128 | 4 | } |
|
129 | | |
130 | | } // namespace mp |
131 | | |
132 | | #endif // BITCOIN_IPC_CAPNP_COMMON_TYPES_H |