From 0850af33e201aff596520a937b84d4b4e233668f Mon Sep 17 00:00:00 2001 From: Bailey Thompson Date: Tue, 12 Dec 2017 20:05:05 -0500 Subject: [PATCH] Clear should cause memory size to shrink Calling clear on an unordered (multi) set or map not only clears all elements but reduces the hash table size. --- src/unordered_map.c | 13 ++++++++++++- src/unordered_map.h | 2 +- src/unordered_multiset.c | 13 ++++++++++++- src/unordered_multiset.h | 2 +- src/unordered_set.c | 13 ++++++++++++- src/unordered_set.h | 2 +- 6 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/unordered_map.c b/src/unordered_map.c index 724d402..6a9a4aa 100644 --- a/src/unordered_map.c +++ b/src/unordered_map.c @@ -350,8 +350,11 @@ bool unordered_map_remove(unordered_map me, void *const key) * Clears the elements from the unordered map. * * @param me The unordered map to clear. + * + * @return 0 No error. + * -ENOMEM Out of memory. */ -void unordered_map_clear(unordered_map me) +int unordered_map_clear(unordered_map me) { for (int i = 0; i < me->capacity; i++) { struct node *traverse = me->buckets[i]; @@ -365,6 +368,14 @@ void unordered_map_clear(unordered_map me) me->buckets[i] = NULL; } me->size = 0; + me->capacity = STARTING_BUCKETS; + struct node **temp = calloc((size_t) me->capacity, sizeof(struct node *)); + if (temp == NULL) { + return -ENOMEM; + } + free(me->buckets); + me->buckets = temp; + return 0; } /** diff --git a/src/unordered_map.h b/src/unordered_map.h index 857b250..610608a 100644 --- a/src/unordered_map.h +++ b/src/unordered_map.h @@ -46,7 +46,7 @@ bool unordered_map_contains(unordered_map me, void *key); bool unordered_map_remove(unordered_map me, void *key); // Ending -void unordered_map_clear(unordered_map me); +int unordered_map_clear(unordered_map me); unordered_map unordered_map_destroy(unordered_map me); #endif /* CONTAINERS_UNORDERED_MAP_H */ diff --git a/src/unordered_multiset.c b/src/unordered_multiset.c index cb10644..e5a9051 100644 --- a/src/unordered_multiset.c +++ b/src/unordered_multiset.c @@ -346,8 +346,11 @@ bool unordered_multiset_remove(unordered_multiset me, void *const key) * Clears the elements from the unordered multi-set. * * @param me The unordered multi-set to clear. + * + * @return 0 No error. + * -ENOMEM Out of memory. */ -void unordered_multiset_clear(unordered_multiset me) +int unordered_multiset_clear(unordered_multiset me) { for (int i = 0; i < me->capacity; i++) { struct node *traverse = me->buckets[i]; @@ -361,6 +364,14 @@ void unordered_multiset_clear(unordered_multiset me) } me->size = 0; me->used = 0; + me->capacity = STARTING_BUCKETS; + struct node **temp = calloc((size_t) me->capacity, sizeof(struct node *)); + if (temp == NULL) { + return -ENOMEM; + } + free(me->buckets); + me->buckets = temp; + return 0; } /** diff --git a/src/unordered_multiset.h b/src/unordered_multiset.h index ae920ce..92b3b53 100644 --- a/src/unordered_multiset.h +++ b/src/unordered_multiset.h @@ -46,7 +46,7 @@ bool unordered_multiset_contains(unordered_multiset me, void *key); bool unordered_multiset_remove(unordered_multiset me, void *key); // Ending -void unordered_multiset_clear(unordered_multiset me); +int unordered_multiset_clear(unordered_multiset me); unordered_multiset unordered_multiset_destroy(unordered_multiset me); #endif /* CONTAINERS_UNORDERED_MULTISET_H */ diff --git a/src/unordered_set.c b/src/unordered_set.c index 3172d1c..80b6ee2 100644 --- a/src/unordered_set.c +++ b/src/unordered_set.c @@ -313,8 +313,11 @@ bool unordered_set_remove(unordered_set me, void *const key) * Clears the elements from the unordered set. * * @param me The unordered set to clear. + * + * @return 0 No error. + * -ENOMEM Out of memory. */ -void unordered_set_clear(unordered_set me) +int unordered_set_clear(unordered_set me) { for (int i = 0; i < me->capacity; i++) { struct node *traverse = me->buckets[i]; @@ -327,6 +330,14 @@ void unordered_set_clear(unordered_set me) me->buckets[i] = NULL; } me->size = 0; + me->capacity = STARTING_BUCKETS; + struct node **temp = calloc((size_t) me->capacity, sizeof(struct node *)); + if (temp == NULL) { + return -ENOMEM; + } + free(me->buckets); + me->buckets = temp; + return 0; } /** diff --git a/src/unordered_set.h b/src/unordered_set.h index 330ba20..eb9dcff 100644 --- a/src/unordered_set.h +++ b/src/unordered_set.h @@ -44,7 +44,7 @@ bool unordered_set_contains(unordered_set me, void *key); bool unordered_set_remove(unordered_set me, void *key); // Ending -void unordered_set_clear(unordered_set me); +int unordered_set_clear(unordered_set me); unordered_set unordered_set_destroy(unordered_set me); #endif /* CONTAINERS_UNORDERED_SET_H */