Coverage Report

Created: 2026-10-19 15:22

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/tmp/bitcoin/src/prevector.h
Line
Count
Source
1
// Copyright (c) 2015-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_PREVECTOR_H
6
#define BITCOIN_PREVECTOR_H
7
8
#include <algorithm>
9
#include <cassert>
10
#include <cstdint>
11
#include <cstdlib>
12
#include <cstring>
13
#include <iterator>
14
#include <new>
15
#include <type_traits>
16
#include <utility>
17
18
/** Implements a drop-in replacement for std::vector<T> which stores up to N
19
 *  elements directly (without heap allocation). The types Size and Diff are
20
 *  used to store element counts, and can be any unsigned + signed type.
21
 *
22
 *  Storage layout is either:
23
 *  - Direct allocation:
24
 *    - Size _size: the number of used elements (between 0 and N)
25
 *    - T direct[N]: an array of N elements of type T
26
 *      (only the first _size are initialized).
27
 *  - Indirect allocation:
28
 *    - Size _size: the number of used elements plus N + 1
29
 *    - Size capacity: the number of allocated elements
30
 *    - T* indirect: a pointer to an array of capacity elements of type T
31
 *      (only the first _size are initialized).
32
 *
33
 *  The data type T must be movable by memmove/realloc(). Once we switch to C++,
34
 *  move constructors can be used instead.
35
 */
36
template<unsigned int N, typename T, typename Size = uint32_t, typename Diff = int32_t>
37
class prevector {
38
    static_assert(std::is_trivially_copyable_v<T>);
39
40
public:
41
    static constexpr unsigned int STATIC_SIZE{N};
42
43
    typedef Size size_type;
44
    typedef Diff difference_type;
45
    typedef T value_type;
46
    typedef value_type& reference;
47
    typedef const value_type& const_reference;
48
    typedef value_type* pointer;
49
    typedef const value_type* const_pointer;
50
51
    class iterator {
52
        T* ptr{};
53
    public:
54
        typedef Diff difference_type;
55
        typedef T* pointer;
56
        typedef T& reference;
57
        using element_type = T;
58
        using iterator_category = std::contiguous_iterator_tag;
59
        iterator() = default;
60
100M
        iterator(T* ptr_) : ptr(ptr_) {}
prevector<36u, unsigned char, unsigned int, int>::iterator::iterator(unsigned char*)
Line
Count
Source
60
85.1M
        iterator(T* ptr_) : ptr(ptr_) {}
prevector<16u, unsigned char, unsigned int, int>::iterator::iterator(unsigned char*)
Line
Count
Source
60
495k
        iterator(T* ptr_) : ptr(ptr_) {}
prevector<8u, int, unsigned int, int>::iterator::iterator(int*)
Line
Count
Source
60
14.4M
        iterator(T* ptr_) : ptr(ptr_) {}
Unexecuted instantiation: prevector<33u, unsigned char, unsigned int, int>::iterator::iterator(unsigned char*)
prevector<35u, unsigned char, unsigned int, int>::iterator::iterator(unsigned char*)
Line
Count
Source
60
1.17k
        iterator(T* ptr_) : ptr(ptr_) {}
61
169M
        T& operator*() const { return *ptr; }
prevector<36u, unsigned char, unsigned int, int>::iterator::operator*() const
Line
Count
Source
61
156M
        T& operator*() const { return *ptr; }
prevector<16u, unsigned char, unsigned int, int>::iterator::operator*() const
Line
Count
Source
61
991k
        T& operator*() const { return *ptr; }
prevector<8u, int, unsigned int, int>::iterator::operator*() const
Line
Count
Source
61
11.4M
        T& operator*() const { return *ptr; }
Unexecuted instantiation: prevector<33u, unsigned char, unsigned int, int>::iterator::operator*() const
prevector<35u, unsigned char, unsigned int, int>::iterator::operator*() const
Line
Count
Source
61
1.17k
        T& operator*() const { return *ptr; }
62
35.4k
        T* operator->() const { return ptr; }
Unexecuted instantiation: prevector<16u, unsigned char, unsigned int, int>::iterator::operator->() const
Unexecuted instantiation: prevector<33u, unsigned char, unsigned int, int>::iterator::operator->() const
prevector<36u, unsigned char, unsigned int, int>::iterator::operator->() const
Line
Count
Source
62
35.4k
        T* operator->() const { return ptr; }
Unexecuted instantiation: prevector<35u, unsigned char, unsigned int, int>::iterator::operator->() const
63
2.07M
        T& operator[](size_type pos) const { return ptr[pos]; }
64
41.8M
        iterator& operator++() { ptr++; return *this; }
prevector<36u, unsigned char, unsigned int, int>::iterator::operator++()
Line
Count
Source
64
37.7M
        iterator& operator++() { ptr++; return *this; }
prevector<8u, int, unsigned int, int>::iterator::operator++()
Line
Count
Source
64
4.14M
        iterator& operator++() { ptr++; return *this; }
65
4.14M
        iterator& operator--() { ptr--; return *this; }
66
        iterator operator++(int) { iterator copy(*this); ++(*this); return copy; }
67
        iterator operator--(int) { iterator copy(*this); --(*this); return copy; }
68
30.5M
        difference_type friend operator-(iterator a, iterator b) { return (&(*a) - &(*b)); }
operator-(prevector<36u, unsigned char, unsigned int, int>::iterator, prevector<36u, unsigned char, unsigned int, int>::iterator)
Line
Count
Source
68
29.9M
        difference_type friend operator-(iterator a, iterator b) { return (&(*a) - &(*b)); }
operator-(prevector<16u, unsigned char, unsigned int, int>::iterator, prevector<16u, unsigned char, unsigned int, int>::iterator)
Line
Count
Source
68
165k
        difference_type friend operator-(iterator a, iterator b) { return (&(*a) - &(*b)); }
operator-(prevector<8u, int, unsigned int, int>::iterator, prevector<8u, int, unsigned int, int>::iterator)
Line
Count
Source
68
388k
        difference_type friend operator-(iterator a, iterator b) { return (&(*a) - &(*b)); }
Unexecuted instantiation: operator-(prevector<33u, unsigned char, unsigned int, int>::iterator, prevector<33u, unsigned char, unsigned int, int>::iterator)
operator-(prevector<35u, unsigned char, unsigned int, int>::iterator, prevector<35u, unsigned char, unsigned int, int>::iterator)
Line
Count
Source
68
586
        difference_type friend operator-(iterator a, iterator b) { return (&(*a) - &(*b)); }
69
4.29M
        iterator operator+(size_type n) const { return iterator(ptr + n); }
70
        iterator friend operator+(size_type n, iterator x) { return x + n; }
71
        iterator& operator+=(size_type n) { ptr += n; return *this; }
72
2.07M
        iterator operator-(size_type n) const { return iterator(ptr - n); }
73
        iterator& operator-=(size_type n) { ptr -= n; return *this; }
74
44.8M
        bool operator==(iterator x) const { return ptr == x.ptr; }
prevector<36u, unsigned char, unsigned int, int>::iterator::operator==(prevector<36u, unsigned char, unsigned int, int>::iterator) const
Line
Count
Source
74
37.8M
        bool operator==(iterator x) const { return ptr == x.ptr; }
prevector<8u, int, unsigned int, int>::iterator::operator==(prevector<8u, int, unsigned int, int>::iterator) const
Line
Count
Source
74
7.01M
        bool operator==(iterator x) const { return ptr == x.ptr; }
75
0
        auto operator<=>(iterator x) const { return ptr <=> x.ptr; }
Unexecuted instantiation: prevector<16u, unsigned char, unsigned int, int>::iterator::operator<=>(prevector<16u, unsigned char, unsigned int, int>::iterator) const
Unexecuted instantiation: prevector<33u, unsigned char, unsigned int, int>::iterator::operator<=>(prevector<33u, unsigned char, unsigned int, int>::iterator) const
Unexecuted instantiation: prevector<36u, unsigned char, unsigned int, int>::iterator::operator<=>(prevector<36u, unsigned char, unsigned int, int>::iterator) const
Unexecuted instantiation: prevector<8u, int, unsigned int, int>::iterator::operator<=>(prevector<8u, int, unsigned int, int>::iterator) const
Unexecuted instantiation: prevector<35u, unsigned char, unsigned int, int>::iterator::operator<=>(prevector<35u, unsigned char, unsigned int, int>::iterator) const
76
    };
77
78
    class const_iterator {
79
        const T* ptr{};
80
    public:
81
        typedef Diff difference_type;
82
        typedef const T* pointer;
83
        typedef const T& reference;
84
        using element_type = const T;
85
        using iterator_category = std::contiguous_iterator_tag;
86
        const_iterator() = default;
87
1.83G
        const_iterator(const T* ptr_) : ptr(ptr_) {}
prevector<16u, unsigned char, unsigned int, int>::const_iterator::const_iterator(unsigned char const*)
Line
Count
Source
87
7.47M
        const_iterator(const T* ptr_) : ptr(ptr_) {}
prevector<36u, unsigned char, unsigned int, int>::const_iterator::const_iterator(unsigned char const*)
Line
Count
Source
87
1.82G
        const_iterator(const T* ptr_) : ptr(ptr_) {}
prevector<8u, int, unsigned int, int>::const_iterator::const_iterator(int const*)
Line
Count
Source
87
3.73M
        const_iterator(const T* ptr_) : ptr(ptr_) {}
88
757k
        const_iterator(iterator x) : ptr(&(*x)) {}
89
18.8G
        const T& operator*() const { return *ptr; }
prevector<36u, unsigned char, unsigned int, int>::const_iterator::operator*() const
Line
Count
Source
89
18.7G
        const T& operator*() const { return *ptr; }
prevector<16u, unsigned char, unsigned int, int>::const_iterator::operator*() const
Line
Count
Source
89
11.9M
        const T& operator*() const { return *ptr; }
prevector<8u, int, unsigned int, int>::const_iterator::operator*() const
Line
Count
Source
89
16.6M
        const T& operator*() const { return *ptr; }
90
4.00M
        const T* operator->() const { return ptr; }
prevector<16u, unsigned char, unsigned int, int>::const_iterator::operator->() const
Line
Count
Source
90
593
        const T* operator->() const { return ptr; }
prevector<36u, unsigned char, unsigned int, int>::const_iterator::operator->() const
Line
Count
Source
90
3.99M
        const T* operator->() const { return ptr; }
91
185k
        const T& operator[](size_type pos) const { return ptr[pos]; }
92
16.7G
        const_iterator& operator++() { ptr++; return *this; }
prevector<36u, unsigned char, unsigned int, int>::const_iterator::operator++()
Line
Count
Source
92
16.7G
        const_iterator& operator++() { ptr++; return *this; }
prevector<16u, unsigned char, unsigned int, int>::const_iterator::operator++()
Line
Count
Source
92
6.52M
        const_iterator& operator++() { ptr++; return *this; }
prevector<8u, int, unsigned int, int>::const_iterator::operator++()
Line
Count
Source
92
12.4M
        const_iterator& operator++() { ptr++; return *this; }
93
4.14M
        const_iterator& operator--() { ptr--; return *this; }
prevector<8u, int, unsigned int, int>::const_iterator::operator--()
Line
Count
Source
93
4.14M
        const_iterator& operator--() { ptr--; return *this; }
Unexecuted instantiation: prevector<36u, unsigned char, unsigned int, int>::const_iterator::operator--()
94
791M
        const_iterator operator++(int) { const_iterator copy(*this); ++(*this); return copy; }
95
        const_iterator operator--(int) { const_iterator copy(*this); --(*this); return copy; }
96
843M
        difference_type friend operator-(const_iterator a, const_iterator b) { return (&(*a) - &(*b)); }
operator-(prevector<36u, unsigned char, unsigned int, int>::const_iterator, prevector<36u, unsigned char, unsigned int, int>::const_iterator)
Line
Count
Source
96
841M
        difference_type friend operator-(const_iterator a, const_iterator b) { return (&(*a) - &(*b)); }
operator-(prevector<16u, unsigned char, unsigned int, int>::const_iterator, prevector<16u, unsigned char, unsigned int, int>::const_iterator)
Line
Count
Source
96
488k
        difference_type friend operator-(const_iterator a, const_iterator b) { return (&(*a) - &(*b)); }
operator-(prevector<8u, int, unsigned int, int>::const_iterator, prevector<8u, int, unsigned int, int>::const_iterator)
Line
Count
Source
96
1.07M
        difference_type friend operator-(const_iterator a, const_iterator b) { return (&(*a) - &(*b)); }
97
6.08M
        const_iterator operator+(size_type n) const { return const_iterator(ptr + n); }
98
        const_iterator friend operator+(size_type n, const_iterator x) { return x + n; }
99
9.27M
        const_iterator& operator+=(size_type n) { ptr += n; return *this; }
100
590
        const_iterator operator-(size_type n) const { return const_iterator(ptr - n); }
101
        const_iterator& operator-=(size_type n) { ptr -= n; return *this; }
102
15.9G
        bool operator==(const_iterator x) const { return ptr == x.ptr; }
prevector<36u, unsigned char, unsigned int, int>::const_iterator::operator==(prevector<36u, unsigned char, unsigned int, int>::const_iterator) const
Line
Count
Source
102
15.9G
        bool operator==(const_iterator x) const { return ptr == x.ptr; }
prevector<16u, unsigned char, unsigned int, int>::const_iterator::operator==(prevector<16u, unsigned char, unsigned int, int>::const_iterator) const
Line
Count
Source
102
7.38M
        bool operator==(const_iterator x) const { return ptr == x.ptr; }
prevector<8u, int, unsigned int, int>::const_iterator::operator==(prevector<8u, int, unsigned int, int>::const_iterator) const
Line
Count
Source
102
11.7M
        bool operator==(const_iterator x) const { return ptr == x.ptr; }
103
1.58G
        auto operator<=>(const_iterator x) const { return ptr <=> x.ptr; }
Unexecuted instantiation: prevector<16u, unsigned char, unsigned int, int>::const_iterator::operator<=>(prevector<16u, unsigned char, unsigned int, int>::const_iterator) const
prevector<36u, unsigned char, unsigned int, int>::const_iterator::operator<=>(prevector<36u, unsigned char, unsigned int, int>::const_iterator) const
Line
Count
Source
103
1.58G
        auto operator<=>(const_iterator x) const { return ptr <=> x.ptr; }
Unexecuted instantiation: prevector<8u, int, unsigned int, int>::const_iterator::operator<=>(prevector<8u, int, unsigned int, int>::const_iterator) const
104
    };
105
106
private:
107
#pragma pack(push, 1)
108
    union direct_or_indirect {
109
        char direct[sizeof(T) * N];
110
        struct {
111
            char* indirect;
112
            size_type capacity;
113
        } indirect_contents;
114
    };
115
#pragma pack(pop)
116
    alignas(char*) direct_or_indirect _union = {};
117
    size_type _size = 0;
118
119
    static_assert(alignof(char*) % alignof(size_type) == 0 && sizeof(char*) % alignof(size_type) == 0, "size_type cannot have more restrictive alignment requirement than pointer");
120
    static_assert(alignof(char*) % alignof(T) == 0, "value_type T cannot have more restrictive alignment requirement than pointer");
121
122
140M
    T* direct_ptr(difference_type pos) { return reinterpret_cast<T*>(_union.direct) + pos; }
prevector<36u, unsigned char, unsigned int, int>::direct_ptr(int)
Line
Count
Source
122
134M
    T* direct_ptr(difference_type pos) { return reinterpret_cast<T*>(_union.direct) + pos; }
prevector<16u, unsigned char, unsigned int, int>::direct_ptr(int)
Line
Count
Source
122
2.19M
    T* direct_ptr(difference_type pos) { return reinterpret_cast<T*>(_union.direct) + pos; }
prevector<33u, unsigned char, unsigned int, int>::direct_ptr(int)
Line
Count
Source
122
768k
    T* direct_ptr(difference_type pos) { return reinterpret_cast<T*>(_union.direct) + pos; }
prevector<8u, int, unsigned int, int>::direct_ptr(int)
Line
Count
Source
122
2.88M
    T* direct_ptr(difference_type pos) { return reinterpret_cast<T*>(_union.direct) + pos; }
prevector<4u, Network, unsigned int, int>::direct_ptr(int)
Line
Count
Source
122
1.06k
    T* direct_ptr(difference_type pos) { return reinterpret_cast<T*>(_union.direct) + pos; }
prevector<35u, unsigned char, unsigned int, int>::direct_ptr(int)
Line
Count
Source
122
2.34k
    T* direct_ptr(difference_type pos) { return reinterpret_cast<T*>(_union.direct) + pos; }
123
319M
    const T* direct_ptr(difference_type pos) const { return reinterpret_cast<const T*>(_union.direct) + pos; }
prevector<36u, unsigned char, unsigned int, int>::direct_ptr(int) const
Line
Count
Source
123
301M
    const T* direct_ptr(difference_type pos) const { return reinterpret_cast<const T*>(_union.direct) + pos; }
prevector<16u, unsigned char, unsigned int, int>::direct_ptr(int) const
Line
Count
Source
123
17.0M
    const T* direct_ptr(difference_type pos) const { return reinterpret_cast<const T*>(_union.direct) + pos; }
prevector<8u, int, unsigned int, int>::direct_ptr(int) const
Line
Count
Source
123
1.58M
    const T* direct_ptr(difference_type pos) const { return reinterpret_cast<const T*>(_union.direct) + pos; }
prevector<33u, unsigned char, unsigned int, int>::direct_ptr(int) const
Line
Count
Source
123
128k
    const T* direct_ptr(difference_type pos) const { return reinterpret_cast<const T*>(_union.direct) + pos; }
124
34.9M
    T* indirect_ptr(difference_type pos) { return reinterpret_cast<T*>(_union.indirect_contents.indirect) + pos; }
prevector<36u, unsigned char, unsigned int, int>::indirect_ptr(int)
Line
Count
Source
124
20.5M
    T* indirect_ptr(difference_type pos) { return reinterpret_cast<T*>(_union.indirect_contents.indirect) + pos; }
prevector<16u, unsigned char, unsigned int, int>::indirect_ptr(int)
Line
Count
Source
124
2.76k
    T* indirect_ptr(difference_type pos) { return reinterpret_cast<T*>(_union.indirect_contents.indirect) + pos; }
Unexecuted instantiation: prevector<33u, unsigned char, unsigned int, int>::indirect_ptr(int)
prevector<8u, int, unsigned int, int>::indirect_ptr(int)
Line
Count
Source
124
14.4M
    T* indirect_ptr(difference_type pos) { return reinterpret_cast<T*>(_union.indirect_contents.indirect) + pos; }
Unexecuted instantiation: prevector<4u, Network, unsigned int, int>::indirect_ptr(int)
Unexecuted instantiation: prevector<35u, unsigned char, unsigned int, int>::indirect_ptr(int)
125
1.56G
    const T* indirect_ptr(difference_type pos) const { return reinterpret_cast<const T*>(_union.indirect_contents.indirect) + pos; }
prevector<36u, unsigned char, unsigned int, int>::indirect_ptr(int) const
Line
Count
Source
125
1.56G
    const T* indirect_ptr(difference_type pos) const { return reinterpret_cast<const T*>(_union.indirect_contents.indirect) + pos; }
prevector<16u, unsigned char, unsigned int, int>::indirect_ptr(int) const
Line
Count
Source
125
7.41k
    const T* indirect_ptr(difference_type pos) const { return reinterpret_cast<const T*>(_union.indirect_contents.indirect) + pos; }
prevector<8u, int, unsigned int, int>::indirect_ptr(int) const
Line
Count
Source
125
2.14M
    const T* indirect_ptr(difference_type pos) const { return reinterpret_cast<const T*>(_union.indirect_contents.indirect) + pos; }
Unexecuted instantiation: prevector<33u, unsigned char, unsigned int, int>::indirect_ptr(int) const
126
4.78G
    bool is_direct() const { return _size <= N; }
prevector<36u, unsigned char, unsigned int, int>::is_direct() const
Line
Count
Source
126
4.72G
    bool is_direct() const { return _size <= N; }
prevector<16u, unsigned char, unsigned int, int>::is_direct() const
Line
Count
Source
126
32.1M
    bool is_direct() const { return _size <= N; }
prevector<33u, unsigned char, unsigned int, int>::is_direct() const
Line
Count
Source
126
2.17M
    bool is_direct() const { return _size <= N; }
prevector<8u, int, unsigned int, int>::is_direct() const
Line
Count
Source
126
29.1M
    bool is_direct() const { return _size <= N; }
prevector<4u, Network, unsigned int, int>::is_direct() const
Line
Count
Source
126
4.26k
    bool is_direct() const { return _size <= N; }
prevector<35u, unsigned char, unsigned int, int>::is_direct() const
Line
Count
Source
126
5.56k
    bool is_direct() const { return _size <= N; }
127
128
154M
    void change_capacity(size_type new_capacity) {
129
154M
        if (new_capacity <= N) {
130
151M
            if (!is_direct()) {
131
45.0k
                T* indirect = indirect_ptr(0);
132
45.0k
                T* src = indirect;
133
45.0k
                T* dst = direct_ptr(0);
134
45.0k
                memcpy(dst, src, size() * sizeof(T));
135
45.0k
                free(indirect);
136
45.0k
                _size -= N + 1;
137
45.0k
            }
138
151M
        } else {
139
2.44M
            if (!is_direct()) {
140
                /* FIXME: Because malloc/realloc here won't call new_handler if allocation fails, assert
141
                    success. These should instead use an allocator or new/delete so that handlers
142
                    are called as necessary, but performance would be slightly degraded by doing so. */
143
82.9k
                _union.indirect_contents.indirect = static_cast<char*>(realloc(_union.indirect_contents.indirect, ((size_t)sizeof(T)) * new_capacity));
144
82.9k
                assert(_union.indirect_contents.indirect);
145
82.9k
                _union.indirect_contents.capacity = new_capacity;
146
2.36M
            } else {
147
2.36M
                char* new_indirect = static_cast<char*>(malloc(((size_t)sizeof(T)) * new_capacity));
148
2.36M
                assert(new_indirect);
149
2.36M
                T* src = direct_ptr(0);
150
2.36M
                T* dst = reinterpret_cast<T*>(new_indirect);
151
2.36M
                memcpy(dst, src, size() * sizeof(T));
152
2.36M
                _union.indirect_contents.indirect = new_indirect;
153
2.36M
                _union.indirect_contents.capacity = new_capacity;
154
2.36M
                _size += N + 1;
155
2.36M
            }
156
2.44M
        }
157
154M
    }
prevector<36u, unsigned char, unsigned int, int>::change_capacity(unsigned int)
Line
Count
Source
128
152M
    void change_capacity(size_type new_capacity) {
129
152M
        if (new_capacity <= N) {
130
149M
            if (!is_direct()) {
131
44.4k
                T* indirect = indirect_ptr(0);
132
44.4k
                T* src = indirect;
133
44.4k
                T* dst = direct_ptr(0);
134
44.4k
                memcpy(dst, src, size() * sizeof(T));
135
44.4k
                free(indirect);
136
44.4k
                _size -= N + 1;
137
44.4k
            }
138
149M
        } else {
139
2.23M
            if (!is_direct()) {
140
                /* FIXME: Because malloc/realloc here won't call new_handler if allocation fails, assert
141
                    success. These should instead use an allocator or new/delete so that handlers
142
                    are called as necessary, but performance would be slightly degraded by doing so. */
143
78.9k
                _union.indirect_contents.indirect = static_cast<char*>(realloc(_union.indirect_contents.indirect, ((size_t)sizeof(T)) * new_capacity));
144
78.9k
                assert(_union.indirect_contents.indirect);
145
78.9k
                _union.indirect_contents.capacity = new_capacity;
146
2.15M
            } else {
147
2.15M
                char* new_indirect = static_cast<char*>(malloc(((size_t)sizeof(T)) * new_capacity));
148
2.15M
                assert(new_indirect);
149
2.15M
                T* src = direct_ptr(0);
150
2.15M
                T* dst = reinterpret_cast<T*>(new_indirect);
151
2.15M
                memcpy(dst, src, size() * sizeof(T));
152
2.15M
                _union.indirect_contents.indirect = new_indirect;
153
2.15M
                _union.indirect_contents.capacity = new_capacity;
154
2.15M
                _size += N + 1;
155
2.15M
            }
156
2.23M
        }
157
152M
    }
prevector<16u, unsigned char, unsigned int, int>::change_capacity(unsigned int)
Line
Count
Source
128
1.52M
    void change_capacity(size_type new_capacity) {
129
1.52M
        if (new_capacity <= N) {
130
1.52M
            if (!is_direct()) {
131
0
                T* indirect = indirect_ptr(0);
132
0
                T* src = indirect;
133
0
                T* dst = direct_ptr(0);
134
0
                memcpy(dst, src, size() * sizeof(T));
135
0
                free(indirect);
136
0
                _size -= N + 1;
137
0
            }
138
1.52M
        } else {
139
2.43k
            if (!is_direct()) {
140
                /* FIXME: Because malloc/realloc here won't call new_handler if allocation fails, assert
141
                    success. These should instead use an allocator or new/delete so that handlers
142
                    are called as necessary, but performance would be slightly degraded by doing so. */
143
0
                _union.indirect_contents.indirect = static_cast<char*>(realloc(_union.indirect_contents.indirect, ((size_t)sizeof(T)) * new_capacity));
144
0
                assert(_union.indirect_contents.indirect);
145
0
                _union.indirect_contents.capacity = new_capacity;
146
2.43k
            } else {
147
2.43k
                char* new_indirect = static_cast<char*>(malloc(((size_t)sizeof(T)) * new_capacity));
148
2.43k
                assert(new_indirect);
149
2.43k
                T* src = direct_ptr(0);
150
2.43k
                T* dst = reinterpret_cast<T*>(new_indirect);
151
2.43k
                memcpy(dst, src, size() * sizeof(T));
152
2.43k
                _union.indirect_contents.indirect = new_indirect;
153
2.43k
                _union.indirect_contents.capacity = new_capacity;
154
2.43k
                _size += N + 1;
155
2.43k
            }
156
2.43k
        }
157
1.52M
    }
prevector<33u, unsigned char, unsigned int, int>::change_capacity(unsigned int)
Line
Count
Source
128
128k
    void change_capacity(size_type new_capacity) {
129
128k
        if (new_capacity <= N) {
130
128k
            if (!is_direct()) {
131
0
                T* indirect = indirect_ptr(0);
132
0
                T* src = indirect;
133
0
                T* dst = direct_ptr(0);
134
0
                memcpy(dst, src, size() * sizeof(T));
135
0
                free(indirect);
136
0
                _size -= N + 1;
137
0
            }
138
128k
        } else {
139
0
            if (!is_direct()) {
140
                /* FIXME: Because malloc/realloc here won't call new_handler if allocation fails, assert
141
                    success. These should instead use an allocator or new/delete so that handlers
142
                    are called as necessary, but performance would be slightly degraded by doing so. */
143
0
                _union.indirect_contents.indirect = static_cast<char*>(realloc(_union.indirect_contents.indirect, ((size_t)sizeof(T)) * new_capacity));
144
0
                assert(_union.indirect_contents.indirect);
145
0
                _union.indirect_contents.capacity = new_capacity;
146
0
            } else {
147
0
                char* new_indirect = static_cast<char*>(malloc(((size_t)sizeof(T)) * new_capacity));
148
0
                assert(new_indirect);
149
0
                T* src = direct_ptr(0);
150
0
                T* dst = reinterpret_cast<T*>(new_indirect);
151
0
                memcpy(dst, src, size() * sizeof(T));
152
0
                _union.indirect_contents.indirect = new_indirect;
153
0
                _union.indirect_contents.capacity = new_capacity;
154
0
                _size += N + 1;
155
0
            }
156
0
        }
157
128k
    }
prevector<8u, int, unsigned int, int>::change_capacity(unsigned int)
Line
Count
Source
128
540k
    void change_capacity(size_type new_capacity) {
129
540k
        if (new_capacity <= N) {
130
334k
            if (!is_direct()) {
131
568
                T* indirect = indirect_ptr(0);
132
568
                T* src = indirect;
133
568
                T* dst = direct_ptr(0);
134
568
                memcpy(dst, src, size() * sizeof(T));
135
568
                free(indirect);
136
568
                _size -= N + 1;
137
568
            }
138
334k
        } else {
139
205k
            if (!is_direct()) {
140
                /* FIXME: Because malloc/realloc here won't call new_handler if allocation fails, assert
141
                    success. These should instead use an allocator or new/delete so that handlers
142
                    are called as necessary, but performance would be slightly degraded by doing so. */
143
4.08k
                _union.indirect_contents.indirect = static_cast<char*>(realloc(_union.indirect_contents.indirect, ((size_t)sizeof(T)) * new_capacity));
144
4.08k
                assert(_union.indirect_contents.indirect);
145
4.08k
                _union.indirect_contents.capacity = new_capacity;
146
201k
            } else {
147
201k
                char* new_indirect = static_cast<char*>(malloc(((size_t)sizeof(T)) * new_capacity));
148
201k
                assert(new_indirect);
149
201k
                T* src = direct_ptr(0);
150
201k
                T* dst = reinterpret_cast<T*>(new_indirect);
151
201k
                memcpy(dst, src, size() * sizeof(T));
152
201k
                _union.indirect_contents.indirect = new_indirect;
153
201k
                _union.indirect_contents.capacity = new_capacity;
154
201k
                _size += N + 1;
155
201k
            }
156
205k
        }
157
540k
    }
Unexecuted instantiation: prevector<4u, Network, unsigned int, int>::change_capacity(unsigned int)
prevector<35u, unsigned char, unsigned int, int>::change_capacity(unsigned int)
Line
Count
Source
128
293
    void change_capacity(size_type new_capacity) {
129
293
        if (new_capacity <= N) {
130
293
            if (!is_direct()) {
131
0
                T* indirect = indirect_ptr(0);
132
0
                T* src = indirect;
133
0
                T* dst = direct_ptr(0);
134
0
                memcpy(dst, src, size() * sizeof(T));
135
0
                free(indirect);
136
0
                _size -= N + 1;
137
0
            }
138
293
        } else {
139
0
            if (!is_direct()) {
140
                /* FIXME: Because malloc/realloc here won't call new_handler if allocation fails, assert
141
                    success. These should instead use an allocator or new/delete so that handlers
142
                    are called as necessary, but performance would be slightly degraded by doing so. */
143
0
                _union.indirect_contents.indirect = static_cast<char*>(realloc(_union.indirect_contents.indirect, ((size_t)sizeof(T)) * new_capacity));
144
0
                assert(_union.indirect_contents.indirect);
145
0
                _union.indirect_contents.capacity = new_capacity;
146
0
            } else {
147
0
                char* new_indirect = static_cast<char*>(malloc(((size_t)sizeof(T)) * new_capacity));
148
0
                assert(new_indirect);
149
0
                T* src = direct_ptr(0);
150
0
                T* dst = reinterpret_cast<T*>(new_indirect);
151
0
                memcpy(dst, src, size() * sizeof(T));
152
0
                _union.indirect_contents.indirect = new_indirect;
153
0
                _union.indirect_contents.capacity = new_capacity;
154
0
                _size += N + 1;
155
0
            }
156
0
        }
157
293
    }
158
159
173M
    T* item_ptr(difference_type pos) { return is_direct() ? direct_ptr(pos) : indirect_ptr(pos); }
prevector<36u, unsigned char, unsigned int, int>::item_ptr(int)
Line
Count
Source
159
153M
    T* item_ptr(difference_type pos) { return is_direct() ? direct_ptr(pos) : indirect_ptr(pos); }
prevector<16u, unsigned char, unsigned int, int>::item_ptr(int)
Line
Count
Source
159
2.19M
    T* item_ptr(difference_type pos) { return is_direct() ? direct_ptr(pos) : indirect_ptr(pos); }
prevector<33u, unsigned char, unsigned int, int>::item_ptr(int)
Line
Count
Source
159
768k
    T* item_ptr(difference_type pos) { return is_direct() ? direct_ptr(pos) : indirect_ptr(pos); }
prevector<8u, int, unsigned int, int>::item_ptr(int)
Line
Count
Source
159
17.1M
    T* item_ptr(difference_type pos) { return is_direct() ? direct_ptr(pos) : indirect_ptr(pos); }
prevector<4u, Network, unsigned int, int>::item_ptr(int)
Line
Count
Source
159
1.06k
    T* item_ptr(difference_type pos) { return is_direct() ? direct_ptr(pos) : indirect_ptr(pos); }
prevector<35u, unsigned char, unsigned int, int>::item_ptr(int)
Line
Count
Source
159
2.34k
    T* item_ptr(difference_type pos) { return is_direct() ? direct_ptr(pos) : indirect_ptr(pos); }
160
1.88G
    const T* item_ptr(difference_type pos) const { return is_direct() ? direct_ptr(pos) : indirect_ptr(pos); }
prevector<36u, unsigned char, unsigned int, int>::item_ptr(int) const
Line
Count
Source
160
1.86G
    const T* item_ptr(difference_type pos) const { return is_direct() ? direct_ptr(pos) : indirect_ptr(pos); }
prevector<16u, unsigned char, unsigned int, int>::item_ptr(int) const
Line
Count
Source
160
17.0M
    const T* item_ptr(difference_type pos) const { return is_direct() ? direct_ptr(pos) : indirect_ptr(pos); }
prevector<8u, int, unsigned int, int>::item_ptr(int) const
Line
Count
Source
160
3.73M
    const T* item_ptr(difference_type pos) const { return is_direct() ? direct_ptr(pos) : indirect_ptr(pos); }
prevector<33u, unsigned char, unsigned int, int>::item_ptr(int) const
Line
Count
Source
160
128k
    const T* item_ptr(difference_type pos) const { return is_direct() ? direct_ptr(pos) : indirect_ptr(pos); }
161
162
1.23M
    void fill(T* dst, ptrdiff_t count, const T& value = T{}) {
163
1.23M
        std::fill_n(dst, count, value);
164
1.23M
    }
prevector<36u, unsigned char, unsigned int, int>::fill(unsigned char*, long, unsigned char const&)
Line
Count
Source
162
601k
    void fill(T* dst, ptrdiff_t count, const T& value = T{}) {
163
601k
        std::fill_n(dst, count, value);
164
601k
    }
prevector<16u, unsigned char, unsigned int, int>::fill(unsigned char*, long, unsigned char const&)
Line
Count
Source
162
357k
    void fill(T* dst, ptrdiff_t count, const T& value = T{}) {
163
357k
        std::fill_n(dst, count, value);
164
357k
    }
prevector<33u, unsigned char, unsigned int, int>::fill(unsigned char*, long, unsigned char const&)
Line
Count
Source
162
256k
    void fill(T* dst, ptrdiff_t count, const T& value = T{}) {
163
256k
        std::fill_n(dst, count, value);
164
256k
    }
prevector<8u, int, unsigned int, int>::fill(int*, long, int const&)
Line
Count
Source
162
23.0k
    void fill(T* dst, ptrdiff_t count, const T& value = T{}) {
163
23.0k
        std::fill_n(dst, count, value);
164
23.0k
    }
165
166
    template <std::input_iterator InputIterator>
167
66.7M
    void fill(T* dst, InputIterator first, InputIterator last) {
168
15.9G
        while (first != last) {
169
15.8G
            new(static_cast<void*>(dst)) T(*first);
170
15.8G
            ++dst;
171
15.8G
            ++first;
172
15.8G
        }
173
66.7M
    }
void prevector<36u, unsigned char, unsigned int, int>::fill<unsigned char const*>(unsigned char*, unsigned char const*, unsigned char const*)
Line
Count
Source
167
393
    void fill(T* dst, InputIterator first, InputIterator last) {
168
1.42k
        while (first != last) {
169
1.02k
            new(static_cast<void*>(dst)) T(*first);
170
1.02k
            ++dst;
171
1.02k
            ++first;
172
1.02k
        }
173
393
    }
void prevector<36u, unsigned char, unsigned int, int>::fill<__gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 18446744073709551615ul>::__iter_tag>>(unsigned char*, __gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 18446744073709551615ul>::__iter_tag>, __gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 18446744073709551615ul>::__iter_tag>)
Line
Count
Source
167
2.81M
    void fill(T* dst, InputIterator first, InputIterator last) {
168
85.1M
        while (first != last) {
169
82.3M
            new(static_cast<void*>(dst)) T(*first);
170
82.3M
            ++dst;
171
82.3M
            ++first;
172
82.3M
        }
173
2.81M
    }
void prevector<16u, unsigned char, unsigned int, int>::fill<prevector<16u, unsigned char, unsigned int, int>::const_iterator>(unsigned char*, prevector<16u, unsigned char, unsigned int, int>::const_iterator, prevector<16u, unsigned char, unsigned int, int>::const_iterator)
Line
Count
Source
167
1.21M
    void fill(T* dst, InputIterator first, InputIterator last) {
168
6.51M
        while (first != last) {
169
5.29M
            new(static_cast<void*>(dst)) T(*first);
170
5.29M
            ++dst;
171
5.29M
            ++first;
172
5.29M
        }
173
1.21M
    }
void prevector<36u, unsigned char, unsigned int, int>::fill<prevector<36u, unsigned char, unsigned int, int>::const_iterator>(unsigned char*, prevector<36u, unsigned char, unsigned int, int>::const_iterator, prevector<36u, unsigned char, unsigned int, int>::const_iterator)
Line
Count
Source
167
61.7M
    void fill(T* dst, InputIterator first, InputIterator last) {
168
15.7G
        while (first != last) {
169
15.6G
            new(static_cast<void*>(dst)) T(*first);
170
15.6G
            ++dst;
171
15.6G
            ++first;
172
15.6G
        }
173
61.7M
    }
void prevector<36u, unsigned char, unsigned int, int>::fill<__gnu_cxx::__normal_iterator<unsigned char const*, std::vector<unsigned char, std::allocator<unsigned char>>>>(unsigned char*, __gnu_cxx::__normal_iterator<unsigned char const*, std::vector<unsigned char, std::allocator<unsigned char>>>, __gnu_cxx::__normal_iterator<unsigned char const*, std::vector<unsigned char, std::allocator<unsigned char>>>)
Line
Count
Source
167
224k
    void fill(T* dst, InputIterator first, InputIterator last) {
168
23.8M
        while (first != last) {
169
23.6M
            new(static_cast<void*>(dst)) T(*first);
170
23.6M
            ++dst;
171
23.6M
            ++first;
172
23.6M
        }
173
224k
    }
void prevector<36u, unsigned char, unsigned int, int>::fill<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char>>>>(unsigned char*, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char>>>, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char>>>)
Line
Count
Source
167
41.3k
    void fill(T* dst, InputIterator first, InputIterator last) {
168
1.74M
        while (first != last) {
169
1.70M
            new(static_cast<void*>(dst)) T(*first);
170
1.70M
            ++dst;
171
1.70M
            ++first;
172
1.70M
        }
173
41.3k
    }
void prevector<33u, unsigned char, unsigned int, int>::fill<unsigned char*>(unsigned char*, unsigned char*, unsigned char*)
Line
Count
Source
167
1
    void fill(T* dst, InputIterator first, InputIterator last) {
168
33
        while (first != last) {
169
32
            new(static_cast<void*>(dst)) T(*first);
170
32
            ++dst;
171
32
            ++first;
172
32
        }
173
1
    }
void prevector<36u, unsigned char, unsigned int, int>::fill<prevector<36u, unsigned char, unsigned int, int>::iterator>(unsigned char*, prevector<36u, unsigned char, unsigned int, int>::iterator, prevector<36u, unsigned char, unsigned int, int>::iterator)
Line
Count
Source
167
23.0k
    void fill(T* dst, InputIterator first, InputIterator last) {
168
37.3M
        while (first != last) {
169
37.3M
            new(static_cast<void*>(dst)) T(*first);
170
37.3M
            ++dst;
171
37.3M
            ++first;
172
37.3M
        }
173
23.0k
    }
void prevector<8u, int, unsigned int, int>::fill<__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int>>>>(int*, __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int>>>, __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int>>>)
Line
Count
Source
167
265k
    void fill(T* dst, InputIterator first, InputIterator last) {
168
2.33M
        while (first != last) {
169
2.07M
            new(static_cast<void*>(dst)) T(*first);
170
2.07M
            ++dst;
171
2.07M
            ++first;
172
2.07M
        }
173
265k
    }
void prevector<8u, int, unsigned int, int>::fill<prevector<8u, int, unsigned int, int>::iterator>(int*, prevector<8u, int, unsigned int, int>::iterator, prevector<8u, int, unsigned int, int>::iterator)
Line
Count
Source
167
265k
    void fill(T* dst, InputIterator first, InputIterator last) {
168
2.33M
        while (first != last) {
169
2.07M
            new(static_cast<void*>(dst)) T(*first);
170
2.07M
            ++dst;
171
2.07M
            ++first;
172
2.07M
        }
173
265k
    }
void prevector<8u, int, unsigned int, int>::fill<int*>(int*, int*, int*)
Line
Count
Source
167
3.99k
    void fill(T* dst, InputIterator first, InputIterator last) {
168
14.0k
        while (first != last) {
169
10.0k
            new(static_cast<void*>(dst)) T(*first);
170
10.0k
            ++dst;
171
10.0k
            ++first;
172
10.0k
        }
173
3.99k
    }
void prevector<8u, int, unsigned int, int>::fill<prevector<8u, int, unsigned int, int>::const_iterator>(int*, prevector<8u, int, unsigned int, int>::const_iterator, prevector<8u, int, unsigned int, int>::const_iterator)
Line
Count
Source
167
8.28k
    void fill(T* dst, InputIterator first, InputIterator last) {
168
55.1k
        while (first != last) {
169
46.8k
            new(static_cast<void*>(dst)) T(*first);
170
46.8k
            ++dst;
171
46.8k
            ++first;
172
46.8k
        }
173
8.28k
    }
void prevector<36u, unsigned char, unsigned int, int>::fill<__gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 4ul>::__iter_tag>>(unsigned char*, __gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 4ul>::__iter_tag>, __gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 4ul>::__iter_tag>)
Line
Count
Source
167
7
    void fill(T* dst, InputIterator first, InputIterator last) {
168
35
        while (first != last) {
169
28
            new(static_cast<void*>(dst)) T(*first);
170
28
            ++dst;
171
28
            ++first;
172
28
        }
173
7
    }
void prevector<36u, unsigned char, unsigned int, int>::fill<__gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 8ul>::__iter_tag>>(unsigned char*, __gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 8ul>::__iter_tag>, __gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 8ul>::__iter_tag>)
Line
Count
Source
167
4
    void fill(T* dst, InputIterator first, InputIterator last) {
168
36
        while (first != last) {
169
32
            new(static_cast<void*>(dst)) T(*first);
170
32
            ++dst;
171
32
            ++first;
172
32
        }
173
4
    }
void prevector<36u, unsigned char, unsigned int, int>::fill<__gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 1ul>::__iter_tag>>(unsigned char*, __gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 1ul>::__iter_tag>, __gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 1ul>::__iter_tag>)
Line
Count
Source
167
6
    void fill(T* dst, InputIterator first, InputIterator last) {
168
12
        while (first != last) {
169
6
            new(static_cast<void*>(dst)) T(*first);
170
6
            ++dst;
171
6
            ++first;
172
6
        }
173
6
    }
void prevector<36u, unsigned char, unsigned int, int>::fill<__gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 5ul>::__iter_tag>>(unsigned char*, __gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 5ul>::__iter_tag>, __gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 5ul>::__iter_tag>)
Line
Count
Source
167
2
    void fill(T* dst, InputIterator first, InputIterator last) {
168
12
        while (first != last) {
169
10
            new(static_cast<void*>(dst)) T(*first);
170
10
            ++dst;
171
10
            ++first;
172
10
        }
173
2
    }
void prevector<36u, unsigned char, unsigned int, int>::fill<__gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 3ul>::__iter_tag>>(unsigned char*, __gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 3ul>::__iter_tag>, __gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 3ul>::__iter_tag>)
Line
Count
Source
167
7
    void fill(T* dst, InputIterator first, InputIterator last) {
168
28
        while (first != last) {
169
21
            new(static_cast<void*>(dst)) T(*first);
170
21
            ++dst;
171
21
            ++first;
172
21
        }
173
7
    }
void prevector<36u, unsigned char, unsigned int, int>::fill<__gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 7ul>::__iter_tag>>(unsigned char*, __gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 7ul>::__iter_tag>, __gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 7ul>::__iter_tag>)
Line
Count
Source
167
2
    void fill(T* dst, InputIterator first, InputIterator last) {
168
16
        while (first != last) {
169
14
            new(static_cast<void*>(dst)) T(*first);
170
14
            ++dst;
171
14
            ++first;
172
14
        }
173
2
    }
void prevector<36u, unsigned char, unsigned int, int>::fill<__gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 25ul>::__iter_tag>>(unsigned char*, __gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 25ul>::__iter_tag>, __gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 25ul>::__iter_tag>)
Line
Count
Source
167
2
    void fill(T* dst, InputIterator first, InputIterator last) {
168
52
        while (first != last) {
169
50
            new(static_cast<void*>(dst)) T(*first);
170
50
            ++dst;
171
50
            ++first;
172
50
        }
173
2
    }
void prevector<16u, unsigned char, unsigned int, int>::fill<__gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 18446744073709551615ul>::__iter_tag>>(unsigned char*, __gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 18446744073709551615ul>::__iter_tag>, __gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 18446744073709551615ul>::__iter_tag>)
Line
Count
Source
167
10.3k
    void fill(T* dst, InputIterator first, InputIterator last) {
168
96.3k
        while (first != last) {
169
85.9k
            new(static_cast<void*>(dst)) T(*first);
170
85.9k
            ++dst;
171
85.9k
            ++first;
172
85.9k
        }
173
10.3k
    }
void prevector<16u, unsigned char, unsigned int, int>::fill<unsigned char*>(unsigned char*, unsigned char*, unsigned char*)
Line
Count
Source
167
10
    void fill(T* dst, InputIterator first, InputIterator last) {
168
110
        while (first != last) {
169
100
            new(static_cast<void*>(dst)) T(*first);
170
100
            ++dst;
171
100
            ++first;
172
100
        }
173
10
    }
void prevector<16u, unsigned char, unsigned int, int>::fill<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char>>>>(unsigned char*, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char>>>, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char>>>)
Line
Count
Source
167
41
    void fill(T* dst, InputIterator first, InputIterator last) {
168
1.35k
        while (first != last) {
169
1.31k
            new(static_cast<void*>(dst)) T(*first);
170
1.31k
            ++dst;
171
1.31k
            ++first;
172
1.31k
        }
173
41
    }
void prevector<16u, unsigned char, unsigned int, int>::fill<unsigned char const*>(unsigned char*, unsigned char const*, unsigned char const*)
Line
Count
Source
167
61.4k
    void fill(T* dst, InputIterator first, InputIterator last) {
168
307k
        while (first != last) {
169
245k
            new(static_cast<void*>(dst)) T(*first);
170
245k
            ++dst;
171
245k
            ++first;
172
245k
        }
173
61.4k
    }
void prevector<35u, unsigned char, unsigned int, int>::fill<__gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 18446744073709551615ul>::__iter_tag>>(unsigned char*, __gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 18446744073709551615ul>::__iter_tag>, __gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 18446744073709551615ul>::__iter_tag>)
Line
Count
Source
167
293
    void fill(T* dst, InputIterator first, InputIterator last) {
168
9.66k
        while (first != last) {
169
9.37k
            new(static_cast<void*>(dst)) T(*first);
170
9.37k
            ++dst;
171
9.37k
            ++first;
172
9.37k
        }
173
293
    }
void prevector<35u, unsigned char, unsigned int, int>::fill<unsigned char*>(unsigned char*, unsigned char*, unsigned char*)
Line
Count
Source
167
293
    void fill(T* dst, InputIterator first, InputIterator last) {
168
879
        while (first != last) {
169
586
            new(static_cast<void*>(dst)) T(*first);
170
586
            ++dst;
171
586
            ++first;
172
586
        }
173
293
    }
void prevector<35u, unsigned char, unsigned int, int>::fill<unsigned char const*>(unsigned char*, unsigned char const*, unsigned char const*)
Line
Count
Source
167
293
    void fill(T* dst, InputIterator first, InputIterator last) {
168
586
        while (first != last) {
169
293
            new(static_cast<void*>(dst)) T(*first);
170
293
            ++dst;
171
293
            ++first;
172
293
        }
173
293
    }
174
175
public:
176
144k
    void assign(size_type n, const T& val) {
177
144k
        clear();
178
144k
        if (capacity() < n) {
179
94.6k
            change_capacity(n);
180
94.6k
        }
181
144k
        _size += n;
182
144k
        fill(item_ptr(0), n, val);
183
144k
    }
prevector<36u, unsigned char, unsigned int, int>::assign(unsigned int, unsigned char const&)
Line
Count
Source
176
144k
    void assign(size_type n, const T& val) {
177
144k
        clear();
178
144k
        if (capacity() < n) {
179
94.5k
            change_capacity(n);
180
94.5k
        }
181
144k
        _size += n;
182
144k
        fill(item_ptr(0), n, val);
183
144k
    }
prevector<16u, unsigned char, unsigned int, int>::assign(unsigned int, unsigned char const&)
Line
Count
Source
176
6
    void assign(size_type n, const T& val) {
177
6
        clear();
178
6
        if (capacity() < n) {
179
0
            change_capacity(n);
180
0
        }
181
6
        _size += n;
182
6
        fill(item_ptr(0), n, val);
183
6
    }
prevector<8u, int, unsigned int, int>::assign(unsigned int, int const&)
Line
Count
Source
176
249
    void assign(size_type n, const T& val) {
177
249
        clear();
178
249
        if (capacity() < n) {
179
98
            change_capacity(n);
180
98
        }
181
249
        _size += n;
182
249
        fill(item_ptr(0), n, val);
183
249
    }
184
185
    template <std::input_iterator InputIterator>
186
2.31M
    void assign(InputIterator first, InputIterator last) {
187
2.31M
        size_type n = last - first;
188
2.31M
        clear();
189
2.31M
        if (capacity() < n) {
190
123k
            change_capacity(n);
191
123k
        }
192
2.31M
        _size += n;
193
2.31M
        fill(item_ptr(0), first, last);
194
2.31M
    }
void prevector<16u, unsigned char, unsigned int, int>::assign<prevector<16u, unsigned char, unsigned int, int>::const_iterator>(prevector<16u, unsigned char, unsigned int, int>::const_iterator, prevector<16u, unsigned char, unsigned int, int>::const_iterator)
Line
Count
Source
186
51.7k
    void assign(InputIterator first, InputIterator last) {
187
51.7k
        size_type n = last - first;
188
51.7k
        clear();
189
51.7k
        if (capacity() < n) {
190
60
            change_capacity(n);
191
60
        }
192
51.7k
        _size += n;
193
51.7k
        fill(item_ptr(0), first, last);
194
51.7k
    }
void prevector<36u, unsigned char, unsigned int, int>::assign<prevector<36u, unsigned char, unsigned int, int>::const_iterator>(prevector<36u, unsigned char, unsigned int, int>::const_iterator, prevector<36u, unsigned char, unsigned int, int>::const_iterator)
Line
Count
Source
186
2.18M
    void assign(InputIterator first, InputIterator last) {
187
2.18M
        size_type n = last - first;
188
2.18M
        clear();
189
2.18M
        if (capacity() < n) {
190
123k
            change_capacity(n);
191
123k
        }
192
2.18M
        _size += n;
193
2.18M
        fill(item_ptr(0), first, last);
194
2.18M
    }
void prevector<8u, int, unsigned int, int>::assign<prevector<8u, int, unsigned int, int>::const_iterator>(prevector<8u, int, unsigned int, int>::const_iterator, prevector<8u, int, unsigned int, int>::const_iterator)
Line
Count
Source
186
8.28k
    void assign(InputIterator first, InputIterator last) {
187
8.28k
        size_type n = last - first;
188
8.28k
        clear();
189
8.28k
        if (capacity() < n) {
190
617
            change_capacity(n);
191
617
        }
192
8.28k
        _size += n;
193
8.28k
        fill(item_ptr(0), first, last);
194
8.28k
    }
void prevector<16u, unsigned char, unsigned int, int>::assign<__gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 18446744073709551615ul>::__iter_tag>>(__gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 18446744073709551615ul>::__iter_tag>, __gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 18446744073709551615ul>::__iter_tag>)
Line
Count
Source
186
10.3k
    void assign(InputIterator first, InputIterator last) {
187
10.3k
        size_type n = last - first;
188
10.3k
        clear();
189
10.3k
        if (capacity() < n) {
190
85
            change_capacity(n);
191
85
        }
192
10.3k
        _size += n;
193
10.3k
        fill(item_ptr(0), first, last);
194
10.3k
    }
void prevector<16u, unsigned char, unsigned int, int>::assign<unsigned char*>(unsigned char*, unsigned char*)
Line
Count
Source
186
10
    void assign(InputIterator first, InputIterator last) {
187
10
        size_type n = last - first;
188
10
        clear();
189
10
        if (capacity() < n) {
190
0
            change_capacity(n);
191
0
        }
192
10
        _size += n;
193
10
        fill(item_ptr(0), first, last);
194
10
    }
void prevector<16u, unsigned char, unsigned int, int>::assign<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char>>>>(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char>>>, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char>>>)
Line
Count
Source
186
41
    void assign(InputIterator first, InputIterator last) {
187
41
        size_type n = last - first;
188
41
        clear();
189
41
        if (capacity() < n) {
190
40
            change_capacity(n);
191
40
        }
192
41
        _size += n;
193
41
        fill(item_ptr(0), first, last);
194
41
    }
void prevector<16u, unsigned char, unsigned int, int>::assign<unsigned char const*>(unsigned char const*, unsigned char const*)
Line
Count
Source
186
61.4k
    void assign(InputIterator first, InputIterator last) {
187
61.4k
        size_type n = last - first;
188
61.4k
        clear();
189
61.4k
        if (capacity() < n) {
190
0
            change_capacity(n);
191
0
        }
192
61.4k
        _size += n;
193
61.4k
        fill(item_ptr(0), first, last);
194
61.4k
    }
195
196
96.5M
    prevector() = default;
prevector<36u, unsigned char, unsigned int, int>::prevector()
Line
Count
Source
196
96.0M
    prevector() = default;
prevector<33u, unsigned char, unsigned int, int>::prevector()
Line
Count
Source
196
509k
    prevector() = default;
prevector<8u, int, unsigned int, int>::prevector()
Line
Count
Source
196
128
    prevector() = default;
prevector<4u, Network, unsigned int, int>::prevector()
Line
Count
Source
196
365
    prevector() = default;
197
198
    explicit prevector(size_type n) {
199
        resize(n);
200
    }
201
202
485k
    explicit prevector(size_type n, const T& val) {
203
485k
        change_capacity(n);
204
485k
        _size += n;
205
485k
        fill(item_ptr(0), n, val);
206
485k
    }
prevector<33u, unsigned char, unsigned int, int>::prevector(unsigned int, unsigned char const&)
Line
Count
Source
202
128k
    explicit prevector(size_type n, const T& val) {
203
128k
        change_capacity(n);
204
128k
        _size += n;
205
128k
        fill(item_ptr(0), n, val);
206
128k
    }
prevector<16u, unsigned char, unsigned int, int>::prevector(unsigned int, unsigned char const&)
Line
Count
Source
202
357k
    explicit prevector(size_type n, const T& val) {
203
357k
        change_capacity(n);
204
357k
        _size += n;
205
357k
        fill(item_ptr(0), n, val);
206
357k
    }
207
208
    template <std::input_iterator InputIterator>
209
1.18M
    prevector(InputIterator first, InputIterator last) {
210
1.18M
        size_type n = last - first;
211
1.18M
        change_capacity(n);
212
1.18M
        _size += n;
213
1.18M
        fill(item_ptr(0), first, last);
214
1.18M
    }
prevector<36u, unsigned char, unsigned int, int>::prevector<__gnu_cxx::__normal_iterator<unsigned char const*, std::vector<unsigned char, std::allocator<unsigned char>>>>(__gnu_cxx::__normal_iterator<unsigned char const*, std::vector<unsigned char, std::allocator<unsigned char>>>, __gnu_cxx::__normal_iterator<unsigned char const*, std::vector<unsigned char, std::allocator<unsigned char>>>)
Line
Count
Source
209
224k
    prevector(InputIterator first, InputIterator last) {
210
224k
        size_type n = last - first;
211
224k
        change_capacity(n);
212
224k
        _size += n;
213
224k
        fill(item_ptr(0), first, last);
214
224k
    }
prevector<36u, unsigned char, unsigned int, int>::prevector<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char>>>>(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char>>>, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char>>>)
Line
Count
Source
209
38.5k
    prevector(InputIterator first, InputIterator last) {
210
38.5k
        size_type n = last - first;
211
38.5k
        change_capacity(n);
212
38.5k
        _size += n;
213
38.5k
        fill(item_ptr(0), first, last);
214
38.5k
    }
prevector<33u, unsigned char, unsigned int, int>::prevector<unsigned char*>(unsigned char*, unsigned char*)
Line
Count
Source
209
1
    prevector(InputIterator first, InputIterator last) {
210
1
        size_type n = last - first;
211
1
        change_capacity(n);
212
1
        _size += n;
213
1
        fill(item_ptr(0), first, last);
214
1
    }
prevector<36u, unsigned char, unsigned int, int>::prevector<unsigned char const*>(unsigned char const*, unsigned char const*)
Line
Count
Source
209
13
    prevector(InputIterator first, InputIterator last) {
210
13
        size_type n = last - first;
211
13
        change_capacity(n);
212
13
        _size += n;
213
13
        fill(item_ptr(0), first, last);
214
13
    }
prevector<8u, int, unsigned int, int>::prevector<__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int>>>>(__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int>>>, __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int>>>)
Line
Count
Source
209
265k
    prevector(InputIterator first, InputIterator last) {
210
265k
        size_type n = last - first;
211
265k
        change_capacity(n);
212
265k
        _size += n;
213
265k
        fill(item_ptr(0), first, last);
214
265k
    }
prevector<8u, int, unsigned int, int>::prevector<prevector<8u, int, unsigned int, int>::iterator>(prevector<8u, int, unsigned int, int>::iterator, prevector<8u, int, unsigned int, int>::iterator)
Line
Count
Source
209
265k
    prevector(InputIterator first, InputIterator last) {
210
265k
        size_type n = last - first;
211
265k
        change_capacity(n);
212
265k
        _size += n;
213
265k
        fill(item_ptr(0), first, last);
214
265k
    }
prevector<36u, unsigned char, unsigned int, int>::prevector<__gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 18446744073709551615ul>::__iter_tag>>(__gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 18446744073709551615ul>::__iter_tag>, __gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 18446744073709551615ul>::__iter_tag>)
Line
Count
Source
209
8.22k
    prevector(InputIterator first, InputIterator last) {
210
8.22k
        size_type n = last - first;
211
8.22k
        change_capacity(n);
212
8.22k
        _size += n;
213
8.22k
        fill(item_ptr(0), first, last);
214
8.22k
    }
prevector<36u, unsigned char, unsigned int, int>::prevector<__gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 4ul>::__iter_tag>>(__gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 4ul>::__iter_tag>, __gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 4ul>::__iter_tag>)
Line
Count
Source
209
7
    prevector(InputIterator first, InputIterator last) {
210
7
        size_type n = last - first;
211
7
        change_capacity(n);
212
7
        _size += n;
213
7
        fill(item_ptr(0), first, last);
214
7
    }
prevector<36u, unsigned char, unsigned int, int>::prevector<__gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 8ul>::__iter_tag>>(__gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 8ul>::__iter_tag>, __gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 8ul>::__iter_tag>)
Line
Count
Source
209
4
    prevector(InputIterator first, InputIterator last) {
210
4
        size_type n = last - first;
211
4
        change_capacity(n);
212
4
        _size += n;
213
4
        fill(item_ptr(0), first, last);
214
4
    }
prevector<36u, unsigned char, unsigned int, int>::prevector<__gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 1ul>::__iter_tag>>(__gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 1ul>::__iter_tag>, __gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 1ul>::__iter_tag>)
Line
Count
Source
209
6
    prevector(InputIterator first, InputIterator last) {
210
6
        size_type n = last - first;
211
6
        change_capacity(n);
212
6
        _size += n;
213
6
        fill(item_ptr(0), first, last);
214
6
    }
prevector<36u, unsigned char, unsigned int, int>::prevector<__gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 5ul>::__iter_tag>>(__gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 5ul>::__iter_tag>, __gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 5ul>::__iter_tag>)
Line
Count
Source
209
2
    prevector(InputIterator first, InputIterator last) {
210
2
        size_type n = last - first;
211
2
        change_capacity(n);
212
2
        _size += n;
213
2
        fill(item_ptr(0), first, last);
214
2
    }
prevector<36u, unsigned char, unsigned int, int>::prevector<__gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 3ul>::__iter_tag>>(__gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 3ul>::__iter_tag>, __gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 3ul>::__iter_tag>)
Line
Count
Source
209
7
    prevector(InputIterator first, InputIterator last) {
210
7
        size_type n = last - first;
211
7
        change_capacity(n);
212
7
        _size += n;
213
7
        fill(item_ptr(0), first, last);
214
7
    }
prevector<36u, unsigned char, unsigned int, int>::prevector<__gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 7ul>::__iter_tag>>(__gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 7ul>::__iter_tag>, __gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 7ul>::__iter_tag>)
Line
Count
Source
209
2
    prevector(InputIterator first, InputIterator last) {
210
2
        size_type n = last - first;
211
2
        change_capacity(n);
212
2
        _size += n;
213
2
        fill(item_ptr(0), first, last);
214
2
    }
prevector<36u, unsigned char, unsigned int, int>::prevector<__gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 25ul>::__iter_tag>>(__gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 25ul>::__iter_tag>, __gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 25ul>::__iter_tag>)
Line
Count
Source
209
2
    prevector(InputIterator first, InputIterator last) {
210
2
        size_type n = last - first;
211
2
        change_capacity(n);
212
2
        _size += n;
213
2
        fill(item_ptr(0), first, last);
214
2
    }
prevector<36u, unsigned char, unsigned int, int>::prevector<prevector<36u, unsigned char, unsigned int, int>::const_iterator>(prevector<36u, unsigned char, unsigned int, int>::const_iterator, prevector<36u, unsigned char, unsigned int, int>::const_iterator)
Line
Count
Source
209
378k
    prevector(InputIterator first, InputIterator last) {
210
378k
        size_type n = last - first;
211
378k
        change_capacity(n);
212
378k
        _size += n;
213
378k
        fill(item_ptr(0), first, last);
214
378k
    }
prevector<35u, unsigned char, unsigned int, int>::prevector<__gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 18446744073709551615ul>::__iter_tag>>(__gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 18446744073709551615ul>::__iter_tag>, __gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 18446744073709551615ul>::__iter_tag>)
Line
Count
Source
209
293
    prevector(InputIterator first, InputIterator last) {
210
293
        size_type n = last - first;
211
293
        change_capacity(n);
212
293
        _size += n;
213
293
        fill(item_ptr(0), first, last);
214
293
    }
215
216
57.5M
    prevector(const prevector<N, T, Size, Diff>& other) {
217
57.5M
        size_type n = other.size();
218
57.5M
        change_capacity(n);
219
57.5M
        _size += n;
220
57.5M
        fill(item_ptr(0), other.begin(),  other.end());
221
57.5M
    }
prevector<16u, unsigned char, unsigned int, int>::prevector(prevector<16u, unsigned char, unsigned int, int> const&)
Line
Count
Source
216
1.16M
    prevector(const prevector<N, T, Size, Diff>& other) {
217
1.16M
        size_type n = other.size();
218
1.16M
        change_capacity(n);
219
1.16M
        _size += n;
220
1.16M
        fill(item_ptr(0), other.begin(),  other.end());
221
1.16M
    }
prevector<36u, unsigned char, unsigned int, int>::prevector(prevector<36u, unsigned char, unsigned int, int> const&)
Line
Count
Source
216
56.4M
    prevector(const prevector<N, T, Size, Diff>& other) {
217
56.4M
        size_type n = other.size();
218
56.4M
        change_capacity(n);
219
56.4M
        _size += n;
220
56.4M
        fill(item_ptr(0), other.begin(),  other.end());
221
56.4M
    }
222
223
    prevector(prevector<N, T, Size, Diff>&& other) noexcept
224
16.4M
        : _union(std::move(other._union)), _size(other._size)
225
16.4M
    {
226
16.4M
        other._size = 0;
227
16.4M
    }
prevector<16u, unsigned char, unsigned int, int>::prevector(prevector<16u, unsigned char, unsigned int, int>&&)
Line
Count
Source
224
29.6k
        : _union(std::move(other._union)), _size(other._size)
225
29.6k
    {
226
29.6k
        other._size = 0;
227
29.6k
    }
prevector<36u, unsigned char, unsigned int, int>::prevector(prevector<36u, unsigned char, unsigned int, int>&&)
Line
Count
Source
224
16.3M
        : _union(std::move(other._union)), _size(other._size)
225
16.3M
    {
226
16.3M
        other._size = 0;
227
16.3M
    }
228
229
2.25M
    prevector& operator=(const prevector<N, T, Size, Diff>& other) {
230
2.25M
        if (&other == this) {
231
12.9k
            return *this;
232
12.9k
        }
233
2.24M
        assign(other.begin(), other.end());
234
2.24M
        return *this;
235
2.25M
    }
prevector<16u, unsigned char, unsigned int, int>::operator=(prevector<16u, unsigned char, unsigned int, int> const&)
Line
Count
Source
229
51.7k
    prevector& operator=(const prevector<N, T, Size, Diff>& other) {
230
51.7k
        if (&other == this) {
231
2
            return *this;
232
2
        }
233
51.7k
        assign(other.begin(), other.end());
234
51.7k
        return *this;
235
51.7k
    }
prevector<36u, unsigned char, unsigned int, int>::operator=(prevector<36u, unsigned char, unsigned int, int> const&)
Line
Count
Source
229
2.19M
    prevector& operator=(const prevector<N, T, Size, Diff>& other) {
230
2.19M
        if (&other == this) {
231
12.9k
            return *this;
232
12.9k
        }
233
2.18M
        assign(other.begin(), other.end());
234
2.18M
        return *this;
235
2.19M
    }
prevector<8u, int, unsigned int, int>::operator=(prevector<8u, int, unsigned int, int> const&)
Line
Count
Source
229
8.28k
    prevector& operator=(const prevector<N, T, Size, Diff>& other) {
230
8.28k
        if (&other == this) {
231
0
            return *this;
232
0
        }
233
8.28k
        assign(other.begin(), other.end());
234
8.28k
        return *this;
235
8.28k
    }
236
237
41.7M
    prevector& operator=(prevector<N, T, Size, Diff>&& other) noexcept {
238
41.7M
        if (!is_direct()) {
239
25.6k
            free(_union.indirect_contents.indirect);
240
25.6k
        }
241
41.7M
        _union = std::move(other._union);
242
41.7M
        _size = other._size;
243
41.7M
        other._size = 0;
244
41.7M
        return *this;
245
41.7M
    }
prevector<16u, unsigned char, unsigned int, int>::operator=(prevector<16u, unsigned char, unsigned int, int>&&)
Line
Count
Source
237
92.4k
    prevector& operator=(prevector<N, T, Size, Diff>&& other) noexcept {
238
92.4k
        if (!is_direct()) {
239
8
            free(_union.indirect_contents.indirect);
240
8
        }
241
92.4k
        _union = std::move(other._union);
242
92.4k
        _size = other._size;
243
92.4k
        other._size = 0;
244
92.4k
        return *this;
245
92.4k
    }
prevector<36u, unsigned char, unsigned int, int>::operator=(prevector<36u, unsigned char, unsigned int, int>&&)
Line
Count
Source
237
41.6M
    prevector& operator=(prevector<N, T, Size, Diff>&& other) noexcept {
238
41.6M
        if (!is_direct()) {
239
23.0k
            free(_union.indirect_contents.indirect);
240
23.0k
        }
241
41.6M
        _union = std::move(other._union);
242
41.6M
        _size = other._size;
243
41.6M
        other._size = 0;
244
41.6M
        return *this;
245
41.6M
    }
prevector<8u, int, unsigned int, int>::operator=(prevector<8u, int, unsigned int, int>&&)
Line
Count
Source
237
4.14k
    prevector& operator=(prevector<N, T, Size, Diff>&& other) noexcept {
238
4.14k
        if (!is_direct()) {
239
2.57k
            free(_union.indirect_contents.indirect);
240
2.57k
        }
241
4.14k
        _union = std::move(other._union);
242
4.14k
        _size = other._size;
243
4.14k
        other._size = 0;
244
4.14k
        return *this;
245
4.14k
    }
246
247
2.28G
    size_type size() const {
248
2.28G
        return is_direct() ? _size : _size - N - 1;
249
2.28G
    }
prevector<36u, unsigned char, unsigned int, int>::size() const
Line
Count
Source
247
2.26G
    size_type size() const {
248
2.26G
        return is_direct() ? _size : _size - N - 1;
249
2.26G
    }
prevector<16u, unsigned char, unsigned int, int>::size() const
Line
Count
Source
247
9.60M
    size_type size() const {
248
9.60M
        return is_direct() ? _size : _size - N - 1;
249
9.60M
    }
prevector<33u, unsigned char, unsigned int, int>::size() const
Line
Count
Source
247
384k
    size_type size() const {
248
384k
        return is_direct() ? _size : _size - N - 1;
249
384k
    }
prevector<8u, int, unsigned int, int>::size() const
Line
Count
Source
247
7.08M
    size_type size() const {
248
7.08M
        return is_direct() ? _size : _size - N - 1;
249
7.08M
    }
prevector<4u, Network, unsigned int, int>::size() const
Line
Count
Source
247
2.13k
    size_type size() const {
248
2.13k
        return is_direct() ? _size : _size - N - 1;
249
2.13k
    }
prevector<35u, unsigned char, unsigned int, int>::size() const
Line
Count
Source
247
2.05k
    size_type size() const {
248
2.05k
        return is_direct() ? _size : _size - N - 1;
249
2.05k
    }
250
251
35.7M
    bool empty() const {
252
35.7M
        return size() == 0;
253
35.7M
    }
prevector<36u, unsigned char, unsigned int, int>::empty() const
Line
Count
Source
251
35.3M
    bool empty() const {
252
35.3M
        return size() == 0;
253
35.3M
    }
prevector<16u, unsigned char, unsigned int, int>::empty() const
Line
Count
Source
251
100k
    bool empty() const {
252
100k
        return size() == 0;
253
100k
    }
prevector<8u, int, unsigned int, int>::empty() const
Line
Count
Source
251
265k
    bool empty() const {
252
265k
        return size() == 0;
253
265k
    }
prevector<4u, Network, unsigned int, int>::empty() const
Line
Count
Source
251
365
    bool empty() const {
252
365
        return size() == 0;
253
365
    }
254
255
21.0M
    iterator begin() { return iterator(item_ptr(0)); }
prevector<36u, unsigned char, unsigned int, int>::begin()
Line
Count
Source
255
15.9M
    iterator begin() { return iterator(item_ptr(0)); }
Unexecuted instantiation: prevector<16u, unsigned char, unsigned int, int>::begin()
Unexecuted instantiation: prevector<33u, unsigned char, unsigned int, int>::begin()
prevector<8u, int, unsigned int, int>::begin()
Line
Count
Source
255
5.11M
    iterator begin() { return iterator(item_ptr(0)); }
prevector<35u, unsigned char, unsigned int, int>::begin()
Line
Count
Source
255
586
    iterator begin() { return iterator(item_ptr(0)); }
256
158M
    const_iterator begin() const { return const_iterator(item_ptr(0)); }
prevector<36u, unsigned char, unsigned int, int>::begin() const
Line
Count
Source
256
150M
    const_iterator begin() const { return const_iterator(item_ptr(0)); }
prevector<16u, unsigned char, unsigned int, int>::begin() const
Line
Count
Source
256
5.79M
    const_iterator begin() const { return const_iterator(item_ptr(0)); }
prevector<8u, int, unsigned int, int>::begin() const
Line
Count
Source
256
1.86M
    const_iterator begin() const { return const_iterator(item_ptr(0)); }
257
48.2M
    iterator end() { return iterator(item_ptr(size())); }
prevector<36u, unsigned char, unsigned int, int>::end()
Line
Count
Source
257
44.9M
    iterator end() { return iterator(item_ptr(size())); }
prevector<16u, unsigned char, unsigned int, int>::end()
Line
Count
Source
257
330k
    iterator end() { return iterator(item_ptr(size())); }
Unexecuted instantiation: prevector<33u, unsigned char, unsigned int, int>::end()
prevector<8u, int, unsigned int, int>::end()
Line
Count
Source
257
2.96M
    iterator end() { return iterator(item_ptr(size())); }
prevector<35u, unsigned char, unsigned int, int>::end()
Line
Count
Source
257
586
    iterator end() { return iterator(item_ptr(size())); }
258
1.67G
    const_iterator end() const { return const_iterator(item_ptr(size())); }
prevector<36u, unsigned char, unsigned int, int>::end() const
Line
Count
Source
258
1.67G
    const_iterator end() const { return const_iterator(item_ptr(size())); }
prevector<16u, unsigned char, unsigned int, int>::end() const
Line
Count
Source
258
1.68M
    const_iterator end() const { return const_iterator(item_ptr(size())); }
prevector<8u, int, unsigned int, int>::end() const
Line
Count
Source
258
1.86M
    const_iterator end() const { return const_iterator(item_ptr(size())); }
259
260
19.5M
    size_t capacity() const {
261
19.5M
        if (is_direct()) {
262
13.6M
            return N;
263
13.6M
        } else {
264
5.88M
            return _union.indirect_contents.capacity;
265
5.88M
        }
266
19.5M
    }
prevector<36u, unsigned char, unsigned int, int>::capacity() const
Line
Count
Source
260
19.1M
    size_t capacity() const {
261
19.1M
        if (is_direct()) {
262
13.3M
            return N;
263
13.3M
        } else {
264
5.82M
            return _union.indirect_contents.capacity;
265
5.82M
        }
266
19.1M
    }
prevector<16u, unsigned char, unsigned int, int>::capacity() const
Line
Count
Source
260
123k
    size_t capacity() const {
261
123k
        if (is_direct()) {
262
123k
            return N;
263
123k
        } else {
264
10
            return _union.indirect_contents.capacity;
265
10
        }
266
123k
    }
prevector<8u, int, unsigned int, int>::capacity() const
Line
Count
Source
260
92.7k
    size_t capacity() const {
261
92.7k
        if (is_direct()) {
262
34.1k
            return N;
263
58.6k
        } else {
264
58.6k
            return _union.indirect_contents.capacity;
265
58.6k
        }
266
92.7k
    }
prevector<4u, Network, unsigned int, int>::capacity() const
Line
Count
Source
260
700
    size_t capacity() const {
261
700
        if (is_direct()) {
262
700
            return N;
263
700
        } else {
264
0
            return _union.indirect_contents.capacity;
265
0
        }
266
700
    }
prevector<33u, unsigned char, unsigned int, int>::capacity() const
Line
Count
Source
260
128k
    size_t capacity() const {
261
128k
        if (is_direct()) {
262
128k
            return N;
263
128k
        } else {
264
0
            return _union.indirect_contents.capacity;
265
0
        }
266
128k
    }
prevector<35u, unsigned char, unsigned int, int>::capacity() const
Line
Count
Source
260
586
    size_t capacity() const {
261
586
        if (is_direct()) {
262
586
            return N;
263
586
        } else {
264
0
            return _union.indirect_contents.capacity;
265
0
        }
266
586
    }
267
268
10.8M
    T& operator[](size_type pos) {
269
10.8M
        return *item_ptr(pos);
270
10.8M
    }
prevector<36u, unsigned char, unsigned int, int>::operator[](unsigned int)
Line
Count
Source
268
2.20M
    T& operator[](size_type pos) {
269
2.20M
        return *item_ptr(pos);
270
2.20M
    }
prevector<33u, unsigned char, unsigned int, int>::operator[](unsigned int)
Line
Count
Source
268
256k
    T& operator[](size_type pos) {
269
256k
        return *item_ptr(pos);
270
256k
    }
prevector<8u, int, unsigned int, int>::operator[](unsigned int)
Line
Count
Source
268
8.42M
    T& operator[](size_type pos) {
269
8.42M
        return *item_ptr(pos);
270
8.42M
    }
prevector<4u, Network, unsigned int, int>::operator[](unsigned int)
Line
Count
Source
268
365
    T& operator[](size_type pos) {
269
365
        return *item_ptr(pos);
270
365
    }
prevector<16u, unsigned char, unsigned int, int>::operator[](unsigned int)
Line
Count
Source
268
5.46k
    T& operator[](size_type pos) {
269
5.46k
        return *item_ptr(pos);
270
5.46k
    }
271
272
18.7M
    const T& operator[](size_type pos) const {
273
18.7M
        return *item_ptr(pos);
274
18.7M
    }
prevector<16u, unsigned char, unsigned int, int>::operator[](unsigned int) const
Line
Count
Source
272
7.27M
    const T& operator[](size_type pos) const {
273
7.27M
        return *item_ptr(pos);
274
7.27M
    }
prevector<36u, unsigned char, unsigned int, int>::operator[](unsigned int) const
Line
Count
Source
272
11.4M
    const T& operator[](size_type pos) const {
273
11.4M
        return *item_ptr(pos);
274
11.4M
    }
275
276
98.4M
    void resize(size_type new_size) {
277
98.4M
        size_type cur_size = size();
278
98.4M
        if (cur_size == new_size) {
279
83.0M
            return;
280
83.0M
        }
281
15.3M
        if (cur_size > new_size) {
282
14.8M
            erase(item_ptr(new_size), end());
283
14.8M
            return;
284
14.8M
        }
285
592k
        if (new_size > capacity()) {
286
84.1k
            change_capacity(new_size);
287
84.1k
        }
288
592k
        ptrdiff_t increase = new_size - cur_size;
289
592k
        fill(item_ptr(cur_size), increase);
290
592k
        _size += increase;
291
592k
    }
prevector<36u, unsigned char, unsigned int, int>::resize(unsigned int)
Line
Count
Source
276
98.1M
    void resize(size_type new_size) {
277
98.1M
        size_type cur_size = size();
278
98.1M
        if (cur_size == new_size) {
279
83.0M
            return;
280
83.0M
        }
281
15.0M
        if (cur_size > new_size) {
282
14.6M
            erase(item_ptr(new_size), end());
283
14.6M
            return;
284
14.6M
        }
285
457k
        if (new_size > capacity()) {
286
83.5k
            change_capacity(new_size);
287
83.5k
        }
288
457k
        ptrdiff_t increase = new_size - cur_size;
289
457k
        fill(item_ptr(cur_size), increase);
290
457k
        _size += increase;
291
457k
    }
prevector<16u, unsigned char, unsigned int, int>::resize(unsigned int)
Line
Count
Source
276
165k
    void resize(size_type new_size) {
277
165k
        size_type cur_size = size();
278
165k
        if (cur_size == new_size) {
279
101
            return;
280
101
        }
281
165k
        if (cur_size > new_size) {
282
165k
            erase(item_ptr(new_size), end());
283
165k
            return;
284
165k
        }
285
286
        if (new_size > capacity()) {
286
285
            change_capacity(new_size);
287
285
        }
288
286
        ptrdiff_t increase = new_size - cur_size;
289
286
        fill(item_ptr(cur_size), increase);
290
286
        _size += increase;
291
286
    }
prevector<8u, int, unsigned int, int>::resize(unsigned int)
Line
Count
Source
276
29.3k
    void resize(size_type new_size) {
277
29.3k
        size_type cur_size = size();
278
29.3k
        if (cur_size == new_size) {
279
10.4k
            return;
280
10.4k
        }
281
18.8k
        if (cur_size > new_size) {
282
12.3k
            erase(item_ptr(new_size), end());
283
12.3k
            return;
284
12.3k
        }
285
6.56k
        if (new_size > capacity()) {
286
294
            change_capacity(new_size);
287
294
        }
288
6.56k
        ptrdiff_t increase = new_size - cur_size;
289
6.56k
        fill(item_ptr(cur_size), increase);
290
6.56k
        _size += increase;
291
6.56k
    }
prevector<33u, unsigned char, unsigned int, int>::resize(unsigned int)
Line
Count
Source
276
128k
    void resize(size_type new_size) {
277
128k
        size_type cur_size = size();
278
128k
        if (cur_size == new_size) {
279
0
            return;
280
0
        }
281
128k
        if (cur_size > new_size) {
282
0
            erase(item_ptr(new_size), end());
283
0
            return;
284
0
        }
285
128k
        if (new_size > capacity()) {
286
0
            change_capacity(new_size);
287
0
        }
288
128k
        ptrdiff_t increase = new_size - cur_size;
289
128k
        fill(item_ptr(cur_size), increase);
290
128k
        _size += increase;
291
128k
    }
292
293
4.13k
    void reserve(size_type new_capacity) {
294
4.13k
        if (new_capacity > capacity()) {
295
1.84k
            change_capacity(new_capacity);
296
1.84k
        }
297
4.13k
    }
298
299
94.0M
    void shrink_to_fit() {
300
94.0M
        change_capacity(size());
301
94.0M
    }
prevector<36u, unsigned char, unsigned int, int>::shrink_to_fit()
Line
Count
Source
299
94.0M
    void shrink_to_fit() {
300
94.0M
        change_capacity(size());
301
94.0M
    }
prevector<8u, int, unsigned int, int>::shrink_to_fit()
Line
Count
Source
299
1.98k
    void shrink_to_fit() {
300
1.98k
        change_capacity(size());
301
1.98k
    }
302
303
97.7M
    void clear() {
304
97.7M
        resize(0);
305
97.7M
    }
prevector<36u, unsigned char, unsigned int, int>::clear()
Line
Count
Source
303
97.6M
    void clear() {
304
97.6M
        resize(0);
305
97.6M
    }
prevector<16u, unsigned char, unsigned int, int>::clear()
Line
Count
Source
303
123k
    void clear() {
304
123k
        resize(0);
305
123k
    }
prevector<8u, int, unsigned int, int>::clear()
Line
Count
Source
303
12.7k
    void clear() {
304
12.7k
        resize(0);
305
12.7k
    }
306
307
9.66M
    iterator insert(iterator pos, const T& value) {
308
9.66M
        size_type p = pos - begin();
309
9.66M
        size_type new_size = size() + 1;
310
9.66M
        if (capacity() < new_size) {
311
8.01k
            change_capacity(new_size + (new_size >> 1));
312
8.01k
        }
313
9.66M
        T* ptr = item_ptr(p);
314
9.66M
        T* dst = ptr + 1;
315
9.66M
        memmove(dst, ptr, (size() - p) * sizeof(T));
316
9.66M
        _size++;
317
9.66M
        new(static_cast<void*>(ptr)) T(value);
318
9.66M
        return iterator(ptr);
319
9.66M
    }
prevector<36u, unsigned char, unsigned int, int>::insert(prevector<36u, unsigned char, unsigned int, int>::iterator, unsigned char const&)
Line
Count
Source
307
9.63M
    iterator insert(iterator pos, const T& value) {
308
9.63M
        size_type p = pos - begin();
309
9.63M
        size_type new_size = size() + 1;
310
9.63M
        if (capacity() < new_size) {
311
6.65k
            change_capacity(new_size + (new_size >> 1));
312
6.65k
        }
313
9.63M
        T* ptr = item_ptr(p);
314
9.63M
        T* dst = ptr + 1;
315
9.63M
        memmove(dst, ptr, (size() - p) * sizeof(T));
316
9.63M
        _size++;
317
9.63M
        new(static_cast<void*>(ptr)) T(value);
318
9.63M
        return iterator(ptr);
319
9.63M
    }
prevector<8u, int, unsigned int, int>::insert(prevector<8u, int, unsigned int, int>::iterator, int const&)
Line
Count
Source
307
32.4k
    iterator insert(iterator pos, const T& value) {
308
32.4k
        size_type p = pos - begin();
309
32.4k
        size_type new_size = size() + 1;
310
32.4k
        if (capacity() < new_size) {
311
1.36k
            change_capacity(new_size + (new_size >> 1));
312
1.36k
        }
313
32.4k
        T* ptr = item_ptr(p);
314
32.4k
        T* dst = ptr + 1;
315
32.4k
        memmove(dst, ptr, (size() - p) * sizeof(T));
316
32.4k
        _size++;
317
32.4k
        new(static_cast<void*>(ptr)) T(value);
318
32.4k
        return iterator(ptr);
319
32.4k
    }
320
321
16.2k
    void insert(iterator pos, size_type count, const T& value) {
322
16.2k
        size_type p = pos - begin();
323
16.2k
        size_type new_size = size() + count;
324
16.2k
        if (capacity() < new_size) {
325
748
            change_capacity(new_size + (new_size >> 1));
326
748
        }
327
16.2k
        T* ptr = item_ptr(p);
328
16.2k
        T* dst = ptr + count;
329
16.2k
        memmove(dst, ptr, (size() - p) * sizeof(T));
330
16.2k
        _size += count;
331
16.2k
        fill(item_ptr(p), count, value);
332
16.2k
    }
prevector<8u, int, unsigned int, int>::insert(prevector<8u, int, unsigned int, int>::iterator, unsigned int, int const&)
Line
Count
Source
321
16.2k
    void insert(iterator pos, size_type count, const T& value) {
322
16.2k
        size_type p = pos - begin();
323
16.2k
        size_type new_size = size() + count;
324
16.2k
        if (capacity() < new_size) {
325
741
            change_capacity(new_size + (new_size >> 1));
326
741
        }
327
16.2k
        T* ptr = item_ptr(p);
328
16.2k
        T* dst = ptr + count;
329
16.2k
        memmove(dst, ptr, (size() - p) * sizeof(T));
330
16.2k
        _size += count;
331
16.2k
        fill(item_ptr(p), count, value);
332
16.2k
    }
prevector<36u, unsigned char, unsigned int, int>::insert(prevector<36u, unsigned char, unsigned int, int>::iterator, unsigned int, unsigned char const&)
Line
Count
Source
321
7
    void insert(iterator pos, size_type count, const T& value) {
322
7
        size_type p = pos - begin();
323
7
        size_type new_size = size() + count;
324
7
        if (capacity() < new_size) {
325
7
            change_capacity(new_size + (new_size >> 1));
326
7
        }
327
7
        T* ptr = item_ptr(p);
328
7
        T* dst = ptr + count;
329
7
        memmove(dst, ptr, (size() - p) * sizeof(T));
330
7
        _size += count;
331
7
        fill(item_ptr(p), count, value);
332
7
    }
333
334
    template <std::input_iterator InputIterator>
335
5.61M
    void insert(iterator pos, InputIterator first, InputIterator last) {
336
5.61M
        size_type p = pos - begin();
337
5.61M
        difference_type count = last - first;
338
5.61M
        size_type new_size = size() + count;
339
5.61M
        if (capacity() < new_size) {
340
378k
            change_capacity(new_size + (new_size >> 1));
341
378k
        }
342
5.61M
        T* ptr = item_ptr(p);
343
5.61M
        T* dst = ptr + count;
344
5.61M
        memmove(dst, ptr, (size() - p) * sizeof(T));
345
5.61M
        _size += count;
346
5.61M
        fill(ptr, first, last);
347
5.61M
    }
void prevector<36u, unsigned char, unsigned int, int>::insert<unsigned char const*>(prevector<36u, unsigned char, unsigned int, int>::iterator, unsigned char const*, unsigned char const*)
Line
Count
Source
335
380
    void insert(iterator pos, InputIterator first, InputIterator last) {
336
380
        size_type p = pos - begin();
337
380
        difference_type count = last - first;
338
380
        size_type new_size = size() + count;
339
380
        if (capacity() < new_size) {
340
0
            change_capacity(new_size + (new_size >> 1));
341
0
        }
342
380
        T* ptr = item_ptr(p);
343
380
        T* dst = ptr + count;
344
380
        memmove(dst, ptr, (size() - p) * sizeof(T));
345
380
        _size += count;
346
380
        fill(ptr, first, last);
347
380
    }
void prevector<36u, unsigned char, unsigned int, int>::insert<__gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 18446744073709551615ul>::__iter_tag>>(prevector<36u, unsigned char, unsigned int, int>::iterator, __gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 18446744073709551615ul>::__iter_tag>, __gnu_cxx::__normal_iterator<unsigned char const*, std::span<unsigned char const, 18446744073709551615ul>::__iter_tag>)
Line
Count
Source
335
2.80M
    void insert(iterator pos, InputIterator first, InputIterator last) {
336
2.80M
        size_type p = pos - begin();
337
2.80M
        difference_type count = last - first;
338
2.80M
        size_type new_size = size() + count;
339
2.80M
        if (capacity() < new_size) {
340
232k
            change_capacity(new_size + (new_size >> 1));
341
232k
        }
342
2.80M
        T* ptr = item_ptr(p);
343
2.80M
        T* dst = ptr + count;
344
2.80M
        memmove(dst, ptr, (size() - p) * sizeof(T));
345
2.80M
        _size += count;
346
2.80M
        fill(ptr, first, last);
347
2.80M
    }
void prevector<36u, unsigned char, unsigned int, int>::insert<prevector<36u, unsigned char, unsigned int, int>::iterator>(prevector<36u, unsigned char, unsigned int, int>::iterator, prevector<36u, unsigned char, unsigned int, int>::iterator, prevector<36u, unsigned char, unsigned int, int>::iterator)
Line
Count
Source
335
23.0k
    void insert(iterator pos, InputIterator first, InputIterator last) {
336
23.0k
        size_type p = pos - begin();
337
23.0k
        difference_type count = last - first;
338
23.0k
        size_type new_size = size() + count;
339
23.0k
        if (capacity() < new_size) {
340
17.3k
            change_capacity(new_size + (new_size >> 1));
341
17.3k
        }
342
23.0k
        T* ptr = item_ptr(p);
343
23.0k
        T* dst = ptr + count;
344
23.0k
        memmove(dst, ptr, (size() - p) * sizeof(T));
345
23.0k
        _size += count;
346
23.0k
        fill(ptr, first, last);
347
23.0k
    }
void prevector<8u, int, unsigned int, int>::insert<int*>(prevector<8u, int, unsigned int, int>::iterator, int*, int*)
Line
Count
Source
335
3.99k
    void insert(iterator pos, InputIterator first, InputIterator last) {
336
3.99k
        size_type p = pos - begin();
337
3.99k
        difference_type count = last - first;
338
3.99k
        size_type new_size = size() + count;
339
3.99k
        if (capacity() < new_size) {
340
347
            change_capacity(new_size + (new_size >> 1));
341
347
        }
342
3.99k
        T* ptr = item_ptr(p);
343
3.99k
        T* dst = ptr + count;
344
3.99k
        memmove(dst, ptr, (size() - p) * sizeof(T));
345
3.99k
        _size += count;
346
3.99k
        fill(ptr, first, last);
347
3.99k
    }
void prevector<36u, unsigned char, unsigned int, int>::insert<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char>>>>(prevector<36u, unsigned char, unsigned int, int>::iterator, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char>>>, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char>>>)
Line
Count
Source
335
2.80k
    void insert(iterator pos, InputIterator first, InputIterator last) {
336
2.80k
        size_type p = pos - begin();
337
2.80k
        difference_type count = last - first;
338
2.80k
        size_type new_size = size() + count;
339
2.80k
        if (capacity() < new_size) {
340
248
            change_capacity(new_size + (new_size >> 1));
341
248
        }
342
2.80k
        T* ptr = item_ptr(p);
343
2.80k
        T* dst = ptr + count;
344
2.80k
        memmove(dst, ptr, (size() - p) * sizeof(T));
345
2.80k
        _size += count;
346
2.80k
        fill(ptr, first, last);
347
2.80k
    }
void prevector<36u, unsigned char, unsigned int, int>::insert<prevector<36u, unsigned char, unsigned int, int>::const_iterator>(prevector<36u, unsigned char, unsigned int, int>::iterator, prevector<36u, unsigned char, unsigned int, int>::const_iterator, prevector<36u, unsigned char, unsigned int, int>::const_iterator)
Line
Count
Source
335
2.78M
    void insert(iterator pos, InputIterator first, InputIterator last) {
336
2.78M
        size_type p = pos - begin();
337
2.78M
        difference_type count = last - first;
338
2.78M
        size_type new_size = size() + count;
339
2.78M
        if (capacity() < new_size) {
340
128k
            change_capacity(new_size + (new_size >> 1));
341
128k
        }
342
2.78M
        T* ptr = item_ptr(p);
343
2.78M
        T* dst = ptr + count;
344
2.78M
        memmove(dst, ptr, (size() - p) * sizeof(T));
345
2.78M
        _size += count;
346
2.78M
        fill(ptr, first, last);
347
2.78M
    }
void prevector<35u, unsigned char, unsigned int, int>::insert<unsigned char*>(prevector<35u, unsigned char, unsigned int, int>::iterator, unsigned char*, unsigned char*)
Line
Count
Source
335
293
    void insert(iterator pos, InputIterator first, InputIterator last) {
336
293
        size_type p = pos - begin();
337
293
        difference_type count = last - first;
338
293
        size_type new_size = size() + count;
339
293
        if (capacity() < new_size) {
340
0
            change_capacity(new_size + (new_size >> 1));
341
0
        }
342
293
        T* ptr = item_ptr(p);
343
293
        T* dst = ptr + count;
344
293
        memmove(dst, ptr, (size() - p) * sizeof(T));
345
293
        _size += count;
346
293
        fill(ptr, first, last);
347
293
    }
void prevector<35u, unsigned char, unsigned int, int>::insert<unsigned char const*>(prevector<35u, unsigned char, unsigned int, int>::iterator, unsigned char const*, unsigned char const*)
Line
Count
Source
335
293
    void insert(iterator pos, InputIterator first, InputIterator last) {
336
293
        size_type p = pos - begin();
337
293
        difference_type count = last - first;
338
293
        size_type new_size = size() + count;
339
293
        if (capacity() < new_size) {
340
0
            change_capacity(new_size + (new_size >> 1));
341
0
        }
342
293
        T* ptr = item_ptr(p);
343
293
        T* dst = ptr + count;
344
293
        memmove(dst, ptr, (size() - p) * sizeof(T));
345
293
        _size += count;
346
293
        fill(ptr, first, last);
347
293
    }
348
349
1.08M
    inline void resize_uninitialized(size_type new_size) {
350
        // resize_uninitialized changes the size of the prevector but does not initialize it.
351
        // If size < new_size, the added elements must be initialized explicitly.
352
1.08M
        if (capacity() < new_size) {
353
235k
            change_capacity(new_size);
354
235k
            _size += new_size - size();
355
235k
            return;
356
235k
        }
357
845k
        if (new_size < size()) {
358
3.21k
            erase(item_ptr(new_size), end());
359
842k
        } else {
360
842k
            _size += new_size - size();
361
842k
        }
362
845k
    }
prevector<36u, unsigned char, unsigned int, int>::resize_uninitialized(unsigned int)
Line
Count
Source
349
1.07M
    inline void resize_uninitialized(size_type new_size) {
350
        // resize_uninitialized changes the size of the prevector but does not initialize it.
351
        // If size < new_size, the added elements must be initialized explicitly.
352
1.07M
        if (capacity() < new_size) {
353
233k
            change_capacity(new_size);
354
233k
            _size += new_size - size();
355
233k
            return;
356
233k
        }
357
838k
        if (new_size < size()) {
358
0
            erase(item_ptr(new_size), end());
359
838k
        } else {
360
838k
            _size += new_size - size();
361
838k
        }
362
838k
    }
prevector<8u, int, unsigned int, int>::resize_uninitialized(unsigned int)
Line
Count
Source
349
8.26k
    inline void resize_uninitialized(size_type new_size) {
350
        // resize_uninitialized changes the size of the prevector but does not initialize it.
351
        // If size < new_size, the added elements must be initialized explicitly.
352
8.26k
        if (capacity() < new_size) {
353
1.14k
            change_capacity(new_size);
354
1.14k
            _size += new_size - size();
355
1.14k
            return;
356
1.14k
        }
357
7.12k
        if (new_size < size()) {
358
3.21k
            erase(item_ptr(new_size), end());
359
3.91k
        } else {
360
3.91k
            _size += new_size - size();
361
3.91k
        }
362
7.12k
    }
363
364
27.4k
    iterator erase(iterator pos) {
365
27.4k
        return erase(pos, pos + 1);
366
27.4k
    }
367
368
14.8M
    iterator erase(iterator first, iterator last) {
369
        // Erase is not allowed to the change the object's capacity. That means
370
        // that when starting with an indirectly allocated prevector with
371
        // size and capacity > N, the result may be a still indirectly allocated
372
        // prevector with size <= N and capacity > N. A shrink_to_fit() call is
373
        // necessary to switch to the (more efficient) directly allocated
374
        // representation (with capacity N and size <= N).
375
14.8M
        iterator p = first;
376
14.8M
        char* endp = (char*)&(*end());
377
14.8M
        _size -= last - p;
378
14.8M
        memmove(&(*first), &(*last), endp - ((char*)(&(*last))));
379
14.8M
        return first;
380
14.8M
    }
prevector<36u, unsigned char, unsigned int, int>::erase(prevector<36u, unsigned char, unsigned int, int>::iterator, prevector<36u, unsigned char, unsigned int, int>::iterator)
Line
Count
Source
368
14.6M
    iterator erase(iterator first, iterator last) {
369
        // Erase is not allowed to the change the object's capacity. That means
370
        // that when starting with an indirectly allocated prevector with
371
        // size and capacity > N, the result may be a still indirectly allocated
372
        // prevector with size <= N and capacity > N. A shrink_to_fit() call is
373
        // necessary to switch to the (more efficient) directly allocated
374
        // representation (with capacity N and size <= N).
375
14.6M
        iterator p = first;
376
14.6M
        char* endp = (char*)&(*end());
377
14.6M
        _size -= last - p;
378
14.6M
        memmove(&(*first), &(*last), endp - ((char*)(&(*last))));
379
14.6M
        return first;
380
14.6M
    }
prevector<16u, unsigned char, unsigned int, int>::erase(prevector<16u, unsigned char, unsigned int, int>::iterator, prevector<16u, unsigned char, unsigned int, int>::iterator)
Line
Count
Source
368
165k
    iterator erase(iterator first, iterator last) {
369
        // Erase is not allowed to the change the object's capacity. That means
370
        // that when starting with an indirectly allocated prevector with
371
        // size and capacity > N, the result may be a still indirectly allocated
372
        // prevector with size <= N and capacity > N. A shrink_to_fit() call is
373
        // necessary to switch to the (more efficient) directly allocated
374
        // representation (with capacity N and size <= N).
375
165k
        iterator p = first;
376
165k
        char* endp = (char*)&(*end());
377
165k
        _size -= last - p;
378
165k
        memmove(&(*first), &(*last), endp - ((char*)(&(*last))));
379
165k
        return first;
380
165k
    }
prevector<8u, int, unsigned int, int>::erase(prevector<8u, int, unsigned int, int>::iterator, prevector<8u, int, unsigned int, int>::iterator)
Line
Count
Source
368
69.9k
    iterator erase(iterator first, iterator last) {
369
        // Erase is not allowed to the change the object's capacity. That means
370
        // that when starting with an indirectly allocated prevector with
371
        // size and capacity > N, the result may be a still indirectly allocated
372
        // prevector with size <= N and capacity > N. A shrink_to_fit() call is
373
        // necessary to switch to the (more efficient) directly allocated
374
        // representation (with capacity N and size <= N).
375
69.9k
        iterator p = first;
376
69.9k
        char* endp = (char*)&(*end());
377
69.9k
        _size -= last - p;
378
69.9k
        memmove(&(*first), &(*last), endp - ((char*)(&(*last))));
379
69.9k
        return first;
380
69.9k
    }
Unexecuted instantiation: prevector<33u, unsigned char, unsigned int, int>::erase(prevector<33u, unsigned char, unsigned int, int>::iterator, prevector<33u, unsigned char, unsigned int, int>::iterator)
381
382
    template<typename... Args>
383
82.6k
    void emplace_back(Args&&... args) {
384
82.6k
        size_type new_size = size() + 1;
385
82.6k
        if (capacity() < new_size) {
386
13.2k
            change_capacity(new_size + (new_size >> 1));
387
13.2k
        }
388
82.6k
        new(item_ptr(size())) T(std::forward<Args>(args)...);
389
82.6k
        _size++;
390
82.6k
    }
void prevector<36u, unsigned char, unsigned int, int>::emplace_back<unsigned char const&>(unsigned char const&)
Line
Count
Source
383
73.5k
    void emplace_back(Args&&... args) {
384
73.5k
        size_type new_size = size() + 1;
385
73.5k
        if (capacity() < new_size) {
386
13.0k
            change_capacity(new_size + (new_size >> 1));
387
13.0k
        }
388
73.5k
        new(item_ptr(size())) T(std::forward<Args>(args)...);
389
73.5k
        _size++;
390
73.5k
    }
void prevector<8u, int, unsigned int, int>::emplace_back<int const&>(int const&)
Line
Count
Source
383
8.42k
    void emplace_back(Args&&... args) {
384
8.42k
        size_type new_size = size() + 1;
385
8.42k
        if (capacity() < new_size) {
386
207
            change_capacity(new_size + (new_size >> 1));
387
207
        }
388
8.42k
        new(item_ptr(size())) T(std::forward<Args>(args)...);
389
8.42k
        _size++;
390
8.42k
    }
void prevector<4u, Network, unsigned int, int>::emplace_back<Network const&>(Network const&)
Line
Count
Source
383
700
    void emplace_back(Args&&... args) {
384
700
        size_type new_size = size() + 1;
385
700
        if (capacity() < new_size) {
386
0
            change_capacity(new_size + (new_size >> 1));
387
0
        }
388
700
        new(item_ptr(size())) T(std::forward<Args>(args)...);
389
700
        _size++;
390
700
    }
391
392
82.6k
    void push_back(const T& value) {
393
82.6k
        emplace_back(value);
394
82.6k
    }
prevector<36u, unsigned char, unsigned int, int>::push_back(unsigned char const&)
Line
Count
Source
392
73.5k
    void push_back(const T& value) {
393
73.5k
        emplace_back(value);
394
73.5k
    }
prevector<8u, int, unsigned int, int>::push_back(int const&)
Line
Count
Source
392
8.42k
    void push_back(const T& value) {
393
8.42k
        emplace_back(value);
394
8.42k
    }
prevector<4u, Network, unsigned int, int>::push_back(Network const&)
Line
Count
Source
392
700
    void push_back(const T& value) {
393
700
        emplace_back(value);
394
700
    }
395
396
6.63k
    void pop_back() {
397
6.63k
        erase(end() - 1, end());
398
6.63k
    }
399
400
    T& front() {
401
        return *item_ptr(0);
402
    }
403
404
    const T& front() const {
405
        return *item_ptr(0);
406
    }
407
408
    T& back() {
409
        return *item_ptr(size() - 1);
410
    }
411
412
28.2k
    const T& back() const {
413
28.2k
        return *item_ptr(size() - 1);
414
28.2k
    }
415
416
    void swap(prevector<N, T, Size, Diff>& other) noexcept
417
16.3k
    {
418
16.3k
        std::swap(_union, other._union);
419
16.3k
        std::swap(_size, other._size);
420
16.3k
    }
421
422
172M
    ~prevector() {
423
172M
        if (!is_direct()) {
424
2.28M
            free(_union.indirect_contents.indirect);
425
2.28M
            _union.indirect_contents.indirect = nullptr;
426
2.28M
        }
427
172M
    }
prevector<16u, unsigned char, unsigned int, int>::~prevector()
Line
Count
Source
422
1.53M
    ~prevector() {
423
1.53M
        if (!is_direct()) {
424
2.42k
            free(_union.indirect_contents.indirect);
425
2.42k
            _union.indirect_contents.indirect = nullptr;
426
2.42k
        }
427
1.53M
    }
prevector<36u, unsigned char, unsigned int, int>::~prevector()
Line
Count
Source
422
169M
    ~prevector() {
423
169M
        if (!is_direct()) {
424
2.08M
            free(_union.indirect_contents.indirect);
425
2.08M
            _union.indirect_contents.indirect = nullptr;
426
2.08M
        }
427
169M
    }
prevector<33u, unsigned char, unsigned int, int>::~prevector()
Line
Count
Source
422
637k
    ~prevector() {
423
637k
        if (!is_direct()) {
424
0
            free(_union.indirect_contents.indirect);
425
0
            _union.indirect_contents.indirect = nullptr;
426
0
        }
427
637k
    }
prevector<8u, int, unsigned int, int>::~prevector()
Line
Count
Source
422
531k
    ~prevector() {
423
531k
        if (!is_direct()) {
424
198k
            free(_union.indirect_contents.indirect);
425
198k
            _union.indirect_contents.indirect = nullptr;
426
198k
        }
427
531k
    }
prevector<4u, Network, unsigned int, int>::~prevector()
Line
Count
Source
422
365
    ~prevector() {
423
365
        if (!is_direct()) {
424
0
            free(_union.indirect_contents.indirect);
425
0
            _union.indirect_contents.indirect = nullptr;
426
0
        }
427
365
    }
prevector<35u, unsigned char, unsigned int, int>::~prevector()
Line
Count
Source
422
293
    ~prevector() {
423
293
        if (!is_direct()) {
424
0
            free(_union.indirect_contents.indirect);
425
0
            _union.indirect_contents.indirect = nullptr;
426
0
        }
427
293
    }
428
429
7.20M
    constexpr bool operator==(const prevector& other) const {
430
7.20M
        return std::ranges::equal(*this, other);
431
7.20M
    }
prevector<36u, unsigned char, unsigned int, int>::operator==(prevector<36u, unsigned char, unsigned int, int> const&) const
Line
Count
Source
429
6.45M
    constexpr bool operator==(const prevector& other) const {
430
6.45M
        return std::ranges::equal(*this, other);
431
6.45M
    }
prevector<8u, int, unsigned int, int>::operator==(prevector<8u, int, unsigned int, int> const&) const
Line
Count
Source
429
531k
    constexpr bool operator==(const prevector& other) const {
430
531k
        return std::ranges::equal(*this, other);
431
531k
    }
prevector<16u, unsigned char, unsigned int, int>::operator==(prevector<16u, unsigned char, unsigned int, int> const&) const
Line
Count
Source
429
217k
    constexpr bool operator==(const prevector& other) const {
430
217k
        return std::ranges::equal(*this, other);
431
217k
    }
432
433
22.9M
    bool operator<(const prevector<N, T, Size, Diff>& other) const {
434
22.9M
        if (size() < other.size()) {
435
898k
            return true;
436
898k
        }
437
22.0M
        if (size() > other.size()) {
438
341k
            return false;
439
341k
        }
440
21.6M
        const_iterator b1 = begin();
441
21.6M
        const_iterator b2 = other.begin();
442
21.6M
        const_iterator e1 = end();
443
133M
        while (b1 != e1) {
444
130M
            if ((*b1) < (*b2)) {
445
10.9M
                return true;
446
10.9M
            }
447
119M
            if ((*b2) < (*b1)) {
448
8.27M
                return false;
449
8.27M
            }
450
111M
            ++b1;
451
111M
            ++b2;
452
111M
        }
453
2.49M
        return false;
454
21.6M
    }
prevector<36u, unsigned char, unsigned int, int>::operator<(prevector<36u, unsigned char, unsigned int, int> const&) const
Line
Count
Source
433
22.8M
    bool operator<(const prevector<N, T, Size, Diff>& other) const {
434
22.8M
        if (size() < other.size()) {
435
898k
            return true;
436
898k
        }
437
22.0M
        if (size() > other.size()) {
438
341k
            return false;
439
341k
        }
440
21.6M
        const_iterator b1 = begin();
441
21.6M
        const_iterator b2 = other.begin();
442
21.6M
        const_iterator e1 = end();
443
133M
        while (b1 != e1) {
444
130M
            if ((*b1) < (*b2)) {
445
10.9M
                return true;
446
10.9M
            }
447
119M
            if ((*b2) < (*b1)) {
448
8.27M
                return false;
449
8.27M
            }
450
111M
            ++b1;
451
111M
            ++b2;
452
111M
        }
453
2.47M
        return false;
454
21.6M
    }
prevector<16u, unsigned char, unsigned int, int>::operator<(prevector<16u, unsigned char, unsigned int, int> const&) const
Line
Count
Source
433
23.2k
    bool operator<(const prevector<N, T, Size, Diff>& other) const {
434
23.2k
        if (size() < other.size()) {
435
0
            return true;
436
0
        }
437
23.2k
        if (size() > other.size()) {
438
0
            return false;
439
0
        }
440
23.2k
        const_iterator b1 = begin();
441
23.2k
        const_iterator b2 = other.begin();
442
23.2k
        const_iterator e1 = end();
443
116k
        while (b1 != e1) {
444
94.0k
            if ((*b1) < (*b2)) {
445
336
                return true;
446
336
            }
447
93.7k
            if ((*b2) < (*b1)) {
448
127
                return false;
449
127
            }
450
93.6k
            ++b1;
451
93.6k
            ++b2;
452
93.6k
        }
453
22.8k
        return false;
454
23.2k
    }
455
456
56.2M
    size_t allocated_memory() const {
457
56.2M
        if (is_direct()) {
458
55.4M
            return 0;
459
55.4M
        } else {
460
865k
            return ((size_t)(sizeof(T))) * _union.indirect_contents.capacity;
461
865k
        }
462
56.2M
    }
463
464
615k
    value_type* data() {
465
615k
        return item_ptr(0);
466
615k
    }
prevector<16u, unsigned char, unsigned int, int>::data()
Line
Count
Source
464
42.0k
    value_type* data() {
465
42.0k
        return item_ptr(0);
466
42.0k
    }
prevector<33u, unsigned char, unsigned int, int>::data()
Line
Count
Source
464
256k
    value_type* data() {
465
256k
        return item_ptr(0);
466
256k
    }
prevector<36u, unsigned char, unsigned int, int>::data()
Line
Count
Source
464
316k
    value_type* data() {
465
316k
        return item_ptr(0);
466
316k
    }
prevector<35u, unsigned char, unsigned int, int>::data()
Line
Count
Source
464
293
    value_type* data() {
465
293
        return item_ptr(0);
466
293
    }
467
468
35.2M
    const value_type* data() const {
469
35.2M
        return item_ptr(0);
470
35.2M
    }
prevector<16u, unsigned char, unsigned int, int>::data() const
Line
Count
Source
468
2.28M
    const value_type* data() const {
469
2.28M
        return item_ptr(0);
470
2.28M
    }
prevector<36u, unsigned char, unsigned int, int>::data() const
Line
Count
Source
468
32.8M
    const value_type* data() const {
469
32.8M
        return item_ptr(0);
470
32.8M
    }
prevector<33u, unsigned char, unsigned int, int>::data() const
Line
Count
Source
468
128k
    const value_type* data() const {
469
128k
        return item_ptr(0);
470
128k
    }
471
};
472
473
#endif // BITCOIN_PREVECTOR_H