diff options
Diffstat (limited to 'src/htgen.h')
| -rw-r--r-- | src/htgen.h | 53 |
1 files changed, 45 insertions, 8 deletions
diff --git a/src/htgen.h b/src/htgen.h index 3e22329..3e384ee 100644 --- a/src/htgen.h +++ b/src/htgen.h @@ -116,17 +116,39 @@ void HT__NS(free)(HT__TYPE *ht); void HT__NS(clear)(HT__TYPE *ht); +#ifdef HT_KEY_STATIC_LEN +#define HT__KEYARG(_kn, _kln) HT_KEYTYPE_CREF _kn +#else +#define HT__KEYARG(_kn, _kln) HT_KEYTYPE_CREF _kn, size_t _kln +#endif + +#ifdef HT_VAL_STATIC_LEN +#define HT__VALARG(_vn, _vln) HT_VALTYPE_CREF _vn +#else +#define HT__VALARG(_vn, _vln) HT_VALTYPE_CREF _vn, size_t _vln +#endif + HT_VALTYPE HT__NS(get)(HT__TYPE *ht, HT_KEYTYPE_CREF key, bool *found); -HT_VALTYPE HT__NS(getn)(HT__TYPE *ht, HT_KEYTYPE_CREF key, size_t keylen, bool *found); +HT_VALTYPE HT__NS(getn)(HT__TYPE *ht, HT__KEYARG(key, keylen), bool *found); int HT__NS(put)(HT__TYPE *ht, HT_KEYTYPE_CREF key, HT_VALTYPE_CREF val); -int HT__NS(putn)(HT__TYPE *ht, HT_KEYTYPE_CREF key, size_t keylen, HT_VALTYPE_CREF val, size_t vallen); +int HT__NS(putn)(HT__TYPE *ht, HT__KEYARG(key, keylen), HT__VALARG(val, vallen)); int HT__NS(remove)(HT__TYPE *ht, HT_KEYTYPE_CREF key); -int HT__NS(removen)(HT__TYPE *ht, HT_KEYTYPE_CREF key, size_t keylen); +int HT__NS(removen)(HT__TYPE *ht, HT__KEYARG(key, keylen)); HT_VALTYPE HT__NS(pop)(HT__TYPE *ht, HT_KEYTYPE_CREF key, bool *found); -HT_VALTYPE HT__NS(popn)(HT__TYPE *ht, HT_KEYTYPE_CREF key, size_t keylen, bool *found); +HT_VALTYPE HT__NS(popn)(HT__TYPE *ht, HT__KEYARG(key, keylen), bool *found); + +size_t HT__NS(length)(HT__TYPE *ht); + +struct HT__NS(iter_t) { + size_t internalsz; + void *internalptr; +}; + +struct HT__NS(iter_t) HT__NS(iter_begin)(HT__TYPE *ht); +int HT__NS(iter_next)(struct HT__NS(iter_t) *iter); /* implementations */ @@ -145,20 +167,24 @@ HT_VALTYPE HT__NS(popn)(HT__TYPE *ht, HT_KEYTYPE_CREF key, size_t keylen, bool * #define HT__NODE_KEYLEN(_node) HT_KEY_STATIC_LEN #define HT__NODE_KEYLEN_SET(_node, _unused) #define HT__GUESS_KEYLEN(_node) HT_KEY_STATIC_LEN +#define HT__DEFINE_KEYLEN(_n) size_t _n #else #define HT__NODE_KEYLEN(_node) ((_node)->keylen) #define HT__NODE_KEYLEN_SET(_node, _len) (((_node)->keylen) = (_len)) #define HT__GUESS_KEYLEN(_key) HT_KEY_GUESS_LEN(_key) +#define HT__DEFINE_KEYLEN(_n) ((void)0) #endif #ifdef HT_VAL_STATIC_LEN #define HT__NODE_VALLEN(_node) HT_VAL_STATIC_LEN #define HT__NODE_VALLEN_SET(_node, _unused) #define HT__GUESS_VALLEN(_val) HT_VAL_STATIC_LEN +#define HT__DEFINE_VALLEN(_n) size_t _n #else #define HT__NODE_VALLEN(_node) ((_node)->vallen) #define HT__NODE_VALLEN_SET(_node, _len) (((_node)->vallen) = (_len)) #define HT__GUESS_VALLEN(_val) HT_VAL_GUESS_LEN(_val) +#define HT__DEFINE_VALLEN(_n) ((void)0) #endif #ifndef HT_VAL_FREE @@ -452,8 +478,11 @@ int HT__NS(put)(HT__TYPE *ht, HT_KEYTYPE_CREF key, HT_VALTYPE_CREF val) return HT__NS(putn)(ht, key, 0, val, 0); } -int HT__NS(putn)(HT__TYPE *ht, HT_KEYTYPE_CREF key, size_t keylen, HT_VALTYPE_CREF val, size_t vallen) +int HT__NS(putn)(HT__TYPE *ht, HT__KEYARG(key, keylen), HT__VALARG(val, vallen)) { + HT__DEFINE_KEYLEN(keylen); + HT__DEFINE_VALLEN(vallen); + if (ht->capacity * HT__LOADFACTOR(ht) < (ht->asize + 1)) { if (HT__NS(_rehash)(ht, ht->capacity << 1) < 0) return -1; } @@ -477,8 +506,9 @@ HT_VALTYPE HT__NS(get)(HT__TYPE *ht, HT_KEYTYPE_CREF key, bool *found) return HT__NS(getn)(ht, key, 0, found); } -HT_VALTYPE HT__NS(getn)(HT__TYPE *ht, HT_KEYTYPE_CREF key, size_t keylen, bool *found) +HT_VALTYPE HT__NS(getn)(HT__TYPE *ht, HT__KEYARG(key, keylen), bool *found) { + HT__DEFINE_KEYLEN(keylen); if (!keylen) keylen = HT__GUESS_KEYLEN(key); const HT__HASHTYPE hash = HT_KEY_HASH(key, keylen); @@ -498,8 +528,9 @@ int HT__NS(remove)(HT__TYPE *ht, HT_KEYTYPE_CREF key) return HT__NS(removen)(ht, key, 0); } -int HT__NS(removen)(HT__TYPE *ht, HT_KEYTYPE_CREF key, size_t keylen) +int HT__NS(removen)(HT__TYPE *ht, HT__KEYARG(key, keylen)) { + HT__DEFINE_KEYLEN(keylen); if (!keylen) keylen = HT__GUESS_KEYLEN(key); const HT__HASHTYPE hash = HT_KEY_HASH(key, keylen); @@ -515,8 +546,9 @@ HT_VALTYPE HT__NS(pop)(HT__TYPE *ht, HT_KEYTYPE_CREF key, bool *found) return HT__NS(popn)(ht, key, 0, found); } -HT_VALTYPE HT__NS(popn)(HT__TYPE *ht, HT_KEYTYPE_CREF key, size_t keylen, bool *found) +HT_VALTYPE HT__NS(popn)(HT__TYPE *ht, HT__KEYARG(key, keylen), bool *found) { + HT__DEFINE_KEYLEN(keylen); if (!keylen) keylen = HT__GUESS_KEYLEN(key); const HT__HASHTYPE hash = HT_KEY_HASH(key, keylen); @@ -535,6 +567,11 @@ HT_VALTYPE HT__NS(popn)(HT__TYPE *ht, HT_KEYTYPE_CREF key, size_t keylen, bool * return val; } +size_t HT__NS(length)(HT__TYPE *ht) +{ + return ht->asize; +} + void HT__NS(_debug_table)(HT__TYPE *ht) { fprintf(stderr, HT__STR(HT__TYPE) " debug: cap: %zu, asize: %zu, rsize: %zu, lf: %f\n", |
