Implement a sparse array / set.
This commit is contained in:
70
src/sprs.c
Normal file
70
src/sprs.c
Normal file
@@ -0,0 +1,70 @@
|
||||
#include "sprs.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
void sprs_init(sprs* sprs){
|
||||
sprs->capacity = 0;
|
||||
sprs->size = 0;
|
||||
sprs->dense = NULL;
|
||||
sprs->sparse = NULL;
|
||||
}
|
||||
libds_result sprs_setup(sprs* sprs, int size){
|
||||
libds_result result = LIBDS_SUCCESS;
|
||||
sprs->sparse = malloc(sizeof(*(sprs->sparse)) * size);
|
||||
sprs->dense = malloc(sizeof(*(sprs->dense)) * size);
|
||||
if(sprs->sparse == NULL || sprs->dense == NULL){
|
||||
free(sprs->sparse);
|
||||
free(sprs->dense);
|
||||
result = LIBDS_MALLOC;
|
||||
} else {
|
||||
sprs->capacity = size;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
void sprs_free(sprs* sprs){
|
||||
free(sprs->sparse);
|
||||
free(sprs->dense);
|
||||
sprs->capacity = 0;
|
||||
sprs->size = 0;
|
||||
sprs->dense = NULL;
|
||||
sprs->sparse = NULL;
|
||||
}
|
||||
void sprs_put(sprs* sprs, int index, void* data){
|
||||
if(index < sprs->capacity && sprs->size < sprs->capacity){
|
||||
sprs->dense[sprs->size++] = index;
|
||||
sprs->sparse[index].index = sprs->size - 1;
|
||||
sprs->sparse[index].data = data;
|
||||
}
|
||||
}
|
||||
int sprs_contains(sprs* sprs, int index){
|
||||
return sprs->sparse[index].index < sprs->size && sprs->dense[sprs->sparse[index].index] == index;
|
||||
}
|
||||
void* sprs_get(sprs* sprs, int index){
|
||||
void* data = NULL;
|
||||
if(sprs_contains(sprs, index)){
|
||||
data = sprs->sparse[index].data;
|
||||
}
|
||||
return data;
|
||||
}
|
||||
void* sprs_find(sprs* sprs, void* data, compare_func compare){
|
||||
int index = 0;
|
||||
void* to_return = NULL;
|
||||
for(; index < sprs->size && to_return == NULL; index++){
|
||||
if(compare(data, sprs->sparse[sprs->dense[index]].data)) {
|
||||
to_return = sprs->sparse[sprs->dense[index]].data;
|
||||
}
|
||||
}
|
||||
return to_return;
|
||||
}
|
||||
int sprs_foreach(sprs* sprs, void* data, compare_func compare, foreach_func foreach, ...){
|
||||
int index = 0;
|
||||
int return_code = 0;
|
||||
va_list args;
|
||||
for(; index < sprs->size && return_code == 0; index++){
|
||||
if(compare(data, sprs->sparse[sprs->dense[index]].data)) {
|
||||
va_start(args, foreach);
|
||||
return_code = foreach(sprs->sparse[sprs->dense[index]].data, args);
|
||||
va_end(args);
|
||||
}
|
||||
}
|
||||
return return_code;
|
||||
}
|
||||
Reference in New Issue
Block a user