Coverage Report

Created: 2025-06-10 13:21

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/bitcoin/src/util/vector.h
Line
Count
Source
1
// Copyright (c) 2019-2022 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_VECTOR_H
6
#define BITCOIN_UTIL_VECTOR_H
7
8
#include <functional>
9
#include <initializer_list>
10
#include <optional>
11
#include <type_traits>
12
#include <utility>
13
#include <vector>
14
15
/** Construct a vector with the specified elements.
16
 *
17
 * This is preferable over the list initializing constructor of std::vector:
18
 * - It automatically infers the element type from its arguments.
19
 * - If any arguments are rvalue references, they will be moved into the vector
20
 *   (list initialization always copies).
21
 */
22
template<typename... Args>
23
inline std::vector<std::common_type_t<Args...>> Vector(Args&&... args)
24
1.38M
{
25
1.38M
    std::vector<std::common_type_t<Args...>> ret;
26
1.38M
    ret.reserve(sizeof...(args));
27
    // The line below uses the trick from https://www.experts-exchange.com/articles/32502/None-recursive-variadic-templates-with-std-initializer-list.html
28
1.38M
    (void)std::initializer_list<int>{(ret.emplace_back(std::forward<Args>(args)), 0)...};
29
1.38M
    return ret;
30
1.38M
}
std::vector<std::common_type<uint256 const&, uint256&>::type, std::allocator<std::common_type<uint256 const&, uint256&>::type> > Vector<uint256 const&, uint256&>(uint256 const&, uint256&)
Line
Count
Source
24
29.2k
{
25
29.2k
    std::vector<std::common_type_t<Args...>> ret;
26
29.2k
    ret.reserve(sizeof...(args));
27
    // The line below uses the trick from https://www.experts-exchange.com/articles/32502/None-recursive-variadic-templates-with-std-initializer-list.html
28
29.2k
    (void)std::initializer_list<int>{(ret.emplace_back(std::forward<Args>(args)), 0)...};
29
29.2k
    return ret;
30
29.2k
}
std::vector<std::common_type<std::vector<unsigned char, std::allocator<unsigned char> > >::type, std::allocator<std::common_type<std::vector<unsigned char, std::allocator<unsigned char> > >::type> > Vector<std::vector<unsigned char, std::allocator<unsigned char> > >(std::vector<unsigned char, std::allocator<unsigned char> >&&)
Line
Count
Source
24
99.8k
{
25
99.8k
    std::vector<std::common_type_t<Args...>> ret;
26
99.8k
    ret.reserve(sizeof...(args));
27
    // The line below uses the trick from https://www.experts-exchange.com/articles/32502/None-recursive-variadic-templates-with-std-initializer-list.html
28
99.8k
    (void)std::initializer_list<int>{(ret.emplace_back(std::forward<Args>(args)), 0)...};
29
99.8k
    return ret;
30
99.8k
}
descriptor.cpp:std::vector<std::common_type<std::unique_ptr<(anonymous namespace)::PubkeyProvider, std::default_delete<(anonymous namespace)::PubkeyProvider> > >::type, std::allocator<std::common_type<std::unique_ptr<(anonymous namespace)::PubkeyProvider, std::default_delete<(anonymous namespace)::PubkeyProvider> > >::type> > Vector<std::unique_ptr<(anonymous namespace)::PubkeyProvider, std::default_delete<(anonymous namespace)::PubkeyProvider> > >(std::unique_ptr<(anonymous namespace)::PubkeyProvider, std::default_delete<(anonymous namespace)::PubkeyProvider> >&&)
Line
Count
Source
24
88.7k
{
25
88.7k
    std::vector<std::common_type_t<Args...>> ret;
26
88.7k
    ret.reserve(sizeof...(args));
27
    // The line below uses the trick from https://www.experts-exchange.com/articles/32502/None-recursive-variadic-templates-with-std-initializer-list.html
28
88.7k
    (void)std::initializer_list<int>{(ret.emplace_back(std::forward<Args>(args)), 0)...};
29
88.7k
    return ret;
30
88.7k
}
std::vector<std::common_type<CScript>::type, std::allocator<std::common_type<CScript>::type> > Vector<CScript>(CScript&&)
Line
Count
Source
24
1.10M
{
25
1.10M
    std::vector<std::common_type_t<Args...>> ret;
26
1.10M
    ret.reserve(sizeof...(args));
27
    // The line below uses the trick from https://www.experts-exchange.com/articles/32502/None-recursive-variadic-templates-with-std-initializer-list.html
28
1.10M
    (void)std::initializer_list<int>{(ret.emplace_back(std::forward<Args>(args)), 0)...};
29
1.10M
    return ret;
30
1.10M
}
descriptor.cpp:std::vector<std::common_type<std::unique_ptr<(anonymous namespace)::DescriptorImpl, std::default_delete<(anonymous namespace)::DescriptorImpl> > >::type, std::allocator<std::common_type<std::unique_ptr<(anonymous namespace)::DescriptorImpl, std::default_delete<(anonymous namespace)::DescriptorImpl> > >::type> > Vector<std::unique_ptr<(anonymous namespace)::DescriptorImpl, std::default_delete<(anonymous namespace)::DescriptorImpl> > >(std::unique_ptr<(anonymous namespace)::DescriptorImpl, std::default_delete<(anonymous namespace)::DescriptorImpl> >&&)
Line
Count
Source
24
22.1k
{
25
22.1k
    std::vector<std::common_type_t<Args...>> ret;
26
22.1k
    ret.reserve(sizeof...(args));
27
    // The line below uses the trick from https://www.experts-exchange.com/articles/32502/None-recursive-variadic-templates-with-std-initializer-list.html
28
22.1k
    (void)std::initializer_list<int>{(ret.emplace_back(std::forward<Args>(args)), 0)...};
29
22.1k
    return ret;
30
22.1k
}
Unexecuted instantiation: std::vector<std::common_type<CScript const&>::type, std::allocator<std::common_type<CScript const&>::type> > Vector<CScript const&>(CScript const&)
Unexecuted instantiation: std::vector<std::common_type<miniscript::internal::MaxInt<unsigned int> >::type, std::allocator<std::common_type<miniscript::internal::MaxInt<unsigned int> >::type> > Vector<miniscript::internal::MaxInt<unsigned int> >(miniscript::internal::MaxInt<unsigned int>&&)
Unexecuted instantiation: std::vector<std::common_type<miniscript::internal::SatInfo>::type, std::allocator<std::common_type<miniscript::internal::SatInfo>::type> > Vector<miniscript::internal::SatInfo>(miniscript::internal::SatInfo&&)
Unexecuted instantiation: std::vector<std::common_type<std::unique_ptr<miniscript::Node<unsigned int> const, std::default_delete<miniscript::Node<unsigned int> const> > >::type, std::allocator<std::common_type<std::unique_ptr<miniscript::Node<unsigned int> const, std::default_delete<miniscript::Node<unsigned int> const> > >::type> > Vector<std::unique_ptr<miniscript::Node<unsigned int> const, std::default_delete<miniscript::Node<unsigned int> const> > >(std::unique_ptr<miniscript::Node<unsigned int> const, std::default_delete<miniscript::Node<unsigned int> const> >&&)
Unexecuted instantiation: std::vector<std::common_type<unsigned int>::type, std::allocator<std::common_type<unsigned int>::type> > Vector<unsigned int>(unsigned int&&)
Unexecuted instantiation: std::vector<std::common_type<std::unique_ptr<miniscript::Node<unsigned int> const, std::default_delete<miniscript::Node<unsigned int> const> >, std::unique_ptr<miniscript::Node<unsigned int> const, std::default_delete<miniscript::Node<unsigned int> const> > >::type, std::allocator<std::common_type<std::unique_ptr<miniscript::Node<unsigned int> const, std::default_delete<miniscript::Node<unsigned int> const> >, std::unique_ptr<miniscript::Node<unsigned int> const, std::default_delete<miniscript::Node<unsigned int> const> > >::type> > Vector<std::unique_ptr<miniscript::Node<unsigned int> const, std::default_delete<miniscript::Node<unsigned int> const> >, std::unique_ptr<miniscript::Node<unsigned int> const, std::default_delete<miniscript::Node<unsigned int> const> > >(std::unique_ptr<miniscript::Node<unsigned int> const, std::default_delete<miniscript::Node<unsigned int> const> >&&, std::unique_ptr<miniscript::Node<unsigned int> const, std::default_delete<miniscript::Node<unsigned int> const> >&&)
Unexecuted instantiation: std::vector<std::common_type<std::unique_ptr<miniscript::Node<unsigned int> const, std::default_delete<miniscript::Node<unsigned int> const> >, std::unique_ptr<miniscript::Node<unsigned int> const, std::default_delete<miniscript::Node<unsigned int> const> >, std::unique_ptr<miniscript::Node<unsigned int> const, std::default_delete<miniscript::Node<unsigned int> const> > >::type, std::allocator<std::common_type<std::unique_ptr<miniscript::Node<unsigned int> const, std::default_delete<miniscript::Node<unsigned int> const> >, std::unique_ptr<miniscript::Node<unsigned int> const, std::default_delete<miniscript::Node<unsigned int> const> >, std::unique_ptr<miniscript::Node<unsigned int> const, std::default_delete<miniscript::Node<unsigned int> const> > >::type> > Vector<std::unique_ptr<miniscript::Node<unsigned int> const, std::default_delete<miniscript::Node<unsigned int> const> >, std::unique_ptr<miniscript::Node<unsigned int> const, std::default_delete<miniscript::Node<unsigned int> const> >, std::unique_ptr<miniscript::Node<unsigned int> const, std::default_delete<miniscript::Node<unsigned int> const> > >(std::unique_ptr<miniscript::Node<unsigned int> const, std::default_delete<miniscript::Node<unsigned int> const> >&&, std::unique_ptr<miniscript::Node<unsigned int> const, std::default_delete<miniscript::Node<unsigned int> const> >&&, std::unique_ptr<miniscript::Node<unsigned int> const, std::default_delete<miniscript::Node<unsigned int> const> >&&)
std::vector<std::common_type<unsigned char>::type, std::allocator<std::common_type<unsigned char>::type> > Vector<unsigned char>(unsigned char&&)
Line
Count
Source
24
33.2k
{
25
33.2k
    std::vector<std::common_type_t<Args...>> ret;
26
33.2k
    ret.reserve(sizeof...(args));
27
    // The line below uses the trick from https://www.experts-exchange.com/articles/32502/None-recursive-variadic-templates-with-std-initializer-list.html
28
33.2k
    (void)std::initializer_list<int>{(ret.emplace_back(std::forward<Args>(args)), 0)...};
29
33.2k
    return ret;
30
33.2k
}
Unexecuted instantiation: std::vector<std::common_type<std::vector<unsigned char, std::allocator<unsigned char> >&>::type, std::allocator<std::common_type<std::vector<unsigned char, std::allocator<unsigned char> >&>::type> > Vector<std::vector<unsigned char, std::allocator<unsigned char> >&>(std::vector<unsigned char, std::allocator<unsigned char> >&)
Unexecuted instantiation: std::vector<std::common_type<XOnlyPubKey>::type, std::allocator<std::common_type<XOnlyPubKey>::type> > Vector<XOnlyPubKey>(XOnlyPubKey&&)
Unexecuted instantiation: std::vector<std::common_type<std::unique_ptr<miniscript::Node<XOnlyPubKey> const, std::default_delete<miniscript::Node<XOnlyPubKey> const> > >::type, std::allocator<std::common_type<std::unique_ptr<miniscript::Node<XOnlyPubKey> const, std::default_delete<miniscript::Node<XOnlyPubKey> const> > >::type> > Vector<std::unique_ptr<miniscript::Node<XOnlyPubKey> const, std::default_delete<miniscript::Node<XOnlyPubKey> const> > >(std::unique_ptr<miniscript::Node<XOnlyPubKey> const, std::default_delete<miniscript::Node<XOnlyPubKey> const> >&&)
Unexecuted instantiation: std::vector<std::common_type<std::unique_ptr<miniscript::Node<XOnlyPubKey> const, std::default_delete<miniscript::Node<XOnlyPubKey> const> >, std::unique_ptr<miniscript::Node<XOnlyPubKey> const, std::default_delete<miniscript::Node<XOnlyPubKey> const> > >::type, std::allocator<std::common_type<std::unique_ptr<miniscript::Node<XOnlyPubKey> const, std::default_delete<miniscript::Node<XOnlyPubKey> const> >, std::unique_ptr<miniscript::Node<XOnlyPubKey> const, std::default_delete<miniscript::Node<XOnlyPubKey> const> > >::type> > Vector<std::unique_ptr<miniscript::Node<XOnlyPubKey> const, std::default_delete<miniscript::Node<XOnlyPubKey> const> >, std::unique_ptr<miniscript::Node<XOnlyPubKey> const, std::default_delete<miniscript::Node<XOnlyPubKey> const> > >(std::unique_ptr<miniscript::Node<XOnlyPubKey> const, std::default_delete<miniscript::Node<XOnlyPubKey> const> >&&, std::unique_ptr<miniscript::Node<XOnlyPubKey> const, std::default_delete<miniscript::Node<XOnlyPubKey> const> >&&)
Unexecuted instantiation: std::vector<std::common_type<std::unique_ptr<miniscript::Node<XOnlyPubKey> const, std::default_delete<miniscript::Node<XOnlyPubKey> const> >, std::unique_ptr<miniscript::Node<XOnlyPubKey> const, std::default_delete<miniscript::Node<XOnlyPubKey> const> >, std::unique_ptr<miniscript::Node<XOnlyPubKey> const, std::default_delete<miniscript::Node<XOnlyPubKey> const> > >::type, std::allocator<std::common_type<std::unique_ptr<miniscript::Node<XOnlyPubKey> const, std::default_delete<miniscript::Node<XOnlyPubKey> const> >, std::unique_ptr<miniscript::Node<XOnlyPubKey> const, std::default_delete<miniscript::Node<XOnlyPubKey> const> >, std::unique_ptr<miniscript::Node<XOnlyPubKey> const, std::default_delete<miniscript::Node<XOnlyPubKey> const> > >::type> > Vector<std::unique_ptr<miniscript::Node<XOnlyPubKey> const, std::default_delete<miniscript::Node<XOnlyPubKey> const> >, std::unique_ptr<miniscript::Node<XOnlyPubKey> const, std::default_delete<miniscript::Node<XOnlyPubKey> const> >, std::unique_ptr<miniscript::Node<XOnlyPubKey> const, std::default_delete<miniscript::Node<XOnlyPubKey> const> > >(std::unique_ptr<miniscript::Node<XOnlyPubKey> const, std::default_delete<miniscript::Node<XOnlyPubKey> const> >&&, std::unique_ptr<miniscript::Node<XOnlyPubKey> const, std::default_delete<miniscript::Node<XOnlyPubKey> const> >&&, std::unique_ptr<miniscript::Node<XOnlyPubKey> const, std::default_delete<miniscript::Node<XOnlyPubKey> const> >&&)
Unexecuted instantiation: std::vector<std::common_type<miniscript::internal::InputStack const&>::type, std::allocator<std::common_type<miniscript::internal::InputStack const&>::type> > Vector<miniscript::internal::InputStack const&>(miniscript::internal::InputStack const&)
Unexecuted instantiation: std::vector<std::common_type<CPubKey>::type, std::allocator<std::common_type<CPubKey>::type> > Vector<CPubKey>(CPubKey&&)
Unexecuted instantiation: std::vector<std::common_type<std::unique_ptr<miniscript::Node<CPubKey> const, std::default_delete<miniscript::Node<CPubKey> const> > >::type, std::allocator<std::common_type<std::unique_ptr<miniscript::Node<CPubKey> const, std::default_delete<miniscript::Node<CPubKey> const> > >::type> > Vector<std::unique_ptr<miniscript::Node<CPubKey> const, std::default_delete<miniscript::Node<CPubKey> const> > >(std::unique_ptr<miniscript::Node<CPubKey> const, std::default_delete<miniscript::Node<CPubKey> const> >&&)
Unexecuted instantiation: std::vector<std::common_type<std::unique_ptr<miniscript::Node<CPubKey> const, std::default_delete<miniscript::Node<CPubKey> const> >, std::unique_ptr<miniscript::Node<CPubKey> const, std::default_delete<miniscript::Node<CPubKey> const> > >::type, std::allocator<std::common_type<std::unique_ptr<miniscript::Node<CPubKey> const, std::default_delete<miniscript::Node<CPubKey> const> >, std::unique_ptr<miniscript::Node<CPubKey> const, std::default_delete<miniscript::Node<CPubKey> const> > >::type> > Vector<std::unique_ptr<miniscript::Node<CPubKey> const, std::default_delete<miniscript::Node<CPubKey> const> >, std::unique_ptr<miniscript::Node<CPubKey> const, std::default_delete<miniscript::Node<CPubKey> const> > >(std::unique_ptr<miniscript::Node<CPubKey> const, std::default_delete<miniscript::Node<CPubKey> const> >&&, std::unique_ptr<miniscript::Node<CPubKey> const, std::default_delete<miniscript::Node<CPubKey> const> >&&)
Unexecuted instantiation: std::vector<std::common_type<std::unique_ptr<miniscript::Node<CPubKey> const, std::default_delete<miniscript::Node<CPubKey> const> >, std::unique_ptr<miniscript::Node<CPubKey> const, std::default_delete<miniscript::Node<CPubKey> const> >, std::unique_ptr<miniscript::Node<CPubKey> const, std::default_delete<miniscript::Node<CPubKey> const> > >::type, std::allocator<std::common_type<std::unique_ptr<miniscript::Node<CPubKey> const, std::default_delete<miniscript::Node<CPubKey> const> >, std::unique_ptr<miniscript::Node<CPubKey> const, std::default_delete<miniscript::Node<CPubKey> const> >, std::unique_ptr<miniscript::Node<CPubKey> const, std::default_delete<miniscript::Node<CPubKey> const> > >::type> > Vector<std::unique_ptr<miniscript::Node<CPubKey> const, std::default_delete<miniscript::Node<CPubKey> const> >, std::unique_ptr<miniscript::Node<CPubKey> const, std::default_delete<miniscript::Node<CPubKey> const> >, std::unique_ptr<miniscript::Node<CPubKey> const, std::default_delete<miniscript::Node<CPubKey> const> > >(std::unique_ptr<miniscript::Node<CPubKey> const, std::default_delete<miniscript::Node<CPubKey> const> >&&, std::unique_ptr<miniscript::Node<CPubKey> const, std::default_delete<miniscript::Node<CPubKey> const> >&&, std::unique_ptr<miniscript::Node<CPubKey> const, std::default_delete<miniscript::Node<CPubKey> const> >&&)
31
32
/** Concatenate two vectors, moving elements. */
33
template<typename V>
34
inline V Cat(V v1, V&& v2)
35
310k
{
36
310k
    v1.reserve(v1.size() + v2.size());
37
2.12M
    for (auto& arg : v2) {
  Branch (37:20): [True: 1.77M, False: 221k]
  Branch (37:20): [True: 354k, False: 88.7k]
  Branch (37:20): [True: 0, False: 0]
38
2.12M
        v1.push_back(std::move(arg));
39
2.12M
    }
40
310k
    return v1;
41
310k
}
std::vector<RPCResult, std::allocator<RPCResult> > Cat<std::vector<RPCResult, std::allocator<RPCResult> > >(std::vector<RPCResult, std::allocator<RPCResult> >, std::vector<RPCResult, std::allocator<RPCResult> >&&)
Line
Count
Source
35
221k
{
36
221k
    v1.reserve(v1.size() + v2.size());
37
1.77M
    for (auto& arg : v2) {
  Branch (37:20): [True: 1.77M, False: 221k]
38
1.77M
        v1.push_back(std::move(arg));
39
1.77M
    }
40
221k
    return v1;
41
221k
}
std::vector<RPCArg, std::allocator<RPCArg> > Cat<std::vector<RPCArg, std::allocator<RPCArg> > >(std::vector<RPCArg, std::allocator<RPCArg> >, std::vector<RPCArg, std::allocator<RPCArg> >&&)
Line
Count
Source
35
88.7k
{
36
88.7k
    v1.reserve(v1.size() + v2.size());
37
354k
    for (auto& arg : v2) {
  Branch (37:20): [True: 354k, False: 88.7k]
38
354k
        v1.push_back(std::move(arg));
39
354k
    }
40
88.7k
    return v1;
41
88.7k
}
Unexecuted instantiation: std::vector<std::vector<unsigned char, std::allocator<unsigned char> >, std::allocator<std::vector<unsigned char, std::allocator<unsigned char> > > > Cat<std::vector<std::vector<unsigned char, std::allocator<unsigned char> >, std::allocator<std::vector<unsigned char, std::allocator<unsigned char> > > > >(std::vector<std::vector<unsigned char, std::allocator<unsigned char> >, std::allocator<std::vector<unsigned char, std::allocator<unsigned char> > > >, std::vector<std::vector<unsigned char, std::allocator<unsigned char> >, std::allocator<std::vector<unsigned char, std::allocator<unsigned char> > > >&&)
42
43
/** Concatenate two vectors. */
44
template<typename V>
45
inline V Cat(V v1, const V& v2)
46
{
47
    v1.reserve(v1.size() + v2.size());
48
    for (const auto& arg : v2) {
49
        v1.push_back(arg);
50
    }
51
    return v1;
52
}
53
54
/** Clear a vector (or std::deque) and release its allocated memory. */
55
template<typename V>
56
inline void ClearShrink(V& v) noexcept
57
12.6M
{
58
    // There are various ways to clear a vector and release its memory:
59
    //
60
    // 1. V{}.swap(v)
61
    // 2. v = V{}
62
    // 3. v = {}; v.shrink_to_fit();
63
    // 4. v.clear(); v.shrink_to_fit();
64
    //
65
    // (2) does not appear to release memory in glibc debug mode, even if v.shrink_to_fit()
66
    // follows. (3) and (4) rely on std::vector::shrink_to_fit, which is only a non-binding
67
    // request. Therefore, we use method (1).
68
69
12.6M
    V{}.swap(v);
70
12.6M
}
void ClearShrink<std::vector<unsigned char, std::allocator<unsigned char> > >(std::vector<unsigned char, std::allocator<unsigned char> >&)
Line
Count
Source
57
12.6M
{
58
    // There are various ways to clear a vector and release its memory:
59
    //
60
    // 1. V{}.swap(v)
61
    // 2. v = V{}
62
    // 3. v = {}; v.shrink_to_fit();
63
    // 4. v.clear(); v.shrink_to_fit();
64
    //
65
    // (2) does not appear to release memory in glibc debug mode, even if v.shrink_to_fit()
66
    // follows. (3) and (4) rely on std::vector::shrink_to_fit, which is only a non-binding
67
    // request. Therefore, we use method (1).
68
69
12.6M
    V{}.swap(v);
70
12.6M
}
Unexecuted instantiation: void ClearShrink<bitdeque<32768> >(bitdeque<32768>&)
Unexecuted instantiation: void ClearShrink<std::deque<CompressedHeader, std::allocator<CompressedHeader> > >(std::deque<CompressedHeader, std::allocator<CompressedHeader> >&)
71
72
template<typename V, typename L>
73
inline std::optional<V> FindFirst(const std::vector<V>& vec, const L fnc)
74
0
{
75
0
    for (const auto& el : vec) {
  Branch (75:25): [True: 0, False: 0]
  Branch (75:25): [True: 0, False: 0]
76
0
        if (fnc(el)) {
  Branch (76:13): [True: 0, False: 0]
  Branch (76:13): [True: 0, False: 0]
77
0
            return el;
78
0
        }
79
0
    }
80
0
    return std::nullopt;
81
0
}
Unexecuted instantiation: std::optional<AssumeutxoData> FindFirst<AssumeutxoData, CChainParams::AssumeutxoForHeight(int) const::{lambda(auto:1 const&)#1}>(std::vector<AssumeutxoData, std::allocator<AssumeutxoData> > const&, CChainParams::AssumeutxoForHeight(int) const::{lambda(auto:1 const&)#1})
Unexecuted instantiation: std::optional<AssumeutxoData> FindFirst<AssumeutxoData, CChainParams::AssumeutxoForBlockhash(uint256 const&) const::{lambda(auto:1 const&)#1}>(std::vector<AssumeutxoData, std::allocator<AssumeutxoData> > const&, CChainParams::AssumeutxoForBlockhash(uint256 const&) const::{lambda(auto:1 const&)#1})
82
83
#endif // BITCOIN_UTIL_VECTOR_H