From 2c0d472e87625000c71626fc965e7d1060f4ac7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Tue, 12 Jan 2016 22:38:45 +0100 Subject: map: implement map_copy Copies all entries from one map to another, overwriting existing entries. --- map.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'map.c') diff --git a/map.c b/map.c index 5fde157..57dc761 100644 --- a/map.c +++ b/map.c @@ -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; -- cgit v1.2.3