Coverage Report

Created: 2026-07-20 20:52

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/tmp/bitcoin/src/util/vector.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_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
8.38M
{
25
8.38M
    std::vector<std::common_type_t<Args...>> ret;
26
8.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
8.38M
    (void)std::initializer_list<int>{(ret.emplace_back(std::forward<Args>(args)), 0)...};
29
8.38M
    return ret;
30
8.38M
}
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
493k
{
25
493k
    std::vector<std::common_type_t<Args...>> ret;
26
493k
    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
493k
    (void)std::initializer_list<int>{(ret.emplace_back(std::forward<Args>(args)), 0)...};
29
493k
    return ret;
30
493k
}
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&)
Line
Count
Source
24
1.81k
{
25
1.81k
    std::vector<std::common_type_t<Args...>> ret;
26
1.81k
    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.81k
    (void)std::initializer_list<int>{(ret.emplace_back(std::forward<Args>(args)), 0)...};
29
1.81k
    return ret;
30
1.81k
}
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
4.53k
{
25
4.53k
    std::vector<std::common_type_t<Args...>> ret;
26
4.53k
    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
4.53k
    (void)std::initializer_list<int>{(ret.emplace_back(std::forward<Args>(args)), 0)...};
29
4.53k
    return ret;
30
4.53k
}
std::vector<std::common_type<miniscript::Node<CPubKey>>::type, std::allocator<std::common_type<miniscript::Node<CPubKey>>::type>> Vector<miniscript::Node<CPubKey>>(miniscript::Node<CPubKey>&&)
Line
Count
Source
24
10.0k
{
25
10.0k
    std::vector<std::common_type_t<Args...>> ret;
26
10.0k
    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
10.0k
    (void)std::initializer_list<int>{(ret.emplace_back(std::forward<Args>(args)), 0)...};
29
10.0k
    return ret;
30
10.0k
}
std::vector<std::common_type<CPubKey>::type, std::allocator<std::common_type<CPubKey>::type>> Vector<CPubKey>(CPubKey&&)
Line
Count
Source
24
1.90k
{
25
1.90k
    std::vector<std::common_type_t<Args...>> ret;
26
1.90k
    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.90k
    (void)std::initializer_list<int>{(ret.emplace_back(std::forward<Args>(args)), 0)...};
29
1.90k
    return ret;
30
1.90k
}
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>&&)
Line
Count
Source
24
3.83k
{
25
3.83k
    std::vector<std::common_type_t<Args...>> ret;
26
3.83k
    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
3.83k
    (void)std::initializer_list<int>{(ret.emplace_back(std::forward<Args>(args)), 0)...};
29
3.83k
    return ret;
30
3.83k
}
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&&)
Line
Count
Source
24
1.91k
{
25
1.91k
    std::vector<std::common_type_t<Args...>> ret;
26
1.91k
    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.91k
    (void)std::initializer_list<int>{(ret.emplace_back(std::forward<Args>(args)), 0)...};
29
1.91k
    return ret;
30
1.91k
}
std::vector<std::common_type<miniscript::Node<CPubKey>, miniscript::Node<CPubKey>>::type, std::allocator<std::common_type<miniscript::Node<CPubKey>, miniscript::Node<CPubKey>>::type>> Vector<miniscript::Node<CPubKey>, miniscript::Node<CPubKey>>(miniscript::Node<CPubKey>&&, miniscript::Node<CPubKey>&&)
Line
Count
Source
24
7.66k
{
25
7.66k
    std::vector<std::common_type_t<Args...>> ret;
26
7.66k
    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
7.66k
    (void)std::initializer_list<int>{(ret.emplace_back(std::forward<Args>(args)), 0)...};
29
7.66k
    return ret;
30
7.66k
}
std::vector<std::common_type<miniscript::Node<CPubKey>, miniscript::Node<CPubKey>, miniscript::Node<CPubKey>>::type, std::allocator<std::common_type<miniscript::Node<CPubKey>, miniscript::Node<CPubKey>, miniscript::Node<CPubKey>>::type>> Vector<miniscript::Node<CPubKey>, miniscript::Node<CPubKey>, miniscript::Node<CPubKey>>(miniscript::Node<CPubKey>&&, miniscript::Node<CPubKey>&&, miniscript::Node<CPubKey>&&)
Line
Count
Source
24
135
{
25
135
    std::vector<std::common_type_t<Args...>> ret;
26
135
    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
135
    (void)std::initializer_list<int>{(ret.emplace_back(std::forward<Args>(args)), 0)...};
29
135
    return ret;
30
135
}
std::vector<std::common_type<miniscript::Node<unsigned int>>::type, std::allocator<std::common_type<miniscript::Node<unsigned int>>::type>> Vector<miniscript::Node<unsigned int>>(miniscript::Node<unsigned int>&&)
Line
Count
Source
24
1.19M
{
25
1.19M
    std::vector<std::common_type_t<Args...>> ret;
26
1.19M
    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.19M
    (void)std::initializer_list<int>{(ret.emplace_back(std::forward<Args>(args)), 0)...};
29
1.19M
    return ret;
30
1.19M
}
util_tests.cpp:std::vector<std::common_type<util_tests::(anonymous namespace)::Tracker&>::type, std::allocator<std::common_type<util_tests::(anonymous namespace)::Tracker&>::type>> Vector<util_tests::(anonymous namespace)::Tracker&>(util_tests::(anonymous namespace)::Tracker&)
Line
Count
Source
24
1
{
25
1
    std::vector<std::common_type_t<Args...>> ret;
26
1
    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
    (void)std::initializer_list<int>{(ret.emplace_back(std::forward<Args>(args)), 0)...};
29
1
    return ret;
30
1
}
util_tests.cpp:std::vector<std::common_type<util_tests::(anonymous namespace)::Tracker>::type, std::allocator<std::common_type<util_tests::(anonymous namespace)::Tracker>::type>> Vector<util_tests::(anonymous namespace)::Tracker>(util_tests::(anonymous namespace)::Tracker&&)
Line
Count
Source
24
1
{
25
1
    std::vector<std::common_type_t<Args...>> ret;
26
1
    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
    (void)std::initializer_list<int>{(ret.emplace_back(std::forward<Args>(args)), 0)...};
29
1
    return ret;
30
1
}
util_tests.cpp:std::vector<std::common_type<util_tests::(anonymous namespace)::Tracker&, util_tests::(anonymous namespace)::Tracker>::type, std::allocator<std::common_type<util_tests::(anonymous namespace)::Tracker&, util_tests::(anonymous namespace)::Tracker>::type>> Vector<util_tests::(anonymous namespace)::Tracker&, util_tests::(anonymous namespace)::Tracker>(util_tests::(anonymous namespace)::Tracker&, util_tests::(anonymous namespace)::Tracker&&)
Line
Count
Source
24
1
{
25
1
    std::vector<std::common_type_t<Args...>> ret;
26
1
    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
    (void)std::initializer_list<int>{(ret.emplace_back(std::forward<Args>(args)), 0)...};
29
1
    return ret;
30
1
}
util_tests.cpp:std::vector<std::common_type<util_tests::(anonymous namespace)::Tracker, util_tests::(anonymous namespace)::Tracker&, util_tests::(anonymous namespace)::Tracker>::type, std::allocator<std::common_type<util_tests::(anonymous namespace)::Tracker, util_tests::(anonymous namespace)::Tracker&, util_tests::(anonymous namespace)::Tracker>::type>> Vector<util_tests::(anonymous namespace)::Tracker, util_tests::(anonymous namespace)::Tracker&, util_tests::(anonymous namespace)::Tracker>(util_tests::(anonymous namespace)::Tracker&&, util_tests::(anonymous namespace)::Tracker&, util_tests::(anonymous namespace)::Tracker&&)
Line
Count
Source
24
1
{
25
1
    std::vector<std::common_type_t<Args...>> ret;
26
1
    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
    (void)std::initializer_list<int>{(ret.emplace_back(std::forward<Args>(args)), 0)...};
29
1
    return ret;
30
1
}
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
3.77k
{
25
3.77k
    std::vector<std::common_type_t<Args...>> ret;
26
3.77k
    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
3.77k
    (void)std::initializer_list<int>{(ret.emplace_back(std::forward<Args>(args)), 0)...};
29
3.77k
    return ret;
30
3.77k
}
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
302k
{
25
302k
    std::vector<std::common_type_t<Args...>> ret;
26
302k
    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
302k
    (void)std::initializer_list<int>{(ret.emplace_back(std::forward<Args>(args)), 0)...};
29
302k
    return ret;
30
302k
}
std::vector<std::common_type<CScript>::type, std::allocator<std::common_type<CScript>::type>> Vector<CScript>(CScript&&)
Line
Count
Source
24
719k
{
25
719k
    std::vector<std::common_type_t<Args...>> ret;
26
719k
    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
719k
    (void)std::initializer_list<int>{(ret.emplace_back(std::forward<Args>(args)), 0)...};
29
719k
    return ret;
30
719k
}
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
23.2k
{
25
23.2k
    std::vector<std::common_type_t<Args...>> ret;
26
23.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
23.2k
    (void)std::initializer_list<int>{(ret.emplace_back(std::forward<Args>(args)), 0)...};
29
23.2k
    return ret;
30
23.2k
}
std::vector<std::common_type<CScript const&>::type, std::allocator<std::common_type<CScript const&>::type>> Vector<CScript const&>(CScript const&)
Line
Count
Source
24
2.33k
{
25
2.33k
    std::vector<std::common_type_t<Args...>> ret;
26
2.33k
    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
2.33k
    (void)std::initializer_list<int>{(ret.emplace_back(std::forward<Args>(args)), 0)...};
29
2.33k
    return ret;
30
2.33k
}
std::vector<std::common_type<unsigned int>::type, std::allocator<std::common_type<unsigned int>::type>> Vector<unsigned int>(unsigned int&&)
Line
Count
Source
24
1.57k
{
25
1.57k
    std::vector<std::common_type_t<Args...>> ret;
26
1.57k
    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.57k
    (void)std::initializer_list<int>{(ret.emplace_back(std::forward<Args>(args)), 0)...};
29
1.57k
    return ret;
30
1.57k
}
std::vector<std::common_type<miniscript::Node<unsigned int>, miniscript::Node<unsigned int>>::type, std::allocator<std::common_type<miniscript::Node<unsigned int>, miniscript::Node<unsigned int>>::type>> Vector<miniscript::Node<unsigned int>, miniscript::Node<unsigned int>>(miniscript::Node<unsigned int>&&, miniscript::Node<unsigned int>&&)
Line
Count
Source
24
1.14k
{
25
1.14k
    std::vector<std::common_type_t<Args...>> ret;
26
1.14k
    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.14k
    (void)std::initializer_list<int>{(ret.emplace_back(std::forward<Args>(args)), 0)...};
29
1.14k
    return ret;
30
1.14k
}
std::vector<std::common_type<miniscript::Node<unsigned int>, miniscript::Node<unsigned int>, miniscript::Node<unsigned int>>::type, std::allocator<std::common_type<miniscript::Node<unsigned int>, miniscript::Node<unsigned int>, miniscript::Node<unsigned int>>::type>> Vector<miniscript::Node<unsigned int>, miniscript::Node<unsigned int>, miniscript::Node<unsigned int>>(miniscript::Node<unsigned int>&&, miniscript::Node<unsigned int>&&, miniscript::Node<unsigned int>&&)
Line
Count
Source
24
114
{
25
114
    std::vector<std::common_type_t<Args...>> ret;
26
114
    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
114
    (void)std::initializer_list<int>{(ret.emplace_back(std::forward<Args>(args)), 0)...};
29
114
    return ret;
30
114
}
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
809
{
25
809
    std::vector<std::common_type_t<Args...>> ret;
26
809
    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
809
    (void)std::initializer_list<int>{(ret.emplace_back(std::forward<Args>(args)), 0)...};
29
809
    return ret;
30
809
}
std::vector<std::common_type<XOnlyPubKey>::type, std::allocator<std::common_type<XOnlyPubKey>::type>> Vector<XOnlyPubKey>(XOnlyPubKey&&)
Line
Count
Source
24
3.68k
{
25
3.68k
    std::vector<std::common_type_t<Args...>> ret;
26
3.68k
    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
3.68k
    (void)std::initializer_list<int>{(ret.emplace_back(std::forward<Args>(args)), 0)...};
29
3.68k
    return ret;
30
3.68k
}
std::vector<std::common_type<miniscript::Node<XOnlyPubKey>>::type, std::allocator<std::common_type<miniscript::Node<XOnlyPubKey>>::type>> Vector<miniscript::Node<XOnlyPubKey>>(miniscript::Node<XOnlyPubKey>&&)
Line
Count
Source
24
5.60M
{
25
5.60M
    std::vector<std::common_type_t<Args...>> ret;
26
5.60M
    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
5.60M
    (void)std::initializer_list<int>{(ret.emplace_back(std::forward<Args>(args)), 0)...};
29
5.60M
    return ret;
30
5.60M
}
std::vector<std::common_type<miniscript::Node<XOnlyPubKey>, miniscript::Node<XOnlyPubKey>>::type, std::allocator<std::common_type<miniscript::Node<XOnlyPubKey>, miniscript::Node<XOnlyPubKey>>::type>> Vector<miniscript::Node<XOnlyPubKey>, miniscript::Node<XOnlyPubKey>>(miniscript::Node<XOnlyPubKey>&&, miniscript::Node<XOnlyPubKey>&&)
Line
Count
Source
24
967
{
25
967
    std::vector<std::common_type_t<Args...>> ret;
26
967
    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
967
    (void)std::initializer_list<int>{(ret.emplace_back(std::forward<Args>(args)), 0)...};
29
967
    return ret;
30
967
}
Unexecuted instantiation: std::vector<std::common_type<miniscript::Node<XOnlyPubKey>, miniscript::Node<XOnlyPubKey>, miniscript::Node<XOnlyPubKey>>::type, std::allocator<std::common_type<miniscript::Node<XOnlyPubKey>, miniscript::Node<XOnlyPubKey>, miniscript::Node<XOnlyPubKey>>::type>> Vector<miniscript::Node<XOnlyPubKey>, miniscript::Node<XOnlyPubKey>, miniscript::Node<XOnlyPubKey>>(miniscript::Node<XOnlyPubKey>&&, miniscript::Node<XOnlyPubKey>&&, miniscript::Node<XOnlyPubKey>&&)
31
32
/** Concatenate two vectors, moving elements. */
33
template<typename V>
34
inline V Cat(V v1, V&& v2)
35
92.7M
{
36
92.7M
    v1.reserve(v1.size() + v2.size());
37
92.7M
    for (auto& arg : v2) {
38
46.9M
        v1.push_back(std::move(arg));
39
46.9M
    }
40
92.7M
    return v1;
41
92.7M
}
util_tests.cpp:std::vector<util_tests::(anonymous namespace)::Tracker, std::allocator<util_tests::(anonymous namespace)::Tracker>> Cat<std::vector<util_tests::(anonymous namespace)::Tracker, std::allocator<util_tests::(anonymous namespace)::Tracker>>>(std::vector<util_tests::(anonymous namespace)::Tracker, std::allocator<util_tests::(anonymous namespace)::Tracker>>, std::vector<util_tests::(anonymous namespace)::Tracker, std::allocator<util_tests::(anonymous namespace)::Tracker>>&&)
Line
Count
Source
35
2
{
36
2
    v1.reserve(v1.size() + v2.size());
37
5
    for (auto& arg : v2) {
38
5
        v1.push_back(std::move(arg));
39
5
    }
40
2
    return v1;
41
2
}
std::vector<char const*, std::allocator<char const*>> Cat<std::vector<char const*, std::allocator<char const*>>>(std::vector<char const*, std::allocator<char const*>>, std::vector<char const*, std::allocator<char const*>>&&)
Line
Count
Source
35
693
{
36
693
    v1.reserve(v1.size() + v2.size());
37
693
    for (auto& arg : v2) {
38
693
        v1.push_back(std::move(arg));
39
693
    }
40
693
    return v1;
41
693
}
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
59.6k
{
36
59.6k
    v1.reserve(v1.size() + v2.size());
37
208k
    for (auto& arg : v2) {
38
208k
        v1.push_back(std::move(arg));
39
208k
    }
40
59.6k
    return v1;
41
59.6k
}
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
8.39k
{
36
8.39k
    v1.reserve(v1.size() + v2.size());
37
19.8k
    for (auto& arg : v2) {
38
19.8k
        v1.push_back(std::move(arg));
39
19.8k
    }
40
8.39k
    return v1;
41
8.39k
}
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>>>> Cat<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>>>>>(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>>>>, 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>>>>&&)
Line
Count
Source
35
51
{
36
51
    v1.reserve(v1.size() + v2.size());
37
129
    for (auto& arg : v2) {
38
129
        v1.push_back(std::move(arg));
39
129
    }
40
51
    return v1;
41
51
}
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>>>>&&)
Line
Count
Source
35
92.6M
{
36
92.6M
    v1.reserve(v1.size() + v2.size());
37
92.6M
    for (auto& arg : v2) {
38
46.6M
        v1.push_back(std::move(arg));
39
46.6M
    }
40
92.6M
    return v1;
41
92.6M
}
42
43
/** Concatenate two vectors. */
44
template<typename V>
45
inline V Cat(V v1, const V& v2)
46
6.87k
{
47
6.87k
    v1.reserve(v1.size() + v2.size());
48
61.6k
    for (const auto& arg : v2) {
49
61.6k
        v1.push_back(arg);
50
61.6k
    }
51
6.87k
    return v1;
52
6.87k
}
util_tests.cpp:std::vector<util_tests::(anonymous namespace)::Tracker, std::allocator<util_tests::(anonymous namespace)::Tracker>> Cat<std::vector<util_tests::(anonymous namespace)::Tracker, std::allocator<util_tests::(anonymous namespace)::Tracker>>>(std::vector<util_tests::(anonymous namespace)::Tracker, std::allocator<util_tests::(anonymous namespace)::Tracker>>, std::vector<util_tests::(anonymous namespace)::Tracker, std::allocator<util_tests::(anonymous namespace)::Tracker>> const&)
Line
Count
Source
46
2
{
47
2
    v1.reserve(v1.size() + v2.size());
48
5
    for (const auto& arg : v2) {
49
5
        v1.push_back(arg);
50
5
    }
51
2
    return v1;
52
2
}
std::vector<char const*, std::allocator<char const*>> Cat<std::vector<char const*, std::allocator<char const*>>>(std::vector<char const*, std::allocator<char const*>>, std::vector<char const*, std::allocator<char const*>> const&)
Line
Count
Source
46
713
{
47
713
    v1.reserve(v1.size() + v2.size());
48
713
    for (const auto& arg : v2) {
49
30
        v1.push_back(arg);
50
30
    }
51
713
    return v1;
52
713
}
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>> const&)
Line
Count
Source
46
6.16k
{
47
6.16k
    v1.reserve(v1.size() + v2.size());
48
61.6k
    for (const auto& arg : v2) {
49
61.6k
        v1.push_back(arg);
50
61.6k
    }
51
6.16k
    return v1;
52
6.16k
}
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
1.10M
{
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
1.10M
    V{}.swap(v);
70
1.10M
}
void ClearShrink<std::vector<unsigned char, std::allocator<unsigned char>>>(std::vector<unsigned char, std::allocator<unsigned char>>&)
Line
Count
Source
57
344k
{
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
344k
    V{}.swap(v);
70
344k
}
void ClearShrink<std::vector<bool, std::allocator<bool>>>(std::vector<bool, std::allocator<bool>>&)
Line
Count
Source
57
1
{
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
1
    V{}.swap(v);
70
1
}
void ClearShrink<std::deque<int, std::allocator<int>>>(std::deque<int, std::allocator<int>>&)
Line
Count
Source
57
1
{
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
1
    V{}.swap(v);
70
1
}
void ClearShrink<bitdeque<32768>>(bitdeque<32768>&)
Line
Count
Source
57
11
{
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
11
    V{}.swap(v);
70
11
}
void ClearShrink<std::deque<CompressedHeader, std::allocator<CompressedHeader>>>(std::deque<CompressedHeader, std::allocator<CompressedHeader>>&)
Line
Count
Source
57
11
{
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
11
    V{}.swap(v);
70
11
}
txgraph.cpp:void ClearShrink<std::vector<std::_Node_handle<(anonymous namespace)::TxGraphImpl::ChunkData, (anonymous namespace)::TxGraphImpl::ChunkData, std::allocator<std::_Rb_tree_node<(anonymous namespace)::TxGraphImpl::ChunkData>>>, std::allocator<std::_Node_handle<(anonymous namespace)::TxGraphImpl::ChunkData, (anonymous namespace)::TxGraphImpl::ChunkData, std::allocator<std::_Rb_tree_node<(anonymous namespace)::TxGraphImpl::ChunkData>>>>>>(std::vector<std::_Node_handle<(anonymous namespace)::TxGraphImpl::ChunkData, (anonymous namespace)::TxGraphImpl::ChunkData, std::allocator<std::_Rb_tree_node<(anonymous namespace)::TxGraphImpl::ChunkData>>>, std::allocator<std::_Node_handle<(anonymous namespace)::TxGraphImpl::ChunkData, (anonymous namespace)::TxGraphImpl::ChunkData, std::allocator<std::_Rb_tree_node<(anonymous namespace)::TxGraphImpl::ChunkData>>>>>&)
Line
Count
Source
57
760k
{
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
760k
    V{}.swap(v);
70
760k
}
71
72
template<typename V, typename L>
73
inline std::optional<V> FindFirst(const std::vector<V>& vec, const L fnc)
74
129
{
75
293
    for (const auto& el : vec) {
76
293
        if (fnc(el)) {
77
108
            return el;
78
108
        }
79
293
    }
80
21
    return std::nullopt;
81
129
}
std::optional<auto> FindFirst<AssumeutxoData, CChainParams::AssumeutxoForHeight(int) const::'lambda'(auto const&)>(std::vector<auto, std::allocator<auto>> const&, CChainParams::AssumeutxoForHeight(int) const::'lambda'(auto const&))
Line
Count
Source
74
62
{
75
134
    for (const auto& el : vec) {
76
134
        if (fnc(el)) {
77
56
            return el;
78
56
        }
79
134
    }
80
6
    return std::nullopt;
81
62
}
std::optional<auto> FindFirst<AssumeutxoData, CChainParams::AssumeutxoForBlockhash(uint256 const&) const::'lambda'(auto const&)>(std::vector<auto, std::allocator<auto>> const&, CChainParams::AssumeutxoForBlockhash(uint256 const&) const::'lambda'(auto const&))
Line
Count
Source
74
67
{
75
159
    for (const auto& el : vec) {
76
159
        if (fnc(el)) {
77
52
            return el;
78
52
        }
79
159
    }
80
15
    return std::nullopt;
81
67
}
82
83
#endif // BITCOIN_UTIL_VECTOR_H