summaryrefslogtreecommitdiffstats
path: root/src/htgen.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/htgen.h')
-rw-r--r--src/htgen.h53
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",