summaryrefslogtreecommitdiff
path: root/src/supplemental/util/idhash_test.c
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2024-08-11 22:12:30 -0700
committerGarrett D'Amore <garrett@damore.org>2024-08-11 22:12:38 -0700
commitd3652db599cb3bf4101cf2e6cf42c764d65b6fb8 (patch)
tree1ca0bd8f2ed991abb96b02b56d7010f8680703e3 /src/supplemental/util/idhash_test.c
parent6e5cf2967bc8717ab712a6cdda9d297d18bdeef0 (diff)
downloadnng-d3652db599cb3bf4101cf2e6cf42c764d65b6fb8.tar.gz
nng-d3652db599cb3bf4101cf2e6cf42c764d65b6fb8.tar.bz2
nng-d3652db599cb3bf4101cf2e6cf42c764d65b6fb8.zip
idhash: add nng_id_visit API
This allows an efficient way to iterate over the entries stored in an ID hash. The iteration is fast, and requires no additional storage. The order of iteration is not guaranteed.
Diffstat (limited to 'src/supplemental/util/idhash_test.c')
-rw-r--r--src/supplemental/util/idhash_test.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/supplemental/util/idhash_test.c b/src/supplemental/util/idhash_test.c
index 5bbdc4fb..e0d472a0 100644
--- a/src/supplemental/util/idhash_test.c
+++ b/src/supplemental/util/idhash_test.c
@@ -182,6 +182,52 @@ test_id_set_out_of_range(void)
nng_id_map_free(m);
}
+void
+test_id_visit(void)
+{
+ nng_id_map *m;
+ int x, y;
+ uint64_t id1;
+ uint64_t id2;
+ int *v1;
+ int *v2;
+ uint32_t cursor = 0;
+
+ NUTS_PASS(nng_id_map_alloc(&m, 10, 13, 0));
+
+ // We can insert outside the range forcibly.
+ NUTS_PASS(nng_id_set(m, 1, &x));
+ NUTS_PASS(nng_id_set(m, 100, &y));
+ NUTS_TRUE(nng_id_visit(m, &id1, (void **) &v1, &cursor));
+ NUTS_ASSERT(id1 == 1 || id1 == 100);
+ NUTS_ASSERT(v1 == &x || v1 == &y);
+ NUTS_TRUE(nng_id_visit(m, &id2, (void **) &v2, &cursor));
+ NUTS_ASSERT(id2 == 1 || id2 == 100);
+ NUTS_ASSERT(v2 == &x || v2 == &y);
+ NUTS_ASSERT(id1 != id2);
+ NUTS_ASSERT(v1 != v2);
+ NUTS_TRUE(!nng_id_visit(m, &id2, (void **) &v2, &cursor));
+ nng_id_map_free(m);
+}
+
+void
+test_id_visit_out_of_range(void)
+{
+ nng_id_map *m;
+ int x, y;
+ uint64_t id1;
+ int *v1;
+ uint32_t cursor = 1000;
+
+ NUTS_PASS(nng_id_map_alloc(&m, 10, 13, 0));
+
+ // We can insert outside the range forcibly.
+ NUTS_PASS(nng_id_set(m, 1, &x));
+ NUTS_PASS(nng_id_set(m, 100, &y));
+ NUTS_TRUE(!nng_id_visit(m, &id1, (void **) &v1, &cursor));
+ nng_id_map_free(m);
+}
+
#define STRESS_LOAD 50000
#define NUM_VALUES 1000
@@ -303,6 +349,8 @@ NUTS_TESTS = {
{ "id resize", test_id_resize },
{ "id dynamic", test_id_dynamic },
{ "id set out of range", test_id_set_out_of_range },
+ { "id visit", test_id_visit },
+ { "id visit out of range", test_id_visit_out_of_range },
{ "id stress", test_id_stress },
{ "id alloc long long", test_id_alloc_long_long },
{ NULL, NULL },