1
0
mirror of https://github.com/systemd/systemd.git synced 2024-12-22 17:35:35 +03:00

introduce hashmap_ensure_replace()

Similar to hashmap_ensure_put(), but replace existing items in the map,
as hashmap_replace().
This commit is contained in:
Matteo Croce 2024-06-28 16:16:50 +02:00
parent 127e600a6c
commit afb1fe36b8
3 changed files with 49 additions and 0 deletions

View File

@ -874,6 +874,26 @@ int _ordered_hashmap_ensure_put(OrderedHashmap **h, const struct hash_ops *hash_
return ordered_hashmap_put(*h, key, value);
}
int _ordered_hashmap_ensure_replace(OrderedHashmap **h, const struct hash_ops *hash_ops, const void *key, void *value HASHMAP_DEBUG_PARAMS) {
int r;
r = _ordered_hashmap_ensure_allocated(h, hash_ops HASHMAP_DEBUG_PASS_ARGS);
if (r < 0)
return r;
return ordered_hashmap_replace(*h, key, value);
}
int _hashmap_ensure_replace(Hashmap **h, const struct hash_ops *hash_ops, const void *key, void *value HASHMAP_DEBUG_PARAMS) {
int r;
r = _hashmap_ensure_allocated(h, hash_ops HASHMAP_DEBUG_PASS_ARGS);
if (r < 0)
return r;
return hashmap_replace(*h, key, value);
}
static void hashmap_free_no_clear(HashmapBase *h) {
assert(!h->has_indirect);
assert(h->n_direct_entries == 0);

View File

@ -130,14 +130,19 @@ HashmapBase* _hashmap_copy(HashmapBase *h HASHMAP_DEBUG_PARAMS);
int _hashmap_ensure_allocated(Hashmap **h, const struct hash_ops *hash_ops HASHMAP_DEBUG_PARAMS);
int _hashmap_ensure_put(Hashmap **h, const struct hash_ops *hash_ops, const void *key, void *value HASHMAP_DEBUG_PARAMS);
int _ordered_hashmap_ensure_allocated(OrderedHashmap **h, const struct hash_ops *hash_ops HASHMAP_DEBUG_PARAMS);
int _hashmap_ensure_replace(Hashmap **h, const struct hash_ops *hash_ops, const void *key, void *value HASHMAP_DEBUG_PARAMS);
#define hashmap_ensure_allocated(h, ops) _hashmap_ensure_allocated(h, ops HASHMAP_DEBUG_SRC_ARGS)
#define hashmap_ensure_put(s, ops, key, value) _hashmap_ensure_put(s, ops, key, value HASHMAP_DEBUG_SRC_ARGS)
#define ordered_hashmap_ensure_allocated(h, ops) _ordered_hashmap_ensure_allocated(h, ops HASHMAP_DEBUG_SRC_ARGS)
#define hashmap_ensure_replace(s, ops, key, value) _hashmap_ensure_replace(s, ops, key, value HASHMAP_DEBUG_SRC_ARGS)
int _ordered_hashmap_ensure_put(OrderedHashmap **h, const struct hash_ops *hash_ops, const void *key, void *value HASHMAP_DEBUG_PARAMS);
#define ordered_hashmap_ensure_put(s, ops, key, value) _ordered_hashmap_ensure_put(s, ops, key, value HASHMAP_DEBUG_SRC_ARGS)
int _ordered_hashmap_ensure_replace(OrderedHashmap **h, const struct hash_ops *hash_ops, const void *key, void *value HASHMAP_DEBUG_PARAMS);
#define ordered_hashmap_ensure_replace(s, ops, key, value) _ordered_hashmap_ensure_replace(s, ops, key, value HASHMAP_DEBUG_SRC_ARGS)
IteratedCache* _hashmap_iterated_cache_new(HashmapBase *h);
static inline IteratedCache* hashmap_iterated_cache_new(Hashmap *h) {
return (IteratedCache*) _hashmap_iterated_cache_new(HASHMAP_BASE(h));

View File

@ -49,6 +49,30 @@ TEST(hashmap_replace) {
ASSERT_STREQ(r, "val5");
}
TEST(hashmap_ensure_replace) {
_cleanup_hashmap_free_ Hashmap *m = NULL;
_cleanup_free_ char *val1 = NULL, *val2 = NULL;
val1 = strdup("val1");
ASSERT_NOT_NULL(val1);
val2 = strdup("val2");
ASSERT_NOT_NULL(val2);
ASSERT_OK(hashmap_ensure_replace(&m, &string_hash_ops, val1, val2));
ASSERT_OK(hashmap_ensure_replace(&m, &string_hash_ops, "key 1", val1));
ASSERT_STREQ(hashmap_get(m, "key 1"), "val1");
ASSERT_OK(hashmap_ensure_replace(&m, &string_hash_ops, "key 2", val2));
ASSERT_STREQ(hashmap_get(m, "key 2"), "val2");
ASSERT_OK(hashmap_ensure_replace(&m, &string_hash_ops, "key 3", val1));
ASSERT_STREQ(hashmap_get(m, "key 3"), "val1");
ASSERT_OK(hashmap_ensure_replace(&m, &string_hash_ops, "key 3", val2));
ASSERT_STREQ(hashmap_get(m, "key 3"), "val2");
}
TEST(hashmap_copy) {
_cleanup_hashmap_free_ Hashmap *m = NULL;
_cleanup_hashmap_free_free_ Hashmap *copy = NULL;