Optimised
This commit is contained in:
parent
0334045d5d
commit
226d11db35
@ -91,12 +91,13 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cold path: only taken on growth
|
|
||||||
UFV_COLD void reserve_grow(size_type minNeeded) {
|
UFV_COLD void reserve_grow(size_type minNeeded) {
|
||||||
size_type oldSize = size();
|
size_type oldSize = size();
|
||||||
|
size_type oldCap = capacity();
|
||||||
|
size_type newCap = std::bit_ceil(minNeeded);
|
||||||
|
|
||||||
if constexpr (POD_PATH) {
|
if constexpr (POD_PATH) {
|
||||||
size_type newCap = capacity() ? capacity() * 2 : 1;
|
if (newCap == oldCap) return;
|
||||||
while (newCap < minNeeded) newCap <<= 1;
|
|
||||||
void* blk = _b
|
void* blk = _b
|
||||||
? std::realloc(_b, newCap * sizeof(T))
|
? std::realloc(_b, newCap * sizeof(T))
|
||||||
: std::malloc (newCap * sizeof(T));
|
: std::malloc (newCap * sizeof(T));
|
||||||
@ -105,22 +106,21 @@ public:
|
|||||||
_e = _b + oldSize;
|
_e = _b + oldSize;
|
||||||
_cap = _b + newCap;
|
_cap = _b + newCap;
|
||||||
} else {
|
} else {
|
||||||
size_type newCap = capacity() ? capacity() * 2 : 1;
|
|
||||||
while (newCap < minNeeded) newCap <<= 1;
|
|
||||||
T* newB = alloc_traits::allocate(_alloc, newCap);
|
T* newB = alloc_traits::allocate(_alloc, newCap);
|
||||||
if constexpr (std::is_nothrow_move_constructible_v<T>) {
|
if constexpr (std::is_nothrow_move_constructible_v<T>) {
|
||||||
std::uninitialized_move(_b, _e, newB);
|
std::uninitialized_move(_b, _e, newB);
|
||||||
} else {
|
} else {
|
||||||
std::uninitialized_copy(_b, _e, newB);
|
std::uninitialized_copy(_b, _e, newB);
|
||||||
}
|
}
|
||||||
clear();
|
std::destroy(_b, _e); // only if not using clear()
|
||||||
if (_b) alloc_traits::deallocate(_alloc, _b, capacity());
|
if (_b) alloc_traits::deallocate(_alloc, _b, oldCap);
|
||||||
_b = newB;
|
_b = newB;
|
||||||
_e = newB + oldSize;
|
_e = newB + oldSize;
|
||||||
_cap = newB + newCap;
|
_cap = newB + newCap;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
UFV_ALWAYS_INLINE void reserve(size_type n) {
|
UFV_ALWAYS_INLINE void reserve(size_type n) {
|
||||||
if (n > capacity()) reserve_grow(n);
|
if (n > capacity()) reserve_grow(n);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user