hfl - hash api for C-lang
typedef struct hfl_node_tag {
int tp; //int/dbl/ptr/str(or struct) == 'i'/'d'/'p'/'s'
char* key;
int i;
double d;
void* p;
void* s;
//..inner data
} hfl_nt;
typedef struct hfl_tag{
uint32_t cnt;
//..inner data
} hfl_t;
hfl_t* hfl_new([uint32_t sz]);
void*
hfl_free(hfl_t*
obj);
hfl_nt*
hfl_unset(hfl_t*
obj,
char*
k);
hfl_nt*
hfl_find(hfl_t*
obj,
char*
k);
#define hfl_set_i(obj,k,v)
#define hfl_set_d(obj,k,v)
#define hfl_set_p(obj,k,v)
#define hfl_set_s(obj,k,ptr,[sz])
#define hfl_foreach(node, obj)
#include "hfl.h"
int main(int argc, char** argv){
hfl_t* obj = hfl_new();
hfl_nt* rp = hfl_set_i(obj, "k1", 12);
puts(rp->key); // "k1"
int tp = rp->tp; // int == 'i'
hfl_unset(obj, "k1"); //del
rp = hfl_set_s(obj, "k2", "hw");
puts(rp->s); // "hw"
rp = hfl_find(obj, "k2");
puts(rp->s); // "hw"
float n = 12.3;
rp = hfl_set_s(obj, "k3", &n, sizeof(float) );
// ag4 isnt >> strdup()
// ag4 exist >> malloc()
n = *(float*)(rp->s);
hfl_foreach(p, obj){
puts(p->key);
hfl_set_i(obj, p->key, 2); //ok, replace/update
hfl_unset(obj, p->key); //ok
// hfl_set_i(obj, "new", 2); //NG, add newkey
p->i = 10; //ok
}
rp = hfl_unset(obj, "k2");
rp = hfl_find(obj, "k2"); //rp == NULL;
int cnt = obj->cnt; //holding keys
hfl_free(obj);
return 0;
}
//~$ cc src.c libhfl.a
c99 hsearch() allows only 1 hash tb in 1 pg. hfl allows to hold many hashtb.
--- bench mark: c_arr, c99hash, hfl, ghash
FAST: c_arr(1) < c99hash == hfl == ghash (20) :SLOW
consume time of get/set is almost the same.
hfl_set_s(obj, key, vptr, [memsz]) saves mem using strdup()/malloc(). use
malloc() if ag4 exist and not 0. buffmem is freed when hfl_free().
-
suc/fail == ptr, int 0 / NULL, int not0
output emsg and exit(1) if fatal err
-
POSIX.1-2001+
Copyright 2022 momi-g, GPLv3+
2022-06-08 v1.0.1 (2022-05-29 v1.0.0)
https://probablydance.com/2017/02/26/i-wrote-the-fastest-hashtable/
https://github.com/skarupke/flat_hash_map