diff options
| author | Marc André Tanner <mat@brain-dump.org> | 2016-01-12 22:38:45 +0100 |
|---|---|---|
| committer | Marc André Tanner <mat@brain-dump.org> | 2016-01-13 21:38:20 +0100 |
| commit | 2c0d472e87625000c71626fc965e7d1060f4ac7d (patch) | |
| tree | 01409e1c5b469f23eb5263899a5b5a4cb3233cf3 | |
| parent | 0b886f820677aa949c9ce6f16378a73863e537dd (diff) | |
| download | vis-2c0d472e87625000c71626fc965e7d1060f4ac7d.tar.gz vis-2c0d472e87625000c71626fc965e7d1060f4ac7d.tar.xz | |
map: implement map_copy
Copies all entries from one map to another, overwriting existing entries.
| -rw-r--r-- | map.c | 22 | ||||
| -rw-r--r-- | map.h | 2 |
2 files changed, 24 insertions, 0 deletions
@@ -284,6 +284,28 @@ void map_clear(Map *map) map->v = NULL; } +static bool copy(Map *dest, Map n) +{ + if (!n.v) { + return copy(dest, n.u.n->child[0]) && + copy(dest, n.u.n->child[1]); + } else { + if (!map_put(dest, n.u.s, n.v) && map_get(dest, n.u.s) != n.v) { + map_delete(dest, n.u.s); + return map_put(dest, n.u.s, n.v); + } + return true; + } +} + +bool map_copy(Map *dest, Map *src) +{ + if (!src || !src->u.n) + return true; + + return copy(dest, *src); +} + bool map_empty(const Map *map) { return map->u.n == NULL; @@ -21,6 +21,8 @@ bool map_put(Map*, const char *key, const void *value); /* Remove a member from the map. Returns the removed entry or NULL * if there was no entry found using the given key*/ void *map_delete(Map*, const char *key); +/* Copy all entries from `src' into `dest', overwrites existing entries in `dest' */ +bool map_copy(Map *dest, Map *src); /* Ordered iteration over a map, call handle for every entry. If handle * returns false, the iteration will stop. */ void map_iterate(const Map*, bool (*handle)(const char *key, void *value, void *data), const void *data); |
