Coverage Report

Created: 2026-09-02 14:16

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/tmp/bitcoin/src/ipc/libmultiprocess/include/mp/type-optional.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_OPTIONAL_H
6
#define MP_PROXY_TYPE_OPTIONAL_H
7
8
#include <mp/util.h>
9
10
namespace mp {
11
template <typename LocalType, typename Value, typename Output>
12
void CustomBuildField(TypeList<std::optional<LocalType>>,
13
    Priority<1>,
14
    InvokeContext& invoke_context,
15
    Value&& value,
16
    Output&& output)
17
28
{
18
28
    if (value) {
19
27
        output.setHas();
20
27
        BuildField(TypeList<LocalType>(), invoke_context, output, *std::forward<Value>(value));
21
27
    }
22
28
}
Unexecuted instantiation: void mp::CustomBuildField<unsigned long, std::optional<unsigned long> const&, mp::StructField<mp::Accessor<mp::mining_fields::BlockReservedWeight, 3>, ipc::capnp::messages::BlockCreateOptions::Builder>&>(mp::TypeList<std::optional<unsigned long>>, mp::Priority<1>, mp::InvokeContext&, std::optional<unsigned long> const&, mp::StructField<mp::Accessor<mp::mining_fields::BlockReservedWeight, 3>, ipc::capnp::messages::BlockCreateOptions::Builder>&)
void mp::CustomBuildField<interfaces::BlockRef, std::optional<interfaces::BlockRef>, mp::StructField<mp::Accessor<mp::mining_fields::Result, 22>, ipc::capnp::messages::Mining::GetTipResults::Builder>&>(mp::TypeList<std::optional<interfaces::BlockRef>>, mp::Priority<1>, mp::InvokeContext&, std::optional<interfaces::BlockRef>&&, mp::StructField<mp::Accessor<mp::mining_fields::Result, 22>, ipc::capnp::messages::Mining::GetTipResults::Builder>&)
Line
Count
Source
17
2
{
18
2
    if (value) {
19
2
        output.setHas();
20
2
        BuildField(TypeList<LocalType>(), invoke_context, output, *std::forward<Value>(value));
21
2
    }
22
2
}
void mp::CustomBuildField<interfaces::BlockRef, std::optional<interfaces::BlockRef>, mp::StructField<mp::Accessor<mp::mining_fields::Result, 18>, ipc::capnp::messages::Mining::WaitTipChangedResults::Builder>&>(mp::TypeList<std::optional<interfaces::BlockRef>>, mp::Priority<1>, mp::InvokeContext&, std::optional<interfaces::BlockRef>&&, mp::StructField<mp::Accessor<mp::mining_fields::Result, 18>, ipc::capnp::messages::Mining::WaitTipChangedResults::Builder>&)
Line
Count
Source
17
3
{
18
3
    if (value) {
19
2
        output.setHas();
20
2
        BuildField(TypeList<LocalType>(), invoke_context, output, *std::forward<Value>(value));
21
2
    }
22
3
}
void mp::CustomBuildField<uint256, std::optional<uint256>&, mp::StructField<mp::Accessor<mp::mining_fields::Witness, 19>, ipc::capnp::messages::CoinbaseTx::Builder>&>(mp::TypeList<std::optional<uint256>>, mp::Priority<1>, mp::InvokeContext&, std::optional<uint256>&, mp::StructField<mp::Accessor<mp::mining_fields::Witness, 19>, ipc::capnp::messages::CoinbaseTx::Builder>&)
Line
Count
Source
17
23
{
18
23
    if (value) {
19
23
        output.setHas();
20
23
        BuildField(TypeList<LocalType>(), invoke_context, output, *std::forward<Value>(value));
21
23
    }
22
23
}
23
24
template <typename LocalType, typename Input, typename ReadDest>
25
decltype(auto) CustomReadField(TypeList<std::optional<LocalType>>,
26
    Priority<1>,
27
    InvokeContext& invoke_context,
28
    Input&& input,
29
    ReadDest&& read_dest)
30
37
{
31
37
    return read_dest.update([&](auto& value) {
32
37
        if (!CustomHasField(TypeList<LocalType>(), invoke_context, input)) {
33
0
            value.reset();
34
37
        } else if (value) {
35
0
            ReadField(TypeList<LocalType>(), invoke_context, input, ReadDestUpdate(*value));
36
37
        } else {
37
37
            ReadField(TypeList<LocalType>(), invoke_context, input,
38
37
                ReadDestEmplace(TypeList<LocalType>(), [&](auto&&... args) -> auto& {
39
37
                    value.emplace(std::forward<decltype(args)>(args)...);
40
37
                    return *value;
41
37
                }));
Unexecuted instantiation: auto& auto decltype(auto) mp::CustomReadField<interfaces::BlockRef, mp::StructField<mp::Accessor<mp::mining_fields::Result, 22>, capnp::Response<ipc::capnp::messages::Mining::GetTipResults>>, mp::ReadDestUpdate<std::optional<interfaces::BlockRef>>>(mp::TypeList<std::optional<interfaces::BlockRef>>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::Result, 22>, capnp::Response<ipc::capnp::messages::Mining::GetTipResults>>&&, mp::ReadDestUpdate<std::optional<interfaces::BlockRef>>&&)::'lambda'(interfaces::BlockRef&)::operator()<std::optional<interfaces::BlockRef>>(interfaces::BlockRef&) const::'lambda'(auto&&...)::operator()<>(auto&&...) const
Unexecuted instantiation: auto& auto decltype(auto) mp::CustomReadField<interfaces::BlockRef, mp::StructField<mp::Accessor<mp::mining_fields::Result, 18>, capnp::Response<ipc::capnp::messages::Mining::WaitTipChangedResults>>, mp::ReadDestUpdate<std::optional<interfaces::BlockRef>>>(mp::TypeList<std::optional<interfaces::BlockRef>>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::Result, 18>, capnp::Response<ipc::capnp::messages::Mining::WaitTipChangedResults>>&&, mp::ReadDestUpdate<std::optional<interfaces::BlockRef>>&&)::'lambda'(interfaces::BlockRef&)::operator()<std::optional<interfaces::BlockRef>>(interfaces::BlockRef&) const::'lambda'(auto&&...)::operator()<>(auto&&...) const
Unexecuted instantiation: auto& 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&&...)::operator()<>(auto&&...) const
auto& 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&&...)::operator()<unsigned long>(auto&&...) const
Line
Count
Source
38
37
                ReadDestEmplace(TypeList<LocalType>(), [&](auto&&... args) -> auto& {
39
37
                    value.emplace(std::forward<decltype(args)>(args)...);
40
37
                    return *value;
41
37
                }));
42
37
        }
43
37
    });
Unexecuted instantiation: auto decltype(auto) mp::CustomReadField<interfaces::BlockRef, mp::StructField<mp::Accessor<mp::mining_fields::Result, 22>, capnp::Response<ipc::capnp::messages::Mining::GetTipResults>>, mp::ReadDestUpdate<std::optional<interfaces::BlockRef>>>(mp::TypeList<std::optional<interfaces::BlockRef>>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::Result, 22>, capnp::Response<ipc::capnp::messages::Mining::GetTipResults>>&&, mp::ReadDestUpdate<std::optional<interfaces::BlockRef>>&&)::'lambda'(interfaces::BlockRef&)::operator()<std::optional<interfaces::BlockRef>>(interfaces::BlockRef&) const
Unexecuted instantiation: auto decltype(auto) mp::CustomReadField<interfaces::BlockRef, mp::StructField<mp::Accessor<mp::mining_fields::Result, 18>, capnp::Response<ipc::capnp::messages::Mining::WaitTipChangedResults>>, mp::ReadDestUpdate<std::optional<interfaces::BlockRef>>>(mp::TypeList<std::optional<interfaces::BlockRef>>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::Result, 18>, capnp::Response<ipc::capnp::messages::Mining::WaitTipChangedResults>>&&, mp::ReadDestUpdate<std::optional<interfaces::BlockRef>>&&)::'lambda'(interfaces::BlockRef&)::operator()<std::optional<interfaces::BlockRef>>(interfaces::BlockRef&) 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<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
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
Line
Count
Source
31
37
    return read_dest.update([&](auto& value) {
32
37
        if (!CustomHasField(TypeList<LocalType>(), invoke_context, input)) {
33
0
            value.reset();
34
37
        } else if (value) {
35
0
            ReadField(TypeList<LocalType>(), invoke_context, input, ReadDestUpdate(*value));
36
37
        } else {
37
37
            ReadField(TypeList<LocalType>(), invoke_context, input,
38
37
                ReadDestEmplace(TypeList<LocalType>(), [&](auto&&... args) -> auto& {
39
37
                    value.emplace(std::forward<decltype(args)>(args)...);
40
37
                    return *value;
41
37
                }));
42
37
        }
43
37
    });
44
37
}
Unexecuted instantiation: decltype(auto) mp::CustomReadField<interfaces::BlockRef, mp::StructField<mp::Accessor<mp::mining_fields::Result, 22>, capnp::Response<ipc::capnp::messages::Mining::GetTipResults>>, mp::ReadDestUpdate<std::optional<interfaces::BlockRef>>>(mp::TypeList<std::optional<interfaces::BlockRef>>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::Result, 22>, capnp::Response<ipc::capnp::messages::Mining::GetTipResults>>&&, mp::ReadDestUpdate<std::optional<interfaces::BlockRef>>&&)
Unexecuted instantiation: decltype(auto) mp::CustomReadField<interfaces::BlockRef, mp::StructField<mp::Accessor<mp::mining_fields::Result, 18>, capnp::Response<ipc::capnp::messages::Mining::WaitTipChangedResults>>, mp::ReadDestUpdate<std::optional<interfaces::BlockRef>>>(mp::TypeList<std::optional<interfaces::BlockRef>>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::Result, 18>, capnp::Response<ipc::capnp::messages::Mining::WaitTipChangedResults>>&&, mp::ReadDestUpdate<std::optional<interfaces::BlockRef>>&&)
Unexecuted instantiation: 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>>&&)
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>>&&)
Line
Count
Source
30
37
{
31
37
    return read_dest.update([&](auto& value) {
32
37
        if (!CustomHasField(TypeList<LocalType>(), invoke_context, input)) {
33
37
            value.reset();
34
37
        } else if (value) {
35
37
            ReadField(TypeList<LocalType>(), invoke_context, input, ReadDestUpdate(*value));
36
37
        } else {
37
37
            ReadField(TypeList<LocalType>(), invoke_context, input,
38
37
                ReadDestEmplace(TypeList<LocalType>(), [&](auto&&... args) -> auto& {
39
37
                    value.emplace(std::forward<decltype(args)>(args)...);
40
37
                    return *value;
41
37
                }));
42
37
        }
43
37
    });
44
37
}
45
} // namespace mp
46
47
#endif // MP_PROXY_TYPE_OPTIONAL_H