File Coverage

HashMap.xs
Criterion Covered Total %
statement 470 470 100.0
branch 2 2 100.0
condition n/a
subroutine n/a
pod n/a
total 472 472 100.0


line stmt bran cond sub pod time code
1             #define PERL_NO_GET_CONTEXT
2             #include "EXTERN.h"
3             #include "perl.h"
4             #include "XSUB.h"
5              
6             #include "ppport.h"
7              
8             #include "hashmap_i16.h"
9             #include "hashmap_i16s.h"
10             #include "hashmap_si16.h"
11             #include "hashmap_i32.h"
12             #include "hashmap_ii.h"
13             #include "hashmap_is.h"
14             #include "hashmap_si.h"
15             #include "hashmap_ss.h"
16             #include "hashmap_i32s.h"
17             #include "hashmap_si32.h"
18             #include "hashmap_i32a.h"
19             #include "hashmap_i16a.h"
20             #include "hashmap_ia.h"
21             #include "hashmap_sa.h"
22              
23             #include "XSParseKeyword.h"
24              
25             /* ---- Cached stash pointers for fast type checking ---- */
26              
27             static HV* stash_i16;
28             static HV* stash_i16a;
29             static HV* stash_i16s;
30             static HV* stash_i32;
31             static HV* stash_i32a;
32             static HV* stash_i32s;
33             static HV* stash_ia;
34             static HV* stash_ii;
35             static HV* stash_is;
36             static HV* stash_sa;
37             static HV* stash_si16;
38             static HV* stash_si32;
39             static HV* stash_si;
40             static HV* stash_ss;
41              
42             /* ---- Helper macros ---- */
43              
44             #define EXTRACT_MAP(type, stash_var, classname, sv) \
45             if (!SvROK(sv) || !SvOBJECT(SvRV(sv)) || SvSTASH(SvRV(sv)) != stash_var) \
46             croak("Expected a %s object", classname); \
47             type* self = INT2PTR(type*, SvIV(SvRV(sv))); \
48             if (!self) croak("Attempted to use a destroyed %s object", classname)
49              
50             #define HM_MAX_STR_LEN 0x7FFFFFFFU
51              
52             /* Range-check helpers for typemap (called from generated INPUT code) */
53 5           static void croak_i16(IV val) {
54             dTHX;
55 5           Perl_croak(aTHX_ "%" IVdf " out of int16 range [-32768, 32767]", val);
56             }
57 2           static void croak_i32(IV val) {
58             dTHX;
59 2           Perl_croak(aTHX_ "%" IVdf " out of int32 range [-2147483648, 2147483647]", val);
60             }
61              
62             /* SV* value free callback for IA/SA variants */
63 243804           static void hm_sv_free(void* sv) {
64             dTHX;
65 243804           SvREFCNT_dec((SV*)sv);
66 243804           }
67              
68             /* Zero-copy SV from internal string buffer (opt-in via get_direct).
69             * Returns a read-only SV pointing directly at the map's internal buffer.
70             * SvLEN=0 tells Perl not to free the buffer; SvREADONLY prevents writes.
71             * Caller must not hold the SV past any map mutation (put/remove/clear). */
72 9           static inline SV* hm_zerocopy_sv(pTHX_ const char* buf, uint32_t len, bool is_utf8) {
73 9           SV* sv = newSV_type(SVt_PV);
74 9           SvPV_set(sv, (char*)buf);
75 9           SvCUR_set(sv, len);
76 9           SvLEN_set(sv, 0);
77 9           SvPOK_on(sv);
78 9           SvREADONLY_on(sv);
79 9 100         if (is_utf8) SvUTF8_on(sv);
80 9           return sv;
81             }
82              
83             #define EXTRACT_STR_KEY(sv) \
84             STRLEN _klen; \
85             const char* _kstr = SvPV(sv, _klen); \
86             if (_klen > HM_MAX_STR_LEN) croak("key too long (max 2GB)"); \
87             bool _kutf8 = SvUTF8(sv) ? true : false; \
88             uint32_t _khash = hm_hash_string(_kstr, (uint32_t)_klen); \
89             (void)_kutf8
90              
91             #define EXTRACT_STR_VAL(sv) \
92             STRLEN _vlen; \
93             const char* _vstr = SvPV(sv, _vlen); \
94             if (_vlen > HM_MAX_STR_LEN) croak("value too long (max 2GB)"); \
95             bool _vutf8 = SvUTF8(sv) ? true : false
96              
97             /* ---- Extract optional (max_size, default_ttl) from new() args ---- */
98              
99             #define EXTRACT_NEW_ARGS(max_size_var, ttl_var, lru_skip_var) \
100             size_t max_size_var = 0; \
101             uint32_t ttl_var = 0; \
102             uint32_t lru_skip_var = 0; \
103             if (items > 1) max_size_var = (size_t)SvUV(ST(1)); \
104             if (items > 2) ttl_var = (uint32_t)SvUV(ST(2)); \
105             if (items > 3) lru_skip_var = (uint32_t)SvUV(ST(3))
106              
107             /* ---- Generic keyword build functions ---- */
108              
109 255           static int build_kw_1arg(pTHX_ OP **out, XSParseKeywordPiece *args[], size_t nargs, void *hookdata) {
110             (void)nargs;
111 255           const char *func = (const char *)hookdata;
112 255           OP *map_op = args[0]->op;
113 255           OP *cvref = newCVREF(0, newGVOP(OP_GV, 0, gv_fetchpv(func, GV_ADD, SVt_PVCV)));
114 255           OP *arglist = op_append_elem(OP_LIST, map_op, cvref);
115 255           *out = op_convert_list(OP_ENTERSUB, OPf_STACKED, arglist);
116 255           return KEYWORD_PLUGIN_EXPR;
117             }
118              
119 574           static int build_kw_2arg(pTHX_ OP **out, XSParseKeywordPiece *args[], size_t nargs, void *hookdata) {
120             (void)nargs;
121 574           const char *func = (const char *)hookdata;
122 574           OP *map_op = args[0]->op;
123 574           OP *key_op = args[1]->op;
124 574           OP *cvref = newCVREF(0, newGVOP(OP_GV, 0, gv_fetchpv(func, GV_ADD, SVt_PVCV)));
125 574           OP *arglist = op_append_elem(OP_LIST, map_op, key_op);
126 574           arglist = op_append_elem(OP_LIST, arglist, cvref);
127 574           *out = op_convert_list(OP_ENTERSUB, OPf_STACKED, arglist);
128 574           return KEYWORD_PLUGIN_EXPR;
129             }
130              
131 677           static int build_kw_3arg(pTHX_ OP **out, XSParseKeywordPiece *args[], size_t nargs, void *hookdata) {
132             (void)nargs;
133 677           const char *func = (const char *)hookdata;
134 677           OP *map_op = args[0]->op;
135 677           OP *key_op = args[1]->op;
136 677           OP *val_op = args[2]->op;
137 677           OP *cvref = newCVREF(0, newGVOP(OP_GV, 0, gv_fetchpv(func, GV_ADD, SVt_PVCV)));
138 677           OP *arglist = op_append_elem(OP_LIST, map_op, key_op);
139 677           arglist = op_append_elem(OP_LIST, arglist, val_op);
140 677           arglist = op_append_elem(OP_LIST, arglist, cvref);
141 677           *out = op_convert_list(OP_ENTERSUB, OPf_STACKED, arglist);
142 677           return KEYWORD_PLUGIN_EXPR;
143             }
144              
145              
146 17           static int build_kw_4arg(pTHX_ OP **out, XSParseKeywordPiece *args[], size_t nargs, void *hookdata) {
147             (void)nargs;
148 17           const char *func = (const char *)hookdata;
149 17           OP *map_op = args[0]->op;
150 17           OP *key_op = args[1]->op;
151 17           OP *val_op = args[2]->op;
152 17           OP *ttl_op = args[3]->op;
153 17           OP *cvref = newCVREF(0, newGVOP(OP_GV, 0, gv_fetchpv(func, GV_ADD, SVt_PVCV)));
154 17           OP *arglist = op_append_elem(OP_LIST, map_op, key_op);
155 17           arglist = op_append_elem(OP_LIST, arglist, val_op);
156 17           arglist = op_append_elem(OP_LIST, arglist, ttl_op);
157 17           arglist = op_append_elem(OP_LIST, arglist, cvref);
158 17           *out = op_convert_list(OP_ENTERSUB, OPf_STACKED, arglist);
159 17           return KEYWORD_PLUGIN_EXPR;
160             }
161              
162             /* list-returning variant for keys/values/items */
163 112           static int build_kw_1arg_list(pTHX_ OP **out, XSParseKeywordPiece *args[], size_t nargs, void *hookdata) {
164             (void)nargs;
165 112           const char *func = (const char *)hookdata;
166 112           OP *map_op = args[0]->op;
167 112           OP *cvref = newCVREF(0, newGVOP(OP_GV, 0, gv_fetchpv(func, GV_ADD, SVt_PVCV)));
168 112           OP *arglist = op_append_elem(OP_LIST, map_op, cvref);
169 112           *out = op_convert_list(OP_ENTERSUB, OPf_STACKED | OPf_WANT_LIST, arglist);
170 112           return KEYWORD_PLUGIN_EXPR;
171             }
172              
173             /* ---- Keyword pieces ---- */
174              
175             static const struct XSParseKeywordPieceType pieces_1expr[] = {
176             XPK_TERMEXPR, {0}
177             };
178              
179             static const struct XSParseKeywordPieceType pieces_2expr[] = {
180             XPK_TERMEXPR, XPK_COMMA, XPK_TERMEXPR, {0}
181             };
182              
183             static const struct XSParseKeywordPieceType pieces_3expr[] = {
184             XPK_TERMEXPR, XPK_COMMA, XPK_TERMEXPR, XPK_COMMA, XPK_TERMEXPR, {0}
185             };
186             static const struct XSParseKeywordPieceType pieces_4expr[] = {
187             XPK_TERMEXPR, XPK_COMMA, XPK_TERMEXPR, XPK_COMMA, XPK_TERMEXPR, XPK_COMMA, XPK_TERMEXPR, {0}
188             };
189              
190              
191             /* ---- Keyword hook definitions ----
192             *
193             * Macro to define a keyword hook struct.
194             * variant = i16, i16a, i16s, i32, i32a, i32s, ia, ii, is, sa, si16, si32, si, ss
195             * kw = keyword name (e.g., put, get)
196             * nargs = 1, 2, or 3
197             * builder = build function (build_kw_1arg, build_kw_2arg, etc.)
198             */
199             #define DEFINE_KW_HOOK(variant, PKG, kw, nargs, builder) \
200             static const struct XSParseKeywordHooks hooks_hm_##variant##_##kw = { \
201             .flags = XPK_FLAG_EXPR, \
202             .permit_hintkey = "Data::HashMap::" PKG "/hm_" #variant "_" #kw, \
203             .pieces = pieces_##nargs##expr, \
204             .build = builder, \
205             };
206              
207             /* I16 keywords */
208             DEFINE_KW_HOOK(i16, "I16", put, 3, build_kw_3arg)
209             DEFINE_KW_HOOK(i16, "I16", get, 2, build_kw_2arg)
210             DEFINE_KW_HOOK(i16, "I16", remove, 2, build_kw_2arg)
211             DEFINE_KW_HOOK(i16, "I16", take, 2, build_kw_2arg)
212             DEFINE_KW_HOOK(i16, "I16", drain, 2, build_kw_2arg)
213             DEFINE_KW_HOOK(i16, "I16", pop, 1, build_kw_1arg)
214             DEFINE_KW_HOOK(i16, "I16", shift, 1, build_kw_1arg)
215             DEFINE_KW_HOOK(i16, "I16", reserve, 2, build_kw_2arg)
216             DEFINE_KW_HOOK(i16, "I16", purge, 1, build_kw_1arg)
217             DEFINE_KW_HOOK(i16, "I16", capacity, 1, build_kw_1arg)
218             DEFINE_KW_HOOK(i16, "I16", persist, 2, build_kw_2arg)
219             DEFINE_KW_HOOK(i16, "I16", swap, 3, build_kw_3arg)
220             DEFINE_KW_HOOK(i16, "I16", cas, 4, build_kw_4arg)
221             DEFINE_KW_HOOK(i16, "I16", exists, 2, build_kw_2arg)
222             DEFINE_KW_HOOK(i16, "I16", incr, 2, build_kw_2arg)
223             DEFINE_KW_HOOK(i16, "I16", decr, 2, build_kw_2arg)
224             DEFINE_KW_HOOK(i16, "I16", incr_by, 3, build_kw_3arg)
225             DEFINE_KW_HOOK(i16, "I16", size, 1, build_kw_1arg)
226             DEFINE_KW_HOOK(i16, "I16", keys, 1, build_kw_1arg_list)
227             DEFINE_KW_HOOK(i16, "I16", values, 1, build_kw_1arg_list)
228             DEFINE_KW_HOOK(i16, "I16", items, 1, build_kw_1arg_list)
229             DEFINE_KW_HOOK(i16, "I16", max_size, 1, build_kw_1arg)
230             DEFINE_KW_HOOK(i16, "I16", ttl, 1, build_kw_1arg)
231             DEFINE_KW_HOOK(i16, "I16", lru_skip, 1, build_kw_1arg)
232             DEFINE_KW_HOOK(i16, "I16", each, 1, build_kw_1arg_list)
233             DEFINE_KW_HOOK(i16, "I16", iter_reset, 1, build_kw_1arg)
234             DEFINE_KW_HOOK(i16, "I16", clear, 1, build_kw_1arg)
235             DEFINE_KW_HOOK(i16, "I16", to_hash, 1, build_kw_1arg)
236             DEFINE_KW_HOOK(i16, "I16", put_ttl, 4, build_kw_4arg)
237             DEFINE_KW_HOOK(i16, "I16", get_or_set, 3, build_kw_3arg)
238              
239             /* I16S keywords (int16 -> string) */
240             DEFINE_KW_HOOK(i16s, "I16S", put, 3, build_kw_3arg)
241             DEFINE_KW_HOOK(i16s, "I16S", get, 2, build_kw_2arg)
242             DEFINE_KW_HOOK(i16s, "I16S", remove, 2, build_kw_2arg)
243             DEFINE_KW_HOOK(i16s, "I16S", take, 2, build_kw_2arg)
244             DEFINE_KW_HOOK(i16s, "I16S", drain, 2, build_kw_2arg)
245             DEFINE_KW_HOOK(i16s, "I16S", pop, 1, build_kw_1arg)
246             DEFINE_KW_HOOK(i16s, "I16S", shift, 1, build_kw_1arg)
247             DEFINE_KW_HOOK(i16s, "I16S", reserve, 2, build_kw_2arg)
248             DEFINE_KW_HOOK(i16s, "I16S", purge, 1, build_kw_1arg)
249             DEFINE_KW_HOOK(i16s, "I16S", capacity, 1, build_kw_1arg)
250             DEFINE_KW_HOOK(i16s, "I16S", persist, 2, build_kw_2arg)
251             DEFINE_KW_HOOK(i16s, "I16S", swap, 3, build_kw_3arg)
252             DEFINE_KW_HOOK(i16s, "I16S", exists, 2, build_kw_2arg)
253             DEFINE_KW_HOOK(i16s, "I16S", size, 1, build_kw_1arg)
254             DEFINE_KW_HOOK(i16s, "I16S", keys, 1, build_kw_1arg_list)
255             DEFINE_KW_HOOK(i16s, "I16S", values, 1, build_kw_1arg_list)
256             DEFINE_KW_HOOK(i16s, "I16S", items, 1, build_kw_1arg_list)
257             DEFINE_KW_HOOK(i16s, "I16S", max_size, 1, build_kw_1arg)
258             DEFINE_KW_HOOK(i16s, "I16S", ttl, 1, build_kw_1arg)
259             DEFINE_KW_HOOK(i16s, "I16S", lru_skip, 1, build_kw_1arg)
260             DEFINE_KW_HOOK(i16s, "I16S", each, 1, build_kw_1arg_list)
261             DEFINE_KW_HOOK(i16s, "I16S", iter_reset, 1, build_kw_1arg)
262             DEFINE_KW_HOOK(i16s, "I16S", clear, 1, build_kw_1arg)
263             DEFINE_KW_HOOK(i16s, "I16S", to_hash, 1, build_kw_1arg)
264             DEFINE_KW_HOOK(i16s, "I16S", put_ttl, 4, build_kw_4arg)
265             DEFINE_KW_HOOK(i16s, "I16S", get_or_set, 3, build_kw_3arg)
266             DEFINE_KW_HOOK(i16s, "I16S", get_direct, 2, build_kw_2arg)
267              
268             /* SI16 keywords (string -> int16) */
269             DEFINE_KW_HOOK(si16, "SI16", put, 3, build_kw_3arg)
270             DEFINE_KW_HOOK(si16, "SI16", get, 2, build_kw_2arg)
271             DEFINE_KW_HOOK(si16, "SI16", remove, 2, build_kw_2arg)
272             DEFINE_KW_HOOK(si16, "SI16", take, 2, build_kw_2arg)
273             DEFINE_KW_HOOK(si16, "SI16", drain, 2, build_kw_2arg)
274             DEFINE_KW_HOOK(si16, "SI16", pop, 1, build_kw_1arg)
275             DEFINE_KW_HOOK(si16, "SI16", shift, 1, build_kw_1arg)
276             DEFINE_KW_HOOK(si16, "SI16", reserve, 2, build_kw_2arg)
277             DEFINE_KW_HOOK(si16, "SI16", purge, 1, build_kw_1arg)
278             DEFINE_KW_HOOK(si16, "SI16", capacity, 1, build_kw_1arg)
279             DEFINE_KW_HOOK(si16, "SI16", persist, 2, build_kw_2arg)
280             DEFINE_KW_HOOK(si16, "SI16", swap, 3, build_kw_3arg)
281             DEFINE_KW_HOOK(si16, "SI16", cas, 4, build_kw_4arg)
282             DEFINE_KW_HOOK(si16, "SI16", exists, 2, build_kw_2arg)
283             DEFINE_KW_HOOK(si16, "SI16", incr, 2, build_kw_2arg)
284             DEFINE_KW_HOOK(si16, "SI16", decr, 2, build_kw_2arg)
285             DEFINE_KW_HOOK(si16, "SI16", incr_by, 3, build_kw_3arg)
286             DEFINE_KW_HOOK(si16, "SI16", size, 1, build_kw_1arg)
287             DEFINE_KW_HOOK(si16, "SI16", keys, 1, build_kw_1arg_list)
288             DEFINE_KW_HOOK(si16, "SI16", values, 1, build_kw_1arg_list)
289             DEFINE_KW_HOOK(si16, "SI16", items, 1, build_kw_1arg_list)
290             DEFINE_KW_HOOK(si16, "SI16", max_size, 1, build_kw_1arg)
291             DEFINE_KW_HOOK(si16, "SI16", ttl, 1, build_kw_1arg)
292             DEFINE_KW_HOOK(si16, "SI16", lru_skip, 1, build_kw_1arg)
293             DEFINE_KW_HOOK(si16, "SI16", each, 1, build_kw_1arg_list)
294             DEFINE_KW_HOOK(si16, "SI16", iter_reset, 1, build_kw_1arg)
295             DEFINE_KW_HOOK(si16, "SI16", clear, 1, build_kw_1arg)
296             DEFINE_KW_HOOK(si16, "SI16", to_hash, 1, build_kw_1arg)
297             DEFINE_KW_HOOK(si16, "SI16", put_ttl, 4, build_kw_4arg)
298             DEFINE_KW_HOOK(si16, "SI16", get_or_set, 3, build_kw_3arg)
299              
300             /* I32 keywords */
301             DEFINE_KW_HOOK(i32, "I32", put, 3, build_kw_3arg)
302             DEFINE_KW_HOOK(i32, "I32", get, 2, build_kw_2arg)
303             DEFINE_KW_HOOK(i32, "I32", remove, 2, build_kw_2arg)
304             DEFINE_KW_HOOK(i32, "I32", take, 2, build_kw_2arg)
305             DEFINE_KW_HOOK(i32, "I32", drain, 2, build_kw_2arg)
306             DEFINE_KW_HOOK(i32, "I32", pop, 1, build_kw_1arg)
307             DEFINE_KW_HOOK(i32, "I32", shift, 1, build_kw_1arg)
308             DEFINE_KW_HOOK(i32, "I32", reserve, 2, build_kw_2arg)
309             DEFINE_KW_HOOK(i32, "I32", purge, 1, build_kw_1arg)
310             DEFINE_KW_HOOK(i32, "I32", capacity, 1, build_kw_1arg)
311             DEFINE_KW_HOOK(i32, "I32", persist, 2, build_kw_2arg)
312             DEFINE_KW_HOOK(i32, "I32", swap, 3, build_kw_3arg)
313             DEFINE_KW_HOOK(i32, "I32", cas, 4, build_kw_4arg)
314             DEFINE_KW_HOOK(i32, "I32", exists, 2, build_kw_2arg)
315             DEFINE_KW_HOOK(i32, "I32", incr, 2, build_kw_2arg)
316             DEFINE_KW_HOOK(i32, "I32", decr, 2, build_kw_2arg)
317             DEFINE_KW_HOOK(i32, "I32", incr_by, 3, build_kw_3arg)
318             DEFINE_KW_HOOK(i32, "I32", size, 1, build_kw_1arg)
319             DEFINE_KW_HOOK(i32, "I32", keys, 1, build_kw_1arg_list)
320             DEFINE_KW_HOOK(i32, "I32", values, 1, build_kw_1arg_list)
321             DEFINE_KW_HOOK(i32, "I32", items, 1, build_kw_1arg_list)
322             DEFINE_KW_HOOK(i32, "I32", max_size, 1, build_kw_1arg)
323             DEFINE_KW_HOOK(i32, "I32", ttl, 1, build_kw_1arg)
324             DEFINE_KW_HOOK(i32, "I32", lru_skip, 1, build_kw_1arg)
325             DEFINE_KW_HOOK(i32, "I32", each, 1, build_kw_1arg_list)
326             DEFINE_KW_HOOK(i32, "I32", iter_reset, 1, build_kw_1arg)
327             DEFINE_KW_HOOK(i32, "I32", clear, 1, build_kw_1arg)
328             DEFINE_KW_HOOK(i32, "I32", to_hash, 1, build_kw_1arg)
329             DEFINE_KW_HOOK(i32, "I32", put_ttl, 4, build_kw_4arg)
330             DEFINE_KW_HOOK(i32, "I32", get_or_set, 3, build_kw_3arg)
331              
332             /* II keywords */
333             DEFINE_KW_HOOK(ii, "II", put, 3, build_kw_3arg)
334             DEFINE_KW_HOOK(ii, "II", get, 2, build_kw_2arg)
335             DEFINE_KW_HOOK(ii, "II", remove, 2, build_kw_2arg)
336             DEFINE_KW_HOOK(ii, "II", take, 2, build_kw_2arg)
337             DEFINE_KW_HOOK(ii, "II", drain, 2, build_kw_2arg)
338             DEFINE_KW_HOOK(ii, "II", pop, 1, build_kw_1arg)
339             DEFINE_KW_HOOK(ii, "II", shift, 1, build_kw_1arg)
340             DEFINE_KW_HOOK(ii, "II", reserve, 2, build_kw_2arg)
341             DEFINE_KW_HOOK(ii, "II", purge, 1, build_kw_1arg)
342             DEFINE_KW_HOOK(ii, "II", capacity, 1, build_kw_1arg)
343             DEFINE_KW_HOOK(ii, "II", persist, 2, build_kw_2arg)
344             DEFINE_KW_HOOK(ii, "II", swap, 3, build_kw_3arg)
345             DEFINE_KW_HOOK(ii, "II", cas, 4, build_kw_4arg)
346             DEFINE_KW_HOOK(ii, "II", exists, 2, build_kw_2arg)
347             DEFINE_KW_HOOK(ii, "II", incr, 2, build_kw_2arg)
348             DEFINE_KW_HOOK(ii, "II", decr, 2, build_kw_2arg)
349             DEFINE_KW_HOOK(ii, "II", incr_by, 3, build_kw_3arg)
350             DEFINE_KW_HOOK(ii, "II", size, 1, build_kw_1arg)
351             DEFINE_KW_HOOK(ii, "II", keys, 1, build_kw_1arg_list)
352             DEFINE_KW_HOOK(ii, "II", values, 1, build_kw_1arg_list)
353             DEFINE_KW_HOOK(ii, "II", items, 1, build_kw_1arg_list)
354             DEFINE_KW_HOOK(ii, "II", max_size, 1, build_kw_1arg)
355             DEFINE_KW_HOOK(ii, "II", ttl, 1, build_kw_1arg)
356             DEFINE_KW_HOOK(ii, "II", lru_skip, 1, build_kw_1arg)
357             DEFINE_KW_HOOK(ii, "II", each, 1, build_kw_1arg_list)
358             DEFINE_KW_HOOK(ii, "II", iter_reset, 1, build_kw_1arg)
359             DEFINE_KW_HOOK(ii, "II", clear, 1, build_kw_1arg)
360             DEFINE_KW_HOOK(ii, "II", to_hash, 1, build_kw_1arg)
361             DEFINE_KW_HOOK(ii, "II", put_ttl, 4, build_kw_4arg)
362             DEFINE_KW_HOOK(ii, "II", get_or_set, 3, build_kw_3arg)
363              
364             /* IS keywords */
365             DEFINE_KW_HOOK(is, "IS", put, 3, build_kw_3arg)
366             DEFINE_KW_HOOK(is, "IS", get, 2, build_kw_2arg)
367             DEFINE_KW_HOOK(is, "IS", remove, 2, build_kw_2arg)
368             DEFINE_KW_HOOK(is, "IS", take, 2, build_kw_2arg)
369             DEFINE_KW_HOOK(is, "IS", drain, 2, build_kw_2arg)
370             DEFINE_KW_HOOK(is, "IS", pop, 1, build_kw_1arg)
371             DEFINE_KW_HOOK(is, "IS", shift, 1, build_kw_1arg)
372             DEFINE_KW_HOOK(is, "IS", reserve, 2, build_kw_2arg)
373             DEFINE_KW_HOOK(is, "IS", purge, 1, build_kw_1arg)
374             DEFINE_KW_HOOK(is, "IS", capacity, 1, build_kw_1arg)
375             DEFINE_KW_HOOK(is, "IS", persist, 2, build_kw_2arg)
376             DEFINE_KW_HOOK(is, "IS", swap, 3, build_kw_3arg)
377             DEFINE_KW_HOOK(is, "IS", exists, 2, build_kw_2arg)
378             DEFINE_KW_HOOK(is, "IS", size, 1, build_kw_1arg)
379             DEFINE_KW_HOOK(is, "IS", keys, 1, build_kw_1arg_list)
380             DEFINE_KW_HOOK(is, "IS", values, 1, build_kw_1arg_list)
381             DEFINE_KW_HOOK(is, "IS", items, 1, build_kw_1arg_list)
382             DEFINE_KW_HOOK(is, "IS", max_size, 1, build_kw_1arg)
383             DEFINE_KW_HOOK(is, "IS", ttl, 1, build_kw_1arg)
384             DEFINE_KW_HOOK(is, "IS", lru_skip, 1, build_kw_1arg)
385             DEFINE_KW_HOOK(is, "IS", each, 1, build_kw_1arg_list)
386             DEFINE_KW_HOOK(is, "IS", iter_reset, 1, build_kw_1arg)
387             DEFINE_KW_HOOK(is, "IS", clear, 1, build_kw_1arg)
388             DEFINE_KW_HOOK(is, "IS", to_hash, 1, build_kw_1arg)
389             DEFINE_KW_HOOK(is, "IS", put_ttl, 4, build_kw_4arg)
390             DEFINE_KW_HOOK(is, "IS", get_or_set, 3, build_kw_3arg)
391             DEFINE_KW_HOOK(is, "IS", get_direct, 2, build_kw_2arg)
392              
393             /* SI keywords */
394             DEFINE_KW_HOOK(si, "SI", put, 3, build_kw_3arg)
395             DEFINE_KW_HOOK(si, "SI", get, 2, build_kw_2arg)
396             DEFINE_KW_HOOK(si, "SI", remove, 2, build_kw_2arg)
397             DEFINE_KW_HOOK(si, "SI", take, 2, build_kw_2arg)
398             DEFINE_KW_HOOK(si, "SI", drain, 2, build_kw_2arg)
399             DEFINE_KW_HOOK(si, "SI", pop, 1, build_kw_1arg)
400             DEFINE_KW_HOOK(si, "SI", shift, 1, build_kw_1arg)
401             DEFINE_KW_HOOK(si, "SI", reserve, 2, build_kw_2arg)
402             DEFINE_KW_HOOK(si, "SI", purge, 1, build_kw_1arg)
403             DEFINE_KW_HOOK(si, "SI", capacity, 1, build_kw_1arg)
404             DEFINE_KW_HOOK(si, "SI", persist, 2, build_kw_2arg)
405             DEFINE_KW_HOOK(si, "SI", swap, 3, build_kw_3arg)
406             DEFINE_KW_HOOK(si, "SI", cas, 4, build_kw_4arg)
407             DEFINE_KW_HOOK(si, "SI", exists, 2, build_kw_2arg)
408             DEFINE_KW_HOOK(si, "SI", incr, 2, build_kw_2arg)
409             DEFINE_KW_HOOK(si, "SI", decr, 2, build_kw_2arg)
410             DEFINE_KW_HOOK(si, "SI", incr_by, 3, build_kw_3arg)
411             DEFINE_KW_HOOK(si, "SI", size, 1, build_kw_1arg)
412             DEFINE_KW_HOOK(si, "SI", keys, 1, build_kw_1arg_list)
413             DEFINE_KW_HOOK(si, "SI", values, 1, build_kw_1arg_list)
414             DEFINE_KW_HOOK(si, "SI", items, 1, build_kw_1arg_list)
415             DEFINE_KW_HOOK(si, "SI", max_size, 1, build_kw_1arg)
416             DEFINE_KW_HOOK(si, "SI", ttl, 1, build_kw_1arg)
417             DEFINE_KW_HOOK(si, "SI", lru_skip, 1, build_kw_1arg)
418             DEFINE_KW_HOOK(si, "SI", each, 1, build_kw_1arg_list)
419             DEFINE_KW_HOOK(si, "SI", iter_reset, 1, build_kw_1arg)
420             DEFINE_KW_HOOK(si, "SI", clear, 1, build_kw_1arg)
421             DEFINE_KW_HOOK(si, "SI", to_hash, 1, build_kw_1arg)
422             DEFINE_KW_HOOK(si, "SI", put_ttl, 4, build_kw_4arg)
423             DEFINE_KW_HOOK(si, "SI", get_or_set, 3, build_kw_3arg)
424              
425             /* SS keywords */
426             DEFINE_KW_HOOK(ss, "SS", put, 3, build_kw_3arg)
427             DEFINE_KW_HOOK(ss, "SS", get, 2, build_kw_2arg)
428             DEFINE_KW_HOOK(ss, "SS", remove, 2, build_kw_2arg)
429             DEFINE_KW_HOOK(ss, "SS", take, 2, build_kw_2arg)
430             DEFINE_KW_HOOK(ss, "SS", drain, 2, build_kw_2arg)
431             DEFINE_KW_HOOK(ss, "SS", pop, 1, build_kw_1arg)
432             DEFINE_KW_HOOK(ss, "SS", shift, 1, build_kw_1arg)
433             DEFINE_KW_HOOK(ss, "SS", reserve, 2, build_kw_2arg)
434             DEFINE_KW_HOOK(ss, "SS", purge, 1, build_kw_1arg)
435             DEFINE_KW_HOOK(ss, "SS", capacity, 1, build_kw_1arg)
436             DEFINE_KW_HOOK(ss, "SS", persist, 2, build_kw_2arg)
437             DEFINE_KW_HOOK(ss, "SS", swap, 3, build_kw_3arg)
438             DEFINE_KW_HOOK(ss, "SS", exists, 2, build_kw_2arg)
439             DEFINE_KW_HOOK(ss, "SS", size, 1, build_kw_1arg)
440             DEFINE_KW_HOOK(ss, "SS", keys, 1, build_kw_1arg_list)
441             DEFINE_KW_HOOK(ss, "SS", values, 1, build_kw_1arg_list)
442             DEFINE_KW_HOOK(ss, "SS", items, 1, build_kw_1arg_list)
443             DEFINE_KW_HOOK(ss, "SS", max_size, 1, build_kw_1arg)
444             DEFINE_KW_HOOK(ss, "SS", ttl, 1, build_kw_1arg)
445             DEFINE_KW_HOOK(ss, "SS", lru_skip, 1, build_kw_1arg)
446             DEFINE_KW_HOOK(ss, "SS", each, 1, build_kw_1arg_list)
447             DEFINE_KW_HOOK(ss, "SS", iter_reset, 1, build_kw_1arg)
448             DEFINE_KW_HOOK(ss, "SS", clear, 1, build_kw_1arg)
449             DEFINE_KW_HOOK(ss, "SS", to_hash, 1, build_kw_1arg)
450             DEFINE_KW_HOOK(ss, "SS", put_ttl, 4, build_kw_4arg)
451             DEFINE_KW_HOOK(ss, "SS", get_or_set, 3, build_kw_3arg)
452             DEFINE_KW_HOOK(ss, "SS", get_direct, 2, build_kw_2arg)
453              
454             /* I32S keywords (int32 -> string) */
455             DEFINE_KW_HOOK(i32s, "I32S", put, 3, build_kw_3arg)
456             DEFINE_KW_HOOK(i32s, "I32S", get, 2, build_kw_2arg)
457             DEFINE_KW_HOOK(i32s, "I32S", remove, 2, build_kw_2arg)
458             DEFINE_KW_HOOK(i32s, "I32S", take, 2, build_kw_2arg)
459             DEFINE_KW_HOOK(i32s, "I32S", drain, 2, build_kw_2arg)
460             DEFINE_KW_HOOK(i32s, "I32S", pop, 1, build_kw_1arg)
461             DEFINE_KW_HOOK(i32s, "I32S", shift, 1, build_kw_1arg)
462             DEFINE_KW_HOOK(i32s, "I32S", reserve, 2, build_kw_2arg)
463             DEFINE_KW_HOOK(i32s, "I32S", purge, 1, build_kw_1arg)
464             DEFINE_KW_HOOK(i32s, "I32S", capacity, 1, build_kw_1arg)
465             DEFINE_KW_HOOK(i32s, "I32S", persist, 2, build_kw_2arg)
466             DEFINE_KW_HOOK(i32s, "I32S", swap, 3, build_kw_3arg)
467             DEFINE_KW_HOOK(i32s, "I32S", exists, 2, build_kw_2arg)
468             DEFINE_KW_HOOK(i32s, "I32S", size, 1, build_kw_1arg)
469             DEFINE_KW_HOOK(i32s, "I32S", keys, 1, build_kw_1arg_list)
470             DEFINE_KW_HOOK(i32s, "I32S", values, 1, build_kw_1arg_list)
471             DEFINE_KW_HOOK(i32s, "I32S", items, 1, build_kw_1arg_list)
472             DEFINE_KW_HOOK(i32s, "I32S", max_size, 1, build_kw_1arg)
473             DEFINE_KW_HOOK(i32s, "I32S", ttl, 1, build_kw_1arg)
474             DEFINE_KW_HOOK(i32s, "I32S", lru_skip, 1, build_kw_1arg)
475             DEFINE_KW_HOOK(i32s, "I32S", each, 1, build_kw_1arg_list)
476             DEFINE_KW_HOOK(i32s, "I32S", iter_reset, 1, build_kw_1arg)
477             DEFINE_KW_HOOK(i32s, "I32S", clear, 1, build_kw_1arg)
478             DEFINE_KW_HOOK(i32s, "I32S", to_hash, 1, build_kw_1arg)
479             DEFINE_KW_HOOK(i32s, "I32S", put_ttl, 4, build_kw_4arg)
480             DEFINE_KW_HOOK(i32s, "I32S", get_or_set, 3, build_kw_3arg)
481             DEFINE_KW_HOOK(i32s, "I32S", get_direct, 2, build_kw_2arg)
482              
483             /* SI32 keywords (string -> int32) */
484             DEFINE_KW_HOOK(si32, "SI32", put, 3, build_kw_3arg)
485             DEFINE_KW_HOOK(si32, "SI32", get, 2, build_kw_2arg)
486             DEFINE_KW_HOOK(si32, "SI32", remove, 2, build_kw_2arg)
487             DEFINE_KW_HOOK(si32, "SI32", take, 2, build_kw_2arg)
488             DEFINE_KW_HOOK(si32, "SI32", drain, 2, build_kw_2arg)
489             DEFINE_KW_HOOK(si32, "SI32", pop, 1, build_kw_1arg)
490             DEFINE_KW_HOOK(si32, "SI32", shift, 1, build_kw_1arg)
491             DEFINE_KW_HOOK(si32, "SI32", reserve, 2, build_kw_2arg)
492             DEFINE_KW_HOOK(si32, "SI32", purge, 1, build_kw_1arg)
493             DEFINE_KW_HOOK(si32, "SI32", capacity, 1, build_kw_1arg)
494             DEFINE_KW_HOOK(si32, "SI32", persist, 2, build_kw_2arg)
495             DEFINE_KW_HOOK(si32, "SI32", swap, 3, build_kw_3arg)
496             DEFINE_KW_HOOK(si32, "SI32", cas, 4, build_kw_4arg)
497             DEFINE_KW_HOOK(si32, "SI32", exists, 2, build_kw_2arg)
498             DEFINE_KW_HOOK(si32, "SI32", incr, 2, build_kw_2arg)
499             DEFINE_KW_HOOK(si32, "SI32", decr, 2, build_kw_2arg)
500             DEFINE_KW_HOOK(si32, "SI32", incr_by, 3, build_kw_3arg)
501             DEFINE_KW_HOOK(si32, "SI32", size, 1, build_kw_1arg)
502             DEFINE_KW_HOOK(si32, "SI32", keys, 1, build_kw_1arg_list)
503             DEFINE_KW_HOOK(si32, "SI32", values, 1, build_kw_1arg_list)
504             DEFINE_KW_HOOK(si32, "SI32", items, 1, build_kw_1arg_list)
505             DEFINE_KW_HOOK(si32, "SI32", max_size, 1, build_kw_1arg)
506             DEFINE_KW_HOOK(si32, "SI32", ttl, 1, build_kw_1arg)
507             DEFINE_KW_HOOK(si32, "SI32", lru_skip, 1, build_kw_1arg)
508             DEFINE_KW_HOOK(si32, "SI32", each, 1, build_kw_1arg_list)
509             DEFINE_KW_HOOK(si32, "SI32", iter_reset, 1, build_kw_1arg)
510             DEFINE_KW_HOOK(si32, "SI32", clear, 1, build_kw_1arg)
511             DEFINE_KW_HOOK(si32, "SI32", to_hash, 1, build_kw_1arg)
512             DEFINE_KW_HOOK(si32, "SI32", put_ttl, 4, build_kw_4arg)
513             DEFINE_KW_HOOK(si32, "SI32", get_or_set, 3, build_kw_3arg)
514              
515             /* I32A keywords (int32 -> SV*) */
516             DEFINE_KW_HOOK(i32a, "I32A", put, 3, build_kw_3arg)
517             DEFINE_KW_HOOK(i32a, "I32A", get, 2, build_kw_2arg)
518             DEFINE_KW_HOOK(i32a, "I32A", remove, 2, build_kw_2arg)
519             DEFINE_KW_HOOK(i32a, "I32A", take, 2, build_kw_2arg)
520             DEFINE_KW_HOOK(i32a, "I32A", drain, 2, build_kw_2arg)
521             DEFINE_KW_HOOK(i32a, "I32A", pop, 1, build_kw_1arg)
522             DEFINE_KW_HOOK(i32a, "I32A", shift, 1, build_kw_1arg)
523             DEFINE_KW_HOOK(i32a, "I32A", reserve, 2, build_kw_2arg)
524             DEFINE_KW_HOOK(i32a, "I32A", purge, 1, build_kw_1arg)
525             DEFINE_KW_HOOK(i32a, "I32A", capacity, 1, build_kw_1arg)
526             DEFINE_KW_HOOK(i32a, "I32A", persist, 2, build_kw_2arg)
527             DEFINE_KW_HOOK(i32a, "I32A", swap, 3, build_kw_3arg)
528             DEFINE_KW_HOOK(i32a, "I32A", exists, 2, build_kw_2arg)
529             DEFINE_KW_HOOK(i32a, "I32A", size, 1, build_kw_1arg)
530             DEFINE_KW_HOOK(i32a, "I32A", keys, 1, build_kw_1arg_list)
531             DEFINE_KW_HOOK(i32a, "I32A", values, 1, build_kw_1arg_list)
532             DEFINE_KW_HOOK(i32a, "I32A", items, 1, build_kw_1arg_list)
533             DEFINE_KW_HOOK(i32a, "I32A", max_size, 1, build_kw_1arg)
534             DEFINE_KW_HOOK(i32a, "I32A", ttl, 1, build_kw_1arg)
535             DEFINE_KW_HOOK(i32a, "I32A", lru_skip, 1, build_kw_1arg)
536             DEFINE_KW_HOOK(i32a, "I32A", each, 1, build_kw_1arg_list)
537             DEFINE_KW_HOOK(i32a, "I32A", iter_reset, 1, build_kw_1arg)
538             DEFINE_KW_HOOK(i32a, "I32A", clear, 1, build_kw_1arg)
539             DEFINE_KW_HOOK(i32a, "I32A", to_hash, 1, build_kw_1arg)
540             DEFINE_KW_HOOK(i32a, "I32A", put_ttl, 4, build_kw_4arg)
541             DEFINE_KW_HOOK(i32a, "I32A", get_or_set, 3, build_kw_3arg)
542              
543             /* I16A keywords (int16 -> SV*) */
544             DEFINE_KW_HOOK(i16a, "I16A", put, 3, build_kw_3arg)
545             DEFINE_KW_HOOK(i16a, "I16A", get, 2, build_kw_2arg)
546             DEFINE_KW_HOOK(i16a, "I16A", remove, 2, build_kw_2arg)
547             DEFINE_KW_HOOK(i16a, "I16A", take, 2, build_kw_2arg)
548             DEFINE_KW_HOOK(i16a, "I16A", drain, 2, build_kw_2arg)
549             DEFINE_KW_HOOK(i16a, "I16A", pop, 1, build_kw_1arg)
550             DEFINE_KW_HOOK(i16a, "I16A", shift, 1, build_kw_1arg)
551             DEFINE_KW_HOOK(i16a, "I16A", reserve, 2, build_kw_2arg)
552             DEFINE_KW_HOOK(i16a, "I16A", purge, 1, build_kw_1arg)
553             DEFINE_KW_HOOK(i16a, "I16A", capacity, 1, build_kw_1arg)
554             DEFINE_KW_HOOK(i16a, "I16A", persist, 2, build_kw_2arg)
555             DEFINE_KW_HOOK(i16a, "I16A", swap, 3, build_kw_3arg)
556             DEFINE_KW_HOOK(i16a, "I16A", exists, 2, build_kw_2arg)
557             DEFINE_KW_HOOK(i16a, "I16A", size, 1, build_kw_1arg)
558             DEFINE_KW_HOOK(i16a, "I16A", keys, 1, build_kw_1arg_list)
559             DEFINE_KW_HOOK(i16a, "I16A", values, 1, build_kw_1arg_list)
560             DEFINE_KW_HOOK(i16a, "I16A", items, 1, build_kw_1arg_list)
561             DEFINE_KW_HOOK(i16a, "I16A", max_size, 1, build_kw_1arg)
562             DEFINE_KW_HOOK(i16a, "I16A", ttl, 1, build_kw_1arg)
563             DEFINE_KW_HOOK(i16a, "I16A", lru_skip, 1, build_kw_1arg)
564             DEFINE_KW_HOOK(i16a, "I16A", each, 1, build_kw_1arg_list)
565             DEFINE_KW_HOOK(i16a, "I16A", iter_reset, 1, build_kw_1arg)
566             DEFINE_KW_HOOK(i16a, "I16A", clear, 1, build_kw_1arg)
567             DEFINE_KW_HOOK(i16a, "I16A", to_hash, 1, build_kw_1arg)
568             DEFINE_KW_HOOK(i16a, "I16A", put_ttl, 4, build_kw_4arg)
569             DEFINE_KW_HOOK(i16a, "I16A", get_or_set, 3, build_kw_3arg)
570              
571             /* IA keywords (int64 -> SV*) */
572             DEFINE_KW_HOOK(ia, "IA", put, 3, build_kw_3arg)
573             DEFINE_KW_HOOK(ia, "IA", get, 2, build_kw_2arg)
574             DEFINE_KW_HOOK(ia, "IA", remove, 2, build_kw_2arg)
575             DEFINE_KW_HOOK(ia, "IA", take, 2, build_kw_2arg)
576             DEFINE_KW_HOOK(ia, "IA", drain, 2, build_kw_2arg)
577             DEFINE_KW_HOOK(ia, "IA", pop, 1, build_kw_1arg)
578             DEFINE_KW_HOOK(ia, "IA", shift, 1, build_kw_1arg)
579             DEFINE_KW_HOOK(ia, "IA", reserve, 2, build_kw_2arg)
580             DEFINE_KW_HOOK(ia, "IA", purge, 1, build_kw_1arg)
581             DEFINE_KW_HOOK(ia, "IA", capacity, 1, build_kw_1arg)
582             DEFINE_KW_HOOK(ia, "IA", persist, 2, build_kw_2arg)
583             DEFINE_KW_HOOK(ia, "IA", swap, 3, build_kw_3arg)
584             DEFINE_KW_HOOK(ia, "IA", exists, 2, build_kw_2arg)
585             DEFINE_KW_HOOK(ia, "IA", size, 1, build_kw_1arg)
586             DEFINE_KW_HOOK(ia, "IA", keys, 1, build_kw_1arg_list)
587             DEFINE_KW_HOOK(ia, "IA", values, 1, build_kw_1arg_list)
588             DEFINE_KW_HOOK(ia, "IA", items, 1, build_kw_1arg_list)
589             DEFINE_KW_HOOK(ia, "IA", max_size, 1, build_kw_1arg)
590             DEFINE_KW_HOOK(ia, "IA", ttl, 1, build_kw_1arg)
591             DEFINE_KW_HOOK(ia, "IA", lru_skip, 1, build_kw_1arg)
592             DEFINE_KW_HOOK(ia, "IA", each, 1, build_kw_1arg_list)
593             DEFINE_KW_HOOK(ia, "IA", iter_reset, 1, build_kw_1arg)
594             DEFINE_KW_HOOK(ia, "IA", clear, 1, build_kw_1arg)
595             DEFINE_KW_HOOK(ia, "IA", to_hash, 1, build_kw_1arg)
596             DEFINE_KW_HOOK(ia, "IA", put_ttl, 4, build_kw_4arg)
597             DEFINE_KW_HOOK(ia, "IA", get_or_set, 3, build_kw_3arg)
598              
599             /* SA keywords (string -> SV*) */
600             DEFINE_KW_HOOK(sa, "SA", put, 3, build_kw_3arg)
601             DEFINE_KW_HOOK(sa, "SA", get, 2, build_kw_2arg)
602             DEFINE_KW_HOOK(sa, "SA", remove, 2, build_kw_2arg)
603             DEFINE_KW_HOOK(sa, "SA", take, 2, build_kw_2arg)
604             DEFINE_KW_HOOK(sa, "SA", drain, 2, build_kw_2arg)
605             DEFINE_KW_HOOK(sa, "SA", pop, 1, build_kw_1arg)
606             DEFINE_KW_HOOK(sa, "SA", shift, 1, build_kw_1arg)
607             DEFINE_KW_HOOK(sa, "SA", reserve, 2, build_kw_2arg)
608             DEFINE_KW_HOOK(sa, "SA", purge, 1, build_kw_1arg)
609             DEFINE_KW_HOOK(sa, "SA", capacity, 1, build_kw_1arg)
610             DEFINE_KW_HOOK(sa, "SA", persist, 2, build_kw_2arg)
611             DEFINE_KW_HOOK(sa, "SA", swap, 3, build_kw_3arg)
612             DEFINE_KW_HOOK(sa, "SA", exists, 2, build_kw_2arg)
613             DEFINE_KW_HOOK(sa, "SA", size, 1, build_kw_1arg)
614             DEFINE_KW_HOOK(sa, "SA", keys, 1, build_kw_1arg_list)
615             DEFINE_KW_HOOK(sa, "SA", values, 1, build_kw_1arg_list)
616             DEFINE_KW_HOOK(sa, "SA", items, 1, build_kw_1arg_list)
617             DEFINE_KW_HOOK(sa, "SA", max_size, 1, build_kw_1arg)
618             DEFINE_KW_HOOK(sa, "SA", ttl, 1, build_kw_1arg)
619             DEFINE_KW_HOOK(sa, "SA", lru_skip, 1, build_kw_1arg)
620             DEFINE_KW_HOOK(sa, "SA", each, 1, build_kw_1arg_list)
621             DEFINE_KW_HOOK(sa, "SA", iter_reset, 1, build_kw_1arg)
622             DEFINE_KW_HOOK(sa, "SA", clear, 1, build_kw_1arg)
623             DEFINE_KW_HOOK(sa, "SA", to_hash, 1, build_kw_1arg)
624             DEFINE_KW_HOOK(sa, "SA", put_ttl, 4, build_kw_4arg)
625             DEFINE_KW_HOOK(sa, "SA", get_or_set, 3, build_kw_3arg)
626              
627             /* ---- Macro to register a keyword ---- */
628             #define REGISTER_KW(variant, kw, func_name) \
629             register_xs_parse_keyword("hm_" #variant "_" #kw, \
630             &hooks_hm_##variant##_##kw, (void*)func_name)
631              
632             /* ---- Live node checks ---- */
633             #define I16_NODE_LIVE(n) ((n).key != INT16_MIN && (n).key != (INT16_MIN + 1))
634             #define I16S_NODE_LIVE(n) I16_NODE_LIVE(n) /* I16S keys are int16_t */
635             #define I32_NODE_LIVE(n) ((n).key != INT32_MIN && (n).key != (INT32_MIN + 1))
636             #define I32S_NODE_LIVE(n) I32_NODE_LIVE(n) /* I32S keys are int32_t */
637             #define II_NODE_LIVE(n) ((n).key != INT64_MIN && (n).key != (INT64_MIN + 1))
638             #define IS_NODE_LIVE(n) II_NODE_LIVE(n) /* IS keys are int64_t */
639             #define STR_NODE_LIVE(n) ((n).key != NULL && (n).key != &hm_str_tombstone_marker)
640             #define SI16_NODE_LIVE(n) STR_NODE_LIVE(n)
641             #define SI32_NODE_LIVE(n) STR_NODE_LIVE(n)
642             #define SI_NODE_LIVE(n) STR_NODE_LIVE(n)
643             #define SS_NODE_LIVE(n) STR_NODE_LIVE(n)
644             #define I32A_NODE_LIVE(n) I32_NODE_LIVE(n) /* I32A keys are int32_t */
645             #define I16A_NODE_LIVE(n) I16_NODE_LIVE(n) /* I16A keys are int16_t */
646             #define IA_NODE_LIVE(n) II_NODE_LIVE(n) /* IA keys are int64_t */
647             #define SA_NODE_LIVE(n) STR_NODE_LIVE(n)
648              
649             /* ---- TTL-aware iteration helper ---- */
650             #define HM_TTL_SKIP_EXPIRED(self, i, now) \
651             (self->expires_at && self->expires_at[i] && (now) >= self->expires_at[i])
652              
653              
654             MODULE = Data::HashMap PACKAGE = Data::HashMap::I32
655             PROTOTYPES: DISABLE
656              
657             BOOT:
658 22           boot_xs_parse_keyword(0.40);
659 22           stash_i16 = gv_stashpvn("Data::HashMap::I16", 18, GV_ADD);
660 22           stash_i16a = gv_stashpvn("Data::HashMap::I16A", 19, GV_ADD);
661 22           stash_i16s = gv_stashpvn("Data::HashMap::I16S", 19, GV_ADD);
662 22           stash_i32 = gv_stashpvn("Data::HashMap::I32", 18, GV_ADD);
663 22           stash_i32a = gv_stashpvn("Data::HashMap::I32A", 19, GV_ADD);
664 22           stash_i32s = gv_stashpvn("Data::HashMap::I32S", 19, GV_ADD);
665 22           stash_ia = gv_stashpvn("Data::HashMap::IA", 17, GV_ADD);
666 22           stash_ii = gv_stashpvn("Data::HashMap::II", 17, GV_ADD);
667 22           stash_is = gv_stashpvn("Data::HashMap::IS", 17, GV_ADD);
668 22           stash_sa = gv_stashpvn("Data::HashMap::SA", 17, GV_ADD);
669 22           stash_si16 = gv_stashpvn("Data::HashMap::SI16", 19, GV_ADD);
670 22           stash_si32 = gv_stashpvn("Data::HashMap::SI32", 19, GV_ADD);
671 22           stash_si = gv_stashpvn("Data::HashMap::SI", 17, GV_ADD);
672 22           stash_ss = gv_stashpvn("Data::HashMap::SS", 17, GV_ADD);
673 22           REGISTER_KW(i16, put, "Data::HashMap::I16::put");
674 22           REGISTER_KW(i16, get, "Data::HashMap::I16::get");
675 22           REGISTER_KW(i16, remove, "Data::HashMap::I16::remove");
676 22           REGISTER_KW(i16, take, "Data::HashMap::I16::take");
677 22           REGISTER_KW(i16, drain, "Data::HashMap::I16::drain");
678 22           REGISTER_KW(i16, pop, "Data::HashMap::I16::pop");
679 22           REGISTER_KW(i16, shift, "Data::HashMap::I16::shift");
680 22           REGISTER_KW(i16, reserve, "Data::HashMap::I16::reserve");
681 22           REGISTER_KW(i16, purge, "Data::HashMap::I16::purge");
682 22           REGISTER_KW(i16, capacity, "Data::HashMap::I16::capacity");
683 22           REGISTER_KW(i16, persist, "Data::HashMap::I16::persist");
684 22           REGISTER_KW(i16, swap, "Data::HashMap::I16::swap");
685 22           REGISTER_KW(i16, cas, "Data::HashMap::I16::cas");
686 22           REGISTER_KW(i16, exists, "Data::HashMap::I16::exists");
687 22           REGISTER_KW(i16, incr, "Data::HashMap::I16::incr");
688 22           REGISTER_KW(i16, decr, "Data::HashMap::I16::decr");
689 22           REGISTER_KW(i16, incr_by, "Data::HashMap::I16::incr_by");
690 22           REGISTER_KW(i16, size, "Data::HashMap::I16::size");
691 22           REGISTER_KW(i16, keys, "Data::HashMap::I16::keys");
692 22           REGISTER_KW(i16, values, "Data::HashMap::I16::values");
693 22           REGISTER_KW(i16, items, "Data::HashMap::I16::items");
694 22           REGISTER_KW(i16, max_size, "Data::HashMap::I16::max_size");
695 22           REGISTER_KW(i16, ttl, "Data::HashMap::I16::ttl");
696 22           REGISTER_KW(i16, lru_skip, "Data::HashMap::I16::lru_skip");
697 22           REGISTER_KW(i16, each, "Data::HashMap::I16::each");
698 22           REGISTER_KW(i16, iter_reset, "Data::HashMap::I16::iter_reset");
699 22           REGISTER_KW(i16, clear, "Data::HashMap::I16::clear");
700 22           REGISTER_KW(i16, to_hash, "Data::HashMap::I16::to_hash");
701 22           REGISTER_KW(i16, put_ttl, "Data::HashMap::I16::put_ttl");
702 22           REGISTER_KW(i16, get_or_set, "Data::HashMap::I16::get_or_set");
703 22           REGISTER_KW(i16s, put, "Data::HashMap::I16S::put");
704 22           REGISTER_KW(i16s, get, "Data::HashMap::I16S::get");
705 22           REGISTER_KW(i16s, remove, "Data::HashMap::I16S::remove");
706 22           REGISTER_KW(i16s, take, "Data::HashMap::I16S::take");
707 22           REGISTER_KW(i16s, drain, "Data::HashMap::I16S::drain");
708 22           REGISTER_KW(i16s, pop, "Data::HashMap::I16S::pop");
709 22           REGISTER_KW(i16s, shift, "Data::HashMap::I16S::shift");
710 22           REGISTER_KW(i16s, reserve, "Data::HashMap::I16S::reserve");
711 22           REGISTER_KW(i16s, purge, "Data::HashMap::I16S::purge");
712 22           REGISTER_KW(i16s, capacity, "Data::HashMap::I16S::capacity");
713 22           REGISTER_KW(i16s, persist, "Data::HashMap::I16S::persist");
714 22           REGISTER_KW(i16s, swap, "Data::HashMap::I16S::swap");
715 22           REGISTER_KW(i16s, exists, "Data::HashMap::I16S::exists");
716 22           REGISTER_KW(i16s, size, "Data::HashMap::I16S::size");
717 22           REGISTER_KW(i16s, keys, "Data::HashMap::I16S::keys");
718 22           REGISTER_KW(i16s, values, "Data::HashMap::I16S::values");
719 22           REGISTER_KW(i16s, items, "Data::HashMap::I16S::items");
720 22           REGISTER_KW(i16s, max_size, "Data::HashMap::I16S::max_size");
721 22           REGISTER_KW(i16s, ttl, "Data::HashMap::I16S::ttl");
722 22           REGISTER_KW(i16s, lru_skip, "Data::HashMap::I16S::lru_skip");
723 22           REGISTER_KW(i16s, each, "Data::HashMap::I16S::each");
724 22           REGISTER_KW(i16s, iter_reset, "Data::HashMap::I16S::iter_reset");
725 22           REGISTER_KW(i16s, clear, "Data::HashMap::I16S::clear");
726 22           REGISTER_KW(i16s, to_hash, "Data::HashMap::I16S::to_hash");
727 22           REGISTER_KW(i16s, put_ttl, "Data::HashMap::I16S::put_ttl");
728 22           REGISTER_KW(i16s, get_or_set, "Data::HashMap::I16S::get_or_set");
729 22           REGISTER_KW(i16s, get_direct, "Data::HashMap::I16S::get_direct");
730 22           REGISTER_KW(si16, put, "Data::HashMap::SI16::put");
731 22           REGISTER_KW(si16, get, "Data::HashMap::SI16::get");
732 22           REGISTER_KW(si16, remove, "Data::HashMap::SI16::remove");
733 22           REGISTER_KW(si16, take, "Data::HashMap::SI16::take");
734 22           REGISTER_KW(si16, drain, "Data::HashMap::SI16::drain");
735 22           REGISTER_KW(si16, pop, "Data::HashMap::SI16::pop");
736 22           REGISTER_KW(si16, shift, "Data::HashMap::SI16::shift");
737 22           REGISTER_KW(si16, reserve, "Data::HashMap::SI16::reserve");
738 22           REGISTER_KW(si16, purge, "Data::HashMap::SI16::purge");
739 22           REGISTER_KW(si16, capacity, "Data::HashMap::SI16::capacity");
740 22           REGISTER_KW(si16, persist, "Data::HashMap::SI16::persist");
741 22           REGISTER_KW(si16, swap, "Data::HashMap::SI16::swap");
742 22           REGISTER_KW(si16, cas, "Data::HashMap::SI16::cas");
743 22           REGISTER_KW(si16, exists, "Data::HashMap::SI16::exists");
744 22           REGISTER_KW(si16, incr, "Data::HashMap::SI16::incr");
745 22           REGISTER_KW(si16, decr, "Data::HashMap::SI16::decr");
746 22           REGISTER_KW(si16, incr_by, "Data::HashMap::SI16::incr_by");
747 22           REGISTER_KW(si16, size, "Data::HashMap::SI16::size");
748 22           REGISTER_KW(si16, keys, "Data::HashMap::SI16::keys");
749 22           REGISTER_KW(si16, values, "Data::HashMap::SI16::values");
750 22           REGISTER_KW(si16, items, "Data::HashMap::SI16::items");
751 22           REGISTER_KW(si16, max_size, "Data::HashMap::SI16::max_size");
752 22           REGISTER_KW(si16, ttl, "Data::HashMap::SI16::ttl");
753 22           REGISTER_KW(si16, lru_skip, "Data::HashMap::SI16::lru_skip");
754 22           REGISTER_KW(si16, each, "Data::HashMap::SI16::each");
755 22           REGISTER_KW(si16, iter_reset, "Data::HashMap::SI16::iter_reset");
756 22           REGISTER_KW(si16, clear, "Data::HashMap::SI16::clear");
757 22           REGISTER_KW(si16, to_hash, "Data::HashMap::SI16::to_hash");
758 22           REGISTER_KW(si16, put_ttl, "Data::HashMap::SI16::put_ttl");
759 22           REGISTER_KW(si16, get_or_set, "Data::HashMap::SI16::get_or_set");
760 22           REGISTER_KW(i32, put, "Data::HashMap::I32::put");
761 22           REGISTER_KW(i32, get, "Data::HashMap::I32::get");
762 22           REGISTER_KW(i32, remove, "Data::HashMap::I32::remove");
763 22           REGISTER_KW(i32, take, "Data::HashMap::I32::take");
764 22           REGISTER_KW(i32, drain, "Data::HashMap::I32::drain");
765 22           REGISTER_KW(i32, pop, "Data::HashMap::I32::pop");
766 22           REGISTER_KW(i32, shift, "Data::HashMap::I32::shift");
767 22           REGISTER_KW(i32, reserve, "Data::HashMap::I32::reserve");
768 22           REGISTER_KW(i32, purge, "Data::HashMap::I32::purge");
769 22           REGISTER_KW(i32, capacity, "Data::HashMap::I32::capacity");
770 22           REGISTER_KW(i32, persist, "Data::HashMap::I32::persist");
771 22           REGISTER_KW(i32, swap, "Data::HashMap::I32::swap");
772 22           REGISTER_KW(i32, cas, "Data::HashMap::I32::cas");
773 22           REGISTER_KW(i32, exists, "Data::HashMap::I32::exists");
774 22           REGISTER_KW(i32, incr, "Data::HashMap::I32::incr");
775 22           REGISTER_KW(i32, decr, "Data::HashMap::I32::decr");
776 22           REGISTER_KW(i32, incr_by, "Data::HashMap::I32::incr_by");
777 22           REGISTER_KW(i32, size, "Data::HashMap::I32::size");
778 22           REGISTER_KW(i32, keys, "Data::HashMap::I32::keys");
779 22           REGISTER_KW(i32, values, "Data::HashMap::I32::values");
780 22           REGISTER_KW(i32, items, "Data::HashMap::I32::items");
781 22           REGISTER_KW(i32, max_size, "Data::HashMap::I32::max_size");
782 22           REGISTER_KW(i32, ttl, "Data::HashMap::I32::ttl");
783 22           REGISTER_KW(i32, lru_skip, "Data::HashMap::I32::lru_skip");
784 22           REGISTER_KW(i32, each, "Data::HashMap::I32::each");
785 22           REGISTER_KW(i32, iter_reset, "Data::HashMap::I32::iter_reset");
786 22           REGISTER_KW(i32, clear, "Data::HashMap::I32::clear");
787 22           REGISTER_KW(i32, to_hash, "Data::HashMap::I32::to_hash");
788 22           REGISTER_KW(i32, put_ttl, "Data::HashMap::I32::put_ttl");
789 22           REGISTER_KW(i32, get_or_set, "Data::HashMap::I32::get_or_set");
790 22           REGISTER_KW(ii, put, "Data::HashMap::II::put");
791 22           REGISTER_KW(ii, get, "Data::HashMap::II::get");
792 22           REGISTER_KW(ii, remove, "Data::HashMap::II::remove");
793 22           REGISTER_KW(ii, take, "Data::HashMap::II::take");
794 22           REGISTER_KW(ii, drain, "Data::HashMap::II::drain");
795 22           REGISTER_KW(ii, pop, "Data::HashMap::II::pop");
796 22           REGISTER_KW(ii, shift, "Data::HashMap::II::shift");
797 22           REGISTER_KW(ii, reserve, "Data::HashMap::II::reserve");
798 22           REGISTER_KW(ii, purge, "Data::HashMap::II::purge");
799 22           REGISTER_KW(ii, capacity, "Data::HashMap::II::capacity");
800 22           REGISTER_KW(ii, persist, "Data::HashMap::II::persist");
801 22           REGISTER_KW(ii, swap, "Data::HashMap::II::swap");
802 22           REGISTER_KW(ii, cas, "Data::HashMap::II::cas");
803 22           REGISTER_KW(ii, exists, "Data::HashMap::II::exists");
804 22           REGISTER_KW(ii, incr, "Data::HashMap::II::incr");
805 22           REGISTER_KW(ii, decr, "Data::HashMap::II::decr");
806 22           REGISTER_KW(ii, incr_by, "Data::HashMap::II::incr_by");
807 22           REGISTER_KW(ii, size, "Data::HashMap::II::size");
808 22           REGISTER_KW(ii, keys, "Data::HashMap::II::keys");
809 22           REGISTER_KW(ii, values, "Data::HashMap::II::values");
810 22           REGISTER_KW(ii, items, "Data::HashMap::II::items");
811 22           REGISTER_KW(ii, max_size, "Data::HashMap::II::max_size");
812 22           REGISTER_KW(ii, ttl, "Data::HashMap::II::ttl");
813 22           REGISTER_KW(ii, lru_skip, "Data::HashMap::II::lru_skip");
814 22           REGISTER_KW(ii, each, "Data::HashMap::II::each");
815 22           REGISTER_KW(ii, iter_reset, "Data::HashMap::II::iter_reset");
816 22           REGISTER_KW(ii, clear, "Data::HashMap::II::clear");
817 22           REGISTER_KW(ii, to_hash, "Data::HashMap::II::to_hash");
818 22           REGISTER_KW(ii, put_ttl, "Data::HashMap::II::put_ttl");
819 22           REGISTER_KW(ii, get_or_set, "Data::HashMap::II::get_or_set");
820 22           REGISTER_KW(is, put, "Data::HashMap::IS::put");
821 22           REGISTER_KW(is, get, "Data::HashMap::IS::get");
822 22           REGISTER_KW(is, remove, "Data::HashMap::IS::remove");
823 22           REGISTER_KW(is, take, "Data::HashMap::IS::take");
824 22           REGISTER_KW(is, drain, "Data::HashMap::IS::drain");
825 22           REGISTER_KW(is, pop, "Data::HashMap::IS::pop");
826 22           REGISTER_KW(is, shift, "Data::HashMap::IS::shift");
827 22           REGISTER_KW(is, reserve, "Data::HashMap::IS::reserve");
828 22           REGISTER_KW(is, purge, "Data::HashMap::IS::purge");
829 22           REGISTER_KW(is, capacity, "Data::HashMap::IS::capacity");
830 22           REGISTER_KW(is, persist, "Data::HashMap::IS::persist");
831 22           REGISTER_KW(is, swap, "Data::HashMap::IS::swap");
832 22           REGISTER_KW(is, exists, "Data::HashMap::IS::exists");
833 22           REGISTER_KW(is, size, "Data::HashMap::IS::size");
834 22           REGISTER_KW(is, keys, "Data::HashMap::IS::keys");
835 22           REGISTER_KW(is, values, "Data::HashMap::IS::values");
836 22           REGISTER_KW(is, items, "Data::HashMap::IS::items");
837 22           REGISTER_KW(is, max_size, "Data::HashMap::IS::max_size");
838 22           REGISTER_KW(is, ttl, "Data::HashMap::IS::ttl");
839 22           REGISTER_KW(is, lru_skip, "Data::HashMap::IS::lru_skip");
840 22           REGISTER_KW(is, each, "Data::HashMap::IS::each");
841 22           REGISTER_KW(is, iter_reset, "Data::HashMap::IS::iter_reset");
842 22           REGISTER_KW(is, clear, "Data::HashMap::IS::clear");
843 22           REGISTER_KW(is, to_hash, "Data::HashMap::IS::to_hash");
844 22           REGISTER_KW(is, put_ttl, "Data::HashMap::IS::put_ttl");
845 22           REGISTER_KW(is, get_or_set, "Data::HashMap::IS::get_or_set");
846 22           REGISTER_KW(is, get_direct, "Data::HashMap::IS::get_direct");
847 22           REGISTER_KW(si, put, "Data::HashMap::SI::put");
848 22           REGISTER_KW(si, get, "Data::HashMap::SI::get");
849 22           REGISTER_KW(si, remove, "Data::HashMap::SI::remove");
850 22           REGISTER_KW(si, take, "Data::HashMap::SI::take");
851 22           REGISTER_KW(si, drain, "Data::HashMap::SI::drain");
852 22           REGISTER_KW(si, pop, "Data::HashMap::SI::pop");
853 22           REGISTER_KW(si, shift, "Data::HashMap::SI::shift");
854 22           REGISTER_KW(si, reserve, "Data::HashMap::SI::reserve");
855 22           REGISTER_KW(si, purge, "Data::HashMap::SI::purge");
856 22           REGISTER_KW(si, capacity, "Data::HashMap::SI::capacity");
857 22           REGISTER_KW(si, persist, "Data::HashMap::SI::persist");
858 22           REGISTER_KW(si, swap, "Data::HashMap::SI::swap");
859 22           REGISTER_KW(si, cas, "Data::HashMap::SI::cas");
860 22           REGISTER_KW(si, exists, "Data::HashMap::SI::exists");
861 22           REGISTER_KW(si, incr, "Data::HashMap::SI::incr");
862 22           REGISTER_KW(si, decr, "Data::HashMap::SI::decr");
863 22           REGISTER_KW(si, incr_by, "Data::HashMap::SI::incr_by");
864 22           REGISTER_KW(si, size, "Data::HashMap::SI::size");
865 22           REGISTER_KW(si, keys, "Data::HashMap::SI::keys");
866 22           REGISTER_KW(si, values, "Data::HashMap::SI::values");
867 22           REGISTER_KW(si, items, "Data::HashMap::SI::items");
868 22           REGISTER_KW(si, max_size, "Data::HashMap::SI::max_size");
869 22           REGISTER_KW(si, ttl, "Data::HashMap::SI::ttl");
870 22           REGISTER_KW(si, lru_skip, "Data::HashMap::SI::lru_skip");
871 22           REGISTER_KW(si, each, "Data::HashMap::SI::each");
872 22           REGISTER_KW(si, iter_reset, "Data::HashMap::SI::iter_reset");
873 22           REGISTER_KW(si, clear, "Data::HashMap::SI::clear");
874 22           REGISTER_KW(si, to_hash, "Data::HashMap::SI::to_hash");
875 22           REGISTER_KW(si, put_ttl, "Data::HashMap::SI::put_ttl");
876 22           REGISTER_KW(si, get_or_set, "Data::HashMap::SI::get_or_set");
877 22           REGISTER_KW(ss, put, "Data::HashMap::SS::put");
878 22           REGISTER_KW(ss, get, "Data::HashMap::SS::get");
879 22           REGISTER_KW(ss, remove, "Data::HashMap::SS::remove");
880 22           REGISTER_KW(ss, take, "Data::HashMap::SS::take");
881 22           REGISTER_KW(ss, drain, "Data::HashMap::SS::drain");
882 22           REGISTER_KW(ss, pop, "Data::HashMap::SS::pop");
883 22           REGISTER_KW(ss, shift, "Data::HashMap::SS::shift");
884 22           REGISTER_KW(ss, reserve, "Data::HashMap::SS::reserve");
885 22           REGISTER_KW(ss, purge, "Data::HashMap::SS::purge");
886 22           REGISTER_KW(ss, capacity, "Data::HashMap::SS::capacity");
887 22           REGISTER_KW(ss, persist, "Data::HashMap::SS::persist");
888 22           REGISTER_KW(ss, swap, "Data::HashMap::SS::swap");
889 22           REGISTER_KW(ss, exists, "Data::HashMap::SS::exists");
890 22           REGISTER_KW(ss, size, "Data::HashMap::SS::size");
891 22           REGISTER_KW(ss, keys, "Data::HashMap::SS::keys");
892 22           REGISTER_KW(ss, values, "Data::HashMap::SS::values");
893 22           REGISTER_KW(ss, items, "Data::HashMap::SS::items");
894 22           REGISTER_KW(ss, max_size, "Data::HashMap::SS::max_size");
895 22           REGISTER_KW(ss, ttl, "Data::HashMap::SS::ttl");
896 22           REGISTER_KW(ss, lru_skip, "Data::HashMap::SS::lru_skip");
897 22           REGISTER_KW(ss, each, "Data::HashMap::SS::each");
898 22           REGISTER_KW(ss, iter_reset, "Data::HashMap::SS::iter_reset");
899 22           REGISTER_KW(ss, clear, "Data::HashMap::SS::clear");
900 22           REGISTER_KW(ss, to_hash, "Data::HashMap::SS::to_hash");
901 22           REGISTER_KW(ss, put_ttl, "Data::HashMap::SS::put_ttl");
902 22           REGISTER_KW(ss, get_or_set, "Data::HashMap::SS::get_or_set");
903 22           REGISTER_KW(ss, get_direct, "Data::HashMap::SS::get_direct");
904 22           REGISTER_KW(i32s, put, "Data::HashMap::I32S::put");
905 22           REGISTER_KW(i32s, get, "Data::HashMap::I32S::get");
906 22           REGISTER_KW(i32s, remove, "Data::HashMap::I32S::remove");
907 22           REGISTER_KW(i32s, take, "Data::HashMap::I32S::take");
908 22           REGISTER_KW(i32s, drain, "Data::HashMap::I32S::drain");
909 22           REGISTER_KW(i32s, pop, "Data::HashMap::I32S::pop");
910 22           REGISTER_KW(i32s, shift, "Data::HashMap::I32S::shift");
911 22           REGISTER_KW(i32s, reserve, "Data::HashMap::I32S::reserve");
912 22           REGISTER_KW(i32s, purge, "Data::HashMap::I32S::purge");
913 22           REGISTER_KW(i32s, capacity, "Data::HashMap::I32S::capacity");
914 22           REGISTER_KW(i32s, persist, "Data::HashMap::I32S::persist");
915 22           REGISTER_KW(i32s, swap, "Data::HashMap::I32S::swap");
916 22           REGISTER_KW(i32s, exists, "Data::HashMap::I32S::exists");
917 22           REGISTER_KW(i32s, size, "Data::HashMap::I32S::size");
918 22           REGISTER_KW(i32s, keys, "Data::HashMap::I32S::keys");
919 22           REGISTER_KW(i32s, values, "Data::HashMap::I32S::values");
920 22           REGISTER_KW(i32s, items, "Data::HashMap::I32S::items");
921 22           REGISTER_KW(i32s, max_size, "Data::HashMap::I32S::max_size");
922 22           REGISTER_KW(i32s, ttl, "Data::HashMap::I32S::ttl");
923 22           REGISTER_KW(i32s, lru_skip, "Data::HashMap::I32S::lru_skip");
924 22           REGISTER_KW(i32s, each, "Data::HashMap::I32S::each");
925 22           REGISTER_KW(i32s, iter_reset, "Data::HashMap::I32S::iter_reset");
926 22           REGISTER_KW(i32s, clear, "Data::HashMap::I32S::clear");
927 22           REGISTER_KW(i32s, to_hash, "Data::HashMap::I32S::to_hash");
928 22           REGISTER_KW(i32s, put_ttl, "Data::HashMap::I32S::put_ttl");
929 22           REGISTER_KW(i32s, get_or_set, "Data::HashMap::I32S::get_or_set");
930 22           REGISTER_KW(i32s, get_direct, "Data::HashMap::I32S::get_direct");
931 22           REGISTER_KW(si32, put, "Data::HashMap::SI32::put");
932 22           REGISTER_KW(si32, get, "Data::HashMap::SI32::get");
933 22           REGISTER_KW(si32, remove, "Data::HashMap::SI32::remove");
934 22           REGISTER_KW(si32, take, "Data::HashMap::SI32::take");
935 22           REGISTER_KW(si32, drain, "Data::HashMap::SI32::drain");
936 22           REGISTER_KW(si32, pop, "Data::HashMap::SI32::pop");
937 22           REGISTER_KW(si32, shift, "Data::HashMap::SI32::shift");
938 22           REGISTER_KW(si32, reserve, "Data::HashMap::SI32::reserve");
939 22           REGISTER_KW(si32, purge, "Data::HashMap::SI32::purge");
940 22           REGISTER_KW(si32, capacity, "Data::HashMap::SI32::capacity");
941 22           REGISTER_KW(si32, persist, "Data::HashMap::SI32::persist");
942 22           REGISTER_KW(si32, swap, "Data::HashMap::SI32::swap");
943 22           REGISTER_KW(si32, cas, "Data::HashMap::SI32::cas");
944 22           REGISTER_KW(si32, exists, "Data::HashMap::SI32::exists");
945 22           REGISTER_KW(si32, incr, "Data::HashMap::SI32::incr");
946 22           REGISTER_KW(si32, decr, "Data::HashMap::SI32::decr");
947 22           REGISTER_KW(si32, incr_by, "Data::HashMap::SI32::incr_by");
948 22           REGISTER_KW(si32, size, "Data::HashMap::SI32::size");
949 22           REGISTER_KW(si32, keys, "Data::HashMap::SI32::keys");
950 22           REGISTER_KW(si32, values, "Data::HashMap::SI32::values");
951 22           REGISTER_KW(si32, items, "Data::HashMap::SI32::items");
952 22           REGISTER_KW(si32, max_size, "Data::HashMap::SI32::max_size");
953 22           REGISTER_KW(si32, ttl, "Data::HashMap::SI32::ttl");
954 22           REGISTER_KW(si32, lru_skip, "Data::HashMap::SI32::lru_skip");
955 22           REGISTER_KW(si32, each, "Data::HashMap::SI32::each");
956 22           REGISTER_KW(si32, iter_reset, "Data::HashMap::SI32::iter_reset");
957 22           REGISTER_KW(si32, clear, "Data::HashMap::SI32::clear");
958 22           REGISTER_KW(si32, to_hash, "Data::HashMap::SI32::to_hash");
959 22           REGISTER_KW(si32, put_ttl, "Data::HashMap::SI32::put_ttl");
960 22           REGISTER_KW(si32, get_or_set, "Data::HashMap::SI32::get_or_set");
961 22           REGISTER_KW(i32a, put, "Data::HashMap::I32A::put");
962 22           REGISTER_KW(i32a, get, "Data::HashMap::I32A::get");
963 22           REGISTER_KW(i32a, remove, "Data::HashMap::I32A::remove");
964 22           REGISTER_KW(i32a, take, "Data::HashMap::I32A::take");
965 22           REGISTER_KW(i32a, drain, "Data::HashMap::I32A::drain");
966 22           REGISTER_KW(i32a, pop, "Data::HashMap::I32A::pop");
967 22           REGISTER_KW(i32a, shift, "Data::HashMap::I32A::shift");
968 22           REGISTER_KW(i32a, reserve, "Data::HashMap::I32A::reserve");
969 22           REGISTER_KW(i32a, purge, "Data::HashMap::I32A::purge");
970 22           REGISTER_KW(i32a, capacity, "Data::HashMap::I32A::capacity");
971 22           REGISTER_KW(i32a, persist, "Data::HashMap::I32A::persist");
972 22           REGISTER_KW(i32a, swap, "Data::HashMap::I32A::swap");
973 22           REGISTER_KW(i32a, exists, "Data::HashMap::I32A::exists");
974 22           REGISTER_KW(i32a, size, "Data::HashMap::I32A::size");
975 22           REGISTER_KW(i32a, keys, "Data::HashMap::I32A::keys");
976 22           REGISTER_KW(i32a, values, "Data::HashMap::I32A::values");
977 22           REGISTER_KW(i32a, items, "Data::HashMap::I32A::items");
978 22           REGISTER_KW(i32a, max_size, "Data::HashMap::I32A::max_size");
979 22           REGISTER_KW(i32a, ttl, "Data::HashMap::I32A::ttl");
980 22           REGISTER_KW(i32a, lru_skip, "Data::HashMap::I32A::lru_skip");
981 22           REGISTER_KW(i32a, each, "Data::HashMap::I32A::each");
982 22           REGISTER_KW(i32a, iter_reset, "Data::HashMap::I32A::iter_reset");
983 22           REGISTER_KW(i32a, clear, "Data::HashMap::I32A::clear");
984 22           REGISTER_KW(i32a, to_hash, "Data::HashMap::I32A::to_hash");
985 22           REGISTER_KW(i32a, put_ttl, "Data::HashMap::I32A::put_ttl");
986 22           REGISTER_KW(i32a, get_or_set, "Data::HashMap::I32A::get_or_set");
987 22           REGISTER_KW(i16a, put, "Data::HashMap::I16A::put");
988 22           REGISTER_KW(i16a, get, "Data::HashMap::I16A::get");
989 22           REGISTER_KW(i16a, remove, "Data::HashMap::I16A::remove");
990 22           REGISTER_KW(i16a, take, "Data::HashMap::I16A::take");
991 22           REGISTER_KW(i16a, drain, "Data::HashMap::I16A::drain");
992 22           REGISTER_KW(i16a, pop, "Data::HashMap::I16A::pop");
993 22           REGISTER_KW(i16a, shift, "Data::HashMap::I16A::shift");
994 22           REGISTER_KW(i16a, reserve, "Data::HashMap::I16A::reserve");
995 22           REGISTER_KW(i16a, purge, "Data::HashMap::I16A::purge");
996 22           REGISTER_KW(i16a, capacity, "Data::HashMap::I16A::capacity");
997 22           REGISTER_KW(i16a, persist, "Data::HashMap::I16A::persist");
998 22           REGISTER_KW(i16a, swap, "Data::HashMap::I16A::swap");
999 22           REGISTER_KW(i16a, exists, "Data::HashMap::I16A::exists");
1000 22           REGISTER_KW(i16a, size, "Data::HashMap::I16A::size");
1001 22           REGISTER_KW(i16a, keys, "Data::HashMap::I16A::keys");
1002 22           REGISTER_KW(i16a, values, "Data::HashMap::I16A::values");
1003 22           REGISTER_KW(i16a, items, "Data::HashMap::I16A::items");
1004 22           REGISTER_KW(i16a, max_size, "Data::HashMap::I16A::max_size");
1005 22           REGISTER_KW(i16a, ttl, "Data::HashMap::I16A::ttl");
1006 22           REGISTER_KW(i16a, lru_skip, "Data::HashMap::I16A::lru_skip");
1007 22           REGISTER_KW(i16a, each, "Data::HashMap::I16A::each");
1008 22           REGISTER_KW(i16a, iter_reset, "Data::HashMap::I16A::iter_reset");
1009 22           REGISTER_KW(i16a, clear, "Data::HashMap::I16A::clear");
1010 22           REGISTER_KW(i16a, to_hash, "Data::HashMap::I16A::to_hash");
1011 22           REGISTER_KW(i16a, put_ttl, "Data::HashMap::I16A::put_ttl");
1012 22           REGISTER_KW(i16a, get_or_set, "Data::HashMap::I16A::get_or_set");
1013 22           REGISTER_KW(ia, put, "Data::HashMap::IA::put");
1014 22           REGISTER_KW(ia, get, "Data::HashMap::IA::get");
1015 22           REGISTER_KW(ia, remove, "Data::HashMap::IA::remove");
1016 22           REGISTER_KW(ia, take, "Data::HashMap::IA::take");
1017 22           REGISTER_KW(ia, drain, "Data::HashMap::IA::drain");
1018 22           REGISTER_KW(ia, pop, "Data::HashMap::IA::pop");
1019 22           REGISTER_KW(ia, shift, "Data::HashMap::IA::shift");
1020 22           REGISTER_KW(ia, reserve, "Data::HashMap::IA::reserve");
1021 22           REGISTER_KW(ia, purge, "Data::HashMap::IA::purge");
1022 22           REGISTER_KW(ia, capacity, "Data::HashMap::IA::capacity");
1023 22           REGISTER_KW(ia, persist, "Data::HashMap::IA::persist");
1024 22           REGISTER_KW(ia, swap, "Data::HashMap::IA::swap");
1025 22           REGISTER_KW(ia, exists, "Data::HashMap::IA::exists");
1026 22           REGISTER_KW(ia, size, "Data::HashMap::IA::size");
1027 22           REGISTER_KW(ia, keys, "Data::HashMap::IA::keys");
1028 22           REGISTER_KW(ia, values, "Data::HashMap::IA::values");
1029 22           REGISTER_KW(ia, items, "Data::HashMap::IA::items");
1030 22           REGISTER_KW(ia, max_size, "Data::HashMap::IA::max_size");
1031 22           REGISTER_KW(ia, ttl, "Data::HashMap::IA::ttl");
1032 22           REGISTER_KW(ia, lru_skip, "Data::HashMap::IA::lru_skip");
1033 22           REGISTER_KW(ia, each, "Data::HashMap::IA::each");
1034 22           REGISTER_KW(ia, iter_reset, "Data::HashMap::IA::iter_reset");
1035 22           REGISTER_KW(ia, clear, "Data::HashMap::IA::clear");
1036 22           REGISTER_KW(ia, to_hash, "Data::HashMap::IA::to_hash");
1037 22           REGISTER_KW(ia, put_ttl, "Data::HashMap::IA::put_ttl");
1038 22           REGISTER_KW(ia, get_or_set, "Data::HashMap::IA::get_or_set");
1039 22           REGISTER_KW(sa, put, "Data::HashMap::SA::put");
1040 22           REGISTER_KW(sa, get, "Data::HashMap::SA::get");
1041 22           REGISTER_KW(sa, remove, "Data::HashMap::SA::remove");
1042 22           REGISTER_KW(sa, take, "Data::HashMap::SA::take");
1043 22           REGISTER_KW(sa, drain, "Data::HashMap::SA::drain");
1044 22           REGISTER_KW(sa, pop, "Data::HashMap::SA::pop");
1045 22           REGISTER_KW(sa, shift, "Data::HashMap::SA::shift");
1046 22           REGISTER_KW(sa, reserve, "Data::HashMap::SA::reserve");
1047 22           REGISTER_KW(sa, purge, "Data::HashMap::SA::purge");
1048 22           REGISTER_KW(sa, capacity, "Data::HashMap::SA::capacity");
1049 22           REGISTER_KW(sa, persist, "Data::HashMap::SA::persist");
1050 22           REGISTER_KW(sa, swap, "Data::HashMap::SA::swap");
1051 22           REGISTER_KW(sa, exists, "Data::HashMap::SA::exists");
1052 22           REGISTER_KW(sa, size, "Data::HashMap::SA::size");
1053 22           REGISTER_KW(sa, keys, "Data::HashMap::SA::keys");
1054 22           REGISTER_KW(sa, values, "Data::HashMap::SA::values");
1055 22           REGISTER_KW(sa, items, "Data::HashMap::SA::items");
1056 22           REGISTER_KW(sa, max_size, "Data::HashMap::SA::max_size");
1057 22           REGISTER_KW(sa, ttl, "Data::HashMap::SA::ttl");
1058 22           REGISTER_KW(sa, lru_skip, "Data::HashMap::SA::lru_skip");
1059 22           REGISTER_KW(sa, each, "Data::HashMap::SA::each");
1060 22           REGISTER_KW(sa, iter_reset, "Data::HashMap::SA::iter_reset");
1061 22           REGISTER_KW(sa, clear, "Data::HashMap::SA::clear");
1062 22           REGISTER_KW(sa, to_hash, "Data::HashMap::SA::to_hash");
1063 22           REGISTER_KW(sa, put_ttl, "Data::HashMap::SA::put_ttl");
1064 22           REGISTER_KW(sa, get_or_set, "Data::HashMap::SA::get_or_set");
1065              
1066              
1067              
1068             INCLUDE: xs/i32.xsi
1069              
1070             INCLUDE: xs/ii.xsi
1071              
1072             INCLUDE: xs/is.xsi
1073              
1074             INCLUDE: xs/si.xsi
1075              
1076             INCLUDE: xs/ss.xsi
1077              
1078             INCLUDE: xs/i32s.xsi
1079              
1080             INCLUDE: xs/si32.xsi
1081              
1082             INCLUDE: xs/i16.xsi
1083              
1084             INCLUDE: xs/i16s.xsi
1085              
1086             INCLUDE: xs/si16.xsi
1087              
1088             INCLUDE: xs/i32a.xsi
1089              
1090             INCLUDE: xs/i16a.xsi
1091              
1092             INCLUDE: xs/ia.xsi
1093              
1094             INCLUDE: xs/sa.xsi