hashmap: return NULL from destructor

We _always_ return NULL from destructors to allow direct assignments to
the variable holding the object. Especially on hashmaps, which treat NULL
as empty hashmap, this is pretty neat.
This commit is contained in:
David Herrmann
2015-04-11 13:14:41 +02:00
parent 07ba8037bf
commit cfe561a456
2 changed files with 31 additions and 28 deletions
+18 -15
View File
@@ -866,38 +866,41 @@ static void hashmap_free_no_clear(HashmapBase *h) {
free(h);
}
void internal_hashmap_free(HashmapBase *h) {
HashmapBase *internal_hashmap_free(HashmapBase *h) {
/* Free the hashmap, but nothing in it */
if (!h)
return;
if (h) {
internal_hashmap_clear(h);
hashmap_free_no_clear(h);
}
internal_hashmap_clear(h);
hashmap_free_no_clear(h);
return NULL;
}
void internal_hashmap_free_free(HashmapBase *h) {
HashmapBase *internal_hashmap_free_free(HashmapBase *h) {
/* Free the hashmap and all data objects in it, but not the
* keys */
if (!h)
return;
if (h) {
internal_hashmap_clear_free(h);
hashmap_free_no_clear(h);
}
internal_hashmap_clear_free(h);
hashmap_free_no_clear(h);
return NULL;
}
void hashmap_free_free_free(Hashmap *h) {
Hashmap *hashmap_free_free_free(Hashmap *h) {
/* Free the hashmap and all data and key objects in it */
if (!h)
return;
if (h) {
hashmap_clear_free_free(h);
hashmap_free_no_clear(HASHMAP_BASE(h));
}
hashmap_clear_free_free(h);
hashmap_free_no_clear(HASHMAP_BASE(h));
return NULL;
}
void internal_hashmap_clear(HashmapBase *h) {
+13 -13
View File
@@ -144,25 +144,25 @@ OrderedHashmap *internal_ordered_hashmap_new(const struct hash_ops *hash_ops HA
#define hashmap_new(ops) internal_hashmap_new(ops HASHMAP_DEBUG_SRC_ARGS)
#define ordered_hashmap_new(ops) internal_ordered_hashmap_new(ops HASHMAP_DEBUG_SRC_ARGS)
void internal_hashmap_free(HashmapBase *h);
static inline void hashmap_free(Hashmap *h) {
internal_hashmap_free(HASHMAP_BASE(h));
HashmapBase *internal_hashmap_free(HashmapBase *h);
static inline Hashmap *hashmap_free(Hashmap *h) {
return (void*)internal_hashmap_free(HASHMAP_BASE(h));
}
static inline void ordered_hashmap_free(OrderedHashmap *h) {
internal_hashmap_free(HASHMAP_BASE(h));
static inline OrderedHashmap *ordered_hashmap_free(OrderedHashmap *h) {
return (void*)internal_hashmap_free(HASHMAP_BASE(h));
}
void internal_hashmap_free_free(HashmapBase *h);
static inline void hashmap_free_free(Hashmap *h) {
internal_hashmap_free_free(HASHMAP_BASE(h));
HashmapBase *internal_hashmap_free_free(HashmapBase *h);
static inline Hashmap *hashmap_free_free(Hashmap *h) {
return (void*)internal_hashmap_free_free(HASHMAP_BASE(h));
}
static inline void ordered_hashmap_free_free(OrderedHashmap *h) {
internal_hashmap_free_free(HASHMAP_BASE(h));
static inline OrderedHashmap *ordered_hashmap_free_free(OrderedHashmap *h) {
return (void*)internal_hashmap_free_free(HASHMAP_BASE(h));
}
void hashmap_free_free_free(Hashmap *h);
static inline void ordered_hashmap_free_free_free(OrderedHashmap *h) {
hashmap_free_free_free(PLAIN_HASHMAP(h));
Hashmap *hashmap_free_free_free(Hashmap *h);
static inline OrderedHashmap *ordered_hashmap_free_free_free(OrderedHashmap *h) {
return (void*)hashmap_free_free_free(PLAIN_HASHMAP(h));
}
HashmapBase *internal_hashmap_copy(HashmapBase *h);