Coverage Report

Created: 2025-06-10 13:21

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/bitcoin/src/util/string.h
Line
Count
Source
1
// Copyright (c) 2019-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_UTIL_STRING_H
6
#define BITCOIN_UTIL_STRING_H
7
8
#include <span.h>
9
10
#include <array>
11
#include <cstdint>
12
#include <cstring>
13
#include <locale>
14
#include <sstream>
15
#include <string>      // IWYU pragma: export
16
#include <string_view> // IWYU pragma: export
17
#include <vector>
18
19
namespace util {
20
namespace detail {
21
template <unsigned num_params>
22
constexpr static void CheckNumFormatSpecifiers(const char* str)
23
0
{
24
0
    unsigned count_normal{0}; // Number of "normal" specifiers, like %s
25
0
    unsigned count_pos{0};    // Max number in positional specifier, like %8$s
26
0
    for (auto it{str}; *it != '\0'; ++it) {
27
0
        if (*it != '%' || *++it == '%') continue; // Skip escaped %%
28
0
29
0
        auto add_arg = [&] {
30
0
            unsigned maybe_num{0};
31
0
            while ('0' <= *it && *it <= '9') {
32
0
                maybe_num *= 10;
33
0
                maybe_num += *it - '0';
34
0
                ++it;
35
0
            }
36
0
37
0
            if (*it == '$') {
38
0
                ++it;
39
0
                // Positional specifier, like %8$s
40
0
                if (maybe_num == 0) throw "Positional format specifier must have position of at least 1";
41
0
                count_pos = std::max(count_pos, maybe_num);
42
0
            } else {
43
0
                // Non-positional specifier, like %s
44
0
                ++count_normal;
45
0
            }
46
0
        };
47
0
48
0
        // Increase argument count and consume positional specifier, if present.
49
0
        add_arg();
50
0
51
0
        // Consume flags.
52
0
        while (*it == '#' || *it == '0' || *it == '-' || *it == ' ' || *it == '+') ++it;
53
0
54
0
        auto parse_size = [&] {
55
0
            if (*it == '*') {
56
0
                ++it;
57
0
                add_arg();
58
0
            } else {
59
0
                while ('0' <= *it && *it <= '9') ++it;
60
0
            }
61
0
        };
62
0
63
0
        // Consume dynamic or static width value.
64
0
        parse_size();
65
0
66
0
        // Consume dynamic or static precision value.
67
0
        if (*it == '.') {
68
0
            ++it;
69
0
            parse_size();
70
0
        }
71
0
72
0
        if (*it == '\0') throw "Format specifier incorrectly terminated by end of string";
73
0
74
0
        // Length and type in "[flags][width][.precision][length]type"
75
0
        // is not checked. Parsing continues with the next '%'.
76
0
    }
77
0
    if (count_normal && count_pos) throw "Format specifiers must be all positional or all non-positional!";
78
0
    unsigned count{count_normal | count_pos};
79
0
    if (num_params != count) throw "Format specifier count must match the argument count!";
80
0
}
Unexecuted instantiation: bitcoind.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: bitcoind.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: bitcoind.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: init.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: init.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: init.cpp:void util::detail::CheckNumFormatSpecifiers<4u>(char const*)
Unexecuted instantiation: init.cpp:void util::detail::CheckNumFormatSpecifiers<5u>(char const*)
Unexecuted instantiation: init.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: init.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: context.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: mapport.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: mapport.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: mapport.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: net.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: net.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: net.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: net.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: net.cpp:void util::detail::CheckNumFormatSpecifiers<5u>(char const*)
Unexecuted instantiation: net.cpp:void util::detail::CheckNumFormatSpecifiers<4u>(char const*)
Unexecuted instantiation: net_processing.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: net_processing.cpp:void util::detail::CheckNumFormatSpecifiers<6u>(char const*)
Unexecuted instantiation: net_processing.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: net_processing.cpp:void util::detail::CheckNumFormatSpecifiers<5u>(char const*)
Unexecuted instantiation: net_processing.cpp:void util::detail::CheckNumFormatSpecifiers<4u>(char const*)
Unexecuted instantiation: net_processing.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: net_processing.cpp:void util::detail::CheckNumFormatSpecifiers<8u>(char const*)
Unexecuted instantiation: net_processing.cpp:void util::detail::CheckNumFormatSpecifiers<7u>(char const*)
Unexecuted instantiation: net_processing.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: netgroup.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: netgroup.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: blockmanager_args.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: blockstorage.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: blockstorage.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: blockstorage.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: blockstorage.cpp:void util::detail::CheckNumFormatSpecifiers<7u>(char const*)
Unexecuted instantiation: blockstorage.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: blockstorage.cpp:void util::detail::CheckNumFormatSpecifiers<4u>(char const*)
Unexecuted instantiation: chainstate.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: chainstate.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: chainstatemanager_args.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: chainstatemanager_args.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: context.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: eviction.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: interface_ui.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: interfaces.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: interfaces.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: interfaces.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: kernel_notifications.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: mempool_args.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: mempool_persist.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: mempool_persist.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: mempool_persist.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: mempool_persist.cpp:void util::detail::CheckNumFormatSpecifiers<5u>(char const*)
Unexecuted instantiation: mempool_persist_args.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: miner.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: miner.cpp:void util::detail::CheckNumFormatSpecifiers<4u>(char const*)
Unexecuted instantiation: miner.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: miner.cpp:void util::detail::CheckNumFormatSpecifiers<5u>(char const*)
Unexecuted instantiation: peerman_args.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: timeoffsets.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: timeoffsets.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: transaction.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: transaction.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: txdownloadman_impl.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: txdownloadman_impl.cpp:void util::detail::CheckNumFormatSpecifiers<6u>(char const*)
Unexecuted instantiation: txdownloadman_impl.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: txdownloadman_impl.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: txreconciliation.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: txreconciliation.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: noui.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: noui.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: fees.cpp:void util::detail::CheckNumFormatSpecifiers<18u>(char const*)
Unexecuted instantiation: fees.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: fees.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: fees.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: fees.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: fees.cpp:void util::detail::CheckNumFormatSpecifiers<7u>(char const*)
Unexecuted instantiation: rbf.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: rbf.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: rest.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: rest.cpp:void util::detail::CheckNumFormatSpecifiers<4u>(char const*)
Unexecuted instantiation: rest.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: blockchain.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: blockchain.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: blockchain.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: blockchain.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: blockchain.cpp:void util::detail::CheckNumFormatSpecifiers<4u>(char const*)
Unexecuted instantiation: mempool.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: mempool.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: mining.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: mining.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: node.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: output_script.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: rawtransaction.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: rawtransaction.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: server.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: server.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: server.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: server_util.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: server_util.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: txoutproof.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: signet.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: torcontrol.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: torcontrol.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: torcontrol.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: torcontrol.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: txdb.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: txdb.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: txdb.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: txmempool.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: txmempool.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: txmempool.cpp:void util::detail::CheckNumFormatSpecifiers<4u>(char const*)
Unexecuted instantiation: txorphanage.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: txorphanage.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: txorphanage.cpp:void util::detail::CheckNumFormatSpecifiers<5u>(char const*)
Unexecuted instantiation: txorphanage.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: txrequest.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: validation.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: validation.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: validation.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: validation.cpp:void util::detail::CheckNumFormatSpecifiers<5u>(char const*)
Unexecuted instantiation: validation.cpp:void util::detail::CheckNumFormatSpecifiers<4u>(char const*)
Unexecuted instantiation: validation.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: validation.cpp:void util::detail::CheckNumFormatSpecifiers<6u>(char const*)
Unexecuted instantiation: validation.cpp:void util::detail::CheckNumFormatSpecifiers<12u>(char const*)
Unexecuted instantiation: validationinterface.cpp:void util::detail::CheckNumFormatSpecifiers<4u>(char const*)
Unexecuted instantiation: validationinterface.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: validationinterface.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: addrdb.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: addrdb.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: addrdb.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: addrdb.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: addrman.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: addrman.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: addrman.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: addrman.cpp:void util::detail::CheckNumFormatSpecifiers<4u>(char const*)
Unexecuted instantiation: addrman.cpp:void util::detail::CheckNumFormatSpecifiers<5u>(char const*)
Unexecuted instantiation: addrman.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: banman.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: banman.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: banman.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: blockencodings.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: blockencodings.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: blockencodings.cpp:void util::detail::CheckNumFormatSpecifiers<5u>(char const*)
Unexecuted instantiation: tx_verify.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: tx_verify.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: dbwrapper.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: dbwrapper.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: dbwrapper.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: dbwrapper.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: flatfile.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: flatfile.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: flatfile.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: headerssync.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: headerssync.cpp:void util::detail::CheckNumFormatSpecifiers<4u>(char const*)
Unexecuted instantiation: headerssync.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: httprpc.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: httprpc.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: httprpc.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: httpserver.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: httpserver.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: httpserver.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: httpserver.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: i2p.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: i2p.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: i2p.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: i2p.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: base.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: base.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: base.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: blockfilterindex.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: blockfilterindex.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: blockfilterindex.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: blockfilterindex.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: blockfilterindex.cpp:void util::detail::CheckNumFormatSpecifiers<4u>(char const*)
Unexecuted instantiation: coinstatsindex.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: coinstatsindex.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: coinstatsindex.cpp:void util::detail::CheckNumFormatSpecifiers<4u>(char const*)
Unexecuted instantiation: txindex.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: txindex.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: coinstats.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: abort.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: coin.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: psbt.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: utxo_snapshot.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: utxo_snapshot.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: ephemeral_policy.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: truc_policy.cpp:void util::detail::CheckNumFormatSpecifiers<4u>(char const*)
Unexecuted instantiation: truc_policy.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: sigcache.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: interfaces.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: load.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: load.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: load.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: load.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: receive.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: receive.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: receive.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: receive.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: wallet.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: wallet.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: wallet.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: wallet.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: scriptpubkeyman.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: scriptpubkeyman.cpp:void util::detail::CheckNumFormatSpecifiers<4u>(char const*)
Unexecuted instantiation: scriptpubkeyman.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: scriptpubkeyman.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: spend.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: spend.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: spend.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: spend.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: spend.cpp:void util::detail::CheckNumFormatSpecifiers<20u>(char const*)
Unexecuted instantiation: transaction.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: transaction.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: wallet.cpp:void util::detail::CheckNumFormatSpecifiers<4u>(char const*)
Unexecuted instantiation: wallet.cpp:void util::detail::CheckNumFormatSpecifiers<5u>(char const*)
Unexecuted instantiation: walletdb.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: walletdb.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: walletdb.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: walletdb.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: walletdb.cpp:void util::detail::CheckNumFormatSpecifiers<4u>(char const*)
Unexecuted instantiation: coinselection.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: coinselection.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: coinselection.cpp:void util::detail::CheckNumFormatSpecifiers<4u>(char const*)
Unexecuted instantiation: db.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: external_signer_scriptpubkeyman.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: feebumper.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: feebumper.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: feebumper.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: feebumper.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: feebumper.cpp:void util::detail::CheckNumFormatSpecifiers<4u>(char const*)
Unexecuted instantiation: migrate.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: migrate.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: migrate.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: addresses.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: addresses.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: addresses.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: addresses.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: backup.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: backup.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: backup.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: backup.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: coins.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: coins.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: coins.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: coins.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: encrypt.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: encrypt.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: encrypt.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: encrypt.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: signmessage.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: signmessage.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: signmessage.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: signmessage.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: transactions.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: transactions.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: transactions.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: transactions.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: util.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: util.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: util.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: util.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: sqlite.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: sqlite.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: sqlite.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: chain.cpp:void util::detail::CheckNumFormatSpecifiers<6u>(char const*)
Unexecuted instantiation: chain.cpp:void util::detail::CheckNumFormatSpecifiers<4u>(char const*)
Unexecuted instantiation: chainparams.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: chainparams.cpp:void util::detail::CheckNumFormatSpecifiers<4u>(char const*)
Unexecuted instantiation: args.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: args.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: args.cpp:void util::detail::CheckNumFormatSpecifiers<4u>(char const*)
Unexecuted instantiation: config.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: config.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: config.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: messages.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: messages.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: netif.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: netif.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: pcp.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: pcp.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: pcp.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: pcp.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: pcp.cpp:void util::detail::CheckNumFormatSpecifiers<4u>(char const*)
Unexecuted instantiation: settings.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: settings.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: system.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: core_write.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: core_write.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: core_write.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: external_signer.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: external_signer.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: common.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: common.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: common.cpp:void util::detail::CheckNumFormatSpecifiers<4u>(char const*)
Unexecuted instantiation: common.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: common.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: key_io.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: key_io.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: net_permissions.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: net_permissions.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: net_types.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: net_types.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: netaddress.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: netaddress.cpp:void util::detail::CheckNumFormatSpecifiers<4u>(char const*)
Unexecuted instantiation: netaddress.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: netbase.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: netbase.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: netbase.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: netbase.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: feerate.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: protocol.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: protocol.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: rawtransaction_util.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: request.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: request.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: request.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: util.cpp:void util::detail::CheckNumFormatSpecifiers<4u>(char const*)
Unexecuted instantiation: util.cpp:void util::detail::CheckNumFormatSpecifiers<5u>(char const*)
Unexecuted instantiation: descriptor.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: descriptor.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: descriptor.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: signingprovider.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: run_command.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: run_command.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: asmap.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: asmap.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: asmap.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: batchpriority.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: bip32.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: check.cpp:void util::detail::CheckNumFormatSpecifiers<7u>(char const*)
Unexecuted instantiation: check.cpp:void util::detail::CheckNumFormatSpecifiers<4u>(char const*)
Unexecuted instantiation: exception.cpp:void util::detail::CheckNumFormatSpecifiers<4u>(char const*)
Unexecuted instantiation: exception.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: exception.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: fs_helpers.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: fs_helpers.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: moneystr.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: sock.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: sock.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: sock.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: syserror.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: syserror.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: thread.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: time.cpp:void util::detail::CheckNumFormatSpecifiers<6u>(char const*)
Unexecuted instantiation: time.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: logging.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: logging.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: logging.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: random.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: random.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: clientversion.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: clientversion.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: clientversion.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: block.cpp:void util::detail::CheckNumFormatSpecifiers<8u>(char const*)
Unexecuted instantiation: transaction.cpp:void util::detail::CheckNumFormatSpecifiers<5u>(char const*)
81
} // namespace detail
82
83
/**
84
 * @brief A wrapper for a compile-time partially validated format string
85
 *
86
 * This struct can be used to enforce partial compile-time validation of format
87
 * strings, to reduce the likelihood of tinyformat throwing exceptions at
88
 * run-time. Validation is partial to try and prevent the most common errors
89
 * while avoiding re-implementing the entire parsing logic.
90
 */
91
template <unsigned num_params>
92
struct ConstevalFormatString {
93
    const char* const fmt;
94
    consteval ConstevalFormatString(const char* str) : fmt{str} { detail::CheckNumFormatSpecifiers<num_params>(fmt); }
95
};
96
97
void ReplaceAll(std::string& in_out, const std::string& search, const std::string& substitute);
98
99
/** Split a string on any char found in separators, returning a vector.
100
 *
101
 * If sep does not occur in sp, a singleton with the entirety of sp is returned.
102
 *
103
 * Note that this function does not care about braces, so splitting
104
 * "foo(bar(1),2),3) on ',' will return {"foo(bar(1)", "2)", "3)"}.
105
 */
106
template <typename T = std::span<const char>>
107
std::vector<T> Split(const std::span<const char>& sp, std::string_view separators)
108
12.3M
{
109
12.3M
    std::vector<T> ret;
110
12.3M
    auto it = sp.begin();
111
12.3M
    auto start = it;
112
157M
    while (it != sp.end()) {
  Branch (112:12): [True: 111M, False: 12.0M]
  Branch (112:12): [True: 0, False: 0]
  Branch (112:12): [True: 33.8M, False: 266k]
113
145M
        if (separators.find(*it) != std::string::npos) {
  Branch (113:13): [True: 44.3k, False: 111M]
  Branch (113:13): [True: 0, False: 0]
  Branch (113:13): [True: 443k, False: 33.3M]
114
488k
            ret.emplace_back(start, it);
115
488k
            start = it + 1;
116
488k
        }
117
145M
        ++it;
118
145M
    }
119
12.3M
    ret.emplace_back(start, it);
120
12.3M
    return ret;
121
12.3M
}
std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > util::Split<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::span<char const, 18446744073709551615ul> const&, std::basic_string_view<char, std::char_traits<char> >)
Line
Count
Source
108
12.0M
{
109
12.0M
    std::vector<T> ret;
110
12.0M
    auto it = sp.begin();
111
12.0M
    auto start = it;
112
123M
    while (it != sp.end()) {
  Branch (112:12): [True: 111M, False: 12.0M]
113
111M
        if (separators.find(*it) != std::string::npos) {
  Branch (113:13): [True: 44.3k, False: 111M]
114
44.3k
            ret.emplace_back(start, it);
115
44.3k
            start = it + 1;
116
44.3k
        }
117
111M
        ++it;
118
111M
    }
119
12.0M
    ret.emplace_back(start, it);
120
12.0M
    return ret;
121
12.0M
}
Unexecuted instantiation: std::vector<std::basic_string_view<char, std::char_traits<char> >, std::allocator<std::basic_string_view<char, std::char_traits<char> > > > util::Split<std::basic_string_view<char, std::char_traits<char> > >(std::span<char const, 18446744073709551615ul> const&, std::basic_string_view<char, std::char_traits<char> >)
std::vector<std::span<char const, 18446744073709551615ul>, std::allocator<std::span<char const, 18446744073709551615ul> > > util::Split<std::span<char const, 18446744073709551615ul> >(std::span<char const, 18446744073709551615ul> const&, std::basic_string_view<char, std::char_traits<char> >)
Line
Count
Source
108
266k
{
109
266k
    std::vector<T> ret;
110
266k
    auto it = sp.begin();
111
266k
    auto start = it;
112
34.0M
    while (it != sp.end()) {
  Branch (112:12): [True: 33.8M, False: 266k]
113
33.8M
        if (separators.find(*it) != std::string::npos) {
  Branch (113:13): [True: 443k, False: 33.3M]
114
443k
            ret.emplace_back(start, it);
115
443k
            start = it + 1;
116
443k
        }
117
33.8M
        ++it;
118
33.8M
    }
119
266k
    ret.emplace_back(start, it);
120
266k
    return ret;
121
266k
}
122
123
/** Split a string on every instance of sep, returning a vector.
124
 *
125
 * If sep does not occur in sp, a singleton with the entirety of sp is returned.
126
 *
127
 * Note that this function does not care about braces, so splitting
128
 * "foo(bar(1),2),3) on ',' will return {"foo(bar(1)", "2)", "3)"}.
129
 */
130
template <typename T = std::span<const char>>
131
std::vector<T> Split(const std::span<const char>& sp, char sep)
132
12.3M
{
133
12.3M
    return Split<T>(sp, std::string_view{&sep, 1});
134
12.3M
}
std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > util::Split<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::span<char const, 18446744073709551615ul> const&, char)
Line
Count
Source
132
12.0M
{
133
12.0M
    return Split<T>(sp, std::string_view{&sep, 1});
134
12.0M
}
Unexecuted instantiation: std::vector<std::basic_string_view<char, std::char_traits<char> >, std::allocator<std::basic_string_view<char, std::char_traits<char> > > > util::Split<std::basic_string_view<char, std::char_traits<char> > >(std::span<char const, 18446744073709551615ul> const&, char)
std::vector<std::span<char const, 18446744073709551615ul>, std::allocator<std::span<char const, 18446744073709551615ul> > > util::Split<std::span<char const, 18446744073709551615ul> >(std::span<char const, 18446744073709551615ul> const&, char)
Line
Count
Source
132
266k
{
133
266k
    return Split<T>(sp, std::string_view{&sep, 1});
134
266k
}
135
136
[[nodiscard]] inline std::vector<std::string> SplitString(std::string_view str, char sep)
137
12.0M
{
138
12.0M
    return Split<std::string>(str, sep);
139
12.0M
}
140
141
[[nodiscard]] inline std::vector<std::string> SplitString(std::string_view str, std::string_view separators)
142
0
{
143
0
    return Split<std::string>(str, separators);
144
0
}
145
146
[[nodiscard]] inline std::string_view TrimStringView(std::string_view str, std::string_view pattern = " \f\n\r\t\v")
147
2.71M
{
148
2.71M
    std::string::size_type front = str.find_first_not_of(pattern);
149
2.71M
    if (front == std::string::npos) {
  Branch (149:9): [True: 0, False: 2.71M]
150
0
        return {};
151
0
    }
152
2.71M
    std::string::size_type end = str.find_last_not_of(pattern);
153
2.71M
    return str.substr(front, end - front + 1);
154
2.71M
}
155
156
[[nodiscard]] inline std::string TrimString(std::string_view str, std::string_view pattern = " \f\n\r\t\v")
157
55.4k
{
158
55.4k
    return std::string(TrimStringView(str, pattern));
159
55.4k
}
160
161
[[nodiscard]] inline std::string_view RemoveSuffixView(std::string_view str, std::string_view suffix)
162
0
{
163
0
    if (str.ends_with(suffix)) {
  Branch (163:9): [True: 0, False: 0]
164
0
        return str.substr(0, str.size() - suffix.size());
165
0
    }
166
0
    return str;
167
0
}
168
169
[[nodiscard]] inline std::string_view RemovePrefixView(std::string_view str, std::string_view prefix)
170
0
{
171
0
    if (str.starts_with(prefix)) {
  Branch (171:9): [True: 0, False: 0]
172
0
        return str.substr(prefix.size());
173
0
    }
174
0
    return str;
175
0
}
176
177
[[nodiscard]] inline std::string RemovePrefix(std::string_view str, std::string_view prefix)
178
0
{
179
0
    return std::string(RemovePrefixView(str, prefix));
180
0
}
181
182
/**
183
 * Join all container items. Typically used to concatenate strings but accepts
184
 * containers with elements of any type.
185
 *
186
 * @param container The items to join
187
 * @param separator The separator
188
 * @param unary_op  Apply this operator to each item
189
 */
190
template <typename C, typename S, typename UnaryOp>
191
// NOLINTNEXTLINE(misc-no-recursion)
192
auto Join(const C& container, const S& separator, UnaryOp unary_op)
193
2.98M
{
194
2.98M
    decltype(unary_op(*container.begin())) ret;
195
2.98M
    bool first{true};
196
5.11M
    for (const auto& item : container) {
  Branch (196:27): [True: 133k, False: 22.1k]
  Branch (196:27): [True: 1.24M, False: 44.3k]
  Branch (196:27): [True: 2.96M, False: 410k]
  Branch (196:27): [True: 0, False: 2.24M]
  Branch (196:27): [True: 0, False: 0]
  Branch (196:27): [True: 11.0k, False: 11.0k]
  Branch (196:27): [True: 732k, False: 244k]
  Branch (196:27): [True: 0, False: 0]
  Branch (196:27): [True: 33.2k, False: 11.0k]
197
5.11M
        if (!first) ret += separator;
  Branch (197:13): [True: 110k, False: 22.1k]
  Branch (197:13): [True: 1.19M, False: 44.3k]
  Branch (197:13): [True: 2.55M, False: 410k]
  Branch (197:13): [True: 0, False: 0]
  Branch (197:13): [True: 0, False: 0]
  Branch (197:13): [True: 0, False: 11.0k]
  Branch (197:13): [True: 488k, False: 244k]
  Branch (197:13): [True: 0, False: 0]
  Branch (197:13): [True: 22.1k, False: 11.0k]
198
5.11M
        ret += unary_op(item);
199
5.11M
        first = false;
200
5.11M
    }
201
2.98M
    return ret;
202
2.98M
}
auto util::Join<std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, char [2], util::MakeUnorderedList(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&)::{lambda(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)#1}>(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, char const (&) [2], util::MakeUnorderedList(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&)::{lambda(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)#1})
Line
Count
Source
193
22.1k
{
194
22.1k
    decltype(unary_op(*container.begin())) ret;
195
22.1k
    bool first{true};
196
133k
    for (const auto& item : container) {
  Branch (196:27): [True: 133k, False: 22.1k]
197
133k
        if (!first) ret += separator;
  Branch (197:13): [True: 110k, False: 22.1k]
198
133k
        ret += unary_op(item);
199
133k
        first = false;
200
133k
    }
201
22.1k
    return ret;
202
22.1k
}
auto util::Join<std::vector<LogCategory, std::allocator<LogCategory> >, char [3], BCLog::Logger::LogCategoriesString[abi:cxx11]() const::{lambda(LogCategory const&)#1}>(std::vector<LogCategory, std::allocator<LogCategory> > const&, char const (&) [3], BCLog::Logger::LogCategoriesString[abi:cxx11]() const::{lambda(LogCategory const&)#1})
Line
Count
Source
193
44.3k
{
194
44.3k
    decltype(unary_op(*container.begin())) ret;
195
44.3k
    bool first{true};
196
1.24M
    for (const auto& item : container) {
  Branch (196:27): [True: 1.24M, False: 44.3k]
197
1.24M
        if (!first) ret += separator;
  Branch (197:13): [True: 1.19M, False: 44.3k]
198
1.24M
        ret += unary_op(item);
199
1.24M
        first = false;
200
1.24M
    }
201
44.3k
    return ret;
202
44.3k
}
auto util::Join<std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, char [3], util::Join<std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, char [3]>(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, char const (&) [3])::{lambda(auto:1 const&)#1}>(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, char const (&) [3], util::Join<std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, char [3]>(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, char const (&) [3])::{lambda(auto:1 const&)#1})
Line
Count
Source
193
410k
{
194
410k
    decltype(unary_op(*container.begin())) ret;
195
410k
    bool first{true};
196
2.96M
    for (const auto& item : container) {
  Branch (196:27): [True: 2.96M, False: 410k]
197
2.96M
        if (!first) ret += separator;
  Branch (197:13): [True: 2.55M, False: 410k]
198
2.96M
        ret += unary_op(item);
199
2.96M
        first = false;
200
2.96M
    }
201
410k
    return ret;
202
410k
}
auto util::Join<std::vector<bilingual_str, std::allocator<bilingual_str> >, bilingual_str, util::Join<std::vector<bilingual_str, std::allocator<bilingual_str> >, bilingual_str>(std::vector<bilingual_str, std::allocator<bilingual_str> > const&, bilingual_str const&)::{lambda(auto:1 const&)#1}>(std::vector<bilingual_str, std::allocator<bilingual_str> > const&, bilingual_str const&, util::Join<std::vector<bilingual_str, std::allocator<bilingual_str> >, bilingual_str>(std::vector<bilingual_str, std::allocator<bilingual_str> > const&, bilingual_str const&)::{lambda(auto:1 const&)#1})
Line
Count
Source
193
2.24M
{
194
2.24M
    decltype(unary_op(*container.begin())) ret;
195
2.24M
    bool first{true};
196
2.24M
    for (const auto& item : container) {
  Branch (196:27): [True: 0, False: 2.24M]
197
0
        if (!first) ret += separator;
  Branch (197:13): [True: 0, False: 0]
198
0
        ret += unary_op(item);
199
0
        first = false;
200
0
    }
201
2.24M
    return ret;
202
2.24M
}
Unexecuted instantiation: validation.cpp:auto util::Join<std::vector<int, std::allocator<int> >, char [3], ChainstateManager::ActivateSnapshot(AutoFile&, node::SnapshotMetadata const&, bool)::$_0>(std::vector<int, std::allocator<int> > const&, char const (&) [3], ChainstateManager::ActivateSnapshot(AutoFile&, node::SnapshotMetadata const&, bool)::$_0)
blockfilter.cpp:auto util::Join<std::map<BlockFilterType, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<BlockFilterType>, std::allocator<std::pair<BlockFilterType const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, char [3], ListBlockFilterTypes()::$_0>(std::map<BlockFilterType, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<BlockFilterType>, std::allocator<std::pair<BlockFilterType const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&, char const (&) [3], ListBlockFilterTypes()::$_0)
Line
Count
Source
193
11.0k
{
194
11.0k
    decltype(unary_op(*container.begin())) ret;
195
11.0k
    bool first{true};
196
11.0k
    for (const auto& item : container) {
  Branch (196:27): [True: 11.0k, False: 11.0k]
197
11.0k
        if (!first) ret += separator;
  Branch (197:13): [True: 0, False: 11.0k]
198
11.0k
        ret += unary_op(item);
199
11.0k
        first = false;
200
11.0k
    }
201
11.0k
    return ret;
202
11.0k
}
messages.cpp:auto util::Join<std::vector<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, FeeEstimateMode>, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, FeeEstimateMode> > >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, common::FeeModes(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::$_0>(std::vector<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, FeeEstimateMode>, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, FeeEstimateMode> > > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, common::FeeModes(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::$_0)
Line
Count
Source
193
244k
{
194
244k
    decltype(unary_op(*container.begin())) ret;
195
244k
    bool first{true};
196
732k
    for (const auto& item : container) {
  Branch (196:27): [True: 732k, False: 244k]
197
732k
        if (!first) ret += separator;
  Branch (197:13): [True: 488k, False: 244k]
198
732k
        ret += unary_op(item);
199
732k
        first = false;
200
732k
    }
201
244k
    return ret;
202
244k
}
Unexecuted instantiation: util.cpp:auto util::Join<std::vector<RPCArg, std::allocator<RPCArg> >, char [2], RPCArg::ToString[abi:cxx11](bool) const::$_0>(std::vector<RPCArg, std::allocator<RPCArg> > const&, char const (&) [2], RPCArg::ToString[abi:cxx11](bool) const::$_0)
logging.cpp:auto util::Join<std::vector<BCLog::Level, std::allocator<BCLog::Level> >, char [3], BCLog::Logger::LogLevelsString[abi:cxx11]() const::$_0>(std::vector<BCLog::Level, std::allocator<BCLog::Level> > const&, char const (&) [3], BCLog::Logger::LogLevelsString[abi:cxx11]() const::$_0)
Line
Count
Source
193
11.0k
{
194
11.0k
    decltype(unary_op(*container.begin())) ret;
195
11.0k
    bool first{true};
196
33.2k
    for (const auto& item : container) {
  Branch (196:27): [True: 33.2k, False: 11.0k]
197
33.2k
        if (!first) ret += separator;
  Branch (197:13): [True: 22.1k, False: 11.0k]
198
33.2k
        ret += unary_op(item);
199
33.2k
        first = false;
200
33.2k
    }
201
11.0k
    return ret;
202
11.0k
}
203
204
template <typename C, typename S>
205
auto Join(const C& container, const S& separator)
206
2.65M
{
207
2.96M
    return Join(container, separator, [](const auto& i) { return i; });
auto util::Join<std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, char [3]>(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, char const (&) [3])::{lambda(auto:1 const&)#1}::operator()<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const
Line
Count
Source
207
2.96M
    return Join(container, separator, [](const auto& i) { return i; });
Unexecuted instantiation: auto util::Join<std::vector<bilingual_str, std::allocator<bilingual_str> >, bilingual_str>(std::vector<bilingual_str, std::allocator<bilingual_str> > const&, bilingual_str const&)::{lambda(auto:1 const&)#1}::operator()<bilingual_str>(bilingual_str const&) const
208
2.65M
}
auto util::Join<std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, char [3]>(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, char const (&) [3])
Line
Count
Source
206
410k
{
207
410k
    return Join(container, separator, [](const auto& i) { return i; });
208
410k
}
auto util::Join<std::vector<bilingual_str, std::allocator<bilingual_str> >, bilingual_str>(std::vector<bilingual_str, std::allocator<bilingual_str> > const&, bilingual_str const&)
Line
Count
Source
206
2.24M
{
207
2.24M
    return Join(container, separator, [](const auto& i) { return i; });
208
2.24M
}
209
210
/**
211
 * Create an unordered multi-line list of items.
212
 */
213
inline std::string MakeUnorderedList(const std::vector<std::string>& items)
214
22.1k
{
215
133k
    return Join(items, "\n", [](const std::string& item) { return "- " + item; });
216
22.1k
}
217
218
/**
219
 * Check if a string does not contain any embedded NUL (\0) characters
220
 */
221
[[nodiscard]] inline bool ContainsNoNUL(std::string_view str) noexcept
222
28.8M
{
223
278M
    for (auto c : str) {
  Branch (223:17): [True: 278M, False: 28.8M]
224
278M
        if (c == 0) return false;
  Branch (224:13): [True: 0, False: 278M]
225
278M
    }
226
28.8M
    return true;
227
28.8M
}
228
229
/**
230
 * Locale-independent version of std::to_string
231
 */
232
template <typename T>
233
std::string ToString(const T& t)
234
55.4k
{
235
55.4k
    std::ostringstream oss;
236
55.4k
    oss.imbue(std::locale::classic());
237
55.4k
    oss << t;
238
55.4k
    return oss.str();
239
55.4k
}
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > util::ToString<unsigned int>(unsigned int const&)
Line
Count
Source
234
44.3k
{
235
44.3k
    std::ostringstream oss;
236
44.3k
    oss.imbue(std::locale::classic());
237
44.3k
    oss << t;
238
44.3k
    return oss.str();
239
44.3k
}
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > util::ToString<int>(int const&)
Line
Count
Source
234
11.0k
{
235
11.0k
    std::ostringstream oss;
236
11.0k
    oss.imbue(std::locale::classic());
237
11.0k
    oss << t;
238
11.0k
    return oss.str();
239
11.0k
}
Unexecuted instantiation: std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > util::ToString<long>(long const&)
Unexecuted instantiation: std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > util::ToString<unsigned long>(unsigned long const&)
240
241
/**
242
 * Check whether a container begins with the given prefix.
243
 */
244
template <typename T1, size_t PREFIX_LEN>
245
[[nodiscard]] inline bool HasPrefix(const T1& obj,
246
                                const std::array<uint8_t, PREFIX_LEN>& prefix)
247
3.45M
{
248
3.45M
    return obj.size() >= PREFIX_LEN &&
  Branch (248:12): [True: 218, False: 0]
  Branch (248:12): [True: 42.9k, False: 0]
  Branch (248:12): [True: 117k, False: 0]
  Branch (248:12): [True: 57.2k, False: 0]
  Branch (248:12): [True: 759k, False: 1]
  Branch (248:12): [True: 2.33M, False: 0]
  Branch (248:12): [True: 87.6k, False: 0]
  Branch (248:12): [True: 59.8k, False: 0]
249
3.45M
           std::equal(std::begin(prefix), std::end(prefix), std::begin(obj));
  Branch (249:12): [True: 6, False: 212]
  Branch (249:12): [True: 29, False: 42.9k]
  Branch (249:12): [True: 88.7k, False: 28.6k]
  Branch (249:12): [True: 0, False: 57.2k]
  Branch (249:12): [True: 443, False: 758k]
  Branch (249:12): [True: 590, False: 2.33M]
  Branch (249:12): [True: 56, False: 87.6k]
  Branch (249:12): [True: 6, False: 59.8k]
250
3.45M
}
bool util::HasPrefix<prevector<16u, unsigned char, unsigned int, int>, 6ul>(prevector<16u, unsigned char, unsigned int, int> const&, std::array<unsigned char, 6ul> const&)
Line
Count
Source
247
218
{
248
218
    return obj.size() >= PREFIX_LEN &&
  Branch (248:12): [True: 218, False: 0]
249
218
           std::equal(std::begin(prefix), std::end(prefix), std::begin(obj));
  Branch (249:12): [True: 6, False: 212]
250
218
}
bool util::HasPrefix<prevector<16u, unsigned char, unsigned int, int>, 12ul>(prevector<16u, unsigned char, unsigned int, int> const&, std::array<unsigned char, 12ul> const&)
Line
Count
Source
247
42.9k
{
248
42.9k
    return obj.size() >= PREFIX_LEN &&
  Branch (248:12): [True: 42.9k, False: 0]
249
42.9k
           std::equal(std::begin(prefix), std::end(prefix), std::begin(obj));
  Branch (249:12): [True: 29, False: 42.9k]
250
42.9k
}
bool util::HasPrefix<std::span<unsigned char const, 18446744073709551615ul>, 12ul>(std::span<unsigned char const, 18446744073709551615ul> const&, std::array<unsigned char, 12ul> const&)
Line
Count
Source
247
117k
{
248
117k
    return obj.size() >= PREFIX_LEN &&
  Branch (248:12): [True: 117k, False: 0]
249
117k
           std::equal(std::begin(prefix), std::end(prefix), std::begin(obj));
  Branch (249:12): [True: 88.7k, False: 28.6k]
250
117k
}
bool util::HasPrefix<std::span<unsigned char const, 18446744073709551615ul>, 6ul>(std::span<unsigned char const, 18446744073709551615ul> const&, std::array<unsigned char, 6ul> const&)
Line
Count
Source
247
57.2k
{
248
57.2k
    return obj.size() >= PREFIX_LEN &&
  Branch (248:12): [True: 57.2k, False: 0]
249
57.2k
           std::equal(std::begin(prefix), std::end(prefix), std::begin(obj));
  Branch (249:12): [True: 0, False: 57.2k]
250
57.2k
}
bool util::HasPrefix<prevector<16u, unsigned char, unsigned int, int>, 2ul>(prevector<16u, unsigned char, unsigned int, int> const&, std::array<unsigned char, 2ul> const&)
Line
Count
Source
247
759k
{
248
759k
    return obj.size() >= PREFIX_LEN &&
  Branch (248:12): [True: 759k, False: 1]
249
759k
           std::equal(std::begin(prefix), std::end(prefix), std::begin(obj));
  Branch (249:12): [True: 443, False: 758k]
250
759k
}
bool util::HasPrefix<prevector<16u, unsigned char, unsigned int, int>, 3ul>(prevector<16u, unsigned char, unsigned int, int> const&, std::array<unsigned char, 3ul> const&)
Line
Count
Source
247
2.33M
{
248
2.33M
    return obj.size() >= PREFIX_LEN &&
  Branch (248:12): [True: 2.33M, False: 0]
249
2.33M
           std::equal(std::begin(prefix), std::end(prefix), std::begin(obj));
  Branch (249:12): [True: 590, False: 2.33M]
250
2.33M
}
bool util::HasPrefix<prevector<16u, unsigned char, unsigned int, int>, 4ul>(prevector<16u, unsigned char, unsigned int, int> const&, std::array<unsigned char, 4ul> const&)
Line
Count
Source
247
87.6k
{
248
87.6k
    return obj.size() >= PREFIX_LEN &&
  Branch (248:12): [True: 87.6k, False: 0]
249
87.6k
           std::equal(std::begin(prefix), std::end(prefix), std::begin(obj));
  Branch (249:12): [True: 56, False: 87.6k]
250
87.6k
}
bool util::HasPrefix<prevector<16u, unsigned char, unsigned int, int>, 8ul>(prevector<16u, unsigned char, unsigned int, int> const&, std::array<unsigned char, 8ul> const&)
Line
Count
Source
247
59.8k
{
248
59.8k
    return obj.size() >= PREFIX_LEN &&
  Branch (248:12): [True: 59.8k, False: 0]
249
59.8k
           std::equal(std::begin(prefix), std::end(prefix), std::begin(obj));
  Branch (249:12): [True: 6, False: 59.8k]
250
59.8k
}
251
} // namespace util
252
253
#endif // BITCOIN_UTIL_STRING_H