Coverage Report

Created: 2024-09-19 18:47

/root/bitcoin/src/util/vecdeque.h
Line
Count
Source (jump to first uncovered line)
1
// Copyright (c) The Bitcoin Core developers
2
// Distributed under the MIT software license, see the accompanying
3
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5
#ifndef BITCOIN_UTIL_VECDEQUE_H
6
#define BITCOIN_UTIL_VECDEQUE_H
7
8
#include <util/check.h>
9
10
#include <cstring>
11
#include <memory>
12
#include <type_traits>
13
14
/** Data structure largely mimicking std::deque, but using single preallocated ring buffer.
15
 *
16
 * - More efficient and better memory locality than std::deque.
17
 * - Most operations ({push_,pop_,emplace_,}{front,back}(), operator[], ...) are O(1),
18
 *   unless reallocation is needed (in which case they are O(n)).
19
 * - Supports reserve(), capacity(), shrink_to_fit() like vectors.
20
 * - No iterator support.
21
 * - Data is not stored in a single contiguous block, so no data().
22
 */
23
template<typename T>
24
class VecDeque
25
{
26
    /** Pointer to allocated memory. Can contain constructed and uninitialized T objects. */
27
    T* m_buffer{nullptr};
28
    /** m_buffer + m_offset points to first object in queue. m_offset = 0 if m_capacity is 0;
29
     *  otherwise 0 <= m_offset < m_capacity. */
30
    size_t m_offset{0};
31
    /** Number of objects in the container. 0 <= m_size <= m_capacity. */
32
    size_t m_size{0};
33
    /** The size of m_buffer, expressed as a multiple of the size of T. */
34
    size_t m_capacity{0};
35
36
    /** Returns the number of populated objects between m_offset and the end of the buffer. */
37
0
    size_t FirstPart() const noexcept { return std::min(m_capacity - m_offset, m_size); }
Unexecuted instantiation: _ZNK8VecDequeIZN17cluster_linearize21SearchCandidateFinderIN13bitset_detail9IntBitSetIjEEE16FindCandidateSetEmNS0_7SetInfoIS4_EEE8WorkItemE9FirstPartEv
Unexecuted instantiation: _ZNK8VecDequeIhE9FirstPartEv
Unexecuted instantiation: _ZNK8VecDequeItE9FirstPartEv
Unexecuted instantiation: _ZNK8VecDequeIjE9FirstPartEv
Unexecuted instantiation: _ZNK8VecDequeImE9FirstPartEv
38
39
    void Reallocate(size_t capacity)
40
0
    {
41
0
        Assume(capacity >= m_size);
42
0
        Assume((m_offset == 0 && m_capacity == 0) || m_offset < m_capacity);
43
        // Allocate new buffer.
44
0
        T* new_buffer = capacity ? std::allocator<T>().allocate(capacity) : nullptr;
45
0
        if (capacity) {
46
0
            if constexpr (std::is_trivially_copyable_v<T>) {
47
                // When T is trivially copyable, just copy the data over from old to new buffer.
48
0
                size_t first_part = FirstPart();
49
0
                if (first_part != 0) {
50
0
                    std::memcpy(new_buffer, m_buffer + m_offset, first_part * sizeof(T));
51
0
                }
52
0
                if (first_part != m_size) {
53
0
                    std::memcpy(new_buffer + first_part, m_buffer, (m_size - first_part) * sizeof(T));
54
0
                }
55
0
            } else {
56
                // Otherwise move-construct in place in the new buffer, and destroy old buffer objects.
57
0
                size_t old_pos = m_offset;
58
0
                for (size_t new_pos = 0; new_pos < m_size; ++new_pos) {
59
0
                    std::construct_at(new_buffer + new_pos, std::move(*(m_buffer + old_pos)));
60
0
                    std::destroy_at(m_buffer + old_pos);
61
0
                    ++old_pos;
62
0
                    if (old_pos == m_capacity) old_pos = 0;
63
0
                }
64
0
            }
65
0
        }
66
        // Deallocate old buffer and update housekeeping.
67
0
        std::allocator<T>().deallocate(m_buffer, m_capacity);
68
0
        m_buffer = new_buffer;
69
0
        m_offset = 0;
70
0
        m_capacity = capacity;
71
0
        Assume((m_offset == 0 && m_capacity == 0) || m_offset < m_capacity);
72
0
    }
Unexecuted instantiation: _ZN8VecDequeIZN17cluster_linearize21SearchCandidateFinderIN13bitset_detail9IntBitSetIjEEE16FindCandidateSetEmNS0_7SetInfoIS4_EEE8WorkItemE10ReallocateEm
Unexecuted instantiation: _ZN8VecDequeIhE10ReallocateEm
Unexecuted instantiation: _ZN8VecDequeItE10ReallocateEm
Unexecuted instantiation: _ZN8VecDequeIjE10ReallocateEm
Unexecuted instantiation: _ZN8VecDequeImE10ReallocateEm
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm1EEEE10ReallocateEm
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm3EEEE10ReallocateEm
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm17EEEE10ReallocateEm
73
74
    /** What index in the buffer does logical entry number pos have? */
75
    size_t BufferIndex(size_t pos) const noexcept
76
0
    {
77
0
        Assume(pos < m_capacity);
78
        // The expression below is used instead of the more obvious (pos + m_offset >= m_capacity),
79
        // because the addition there could in theory overflow with very large deques.
80
0
        if (pos >= m_capacity - m_offset) {
81
0
            return (m_offset + pos) - m_capacity;
82
0
        } else {
83
0
            return m_offset + pos;
84
0
        }
85
0
    }
Unexecuted instantiation: _ZNK8VecDequeIZN17cluster_linearize21SearchCandidateFinderIN13bitset_detail9IntBitSetIjEEE16FindCandidateSetEmNS0_7SetInfoIS4_EEE8WorkItemE11BufferIndexEm
Unexecuted instantiation: _ZNK8VecDequeIhE11BufferIndexEm
Unexecuted instantiation: _ZNK8VecDequeItE11BufferIndexEm
Unexecuted instantiation: _ZNK8VecDequeIjE11BufferIndexEm
Unexecuted instantiation: _ZNK8VecDequeImE11BufferIndexEm
Unexecuted instantiation: vecdeque.cpp:_ZNK8VecDequeIN12_GLOBAL__N_110TrackedObjILm1EEEE11BufferIndexEm
Unexecuted instantiation: vecdeque.cpp:_ZNK8VecDequeIN12_GLOBAL__N_110TrackedObjILm3EEEE11BufferIndexEm
Unexecuted instantiation: vecdeque.cpp:_ZNK8VecDequeIN12_GLOBAL__N_110TrackedObjILm17EEEE11BufferIndexEm
86
87
    /** Specialization of resize() that can only shrink. Separate so that clear() can call it
88
     *  without requiring a default T constructor. */
89
    void ResizeDown(size_t size) noexcept
90
0
    {
91
0
        Assume(size <= m_size);
92
0
        if constexpr (std::is_trivially_destructible_v<T>) {
93
            // If T is trivially destructible, we do not need to do anything but update the
94
            // housekeeping record. Default constructor or zero-filling will be used when
95
            // the space is reused.
96
0
            m_size = size;
97
0
        } else {
98
            // If not, we need to invoke the destructor for every element separately.
99
0
            while (m_size > size) {
100
0
                std::destroy_at(m_buffer + BufferIndex(m_size - 1));
101
0
                --m_size;
102
0
            }
103
0
        }
104
0
    }
Unexecuted instantiation: _ZN8VecDequeIZN17cluster_linearize21SearchCandidateFinderIN13bitset_detail9IntBitSetIjEEE16FindCandidateSetEmNS0_7SetInfoIS4_EEE8WorkItemE10ResizeDownEm
Unexecuted instantiation: _ZN8VecDequeIhE10ResizeDownEm
Unexecuted instantiation: _ZN8VecDequeItE10ResizeDownEm
Unexecuted instantiation: _ZN8VecDequeIjE10ResizeDownEm
Unexecuted instantiation: _ZN8VecDequeImE10ResizeDownEm
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm1EEEE10ResizeDownEm
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm3EEEE10ResizeDownEm
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm17EEEE10ResizeDownEm
105
106
public:
107
0
    VecDeque() noexcept = default;
Unexecuted instantiation: _ZN8VecDequeIZN17cluster_linearize21SearchCandidateFinderIN13bitset_detail9IntBitSetIjEEE16FindCandidateSetEmNS0_7SetInfoIS4_EEE8WorkItemEC2Ev
Unexecuted instantiation: _ZN8VecDequeIhEC2Ev
Unexecuted instantiation: _ZN8VecDequeItEC2Ev
Unexecuted instantiation: _ZN8VecDequeIjEC2Ev
Unexecuted instantiation: _ZN8VecDequeImEC2Ev
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm1EEEEC2Ev
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm3EEEEC2Ev
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm17EEEEC2Ev
108
109
    /** Resize the deque to be exactly size size (adding default-constructed elements if needed). */
110
    void resize(size_t size)
111
0
    {
112
0
        if (size < m_size) {
113
            // Delegate to ResizeDown when shrinking.
114
0
            ResizeDown(size);
115
0
        } else if (size > m_size) {
116
            // When growing, first see if we need to allocate more space.
117
0
            if (size > m_capacity) Reallocate(size);
118
0
            while (m_size < size) {
119
0
                std::construct_at(m_buffer + BufferIndex(m_size));
120
0
                ++m_size;
121
0
            }
122
0
        }
123
0
    }
Unexecuted instantiation: _ZN8VecDequeIhE6resizeEm
Unexecuted instantiation: _ZN8VecDequeItE6resizeEm
Unexecuted instantiation: _ZN8VecDequeIjE6resizeEm
Unexecuted instantiation: _ZN8VecDequeImE6resizeEm
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm1EEEE6resizeEm
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm3EEEE6resizeEm
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm17EEEE6resizeEm
124
125
    /** Resize the deque to be size 0. The capacity will remain unchanged. */
126
0
    void clear() noexcept { ResizeDown(0); }
Unexecuted instantiation: _ZN8VecDequeIZN17cluster_linearize21SearchCandidateFinderIN13bitset_detail9IntBitSetIjEEE16FindCandidateSetEmNS0_7SetInfoIS4_EEE8WorkItemE5clearEv
Unexecuted instantiation: _ZN8VecDequeIhE5clearEv
Unexecuted instantiation: _ZN8VecDequeItE5clearEv
Unexecuted instantiation: _ZN8VecDequeIjE5clearEv
Unexecuted instantiation: _ZN8VecDequeImE5clearEv
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm1EEEE5clearEv
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm3EEEE5clearEv
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm17EEEE5clearEv
127
128
    /** Destroy a deque. */
129
    ~VecDeque()
130
0
    {
131
0
        clear();
132
0
        Reallocate(0);
133
0
    }
Unexecuted instantiation: _ZN8VecDequeIZN17cluster_linearize21SearchCandidateFinderIN13bitset_detail9IntBitSetIjEEE16FindCandidateSetEmNS0_7SetInfoIS4_EEE8WorkItemED2Ev
Unexecuted instantiation: _ZN8VecDequeIhED2Ev
Unexecuted instantiation: _ZN8VecDequeItED2Ev
Unexecuted instantiation: _ZN8VecDequeIjED2Ev
Unexecuted instantiation: _ZN8VecDequeImED2Ev
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm1EEEED2Ev
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm3EEEED2Ev
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm17EEEED2Ev
134
135
    /** Copy-assign a deque. */
136
    VecDeque& operator=(const VecDeque& other)
137
0
    {
138
0
        if (&other == this) [[unlikely]] return *this;
139
0
        clear();
140
0
        Reallocate(other.m_size);
141
0
        if constexpr (std::is_trivially_copyable_v<T>) {
142
0
            size_t first_part = other.FirstPart();
143
0
            Assume(first_part > 0 || m_size == 0);
144
0
            if (first_part != 0) {
145
0
                std::memcpy(m_buffer, other.m_buffer + other.m_offset, first_part * sizeof(T));
146
0
            }
147
0
            if (first_part != other.m_size) {
148
0
                std::memcpy(m_buffer + first_part, other.m_buffer, (other.m_size - first_part) * sizeof(T));
149
0
            }
150
0
            m_size = other.m_size;
151
0
        } else {
152
0
            while (m_size < other.m_size) {
153
0
                std::construct_at(m_buffer + BufferIndex(m_size), other[m_size]);
154
0
                ++m_size;
155
0
            }
156
0
        }
157
0
        return *this;
158
0
    }
Unexecuted instantiation: _ZN8VecDequeIhEaSERKS0_
Unexecuted instantiation: _ZN8VecDequeItEaSERKS0_
Unexecuted instantiation: _ZN8VecDequeIjEaSERKS0_
Unexecuted instantiation: _ZN8VecDequeImEaSERKS0_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm1EEEEaSERKS3_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm3EEEEaSERKS3_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm17EEEEaSERKS3_
159
160
    /** Swap two deques. */
161
    void swap(VecDeque& other) noexcept
162
0
    {
163
0
        std::swap(m_buffer, other.m_buffer);
164
0
        std::swap(m_offset, other.m_offset);
165
0
        std::swap(m_size, other.m_size);
166
0
        std::swap(m_capacity, other.m_capacity);
167
0
    }
Unexecuted instantiation: _ZN8VecDequeIhE4swapERS0_
Unexecuted instantiation: _ZN8VecDequeItE4swapERS0_
Unexecuted instantiation: _ZN8VecDequeIjE4swapERS0_
Unexecuted instantiation: _ZN8VecDequeImE4swapERS0_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm1EEEE4swapERS3_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm3EEEE4swapERS3_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm17EEEE4swapERS3_
168
169
    /** Non-member version of swap. */
170
0
    friend void swap(VecDeque& a, VecDeque& b) noexcept { a.swap(b); }
Unexecuted instantiation: _Z4swapR8VecDequeIhES1_
Unexecuted instantiation: _Z4swapR8VecDequeItES1_
Unexecuted instantiation: _Z4swapR8VecDequeIjES1_
Unexecuted instantiation: _Z4swapR8VecDequeImES1_
Unexecuted instantiation: vecdeque.cpp:_Z4swapR8VecDequeIN12_GLOBAL__N_110TrackedObjILm1EEEES4_
Unexecuted instantiation: vecdeque.cpp:_Z4swapR8VecDequeIN12_GLOBAL__N_110TrackedObjILm3EEEES4_
Unexecuted instantiation: vecdeque.cpp:_Z4swapR8VecDequeIN12_GLOBAL__N_110TrackedObjILm17EEEES4_
171
172
    /** Move-assign a deque. */
173
    VecDeque& operator=(VecDeque&& other) noexcept
174
0
    {
175
0
        swap(other);
176
0
        return *this;
177
0
    }
Unexecuted instantiation: _ZN8VecDequeIhEaSEOS0_
Unexecuted instantiation: _ZN8VecDequeItEaSEOS0_
Unexecuted instantiation: _ZN8VecDequeIjEaSEOS0_
Unexecuted instantiation: _ZN8VecDequeImEaSEOS0_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm1EEEEaSEOS3_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm3EEEEaSEOS3_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm17EEEEaSEOS3_
178
179
    /** Copy-construct a deque. */
180
0
    VecDeque(const VecDeque& other) { *this = other; }
Unexecuted instantiation: _ZN8VecDequeIhEC2ERKS0_
Unexecuted instantiation: _ZN8VecDequeItEC2ERKS0_
Unexecuted instantiation: _ZN8VecDequeIjEC2ERKS0_
Unexecuted instantiation: _ZN8VecDequeImEC2ERKS0_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm1EEEEC2ERKS3_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm3EEEEC2ERKS3_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm17EEEEC2ERKS3_
181
    /** Move-construct a deque. */
182
0
    VecDeque(VecDeque&& other) noexcept { swap(other); }
Unexecuted instantiation: _ZN8VecDequeIhEC2EOS0_
Unexecuted instantiation: _ZN8VecDequeItEC2EOS0_
Unexecuted instantiation: _ZN8VecDequeIjEC2EOS0_
Unexecuted instantiation: _ZN8VecDequeImEC2EOS0_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm1EEEEC2EOS3_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm3EEEEC2EOS3_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm17EEEEC2EOS3_
183
184
    /** Equality comparison between two deques (only compares size+contents, not capacity). */
185
    bool friend operator==(const VecDeque& a, const VecDeque& b)
186
0
    {
187
0
        if (a.m_size != b.m_size) return false;
188
0
        for (size_t i = 0; i < a.m_size; ++i) {
189
0
            if (a[i] != b[i]) return false;
190
0
        }
191
0
        return true;
192
0
    }
Unexecuted instantiation: _ZeqRK8VecDequeIhES2_
Unexecuted instantiation: _ZeqRK8VecDequeItES2_
Unexecuted instantiation: _ZeqRK8VecDequeIjES2_
Unexecuted instantiation: _ZeqRK8VecDequeImES2_
Unexecuted instantiation: vecdeque.cpp:_ZeqRK8VecDequeIN12_GLOBAL__N_110TrackedObjILm1EEEES5_
Unexecuted instantiation: vecdeque.cpp:_ZeqRK8VecDequeIN12_GLOBAL__N_110TrackedObjILm3EEEES5_
Unexecuted instantiation: vecdeque.cpp:_ZeqRK8VecDequeIN12_GLOBAL__N_110TrackedObjILm17EEEES5_
193
194
    /** Comparison between two deques, implementing lexicographic ordering on the contents. */
195
    std::strong_ordering friend operator<=>(const VecDeque& a, const VecDeque& b)
196
0
    {
197
0
        size_t pos_a{0}, pos_b{0};
198
0
        while (pos_a < a.m_size && pos_b < b.m_size) {
199
0
            auto cmp = a[pos_a++] <=> b[pos_b++];
200
0
            if (cmp != 0) return cmp;
201
0
        }
202
0
        return a.m_size <=> b.m_size;
203
0
    }
Unexecuted instantiation: _ZssRK8VecDequeIhES2_
Unexecuted instantiation: _ZssRK8VecDequeItES2_
Unexecuted instantiation: _ZssRK8VecDequeIjES2_
Unexecuted instantiation: _ZssRK8VecDequeImES2_
Unexecuted instantiation: vecdeque.cpp:_ZssRK8VecDequeIN12_GLOBAL__N_110TrackedObjILm1EEEES5_
Unexecuted instantiation: vecdeque.cpp:_ZssRK8VecDequeIN12_GLOBAL__N_110TrackedObjILm3EEEES5_
Unexecuted instantiation: vecdeque.cpp:_ZssRK8VecDequeIN12_GLOBAL__N_110TrackedObjILm17EEEES5_
204
205
    /** Increase the capacity to capacity. Capacity will not shrink. */
206
    void reserve(size_t capacity)
207
0
    {
208
0
        if (capacity > m_capacity) Reallocate(capacity);
209
0
    }
Unexecuted instantiation: _ZN8VecDequeIZN17cluster_linearize21SearchCandidateFinderIN13bitset_detail9IntBitSetIjEEE16FindCandidateSetEmNS0_7SetInfoIS4_EEE8WorkItemE7reserveEm
Unexecuted instantiation: _ZN8VecDequeIhE7reserveEm
Unexecuted instantiation: _ZN8VecDequeItE7reserveEm
Unexecuted instantiation: _ZN8VecDequeIjE7reserveEm
Unexecuted instantiation: _ZN8VecDequeImE7reserveEm
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm1EEEE7reserveEm
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm3EEEE7reserveEm
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm17EEEE7reserveEm
210
211
    /** Make the capacity equal to the size. The contents does not change. */
212
    void shrink_to_fit()
213
0
    {
214
0
        if (m_capacity > m_size) Reallocate(m_size);
215
0
    }
Unexecuted instantiation: _ZN8VecDequeIhE13shrink_to_fitEv
Unexecuted instantiation: _ZN8VecDequeItE13shrink_to_fitEv
Unexecuted instantiation: _ZN8VecDequeIjE13shrink_to_fitEv
Unexecuted instantiation: _ZN8VecDequeImE13shrink_to_fitEv
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm1EEEE13shrink_to_fitEv
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm3EEEE13shrink_to_fitEv
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm17EEEE13shrink_to_fitEv
216
217
    /** Construct a new element at the end of the deque. */
218
    template<typename... Args>
219
    void emplace_back(Args&&... args)
220
0
    {
221
0
        if (m_size == m_capacity) Reallocate((m_size + 1) * 2);
222
0
        std::construct_at(m_buffer + BufferIndex(m_size), std::forward<Args>(args)...);
223
0
        ++m_size;
224
0
    }
Unexecuted instantiation: _ZN8VecDequeIZN17cluster_linearize21SearchCandidateFinderIN13bitset_detail9IntBitSetIjEEE16FindCandidateSetEmNS0_7SetInfoIS4_EEE8WorkItemE12emplace_backIJS7_S4_7FeeFracEEEvDpOT_
Unexecuted instantiation: _ZN8VecDequeIhE12emplace_backIJRKhEEEvDpOT_
Unexecuted instantiation: _ZN8VecDequeIhE12emplace_backIJhEEEvDpOT_
Unexecuted instantiation: _ZN8VecDequeIhE12emplace_backIJRmEEEvDpOT_
Unexecuted instantiation: _ZN8VecDequeItE12emplace_backIJRKtEEEvDpOT_
Unexecuted instantiation: _ZN8VecDequeItE12emplace_backIJtEEEvDpOT_
Unexecuted instantiation: _ZN8VecDequeItE12emplace_backIJRmEEEvDpOT_
Unexecuted instantiation: _ZN8VecDequeIjE12emplace_backIJRKjEEEvDpOT_
Unexecuted instantiation: _ZN8VecDequeIjE12emplace_backIJjEEEvDpOT_
Unexecuted instantiation: _ZN8VecDequeIjE12emplace_backIJRmEEEvDpOT_
Unexecuted instantiation: _ZN8VecDequeImE12emplace_backIJRKmEEEvDpOT_
Unexecuted instantiation: _ZN8VecDequeImE12emplace_backIJmEEEvDpOT_
Unexecuted instantiation: _ZN8VecDequeImE12emplace_backIJRmEEEvDpOT_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm1EEEE12emplace_backIJRKS2_EEEvDpOT_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm1EEEE12emplace_backIJS2_EEEvDpOT_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm1EEEE12emplace_backIJRmEEEvDpOT_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm3EEEE12emplace_backIJRKS2_EEEvDpOT_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm3EEEE12emplace_backIJS2_EEEvDpOT_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm3EEEE12emplace_backIJRmEEEvDpOT_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm17EEEE12emplace_backIJRKS2_EEEvDpOT_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm17EEEE12emplace_backIJS2_EEEvDpOT_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm17EEEE12emplace_backIJRmEEEvDpOT_
225
226
    /** Move-construct a new element at the end of the deque. */
227
0
    void push_back(T&& elem) { emplace_back(std::move(elem)); }
Unexecuted instantiation: _ZN8VecDequeIhE9push_backEOh
Unexecuted instantiation: _ZN8VecDequeItE9push_backEOt
Unexecuted instantiation: _ZN8VecDequeIjE9push_backEOj
Unexecuted instantiation: _ZN8VecDequeImE9push_backEOm
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm1EEEE9push_backEOS2_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm3EEEE9push_backEOS2_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm17EEEE9push_backEOS2_
228
229
    /** Copy-construct a new element at the end of the deque. */
230
0
    void push_back(const T& elem) { emplace_back(elem); }
Unexecuted instantiation: _ZN8VecDequeIhE9push_backERKh
Unexecuted instantiation: _ZN8VecDequeItE9push_backERKt
Unexecuted instantiation: _ZN8VecDequeIjE9push_backERKj
Unexecuted instantiation: _ZN8VecDequeImE9push_backERKm
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm1EEEE9push_backERKS2_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm3EEEE9push_backERKS2_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm17EEEE9push_backERKS2_
231
232
    /** Construct a new element at the beginning of the deque. */
233
    template<typename... Args>
234
    void emplace_front(Args&&... args)
235
0
    {
236
0
        if (m_size == m_capacity) Reallocate((m_size + 1) * 2);
237
0
        std::construct_at(m_buffer + BufferIndex(m_capacity - 1), std::forward<Args>(args)...);
238
0
        if (m_offset == 0) m_offset = m_capacity;
239
0
        --m_offset;
240
0
        ++m_size;
241
0
    }
Unexecuted instantiation: _ZN8VecDequeIhE13emplace_frontIJRKhEEEvDpOT_
Unexecuted instantiation: _ZN8VecDequeIhE13emplace_frontIJhEEEvDpOT_
Unexecuted instantiation: _ZN8VecDequeIhE13emplace_frontIJRmEEEvDpOT_
Unexecuted instantiation: _ZN8VecDequeItE13emplace_frontIJRKtEEEvDpOT_
Unexecuted instantiation: _ZN8VecDequeItE13emplace_frontIJtEEEvDpOT_
Unexecuted instantiation: _ZN8VecDequeItE13emplace_frontIJRmEEEvDpOT_
Unexecuted instantiation: _ZN8VecDequeIjE13emplace_frontIJRKjEEEvDpOT_
Unexecuted instantiation: _ZN8VecDequeIjE13emplace_frontIJjEEEvDpOT_
Unexecuted instantiation: _ZN8VecDequeIjE13emplace_frontIJRmEEEvDpOT_
Unexecuted instantiation: _ZN8VecDequeImE13emplace_frontIJRKmEEEvDpOT_
Unexecuted instantiation: _ZN8VecDequeImE13emplace_frontIJmEEEvDpOT_
Unexecuted instantiation: _ZN8VecDequeImE13emplace_frontIJRmEEEvDpOT_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm1EEEE13emplace_frontIJRKS2_EEEvDpOT_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm1EEEE13emplace_frontIJS2_EEEvDpOT_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm1EEEE13emplace_frontIJRmEEEvDpOT_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm3EEEE13emplace_frontIJRKS2_EEEvDpOT_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm3EEEE13emplace_frontIJS2_EEEvDpOT_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm3EEEE13emplace_frontIJRmEEEvDpOT_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm17EEEE13emplace_frontIJRKS2_EEEvDpOT_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm17EEEE13emplace_frontIJS2_EEEvDpOT_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm17EEEE13emplace_frontIJRmEEEvDpOT_
242
243
    /** Copy-construct a new element at the beginning of the deque. */
244
0
    void push_front(const T& elem) { emplace_front(elem); }
Unexecuted instantiation: _ZN8VecDequeIhE10push_frontERKh
Unexecuted instantiation: _ZN8VecDequeItE10push_frontERKt
Unexecuted instantiation: _ZN8VecDequeIjE10push_frontERKj
Unexecuted instantiation: _ZN8VecDequeImE10push_frontERKm
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm1EEEE10push_frontERKS2_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm3EEEE10push_frontERKS2_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm17EEEE10push_frontERKS2_
245
246
    /** Move-construct a new element at the beginning of the deque. */
247
0
    void push_front(T&& elem) { emplace_front(std::move(elem)); }
Unexecuted instantiation: _ZN8VecDequeIhE10push_frontEOh
Unexecuted instantiation: _ZN8VecDequeItE10push_frontEOt
Unexecuted instantiation: _ZN8VecDequeIjE10push_frontEOj
Unexecuted instantiation: _ZN8VecDequeImE10push_frontEOm
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm1EEEE10push_frontEOS2_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm3EEEE10push_frontEOS2_
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm17EEEE10push_frontEOS2_
248
249
    /** Remove the first element of the deque. Requires !empty(). */
250
    void pop_front()
251
0
    {
252
0
        Assume(m_size);
253
0
        std::destroy_at(m_buffer + m_offset);
254
0
        --m_size;
255
0
        ++m_offset;
256
0
        if (m_offset == m_capacity) m_offset = 0;
257
0
    }
Unexecuted instantiation: _ZN8VecDequeIZN17cluster_linearize21SearchCandidateFinderIN13bitset_detail9IntBitSetIjEEE16FindCandidateSetEmNS0_7SetInfoIS4_EEE8WorkItemE9pop_frontEv
Unexecuted instantiation: _ZN8VecDequeIhE9pop_frontEv
Unexecuted instantiation: _ZN8VecDequeItE9pop_frontEv
Unexecuted instantiation: _ZN8VecDequeIjE9pop_frontEv
Unexecuted instantiation: _ZN8VecDequeImE9pop_frontEv
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm1EEEE9pop_frontEv
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm3EEEE9pop_frontEv
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm17EEEE9pop_frontEv
258
259
    /** Remove the last element of the deque. Requires !empty(). */
260
    void pop_back()
261
0
    {
262
0
        Assume(m_size);
263
0
        std::destroy_at(m_buffer + BufferIndex(m_size - 1));
264
0
        --m_size;
265
0
    }
Unexecuted instantiation: _ZN8VecDequeIZN17cluster_linearize21SearchCandidateFinderIN13bitset_detail9IntBitSetIjEEE16FindCandidateSetEmNS0_7SetInfoIS4_EEE8WorkItemE8pop_backEv
Unexecuted instantiation: _ZN8VecDequeIhE8pop_backEv
Unexecuted instantiation: _ZN8VecDequeItE8pop_backEv
Unexecuted instantiation: _ZN8VecDequeIjE8pop_backEv
Unexecuted instantiation: _ZN8VecDequeImE8pop_backEv
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm1EEEE8pop_backEv
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm3EEEE8pop_backEv
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm17EEEE8pop_backEv
266
267
    /** Get a mutable reference to the first element of the deque. Requires !empty(). */
268
    T& front() noexcept
269
0
    {
270
0
        Assume(m_size);
271
0
        return m_buffer[m_offset];
272
0
    }
Unexecuted instantiation: _ZN8VecDequeIZN17cluster_linearize21SearchCandidateFinderIN13bitset_detail9IntBitSetIjEEE16FindCandidateSetEmNS0_7SetInfoIS4_EEE8WorkItemE5frontEv
Unexecuted instantiation: _ZN8VecDequeIhE5frontEv
Unexecuted instantiation: _ZN8VecDequeItE5frontEv
Unexecuted instantiation: _ZN8VecDequeIjE5frontEv
Unexecuted instantiation: _ZN8VecDequeImE5frontEv
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm1EEEE5frontEv
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm3EEEE5frontEv
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm17EEEE5frontEv
273
274
    /** Get a const reference to the first element of the deque. Requires !empty(). */
275
    const T& front() const noexcept
276
0
    {
277
0
        Assume(m_size);
278
0
        return m_buffer[m_offset];
279
0
    }
Unexecuted instantiation: _ZNK8VecDequeIhE5frontEv
Unexecuted instantiation: _ZNK8VecDequeItE5frontEv
Unexecuted instantiation: _ZNK8VecDequeIjE5frontEv
Unexecuted instantiation: _ZNK8VecDequeImE5frontEv
Unexecuted instantiation: vecdeque.cpp:_ZNK8VecDequeIN12_GLOBAL__N_110TrackedObjILm1EEEE5frontEv
Unexecuted instantiation: vecdeque.cpp:_ZNK8VecDequeIN12_GLOBAL__N_110TrackedObjILm3EEEE5frontEv
Unexecuted instantiation: vecdeque.cpp:_ZNK8VecDequeIN12_GLOBAL__N_110TrackedObjILm17EEEE5frontEv
280
281
    /** Get a mutable reference to the last element of the deque. Requires !empty(). */
282
    T& back() noexcept
283
0
    {
284
0
        Assume(m_size);
285
0
        return m_buffer[BufferIndex(m_size - 1)];
286
0
    }
Unexecuted instantiation: _ZN8VecDequeIZN17cluster_linearize21SearchCandidateFinderIN13bitset_detail9IntBitSetIjEEE16FindCandidateSetEmNS0_7SetInfoIS4_EEE8WorkItemE4backEv
Unexecuted instantiation: _ZN8VecDequeIhE4backEv
Unexecuted instantiation: _ZN8VecDequeItE4backEv
Unexecuted instantiation: _ZN8VecDequeIjE4backEv
Unexecuted instantiation: _ZN8VecDequeImE4backEv
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm1EEEE4backEv
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm3EEEE4backEv
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm17EEEE4backEv
287
288
    /** Get a const reference to the last element of the deque. Requires !empty(). */
289
    const T& back() const noexcept
290
0
    {
291
0
        Assume(m_size);
292
0
        return m_buffer[BufferIndex(m_size - 1)];
293
0
    }
Unexecuted instantiation: _ZNK8VecDequeIhE4backEv
Unexecuted instantiation: _ZNK8VecDequeItE4backEv
Unexecuted instantiation: _ZNK8VecDequeIjE4backEv
Unexecuted instantiation: _ZNK8VecDequeImE4backEv
Unexecuted instantiation: vecdeque.cpp:_ZNK8VecDequeIN12_GLOBAL__N_110TrackedObjILm1EEEE4backEv
Unexecuted instantiation: vecdeque.cpp:_ZNK8VecDequeIN12_GLOBAL__N_110TrackedObjILm3EEEE4backEv
Unexecuted instantiation: vecdeque.cpp:_ZNK8VecDequeIN12_GLOBAL__N_110TrackedObjILm17EEEE4backEv
294
295
    /** Get a mutable reference to the element in the deque at the given index. Requires idx < size(). */
296
    T& operator[](size_t idx) noexcept
297
0
    {
298
0
        Assume(idx < m_size);
299
0
        return m_buffer[BufferIndex(idx)];
300
0
    }
Unexecuted instantiation: _ZN8VecDequeIZN17cluster_linearize21SearchCandidateFinderIN13bitset_detail9IntBitSetIjEEE16FindCandidateSetEmNS0_7SetInfoIS4_EEE8WorkItemEixEm
Unexecuted instantiation: _ZN8VecDequeIhEixEm
Unexecuted instantiation: _ZN8VecDequeItEixEm
Unexecuted instantiation: _ZN8VecDequeIjEixEm
Unexecuted instantiation: _ZN8VecDequeImEixEm
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm1EEEEixEm
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm3EEEEixEm
Unexecuted instantiation: vecdeque.cpp:_ZN8VecDequeIN12_GLOBAL__N_110TrackedObjILm17EEEEixEm
301
302
    /** Get a const reference to the element in the deque at the given index. Requires idx < size(). */
303
    const T& operator[](size_t idx) const noexcept
304
0
    {
305
0
        Assume(idx < m_size);
306
0
        return m_buffer[BufferIndex(idx)];
307
0
    }
Unexecuted instantiation: _ZNK8VecDequeIhEixEm
Unexecuted instantiation: _ZNK8VecDequeItEixEm
Unexecuted instantiation: _ZNK8VecDequeIjEixEm
Unexecuted instantiation: _ZNK8VecDequeImEixEm
Unexecuted instantiation: vecdeque.cpp:_ZNK8VecDequeIN12_GLOBAL__N_110TrackedObjILm1EEEEixEm
Unexecuted instantiation: vecdeque.cpp:_ZNK8VecDequeIN12_GLOBAL__N_110TrackedObjILm3EEEEixEm
Unexecuted instantiation: vecdeque.cpp:_ZNK8VecDequeIN12_GLOBAL__N_110TrackedObjILm17EEEEixEm
308
309
    /** Test whether the contents of this deque is empty. */
310
0
    bool empty() const noexcept { return m_size == 0; }
Unexecuted instantiation: _ZNK8VecDequeIZN17cluster_linearize21SearchCandidateFinderIN13bitset_detail9IntBitSetIjEEE16FindCandidateSetEmNS0_7SetInfoIS4_EEE8WorkItemE5emptyEv
Unexecuted instantiation: _ZNK8VecDequeIhE5emptyEv
Unexecuted instantiation: _ZNK8VecDequeItE5emptyEv
Unexecuted instantiation: _ZNK8VecDequeIjE5emptyEv
Unexecuted instantiation: _ZNK8VecDequeImE5emptyEv
Unexecuted instantiation: vecdeque.cpp:_ZNK8VecDequeIN12_GLOBAL__N_110TrackedObjILm1EEEE5emptyEv
Unexecuted instantiation: vecdeque.cpp:_ZNK8VecDequeIN12_GLOBAL__N_110TrackedObjILm3EEEE5emptyEv
Unexecuted instantiation: vecdeque.cpp:_ZNK8VecDequeIN12_GLOBAL__N_110TrackedObjILm17EEEE5emptyEv
311
    /** Get the number of elements in this deque. */
312
0
    size_t size() const noexcept { return m_size; }
Unexecuted instantiation: _ZNK8VecDequeIZN17cluster_linearize21SearchCandidateFinderIN13bitset_detail9IntBitSetIjEEE16FindCandidateSetEmNS0_7SetInfoIS4_EEE8WorkItemE4sizeEv
Unexecuted instantiation: _ZNK8VecDequeIhE4sizeEv
Unexecuted instantiation: _ZNK8VecDequeItE4sizeEv
Unexecuted instantiation: _ZNK8VecDequeIjE4sizeEv
Unexecuted instantiation: _ZNK8VecDequeImE4sizeEv
Unexecuted instantiation: vecdeque.cpp:_ZNK8VecDequeIN12_GLOBAL__N_110TrackedObjILm1EEEE4sizeEv
Unexecuted instantiation: vecdeque.cpp:_ZNK8VecDequeIN12_GLOBAL__N_110TrackedObjILm3EEEE4sizeEv
Unexecuted instantiation: vecdeque.cpp:_ZNK8VecDequeIN12_GLOBAL__N_110TrackedObjILm17EEEE4sizeEv
313
    /** Get the capacity of this deque (maximum size it can have without reallocating). */
314
0
    size_t capacity() const noexcept { return m_capacity; }
Unexecuted instantiation: _ZNK8VecDequeIZN17cluster_linearize21SearchCandidateFinderIN13bitset_detail9IntBitSetIjEEE16FindCandidateSetEmNS0_7SetInfoIS4_EEE8WorkItemE8capacityEv
Unexecuted instantiation: _ZNK8VecDequeIhE8capacityEv
Unexecuted instantiation: _ZNK8VecDequeItE8capacityEv
Unexecuted instantiation: _ZNK8VecDequeIjE8capacityEv
Unexecuted instantiation: _ZNK8VecDequeImE8capacityEv
Unexecuted instantiation: vecdeque.cpp:_ZNK8VecDequeIN12_GLOBAL__N_110TrackedObjILm1EEEE8capacityEv
Unexecuted instantiation: vecdeque.cpp:_ZNK8VecDequeIN12_GLOBAL__N_110TrackedObjILm3EEEE8capacityEv
Unexecuted instantiation: vecdeque.cpp:_ZNK8VecDequeIN12_GLOBAL__N_110TrackedObjILm17EEEE8capacityEv
315
};
316
317
#endif // BITCOIN_UTIL_VECDEQUE_H