Data-HashMap
view release on metacpan or search on metacpan
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 )