Coverage Report

Created: 2026-04-29 19:21

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/tmp/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 <algorithm>
9
#include <array>
10
#include <cstddef>
11
#include <cstdint>
12
#include <initializer_list>
13
#include <locale>
14
#include <optional>
15
#include <span>
16
#include <sstream>
17
#include <string>
18
#include <string_view>
19
#include <vector>
20
21
namespace util {
22
namespace detail {
23
template <unsigned num_params>
24
constexpr static void CheckNumFormatSpecifiers(const char* str)
25
72
{
26
72
    unsigned count_normal{0}; // Number of "normal" specifiers, like %s
27
72
    unsigned count_pos{0};    // Max number in positional specifier, like %8$s
28
157
    for (auto it{str}; *it != '\0'; ++it) {
29
98
        if (*it != '%' || *++it == '%') continue; // Skip escaped %%
30
31
104
        auto add_arg = [&] {
32
104
            unsigned maybe_num{0};
33
172
            while ('0' <= *it && *it <= '9') {
34
68
                maybe_num *= 10;
35
68
                maybe_num += *it - '0';
36
68
                ++it;
37
68
            }
38
39
104
            if (*it == '$') {
40
56
                ++it;
41
                // Positional specifier, like %8$s
42
56
                if (maybe_num == 0) throw "Positional format specifier must have position of at least 1";
43
48
                count_pos = std::max(count_pos, maybe_num);
44
48
            } else {
45
                // Non-positional specifier, like %s
46
48
                ++count_normal;
47
48
            }
48
104
        };
util_string_tests.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)::'lambda'()::operator()() const
Line
Count
Source
31
4
        auto add_arg = [&] {
32
4
            unsigned maybe_num{0};
33
7
            while ('0' <= *it && *it <= '9') {
34
3
                maybe_num *= 10;
35
3
                maybe_num += *it - '0';
36
3
                ++it;
37
3
            }
38
39
4
            if (*it == '$') {
40
3
                ++it;
41
                // Positional specifier, like %8$s
42
3
                if (maybe_num == 0) throw "Positional format specifier must have position of at least 1";
43
1
                count_pos = std::max(count_pos, maybe_num);
44
1
            } else {
45
                // Non-positional specifier, like %s
46
1
                ++count_normal;
47
1
            }
48
4
        };
util_string_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)::'lambda'()::operator()() const
Line
Count
Source
31
41
        auto add_arg = [&] {
32
41
            unsigned maybe_num{0};
33
64
            while ('0' <= *it && *it <= '9') {
34
23
                maybe_num *= 10;
35
23
                maybe_num += *it - '0';
36
23
                ++it;
37
23
            }
38
39
41
            if (*it == '$') {
40
11
                ++it;
41
                // Positional specifier, like %8$s
42
11
                if (maybe_num == 0) throw "Positional format specifier must have position of at least 1";
43
9
                count_pos = std::max(count_pos, maybe_num);
44
30
            } else {
45
                // Non-positional specifier, like %s
46
30
                ++count_normal;
47
30
            }
48
41
        };
util_string_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)::'lambda'()::operator()() const
Line
Count
Source
31
29
        auto add_arg = [&] {
32
29
            unsigned maybe_num{0};
33
46
            while ('0' <= *it && *it <= '9') {
34
17
                maybe_num *= 10;
35
17
                maybe_num += *it - '0';
36
17
                ++it;
37
17
            }
38
39
29
            if (*it == '$') {
40
18
                ++it;
41
                // Positional specifier, like %8$s
42
18
                if (maybe_num == 0) throw "Positional format specifier must have position of at least 1";
43
16
                count_pos = std::max(count_pos, maybe_num);
44
16
            } else {
45
                // Non-positional specifier, like %s
46
11
                ++count_normal;
47
11
            }
48
29
        };
util_string_tests.cpp:void util::detail::CheckNumFormatSpecifiers<129u>(char const*)::'lambda'()::operator()() const
Line
Count
Source
31
2
        auto add_arg = [&] {
32
2
            unsigned maybe_num{0};
33
6
            while ('0' <= *it && *it <= '9') {
34
4
                maybe_num *= 10;
35
4
                maybe_num += *it - '0';
36
4
                ++it;
37
4
            }
38
39
2
            if (*it == '$') {
40
2
                ++it;
41
                // Positional specifier, like %8$s
42
2
                if (maybe_num == 0) throw "Positional format specifier must have position of at least 1";
43
2
                count_pos = std::max(count_pos, maybe_num);
44
2
            } else {
45
                // Non-positional specifier, like %s
46
0
                ++count_normal;
47
0
            }
48
2
        };
util_string_tests.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)::'lambda'()::operator()() const
Line
Count
Source
31
25
        auto add_arg = [&] {
32
25
            unsigned maybe_num{0};
33
43
            while ('0' <= *it && *it <= '9') {
34
18
                maybe_num *= 10;
35
18
                maybe_num += *it - '0';
36
18
                ++it;
37
18
            }
38
39
25
            if (*it == '$') {
40
19
                ++it;
41
                // Positional specifier, like %8$s
42
19
                if (maybe_num == 0) throw "Positional format specifier must have position of at least 1";
43
17
                count_pos = std::max(count_pos, maybe_num);
44
17
            } else {
45
                // Non-positional specifier, like %s
46
6
                ++count_normal;
47
6
            }
48
25
        };
util_string_tests.cpp:void util::detail::CheckNumFormatSpecifiers<4u>(char const*)::'lambda'()::operator()() const
Line
Count
Source
31
3
        auto add_arg = [&] {
32
3
            unsigned maybe_num{0};
33
6
            while ('0' <= *it && *it <= '9') {
34
3
                maybe_num *= 10;
35
3
                maybe_num += *it - '0';
36
3
                ++it;
37
3
            }
38
39
3
            if (*it == '$') {
40
3
                ++it;
41
                // Positional specifier, like %8$s
42
3
                if (maybe_num == 0) throw "Positional format specifier must have position of at least 1";
43
3
                count_pos = std::max(count_pos, maybe_num);
44
3
            } else {
45
                // Non-positional specifier, like %s
46
0
                ++count_normal;
47
0
            }
48
3
        };
49
50
        // Increase argument count and consume positional specifier, if present.
51
70
        add_arg();
52
53
        // Consume flags.
54
84
        while (*it == '#' || *it == '0' || *it == '-' || *it == ' ' || *it == '+') ++it;
55
56
90
        auto parse_size = [&] {
57
90
            if (*it == '*') {
58
34
                ++it;
59
34
                add_arg();
60
56
            } else {
61
68
                while ('0' <= *it && *it <= '9') ++it;
62
56
            }
63
90
        };
util_string_tests.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)::'lambda0'()::operator()() const
Line
Count
Source
56
2
        auto parse_size = [&] {
57
2
            if (*it == '*') {
58
0
                ++it;
59
0
                add_arg();
60
2
            } else {
61
2
                while ('0' <= *it && *it <= '9') ++it;
62
2
            }
63
2
        };
util_string_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)::'lambda0'()::operator()() const
Line
Count
Source
56
43
        auto parse_size = [&] {
57
43
            if (*it == '*') {
58
5
                ++it;
59
5
                add_arg();
60
38
            } else {
61
46
                while ('0' <= *it && *it <= '9') ++it;
62
38
            }
63
43
        };
util_string_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)::'lambda0'()::operator()() const
Line
Count
Source
56
22
        auto parse_size = [&] {
57
22
            if (*it == '*') {
58
12
                ++it;
59
12
                add_arg();
60
12
            } else {
61
11
                while ('0' <= *it && *it <= '9') ++it;
62
10
            }
63
22
        };
util_string_tests.cpp:void util::detail::CheckNumFormatSpecifiers<129u>(char const*)::'lambda0'()::operator()() const
Line
Count
Source
56
2
        auto parse_size = [&] {
57
2
            if (*it == '*') {
58
0
                ++it;
59
0
                add_arg();
60
2
            } else {
61
2
                while ('0' <= *it && *it <= '9') ++it;
62
2
            }
63
2
        };
util_string_tests.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)::'lambda0'()::operator()() const
Line
Count
Source
56
19
        auto parse_size = [&] {
57
19
            if (*it == '*') {
58
15
                ++it;
59
15
                add_arg();
60
15
            } else {
61
7
                while ('0' <= *it && *it <= '9') ++it;
62
4
            }
63
19
        };
util_string_tests.cpp:void util::detail::CheckNumFormatSpecifiers<4u>(char const*)::'lambda0'()::operator()() const
Line
Count
Source
56
2
        auto parse_size = [&] {
57
2
            if (*it == '*') {
58
2
                ++it;
59
2
                add_arg();
60
2
            } else {
61
0
                while ('0' <= *it && *it <= '9') ++it;
62
0
            }
63
2
        };
64
65
        // Consume dynamic or static width value.
66
70
        parse_size();
67
68
        // Consume dynamic or static precision value.
69
70
        if (*it == '.') {
70
24
            ++it;
71
24
            parse_size();
72
24
        }
73
74
70
        if (*it == '\0') throw "Format specifier incorrectly terminated by end of string";
75
76
        // Length and type in "[flags][width][.precision][length]type"
77
        // is not checked. Parsing continues with the next '%'.
78
70
    }
79
59
    if (count_normal && count_pos) throw "Format specifiers must be all positional or all non-positional!";
80
54
    unsigned count{count_normal | count_pos};
81
54
    if (num_params != count) throw "Format specifier count must match the argument count!";
82
54
}
Unexecuted instantiation: addrman_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: addrman_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: addrman_tests.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: banman_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: banman_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: bip32_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: blockchain_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: blockencodings_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: blockfilter_index_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: blockfilter_index_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: blockfilter_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: blockmanager_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: bloom_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: chainstate_write_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: checkqueue_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: cluster_linearize_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: coins_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: coinstatsindex_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: coinsviewoverlay_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: crypto_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: dbwrapper_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: dbwrapper_tests.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: denialofservice_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: denialofservice_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: descriptor_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: flatfile_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: headers_sync_chainwork_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: headers_sync_chainwork_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: i2p_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: i2p_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: interfaces_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: key_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: logging_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: logging_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: logging_tests.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: logging_tests.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: logging_tests.cpp:void util::detail::CheckNumFormatSpecifiers<5u>(char const*)
Unexecuted instantiation: miner_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: miniminer_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: multisig_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: multisig_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: net_peer_connection_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: net_peer_connection_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: net_peer_eviction_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: net_peer_eviction_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: net_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: net_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: netbase_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: netbase_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: node_init_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: node_init_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: orphanage_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: orphanage_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: pcp_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: peerman_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: peerman_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: pmt_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: prevector_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: private_broadcast_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: private_broadcast_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: result_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: rpc_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: script_assets_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: script_p2sh_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: script_p2sh_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: script_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: serfloat_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: serialize_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: settings_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: sighash_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: streams_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: system_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: system_tests.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: testnet4_miner_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: threadpool_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: threadpool_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: transaction_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: translation_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: txdownload_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: txdownload_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: txdownload_tests.cpp:void util::detail::CheckNumFormatSpecifiers<6u>(char const*)
Unexecuted instantiation: txdownload_tests.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: txindex_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: txospenderindex_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: txpackage_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: txpackage_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: txreconciliation_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: txreconciliation_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: txrequest_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: txrequest_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: txrequest_tests.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: txvalidation_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: txvalidation_tests.cpp:void util::detail::CheckNumFormatSpecifiers<4u>(char const*)
Unexecuted instantiation: txvalidation_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: txvalidationcache_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: uint256_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
util_string_tests.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Line
Count
Source
25
9
{
26
9
    unsigned count_normal{0}; // Number of "normal" specifiers, like %s
27
9
    unsigned count_pos{0};    // Max number in positional specifier, like %8$s
28
22
    for (auto it{str}; *it != '\0'; ++it) {
29
13
        if (*it != '%' || *++it == '%') continue; // Skip escaped %%
30
31
4
        auto add_arg = [&] {
32
4
            unsigned maybe_num{0};
33
4
            while ('0' <= *it && *it <= '9') {
34
4
                maybe_num *= 10;
35
4
                maybe_num += *it - '0';
36
4
                ++it;
37
4
            }
38
39
4
            if (*it == '$') {
40
4
                ++it;
41
                // Positional specifier, like %8$s
42
4
                if (maybe_num == 0) throw "Positional format specifier must have position of at least 1";
43
4
                count_pos = std::max(count_pos, maybe_num);
44
4
            } else {
45
                // Non-positional specifier, like %s
46
4
                ++count_normal;
47
4
            }
48
4
        };
49
50
        // Increase argument count and consume positional specifier, if present.
51
4
        add_arg();
52
53
        // Consume flags.
54
4
        while (*it == '#' || *it == '0' || *it == '-' || *it == ' ' || *it == '+') ++it;
55
56
4
        auto parse_size = [&] {
57
4
            if (*it == '*') {
58
4
                ++it;
59
4
                add_arg();
60
4
            } else {
61
4
                while ('0' <= *it && *it <= '9') ++it;
62
4
            }
63
4
        };
64
65
        // Consume dynamic or static width value.
66
4
        parse_size();
67
68
        // Consume dynamic or static precision value.
69
4
        if (*it == '.') {
70
0
            ++it;
71
0
            parse_size();
72
0
        }
73
74
4
        if (*it == '\0') throw "Format specifier incorrectly terminated by end of string";
75
76
        // Length and type in "[flags][width][.precision][length]type"
77
        // is not checked. Parsing continues with the next '%'.
78
4
    }
79
9
    if (count_normal && count_pos) throw "Format specifiers must be all positional or all non-positional!";
80
9
    unsigned count{count_normal | count_pos};
81
9
    if (num_params != count) throw "Format specifier count must match the argument count!";
82
9
}
util_string_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Line
Count
Source
25
35
{
26
35
    unsigned count_normal{0}; // Number of "normal" specifiers, like %s
27
35
    unsigned count_pos{0};    // Max number in positional specifier, like %8$s
28
64
    for (auto it{str}; *it != '\0'; ++it) {
29
39
        if (*it != '%' || *++it == '%') continue; // Skip escaped %%
30
31
36
        auto add_arg = [&] {
32
36
            unsigned maybe_num{0};
33
36
            while ('0' <= *it && *it <= '9') {
34
36
                maybe_num *= 10;
35
36
                maybe_num += *it - '0';
36
36
                ++it;
37
36
            }
38
39
36
            if (*it == '$') {
40
36
                ++it;
41
                // Positional specifier, like %8$s
42
36
                if (maybe_num == 0) throw "Positional format specifier must have position of at least 1";
43
36
                count_pos = std::max(count_pos, maybe_num);
44
36
            } else {
45
                // Non-positional specifier, like %s
46
36
                ++count_normal;
47
36
            }
48
36
        };
49
50
        // Increase argument count and consume positional specifier, if present.
51
36
        add_arg();
52
53
        // Consume flags.
54
40
        while (*it == '#' || *it == '0' || *it == '-' || *it == ' ' || *it == '+') ++it;
55
56
36
        auto parse_size = [&] {
57
36
            if (*it == '*') {
58
36
                ++it;
59
36
                add_arg();
60
36
            } else {
61
36
                while ('0' <= *it && *it <= '9') ++it;
62
36
            }
63
36
        };
64
65
        // Consume dynamic or static width value.
66
36
        parse_size();
67
68
        // Consume dynamic or static precision value.
69
36
        if (*it == '.') {
70
9
            ++it;
71
9
            parse_size();
72
9
        }
73
74
36
        if (*it == '\0') throw "Format specifier incorrectly terminated by end of string";
75
76
        // Length and type in "[flags][width][.precision][length]type"
77
        // is not checked. Parsing continues with the next '%'.
78
36
    }
79
25
    if (count_normal && count_pos) throw "Format specifiers must be all positional or all non-positional!";
80
24
    unsigned count{count_normal | count_pos};
81
24
    if (num_params != count) throw "Format specifier count must match the argument count!";
82
24
}
util_string_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Line
Count
Source
25
16
{
26
16
    unsigned count_normal{0}; // Number of "normal" specifiers, like %s
27
16
    unsigned count_pos{0};    // Max number in positional specifier, like %8$s
28
35
    for (auto it{str}; *it != '\0'; ++it) {
29
22
        if (*it != '%' || *++it == '%') continue; // Skip escaped %%
30
31
17
        auto add_arg = [&] {
32
17
            unsigned maybe_num{0};
33
17
            while ('0' <= *it && *it <= '9') {
34
17
                maybe_num *= 10;
35
17
                maybe_num += *it - '0';
36
17
                ++it;
37
17
            }
38
39
17
            if (*it == '$') {
40
17
                ++it;
41
                // Positional specifier, like %8$s
42
17
                if (maybe_num == 0) throw "Positional format specifier must have position of at least 1";
43
17
                count_pos = std::max(count_pos, maybe_num);
44
17
            } else {
45
                // Non-positional specifier, like %s
46
17
                ++count_normal;
47
17
            }
48
17
        };
49
50
        // Increase argument count and consume positional specifier, if present.
51
17
        add_arg();
52
53
        // Consume flags.
54
18
        while (*it == '#' || *it == '0' || *it == '-' || *it == ' ' || *it == '+') ++it;
55
56
17
        auto parse_size = [&] {
57
17
            if (*it == '*') {
58
17
                ++it;
59
17
                add_arg();
60
17
            } else {
61
17
                while ('0' <= *it && *it <= '9') ++it;
62
17
            }
63
17
        };
64
65
        // Consume dynamic or static width value.
66
17
        parse_size();
67
68
        // Consume dynamic or static precision value.
69
17
        if (*it == '.') {
70
5
            ++it;
71
5
            parse_size();
72
5
        }
73
74
17
        if (*it == '\0') throw "Format specifier incorrectly terminated by end of string";
75
76
        // Length and type in "[flags][width][.precision][length]type"
77
        // is not checked. Parsing continues with the next '%'.
78
17
    }
79
13
    if (count_normal && count_pos) throw "Format specifiers must be all positional or all non-positional!";
80
9
    unsigned count{count_normal | count_pos};
81
9
    if (num_params != count) throw "Format specifier count must match the argument count!";
82
9
}
util_string_tests.cpp:void util::detail::CheckNumFormatSpecifiers<129u>(char const*)
Line
Count
Source
25
1
{
26
1
    unsigned count_normal{0}; // Number of "normal" specifiers, like %s
27
1
    unsigned count_pos{0};    // Max number in positional specifier, like %8$s
28
10
    for (auto it{str}; *it != '\0'; ++it) {
29
9
        if (*it != '%' || *++it == '%') continue; // Skip escaped %%
30
31
2
        auto add_arg = [&] {
32
2
            unsigned maybe_num{0};
33
2
            while ('0' <= *it && *it <= '9') {
34
2
                maybe_num *= 10;
35
2
                maybe_num += *it - '0';
36
2
                ++it;
37
2
            }
38
39
2
            if (*it == '$') {
40
2
                ++it;
41
                // Positional specifier, like %8$s
42
2
                if (maybe_num == 0) throw "Positional format specifier must have position of at least 1";
43
2
                count_pos = std::max(count_pos, maybe_num);
44
2
            } else {
45
                // Non-positional specifier, like %s
46
2
                ++count_normal;
47
2
            }
48
2
        };
49
50
        // Increase argument count and consume positional specifier, if present.
51
2
        add_arg();
52
53
        // Consume flags.
54
2
        while (*it == '#' || *it == '0' || *it == '-' || *it == ' ' || *it == '+') ++it;
55
56
2
        auto parse_size = [&] {
57
2
            if (*it == '*') {
58
2
                ++it;
59
2
                add_arg();
60
2
            } else {
61
2
                while ('0' <= *it && *it <= '9') ++it;
62
2
            }
63
2
        };
64
65
        // Consume dynamic or static width value.
66
2
        parse_size();
67
68
        // Consume dynamic or static precision value.
69
2
        if (*it == '.') {
70
0
            ++it;
71
0
            parse_size();
72
0
        }
73
74
2
        if (*it == '\0') throw "Format specifier incorrectly terminated by end of string";
75
76
        // Length and type in "[flags][width][.precision][length]type"
77
        // is not checked. Parsing continues with the next '%'.
78
2
    }
79
1
    if (count_normal && count_pos) throw "Format specifiers must be all positional or all non-positional!";
80
1
    unsigned count{count_normal | count_pos};
81
1
    if (num_params != count) throw "Format specifier count must match the argument count!";
82
1
}
util_string_tests.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Line
Count
Source
25
10
{
26
10
    unsigned count_normal{0}; // Number of "normal" specifiers, like %s
27
10
    unsigned count_pos{0};    // Max number in positional specifier, like %8$s
28
24
    for (auto it{str}; *it != '\0'; ++it) {
29
14
        if (*it != '%' || *++it == '%') continue; // Skip escaped %%
30
31
10
        auto add_arg = [&] {
32
10
            unsigned maybe_num{0};
33
10
            while ('0' <= *it && *it <= '9') {
34
10
                maybe_num *= 10;
35
10
                maybe_num += *it - '0';
36
10
                ++it;
37
10
            }
38
39
10
            if (*it == '$') {
40
10
                ++it;
41
                // Positional specifier, like %8$s
42
10
                if (maybe_num == 0) throw "Positional format specifier must have position of at least 1";
43
10
                count_pos = std::max(count_pos, maybe_num);
44
10
            } else {
45
                // Non-positional specifier, like %s
46
10
                ++count_normal;
47
10
            }
48
10
        };
49
50
        // Increase argument count and consume positional specifier, if present.
51
10
        add_arg();
52
53
        // Consume flags.
54
19
        while (*it == '#' || *it == '0' || *it == '-' || *it == ' ' || *it == '+') ++it;
55
56
10
        auto parse_size = [&] {
57
10
            if (*it == '*') {
58
10
                ++it;
59
10
                add_arg();
60
10
            } else {
61
10
                while ('0' <= *it && *it <= '9') ++it;
62
10
            }
63
10
        };
64
65
        // Consume dynamic or static width value.
66
10
        parse_size();
67
68
        // Consume dynamic or static precision value.
69
10
        if (*it == '.') {
70
9
            ++it;
71
9
            parse_size();
72
9
        }
73
74
10
        if (*it == '\0') throw "Format specifier incorrectly terminated by end of string";
75
76
        // Length and type in "[flags][width][.precision][length]type"
77
        // is not checked. Parsing continues with the next '%'.
78
10
    }
79
10
    if (count_normal && count_pos) throw "Format specifiers must be all positional or all non-positional!";
80
10
    unsigned count{count_normal | count_pos};
81
10
    if (num_params != count) throw "Format specifier count must match the argument count!";
82
10
}
util_string_tests.cpp:void util::detail::CheckNumFormatSpecifiers<4u>(char const*)
Line
Count
Source
25
1
{
26
1
    unsigned count_normal{0}; // Number of "normal" specifiers, like %s
27
1
    unsigned count_pos{0};    // Max number in positional specifier, like %8$s
28
2
    for (auto it{str}; *it != '\0'; ++it) {
29
1
        if (*it != '%' || *++it == '%') continue; // Skip escaped %%
30
31
1
        auto add_arg = [&] {
32
1
            unsigned maybe_num{0};
33
1
            while ('0' <= *it && *it <= '9') {
34
1
                maybe_num *= 10;
35
1
                maybe_num += *it - '0';
36
1
                ++it;
37
1
            }
38
39
1
            if (*it == '$') {
40
1
                ++it;
41
                // Positional specifier, like %8$s
42
1
                if (maybe_num == 0) throw "Positional format specifier must have position of at least 1";
43
1
                count_pos = std::max(count_pos, maybe_num);
44
1
            } else {
45
                // Non-positional specifier, like %s
46
1
                ++count_normal;
47
1
            }
48
1
        };
49
50
        // Increase argument count and consume positional specifier, if present.
51
1
        add_arg();
52
53
        // Consume flags.
54
1
        while (*it == '#' || *it == '0' || *it == '-' || *it == ' ' || *it == '+') ++it;
55
56
1
        auto parse_size = [&] {
57
1
            if (*it == '*') {
58
1
                ++it;
59
1
                add_arg();
60
1
            } else {
61
1
                while ('0' <= *it && *it <= '9') ++it;
62
1
            }
63
1
        };
64
65
        // Consume dynamic or static width value.
66
1
        parse_size();
67
68
        // Consume dynamic or static precision value.
69
1
        if (*it == '.') {
70
1
            ++it;
71
1
            parse_size();
72
1
        }
73
74
1
        if (*it == '\0') throw "Format specifier incorrectly terminated by end of string";
75
76
        // Length and type in "[flags][width][.precision][length]type"
77
        // is not checked. Parsing continues with the next '%'.
78
1
    }
79
1
    if (count_normal && count_pos) throw "Format specifiers must be all positional or all non-positional!";
80
1
    unsigned count{count_normal | count_pos};
81
1
    if (num_params != count) throw "Format specifier count must match the argument count!";
82
1
}
Unexecuted instantiation: util_tests.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: validation_block_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: validation_chainstate_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: validation_chainstate_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: validation_chainstatemanager_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: validation_chainstatemanager_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: validation_flush_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: validation_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: validation_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: versionbits_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: versionbits_tests.cpp:void util::detail::CheckNumFormatSpecifiers<4u>(char const*)
Unexecuted instantiation: versionbits_tests.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: wallet_test_fixture.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: wallet_test_fixture.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: wallet_test_fixture.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: wallet_test_fixture.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: db_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: coinselector_tests.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: coinselector_tests.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: coinselector_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: coinselector_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: coinselection_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: coinselection_tests.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: coinselection_tests.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: coinselection_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: feebumper_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: feebumper_tests.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: feebumper_tests.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: feebumper_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: group_outputs_tests.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: group_outputs_tests.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: group_outputs_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: group_outputs_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: ismine_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: ismine_tests.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: ismine_tests.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: ismine_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: psbt_wallet_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: psbt_wallet_tests.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: psbt_wallet_tests.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: psbt_wallet_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: scriptpubkeyman_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: scriptpubkeyman_tests.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: scriptpubkeyman_tests.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: scriptpubkeyman_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: spend_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: spend_tests.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: spend_tests.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: spend_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: wallet_rpc_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: wallet_rpc_tests.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: wallet_rpc_tests.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: wallet_rpc_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: wallet_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: wallet_tests.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: wallet_tests.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: wallet_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: wallet_transaction_tests.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: wallet_transaction_tests.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: wallet_transaction_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: wallet_transaction_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: walletdb_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: walletdb_tests.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: walletdb_tests.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: walletdb_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: walletload_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: walletload_tests.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: walletload_tests.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: walletload_tests.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: ipc_tests.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: blockfilter.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: logging.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(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: random.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: setup_common.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: setup_common.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: txmempool.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: txmempool.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: validation.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: util.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(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: client.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(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<0u>(char const*)
Unexecuted instantiation: addrman.cpp:void util::detail::CheckNumFormatSpecifiers<5u>(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<6u>(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<1u>(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: 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: blockfilterindex.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: blockfilterindex.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: blockfilterindex.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: blockfilterindex.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: coinstatsindex.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: coinstatsindex.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: coinstatsindex.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: txindex.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: txindex.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: txospenderindex.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: txospenderindex.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(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<0u>(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: coinstats.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(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<4u>(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<0u>(char const*)
Unexecuted instantiation: net_processing.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: net_processing.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: net_processing.cpp:void util::detail::CheckNumFormatSpecifiers<6u>(char const*)
Unexecuted instantiation: net_processing.cpp:void util::detail::CheckNumFormatSpecifiers<5u>(char const*)
Unexecuted instantiation: net_processing.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: net_processing.cpp:void util::detail::CheckNumFormatSpecifiers<4u>(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: abort.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: abort.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(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<6u>(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: caches.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: caches.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(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: coins_view_args.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: context.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: database_args.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(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<1u>(char const*)
Unexecuted instantiation: interfaces.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(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<2u>(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.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(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<3u>(char const*)
Unexecuted instantiation: miner.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: minisketchwrapper.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: peerman_args.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: peerman_args.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(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<1u>(char const*)
Unexecuted instantiation: transaction.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: txdownloadman_impl.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: txdownloadman_impl.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: txdownloadman_impl.cpp:void util::detail::CheckNumFormatSpecifiers<6u>(char const*)
Unexecuted instantiation: txdownloadman_impl.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: txorphanage.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: txorphanage.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(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: txreconciliation.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: txreconciliation.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: noui.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: noui.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: ephemeral_policy.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: block_policy_estimator.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: block_policy_estimator.cpp:void util::detail::CheckNumFormatSpecifiers<18u>(char const*)
Unexecuted instantiation: block_policy_estimator.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: block_policy_estimator.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: block_policy_estimator.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: block_policy_estimator.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: truc_policy.cpp:void util::detail::CheckNumFormatSpecifiers<4u>(char const*)
Unexecuted instantiation: truc_policy.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: private_broadcast.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: private_broadcast.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: rest.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: rest.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: rest.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(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<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_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: sigcache.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: signet.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<4u>(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: txdb.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: txdb.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: txmempool.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: txmempool.cpp:void util::detail::CheckNumFormatSpecifiers<4u>(char const*)
Unexecuted instantiation: txrequest.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: txrequest.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<1u>(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: 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: coin.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: psbt.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: block.cpp:void util::detail::CheckNumFormatSpecifiers<8u>(char const*)
Unexecuted instantiation: transaction.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: transaction.cpp:void util::detail::CheckNumFormatSpecifiers<5u>(char const*)
Unexecuted instantiation: interpreter.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(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: 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: 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: 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<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<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<4u>(char const*)
Unexecuted instantiation: spend.cpp:void util::detail::CheckNumFormatSpecifiers<20u>(char const*)
Unexecuted instantiation: sqlite.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<0u>(char const*)
Unexecuted instantiation: transaction.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: wallet.cpp:void util::detail::CheckNumFormatSpecifiers<5u>(char const*)
Unexecuted instantiation: walletdb.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(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<4u>(char const*)
Unexecuted instantiation: db.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: db.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(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: 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<0u>(char const*)
Unexecuted instantiation: fees.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(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<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: 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<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: signmessage.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: 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: ipc_test.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: ipc_test.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: ipc_test.capnp.proxy-client.c++:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: ipc_test.capnp.proxy-types.c++:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: ipc_test.capnp.proxy-server.c++:void util::detail::CheckNumFormatSpecifiers<1u>(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: process.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: process.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: process.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: init.capnp.proxy-client.c++:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: init.capnp.proxy-client.c++:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: init.capnp.proxy-types.c++:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: init.capnp.proxy-types.c++:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: mining.capnp.proxy-types.c++:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: rpc.capnp.proxy-types.c++:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: init.capnp.proxy-server.c++:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: init.capnp.proxy-server.c++:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: mining.capnp.proxy-client.c++:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: mining.capnp.proxy-server.c++:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: rpc.capnp.proxy-client.c++:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: rpc.capnp.proxy-server.c++:void util::detail::CheckNumFormatSpecifiers<1u>(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: bloom.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(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: run_command.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(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_io.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: core_io.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: core_io.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<1u>(char const*)
Unexecuted instantiation: netaddress.cpp:void util::detail::CheckNumFormatSpecifiers<4u>(char const*)
Unexecuted instantiation: netbase.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: netbase.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: netbase.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(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: policy.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: policy.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: policy.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: rawtransaction_util.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(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<4u>(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: descriptor.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: descriptor.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: descriptor.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: signingprovider.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: asmap.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(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: 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: 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: time.cpp:void util::detail::CheckNumFormatSpecifiers<7u>(char const*)
Unexecuted instantiation: logging.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: logging.cpp:void util::detail::CheckNumFormatSpecifiers<5u>(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: streams.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: sync.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: sync.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
Unexecuted instantiation: sync.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: sync.cpp:void util::detail::CheckNumFormatSpecifiers<5u>(char const*)
Unexecuted instantiation: sync.cpp:void util::detail::CheckNumFormatSpecifiers<0u>(char const*)
Unexecuted instantiation: sync.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: clientversion.cpp:void util::detail::CheckNumFormatSpecifiers<3u>(char const*)
Unexecuted instantiation: clientversion.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
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: license_info.cpp:void util::detail::CheckNumFormatSpecifiers<1u>(char const*)
Unexecuted instantiation: license_info.cpp:void util::detail::CheckNumFormatSpecifiers<2u>(char const*)
83
} // namespace detail
84
85
/**
86
 * @brief A wrapper for a compile-time partially validated format string
87
 *
88
 * This struct can be used to enforce partial compile-time validation of format
89
 * strings, to reduce the likelihood of tinyformat throwing exceptions at
90
 * run-time. Validation is partial to try and prevent the most common errors
91
 * while avoiding re-implementing the entire parsing logic.
92
 */
93
template <unsigned num_params>
94
struct ConstevalFormatString {
95
    const char* const fmt;
96
    consteval ConstevalFormatString(const char* str) : fmt{str} { detail::CheckNumFormatSpecifiers<num_params>(fmt); }
97
};
98
99
void ReplaceAll(std::string& in_out, const std::string& search, const std::string& substitute);
100
101
/** Split a string on any char found in separators, returning a vector.
102
 *
103
 * If sep does not occur in sp, a singleton with the entirety of sp is returned.
104
 *
105
 * @param[in] include_sep Whether to include the separator at the end of the left side of the splits.
106
 *
107
 * Note that this function does not care about braces, so splitting
108
 * "foo(bar(1),2),3) on ',' will return {"foo(bar(1)", "2)", "3)"}.
109
 *
110
 * If include_sep == true, splitting "foo(bar(1),2),3) on ','
111
 * will return:
112
 *  - foo(bar(1),
113
 *  - 2),
114
 *  - 3)
115
 */
116
template <typename T = std::span<const char>>
117
std::vector<T> Split(const std::span<const char>& sp, std::string_view separators, bool include_sep = false)
118
1.24M
{
119
1.24M
    std::vector<T> ret;
120
1.24M
    auto it = sp.begin();
121
1.24M
    auto start = it;
122
20.1M
    while (it != sp.end()) {
123
18.8M
        if (separators.find(*it) != std::string::npos) {
124
84.7k
            if (include_sep) {
125
159
                ret.emplace_back(start, it + 1);
126
84.6k
            } else {
127
84.6k
                ret.emplace_back(start, it);
128
84.6k
            }
129
84.7k
            start = it + 1;
130
84.7k
        }
131
18.8M
        ++it;
132
18.8M
    }
133
1.24M
    ret.emplace_back(start, it);
134
1.24M
    return ret;
135
1.24M
}
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>>, bool)
Line
Count
Source
118
1.17M
{
119
1.17M
    std::vector<T> ret;
120
1.17M
    auto it = sp.begin();
121
1.17M
    auto start = it;
122
11.7M
    while (it != sp.end()) {
123
10.5M
        if (separators.find(*it) != std::string::npos) {
124
37.8k
            if (include_sep) {
125
0
                ret.emplace_back(start, it + 1);
126
37.8k
            } else {
127
37.8k
                ret.emplace_back(start, it);
128
37.8k
            }
129
37.8k
            start = it + 1;
130
37.8k
        }
131
10.5M
        ++it;
132
10.5M
    }
133
1.17M
    ret.emplace_back(start, it);
134
1.17M
    return ret;
135
1.17M
}
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>>, bool)
Line
Count
Source
118
72.2k
{
119
72.2k
    std::vector<T> ret;
120
72.2k
    auto it = sp.begin();
121
72.2k
    auto start = it;
122
8.40M
    while (it != sp.end()) {
123
8.33M
        if (separators.find(*it) != std::string::npos) {
124
46.8k
            if (include_sep) {
125
159
                ret.emplace_back(start, it + 1);
126
46.6k
            } else {
127
46.6k
                ret.emplace_back(start, it);
128
46.6k
            }
129
46.8k
            start = it + 1;
130
46.8k
        }
131
8.33M
        ++it;
132
8.33M
    }
133
72.2k
    ret.emplace_back(start, it);
134
72.2k
    return ret;
135
72.2k
}
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>>, bool)
Line
Count
Source
118
50
{
119
50
    std::vector<T> ret;
120
50
    auto it = sp.begin();
121
50
    auto start = it;
122
3.31k
    while (it != sp.end()) {
123
3.26k
        if (separators.find(*it) != std::string::npos) {
124
50
            if (include_sep) {
125
0
                ret.emplace_back(start, it + 1);
126
50
            } else {
127
50
                ret.emplace_back(start, it);
128
50
            }
129
50
            start = it + 1;
130
50
        }
131
3.26k
        ++it;
132
3.26k
    }
133
50
    ret.emplace_back(start, it);
134
50
    return ret;
135
50
}
136
137
/** Split a string on every instance of sep, returning a vector.
138
 *
139
 * If sep does not occur in sp, a singleton with the entirety of sp is returned.
140
 *
141
 * Note that this function does not care about braces, so splitting
142
 * "foo(bar(1),2),3) on ',' will return {"foo(bar(1)", "2)", "3)"}.
143
 */
144
template <typename T = std::span<const char>>
145
std::vector<T> Split(const std::span<const char>& sp, char sep, bool include_sep = false)
146
1.24M
{
147
1.24M
    return Split<T>(sp, std::string_view{&sep, 1}, include_sep);
148
1.24M
}
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, bool)
Line
Count
Source
146
1.17M
{
147
1.17M
    return Split<T>(sp, std::string_view{&sep, 1}, include_sep);
148
1.17M
}
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, bool)
Line
Count
Source
146
71.9k
{
147
71.9k
    return Split<T>(sp, std::string_view{&sep, 1}, include_sep);
148
71.9k
}
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, bool)
Line
Count
Source
146
50
{
147
50
    return Split<T>(sp, std::string_view{&sep, 1}, include_sep);
148
50
}
149
150
[[nodiscard]] inline std::vector<std::string> SplitString(std::string_view str, char sep)
151
1.17M
{
152
1.17M
    return Split<std::string>(str, sep);
153
1.17M
}
154
155
[[nodiscard]] inline std::vector<std::string> SplitString(std::string_view str, std::string_view separators)
156
2.80k
{
157
2.80k
    return Split<std::string>(str, separators);
158
2.80k
}
159
160
[[nodiscard]] inline std::string_view TrimStringView(std::string_view str, std::string_view pattern = " \f\n\r\t\v")
161
1.22M
{
162
1.22M
    std::string::size_type front = str.find_first_not_of(pattern);
163
1.22M
    if (front == std::string::npos) {
164
88
        return {};
165
88
    }
166
1.22M
    std::string::size_type end = str.find_last_not_of(pattern);
167
1.22M
    return str.substr(front, end - front + 1);
168
1.22M
}
169
170
[[nodiscard]] inline std::string TrimString(std::string_view str, std::string_view pattern = " \f\n\r\t\v")
171
474k
{
172
474k
    return std::string(TrimStringView(str, pattern));
173
474k
}
174
175
[[nodiscard]] inline std::string_view RemoveSuffixView(std::string_view str, std::string_view suffix)
176
1.53k
{
177
1.53k
    if (str.ends_with(suffix)) {
178
1.53k
        return str.substr(0, str.size() - suffix.size());
179
1.53k
    }
180
0
    return str;
181
1.53k
}
182
183
[[nodiscard]] inline std::string_view RemovePrefixView(std::string_view str, std::string_view prefix)
184
5.23M
{
185
5.23M
    if (str.starts_with(prefix)) {
186
1.13k
        return str.substr(prefix.size());
187
1.13k
    }
188
5.23M
    return str;
189
5.23M
}
190
191
[[nodiscard]] inline std::string RemovePrefix(std::string_view str, std::string_view prefix)
192
11
{
193
11
    return std::string(RemovePrefixView(str, prefix));
194
11
}
195
196
/**
197
 * Join all container items. Typically used to concatenate strings but accepts
198
 * containers with elements of any type.
199
 *
200
 * @param container The items to join
201
 * @param separator The separator
202
 * @param unary_op  Apply this operator to each item
203
 */
204
template <typename C, typename S, typename UnaryOp>
205
// NOLINTNEXTLINE(misc-no-recursion)
206
auto Join(const C& container, const S& separator, UnaryOp unary_op)
207
257k
{
208
257k
    decltype(unary_op(*container.begin())) ret;
209
257k
    bool first{true};
210
1.00M
    for (const auto& item : container) {
211
1.00M
        if (!first) ret += separator;
212
1.00M
        ret += unary_op(item);
213
1.00M
        first = false;
214
1.00M
    }
215
257k
    return ret;
216
257k
}
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&)>(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&))
Line
Count
Source
207
2.31k
{
208
2.31k
    decltype(unary_op(*container.begin())) ret;
209
2.31k
    bool first{true};
210
13.8k
    for (const auto& item : container) {
211
13.8k
        if (!first) ret += separator;
212
13.8k
        ret += unary_op(item);
213
13.8k
        first = false;
214
13.8k
    }
215
2.31k
    return ret;
216
2.31k
}
auto util::Join<std::vector<LogCategory, std::allocator<LogCategory>>, char [3], BCLog::Logger::LogCategoriesString[abi:cxx11]() const::'lambda'(LogCategory const&)>(std::vector<LogCategory, std::allocator<LogCategory>> const&, char const (&) [3], BCLog::Logger::LogCategoriesString[abi:cxx11]() const::'lambda'(LogCategory const&))
Line
Count
Source
207
6.01k
{
208
6.01k
    decltype(unary_op(*container.begin())) ret;
209
6.01k
    bool first{true};
210
186k
    for (const auto& item : container) {
211
186k
        if (!first) ret += separator;
212
186k
        ret += unary_op(item);
213
186k
        first = false;
214
186k
    }
215
6.01k
    return ret;
216
6.01k
}
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], 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]>(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])::'lambda'(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&)>(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], 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]>(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])::'lambda'(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&))
Line
Count
Source
207
184
{
208
184
    decltype(unary_op(*container.begin())) ret;
209
184
    bool first{true};
210
242
    for (const auto& item : container) {
211
242
        if (!first) ret += separator;
212
242
        ret += unary_op(item);
213
242
        first = false;
214
242
    }
215
184
    return ret;
216
184
}
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], 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'(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&)>(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], 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'(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&))
Line
Count
Source
207
91.2k
{
208
91.2k
    decltype(unary_op(*container.begin())) ret;
209
91.2k
    bool first{true};
210
665k
    for (const auto& item : container) {
211
665k
        if (!first) ret += separator;
212
665k
        ret += unary_op(item);
213
665k
        first = false;
214
665k
    }
215
91.2k
    return ret;
216
91.2k
}
util_tests.cpp:auto util::Join<std::__cxx11::list<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_tests::util_Join::test_method()::$_0>(std::__cxx11::list<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_tests::util_Join::test_method()::$_0)
Line
Count
Source
207
6
{
208
6
    decltype(unary_op(*container.begin())) ret;
209
6
    bool first{true};
210
6
    for (const auto& item : container) {
211
6
        if (!first) ret += separator;
212
6
        ret += unary_op(item);
213
6
        first = false;
214
6
    }
215
6
    return ret;
216
6
}
coinselection_tests.cpp:auto util::Join<std::set<std::shared_ptr<wallet::COutput>, wallet::OutputPtrComparator, std::allocator<std::shared_ptr<wallet::COutput>>>, char [2], wallet::coinselection_tests::InputAmountsToString[abi:cxx11](wallet::SelectionResult const&)::$_0>(std::set<std::shared_ptr<wallet::COutput>, wallet::OutputPtrComparator, std::allocator<std::shared_ptr<wallet::COutput>>> const&, char const (&) [2], wallet::coinselection_tests::InputAmountsToString[abi:cxx11](wallet::SelectionResult const&)::$_0)
Line
Count
Source
207
188
{
208
188
    decltype(unary_op(*container.begin())) ret;
209
188
    bool first{true};
210
476
    for (const auto& item : container) {
211
476
        if (!first) ret += separator;
212
476
        ret += unary_op(item);
213
476
        first = false;
214
476
    }
215
188
    return ret;
216
188
}
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
207
1.29k
{
208
1.29k
    decltype(unary_op(*container.begin())) ret;
209
1.29k
    bool first{true};
210
1.29k
    for (const auto& item : container) {
211
1.29k
        if (!first) ret += separator;
212
1.29k
        ret += unary_op(item);
213
1.29k
        first = false;
214
1.29k
    }
215
1.29k
    return ret;
216
1.29k
}
auto util::Join<std::vector<bilingual_str, std::allocator<bilingual_str>>, bilingual_str, 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'(std::vector<bilingual_str, std::allocator<bilingual_str>> const&)>(std::vector<bilingual_str, std::allocator<bilingual_str>> const&, bilingual_str const&, 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'(std::vector<bilingual_str, std::allocator<bilingual_str>> const&))
Line
Count
Source
207
119k
{
208
119k
    decltype(unary_op(*container.begin())) ret;
209
119k
    bool first{true};
210
119k
    for (const auto& item : container) {
211
145
        if (!first) ret += separator;
212
145
        ret += unary_op(item);
213
145
        first = false;
214
145
    }
215
119k
    return ret;
216
119k
}
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)
Line
Count
Source
207
14
{
208
14
    decltype(unary_op(*container.begin())) ret;
209
14
    bool first{true};
210
42
    for (const auto& item : container) {
211
42
        if (!first) ret += separator;
212
42
        ret += unary_op(item);
213
42
        first = false;
214
42
    }
215
14
    return ret;
216
14
}
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
207
13.3k
{
208
13.3k
    decltype(unary_op(*container.begin())) ret;
209
13.3k
    bool first{true};
210
40.0k
    for (const auto& item : container) {
211
40.0k
        if (!first) ret += separator;
212
40.0k
        ret += unary_op(item);
213
40.0k
        first = false;
214
40.0k
    }
215
13.3k
    return ret;
216
13.3k
}
outputtype.cpp:auto util::Join<std::array<OutputType, 4ul>, char [3], FormatAllOutputTypes[abi:cxx11]()::$_0>(std::array<OutputType, 4ul> const&, char const (&) [3], FormatAllOutputTypes[abi:cxx11]()::$_0)
Line
Count
Source
207
21.4k
{
208
21.4k
    decltype(unary_op(*container.begin())) ret;
209
21.4k
    bool first{true};
210
85.9k
    for (const auto& item : container) {
211
85.9k
        if (!first) ret += separator;
212
85.9k
        ret += unary_op(item);
213
85.9k
        first = false;
214
85.9k
    }
215
21.4k
    return ret;
216
21.4k
}
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)
Line
Count
Source
207
165
{
208
165
    decltype(unary_op(*container.begin())) ret;
209
165
    bool first{true};
210
368
    for (const auto& item : container) {
211
368
        if (!first) ret += separator;
212
368
        ret += unary_op(item);
213
368
        first = false;
214
368
    }
215
165
    return ret;
216
165
}
logging.cpp:auto util::Join<std::vector<util::log::Level, std::allocator<util::log::Level>>, char [3], BCLog::Logger::LogLevelsString[abi:cxx11]() const::$_0>(std::vector<util::log::Level, std::allocator<util::log::Level>> const&, char const (&) [3], BCLog::Logger::LogLevelsString[abi:cxx11]() const::$_0)
Line
Count
Source
207
1.84k
{
208
1.84k
    decltype(unary_op(*container.begin())) ret;
209
1.84k
    bool first{true};
210
5.54k
    for (const auto& item : container) {
211
5.54k
        if (!first) ret += separator;
212
5.54k
        ret += unary_op(item);
213
5.54k
        first = false;
214
5.54k
    }
215
1.84k
    return ret;
216
1.84k
}
217
218
template <typename C, typename S>
219
auto Join(const C& container, const S& separator)
220
211k
{
221
666k
    return Join(container, separator, [](const auto& i) { return i; });
auto 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]>(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])::'lambda'(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&)::operator()<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>(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&) const
Line
Count
Source
221
242
    return Join(container, separator, [](const auto& i) { return i; });
auto 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'(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&)::operator()<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>(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&) const
Line
Count
Source
221
665k
    return Join(container, separator, [](const auto& i) { return i; });
auto 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'(std::vector<bilingual_str, std::allocator<bilingual_str>> const&)::operator()<bilingual_str>(std::vector<bilingual_str, std::allocator<bilingual_str>> const&) const
Line
Count
Source
221
145
    return Join(container, separator, [](const auto& i) { return i; });
222
211k
}
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]>(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])
Line
Count
Source
220
184
{
221
184
    return Join(container, separator, [](const auto& i) { return i; });
222
184
}
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
220
91.2k
{
221
91.2k
    return Join(container, separator, [](const auto& i) { return i; });
222
91.2k
}
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
220
119k
{
221
119k
    return Join(container, separator, [](const auto& i) { return i; });
222
119k
}
223
224
/**
225
 * Create an unordered multi-line list of items.
226
 */
227
inline std::string MakeUnorderedList(const std::vector<std::string>& items)
228
2.31k
{
229
13.8k
    return Join(items, "\n", [](const std::string& item) { return "- " + item; });
230
2.31k
}
231
232
/**
233
 * Check if a string does not contain any embedded NUL (\0) characters
234
 */
235
[[nodiscard]] inline bool ContainsNoNUL(std::string_view str) noexcept
236
2.24M
{
237
22.2M
    for (auto c : str) {
238
22.2M
        if (c == 0) return false;
239
22.2M
    }
240
2.24M
    return true;
241
2.24M
}
242
243
/**
244
 * Locale-independent version of std::to_string
245
 */
246
template <typename T>
247
std::string ToString(const T& t)
248
258k
{
249
258k
    std::ostringstream oss;
250
258k
    oss.imbue(std::locale::classic());
251
258k
    oss << t;
252
258k
    return oss.str();
253
258k
}
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> util::ToString<unsigned int>(unsigned int const&)
Line
Count
Source
248
9.02k
{
249
9.02k
    std::ostringstream oss;
250
9.02k
    oss.imbue(std::locale::classic());
251
9.02k
    oss << t;
252
9.02k
    return oss.str();
253
9.02k
}
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> util::ToString<int>(int const&)
Line
Count
Source
248
223k
{
249
223k
    std::ostringstream oss;
250
223k
    oss.imbue(std::locale::classic());
251
223k
    oss << t;
252
223k
    return oss.str();
253
223k
}
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> util::ToString<double>(double const&)
Line
Count
Source
248
10
{
249
10
    std::ostringstream oss;
250
10
    oss.imbue(std::locale::classic());
251
10
    oss << t;
252
10
    return oss.str();
253
10
}
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> util::ToString<unsigned short>(unsigned short const&)
Line
Count
Source
248
1
{
249
1
    std::ostringstream oss;
250
1
    oss.imbue(std::locale::classic());
251
1
    oss << t;
252
1
    return oss.str();
253
1
}
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> util::ToString<unsigned long>(unsigned long const&)
Line
Count
Source
248
1.88k
{
249
1.88k
    std::ostringstream oss;
250
1.88k
    oss.imbue(std::locale::classic());
251
1.88k
    oss << t;
252
1.88k
    return oss.str();
253
1.88k
}
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> util::ToString<long>(long const&)
Line
Count
Source
248
23.7k
{
249
23.7k
    std::ostringstream oss;
250
23.7k
    oss.imbue(std::locale::classic());
251
23.7k
    oss << t;
252
23.7k
    return oss.str();
253
23.7k
}
254
255
/**
256
 * Check whether a container begins with the given prefix.
257
 */
258
template <typename T1, size_t PREFIX_LEN>
259
[[nodiscard]] inline bool HasPrefix(const T1& obj,
260
                                const std::array<uint8_t, PREFIX_LEN>& prefix)
261
4.02M
{
262
4.02M
    return obj.size() >= PREFIX_LEN &&
263
4.02M
           std::equal(std::begin(prefix), std::end(prefix), std::begin(obj));
264
4.02M
}
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
261
118
{
262
118
    return obj.size() >= PREFIX_LEN &&
263
118
           std::equal(std::begin(prefix), std::end(prefix), std::begin(obj));
264
118
}
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
261
1.85k
{
262
1.85k
    return obj.size() >= PREFIX_LEN &&
263
1.85k
           std::equal(std::begin(prefix), std::end(prefix), std::begin(obj));
264
1.85k
}
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
261
9.89k
{
262
9.89k
    return obj.size() >= PREFIX_LEN &&
263
9.89k
           std::equal(std::begin(prefix), std::end(prefix), std::begin(obj));
264
9.89k
}
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
261
6.46k
{
262
6.46k
    return obj.size() >= PREFIX_LEN &&
263
6.46k
           std::equal(std::begin(prefix), std::end(prefix), std::begin(obj));
264
6.46k
}
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
261
998k
{
262
998k
    return obj.size() >= PREFIX_LEN &&
263
998k
           std::equal(std::begin(prefix), std::end(prefix), std::begin(obj));
264
998k
}
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
261
2.99M
{
262
2.99M
    return obj.size() >= PREFIX_LEN &&
263
2.99M
           std::equal(std::begin(prefix), std::end(prefix), std::begin(obj));
264
2.99M
}
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
261
3.63k
{
262
3.63k
    return obj.size() >= PREFIX_LEN &&
263
3.63k
           std::equal(std::begin(prefix), std::end(prefix), std::begin(obj));
264
3.63k
}
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
261
2.34k
{
262
2.34k
    return obj.size() >= PREFIX_LEN &&
263
2.34k
           std::equal(std::begin(prefix), std::end(prefix), std::begin(obj));
264
2.34k
}
265
266
struct LineReader {
267
    const std::span<const std::byte>::iterator start;
268
    const std::span<const std::byte>::iterator end;
269
    const size_t max_line_length;
270
    std::span<const std::byte>::iterator it;
271
272
    explicit LineReader(std::span<const std::byte> buffer, size_t max_line_length);
273
10
    explicit LineReader(std::string_view str, size_t max_line_length) : LineReader{std::as_bytes(std::span{str}), max_line_length} {}
274
275
    /**
276
     * Returns a string from current iterator position up to (but not including) next \n
277
     * and advances iterator to the character following the \n on success.
278
     * Will not return a line longer than max_line_length.
279
     * @returns the next string from the buffer.
280
     *          std::nullopt if end of buffer is reached without finding a \n.
281
     * @throws a std::runtime_error if max_line_length + 1 bytes are read without finding \n.
282
     */
283
    std::optional<std::string> ReadLine();
284
285
    /**
286
     * Returns string from current iterator position of specified length
287
     * if possible and advances iterator on success.
288
     * May exceed max_line_length but will not read past end of buffer.
289
     * @param[in]   len     The number of bytes to read from the buffer
290
     * @returns a string of the expected length.
291
     * @throws a std::runtime_error if there is not enough data in the buffer.
292
     */
293
    std::string ReadLength(size_t len);
294
295
    /**
296
     * Returns remaining size of bytes in buffer
297
     */
298
    size_t Remaining() const;
299
300
    /**
301
     * Returns number of bytes already read from buffer
302
     */
303
    size_t Consumed() const;
304
};
305
} // namespace util
306
307
#endif // BITCOIN_UTIL_STRING_H