]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Feature] Khash: Allow static initialisation
authorVsevolod Stakhov <vsevolod@rspamd.com>
Sat, 17 Jun 2023 13:50:08 +0000 (14:50 +0100)
committerVsevolod Stakhov <vsevolod@rspamd.com>
Sat, 17 Jun 2023 13:50:08 +0000 (14:50 +0100)
contrib/libucl/khash.h

index 0b8a4356de4ea36f504230a44c5e58dc52c7da4b..53eb0e2a800bc0552a7237a149d52e6b6967b064 100644 (file)
@@ -197,11 +197,13 @@ static const double __ac_HASH_UPPER = 0.77;
                khint32_t *flags; \
                khkey_t *keys; \
                khval_t *vals; \
-       } kh_##name##_t;
+       } kh_##name##_t
 
 #define __KHASH_PROTOTYPES(name, khkey_t, khval_t)                                                     \
        extern kh_##name##_t * kh_init_##name(void);                                                    \
+    extern void kh_static_init_##name(kh_##name##_t *);                                                \
        extern void kh_destroy_##name(kh_##name##_t *h);                                                \
+       extern void kh_static_destroy_##name(kh_##name##_t *h);                                 \
        extern void kh_clear_##name(kh_##name##_t *h);                                                  \
        extern khint_t kh_get_##name(const kh_##name##_t *h, khkey_t key);              \
        extern int kh_resize_##name(kh_##name##_t *h, khint_t new_n_buckets);   \
@@ -211,6 +213,9 @@ static const double __ac_HASH_UPPER = 0.77;
 #define __KHASH_IMPL(name, SCOPE, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal) \
        SCOPE kh_##name##_t *kh_init_##name(void) {                                                     \
                return (kh_##name##_t*)kcalloc(1, sizeof(kh_##name##_t));               \
+       }                                                                   \
+    SCOPE void kh_unused(kh_static_init_##name)(kh_##name##_t *target) {\
+               memset(target, 0, sizeof(*target));                                                             \
        }                                                                                                                                       \
        SCOPE void kh_destroy_##name(kh_##name##_t *h)                                          \
        {                                                                                                                                       \
@@ -220,6 +225,10 @@ static const double __ac_HASH_UPPER = 0.77;
                        kfree(h);                                                                                                       \
                }                                                                                                                               \
        }                                                                                                                                       \
+    SCOPE void kh_unused(kh_static_destroy_##name)(kh_##name##_t *h) { \
+                       kfree((void *)h->keys); kfree(h->flags);                                        \
+                       kfree((void *)h->vals);                                                                         \
+       }                                                                                                                                       \
        SCOPE void kh_unused(kh_clear_##name)(kh_##name##_t *h)                         \
        {                                                                                                                                       \
                if (h && h->flags) {                                                                                    \
@@ -346,7 +355,7 @@ static const double __ac_HASH_UPPER = 0.77;
                } else *ret = 0; /* Don't touch h->keys[x] if present and not deleted */ \
                return x;                                                                                                               \
        }                                                                                                                                       \
-       SCOPE void kh_del_##name(kh_##name##_t *h, khint_t x)                           \
+       SCOPE void kh_unused(kh_del_##name)(kh_##name##_t *h, khint_t x)        \
        {                                                                                                                                       \
                if (x != h->n_buckets && !__ac_iseither(h->flags, x)) {                 \
                        __ac_set_isdel_true(h->flags, x);                                                       \
@@ -355,11 +364,11 @@ static const double __ac_HASH_UPPER = 0.77;
        }
 
 #define KHASH_DECLARE(name, khkey_t, khval_t)                                                  \
-       __KHASH_TYPE(name, khkey_t, khval_t)                                                            \
+       __KHASH_TYPE(name, khkey_t, khval_t);                                                           \
        __KHASH_PROTOTYPES(name, khkey_t, khval_t)
 
 #define KHASH_INIT2(name, SCOPE, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal) \
-       __KHASH_TYPE(name, khkey_t, khval_t)                                                            \
+       __KHASH_TYPE(name, khkey_t, khval_t);                                                           \
        __KHASH_IMPL(name, SCOPE, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal)
 
 #define KHASH_INIT(name, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal) \