diff --git a/src/deque.h b/src/deque.h index a7f100d..39004bd 100644 --- a/src/deque.h +++ b/src/deque.h @@ -64,6 +64,7 @@ typedef struct SNAME##_iter_s SNAME##_iter; \ \ FMOD SNAME *PFX##_new(size_t size); \ + FMOD void PFX##_clear(SNAME *_deque_); \ FMOD void PFX##_free(SNAME *_deque_); \ FMOD bool PFX##_push_front(SNAME *_deque_, V element); \ FMOD bool PFX##_push_back(SNAME *_deque_, V element); \ @@ -121,6 +122,15 @@ return _deque_; \ } \ \ + FMOD void PFX##_clear(SNAME *_deque_) \ + { \ + memset(_deque_->buffer, 0, sizeof(V) * _deque_->capacity); \ + \ + _deque_->count = 0; \ + _deque_->front = 0; \ + _deque_->rear = 0; \ + } \ + \ FMOD void PFX##_free(SNAME *_deque_) \ { \ free(_deque_->buffer); \ diff --git a/src/hashmap.h b/src/hashmap.h index 0d28d39..b5282ab 100644 --- a/src/hashmap.h +++ b/src/hashmap.h @@ -96,6 +96,7 @@ static const size_t cmc_hashtable_primes[] = {53, 97, 193, 389, 769, 1543, 3079, typedef struct SNAME##_iter_s SNAME##_iter; \ \ FMOD SNAME *PFX##_new(size_t size, double load, int (*compare)(K, K), size_t (*hash)(K)); \ + FMOD void PFX##_clear(SNAME *_map_); \ FMOD void PFX##_free(SNAME *_map_); \ FMOD bool PFX##_insert(SNAME *_map_, K key, V value); \ FMOD bool PFX##_remove(SNAME *_map_, K key, V *value); \ @@ -153,6 +154,13 @@ static const size_t cmc_hashtable_primes[] = {53, 97, 193, 389, 769, 1543, 3079, return _map_; \ } \ \ + FMOD void PFX##_clear(SNAME *_map_) \ + { \ + memset(_map_->buffer, 0, sizeof(SNAME##_entry) * _map_->capacity); \ + \ + _map_->count = 0; \ + } \ + \ FMOD void PFX##_free(SNAME *_map_) \ { \ free(_map_->buffer); \ diff --git a/src/hashset.h b/src/hashset.h index 52c9a15..c75c75c 100644 --- a/src/hashset.h +++ b/src/hashset.h @@ -95,6 +95,7 @@ static const size_t cmc_hashtable_primes[] = {53, 97, 193, 389, 769, 1543, 3079, typedef struct SNAME##_iter_s SNAME##_iter; \ \ FMOD SNAME *PFX##_new(size_t size, double load, int (*compare)(V, V), size_t (*hash)(V)); \ + FMOD void PFX##_clear(SNAME *_set_); \ FMOD void PFX##_free(SNAME *_set_); \ FMOD bool PFX##_insert(SNAME *_set_, V element); \ FMOD bool PFX##_remove(SNAME *_set_, V element); \ @@ -156,6 +157,13 @@ static const size_t cmc_hashtable_primes[] = {53, 97, 193, 389, 769, 1543, 3079, return _set_; \ } \ \ + FMOD void PFX##_clear(SNAME *_set_) \ + { \ + memset(_set_->buffer, 0, sizeof(SNAME##_entry) * _set_->capacity); \ + \ + _set_->count = 0; \ + } \ + \ FMOD void PFX##_free(SNAME *_set_) \ { \ free(_set_->buffer); \ diff --git a/src/heap.h b/src/heap.h index 3f87f71..610a9d0 100644 --- a/src/heap.h +++ b/src/heap.h @@ -69,6 +69,7 @@ typedef enum HeapOrder typedef struct SNAME##_iter_s SNAME##_iter; \ \ FMOD SNAME *PFX##_new(size_t size, HeapOrder HO, int (*compare)(V, V)); \ + FMOD void PFX##_clear(SNAME *_heap_); \ FMOD void PFX##_free(SNAME *_heap_); \ FMOD bool PFX##_insert(SNAME *_heap_, V element); \ FMOD bool PFX##_remove(SNAME *_heap_, V *result); \ @@ -129,6 +130,13 @@ typedef enum HeapOrder return _heap_; \ } \ \ + FMOD void PFX##_clear(SNAME *_heap_) \ + { \ + memset(_heap_->buffer, 0, sizeof(V) * _heap_->capacity); \ + \ + _heap_->count = 0; \ + } \ + \ FMOD void PFX##_free(SNAME *_heap_) \ { \ free(_heap_->buffer); \ diff --git a/src/linkedlist.h b/src/linkedlist.h index 25b3a53..2c39b2d 100644 --- a/src/linkedlist.h +++ b/src/linkedlist.h @@ -70,6 +70,7 @@ typedef struct SNAME##_iter_s SNAME##_iter; \ \ FMOD SNAME *PFX##_new(void); \ + FMOD void PFX##_clear(SNAME *_list_); \ FMOD void PFX##_free(SNAME *_list_); \ FMOD bool PFX##_push_front(SNAME *_list_, V element); \ FMOD bool PFX##_push(SNAME *_list_, V element, size_t index); \ @@ -122,15 +123,26 @@ return _list_; \ } \ \ - FMOD void PFX##_free(SNAME *_list_) \ + FMOD void PFX##_clear(SNAME *_list_) \ { \ SNAME##_node *scan = _list_->head; \ + \ while (_list_->head != NULL) \ { \ _list_->head = _list_->head->next; \ free(scan); \ scan = _list_->head; \ } \ + \ + _list_->count = 0; \ + _list_->head = NULL; \ + _list_->tail = NULL; \ + } \ + \ + FMOD void PFX##_free(SNAME *_list_) \ + { \ + PFX##_clear(_list_); \ + \ free(_list_); \ } \ \ diff --git a/src/list.h b/src/list.h index e8714f0..5f3a69d 100644 --- a/src/list.h +++ b/src/list.h @@ -61,6 +61,7 @@ typedef struct SNAME##_iter_s SNAME##_iter; \ \ FMOD SNAME *PFX##_new(size_t size); \ + FMOD void PFX##_clear(SNAME *_list_); \ FMOD void PFX##_free(SNAME *_list_); \ FMOD bool PFX##_push_front(SNAME *_list_, V element); \ FMOD bool PFX##_push(SNAME *_list_, V element, size_t index); \ @@ -122,6 +123,13 @@ return _list_; \ } \ \ + FMOD void PFX##_clear(SNAME *_list_) \ + { \ + memset(_list_->buffer, 0, sizeof(V) * _list_->capacity); \ + \ + _list_->count = 0; \ + } \ + \ FMOD void PFX##_free(SNAME *_list_) \ { \ free(_list_->buffer); \ diff --git a/src/queue.h b/src/queue.h index cd9dc0a..03431a6 100644 --- a/src/queue.h +++ b/src/queue.h @@ -64,6 +64,7 @@ typedef struct SNAME##_iter_s SNAME##_iter; \ \ FMOD SNAME *PFX##_new(size_t size); \ + FMOD void PFX##_clear(SNAME *_queue_); \ FMOD void PFX##_free(SNAME *_queue_); \ FMOD bool PFX##_enqueue(SNAME *_queue_, V element); \ FMOD bool PFX##_dequeue(SNAME *_queue_); \ @@ -116,6 +117,15 @@ return _queue_; \ } \ \ + FMOD void PFX##_clear(SNAME *_queue_) \ + { \ + memset(_queue_->buffer, 0, sizeof(V) * _queue_->capacity); \ + \ + _queue_->count = 0; \ + _queue_->front = 0; \ + _queue_->rear = 0; \ + } \ + \ FMOD void PFX##_free(SNAME *_queue_) \ { \ free(_queue_->buffer); \ diff --git a/src/stack.h b/src/stack.h index 6975f0e..69b7796 100644 --- a/src/stack.h +++ b/src/stack.h @@ -61,6 +61,7 @@ typedef struct SNAME##_iter_s SNAME##_iter; \ \ FMOD SNAME *PFX##_new(size_t size); \ + FMOD void PFX##_clear(SNAME *_stack_); \ FMOD void PFX##_free(SNAME *_stack_); \ FMOD bool PFX##_push(SNAME *_stack_, V element); \ FMOD bool PFX##_pop(SNAME *_stack_); \ @@ -111,6 +112,13 @@ return _stack_; \ } \ \ + FMOD void PFX##_clear(SNAME *_stack_) \ + { \ + memset(_stack_->buffer, 0, sizeof(V) * _stack_->capacity); \ + \ + _stack_->count = 0; \ + } \ + \ FMOD void PFX##_free(SNAME *_stack_) \ { \ free(_stack_->buffer); \ diff --git a/src/treemap.h b/src/treemap.h index 1719f26..2d0ff77 100644 --- a/src/treemap.h +++ b/src/treemap.h @@ -74,6 +74,7 @@ typedef struct SNAME##_iter_s SNAME##_iter; \ \ FMOD SNAME *PFX##_new(int (*compare)(K, K)); \ + FMOD void PFX##_clear(SNAME *_map_); \ FMOD void PFX##_free(SNAME *_map_); \ FMOD bool PFX##_insert(SNAME *_map_, K key, V value); \ FMOD bool PFX##_remove(SNAME *_map_, K key, V *value); \ @@ -118,7 +119,7 @@ return _map_; \ } \ \ - FMOD void PFX##_free(SNAME *_map_) \ + FMOD void PFX##_clear(SNAME *_map_) \ { \ SNAME##_node *scan = _map_->root; \ SNAME##_node *up = NULL; \ @@ -169,6 +170,14 @@ } \ } \ \ + _map_->count = 0; \ + _map_->root = NULL; \ + } \ + \ + FMOD void PFX##_free(SNAME *_map_) \ + { \ + PFX##_clear(_map_); \ + \ free(_map_); \ } \ \ diff --git a/src/treeset.h b/src/treeset.h index 05eed4c..a250a8c 100644 --- a/src/treeset.h +++ b/src/treeset.h @@ -73,6 +73,7 @@ typedef struct SNAME##_iter_s SNAME##_iter; \ \ FMOD SNAME *PFX##_new(int (*compare)(V, V)); \ + FMOD void PFX##_clear(SNAME *_set_); \ FMOD void PFX##_free(SNAME *_set_); \ FMOD bool PFX##_insert(SNAME *_set_, V element); \ FMOD bool PFX##_remove(SNAME *_set_, V element); \ @@ -121,7 +122,7 @@ return _set_; \ } \ \ - FMOD void PFX##_free(SNAME *_set_) \ + FMOD void PFX##_clear(SNAME *_set_) \ { \ SNAME##_node *scan = _set_->root; \ SNAME##_node *up = NULL; \ @@ -172,6 +173,14 @@ } \ } \ \ + _set_->count = 0; \ + _set_->root = NULL; \ + } \ + \ + FMOD void PFX##_free(SNAME *_set_) \ + { \ + PFX##_clear(_set_); \ + \ free(_set_); \ } \ \ diff --git a/tests/foreach.c b/tests/foreach.c index c1fd4f4..1beba28 100644 --- a/tests/foreach.c +++ b/tests/foreach.c @@ -210,7 +210,7 @@ int main(int argc, char const *argv[]) ts_free(ts); tm_free(tm); hs_free(hs); - tm_free(hm); + hm_free(hm); return 0; }