|
@@ -58,9 +58,7 @@ public:
|
|
|
// Must take a copy instead of a reference (see GH-31736).
|
|
|
_FORCE_INLINE_ void push_back(T p_elem) {
|
|
|
if (unlikely(count == capacity)) {
|
|
|
- capacity = tight ? (capacity + 1) : MAX((U)1, capacity << 1);
|
|
|
- data = (T *)memrealloc(data, capacity * sizeof(T));
|
|
|
- CRASH_COND_MSG(!data, "Out of memory");
|
|
|
+ reserve(count + 1);
|
|
|
}
|
|
|
|
|
|
if constexpr (!std::is_trivially_constructible_v<T> && !force_trivial) {
|
|
@@ -145,10 +143,16 @@ public:
|
|
|
}
|
|
|
_FORCE_INLINE_ bool is_empty() const { return count == 0; }
|
|
|
_FORCE_INLINE_ U get_capacity() const { return capacity; }
|
|
|
- _FORCE_INLINE_ void reserve(U p_size) {
|
|
|
- p_size = tight ? p_size : nearest_power_of_2_templated(p_size);
|
|
|
+ void reserve(U p_size) {
|
|
|
if (p_size > capacity) {
|
|
|
- capacity = p_size;
|
|
|
+ if (tight) {
|
|
|
+ capacity = p_size;
|
|
|
+ } else {
|
|
|
+ capacity = MAX((U)2, capacity + ((1 + capacity) >> 1));
|
|
|
+ if (p_size > capacity) {
|
|
|
+ capacity = p_size;
|
|
|
+ }
|
|
|
+ }
|
|
|
data = (T *)memrealloc(data, capacity * sizeof(T));
|
|
|
CRASH_COND_MSG(!data, "Out of memory");
|
|
|
}
|
|
@@ -163,11 +167,7 @@ public:
|
|
|
}
|
|
|
count = p_size;
|
|
|
} else if (p_size > count) {
|
|
|
- if (unlikely(p_size > capacity)) {
|
|
|
- capacity = tight ? p_size : nearest_power_of_2_templated(p_size);
|
|
|
- data = (T *)memrealloc(data, capacity * sizeof(T));
|
|
|
- CRASH_COND_MSG(!data, "Out of memory");
|
|
|
- }
|
|
|
+ reserve(p_size);
|
|
|
if constexpr (!std::is_trivially_constructible_v<T> && !force_trivial) {
|
|
|
memnew_arr_placement(data + count, p_size - count);
|
|
|
}
|