6363 * k.key = key;
6464 *
6565 * flags &= ~COMPARE_VALUE;
66- * e = hashmap_get_entry(&map, &k, NULL, struct long2string, ent );
66+ * e = hashmap_get_entry(&map, &k, ent, NULL );
6767 * if (e) {
6868 * printf("first: %ld %s\n", e->key, e->value);
6969 * while ((e = hashmap_get_next_entry(&map, e,
@@ -359,8 +359,17 @@ void hashmap_add(struct hashmap *map, struct hashmap_entry *entry);
359359struct hashmap_entry * hashmap_put (struct hashmap * map ,
360360 struct hashmap_entry * entry );
361361
362- #define hashmap_put_entry (map , keyvar , type , member ) \
363- container_of_or_null(hashmap_put(map, &(keyvar)->member), type, member)
362+ /*
363+ * Adds or replaces a hashmap entry contained within @keyvar,
364+ * where @keyvar is a pointer to a struct containing a
365+ * "struct hashmap_entry" @member.
366+ *
367+ * Returns the replaced pointer which is of the same type as @keyvar,
368+ * or NULL if not found.
369+ */
370+ #define hashmap_put_entry (map , keyvar , member ) \
371+ container_of_or_null_offset(hashmap_put(map, &(keyvar)->member), \
372+ OFFSETOF_VAR(keyvar, member))
364373
365374/*
366375 * Removes a hashmap entry matching the specified key. If the hashmap contains
@@ -373,9 +382,20 @@ struct hashmap_entry *hashmap_remove(struct hashmap *map,
373382 const struct hashmap_entry * key ,
374383 const void * keydata );
375384
376- #define hashmap_remove_entry (map , keyvar , keydata , type , member ) \
377- container_of_or_null(hashmap_remove(map, &(keyvar)->member, keydata), \
378- type, member)
385+ /*
386+ * Removes a hashmap entry contained within @keyvar,
387+ * where @keyvar is a pointer to a struct containing a
388+ * "struct hashmap_entry" @member.
389+ *
390+ * See `hashmap_get` for an explanation of @keydata
391+ *
392+ * Returns the replaced pointer which is of the same type as @keyvar,
393+ * or NULL if not found.
394+ */
395+ #define hashmap_remove_entry (map , keyvar , member , keydata ) \
396+ container_of_or_null_offset( \
397+ hashmap_remove(map, &(keyvar)->member, keydata), \
398+ OFFSETOF_VAR(keyvar, member))
379399
380400/*
381401 * Returns the `bucket` an entry is stored in.
@@ -436,13 +456,14 @@ static inline struct hashmap_entry *hashmap_iter_first(struct hashmap *map,
436456 OFFSETOF_VAR(var, member)))
437457
438458/*
439- * returns a @ pointer of @ type matching @keyvar, or NULL if nothing found.
440- * @keyvar is a pointer of @type
441- * @member is the name of the "struct hashmap_entry" field in @type
459+ * returns a pointer of type matching @keyvar, or NULL if nothing found.
460+ * @keyvar is a pointer to a struct containing a
461+ * "struct hashmap_entry" @member.
442462 */
443- #define hashmap_get_entry (map , keyvar , keydata , type , member ) \
444- container_of_or_null(hashmap_get(map, &(keyvar)->member, keydata), \
445- type, member)
463+ #define hashmap_get_entry (map , keyvar , member , keydata ) \
464+ container_of_or_null_offset( \
465+ hashmap_get(map, &(keyvar)->member, keydata), \
466+ OFFSETOF_VAR(keyvar, member))
446467
447468#define hashmap_get_entry_from_hash (map , hash , keydata , type , member ) \
448469 container_of_or_null(hashmap_get_from_hash(map, hash, keydata), \
0 commit comments