From: Elijah Newren <newren@xxxxxxxxx> Although strmap could be used as a string->int map, one either had to allocate an int for every entry and then deallocate later, or one had to do a bunch of casting between (void*) and (intptr_t). Add some special functions that do the casting. Also, rename put->set for such wrapper functions since 'put' implied there may be some deallocation needed if the string was already found in the map, which isn't the case when we're storing an int value directly in the void* slot instead of using the void* slot as a pointer to data. A note on the name: strintmap looks and sounds pretty lame to me, but after trying to come up with something better and having no luck, I figured I'd just go with it for a while and then at some point some better and obvious name would strike me and I could replace it. Several months later, I still don't have a better name. Hopefully someone else has one. Signed-off-by: Elijah Newren <newren@xxxxxxxxx> --- strmap.c | 11 +++++++++++ strmap.h | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/strmap.c b/strmap.c index 03eb6af45d..cbb99f4030 100644 --- a/strmap.c +++ b/strmap.c @@ -113,3 +113,14 @@ void strmap_remove(struct strmap *map, const char *str, int free_util) free(ret->item.util); free(ret); } + +void strintmap_incr(struct strmap *map, const char *str, intptr_t amt) +{ + struct str_entry *entry = find_str_entry(map, str); + if (entry) { + intptr_t *whence = (intptr_t*)&entry->item.util; + *whence += amt; + } + else + strintmap_set(map, str, amt); +} diff --git a/strmap.h b/strmap.h index 28a98c5a4b..5d9dd3ef58 100644 --- a/strmap.h +++ b/strmap.h @@ -88,4 +88,36 @@ static inline unsigned int strmap_get_size(struct strmap *map) var = hashmap_iter_next_entry_offset(iter, \ OFFSETOF_VAR(var, ent))) +/* + * Helper functions for using strmap as map of string -> int, using the void* + * field to store the int instead of allocating an int and having the void* + * member point to the allocated int. + */ + +static inline int strintmap_get(struct strmap *map, const char *str, + int default_value) +{ + struct string_list_item *result = strmap_get_item(map, str); + if (!result) + return default_value; + return (intptr_t)result->util; +} + +static inline void strintmap_set(struct strmap *map, const char *str, intptr_t v) +{ + strmap_put(map, str, (void *)v); +} + +void strintmap_incr(struct strmap *map, const char *str, intptr_t amt); + +static inline void strintmap_clear(struct strmap *map) +{ + strmap_clear(map, 0); +} + +static inline void strintmap_free(struct strmap *map) +{ + strmap_free(map, 0); +} + #endif /* STRMAP_H */ -- gitgitgadget