31static void cstl_map_iterator_init(
const cstl_map_t *
const m,
33 struct cstl_map_node *
const node)
47static struct cstl_map_node * cstl_map_node_alloc(
48 const void *
const key,
void *
const val)
50 struct cstl_map_node *
const n = malloc(
sizeof(*n));
59static void cstl_map_node_free(
void *
const n)
65static int cstl_map_node_cmp(
const void *
const _a,
const void *
const _b,
70 const struct cstl_map_node *
const a = _a;
71 const struct cstl_map_node *
const b = _b;
73 return m->cmp.f(a->key, b->key, m->cmp.p);
85static void __cstl_map_node_clear(
void *
const n,
void *
const p)
87 struct cmc_priv *
const cmc = p;
88 struct cstl_map_node *
const node = n;
90 if (cmc->clr != NULL) {
93 cstl_map_iterator_init(cmc->map, &i, node);
96 cmc->clr(&i, cmc->priv);
99 cstl_map_node_free(node);
121 cstl_map_node_cmp, map,
122 offsetof(
struct cstl_map_node, n));
126static struct cstl_map_node * __cstl_map_find(
127 const cstl_map_t *
const map,
const void *
const key,
128 struct cstl_map_node **
const p)
130 struct cstl_map_node node;
137 const void *
const key,
140 cstl_map_iterator_init(
141 map, i, __cstl_map_find(map, key, NULL));
168 struct cstl_map_node *
const n = i->_;
169 __cstl_rbtree_erase(&map->t, &n->n);
170 cstl_map_node_free(n);
174 const void *
const key,
void *
const val,
177 struct cstl_map_node * node, * p;
181 node = __cstl_map_find(map, key, &p);
185 node = cstl_map_node_alloc(key, val);
193 cstl_map_iterator_init(map, i, node);
212static int map_key_cmp(
const void *
const a,
const void *
const b,
215 return cstl_string_compare(
221static void map_elem_clear(
void *
const e,
void *
const nil)
227 cstl_string_clear(s);
246 for (j = 0; j < (int)(
'z' -
'a') + 1; j++) {
251 s = malloc(
sizeof(*s));
252 ck_assert_ptr_ne(s, NULL);
254 cstl_string_resize(s, 1);
255 *cstl_string_data(s) =
'a' + j;
257 i = malloc(
sizeof(*i));
258 ck_assert_ptr_nonnull(i);
262 ck_assert_int_eq(res, 0);
263 ck_assert_ptr_nonnull(iter._);
264 ck_assert_ptr_eq(iter.
key, s);
265 ck_assert_ptr_eq(iter.
val, i);
275 s = malloc(
sizeof(*s));
276 ck_assert_ptr_ne(s, NULL);
278 cstl_string_resize(s, 1);
279 *cstl_string_data(s) =
'a' + j;
281 i = malloc(
sizeof(*i));
282 ck_assert_ptr_nonnull(i);
287 ck_assert_int_eq(res, 1);
288 ck_assert_ptr_nonnull(iter._);
289 ck_assert_ptr_ne(iter.
key, s);
290 ck_assert_ptr_ne(iter.
val, i);
293 cstl_string_clear(s);
317 cstl_string_set_str(&s,
"a");
320 ck_assert_ptr_nonnull(i.key);
321 ck_assert_ptr_nonnull(i.val);
322 ck_assert_int_eq(*(
int *)i.val, 0);
324 cstl_string_set_str(&s,
"j");
327 ck_assert_ptr_nonnull(i.key);
328 ck_assert_ptr_nonnull(i.val);
329 ck_assert_int_eq(*(
int *)i.val, 9);
331 cstl_string_set_str(&s,
"z");
334 ck_assert_ptr_nonnull(i.key);
335 ck_assert_ptr_nonnull(i.val);
336 ck_assert_int_eq(*(
int *)i.val, 25);
339 cstl_string_clear(&s);
353 cstl_string_set_str(&s,
"j");
357 ck_assert_ptr_nonnull(i.key);
358 ck_assert_ptr_nonnull(i.val);
359 map_elem_clear(&i, NULL);
363 cstl_string_set_str(&s,
"m");
365 ck_assert_int_eq(res, 0);
366 ck_assert_ptr_nonnull(i.key);
367 ck_assert_ptr_nonnull(i.val);
368 map_elem_clear(&i, NULL);
373 cstl_string_clear(&s);
376Suite * map_suite(
void)
378 Suite *
const s = suite_create(
"map");
382 tc = tcase_create(
"map");
383 tcase_add_test(tc, init);
384 tcase_add_test(tc, fill);
385 tcase_add_test(tc, find);
386 tcase_add_test(tc, erase);
388 suite_add_tcase(s, tc);
void cstl_xtor_func_t(void *obj, void *priv)
Type for functions called to construct, clear, or destroy an object.
int cstl_compare_func_t(const void *obj1, const void *obj2, void *priv)
Function type for comparing (in)equality of two objects.
int cstl_map_erase(cstl_map_t *const map, const void *const key, cstl_map_iterator_t *const _i)
Erase the element with the supplied key from the map.
void cstl_map_clear(cstl_map_t *const map, cstl_xtor_func_t *const clr, void *const priv)
Remove all elements from the map.
void cstl_map_find(const cstl_map_t *const map, const void *const key, cstl_map_iterator_t *const i)
Find an element in the map with a matching key.
void cstl_map_init(cstl_map_t *const map, cstl_compare_func_t *const cmp, void *const priv)
Initialize a map.
static bool cstl_map_iterator_eq(const cstl_map_iterator_t *const a, const cstl_map_iterator_t *const b)
Compare two iterators for equality.
void cstl_map_erase_iterator(cstl_map_t *const map, cstl_map_iterator_t *const i)
Erase the element pointed to by the iterator.
int cstl_map_insert(cstl_map_t *const map, const void *const key, void *const val, cstl_map_iterator_t *const i)
Insert a key/value pair into the map.
const cstl_map_iterator_t * cstl_map_iterator_end(const cstl_map_t *const m)
Return an iterator that refers to the end of the map.
static void cstl_rbtree_init(struct cstl_rbtree *const t, cstl_compare_func_t *const cmp, void *const priv, const size_t off)
Initialize a red-black tree object.
void cstl_rbtree_insert(struct cstl_rbtree *t, void *e, void *p)
Insert a new object into the tree.
static const void * cstl_rbtree_find(const struct cstl_rbtree *const t, const void *const e, const void **const p)
Find an element within a tree.
static void cstl_rbtree_clear(struct cstl_rbtree *const t, cstl_xtor_func_t *const clr, void *const priv)
Remove all elements from the tree.
#define DECLARE_CSTL_STRING(TYPE, NAME)
(Statically) declare and initialize a vector
struct cstl_string cstl_string_t
String of narrow characters.
A pointer to an element within the map.
void * val
Pointer to the value contained by the element.
const void * key
Pointer to the key associated with the element.
Node to anchor an element within a red-black tree.