XROAD
xroad_hashmap.h
Go to the documentation of this file.
1 
6 #pragma once
7 
8 #include "xroad_common_fwd.h"
9 #include "xroad_common_types.h"
10 #include "xroad_aux.h"
11 #include <stdlib.h>
12 #include <stddef.h>
13 #include <stdalign.h>
14 
15 #ifdef __cplusplus
16 extern "C"
17 {
18 #endif
19 
23 #define XROAD_HASHMAP_ENTRY_STRUCT(key_type, value_type) struct { int8_t info; key_type key; value_type value; int8_t last_member; }
24 #define XROAD_HASHMAP_ENTRY_KEY_OFFSET(key_type, value_type) offsetof(XROAD_HASHMAP_ENTRY_STRUCT(key_type, value_type), key)
25 #define XROAD_HASHMAP_ENTRY_VALUE_OFFSET(key_type, value_type) offsetof(XROAD_HASHMAP_ENTRY_STRUCT(key_type, value_type), value)
26 #define XROAD_HASHMAP_ENTRY_SIZE(key_type, value_type) offsetof(XROAD_HASHMAP_ENTRY_STRUCT(key_type, value_type), last_member)
27 
31 typedef uint32_t (*xroad_hashmap_hash_func_t)(const void*, uint32_t);
32 
36 typedef int32_t (*xroad_hashmap_equal_func_t)(const void*, const void*, uint32_t);
37 
41 typedef void (*xroad_hashmap_free_func_t)(void*);
42 
49 uint32_t xroad_hashmap_hash_func_cstr(const void*, uint32_t);
50 int32_t xroad_hashmap_equal_func_cstr(const void*, const void*, uint32_t);
51 void xroad_hashmap_free_func_cstr(void*);
52 
59 uint32_t xroad_hashmap_hash_func_xroad_str(const void*, uint32_t);
60 int32_t xroad_hashmap_equal_func_xroad_str(const void*, const void*, uint32_t);
61 void xroad_hashmap_free_func_xroad_str(void*);
62 
66 typedef struct
67 {
68  uint32_t initial_size;
72  xroad_hashmap_free_func_t value_dtor;
73  xroad_mem_pool_t* pool;
75 
79 typedef struct
80 {
81  xroad_hashmap_entry_t* entry;
82  xroad_errno_t result;
84 
101  uint32_t sizeof_value,
102  uint32_t sizeof_entry,
103  uint32_t key_offset,
104  uint32_t value_offset,
105  uint32_t initiad_size,
106  xroad_hashmap_hash_func_t hash_func,
107  xroad_hashmap_equal_func_t equal_func,
108  xroad_hashmap_free_func_t key_free_func,
109  xroad_hashmap_free_func_t value_free_func,
110  xroad_mem_pool_t* pool);
111 
112 #define xroad_hashmap_create(key_type, value_type, ...) \
113 ({ \
114  xroad_hashmap_va_args_t args = {__VA_ARGS__}; \
115  xroad_hashmap_create_ex(sizeof(key_type), sizeof(value_type), \
116  XROAD_HASHMAP_ENTRY_SIZE(key_type, value_type), \
117  XROAD_HASHMAP_ENTRY_KEY_OFFSET(key_type, value_type), \
118  XROAD_HASHMAP_ENTRY_VALUE_OFFSET(key_type, value_type), \
119  args.initial_size, args.hash, args.equal, \
120  args.key_dtor, args.value_dtor, args.pool); \
121 })
122 
128 
129 #define __xroad_hashmap_dtor__ __dtor__(xroad_hashmap_destructor)
130 void xroad_hashmap_destructor(void* hashmap_ptr);
131 
137 void xroad_hashmap_reserve(xroad_hashmap_t* hashmap, uint32_t size);
138 
147 xroad_hashmap_insert_result_t xroad_hashmap_insert(xroad_hashmap_t* hashmap, const void* key, const void* value);
148 
155 xroad_hashmap_entry_t* xroad_hashmap_find(xroad_hashmap_t* hashmap, const void* key);
156 
162 
169 
176 
184 xroad_errno_t xroad_hashmap_delete(xroad_hashmap_t* hashmap, const void* key, bool free_resources);
185 
192 
199 
206 
213 void* xroad_hashmap_entry_get_key(xroad_hashmap_t* hashmap, xroad_hashmap_entry_t* entry);
214 
221 void* xroad_hashmap_entry_get_value(xroad_hashmap_t* hashmap, xroad_hashmap_entry_t* entry);
222 
230 void xroad_hashmap_entry_set_value(xroad_hashmap_t* hashmap, xroad_hashmap_entry_t* entry, const void* value, bool free_resources);
231 
238 void xroad_hashmap_entry_delete(xroad_hashmap_t* hashmap, xroad_hashmap_entry_t* entry, bool free_resources);
239 
247 xroad_hashmap_entry_t* xroad_hashmap_entry_delete_and_get_next(xroad_hashmap_t* hashmap, xroad_hashmap_entry_t* entry, bool free_resources);
248 
254 xroad_hashmap_entry_t* xroad_hashmap_get_first(xroad_hashmap_t* hashmap);
255 
261 xroad_hashmap_entry_t* xroad_hashmap_entry_get_next(xroad_hashmap_t* hashmap, xroad_hashmap_entry_t* entry);
262 
263 #ifdef __cplusplus
264 }
265 #endif
Definition: xroad_hashmap.h:80
xroad_hashmap_entry_t * entry
inserted or existing entry
Definition: xroad_hashmap.h:81
xroad_errno_t result
result of insertion
Definition: xroad_hashmap.h:82
Definition: xroad_hashmap.h:67
struct xroad_list_s xroad_list_t
see common/xroad_list.h for deaails
Definition: xroad_common_fwd.h:24
struct xroad_hashmap_s xroad_hashmap_t
see common/xroad_hash.h for details
Definition: xroad_common_fwd.h:19
void xroad_hashmap_entry_set_value(xroad_hashmap_t *hashmap, xroad_hashmap_entry_t *entry, const void *value, bool free_resources)
xroad_hashmap_insert_result_t xroad_hashmap_insert(xroad_hashmap_t *hashmap, const void *key, const void *value)
uint32_t xroad_hashmap_get_key_size(const xroad_hashmap_t *hashmap)
void * xroad_hashmap_entry_get_value(xroad_hashmap_t *hashmap, xroad_hashmap_entry_t *entry)
xroad_list_t * xroad_hashmap_keys_to_list(xroad_hashmap_t *hashmap)
uint32_t xroad_hashmap_hash_func_xroad_str(const void *, uint32_t)
xroad_hashmap_entry_t * xroad_hashmap_entry_get_next(xroad_hashmap_t *hashmap, xroad_hashmap_entry_t *entry)
void * xroad_hashmap_entry_get_key(xroad_hashmap_t *hashmap, xroad_hashmap_entry_t *entry)
void(* xroad_hashmap_free_func_t)(void *)
Definition: xroad_hashmap.h:41
uint32_t xroad_hashmap_get_size(xroad_hashmap_t *hashmap)
uint32_t(* xroad_hashmap_hash_func_t)(const void *, uint32_t)
Definition: xroad_hashmap.h:31
xroad_errno_t xroad_hashmap_delete(xroad_hashmap_t *hashmap, const void *key, bool free_resources)
uint32_t xroad_hashmap_get_value_size(const xroad_hashmap_t *hashmap)
void xroad_hashmap_destroy(xroad_hashmap_t *hashmap)
int32_t(* xroad_hashmap_equal_func_t)(const void *, const void *, uint32_t)
Definition: xroad_hashmap.h:36
void xroad_hashmap_clear(xroad_hashmap_t *hashmap)
xroad_list_t * xroad_hashmap_values_to_list(xroad_hashmap_t *hashmap)
uint32_t xroad_hashmap_hash_func_cstr(const void *, uint32_t)
void xroad_hashmap_entry_delete(xroad_hashmap_t *hashmap, xroad_hashmap_entry_t *entry, bool free_resources)
xroad_hashmap_entry_t * xroad_hashmap_find(xroad_hashmap_t *hashmap, const void *key)
xroad_hashmap_entry_t * xroad_hashmap_entry_delete_and_get_next(xroad_hashmap_t *hashmap, xroad_hashmap_entry_t *entry, bool free_resources)
xroad_hashmap_t * xroad_hashmap_create_ex(uint32_t sizeof_key, uint32_t sizeof_value, uint32_t sizeof_entry, uint32_t key_offset, uint32_t value_offset, uint32_t initiad_size, xroad_hashmap_hash_func_t hash_func, xroad_hashmap_equal_func_t equal_func, xroad_hashmap_free_func_t key_free_func, xroad_hashmap_free_func_t value_free_func, xroad_mem_pool_t *pool)
xroad_hashmap_entry_t * xroad_hashmap_get_first(xroad_hashmap_t *hashmap)
void xroad_hashmap_reserve(xroad_hashmap_t *hashmap, uint32_t size)