7#define A02E572A_DDD85_4D77_AC81_41037EDE290A
24#ifndef INITIAL_MAP_SIZE
25#define INITIAL_MAP_SIZE (size_t)16
28#ifndef LOAD_FACTOR_THRESHOLD
29#define LOAD_FACTOR_THRESHOLD (double)0.75
33#define CACHE_LINE_SIZE 64
36#if defined(__GNUC__) || defined(__clang__)
37#define PREFETCH_READ(addr) __builtin_prefetch((addr), 0, 3)
38#define PREFETCH_WRITE(addr) __builtin_prefetch((addr), 1, 3)
39#elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64))
41#define PREFETCH_READ(addr) _mm_prefetch((char*)(addr), _MM_HINT_T0)
42#define PREFETCH_WRITE(addr) _mm_prefetch((char*)(addr), _MM_HINT_T0)
43#elif defined(__has_builtin)
44#if __has_builtin(__builtin_prefetch)
45#define PREFETCH_READ(addr) __builtin_prefetch((addr), 0, 3)
46#define PREFETCH_WRITE(addr) __builtin_prefetch((addr), 1, 3)
48#define PREFETCH_READ(addr) ((void)0)
49#define PREFETCH_WRITE(addr) ((void)0)
52#define PREFETCH_READ(addr) ((void)0)
53#define PREFETCH_WRITE(addr) ((void)0)
56typedef size_t (*HashFunction)(
const void* key,
size_t size);
57typedef bool (*KeyCmpFunction)(
const void* key1,
const void* key2);
58typedef void (*KeyFreeFunction)(
void* key);
59typedef void (*ValueFreeFunction)(
void* value);
62 size_t initial_capacity;
64 KeyCmpFunction key_compare;
65 KeyFreeFunction key_free;
66 ValueFreeFunction value_free;
68 float max_load_factor;
69 HashFunction hash_func;
72#define MapConfigInt (&(MapConfig){.key_compare = key_compare_int})
73#define MapConfigFloat (&(MapConfig){.key_compare = key_compare_float})
74#define MapConfigDouble (&(MapConfig){.key_compare = key_compare_double})
75#define MapConfigStr (&(MapConfig){.key_compare = key_compare_char_ptr})
78typedef struct hash_map HashMap;
84HashMap* map_create(
const MapConfig* config);
87void map_destroy(HashMap* m);
91bool map_set(HashMap* m,
void* key,
size_t key_len,
void* value);
94bool map_set_safe(HashMap* m,
void* key,
size_t key_len,
void* value);
97void* map_get(HashMap* m,
void* key,
size_t key_len);
100void* map_get_safe(HashMap* m,
void* key,
size_t key_len);
103bool map_remove(HashMap* m,
void* key,
size_t key_len);
106bool map_remove_safe(HashMap* m,
void* key,
size_t key_len);
115map_iterator map_iter(HashMap* m);
118bool map_next(map_iterator* it,
void** key,
void** value);
121size_t map_length(HashMap* m);
124size_t map_capacity(HashMap* m);
126static inline bool key_compare_int(
const void* a,
const void* b) {
return a && b && *(
const int*)a == *(
const int*)b; }
128static inline bool key_compare_char_ptr(
const void* a,
const void* b) {
129 return a && b && strcmp((
const char*)a, (
const char*)b) == 0;
132static inline bool key_compare_float(
const void* a,
const void* b) {
133 return a && b && cmp_float(*(
const float*)a, *(
const float*)b, (
cmp_config_t){.epsilon = FLT_EPSILON});
136static inline bool key_compare_double(
const void* a,
const void* b) {
137 return a && b && cmp_double(*(
const double*)a, *(
const double*)b, (
cmp_config_t){.epsilon = DBL_EPSILON});
140#if defined(__cplusplus)
Floating-point comparison library for precise and robust comparisons.
Default configuration for each floating-point type.