Coverage Report

Created: 2026-05-06 07:53

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/tmp/bitcoin/src/ipc/libmultiprocess/include/mp/type-number.h
Line
Count
Source
1
// Copyright (c) The Bitcoin Core developers
2
// Distributed under the MIT software license, see the accompanying
3
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5
#ifndef MP_PROXY_TYPE_NUMBER_H
6
#define MP_PROXY_TYPE_NUMBER_H
7
8
#include <mp/util.h>
9
10
namespace mp {
11
template <typename LocalType, typename Value>
12
LocalType BuildPrimitive(InvokeContext& invoke_context,
13
    const Value& value,
14
    TypeList<LocalType>,
15
    typename std::enable_if<std::is_enum<Value>::value>::type* enable = nullptr)
16
{
17
    using E = std::make_unsigned_t<std::underlying_type_t<Value>>;
18
    using T = std::make_unsigned_t<LocalType>;
19
    static_assert(std::numeric_limits<T>::max() >= std::numeric_limits<E>::max(), "mismatched integral/enum types");
20
    return static_cast<LocalType>(value);
21
}
22
23
template <typename LocalType, typename Value>
24
LocalType BuildPrimitive(InvokeContext& invoke_context,
25
    const Value& value,
26
    TypeList<LocalType>,
27
    typename std::enable_if<std::is_integral<Value>::value, int>::type* enable = nullptr)
28
3
{
29
3
    static_assert(
30
3
        std::numeric_limits<LocalType>::lowest() <= std::numeric_limits<Value>::lowest(), "mismatched integral types");
31
3
    static_assert(
32
3
        std::numeric_limits<LocalType>::max() >= std::numeric_limits<Value>::max(), "mismatched integral types");
33
3
    return value;
34
3
}
int mp::BuildPrimitive<int, int>(mp::InvokeContext&, int const&, mp::TypeList<int>, std::enable_if<std::is_integral<int>::value, int>::type*)
Line
Count
Source
28
3
{
29
3
    static_assert(
30
3
        std::numeric_limits<LocalType>::lowest() <= std::numeric_limits<Value>::lowest(), "mismatched integral types");
31
3
    static_assert(
32
3
        std::numeric_limits<LocalType>::max() >= std::numeric_limits<Value>::max(), "mismatched integral types");
33
3
    return value;
34
3
}
Unexecuted instantiation: unsigned long mp::BuildPrimitive<unsigned long, unsigned long>(mp::InvokeContext&, unsigned long const&, mp::TypeList<unsigned long>, std::enable_if<std::is_integral<unsigned long>::value, int>::type*)
Unexecuted instantiation: unsigned int mp::BuildPrimitive<unsigned int, unsigned int>(mp::InvokeContext&, unsigned int const&, mp::TypeList<unsigned int>, std::enable_if<std::is_integral<unsigned int>::value, int>::type*)
Unexecuted instantiation: long mp::BuildPrimitive<long, long>(mp::InvokeContext&, long const&, mp::TypeList<long>, std::enable_if<std::is_integral<long>::value, int>::type*)
35
36
template <typename LocalType, typename Value>
37
LocalType BuildPrimitive(InvokeContext& invoke_context,
38
    const Value& value,
39
    TypeList<LocalType>,
40
    typename std::enable_if<std::is_floating_point<Value>::value>::type* enable = nullptr)
41
{
42
    static_assert(std::is_same<Value, LocalType>::value,
43
        "mismatched floating point types. please fix message.capnp type declaration to match wrapped interface");
44
    return value;
45
}
46
47
template <typename LocalType, typename Input, typename ReadDest>
48
decltype(auto) CustomReadField(TypeList<LocalType>,
49
    Priority<1>,
50
    InvokeContext& invoke_context,
51
    Input&& input,
52
    ReadDest&& read_dest,
53
    typename std::enable_if<std::is_enum<LocalType>::value>::type* enable = nullptr)
54
{
55
    // Disable clang-tidy out-of-range enum value check which triggers when
56
    // using an enum type that does not have a 0 value. The check correctly
57
    // triggers when it detects that Cap'n Proto returns 0 when reading an
58
    // integer field that is unset. But the warning is spurious because the
59
    // corresponding BuildField call should never leave the field unset.
60
    // NOLINTNEXTLINE(clang-analyzer-optin.core.EnumCastOutOfRange)
61
    return read_dest.construct(static_cast<LocalType>(input.get()));
62
}
63
64
template <typename LocalType, typename Input, typename ReadDest>
65
decltype(auto) CustomReadField(TypeList<LocalType>,
66
    Priority<1>,
67
    InvokeContext& invoke_context,
68
    Input&& input,
69
    ReadDest&& read_dest,
70
    typename std::enable_if<std::is_integral<LocalType>::value>::type* enable = nullptr)
71
3
{
72
3
    auto value = input.get();
73
3
    if (value < std::numeric_limits<LocalType>::min() || value > std::numeric_limits<LocalType>::max()) {
74
0
        throw std::range_error("out of bound int received");
75
0
    }
76
3
    return read_dest.construct(static_cast<LocalType>(value));
77
3
}
decltype(auto) mp::CustomReadField<int, mp::StructField<mp::Accessor<mp::ipc_test_fields::Result, 2>, capnp::Response<gen::FooInterface::AddResults>>, mp::ReadDestUpdate<int>>(mp::TypeList<int>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::ipc_test_fields::Result, 2>, capnp::Response<gen::FooInterface::AddResults>>&&, mp::ReadDestUpdate<int>&&, std::enable_if<std::is_integral<int>::value, void>::type*)
Line
Count
Source
71
1
{
72
1
    auto value = input.get();
73
1
    if (value < std::numeric_limits<LocalType>::min() || value > std::numeric_limits<LocalType>::max()) {
74
0
        throw std::range_error("out of bound int received");
75
0
    }
76
1
    return read_dest.construct(static_cast<LocalType>(value));
77
1
}
decltype(auto) mp::CustomReadField<int, mp::StructField<mp::Accessor<mp::ipc_test_fields::A, 1>, gen::FooInterface::AddParams::Reader const>, mp::ReadDestEmplace<int, void mp::PassField<mp::Accessor<mp::ipc_test_fields::A, 1>, int, mp::ServerInvokeContext<mp::ProxyServer<gen::FooInterface>, capnp::CallContext<gen::FooInterface::AddParams, gen::FooInterface::AddResults>>, mp::ServerField<1, mp::Accessor<mp::ipc_test_fields::B, 1>, mp::ServerRet<mp::Accessor<mp::ipc_test_fields::Result, 2>, mp::ServerCall>> const&, mp::TypeList<int>>(mp::Priority<0>, mp::TypeList<int>, mp::ServerInvokeContext<mp::ProxyServer<gen::FooInterface>, capnp::CallContext<gen::FooInterface::AddParams, gen::FooInterface::AddResults>>&, mp::ServerField<1, mp::Accessor<mp::ipc_test_fields::B, 1>, mp::ServerRet<mp::Accessor<mp::ipc_test_fields::Result, 2>, mp::ServerCall>> const&, mp::TypeList<int>&&)::'lambda'(auto&&...)>>(mp::TypeList<int>, mp::Priority<1>, mp::InvokeContext&, int&&, mp::ServerInvokeContext<mp::ProxyServer<gen::FooInterface>, capnp::CallContext<gen::FooInterface::AddParams, gen::FooInterface::AddResults>>&&, std::enable_if<std::is_integral<int>::value, void>::type*)
Line
Count
Source
71
1
{
72
1
    auto value = input.get();
73
1
    if (value < std::numeric_limits<LocalType>::min() || value > std::numeric_limits<LocalType>::max()) {
74
0
        throw std::range_error("out of bound int received");
75
0
    }
76
1
    return read_dest.construct(static_cast<LocalType>(value));
77
1
}
decltype(auto) mp::CustomReadField<int, mp::StructField<mp::Accessor<mp::ipc_test_fields::B, 1>, gen::FooInterface::AddParams::Reader const>, mp::ReadDestEmplace<int, void mp::PassField<mp::Accessor<mp::ipc_test_fields::B, 1>, int, mp::ServerInvokeContext<mp::ProxyServer<gen::FooInterface>, capnp::CallContext<gen::FooInterface::AddParams, gen::FooInterface::AddResults>>, mp::ServerRet<mp::Accessor<mp::ipc_test_fields::Result, 2>, mp::ServerCall> const&, mp::TypeList<>, int>(mp::Priority<0>, mp::TypeList<int>, mp::ServerInvokeContext<mp::ProxyServer<gen::FooInterface>, capnp::CallContext<gen::FooInterface::AddParams, gen::FooInterface::AddResults>>&, mp::ServerRet<mp::Accessor<mp::ipc_test_fields::Result, 2>, mp::ServerCall> const&, mp::TypeList<>&&, int&&)::'lambda'(auto&&...)>>(mp::TypeList<int>, mp::Priority<1>, mp::InvokeContext&, int&&, mp::ServerInvokeContext<mp::ProxyServer<gen::FooInterface>, capnp::CallContext<gen::FooInterface::AddParams, gen::FooInterface::AddResults>>&&, std::enable_if<std::is_integral<int>::value, void>::type*)
Line
Count
Source
71
1
{
72
1
    auto value = input.get();
73
1
    if (value < std::numeric_limits<LocalType>::min() || value > std::numeric_limits<LocalType>::max()) {
74
0
        throw std::range_error("out of bound int received");
75
0
    }
76
1
    return read_dest.construct(static_cast<LocalType>(value));
77
1
}
Unexecuted instantiation: decltype(auto) mp::CustomReadField<bool, mp::StructField<mp::Accessor<mp::mining_fields::Result, 2>, capnp::Response<ipc::capnp::messages::Mining::IsTestChainResults>>, mp::ReadDestUpdate<bool>>(mp::TypeList<bool>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::Result, 2>, capnp::Response<ipc::capnp::messages::Mining::IsTestChainResults>>&&, mp::ReadDestUpdate<bool>&&, std::enable_if<std::is_integral<bool>::value, void>::type*)
Unexecuted instantiation: decltype(auto) mp::CustomReadField<bool, mp::StructField<mp::Accessor<mp::mining_fields::Result, 2>, capnp::Response<ipc::capnp::messages::Mining::IsInitialBlockDownloadResults>>, mp::ReadDestUpdate<bool>>(mp::TypeList<bool>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::Result, 2>, capnp::Response<ipc::capnp::messages::Mining::IsInitialBlockDownloadResults>>&&, mp::ReadDestUpdate<bool>&&, std::enable_if<std::is_integral<bool>::value, void>::type*)
Unexecuted instantiation: decltype(auto) mp::CustomReadField<int, mp::StructField<mp::Accessor<mp::common_fields::Height, 3>, ipc::capnp::messages::BlockRef::Reader const>, mp::ReadDestUpdate<int>>(mp::TypeList<int>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::common_fields::Height, 3>, ipc::capnp::messages::BlockRef::Reader const>&&, mp::ReadDestUpdate<int>&&, std::enable_if<std::is_integral<int>::value, void>::type*)
Unexecuted instantiation: decltype(auto) mp::CustomReadField<bool, mp::StructField<mp::Accessor<mp::mining_fields::Result, 2>, capnp::Response<ipc::capnp::messages::Mining::CheckBlockResults>>, mp::ReadDestUpdate<bool>>(mp::TypeList<bool>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::Result, 2>, capnp::Response<ipc::capnp::messages::Mining::CheckBlockResults>>&&, mp::ReadDestUpdate<bool>&&, std::enable_if<std::is_integral<bool>::value, void>::type*)
Unexecuted instantiation: decltype(auto) mp::CustomReadField<long, mp::ValueField<long>, mp::ReadDestEmplace<long, auto decltype(auto) mp::CustomReadField<long, mp::StructField<mp::Accessor<mp::mining_fields::Result, 18>, capnp::Response<ipc::capnp::messages::BlockTemplate::GetTxFeesResults>>, mp::ReadDestUpdate<std::vector<long, std::allocator<long>>>>(mp::TypeList<std::vector<long, std::allocator<long>>>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::Result, 18>, capnp::Response<ipc::capnp::messages::BlockTemplate::GetTxFeesResults>>&&, mp::ReadDestUpdate<std::vector<long, std::allocator<long>>>&&)::'lambda'(long&)::operator()<std::vector<long, std::allocator<long>>>(long&) const::'lambda'(auto&&...)>>(mp::TypeList<long>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::Result, 18>, capnp::Response<ipc::capnp::messages::BlockTemplate::GetTxFeesResults>>&&, mp::ReadDestUpdate<std::vector<long, std::allocator<long>>>&&, std::enable_if<std::is_integral<long>::value, void>::type*)
Unexecuted instantiation: decltype(auto) mp::CustomReadField<long, mp::ValueField<long>, mp::ReadDestEmplace<long, auto decltype(auto) mp::CustomReadField<long, mp::StructField<mp::Accessor<mp::mining_fields::Result, 18>, capnp::Response<ipc::capnp::messages::BlockTemplate::GetTxSigopsResults>>, mp::ReadDestUpdate<std::vector<long, std::allocator<long>>>>(mp::TypeList<std::vector<long, std::allocator<long>>>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::Result, 18>, capnp::Response<ipc::capnp::messages::BlockTemplate::GetTxSigopsResults>>&&, mp::ReadDestUpdate<std::vector<long, std::allocator<long>>>&&)::'lambda'(long&)::operator()<std::vector<long, std::allocator<long>>>(long&) const::'lambda'(auto&&...)>>(mp::TypeList<long>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::Result, 18>, capnp::Response<ipc::capnp::messages::BlockTemplate::GetTxSigopsResults>>&&, mp::ReadDestUpdate<std::vector<long, std::allocator<long>>>&&, std::enable_if<std::is_integral<long>::value, void>::type*)
Unexecuted instantiation: decltype(auto) mp::CustomReadField<unsigned int, mp::StructField<mp::Accessor<mp::mining_fields::Version, 3>, ipc::capnp::messages::CoinbaseTx::Reader const>, mp::ReadDestUpdate<unsigned int>>(mp::TypeList<unsigned int>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::Version, 3>, ipc::capnp::messages::CoinbaseTx::Reader const>&&, mp::ReadDestUpdate<unsigned int>&&, std::enable_if<std::is_integral<unsigned int>::value, void>::type*)
Unexecuted instantiation: decltype(auto) mp::CustomReadField<unsigned int, mp::StructField<mp::Accessor<mp::mining_fields::Sequence, 3>, ipc::capnp::messages::CoinbaseTx::Reader const>, mp::ReadDestUpdate<unsigned int>>(mp::TypeList<unsigned int>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::Sequence, 3>, ipc::capnp::messages::CoinbaseTx::Reader const>&&, mp::ReadDestUpdate<unsigned int>&&, std::enable_if<std::is_integral<unsigned int>::value, void>::type*)
Unexecuted instantiation: decltype(auto) mp::CustomReadField<long, mp::StructField<mp::Accessor<mp::mining_fields::BlockRewardRemaining, 3>, ipc::capnp::messages::CoinbaseTx::Reader const>, mp::ReadDestUpdate<long>>(mp::TypeList<long>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::BlockRewardRemaining, 3>, ipc::capnp::messages::CoinbaseTx::Reader const>&&, mp::ReadDestUpdate<long>&&, std::enable_if<std::is_integral<long>::value, void>::type*)
Unexecuted instantiation: decltype(auto) mp::CustomReadField<unsigned int, mp::StructField<mp::Accessor<mp::mining_fields::LockTime, 3>, ipc::capnp::messages::CoinbaseTx::Reader const>, mp::ReadDestUpdate<unsigned int>>(mp::TypeList<unsigned int>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::LockTime, 3>, ipc::capnp::messages::CoinbaseTx::Reader const>&&, mp::ReadDestUpdate<unsigned int>&&, std::enable_if<std::is_integral<unsigned int>::value, void>::type*)
Unexecuted instantiation: decltype(auto) mp::CustomReadField<bool, mp::StructField<mp::Accessor<mp::mining_fields::Result, 2>, capnp::Response<ipc::capnp::messages::BlockTemplate::SubmitSolutionResults>>, mp::ReadDestUpdate<bool>>(mp::TypeList<bool>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::Result, 2>, capnp::Response<ipc::capnp::messages::BlockTemplate::SubmitSolutionResults>>&&, mp::ReadDestUpdate<bool>&&, std::enable_if<std::is_integral<bool>::value, void>::type*)
Unexecuted instantiation: decltype(auto) mp::CustomReadField<bool, mp::StructField<mp::Accessor<mp::mining_fields::UseMempool, 3>, ipc::capnp::messages::BlockCreateOptions::Reader const>, mp::ReadDestUpdate<bool>>(mp::TypeList<bool>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::UseMempool, 3>, ipc::capnp::messages::BlockCreateOptions::Reader const>&&, mp::ReadDestUpdate<bool>&&, std::enable_if<std::is_integral<bool>::value, void>::type*)
Unexecuted instantiation: decltype(auto) mp::CustomReadField<unsigned long, mp::StructField<mp::Accessor<mp::mining_fields::BlockReservedWeight, 3>, ipc::capnp::messages::BlockCreateOptions::Reader const>&, mp::ReadDestUpdate<unsigned long>>(mp::TypeList<unsigned long>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::BlockReservedWeight, 3>, ipc::capnp::messages::BlockCreateOptions::Reader const>&, mp::ReadDestUpdate<unsigned long>&&, std::enable_if<std::is_integral<unsigned long>::value, void>::type*)
Unexecuted instantiation: decltype(auto) mp::CustomReadField<unsigned long, mp::StructField<mp::Accessor<mp::mining_fields::BlockReservedWeight, 3>, ipc::capnp::messages::BlockCreateOptions::Reader const>&, mp::ReadDestEmplace<unsigned long, auto decltype(auto) mp::CustomReadField<unsigned long, mp::StructField<mp::Accessor<mp::mining_fields::BlockReservedWeight, 3>, ipc::capnp::messages::BlockCreateOptions::Reader const>, mp::ReadDestUpdate<std::optional<unsigned long>>>(mp::TypeList<std::optional<unsigned long>>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::BlockReservedWeight, 3>, ipc::capnp::messages::BlockCreateOptions::Reader const>&&, mp::ReadDestUpdate<std::optional<unsigned long>>&&)::'lambda'(unsigned long&)::operator()<std::optional<unsigned long>>(unsigned long&) const::'lambda'(auto&&...)>>(mp::TypeList<unsigned long>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::BlockReservedWeight, 3>, ipc::capnp::messages::BlockCreateOptions::Reader const>&&, mp::ReadDestUpdate<std::optional<unsigned long>>&&, std::enable_if<std::is_integral<unsigned long>::value, void>::type*)
Unexecuted instantiation: decltype(auto) mp::CustomReadField<unsigned long, mp::StructField<mp::Accessor<mp::mining_fields::CoinbaseOutputMaxAdditionalSigops, 3>, ipc::capnp::messages::BlockCreateOptions::Reader const>, mp::ReadDestUpdate<unsigned long>>(mp::TypeList<unsigned long>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::CoinbaseOutputMaxAdditionalSigops, 3>, ipc::capnp::messages::BlockCreateOptions::Reader const>&&, mp::ReadDestUpdate<unsigned long>&&, std::enable_if<std::is_integral<unsigned long>::value, void>::type*)
Unexecuted instantiation: decltype(auto) mp::CustomReadField<bool, mp::StructField<mp::Accessor<mp::mining_fields::Cooldown, 1>, ipc::capnp::messages::Mining::CreateNewBlockParams::Reader const>, mp::ReadDestEmplace<bool, void mp::PassField<mp::Accessor<mp::mining_fields::Cooldown, 1>, bool, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Mining>, capnp::CallContext<ipc::capnp::messages::Mining::CreateNewBlockParams, ipc::capnp::messages::Mining::CreateNewBlockResults>>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 18>, mp::ServerCall> const&, mp::TypeList<>, node::BlockCreateOptions const&>(mp::Priority<0>, mp::TypeList<bool>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Mining>, capnp::CallContext<ipc::capnp::messages::Mining::CreateNewBlockParams, ipc::capnp::messages::Mining::CreateNewBlockResults>>&, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 18>, mp::ServerCall> const&, mp::TypeList<>&&, node::BlockCreateOptions const&)::'lambda'(auto&&...)>>(mp::TypeList<bool>, mp::Priority<1>, mp::InvokeContext&, bool&&, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Mining>, capnp::CallContext<ipc::capnp::messages::Mining::CreateNewBlockParams, ipc::capnp::messages::Mining::CreateNewBlockResults>>&&, std::enable_if<std::is_integral<bool>::value, void>::type*)
Unexecuted instantiation: decltype(auto) mp::CustomReadField<bool, mp::StructField<mp::Accessor<mp::mining_fields::CheckMerkleRoot, 3>, ipc::capnp::messages::BlockCheckOptions::Reader const>, mp::ReadDestUpdate<bool>>(mp::TypeList<bool>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::CheckMerkleRoot, 3>, ipc::capnp::messages::BlockCheckOptions::Reader const>&&, mp::ReadDestUpdate<bool>&&, std::enable_if<std::is_integral<bool>::value, void>::type*)
Unexecuted instantiation: decltype(auto) mp::CustomReadField<bool, mp::StructField<mp::Accessor<mp::mining_fields::CheckPow, 3>, ipc::capnp::messages::BlockCheckOptions::Reader const>, mp::ReadDestUpdate<bool>>(mp::TypeList<bool>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::CheckPow, 3>, ipc::capnp::messages::BlockCheckOptions::Reader const>&&, mp::ReadDestUpdate<bool>&&, std::enable_if<std::is_integral<bool>::value, void>::type*)
Unexecuted instantiation: decltype(auto) mp::CustomReadField<unsigned int, mp::StructField<mp::Accessor<mp::mining_fields::Version, 1>, ipc::capnp::messages::BlockTemplate::SubmitSolutionParams::Reader const>, mp::ReadDestEmplace<unsigned int, void mp::PassField<mp::Accessor<mp::mining_fields::Version, 1>, unsigned int, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::SubmitSolutionParams, ipc::capnp::messages::BlockTemplate::SubmitSolutionResults>>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Timestamp, 1>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Nonce, 1>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Coinbase, 17>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 2>, mp::ServerCall>>>> const&, mp::TypeList<unsigned int, unsigned int, std::shared_ptr<CTransaction const>>>(mp::Priority<0>, mp::TypeList<unsigned int>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::SubmitSolutionParams, ipc::capnp::messages::BlockTemplate::SubmitSolutionResults>>&, mp::ServerField<1, mp::Accessor<mp::mining_fields::Timestamp, 1>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Nonce, 1>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Coinbase, 17>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 2>, mp::ServerCall>>>> const&, mp::TypeList<unsigned int, unsigned int, std::shared_ptr<CTransaction const>>&&)::'lambda'(auto&&...)>>(mp::TypeList<unsigned int>, mp::Priority<1>, mp::InvokeContext&, unsigned int&&, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::SubmitSolutionParams, ipc::capnp::messages::BlockTemplate::SubmitSolutionResults>>&&, std::enable_if<std::is_integral<unsigned int>::value, void>::type*)
Unexecuted instantiation: decltype(auto) mp::CustomReadField<unsigned int, mp::StructField<mp::Accessor<mp::mining_fields::Timestamp, 1>, ipc::capnp::messages::BlockTemplate::SubmitSolutionParams::Reader const>, mp::ReadDestEmplace<unsigned int, void mp::PassField<mp::Accessor<mp::mining_fields::Timestamp, 1>, unsigned int, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::SubmitSolutionParams, ipc::capnp::messages::BlockTemplate::SubmitSolutionResults>>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Nonce, 1>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Coinbase, 17>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 2>, mp::ServerCall>>> const&, mp::TypeList<unsigned int, std::shared_ptr<CTransaction const>>, unsigned int>(mp::Priority<0>, mp::TypeList<unsigned int>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::SubmitSolutionParams, ipc::capnp::messages::BlockTemplate::SubmitSolutionResults>>&, mp::ServerField<1, mp::Accessor<mp::mining_fields::Nonce, 1>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Coinbase, 17>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 2>, mp::ServerCall>>> const&, mp::TypeList<unsigned int, std::shared_ptr<CTransaction const>>&&, unsigned int&&)::'lambda'(auto&&...)>>(mp::TypeList<unsigned int>, mp::Priority<1>, mp::InvokeContext&, unsigned int&&, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::SubmitSolutionParams, ipc::capnp::messages::BlockTemplate::SubmitSolutionResults>>&&, std::enable_if<std::is_integral<unsigned int>::value, void>::type*)
Unexecuted instantiation: decltype(auto) mp::CustomReadField<unsigned int, mp::StructField<mp::Accessor<mp::mining_fields::Nonce, 1>, ipc::capnp::messages::BlockTemplate::SubmitSolutionParams::Reader const>, mp::ReadDestEmplace<unsigned int, void mp::PassField<mp::Accessor<mp::mining_fields::Nonce, 1>, unsigned int, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::SubmitSolutionParams, ipc::capnp::messages::BlockTemplate::SubmitSolutionResults>>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Coinbase, 17>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 2>, mp::ServerCall>> const&, mp::TypeList<std::shared_ptr<CTransaction const>>, unsigned int, unsigned int>(mp::Priority<0>, mp::TypeList<unsigned int>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::SubmitSolutionParams, ipc::capnp::messages::BlockTemplate::SubmitSolutionResults>>&, mp::ServerField<1, mp::Accessor<mp::mining_fields::Coinbase, 17>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 2>, mp::ServerCall>> const&, mp::TypeList<std::shared_ptr<CTransaction const>>&&, unsigned int&&, unsigned int&&)::'lambda'(auto&&...)>>(mp::TypeList<unsigned int>, mp::Priority<1>, mp::InvokeContext&, unsigned int&&, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::BlockTemplate>, capnp::CallContext<ipc::capnp::messages::BlockTemplate::SubmitSolutionParams, ipc::capnp::messages::BlockTemplate::SubmitSolutionResults>>&&, std::enable_if<std::is_integral<unsigned int>::value, void>::type*)
Unexecuted instantiation: decltype(auto) mp::CustomReadField<long, mp::StructField<mp::Accessor<mp::mining_fields::FeeThreshold, 3>, ipc::capnp::messages::BlockWaitOptions::Reader const>, mp::ReadDestUpdate<long>>(mp::TypeList<long>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::FeeThreshold, 3>, ipc::capnp::messages::BlockWaitOptions::Reader const>&&, mp::ReadDestUpdate<long>&&, std::enable_if<std::is_integral<long>::value, void>::type*)
78
79
template <typename LocalType, typename Input, typename ReadDest>
80
decltype(auto) CustomReadField(TypeList<LocalType>,
81
    Priority<1>,
82
    InvokeContext& invoke_context,
83
    Input&& input,
84
    ReadDest&& read_dest,
85
    typename std::enable_if<std::is_floating_point<LocalType>::value>::type* enable = 0)
86
{
87
    auto value = input.get();
88
    static_assert(std::is_same<LocalType, decltype(value)>::value, "floating point type mismatch");
89
    return read_dest.construct(value);
90
}
91
} // namespace mp
92
93
#endif // MP_PROXY_TYPE_NUMBER_H