Data-HashMap

 view release on metacpan or  search on metacpan

HashMap.xs  view on Meta::CPAN

DEFINE_KW_HOOK(i16a, "I16A", to_hash,    1, build_kw_1arg)
DEFINE_KW_HOOK(i16a, "I16A", put_ttl,    4, build_kw_4arg)
DEFINE_KW_HOOK(i16a, "I16A", get_or_set, 3, build_kw_3arg)

/* IA keywords (int64 -> SV*) */
DEFINE_KW_HOOK(ia, "IA", put,      3, build_kw_3arg)
DEFINE_KW_HOOK(ia, "IA", get,      2, build_kw_2arg)
DEFINE_KW_HOOK(ia, "IA", remove,   2, build_kw_2arg)
DEFINE_KW_HOOK(ia, "IA", take,    2, build_kw_2arg)
DEFINE_KW_HOOK(ia, "IA", drain,   2, build_kw_2arg)
DEFINE_KW_HOOK(ia, "IA", pop,     1, build_kw_1arg)
DEFINE_KW_HOOK(ia, "IA", shift,   1, build_kw_1arg)
DEFINE_KW_HOOK(ia, "IA", reserve, 2, build_kw_2arg)
DEFINE_KW_HOOK(ia, "IA", purge,   1, build_kw_1arg)
DEFINE_KW_HOOK(ia, "IA", capacity, 1, build_kw_1arg)
DEFINE_KW_HOOK(ia, "IA", persist,  2, build_kw_2arg)
DEFINE_KW_HOOK(ia, "IA", swap,    3, build_kw_3arg)
DEFINE_KW_HOOK(ia, "IA", exists,   2, build_kw_2arg)
DEFINE_KW_HOOK(ia, "IA", size,     1, build_kw_1arg)
DEFINE_KW_HOOK(ia, "IA", keys,     1, build_kw_1arg_list)
DEFINE_KW_HOOK(ia, "IA", values,   1, build_kw_1arg_list)
DEFINE_KW_HOOK(ia, "IA", items,    1, build_kw_1arg_list)
DEFINE_KW_HOOK(ia, "IA", max_size, 1, build_kw_1arg)
DEFINE_KW_HOOK(ia, "IA", ttl,      1, build_kw_1arg)
DEFINE_KW_HOOK(ia, "IA", lru_skip, 1, build_kw_1arg)
DEFINE_KW_HOOK(ia, "IA", each,       1, build_kw_1arg_list)
DEFINE_KW_HOOK(ia, "IA", iter_reset, 1, build_kw_1arg)
DEFINE_KW_HOOK(ia, "IA", clear,      1, build_kw_1arg)
DEFINE_KW_HOOK(ia, "IA", to_hash,    1, build_kw_1arg)
DEFINE_KW_HOOK(ia, "IA", put_ttl,    4, build_kw_4arg)
DEFINE_KW_HOOK(ia, "IA", get_or_set, 3, build_kw_3arg)

/* SA keywords (string -> SV*) */
DEFINE_KW_HOOK(sa, "SA", put,      3, build_kw_3arg)
DEFINE_KW_HOOK(sa, "SA", get,      2, build_kw_2arg)
DEFINE_KW_HOOK(sa, "SA", remove,   2, build_kw_2arg)
DEFINE_KW_HOOK(sa, "SA", take,    2, build_kw_2arg)
DEFINE_KW_HOOK(sa, "SA", drain,   2, build_kw_2arg)
DEFINE_KW_HOOK(sa, "SA", pop,     1, build_kw_1arg)
DEFINE_KW_HOOK(sa, "SA", shift,   1, build_kw_1arg)
DEFINE_KW_HOOK(sa, "SA", reserve, 2, build_kw_2arg)
DEFINE_KW_HOOK(sa, "SA", purge,   1, build_kw_1arg)
DEFINE_KW_HOOK(sa, "SA", capacity, 1, build_kw_1arg)
DEFINE_KW_HOOK(sa, "SA", persist,  2, build_kw_2arg)
DEFINE_KW_HOOK(sa, "SA", swap,    3, build_kw_3arg)
DEFINE_KW_HOOK(sa, "SA", exists,   2, build_kw_2arg)
DEFINE_KW_HOOK(sa, "SA", size,     1, build_kw_1arg)
DEFINE_KW_HOOK(sa, "SA", keys,     1, build_kw_1arg_list)
DEFINE_KW_HOOK(sa, "SA", values,   1, build_kw_1arg_list)
DEFINE_KW_HOOK(sa, "SA", items,    1, build_kw_1arg_list)
DEFINE_KW_HOOK(sa, "SA", max_size, 1, build_kw_1arg)
DEFINE_KW_HOOK(sa, "SA", ttl,      1, build_kw_1arg)
DEFINE_KW_HOOK(sa, "SA", lru_skip, 1, build_kw_1arg)
DEFINE_KW_HOOK(sa, "SA", each,       1, build_kw_1arg_list)
DEFINE_KW_HOOK(sa, "SA", iter_reset, 1, build_kw_1arg)
DEFINE_KW_HOOK(sa, "SA", clear,      1, build_kw_1arg)
DEFINE_KW_HOOK(sa, "SA", to_hash,    1, build_kw_1arg)
DEFINE_KW_HOOK(sa, "SA", put_ttl,    4, build_kw_4arg)
DEFINE_KW_HOOK(sa, "SA", get_or_set, 3, build_kw_3arg)

/* ---- Macro to register a keyword ---- */
#define REGISTER_KW(variant, kw, func_name) \
    register_xs_parse_keyword("hm_" #variant "_" #kw, \
        &hooks_hm_##variant##_##kw, (void*)func_name)

/* ---- Live node checks ---- */
#define I16_NODE_LIVE(n)  ((n).key != INT16_MIN && (n).key != (INT16_MIN + 1))
#define I16S_NODE_LIVE(n) I16_NODE_LIVE(n)
#define I32_NODE_LIVE(n)  ((n).key != INT32_MIN && (n).key != (INT32_MIN + 1))
#define I32S_NODE_LIVE(n) I32_NODE_LIVE(n)
#define II_NODE_LIVE(n)   ((n).key != INT64_MIN && (n).key != (INT64_MIN + 1))
#define IS_NODE_LIVE(n)   II_NODE_LIVE(n)
#define STR_NODE_LIVE(n)  ((n).key != NULL && (n).key != &hm_str_tombstone_marker)
#define SI16_NODE_LIVE(n) STR_NODE_LIVE(n)
#define SI32_NODE_LIVE(n) STR_NODE_LIVE(n)
#define SI_NODE_LIVE(n)   STR_NODE_LIVE(n)
#define SS_NODE_LIVE(n)   STR_NODE_LIVE(n)
#define I32A_NODE_LIVE(n) I32_NODE_LIVE(n)
#define I16A_NODE_LIVE(n) I16_NODE_LIVE(n)
#define IA_NODE_LIVE(n)   II_NODE_LIVE(n)
#define SA_NODE_LIVE(n)   STR_NODE_LIVE(n)

/* ---- TTL-aware iteration helper ---- */
#define HM_TTL_SKIP_EXPIRED(self, i, now) \
    (self->expires_at && self->expires_at[i] && (now) > self->expires_at[i])

/* Must match HM_MAYBE_COMPACT in hashmap_generic.h. */
#define HM_MAYBE_COMPACT_XS(self, compact_fn) do { \
    if ((self)->tombstones > (self)->capacity / 4 || \
        ((self)->size > 0 && (self)->tombstones > (self)->size && \
         (self)->tombstones > (self)->capacity / 8)) \
        compact_fn(self); \
} while (0)


MODULE = Data::HashMap    PACKAGE = Data::HashMap::I32
PROTOTYPES: DISABLE

BOOT:
    {
        uint64_t seed = 0;
        size_t seed_len = sizeof(seed) < (size_t)PERL_HASH_SEED_BYTES
                        ? sizeof(seed) : (size_t)PERL_HASH_SEED_BYTES;
        memcpy(&seed, PL_hash_seed, seed_len);
        XXH3_generateSecret_fromSeed(hm_hash_secret, seed);
    }
    boot_xs_parse_keyword(0.40);
    stash_i16  = gv_stashpvn("Data::HashMap::I16",  18, GV_ADD);
    stash_i16a = gv_stashpvn("Data::HashMap::I16A", 19, GV_ADD);
    stash_i16s = gv_stashpvn("Data::HashMap::I16S", 19, GV_ADD);
    stash_i32  = gv_stashpvn("Data::HashMap::I32",  18, GV_ADD);
    stash_i32a = gv_stashpvn("Data::HashMap::I32A", 19, GV_ADD);
    stash_i32s = gv_stashpvn("Data::HashMap::I32S", 19, GV_ADD);
    stash_ia   = gv_stashpvn("Data::HashMap::IA",   17, GV_ADD);
    stash_ii   = gv_stashpvn("Data::HashMap::II",   17, GV_ADD);
    stash_is   = gv_stashpvn("Data::HashMap::IS",   17, GV_ADD);
    stash_sa   = gv_stashpvn("Data::HashMap::SA",   17, GV_ADD);
    stash_si16 = gv_stashpvn("Data::HashMap::SI16", 19, GV_ADD);
    stash_si32 = gv_stashpvn("Data::HashMap::SI32", 19, GV_ADD);
    stash_si   = gv_stashpvn("Data::HashMap::SI",   17, GV_ADD);
    stash_ss   = gv_stashpvn("Data::HashMap::SS",   17, GV_ADD);



( run in 1.127 second using v1.01-cache-2.11-cpan-1236ad508bc )