Line data Source code
1 1 : /*
2 : * Copyright (c) 2022 Meta
3 : *
4 : * SPDX-License-Identifier: Apache-2.0
5 : */
6 :
7 : /**
8 : * @file
9 : * @ingroup hashmap_implementations
10 : * @brief Separate Chaining Hashmap Implementation
11 : *
12 : * @note Enable with @kconfig{CONFIG_SYS_HASH_MAP_SC}
13 : */
14 :
15 : #ifndef ZEPHYR_INCLUDE_SYS_HASH_MAP_SC_H_
16 : #define ZEPHYR_INCLUDE_SYS_HASH_MAP_SC_H_
17 :
18 : #include <stdbool.h>
19 : #include <stddef.h>
20 : #include <stdint.h>
21 : #include <stdlib.h>
22 :
23 : #include <zephyr/sys/hash_function.h>
24 : #include <zephyr/sys/hash_map_api.h>
25 :
26 : #ifdef __cplusplus
27 : extern "C" {
28 : #endif
29 :
30 : /**
31 : * @brief Declare a Separate Chaining Hashmap (advanced)
32 : *
33 : * Declare a Separate Chaining Hashmap with control over advanced parameters.
34 : *
35 : * @note The allocator @p _alloc_func is used for allocating internal Hashmap
36 : * entries and does not interact with any user-provided keys or values.
37 : *
38 : * @param _name Name of the Hashmap.
39 : * @param _hash_func Hash function pointer of type @ref sys_hash_func32_t.
40 : * @param _alloc_func Allocator function pointer of type @ref sys_hashmap_allocator_t.
41 : * @param ... Details for @ref sys_hashmap_config.
42 : */
43 1 : #define SYS_HASHMAP_SC_DEFINE_ADVANCED(_name, _hash_func, _alloc_func, ...) \
44 : SYS_HASHMAP_DEFINE_ADVANCED(_name, &sys_hashmap_sc_api, sys_hashmap_config, \
45 : sys_hashmap_data, _hash_func, _alloc_func, __VA_ARGS__)
46 :
47 : /**
48 : * @brief Declare a Separate Chaining Hashmap (advanced)
49 : *
50 : * Declare a Separate Chaining Hashmap with control over advanced parameters.
51 : *
52 : * @note The allocator @p _alloc is used for allocating internal Hashmap
53 : * entries and does not interact with any user-provided keys or values.
54 : *
55 : * @param _name Name of the Hashmap.
56 : * @param _hash_func Hash function pointer of type @ref sys_hash_func32_t.
57 : * @param _alloc_func Allocator function pointer of type @ref sys_hashmap_allocator_t.
58 : * @param ... Details for @ref sys_hashmap_config.
59 : */
60 1 : #define SYS_HASHMAP_SC_DEFINE_STATIC_ADVANCED(_name, _hash_func, _alloc_func, ...) \
61 : SYS_HASHMAP_DEFINE_STATIC_ADVANCED(_name, &sys_hashmap_sc_api, sys_hashmap_config, \
62 : sys_hashmap_data, _hash_func, _alloc_func, __VA_ARGS__)
63 :
64 : /**
65 : * @brief Declare a Separate Chaining Hashmap statically
66 : *
67 : * Declare a Separate Chaining Hashmap statically with default parameters.
68 : *
69 : * @param _name Name of the Hashmap.
70 : */
71 1 : #define SYS_HASHMAP_SC_DEFINE_STATIC(_name) \
72 : SYS_HASHMAP_SC_DEFINE_STATIC_ADVANCED( \
73 : _name, sys_hash32, SYS_HASHMAP_DEFAULT_ALLOCATOR, \
74 : SYS_HASHMAP_CONFIG(SIZE_MAX, SYS_HASHMAP_DEFAULT_LOAD_FACTOR))
75 :
76 : /**
77 : * @brief Declare a Separate Chaining Hashmap
78 : *
79 : * Declare a Separate Chaining Hashmap with default parameters.
80 : *
81 : * @param _name Name of the Hashmap.
82 : */
83 1 : #define SYS_HASHMAP_SC_DEFINE(_name) \
84 : SYS_HASHMAP_SC_DEFINE_ADVANCED( \
85 : _name, sys_hash32, SYS_HASHMAP_DEFAULT_ALLOCATOR, \
86 : SYS_HASHMAP_CONFIG(SIZE_MAX, SYS_HASHMAP_DEFAULT_LOAD_FACTOR))
87 :
88 : #ifdef CONFIG_SYS_HASH_MAP_CHOICE_SC
89 : #define SYS_HASHMAP_DEFAULT_DEFINE(_name) SYS_HASHMAP_SC_DEFINE(_name)
90 : #define SYS_HASHMAP_DEFAULT_DEFINE_STATIC(_name) SYS_HASHMAP_SC_DEFINE_STATIC(_name)
91 : #define SYS_HASHMAP_DEFAULT_DEFINE_ADVANCED(_name, _hash_func, _alloc_func, ...) \
92 : SYS_HASHMAP_SC_DEFINE_ADVANCED(_name, _hash_func, _alloc_func, __VA_ARGS__)
93 : #define SYS_HASHMAP_DEFAULT_DEFINE_STATIC_ADVANCED(_name, _hash_func, _alloc_func, ...) \
94 : SYS_HASHMAP_SC_DEFINE_STATIC_ADVANCED(_name, _hash_func, _alloc_func, __VA_ARGS__)
95 : #endif
96 :
97 0 : extern const struct sys_hashmap_api sys_hashmap_sc_api;
98 :
99 : #ifdef __cplusplus
100 : }
101 : #endif
102 :
103 : #endif /* ZEPHYR_INCLUDE_SYS_HASH_MAP_SC_H_ */
|