@@ -27,7 +27,7 @@ void strmap_init(struct strmap *map)
hashmap_init(&map->map, cmp_str_entry, NULL, 0);
}
-void strmap_clear(struct strmap *map, int free_util)
+void strmap_free(struct strmap *map, int free_util)
{
struct hashmap_iter iter;
struct str_entry *e;
@@ -35,12 +35,19 @@ void strmap_clear(struct strmap *map, int free_util)
if (!map)
return;
- hashmap_for_each_entry(&map->map, &iter, e, ent /* member name */) {
- free(e->item.string);
- if (free_util)
- free(e->item.util);
+ if (free_util) {
+ hashmap_for_each_entry(&map->map, &iter, e, ent) {
+ free(e->item.string);
+ if (free_util)
+ free(e->item.util);
+ }
}
hashmap_free_entries(&map->map, struct str_entry, ent);
+}
+
+void strmap_clear(struct strmap *map, int free_util)
+{
+ strmap_free(map, free_util);
strmap_init(map);
}
@@ -69,6 +76,13 @@ void *strmap_put(struct strmap *map, const char *str, void *data)
return old;
}
+struct string_list_item *strmap_get_item(struct strmap *map,
+ const char *str)
+{
+ struct str_entry *entry = find_str_entry(map, str);
+ return entry ? &entry->item : NULL;
+}
+
void *strmap_get(struct strmap *map, const char *str)
{
struct str_entry *entry = find_str_entry(map, str);
@@ -79,3 +93,14 @@ int strmap_contains(struct strmap *map, const char *str)
{
return find_str_entry(map, str) != NULL;
}
+
+void strmap_remove(struct strmap *map, const char *str, int free_util)
+{
+ struct str_entry entry, *ret;
+ hashmap_entry_init(&entry.ent, strhash(str));
+ entry.item.string = (char *)str;
+ ret = hashmap_remove_entry(&map->map, &entry, ent, NULL);
+ if (ret && free_util)
+ free(ret->item.util);
+ free(ret);
+}
@@ -21,6 +21,11 @@ void strmap_init(struct strmap *map);
/*
* Remove all entries from the map, releasing any allocated resources.
*/
+void strmap_free(struct strmap *map, int free_values);
+
+/*
+ * Same as calling strmap_free() followed by strmap_init().
+ */
void strmap_clear(struct strmap *map, int free_values);
/*
@@ -32,6 +37,12 @@ void strmap_clear(struct strmap *map, int free_values);
*/
void *strmap_put(struct strmap *map, const char *str, void *data);
+/*
+ * Return the string_list_item mapped by "str", or NULL if there is not such
+ * an item in map.
+ */
+struct string_list_item *strmap_get_item(struct strmap *map, const char *str);
+
/*
* Return the data pointer mapped by "str", or NULL if the entry does not
* exist.
@@ -44,4 +55,36 @@ void *strmap_get(struct strmap *map, const char *str);
*/
int strmap_contains(struct strmap *map, const char *str);
+/*
+ * Remove the given entry from the strmap. If the string isn't in the
+ * strmap, the map is not altered.
+ */
+void strmap_remove(struct strmap *map, const char *str, int free_value);
+
+/*
+ * Return whether the strmap is empty.
+ */
+static inline int strmap_empty(struct strmap *map)
+{
+ return hashmap_get_size(&map->map) == 0;
+}
+
+/*
+ * Return how many entries the strmap has.
+ */
+static inline unsigned int strmap_get_size(struct strmap *map)
+{
+ return hashmap_get_size(&map->map);
+}
+
+/*
+ * iterate through @map using @iter, @var is a pointer to a type str_entry
+ */
+#define strmap_for_each_entry(mystrmap, iter, var) \
+ for (var = hashmap_iter_first_entry_offset(&(mystrmap)->map, iter, \
+ OFFSETOF_VAR(var, ent)); \
+ var; \
+ var = hashmap_iter_next_entry_offset(iter, \
+ OFFSETOF_VAR(var, ent)))
+
#endif /* STRMAP_H */