diff --git a/src/foreach.h b/src/foreach.h index 1b43498..cb06e02 100644 --- a/src/foreach.h +++ b/src/foreach.h @@ -41,4 +41,33 @@ } \ } while (0); +#define FOR_EACH_MAP(PFX, SNAME, K, V, TARGET, BODY) \ + do \ + { \ + size_t index; \ + K key; \ + V value; \ + SNAME##_iter iter; \ + PFX##_iter_new(&iter, TARGET); \ + while (PFX##_iter_next(&iter, &key, &value, &index)) \ + { \ + BODY; \ + } \ + } while (0); + +#define FOR_EACH_MAP_REV(PFX, SNAME, K, V, TARGET, BODY) \ + do \ + { \ + size_t index; \ + K key; \ + V value; \ + SNAME##_iter iter; \ + PFX##_iter_new(&iter, TARGET); \ + PFX##_iter_toend(&iter); \ + while (PFX##_iter_prev(&iter, &key, &value, &index)) \ + { \ + BODY; \ + } \ + } while (0); + #endif /* CMC_FOR_EACH */ \ No newline at end of file diff --git a/src/treeset.h b/src/treeset.h index 57fd3c8..dbbb2b6 100644 --- a/src/treeset.h +++ b/src/treeset.h @@ -9,7 +9,7 @@ */ /*****************************************************************************/ -/**************************************************************** TREESET */ +/******************************************************************* TREESET */ /*****************************************************************************/ #ifndef CMC_TREESET_H diff --git a/tests/foreach.c b/tests/foreach.c index fcc1082..47fc63d 100644 --- a/tests/foreach.c +++ b/tests/foreach.c @@ -14,6 +14,7 @@ COLLECTION_GENERATE(DEQUE, PUBLIC, d, deque, /**/, /**/, int) COLLECTION_GENERATE(LINKEDLIST, PUBLIC, ll, linked, /**/, /**/, int) COLLECTION_GENERATE(HEAP, PUBLIC, h, heap, /**/, /**/, int) COLLECTION_GENERATE(TREESET, PUBLIC, ts, tset, /**/, /**/, int) +COLLECTION_GENERATE(TREEMAP, PUBLIC, tm, tmap, /**/, int, int) int main(int argc, char const *argv[]) { @@ -24,6 +25,7 @@ int main(int argc, char const *argv[]) linked *ll = ll_new(); heap *h = h_new(1000, MaxHeap, cmp); tset *ts = ts_new(cmp); + tmap *tm = tm_new(cmp); for (int i = 1; i < 10001; i++) { @@ -44,9 +46,10 @@ int main(int argc, char const *argv[]) q_enqueue(q, i); h_insert(h, i); ts_insert(ts, i); + tm_insert(tm, i, i); } - int sum0 = 0, sum1 = 0, sum2 = 0, sum3 = 0, sum4 = 0, sum5 = 0, sum6 = 0; + int sum0 = 0, sum1 = 0, sum2 = 0, sum3 = 0, sum4 = 0, sum5 = 0, sum6 = 0, sum7 = 0, sum8 = 0; FOR_EACH(l, list, int, l, { sum0 += var; @@ -76,6 +79,11 @@ int main(int argc, char const *argv[]) sum6 += var; }) + FOR_EACH_MAP(tm, tmap, int, int, tm, { + sum7 += key; + sum8 += value; + }) + if (sum0 == 50005000) printf("%10s PASSED\n", "LIST"); if (sum1 == 50005000) @@ -90,10 +98,12 @@ int main(int argc, char const *argv[]) printf("%10s PASSED\n", "HEAP"); if (sum6 == 50005000) printf("%10s PASSED\n", "TREESET"); + if (sum7 == 50005000 && sum8 == 50005000) + printf("%10s PASSED\n", "TREEMAP"); printf("\n\n"); - sum0 = 0, sum1 = 0, sum2 = 0, sum3 = 0, sum4 = 0, sum5 = 0, sum6 = 0; + sum0 = 0, sum1 = 0, sum2 = 0, sum3 = 0, sum4 = 0, sum5 = 0, sum6 = 0, sum7 = 0, sum8 = 0; FOR_EACH_REV(l, list, int, l, { sum0 += var; @@ -123,6 +133,11 @@ int main(int argc, char const *argv[]) sum6 += var; }) + FOR_EACH_MAP_REV(tm, tmap, int, int, tm, { + sum7 += key; + sum8 += value; + }) + if (sum0 == 50005000) printf("%10s PASSED\n", "LIST"); if (sum1 == 50005000) @@ -137,12 +152,16 @@ int main(int argc, char const *argv[]) printf("%10s PASSED\n", "HEAP"); if (sum6 == 50005000) printf("%10s PASSED\n", "TREESET"); + if (sum7 == 50005000 && sum8 == 50005000) + printf("%10s PASSED\n", "TREEMAP"); l_free(l); ll_free(ll); s_free(s); q_free(q); d_free(d); + ts_free(ts); + tm_free(tm); return 0; } diff --git a/tests/iterators/treemap.c b/tests/iterators/treemap.c new file mode 100644 index 0000000..550b0dc --- /dev/null +++ b/tests/iterators/treemap.c @@ -0,0 +1,59 @@ +// Checks if the treemap iterator can go back and forward in the treemap without +// hitting invalid states or a null pointer. Check is done visually. +#include +#include +#include +#include +#include "../../src/treemap.h" + +int intcmp(int a, int b) +{ + return a - b; +} + +TREEMAP_GENERATE(tm, tmap, static, int, double) + +int main(int argc, char const *argv[]) +{ + size_t i; + int k; + double v, varr[10] = {0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9}; + + // Initliazie treemap and add some elementm + tmap *tm = tm_new(intcmp); + for (int i = 0; i < 10; i++) + tm_insert(tm, i, varr[i]); + + // Initialize iterator + tmap_iter iter; + tm_iter_new(&iter, tm); + + // Make the iterator go back and forward + for (int j = 0; j < 4; j++) + { + while (tm_iter_next(&iter, &k, &v, &i)) + printf("S[%2d] = { %2d : %2.2lf }\n", i, k, v); + printf("\n"); + while (tm_iter_prev(&iter, &k, &v, &i)) + printf("S[%2d] = { %2d : %2.2lf }\n", i, k, v); + printf("\n\n"); + } + + for (tm_iter_tostart(&iter); !tm_iter_end(&iter); /**/) + { + tm_iter_next(&iter, &k, &v, &i); + printf("M[%2d] = { %2d : %2.2lf }\n", i, k, v); + } + + printf("\n"); + + for (tm_iter_toend(&iter); !tm_iter_start(&iter); /**/) + { + tm_iter_prev(&iter, &k, &v, &i); + printf("M[%2d] = { %2d : %2.2lf }\n", i, k, v); + } + + tm_free(tm); + + return 0; +}