summaryrefslogtreecommitdiff
path: root/src/array.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/array.cc')
-rw-r--r--src/array.cc39
1 files changed, 24 insertions, 15 deletions
diff --git a/src/array.cc b/src/array.cc
index fa2cb61..f522bfc 100644
--- a/src/array.cc
+++ b/src/array.cc
@@ -9,7 +9,7 @@
template <typename T>
struct Array {
usize capacity, size;
- u8* data;
+ T* data;
const Allocator* allocator;
};
@@ -18,25 +18,26 @@ struct Array {
template<typename T>
static inline usize array_nbytes(usize size) {
+ assert_neq(size, 0);
return size * sizeof(T);
}
template<typename T>
static inline usize array_next_capacity(const Array<T>* array) {
- assert(array != nullptr);
+ assert_neq(array, nullptr);
return array->capacity == 0 ? ARRAY_INIT : array->capacity * ARRAY_GROWTH;
}
template<typename T>
bool array_resize(Array<T>* array, usize new_capacity) {
- assert(array != nullptr);
- assert(array->size < new_capacity);
+ assert_neq(array, nullptr);
+ assert_st(array->size, new_capacity);
- u8* new_data = allocate(array->allocator, array_nbytes<T>(new_capacity), alignof(T));
+ T* new_data = (T*)allocate(array->allocator, array_nbytes<T>(new_capacity), alignof(T));
if(new_data == nullptr) return false;
memcpy(new_data, array->data, array_nbytes<T>(new_capacity));
- deallocate(array->allocator, array->data);
+ deallocate(array->allocator, (u8*)array->data);
array->data = new_data;
array->capacity = new_capacity;
@@ -45,8 +46,8 @@ bool array_resize(Array<T>* array, usize new_capacity) {
template<typename T>
static inline bool array_grow_if_needed(Array<T>* array) {
- assert(array != nullptr);
- assert(array->size <= array->capacity);
+ assert_neq(array, nullptr);
+ assert_ste(array->size, array->capacity);
if(array->size < array->capacity) return true;
@@ -56,16 +57,24 @@ static inline bool array_grow_if_needed(Array<T>* array) {
template<typename T>
static inline T* array_at(const Array<T>* array, usize index) {
- assert(array != NULL);
- assert(index < array->capacity);
+ assert_neq(array, nullptr);
+ assert_st(index, array->capacity);
return array->data + index;
}
template<typename T>
+inline T* array_last(const Array<T>* array) {
+ assert_neq(array, nullptr);
+
+ if(array->size == 0) return nullptr;
+ return array_at(array, array->size - 1);
+}
+
+template<typename T>
bool array_push(Array<T>* array, T* item) {
- assert(array != nullptr);
- assert(item != nullptr);
+ assert_neq(array, nullptr);
+ assert_neq(item, nullptr);
bool ret = array_grow_if_needed(array);
if(!ret) return false;
@@ -79,11 +88,11 @@ bool array_push(Array<T>* array, T* item) {
template <typename T>
void array_deinit(Array<T>* array) {
- assert(array != nullptr);
-
+ assert_neq(array, nullptr);
+
if (unlikely(array->data == nullptr)) return;
- deallocate(array->allocator, array->data);
+ deallocate(array->allocator, (u8*)array->data);
memset(array, 0, sizeof(*array));
}