aboutsummaryrefslogtreecommitdiff
path: root/src/array.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/array.cpp')
-rw-r--r--src/array.cpp15
1 files changed, 10 insertions, 5 deletions
diff --git a/src/array.cpp b/src/array.cpp
index a7c9204b0..a2c802168 100644
--- a/src/array.cpp
+++ b/src/array.cpp
@@ -326,12 +326,17 @@ void array_set_capacity(Array<T> *array, isize capacity) {
array_resize(array, capacity);
}
- T *new_data = nullptr;
- if (capacity > 0) {
- new_data = gb_alloc_array(array->allocator, T, capacity);
- gb_memmove(new_data, array->data, gb_size_of(T) * array->capacity);
+ // NOTE(bill): try gb_resize_align first, and then fallback to alloc+memmove+free
+ isize old_size = array->capacity * gb_size_of(T);
+ isize new_size = capacity * gb_size_of(T);
+ T *new_data = cast(T *)gb_resize_align(array->allocator, array->data, old_size, new_size, gb_align_of(T));
+ if (new_data == nullptr) {
+ if (capacity > 0) {
+ new_data = gb_alloc_array(array->allocator, T, capacity);
+ gb_memmove(new_data, array->data, gb_size_of(T) * array->capacity);
+ }
+ gb_free(array->allocator, array->data);
}
- gb_free(array->allocator, array->data);
array->data = new_data;
array->capacity = capacity;
}