This commit is contained in:
2024-04-24 21:30:28 +08:00
parent 24294d45a9
commit 317ad22de0
13 changed files with 401 additions and 29 deletions

View File

@ -3,6 +3,7 @@
#include "string.h"
#include "stdlib.h"
#include "assert.h"
vector_Vector *vector_Create(uintptr_t objectSize) {
@ -19,6 +20,7 @@ vector_Vector *vector_Create(uintptr_t objectSize) {
// Resizes the underlying buffer to a new capacity
static inline void __vector_Rebuffer(vector_Vector *vec, uintptr_t newcap) {
ASSERT(newcap >= vec->size);
void *newbuf = malloc(newcap);
memcpy(newbuf, vec->data, vec->size);
free(vec->data);
@ -50,7 +52,7 @@ bool vector_Pop(vector_Vector *vec, void *out_data) {
void vector_Append(vector_Vector *vec, const void *data, uintptr_t n) {
uintptr_t oldsize = vec->size, addsize = vec->objectSize * n;
vector_Resize(vec, oldsize + addsize);
vector_Resize(vec, vector_Size(vec) + n);
if (data)
memcpy(vec->data + oldsize, data, addsize);
@ -59,7 +61,7 @@ void vector_Append(vector_Vector *vec, const void *data, uintptr_t n) {
}
void vector_Resize(vector_Vector *vec, uintptr_t size) {
uintptr_t newsize = size;
uintptr_t newsize = size * vec->objectSize;
if (newsize > vec->cap) {
// grow the buffer exponentially
uint64_t newcap = vec->cap;
@ -101,3 +103,7 @@ void *vector_At(vector_Vector *vec, uintptr_t i) {
void *vector_Data(vector_Vector *vec) {
return vec->data;
}
void *vector_Back(vector_Vector *vec) {
return vector_At(vec, vector_Size(vec) - 1);
}

View File

@ -68,6 +68,11 @@ void *vector_At(vector_Vector *vec, uintptr_t i);
// Data returns the data buffer.
void *vector_Data(vector_Vector *vec);
// Back returns the last element in the vector.
//
// No boundary test is performed.
void *vector_Back(vector_Vector *vec);
#ifdef __cplusplus
}