return _hashmap_first_key(HASHMAP_BASE(h), false);
}
-#define hashmap_clear_with_destructor(h, f) \
- ({ \
- Hashmap *_h = (h); \
- void *_item; \
- while ((_item = hashmap_steal_first(_h))) \
- f(_item); \
- _h; \
- })
-#define hashmap_free_with_destructor(h, f) \
- hashmap_free(hashmap_clear_with_destructor(h, f))
-#define ordered_hashmap_clear_with_destructor(h, f) \
- ({ \
- OrderedHashmap *_h = (h); \
- void *_item; \
- while ((_item = ordered_hashmap_steal_first(_h))) \
- f(_item); \
- _h; \
- })
-#define ordered_hashmap_free_with_destructor(h, f) \
- ordered_hashmap_free(ordered_hashmap_clear_with_destructor(h, f))
-
/* no hashmap_next */
void* ordered_hashmap_next(OrderedHashmap *h, const void *key);
#define ORDERED_SET_FOREACH(e, s) \
_ORDERED_SET_FOREACH(e, s, UNIQ_T(i, UNIQ))
-#define ordered_set_clear_with_destructor(s, f) \
- ({ \
- OrderedSet *_s = (s); \
- void *_item; \
- while ((_item = ordered_set_steal_first(_s))) \
- f(_item); \
- _s; \
- })
-#define ordered_set_free_with_destructor(s, f) \
- ordered_set_free(ordered_set_clear_with_destructor(s, f))
-
DEFINE_TRIVIAL_CLEANUP_FUNC(OrderedSet*, ordered_set_free);
#define _cleanup_ordered_set_free_ _cleanup_(ordered_set_freep)
return _hashmap_first_key_and_value(HASHMAP_BASE(s), true, NULL);
}
-#define set_clear_with_destructor(s, f) \
- ({ \
- Set *_s = (s); \
- void *_item; \
- while ((_item = set_steal_first(_s))) \
- f(_item); \
- _s; \
- })
-#define set_free_with_destructor(s, f) \
- set_free(set_clear_with_destructor(s, f))
-
/* no set_steal_first_key */
/* no set_first_key */
}
}
-typedef struct Item {
- int seen;
-} Item;
-static void item_seen(Item *item) {
- item->seen++;
-}
-
-TEST(hashmap_free_with_destructor) {
- Hashmap *m;
- struct Item items[4] = {};
- unsigned i;
-
- assert_se(m = hashmap_new(NULL));
- for (i = 0; i < ELEMENTSOF(items) - 1; i++)
- assert_se(hashmap_put(m, INT_TO_PTR(i), items + i) == 1);
-
- m = hashmap_free_with_destructor(m, item_seen);
- assert_se(items[0].seen == 1);
- assert_se(items[1].seen == 1);
- assert_se(items[2].seen == 1);
- assert_se(items[3].seen == 0);
-}
-
TEST(hashmap_first) {
_cleanup_hashmap_free_ Hashmap *m = NULL;
item->seen++;
}
-TEST(set_free_with_destructor) {
- Set *m;
- struct Item items[4] = {};
-
- assert_se(m = set_new(NULL));
- FOREACH_ARRAY(item, items, ELEMENTSOF(items) - 1)
- assert_se(set_put(m, item) == 1);
-
- m = set_free_with_destructor(m, item_seen);
- assert_se(items[0].seen == 1);
- assert_se(items[1].seen == 1);
- assert_se(items[2].seen == 1);
- assert_se(items[3].seen == 0);
-}
-
DEFINE_PRIVATE_HASH_OPS_WITH_VALUE_DESTRUCTOR(item_hash_ops, void, trivial_hash_func, trivial_compare_func, Item, item_seen);
TEST(set_free_with_hash_ops) {