CMagic  0.5.0
Portable C library of utilities and data structures
set.h
Go to the documentation of this file.
1 
8 #ifndef CMAGIC_SET_H
9 #define CMAGIC_SET_H
10 
11 #include <assert.h>
12 #include <stdbool.h>
13 #include <stddef.h>
14 #include "cmagic/memory.h"
15 #include "cmagic/utils.h"
16 
17 #ifdef __cplusplus
18 extern "C" {
19 #endif
20 
36 typedef int (*cmagic_set_key_comparator_t)(const void *key1, const void *key2);
37 
44 typedef void (*cmagic_set_erase_destructor_t)(void *key);
45 
46 void *
47 cmagic_set_new(size_t key_size, cmagic_set_key_comparator_t key_comparator,
48  const cmagic_memory_alloc_packet_t *alloc_packet);
49 
50 void
51 cmagic_set_free(void *set_ptr);
52 
53 typedef struct {
54  const void *key;
56 
60 typedef struct {
61 
67 
73 
75 
77 cmagic_set_allocate(void *set_ptr, const void *key);
78 
80 cmagic_set_insert(void *set_ptr, const void *key);
81 
82 void
83 cmagic_set_erase(void *set_ptr, const void *key, cmagic_set_erase_destructor_t destructor);
84 
85 void
86 cmagic_set_clear(void *set_ptr);
87 
88 size_t
89 cmagic_set_size(void *set_ptr);
90 
92 cmagic_set_first(void *set_ptr);
93 
95 cmagic_set_last(void *set_ptr);
96 
98 cmagic_set_iterator_next(cmagic_set_iterator_t iterator);
99 
101 cmagic_set_iterator_prev(cmagic_set_iterator_t iterator);
102 
104 cmagic_set_find(void *set_ptr, const void *key);
105 
107 cmagic_set_get_alloc_packet(void *set_ptr);
108 
113 #define CMAGIC_SET(key_type) key_type*
114 
124 #define CMAGIC_SET_NEW(key_type, key_comparator, alloc_packet) \
125  ((CMAGIC_SET(key_type))cmagic_set_new(sizeof(key_type), (key_comparator), (alloc_packet)))
126 
132 #define CMAGIC_SET_FREE(cmagic_set) cmagic_set_free((void*)(cmagic_set))
133 
145 #define CMAGIC_SET_ALLOCATE(cmagic_set, key) \
146  (CMAGIC_UTILS_ASSERT_SAME_TYPE(*(cmagic_set), *(key)), \
147  cmagic_set_allocate((void*)(cmagic_set), (key)))
148 
155 #define CMAGIC_SET_INSERT(cmagic_set, key) \
156  (CMAGIC_UTILS_ASSERT_SAME_TYPE(*(cmagic_set), *(key)), \
157  cmagic_set_insert((void*)(cmagic_set), (key)))
158 
168 #define CMAGIC_SET_ERASE_EXT(cmagic_set, key, destructor) \
169  (CMAGIC_UTILS_ASSERT_SAME_TYPE(*(cmagic_set), *(key)), \
170  cmagic_set_erase((void*)(cmagic_set), (key), (destructor)))
171 
179 #define CMAGIC_SET_ERASE(cmagic_set, key) CMAGIC_SET_ERASE_EXT(cmagic_set, key, NULL)
180 
185 #define CMAGIC_SET_CLEAR(cmagic_set) cmagic_set_clear((void*)(cmagic_set))
186 
192 #define CMAGIC_SET_SIZE(cmagic_set) cmagic_set_size((void*)(cmagic_set))
193 
201 #define CMAGIC_SET_FIRST(cmagic_set) cmagic_set_first((void*)(cmagic_set))
202 
210 #define CMAGIC_SET_LAST(cmagic_set) cmagic_set_last((void*)(cmagic_set))
211 
217 #define CMAGIC_SET_ITERATOR_NEXT(iterator) cmagic_set_iterator_next(iterator)
218 
225 #define CMAGIC_SET_ITERATOR_PREV(iterator) cmagic_set_iterator_prev(iterator)
226 
233 #define CMAGIC_SET_FIND(cmagic_set, key) (CMAGIC_UTILS_ASSERT_SAME_TYPE(*(cmagic_set), *(key)), \
234  cmagic_set_find((void*)(cmagic_set), (key)))
235 
243 #define CMAGIC_SET_GET_KEY(key_type, iterator) \
244  (assert(iterator), assert((iterator)->key), *((const key_type*)(iterator)->key))
245 
251 #define CMAGIC_SET_GET_ALLOC_PACKET(cmagic_set) \
252  cmagic_set_get_alloc_packet((void*)(cmagic_set))
253 
254 #ifdef __cplusplus
255 } // extern "C"
256 #endif
257 
258 #endif /* CMAGIC_SET_H */
Definition: set.h:53
Portable substitutes of standard malloc() and free() functions.
void(* cmagic_set_erase_destructor_t)(void *key)
User defined additional tasks to be executed right before key deletion.
Definition: set.h:44
Set of allocation functions. Used in some CMagic structures to specify a desired memory pool...
Definition: memory.h:187
Set insertion result.
Definition: set.h:60
bool already_exists
true if the element already exists in the set and the set was not modified, false if a new element ha...
Definition: set.h:72
int(* cmagic_set_key_comparator_t)(const void *key1, const void *key2)
Pointer to a function that compares two elements.
Definition: set.h:36
cmagic_set_iterator_t inserted_or_existing
iterator pointing to a new or already existing element or NULL if the allocation of a new element has...
Definition: set.h:66
General purpose utilities.