Add dynamic array functionality
This commit is contained in:
parent
274d35ea5d
commit
43953da780
3 changed files with 37 additions and 0 deletions
|
|
@ -19,4 +19,10 @@ void dynarr_push(DynamicArray* arr, void* data);
|
||||||
|
|
||||||
void dynarr_free(DynamicArray* arr);
|
void dynarr_free(DynamicArray* arr);
|
||||||
|
|
||||||
|
void* dynarr_last(DynamicArray* arr);
|
||||||
|
|
||||||
|
void dynarr_remove(DynamicArray* arr, usize idx);
|
||||||
|
|
||||||
|
void* dynarr_pop(DynamicArray* arr);
|
||||||
|
|
||||||
#endif // DYNAMIC_ARRAY_H
|
#endif // DYNAMIC_ARRAY_H
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,16 @@ void* dynarr_at(DynamicArray* arr, usize idx) {
|
||||||
return &((u8*)arr->data)[arr->data_size * idx];
|
return &((u8*)arr->data)[arr->data_size * idx];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void* dynarr_last(DynamicArray* arr) {
|
||||||
|
return &((u8*)arr->data)[arr->data_size * (arr->len - 1)];
|
||||||
|
}
|
||||||
|
|
||||||
|
void dynarr_remove(DynamicArray* arr, usize idx) {
|
||||||
|
void* data = dynarr_at(arr, idx);
|
||||||
|
memmove(data, &((u8*)arr->data)[arr->data_size * (idx + 1)], (arr->len - idx - 1) * arr->data_size);
|
||||||
|
arr->len--;
|
||||||
|
}
|
||||||
|
|
||||||
void dynarr_push(DynamicArray* arr, void* data) {
|
void dynarr_push(DynamicArray* arr, void* data) {
|
||||||
if (arr->len >= arr->capacity) {
|
if (arr->len >= arr->capacity) {
|
||||||
arr->capacity *= GROWTH_FACTOR;
|
arr->capacity *= GROWTH_FACTOR;
|
||||||
|
|
@ -28,6 +38,15 @@ void dynarr_push(DynamicArray* arr, void* data) {
|
||||||
arr->len++;
|
arr->len++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void* dynarr_pop(DynamicArray* arr) {
|
||||||
|
if (arr->len == 0) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
arr->len--;
|
||||||
|
return dynarr_last(arr);
|
||||||
|
}
|
||||||
|
|
||||||
void dynarr_free(DynamicArray* arr) {
|
void dynarr_free(DynamicArray* arr) {
|
||||||
free(arr->data);
|
free(arr->data);
|
||||||
arr->data = NULL;
|
arr->data = NULL;
|
||||||
|
|
|
||||||
|
|
@ -16,5 +16,17 @@ int main() {
|
||||||
assert(*(i32*)dynarr_at(&i32_array, i) == i);
|
assert(*(i32*)dynarr_at(&i32_array, i) == i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (i32 i = 0; i < 100; i++) {
|
||||||
|
dynarr_pop(&i32_array);
|
||||||
|
assert(i32_array.len == 99 - i);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i32 i = 0; i < 100; i++) {
|
||||||
|
dynarr_push(&i32_array, &i);
|
||||||
|
}
|
||||||
|
dynarr_remove(&i32_array, 50);
|
||||||
|
assert(i32_array.len == 99);
|
||||||
|
assert(*(i32*)dynarr_at(&i32_array, 50) == 51);
|
||||||
|
|
||||||
dynarr_free(&i32_array);
|
dynarr_free(&i32_array);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue