Skip to content

Commit

Permalink
Add free callback handling to vector
Browse files Browse the repository at this point in the history
  • Loading branch information
katajakasa committed Jan 2, 2022
1 parent d33ea1f commit 5941a28
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 3 deletions.
7 changes: 5 additions & 2 deletions include/utils/vector.h
Expand Up @@ -3,17 +3,20 @@

#include "iterator.h"

typedef void (*vector_free_cb)(void*);
typedef int (*vector_compare_func)(const void*, const void*);

typedef struct vector_t {
char *data;
unsigned int block_size;
unsigned int blocks;
unsigned int reserved;
unsigned int inc_factor;
vector_free_cb free_cb;
} vector;

typedef int (*vector_compare_func)(const void*, const void*);

void vector_create(vector *vector, unsigned int block_size);
void vector_create_cb(vector *vector, unsigned int block_size, vector_free_cb free_cb);
void vector_free(vector *vector);
void vector_clear(vector *vector);
void* vector_get(const vector *vector, unsigned int key);
Expand Down
19 changes: 18 additions & 1 deletion src/utils/vector.c
Expand Up @@ -18,15 +18,29 @@ void vector_init(vector *vec) {

void vector_create(vector *vec, unsigned int block_size) {
vec->block_size = block_size;
vec->free_cb = NULL;
vector_init(vec);
}

void vector_create_cb(vector *vec, unsigned int block_size, vector_free_cb free_cb) {
vec->block_size = block_size;
vec->free_cb = free_cb;
vector_init(vec);
}

void vector_clear(vector *vec) {
void *dst;
if(vec->free_cb) {
for(unsigned int i = 0; i < vec->blocks; i++) {
dst = vec->data + i * vec->block_size;
vec->free_cb(dst);
}
}
vec->blocks = 0;
}

void vector_free(vector *vec) {
vec->blocks = 0;
vector_clear(vec);
vec->reserved = 0;
vec->block_size = 0;
omf_free(vec->data);
Expand Down Expand Up @@ -88,6 +102,9 @@ int vector_delete(vector *vec, iterator *iter) {
void *dst = vec->data + real * vec->block_size;
void *src = vec->data + (real + 1) * vec->block_size;
unsigned int size = (vec->blocks - 1 - real) * vec->block_size;
if(vec->free_cb) {
vec->free_cb(dst);
}
memmove(dst, src, size);

// If we are iterating forwards, moving an entry will hop iterator forwards by two.
Expand Down

0 comments on commit 5941a28

Please sign in to comment.