aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--map.c13
-rw-r--r--map.h3
2 files changed, 16 insertions, 0 deletions
diff --git a/map.c b/map.c
index 7994f34..94e941c 100644
--- a/map.c
+++ b/map.c
@@ -78,6 +78,19 @@ bool map_contains(const Map *map, const char *prefix)
return !map_empty(map_prefix(map, prefix));
}
+static bool leaf(const char *key, void *value, void *data)
+{
+ int *nodes = data;
+ return (*nodes)++ < 1;
+}
+
+bool map_leaf(const Map *map, const char *prefix)
+{
+ int nodes = 0;
+ map_iterate(map_prefix(map, prefix), leaf, &nodes);
+ return nodes == 1;
+}
+
bool map_put(Map *map, const char *k, const void *value)
{
size_t len = strlen(k);
diff --git a/map.h b/map.h
index 3035ff4..c9690ad 100644
--- a/map.h
+++ b/map.h
@@ -17,6 +17,9 @@ void *map_closest(const Map*, const char *prefix);
/* check whether the map contains the given prefix, i.e. whether it can
* be extended to match a key of an element stored in the map. */
bool map_contains(const Map*, const char *prefix);
+/* Test whether the given prefix can be extended to exactly one map element
+ * i.e. true iff the prefix map contains exactly one element. */
+bool map_leaf(const Map*, const char *prefix);
/* Place a member in the map. This returns false if we run out of memory
* (errno = ENOMEM), or if that key already appears in the map (errno = EEXIST). */
bool map_put(Map*, const char *key, const void *value);