@@ -115,6 +115,24 @@ int main() {
115115#include "../inline_helper.h"
116116
117117
118+ // hooks for memory allocator, C-runtime allocator used per default
119+ #ifndef KHASH_MALLOC
120+ #define KHASH_MALLOC malloc
121+ #endif
122+
123+ #ifndef KHASH_REALLOC
124+ #define KHASH_REALLOC realloc
125+ #endif
126+
127+ #ifndef KHASH_CALLOC
128+ #define KHASH_CALLOC calloc
129+ #endif
130+
131+ #ifndef KHASH_FREE
132+ #define KHASH_FREE free
133+ #endif
134+
135+
118136#if UINT_MAX == 0xffffffffu
119137typedef unsigned int khint32_t ;
120138#elif ULONG_MAX == 0xffffffffu
@@ -265,14 +283,14 @@ static const double __ac_HASH_UPPER = 0.77;
265283 khval_t *vals; \
266284 } kh_##name##_t; \
267285 SCOPE kh_##name##_t *kh_init_##name(void) { \
268- return (kh_##name##_t*)calloc (1, sizeof(kh_##name##_t)); \
286+ return (kh_##name##_t*)KHASH_CALLOC (1, sizeof(kh_##name##_t)); \
269287 } \
270288 SCOPE void kh_destroy_##name(kh_##name##_t *h) \
271289 { \
272290 if (h) { \
273- free (h->keys); free (h->flags); \
274- free (h->vals); \
275- free (h); \
291+ KHASH_FREE (h->keys); KHASH_FREE (h->flags); \
292+ KHASH_FREE (h->vals); \
293+ KHASH_FREE (h); \
276294 } \
277295 } \
278296 SCOPE void kh_clear_##name(kh_##name##_t *h) \
@@ -305,11 +323,11 @@ static const double __ac_HASH_UPPER = 0.77;
305323 if (new_n_buckets < 4 ) new_n_buckets = 4 ; \
306324 if (h -> size >= (khint_t )(new_n_buckets * __ac_HASH_UPPER + 0.5 )) j = 0 ; /* requested size is too small */ \
307325 else { /* hash table size to be changed (shrink or expand); rehash */ \
308- new_flags = (khint32_t * )malloc (__ac_fsize (new_n_buckets ) * sizeof (khint32_t )); \
326+ new_flags = (khint32_t * )KHASH_MALLOC (__ac_fsize (new_n_buckets ) * sizeof (khint32_t )); \
309327 memset (new_flags , 0xff , __ac_fsize (new_n_buckets ) * sizeof (khint32_t )); \
310328 if (h -> n_buckets < new_n_buckets ) { /* expand */ \
311- h -> keys = (khkey_t * )realloc (h -> keys , new_n_buckets * sizeof (khkey_t )); \
312- if (kh_is_map ) h -> vals = (khval_t * )realloc (h -> vals , new_n_buckets * sizeof (khval_t )); \
329+ h -> keys = (khkey_t * )KHASH_REALLOC (h -> keys , new_n_buckets * sizeof (khkey_t )); \
330+ if (kh_is_map ) h -> vals = (khval_t * )KHASH_REALLOC (h -> vals , new_n_buckets * sizeof (khval_t )); \
313331 } /* otherwise shrink */ \
314332 } \
315333 } \
@@ -342,10 +360,10 @@ static const double __ac_HASH_UPPER = 0.77;
342360 } \
343361 } \
344362 if (h -> n_buckets > new_n_buckets ) { /* shrink the hash table */ \
345- h -> keys = (khkey_t * )realloc (h -> keys , new_n_buckets * sizeof (khkey_t )); \
346- if (kh_is_map ) h -> vals = (khval_t * )realloc (h -> vals , new_n_buckets * sizeof (khval_t )); \
363+ h -> keys = (khkey_t * )KHASH_REALLOC (h -> keys , new_n_buckets * sizeof (khkey_t )); \
364+ if (kh_is_map ) h -> vals = (khval_t * )KHASH_REALLOC (h -> vals , new_n_buckets * sizeof (khval_t )); \
347365 } \
348- free (h -> flags ); /* free the working space */ \
366+ KHASH_FREE (h -> flags ); /* free the working space */ \
349367 h -> flags = new_flags ; \
350368 h -> n_buckets = new_n_buckets ; \
351369 h -> n_occupied = h -> size ; \
0 commit comments