Coverage Report

Created: 2026-05-06 07:53

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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