From c61ac2e347ce7a120bd2862c24b502cb5c156e26 Mon Sep 17 00:00:00 2001 From: Leonardo Date: Wed, 8 May 2019 11:47:00 -0300 Subject: [PATCH] Changed iter_new to inter_init and added new iter_new that allocates the iterator on the heap --- examples/deque/even_odd.c | 2 +- examples/hashset/set_ops.c | 2 +- examples/iterators/deque.c | 2 +- examples/iterators/hashmap.c | 2 +- examples/iterators/hashset.c | 2 +- examples/iterators/heap.c | 2 +- examples/iterators/linkedlist.c | 2 +- examples/iterators/list.c | 2 +- examples/iterators/queue.c | 2 +- examples/iterators/stack.c | 2 +- examples/iterators/treemap.c | 2 +- examples/iterators/treeset.c | 2 +- examples/linkedlist/iterator.c | 2 +- examples/list/list.c | 2 +- examples/list/string.c | 6 ++--- examples/treemap/pseudo_multiset.c | 2 +- examples/treeset/set_ops.c | 2 +- src/deque.h | 23 +++++++++++++++-- src/foreach.h | 8 +++--- src/hashmap.h | 29 +++++++++++++++++---- src/hashset.h | 41 ++++++++++++++++++++++-------- src/heap.h | 23 +++++++++++++++-- src/linkedlist.h | 23 +++++++++++++++-- src/list.h | 23 +++++++++++++++-- src/queue.h | 23 +++++++++++++++-- src/stack.h | 23 +++++++++++++++-- src/treemap.h | 23 +++++++++++++++-- src/treeset.h | 35 +++++++++++++++++++------ tests/iterators.c | 20 +++++++-------- 29 files changed, 261 insertions(+), 71 deletions(-) diff --git a/examples/deque/even_odd.c b/examples/deque/even_odd.c index f588158..d3e29a6 100644 --- a/examples/deque/even_odd.c +++ b/examples/deque/even_odd.c @@ -29,7 +29,7 @@ int main(int argc, char const *argv[]) } deque_iter iter; - d_iter_new(&iter, numbers); + d_iter_init(&iter, numbers); size_t result, index, sum = 0; diff --git a/examples/hashset/set_ops.c b/examples/hashset/set_ops.c index c2e6a90..8a3378d 100644 --- a/examples/hashset/set_ops.c +++ b/examples/hashset/set_ops.c @@ -25,7 +25,7 @@ void print_set(set *s) size_t index; int result; set_iter iter; - set_iter_new(&iter, s); + set_iter_init(&iter, s); for (set_iter_tostart(&iter); !set_iter_end(&iter);) { set_iter_next(&iter, &result, &index); diff --git a/examples/iterators/deque.c b/examples/iterators/deque.c index 04079b0..9ec8fb7 100644 --- a/examples/iterators/deque.c +++ b/examples/iterators/deque.c @@ -27,7 +27,7 @@ int main(int argc, char const *argv[]) // Initialize iterator deque_iter iter; - d_iter_new(&iter, d); + d_iter_init(&iter, d); // Make the iterator go back and forward for (int j = 0; j < 4; j++) diff --git a/examples/iterators/hashmap.c b/examples/iterators/hashmap.c index 800ebb8..b327d0f 100644 --- a/examples/iterators/hashmap.c +++ b/examples/iterators/hashmap.c @@ -43,7 +43,7 @@ int main(int argc, char const *argv[]) // Initialize iterator hmap_iter iter; - hm_iter_new(&iter, hm); + hm_iter_init(&iter, hm); // Make the iterator go back and forward for (int j = 0; j < 4; j++) diff --git a/examples/iterators/hashset.c b/examples/iterators/hashset.c index 0c841cd..bca21b8 100644 --- a/examples/iterators/hashset.c +++ b/examples/iterators/hashset.c @@ -42,7 +42,7 @@ int main(int argc, char const *argv[]) // Initialize iterator hset_iter iter; - hs_iter_new(&iter, hs); + hs_iter_init(&iter, hs); // Make the iterator go back and forward for (int j = 0; j < 4; j++) diff --git a/examples/iterators/heap.c b/examples/iterators/heap.c index de760d7..4aa8841 100644 --- a/examples/iterators/heap.c +++ b/examples/iterators/heap.c @@ -30,7 +30,7 @@ int main(int argc, char const *argv[]) // Initialize iterator heap_iter iter; - h_iter_new(&iter, h); + h_iter_init(&iter, h); // Make the iterator go back and forward for (int j = 0; j < 4; j++) diff --git a/examples/iterators/linkedlist.c b/examples/iterators/linkedlist.c index 4c12b19..87c6795 100644 --- a/examples/iterators/linkedlist.c +++ b/examples/iterators/linkedlist.c @@ -25,7 +25,7 @@ int main(int argc, char const *argv[]) // Initialize iterator linked_iter iter; - ll_iter_new(&iter, ll); + ll_iter_init(&iter, ll); // Make the iterator go back and forward for (int j = 0; j < 4; j++) diff --git a/examples/iterators/list.c b/examples/iterators/list.c index 4011130..07023dd 100644 --- a/examples/iterators/list.c +++ b/examples/iterators/list.c @@ -25,7 +25,7 @@ int main(int argc, char const *argv[]) // Initialize iterator list_iter iter; - l_iter_new(&iter, l); + l_iter_init(&iter, l); // Make the iterator go back and forward for (int j = 0; j < 4; j++) diff --git a/examples/iterators/queue.c b/examples/iterators/queue.c index 39c6d9d..10bd98d 100644 --- a/examples/iterators/queue.c +++ b/examples/iterators/queue.c @@ -25,7 +25,7 @@ int main(int argc, char const *argv[]) // Initialize iterator queue_iter iter; - q_iter_new(&iter, q); + q_iter_init(&iter, q); // Make the iterator go back and forward for (int j = 0; j < 4; j++) diff --git a/examples/iterators/stack.c b/examples/iterators/stack.c index c8213ce..5bfea56 100644 --- a/examples/iterators/stack.c +++ b/examples/iterators/stack.c @@ -25,7 +25,7 @@ int main(int argc, char const *argv[]) // Initialize iterator stack_iter iter; - s_iter_new(&iter, s); + s_iter_init(&iter, s); // Make the iterator go back and forward for (int j = 0; j < 4; j++) diff --git a/examples/iterators/treemap.c b/examples/iterators/treemap.c index 61471ba..3271092 100644 --- a/examples/iterators/treemap.c +++ b/examples/iterators/treemap.c @@ -31,7 +31,7 @@ int main(int argc, char const *argv[]) // Initialize iterator tmap_iter iter; - tm_iter_new(&iter, tm); + tm_iter_init(&iter, tm); // Make the iterator go back and forward for (int j = 0; j < 4; j++) diff --git a/examples/iterators/treeset.c b/examples/iterators/treeset.c index 2bf5547..9d62630 100644 --- a/examples/iterators/treeset.c +++ b/examples/iterators/treeset.c @@ -30,7 +30,7 @@ int main(int argc, char const *argv[]) // Initialize iterator tset_iter iter; - ts_iter_new(&iter, ts); + ts_iter_init(&iter, ts); // Make the iterator go back and forward for (int j = 0; j < 4; j++) diff --git a/examples/linkedlist/iterator.c b/examples/linkedlist/iterator.c index bfe06dc..ba21ad6 100644 --- a/examples/linkedlist/iterator.c +++ b/examples/linkedlist/iterator.c @@ -24,7 +24,7 @@ int main(int argc, char const *argv[]) // Initialize iterator linked_iter iter; - ll_iter_new(&iter, ll); + ll_iter_init(&iter, ll); // Move cursor to the end of the list ll_iter_toend(&iter); diff --git a/examples/list/list.c b/examples/list/list.c index b156186..0857886 100644 --- a/examples/list/list.c +++ b/examples/list/list.c @@ -54,7 +54,7 @@ int main(int argc, char const *argv[]) // Iterate over each element starting from the start (iter_new positions // the iterator to the start of the list) until the end of the list. - for (l_iter_new(&iter, my_list); !l_iter_end(&iter);) + for (l_iter_init(&iter, my_list); !l_iter_end(&iter);) { // Here index corresponds to the position of the result relative to all // other elements in the iteration. It is only a coincidence that the diff --git a/examples/list/string.c b/examples/list/string.c index c6899c1..4408e3d 100644 --- a/examples/list/string.c +++ b/examples/list/string.c @@ -53,7 +53,7 @@ int main(int argc, char const *argv[]) // Iterate through each letter and print it string_iter iter; - str_iter_new(&iter, my_str); + str_iter_init(&iter, my_str); size_t index; char result; @@ -106,13 +106,13 @@ int main(int argc, char const *argv[]) // Pop white space str_pop_front(str_out); - for (str_iter_new(&iter, my_str); !str_iter_end(&iter);) + for (str_iter_init(&iter, my_str); !str_iter_end(&iter);) { str_iter_next(&iter, &result, &index); putchar(result); } printf("\nString length: %lu\n\n", str_count(my_str)); - for (str_iter_new(&iter, str_out); !str_iter_end(&iter);) + for (str_iter_init(&iter, str_out); !str_iter_end(&iter);) { str_iter_next(&iter, &result, &index); putchar(result); diff --git a/examples/treemap/pseudo_multiset.c b/examples/treemap/pseudo_multiset.c index b523af8..111906a 100644 --- a/examples/treemap/pseudo_multiset.c +++ b/examples/treemap/pseudo_multiset.c @@ -77,7 +77,7 @@ int main(int argc, char const *argv[]) int key; size_t mult, _; - for (tm_iter_new(&iter, map); !tm_iter_end(&iter); /* empty */) + for (tm_iter_init(&iter, map); !tm_iter_end(&iter); /* empty */) { // Map[key] = multiplicity tm_iter_next(&iter, &key, &mult, &_); diff --git a/examples/treeset/set_ops.c b/examples/treeset/set_ops.c index 0857727..cab84a6 100644 --- a/examples/treeset/set_ops.c +++ b/examples/treeset/set_ops.c @@ -25,7 +25,7 @@ void print_set(set *s) size_t index; int result; set_iter iter; - set_iter_new(&iter, s); + set_iter_init(&iter, s); for (set_iter_tostart(&iter); !set_iter_end(&iter);) { set_iter_next(&iter, &result, &index); diff --git a/src/deque.h b/src/deque.h index 46d7d0d..c6f10e7 100644 --- a/src/deque.h +++ b/src/deque.h @@ -82,7 +82,9 @@ FMOD size_t PFX##_count(SNAME *_deque_); \ FMOD size_t PFX##_capacity(SNAME *_deque_); \ \ - FMOD void PFX##_iter_new(SNAME##_iter *iter, SNAME *target); \ + FMOD SNAME##_iter *PFX##_iter_new(SNAME *target); \ + FMOD void PFX##_iter_free(SNAME##_iter *iter); \ + FMOD void PFX##_iter_init(SNAME##_iter *iter, SNAME *target); \ FMOD bool PFX##_iter_start(SNAME##_iter *iter); \ FMOD bool PFX##_iter_end(SNAME##_iter *iter); \ FMOD void PFX##_iter_tostart(SNAME##_iter *iter); \ @@ -279,7 +281,24 @@ return _deque_->capacity; \ } \ \ - FMOD void PFX##_iter_new(SNAME##_iter *iter, SNAME *target) \ + FMOD SNAME##_iter *PFX##_iter_new(SNAME *target) \ + { \ + SNAME##_iter *iter = malloc(sizeof(SNAME##_iter)); \ + \ + if (!iter) \ + return NULL; \ + \ + PFX##_iter_init(iter, target); \ + \ + return iter; \ + } \ + \ + FMOD void PFX##_iter_free(SNAME##_iter *iter) \ + { \ + free(iter); \ + } \ + \ + FMOD void PFX##_iter_init(SNAME##_iter *iter, SNAME *target) \ { \ iter->target = target; \ iter->cursor = target->front; \ diff --git a/src/foreach.h b/src/foreach.h index fa2fc69..42d9285 100644 --- a/src/foreach.h +++ b/src/foreach.h @@ -20,7 +20,7 @@ size_t index; \ V value; \ SNAME##_iter iter; \ - PFX##_iter_new(&iter, TARGET); \ + PFX##_iter_init(&iter, TARGET); \ while (PFX##_iter_next(&iter, &value, &index)) \ { \ BODY; \ @@ -33,7 +33,7 @@ size_t index; \ V value; \ SNAME##_iter iter; \ - PFX##_iter_new(&iter, TARGET); \ + PFX##_iter_init(&iter, TARGET); \ PFX##_iter_toend(&iter); \ while (PFX##_iter_prev(&iter, &value, &index)) \ { \ @@ -48,7 +48,7 @@ K key; \ V value; \ SNAME##_iter iter; \ - PFX##_iter_new(&iter, TARGET); \ + PFX##_iter_init(&iter, TARGET); \ while (PFX##_iter_next(&iter, &key, &value, &index)) \ { \ BODY; \ @@ -62,7 +62,7 @@ K key; \ V value; \ SNAME##_iter iter; \ - PFX##_iter_new(&iter, TARGET); \ + PFX##_iter_init(&iter, TARGET); \ PFX##_iter_toend(&iter); \ while (PFX##_iter_prev(&iter, &key, &value, &index)) \ { \ diff --git a/src/hashmap.h b/src/hashmap.h index 4a3b41a..fe0c6af 100644 --- a/src/hashmap.h +++ b/src/hashmap.h @@ -134,7 +134,9 @@ static const size_t cmc_hashtable_primes[] = {53, 97, 191, 383, 769, 1531, FMOD bool PFX##_empty(SNAME *_map_); \ FMOD size_t PFX##_count(SNAME *_map_); \ \ - FMOD void PFX##_iter_new(SNAME##_iter *iter, SNAME *target); \ + FMOD SNAME##_iter *PFX##_iter_new(SNAME *target); \ + FMOD void PFX##_iter_free(SNAME##_iter *iter); \ + FMOD void PFX##_iter_init(SNAME##_iter *iter, SNAME *target); \ FMOD bool PFX##_iter_start(SNAME##_iter *iter); \ FMOD bool PFX##_iter_end(SNAME##_iter *iter); \ FMOD void PFX##_iter_tostart(SNAME##_iter *iter); \ @@ -300,7 +302,7 @@ static const size_t cmc_hashtable_primes[] = {53, 97, 191, 383, 769, 1531, V result_value; \ size_t index; \ \ - for (PFX##_iter_new(&iter, _map_); !PFX##_iter_end(&iter);) \ + for (PFX##_iter_init(&iter, _map_); !PFX##_iter_end(&iter);) \ { \ PFX##_iter_next(&iter, &result_key, &result_value, &index); \ \ @@ -332,7 +334,7 @@ static const size_t cmc_hashtable_primes[] = {53, 97, 191, 383, 769, 1531, V result_value; \ size_t index; \ \ - for (PFX##_iter_new(&iter, _map_); !PFX##_iter_end(&iter);) \ + for (PFX##_iter_init(&iter, _map_); !PFX##_iter_end(&iter);) \ { \ PFX##_iter_next(&iter, &result_key, &result_value, &index); \ \ @@ -388,7 +390,24 @@ static const size_t cmc_hashtable_primes[] = {53, 97, 191, 383, 769, 1531, return _map_->count; \ } \ \ - FMOD void PFX##_iter_new(SNAME##_iter *iter, SNAME *target) \ + FMOD SNAME##_iter *PFX##_iter_new(SNAME *target) \ + { \ + SNAME##_iter *iter = malloc(sizeof(SNAME##_iter)); \ + \ + if (!iter) \ + return NULL; \ + \ + PFX##_iter_init(iter, target); \ + \ + return iter; \ + } \ + \ + FMOD void PFX##_iter_free(SNAME##_iter *iter) \ + { \ + free(iter); \ + } \ + \ + FMOD void PFX##_iter_init(SNAME##_iter *iter, SNAME *target) \ { \ iter->target = target; \ iter->cursor = 0; \ @@ -524,7 +543,7 @@ static const size_t cmc_hashtable_primes[] = {53, 97, 191, 383, 769, 1531, size_t index; \ SNAME##_iter iter; \ \ - for (PFX##_iter_new(&iter, _map_); !PFX##_iter_end(&iter);) \ + for (PFX##_iter_init(&iter, _map_); !PFX##_iter_end(&iter);) \ { \ PFX##_iter_next(&iter, &key, &value, &index); \ PFX##_insert(_new_map_, key, value); \ diff --git a/src/hashset.h b/src/hashset.h index bc8159d..2761de4 100644 --- a/src/hashset.h +++ b/src/hashset.h @@ -136,7 +136,9 @@ static const size_t cmc_hashtable_primes[] = {53, 97, 191, 383, 769, 1531, FMOD SNAME *PFX##_difference(SNAME *_set1_, SNAME *_set2_); \ FMOD SNAME *PFX##_symmetric_difference(SNAME *_set1_, SNAME *_set2_); \ \ - FMOD void PFX##_iter_new(SNAME##_iter *iter, SNAME *target); \ + FMOD SNAME##_iter *PFX##_iter_new(SNAME *target); \ + FMOD void PFX##_iter_free(SNAME##_iter *iter); \ + FMOD void PFX##_iter_init(SNAME##_iter *iter, SNAME *target); \ FMOD bool PFX##_iter_start(SNAME##_iter *iter); \ FMOD bool PFX##_iter_end(SNAME##_iter *iter); \ FMOD void PFX##_iter_tostart(SNAME##_iter *iter); \ @@ -294,7 +296,7 @@ static const size_t cmc_hashtable_primes[] = {53, 97, 191, 383, 769, 1531, size_t index; \ SNAME##_iter iter; \ \ - for (PFX##_iter_new(&iter, _set_); !PFX##_iter_end(&iter);) \ + for (PFX##_iter_init(&iter, _set_); !PFX##_iter_end(&iter);) \ { \ PFX##_iter_next(&iter, &result, &index); \ \ @@ -317,7 +319,7 @@ static const size_t cmc_hashtable_primes[] = {53, 97, 191, 383, 769, 1531, size_t index; \ SNAME##_iter iter; \ \ - for (PFX##_iter_new(&iter, _set_); !PFX##_iter_end(&iter);) \ + for (PFX##_iter_init(&iter, _set_); !PFX##_iter_end(&iter);) \ { \ PFX##_iter_next(&iter, &result, &index); \ \ @@ -356,8 +358,8 @@ static const size_t cmc_hashtable_primes[] = {53, 97, 191, 383, 769, 1531, if (!_set_r_) \ return false; \ \ - PFX##_iter_new(&iter1, _set1_); \ - PFX##_iter_new(&iter2, _set2_); \ + PFX##_iter_init(&iter1, _set1_); \ + PFX##_iter_init(&iter2, _set2_); \ \ for (PFX##_iter_tostart(&iter1); !PFX##_iter_end(&iter1);) \ { \ @@ -388,7 +390,7 @@ static const size_t cmc_hashtable_primes[] = {53, 97, 191, 383, 769, 1531, SNAME *_set_A_ = _set1_->count < _set2_->count ? _set1_ : _set2_; \ SNAME *_set_B_ = _set_A_ == _set1_ ? _set2_ : _set1_; \ \ - PFX##_iter_new(&iter, _set_A_); \ + PFX##_iter_init(&iter, _set_A_); \ \ for (PFX##_iter_tostart(&iter); !PFX##_iter_end(&iter);) \ { \ @@ -412,7 +414,7 @@ static const size_t cmc_hashtable_primes[] = {53, 97, 191, 383, 769, 1531, if (!_set_r_) \ return false; \ \ - PFX##_iter_new(&iter, _set1_); \ + PFX##_iter_init(&iter, _set1_); \ \ for (PFX##_iter_tostart(&iter); !PFX##_iter_end(&iter);) \ { \ @@ -436,8 +438,8 @@ static const size_t cmc_hashtable_primes[] = {53, 97, 191, 383, 769, 1531, if (!_set_r_) \ return false; \ \ - PFX##_iter_new(&iter1, _set1_); \ - PFX##_iter_new(&iter2, _set2_); \ + PFX##_iter_init(&iter1, _set1_); \ + PFX##_iter_init(&iter2, _set2_); \ \ for (PFX##_iter_tostart(&iter1); !PFX##_iter_end(&iter1);) \ { \ @@ -458,7 +460,24 @@ static const size_t cmc_hashtable_primes[] = {53, 97, 191, 383, 769, 1531, return _set_r_; \ } \ \ - FMOD void PFX##_iter_new(SNAME##_iter *iter, SNAME *target) \ + FMOD SNAME##_iter *PFX##_iter_new(SNAME *target) \ + { \ + SNAME##_iter *iter = malloc(sizeof(SNAME##_iter)); \ + \ + if (!iter) \ + return NULL; \ + \ + PFX##_iter_init(iter, target); \ + \ + return iter; \ + } \ + \ + FMOD void PFX##_iter_free(SNAME##_iter *iter) \ + { \ + free(iter); \ + } \ + \ + FMOD void PFX##_iter_init(SNAME##_iter *iter, SNAME *target) \ { \ iter->target = target; \ iter->cursor = 0; \ @@ -591,7 +610,7 @@ static const size_t cmc_hashtable_primes[] = {53, 97, 191, 383, 769, 1531, size_t index; \ SNAME##_iter iter; \ \ - for (PFX##_iter_new(&iter, _set_); !PFX##_iter_end(&iter);) \ + for (PFX##_iter_init(&iter, _set_); !PFX##_iter_end(&iter);) \ { \ PFX##_iter_next(&iter, &value, &index); \ PFX##_insert(_new_set_, value); \ diff --git a/src/heap.h b/src/heap.h index 1650015..717d2e2 100644 --- a/src/heap.h +++ b/src/heap.h @@ -83,7 +83,9 @@ typedef enum HeapOrder FMOD size_t PFX##_count(SNAME *_heap_); \ FMOD size_t PFX##_capacity(SNAME *_heap_); \ \ - FMOD void PFX##_iter_new(SNAME##_iter *iter, SNAME *target); \ + FMOD SNAME##_iter *PFX##_iter_new(SNAME *target); \ + FMOD void PFX##_iter_free(SNAME##_iter *iter); \ + FMOD void PFX##_iter_init(SNAME##_iter *iter, SNAME *target); \ FMOD bool PFX##_iter_start(SNAME##_iter *iter); \ FMOD bool PFX##_iter_end(SNAME##_iter *iter); \ FMOD void PFX##_iter_tostart(SNAME##_iter *iter); \ @@ -247,7 +249,24 @@ typedef enum HeapOrder return _heap_->capacity; \ } \ \ - FMOD void PFX##_iter_new(SNAME##_iter *iter, SNAME *target) \ + FMOD SNAME##_iter *PFX##_iter_new(SNAME *target) \ + { \ + SNAME##_iter *iter = malloc(sizeof(SNAME##_iter)); \ + \ + if (!iter) \ + return NULL; \ + \ + PFX##_iter_init(iter, target); \ + \ + return iter; \ + } \ + \ + FMOD void PFX##_iter_free(SNAME##_iter *iter) \ + { \ + free(iter); \ + } \ + \ + FMOD void PFX##_iter_init(SNAME##_iter *iter, SNAME *target) \ { \ iter->target = target; \ iter->cursor = 0; \ diff --git a/src/linkedlist.h b/src/linkedlist.h index df3fdbb..2586388 100644 --- a/src/linkedlist.h +++ b/src/linkedlist.h @@ -99,7 +99,9 @@ FMOD SNAME##_node *PFX##_next_node(SNAME##_node *_node_); \ FMOD SNAME##_node *PFX##_prev_node(SNAME##_node *_node_); \ \ - FMOD void PFX##_iter_new(SNAME##_iter *iter, SNAME *target); \ + FMOD SNAME##_iter *PFX##_iter_new(SNAME *target); \ + FMOD void PFX##_iter_free(SNAME##_iter *iter); \ + FMOD void PFX##_iter_init(SNAME##_iter *iter, SNAME *target); \ FMOD bool PFX##_iter_start(SNAME##_iter *iter); \ FMOD bool PFX##_iter_end(SNAME##_iter *iter); \ FMOD void PFX##_iter_tostart(SNAME##_iter *iter); \ @@ -558,7 +560,24 @@ return _node_->prev; \ } \ \ - FMOD void PFX##_iter_new(SNAME##_iter *iter, SNAME *target) \ + FMOD SNAME##_iter *PFX##_iter_new(SNAME *target) \ + { \ + SNAME##_iter *iter = malloc(sizeof(SNAME##_iter)); \ + \ + if (!iter) \ + return NULL; \ + \ + PFX##_iter_init(iter, target); \ + \ + return iter; \ + } \ + \ + FMOD void PFX##_iter_free(SNAME##_iter *iter) \ + { \ + free(iter); \ + } \ + \ + FMOD void PFX##_iter_init(SNAME##_iter *iter, SNAME *target) \ { \ iter->target = target; \ iter->cursor = target->head; \ diff --git a/src/list.h b/src/list.h index 4492550..1bb5617 100644 --- a/src/list.h +++ b/src/list.h @@ -89,7 +89,9 @@ FMOD bool PFX##_fits(SNAME *_list_, size_t size); \ FMOD size_t PFX##_capacity(SNAME *_list_); \ \ - FMOD void PFX##_iter_new(SNAME##_iter *iter, SNAME *target); \ + FMOD SNAME##_iter *PFX##_iter_new(SNAME *target); \ + FMOD void PFX##_iter_free(SNAME##_iter *iter); \ + FMOD void PFX##_iter_init(SNAME##_iter *iter, SNAME *target); \ FMOD bool PFX##_iter_start(SNAME##_iter *iter); \ FMOD bool PFX##_iter_end(SNAME##_iter *iter); \ FMOD void PFX##_iter_tostart(SNAME##_iter *iter); \ @@ -480,7 +482,24 @@ return _list_->capacity; \ } \ \ - FMOD void PFX##_iter_new(SNAME##_iter *iter, SNAME *target) \ + FMOD SNAME##_iter *PFX##_iter_new(SNAME *target) \ + { \ + SNAME##_iter *iter = malloc(sizeof(SNAME##_iter)); \ + \ + if (!iter) \ + return NULL; \ + \ + PFX##_iter_init(iter, target); \ + \ + return iter; \ + } \ + \ + FMOD void PFX##_iter_free(SNAME##_iter *iter) \ + { \ + free(iter); \ + } \ + \ + FMOD void PFX##_iter_init(SNAME##_iter *iter, SNAME *target) \ { \ iter->target = target; \ iter->cursor = 0; \ diff --git a/src/queue.h b/src/queue.h index 25df579..ff9eb2b 100644 --- a/src/queue.h +++ b/src/queue.h @@ -77,7 +77,9 @@ FMOD size_t PFX##_count(SNAME *_queue_); \ FMOD size_t PFX##_capacity(SNAME *_queue_); \ \ - FMOD void PFX##_iter_new(SNAME##_iter *iter, SNAME *target); \ + FMOD SNAME##_iter *PFX##_iter_new(SNAME *target); \ + FMOD void PFX##_iter_free(SNAME##_iter *iter); \ + FMOD void PFX##_iter_init(SNAME##_iter *iter, SNAME *target); \ FMOD bool PFX##_iter_start(SNAME##_iter *iter); \ FMOD bool PFX##_iter_end(SNAME##_iter *iter); \ FMOD void PFX##_iter_tostart(SNAME##_iter *iter); \ @@ -217,7 +219,24 @@ return _queue_->capacity; \ } \ \ - FMOD void PFX##_iter_new(SNAME##_iter *iter, SNAME *target) \ + FMOD SNAME##_iter *PFX##_iter_new(SNAME *target) \ + { \ + SNAME##_iter *iter = malloc(sizeof(SNAME##_iter)); \ + \ + if (!iter) \ + return NULL; \ + \ + PFX##_iter_init(iter, target); \ + \ + return iter; \ + } \ + \ + FMOD void PFX##_iter_free(SNAME##_iter *iter) \ + { \ + free(iter); \ + } \ + \ + FMOD void PFX##_iter_init(SNAME##_iter *iter, SNAME *target) \ { \ iter->target = target; \ iter->cursor = target->front; \ diff --git a/src/stack.h b/src/stack.h index 177757c..17524cc 100644 --- a/src/stack.h +++ b/src/stack.h @@ -74,7 +74,9 @@ FMOD size_t PFX##_count(SNAME *_stack_); \ FMOD size_t PFX##_capacity(SNAME *_stack_); \ \ - FMOD void PFX##_iter_new(SNAME##_iter *iter, SNAME *target); \ + FMOD SNAME##_iter *PFX##_iter_new(SNAME *target); \ + FMOD void PFX##_iter_free(SNAME##_iter *iter); \ + FMOD void PFX##_iter_init(SNAME##_iter *iter, SNAME *target); \ FMOD bool PFX##_iter_start(SNAME##_iter *iter); \ FMOD bool PFX##_iter_end(SNAME##_iter *iter); \ FMOD void PFX##_iter_tostart(SNAME##_iter *iter); \ @@ -204,7 +206,24 @@ return _stack_->capacity; \ } \ \ - FMOD void PFX##_iter_new(SNAME##_iter *iter, SNAME *target) \ + FMOD SNAME##_iter *PFX##_iter_new(SNAME *target) \ + { \ + SNAME##_iter *iter = malloc(sizeof(SNAME##_iter)); \ + \ + if (!iter) \ + return NULL; \ + \ + PFX##_iter_init(iter, target); \ + \ + return iter; \ + } \ + \ + FMOD void PFX##_iter_free(SNAME##_iter *iter) \ + { \ + free(iter); \ + } \ + \ + FMOD void PFX##_iter_init(SNAME##_iter *iter, SNAME *target) \ { \ iter->target = target; \ iter->cursor = iter->target->count - 1; \ diff --git a/src/treemap.h b/src/treemap.h index 1c4c635..d4f92ae 100644 --- a/src/treemap.h +++ b/src/treemap.h @@ -88,7 +88,9 @@ FMOD bool PFX##_empty(SNAME *_map_); \ FMOD size_t PFX##_count(SNAME *_map_); \ \ - FMOD void PFX##_iter_new(SNAME##_iter *iter, SNAME *target); \ + FMOD SNAME##_iter *PFX##_iter_new(SNAME *target); \ + FMOD void PFX##_iter_free(SNAME##_iter *iter); \ + FMOD void PFX##_iter_init(SNAME##_iter *iter, SNAME *target); \ FMOD bool PFX##_iter_start(SNAME##_iter *iter); \ FMOD bool PFX##_iter_end(SNAME##_iter *iter); \ FMOD void PFX##_iter_tostart(SNAME##_iter *iter); \ @@ -460,7 +462,24 @@ return _map_->count; \ } \ \ - FMOD void PFX##_iter_new(SNAME##_iter *iter, SNAME *target) \ + FMOD SNAME##_iter *PFX##_iter_new(SNAME *target) \ + { \ + SNAME##_iter *iter = malloc(sizeof(SNAME##_iter)); \ + \ + if (!iter) \ + return NULL; \ + \ + PFX##_iter_init(iter, target); \ + \ + return iter; \ + } \ + \ + FMOD void PFX##_iter_free(SNAME##_iter *iter) \ + { \ + free(iter); \ + } \ + \ + FMOD void PFX##_iter_init(SNAME##_iter *iter, SNAME *target) \ { \ iter->target = target; \ iter->index = 0; \ diff --git a/src/treeset.h b/src/treeset.h index d531c8e..cf5b7c0 100644 --- a/src/treeset.h +++ b/src/treeset.h @@ -90,7 +90,9 @@ FMOD SNAME *PFX##_difference(SNAME *_set1_, SNAME *_set2_); \ FMOD SNAME *PFX##_symmetric_difference(SNAME *_set1_, SNAME *_set2_); \ \ - FMOD void PFX##_iter_new(SNAME##_iter *iter, SNAME *target); \ + FMOD SNAME##_iter *PFX##_iter_new(SNAME *target); \ + FMOD void PFX##_iter_free(SNAME##_iter *iter); \ + FMOD void PFX##_iter_init(SNAME##_iter *iter, SNAME *target); \ FMOD bool PFX##_iter_start(SNAME##_iter *iter); \ FMOD bool PFX##_iter_end(SNAME##_iter *iter); \ FMOD void PFX##_iter_tostart(SNAME##_iter *iter); \ @@ -443,8 +445,8 @@ if (!_set_r_) \ return false; \ \ - PFX##_iter_new(&iter1, _set1_); \ - PFX##_iter_new(&iter2, _set2_); \ + PFX##_iter_init(&iter1, _set1_); \ + PFX##_iter_init(&iter2, _set2_); \ \ for (PFX##_iter_tostart(&iter1); !PFX##_iter_end(&iter1);) \ { \ @@ -475,7 +477,7 @@ SNAME *_set_A_ = _set1_->count < _set2_->count ? _set1_ : _set2_; \ SNAME *_set_B_ = _set_A_ == _set1_ ? _set2_ : _set1_; \ \ - PFX##_iter_new(&iter, _set_A_); \ + PFX##_iter_init(&iter, _set_A_); \ \ for (PFX##_iter_tostart(&iter); !PFX##_iter_end(&iter);) \ { \ @@ -498,7 +500,7 @@ if (!_set_r_) \ return false; \ \ - PFX##_iter_new(&iter, _set1_); \ + PFX##_iter_init(&iter, _set1_); \ \ for (PFX##_iter_tostart(&iter); !PFX##_iter_end(&iter);) \ { \ @@ -521,8 +523,8 @@ if (!_set_r_) \ return false; \ \ - PFX##_iter_new(&iter1, _set1_); \ - PFX##_iter_new(&iter2, _set2_); \ + PFX##_iter_init(&iter1, _set1_); \ + PFX##_iter_init(&iter2, _set2_); \ \ for (PFX##_iter_tostart(&iter1); !PFX##_iter_end(&iter1);) \ { \ @@ -541,7 +543,24 @@ return _set_r_; \ } \ \ - FMOD void PFX##_iter_new(SNAME##_iter *iter, SNAME *target) \ + FMOD SNAME##_iter *PFX##_iter_new(SNAME *target) \ + { \ + SNAME##_iter *iter = malloc(sizeof(SNAME##_iter)); \ + \ + if (!iter) \ + return NULL; \ + \ + PFX##_iter_init(iter, target); \ + \ + return iter; \ + } \ + \ + FMOD void PFX##_iter_free(SNAME##_iter *iter) \ + { \ + free(iter); \ + } \ + \ + FMOD void PFX##_iter_init(SNAME##_iter *iter, SNAME *target) \ { \ iter->target = target; \ iter->index = 0; \ diff --git a/tests/iterators.c b/tests/iterators.c index f231d28..aab3b40 100644 --- a/tests/iterators.c +++ b/tests/iterators.c @@ -44,7 +44,7 @@ void deque_iter_test(void) // Initialize iterator deque_iter iter; - d_iter_new(&iter, d); + d_iter_init(&iter, d); // Make the iterator go back and forward for (int j = 0; j < 4; j++) @@ -86,7 +86,7 @@ void hashmap_iter_test(void) // Initialize iterator hmap_iter iter; - hm_iter_new(&iter, hm); + hm_iter_init(&iter, hm); // Make the iterator go back and forward for (int j = 0; j < 4; j++) @@ -137,7 +137,7 @@ void hashset_iter_test(void) // Initialize iterator hset_iter iter; - hs_iter_new(&iter, hs); + hs_iter_init(&iter, hs); // Make the iterator go back and forward for (int j = 0; j < 4; j++) @@ -178,7 +178,7 @@ void heap_iter_test(void) // Initialize iterator heap_iter iter; - h_iter_new(&iter, h); + h_iter_init(&iter, h); // Make the iterator go back and forward for (int j = 0; j < 4; j++) @@ -219,7 +219,7 @@ void linkedlist_iter_test(void) // Initialize iterator linked_iter iter; - ll_iter_new(&iter, ll); + ll_iter_init(&iter, ll); // Make the iterator go back and forward for (int j = 0; j < 4; j++) @@ -260,7 +260,7 @@ void list_iter_test(void) // Initialize iterator list_iter iter; - l_iter_new(&iter, l); + l_iter_init(&iter, l); // Make the iterator go back and forward for (int j = 0; j < 4; j++) @@ -301,7 +301,7 @@ void queue_iter_test(void) // Initialize iterator queue_iter iter; - q_iter_new(&iter, q); + q_iter_init(&iter, q); // Make the iterator go back and forward for (int j = 0; j < 4; j++) @@ -342,7 +342,7 @@ void stack_iter_test(void) // Initialize iterator stack_iter iter; - s_iter_new(&iter, s); + s_iter_init(&iter, s); // Make the iterator go back and forward for (int j = 0; j < 4; j++) @@ -384,7 +384,7 @@ void treemap_iter_test(void) // Initialize iterator tmap_iter iter; - tm_iter_new(&iter, tm); + tm_iter_init(&iter, tm); // Make the iterator go back and forward for (int j = 0; j < 4; j++) @@ -433,7 +433,7 @@ void treeset_iter_test(void) // Initialize iterator tset_iter iter; - ts_iter_new(&iter, ts); + ts_iter_init(&iter, ts); // Make the iterator go back and forward for (int j = 0; j < 4; j++)