mirror of
https://github.com/javalsai/lidm.git
synced 2025-07-03 14:25:03 +02:00
perf: better and efficient vec impl
This commit is contained in:
parent
dc6424979e
commit
04a102a7bb
@ -15,12 +15,14 @@ void strcln(char **dest, const char *source);
|
|||||||
|
|
||||||
struct Vector {
|
struct Vector {
|
||||||
uint32_t length;
|
uint32_t length;
|
||||||
uint32_t alloc_len;
|
uint32_t capacity;
|
||||||
uint16_t alloc_size;
|
|
||||||
void **pages;
|
void **pages;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Vector vec_new();
|
struct Vector vec_new();
|
||||||
|
int vec_resize(struct Vector *, size_t size);
|
||||||
|
int vec_reserve(struct Vector *, size_t size);
|
||||||
|
int vec_reserve_exact(struct Vector *, size_t size);
|
||||||
int vec_push(struct Vector *, void *item);
|
int vec_push(struct Vector *, void *item);
|
||||||
void vec_free(struct Vector *);
|
void vec_free(struct Vector *);
|
||||||
void vec_clear(struct Vector *);
|
void vec_clear(struct Vector *);
|
||||||
|
38
src/util.c
38
src/util.c
@ -75,20 +75,41 @@ struct Vector vec_new() {
|
|||||||
return vec;
|
return vec;
|
||||||
}
|
}
|
||||||
|
|
||||||
int vec_push(struct Vector *vec, void *item) {
|
int vec_resize(struct Vector *vec, size_t size) {
|
||||||
if (vec->length >= vec->alloc_len) {
|
void **new_location = realloc(vec->pages, size * sizeof(void*));
|
||||||
uint32_t new_size = vec->alloc_len + vec->alloc_size;
|
|
||||||
void **new_location = realloc(vec->pages, vec->alloc_size);
|
|
||||||
if (new_location != NULL) {
|
if (new_location != NULL) {
|
||||||
vec->alloc_size = new_size;
|
if (vec->length > size)
|
||||||
|
vec->length = size;
|
||||||
|
vec->capacity = size;
|
||||||
vec->pages = new_location;
|
vec->pages = new_location;
|
||||||
} else {
|
} else {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
vec->pages[vec->length] = item;
|
int vec_reserve(struct Vector *vec, size_t size) {
|
||||||
vec->length++;
|
uint32_t new_capacity = vec->capacity;
|
||||||
|
while (vec->length + size > new_capacity) {
|
||||||
|
new_capacity = new_capacity + (new_capacity >> 1) + 1; // cap * 1.5 + 1; 0 1 2 4 7 11...
|
||||||
|
}
|
||||||
|
return vec_resize(vec, new_capacity);
|
||||||
|
}
|
||||||
|
|
||||||
|
int vec_reserve_exact(struct Vector *vec, size_t size) {
|
||||||
|
uint32_t needed_capacity = vec->length + size;
|
||||||
|
if (vec->capacity < needed_capacity) {
|
||||||
|
return vec_resize(vec, needed_capacity);
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int vec_push(struct Vector *vec, void *item) {
|
||||||
|
int res_ret = vec_reserve(vec, 1);
|
||||||
|
if(res_ret != 0) return res_ret;
|
||||||
|
|
||||||
|
vec->pages[vec->length++] = item;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -106,8 +127,7 @@ void vec_clear(struct Vector *vec) {
|
|||||||
|
|
||||||
void vec_reset(struct Vector *vec) {
|
void vec_reset(struct Vector *vec) {
|
||||||
vec->length = 0;
|
vec->length = 0;
|
||||||
vec->alloc_len = 0;
|
vec->capacity = 0;
|
||||||
vec->alloc_size = 4096; // 4KiB page size?
|
|
||||||
vec->pages = NULL;
|
vec->pages = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user