Optimised

This commit is contained in:
OusmBlueNinja 2025-04-17 11:26:16 -05:00
parent 0334045d5d
commit 226d11db35

View File

@ -91,35 +91,35 @@ 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));
if (!blk) throw std::bad_alloc(); if (!blk) throw std::bad_alloc();
_b = static_cast<T*>(blk); _b = static_cast<T*>(blk);
_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);