mirror of
https://github.com/systemd/systemd-stable.git
synced 2024-12-24 21:34:08 +03:00
implement hashmap_copy() and hashmap_merge()
This commit is contained in:
parent
3efd419567
commit
91cdde8a7a
36
hashmap.c
36
hashmap.c
@ -18,7 +18,6 @@
|
|||||||
struct hashmap_entry {
|
struct hashmap_entry {
|
||||||
const void *key;
|
const void *key;
|
||||||
void *value;
|
void *value;
|
||||||
|
|
||||||
struct hashmap_entry *bucket_next, *bucket_previous;
|
struct hashmap_entry *bucket_next, *bucket_previous;
|
||||||
struct hashmap_entry *iterate_next, *iterate_previous;
|
struct hashmap_entry *iterate_next, *iterate_previous;
|
||||||
};
|
};
|
||||||
@ -323,3 +322,38 @@ bool hashmap_isempty(Hashmap *h) {
|
|||||||
|
|
||||||
return h->n_entries == 0;
|
return h->n_entries == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int hashmap_merge(Hashmap *h, Hashmap *other) {
|
||||||
|
struct hashmap_entry *e;
|
||||||
|
|
||||||
|
assert(h);
|
||||||
|
|
||||||
|
if (!other)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
for (e = other->iterate_list_head; e; e = e->iterate_next) {
|
||||||
|
int r;
|
||||||
|
|
||||||
|
if ((r = hashmap_put(h, e->key, e->value)) < 0)
|
||||||
|
if (r != -EEXIST)
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Hashmap *hashmap_copy(Hashmap *h) {
|
||||||
|
Hashmap *copy;
|
||||||
|
|
||||||
|
assert(h);
|
||||||
|
|
||||||
|
if (!(copy = hashmap_new(h->hash_func, h->compare_func)))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (hashmap_merge(copy, h) < 0) {
|
||||||
|
hashmap_free(copy);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return copy;
|
||||||
|
}
|
||||||
|
@ -22,12 +22,15 @@ unsigned trivial_hash_func(const void *p);
|
|||||||
int trivial_compare_func(const void *a, const void *b);
|
int trivial_compare_func(const void *a, const void *b);
|
||||||
|
|
||||||
Hashmap *hashmap_new(hash_func_t hash_func, compare_func_t compare_func);
|
Hashmap *hashmap_new(hash_func_t hash_func, compare_func_t compare_func);
|
||||||
void hashmap_free(Hashmap*);
|
void hashmap_free(Hashmap *h);
|
||||||
|
Hashmap *hashmap_copy(Hashmap *h);
|
||||||
|
|
||||||
int hashmap_put(Hashmap *h, const void *key, void *value);
|
int hashmap_put(Hashmap *h, const void *key, void *value);
|
||||||
void* hashmap_get(Hashmap *h, const void *key);
|
void* hashmap_get(Hashmap *h, const void *key);
|
||||||
void* hashmap_remove(Hashmap *h, const void *key);
|
void* hashmap_remove(Hashmap *h, const void *key);
|
||||||
|
|
||||||
|
int hashmap_merge(Hashmap *h, Hashmap *other);
|
||||||
|
|
||||||
unsigned hashmap_size(Hashmap *h);
|
unsigned hashmap_size(Hashmap *h);
|
||||||
bool hashmap_isempty(Hashmap *h);
|
bool hashmap_isempty(Hashmap *h);
|
||||||
|
|
||||||
|
8
set.c
8
set.c
@ -61,3 +61,11 @@ void* set_first(Set *s) {
|
|||||||
void* set_last(Set *s) {
|
void* set_last(Set *s) {
|
||||||
return hashmap_last(MAKE_HASHMAP(s));
|
return hashmap_last(MAKE_HASHMAP(s));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int set_merge(Set *s, Set *other) {
|
||||||
|
return hashmap_merge(MAKE_HASHMAP(s), MAKE_HASHMAP(other));
|
||||||
|
}
|
||||||
|
|
||||||
|
Set* set_copy(Set *s) {
|
||||||
|
return MAKE_SET(hashmap_copy(MAKE_HASHMAP(s)));
|
||||||
|
}
|
||||||
|
15
set.h
15
set.h
@ -14,21 +14,24 @@
|
|||||||
typedef struct Set Set;
|
typedef struct Set Set;
|
||||||
|
|
||||||
Set *set_new(hash_func_t hash_func, compare_func_t compare_func);
|
Set *set_new(hash_func_t hash_func, compare_func_t compare_func);
|
||||||
void set_free(Set* set);
|
Set* set_copy(Set *s);
|
||||||
|
void set_free(Set* s);
|
||||||
|
|
||||||
int set_put(Set *s, void *value);
|
int set_put(Set *s, void *value);
|
||||||
void *set_get(Set *s, void *value);
|
void *set_get(Set *s, void *value);
|
||||||
void *set_remove(Set *s, void *value);
|
void *set_remove(Set *s, void *value);
|
||||||
|
|
||||||
|
int set_merge(Set *s, Set *other);
|
||||||
|
|
||||||
unsigned set_size(Set *s);
|
unsigned set_size(Set *s);
|
||||||
bool set_isempty(Set *s);
|
bool set_isempty(Set *s);
|
||||||
|
|
||||||
void *set_iterate(Set *h, void **state);
|
void *set_iterate(Set *s, void **state);
|
||||||
void *set_iterate_backwards(Set *h, void **state);
|
void *set_iterate_backwards(Set *s, void **state);
|
||||||
|
|
||||||
void *set_steal_first(Set *h);
|
void *set_steal_first(Set *s);
|
||||||
void* set_first(Set *h);
|
void* set_first(Set *s);
|
||||||
void* set_last(Set *h);
|
void* set_last(Set *s);
|
||||||
|
|
||||||
#define SET_FOREACH(e, s, state) \
|
#define SET_FOREACH(e, s, state) \
|
||||||
for ((state) = NULL, (e) = set_iterate((s), &(state)); (e); (e) = set_iterate((s), &(state)))
|
for ((state) = NULL, (e) = set_iterate((s), &(state)); (e); (e) = set_iterate((s), &(state)))
|
||||||
|
Loading…
Reference in New Issue
Block a user