}
}
-static void rm(int init, int end)
+static void do_rm(int init, int end, bool exist)
{
int i;
uint32_t hash;
hash = arr[i];
- g_assert_true(qht_remove(&ht, &arr[i], hash));
+ if (exist) {
+ g_assert_true(qht_remove(&ht, &arr[i], hash));
+ } else {
+ g_assert_false(qht_remove(&ht, &arr[i], hash));
+ }
}
}
+static void rm(int init, int end)
+{
+ do_rm(init, end, true);
+}
+
+static void rm_nonexist(int init, int end)
+{
+ do_rm(init, end, false);
+}
+
static void check(int a, int b, bool expected)
{
struct qht_stats stats;
qht_statistics_destroy(&stats);
}
-static void count_func(struct qht *ht, void *p, uint32_t hash, void *userp)
+static void count_func(void *p, uint32_t hash, void *userp)
{
unsigned int *curr = userp;
g_assert_cmpuint(curr, ==, count);
}
-static void sum_func(struct qht *ht, void *p, uint32_t hash, void *userp)
+static void sum_func(void *p, uint32_t hash, void *userp)
{
uint32_t *sum = userp;
uint32_t a = *(uint32_t *)p;
g_assert_cmpuint(sum, ==, expected);
}
-static bool rm_mod_func(struct qht *ht, void *p, uint32_t hash, void *userp)
+static bool rm_mod_func(void *p, uint32_t hash, void *userp)
{
uint32_t a = *(uint32_t *)p;
unsigned int mod = *(unsigned int *)userp;
check_n(0);
qht_init(&ht, is_equal, 0, mode);
+ rm_nonexist(0, 4);
+ /*
+ * Test that we successfully delete the last element in a bucket.
+ * This is a hard-to-reach code path when resizing is on, but without
+ * resizing we can easily hit it if init_entries <= 1.
+ * Given that the number of elements per bucket can be 4 or 6 depending on
+ * the host's pointer size, test the removal of the 4th and 6th elements.
+ */
+ insert(0, 4);
+ rm_nonexist(5, 6);
+ rm(3, 4);
+ check_n(3);
+ insert(3, 6);
+ rm(5, 6);
+ check_n(5);
+ rm_nonexist(7, 8);
+ iter_rm_mod(1);
+
+ if (!(mode & QHT_MODE_AUTO_RESIZE)) {
+ qht_resize(&ht, init_entries * 4 + 4);
+ }
check_n(0);
+ rm_nonexist(0, 10);
insert(0, N);
check(0, N, true);
check_n(N);
qht_reset(&ht);
insert(0, N);
+ rm_nonexist(N, N + 32);
iter_rm_mod(10);
iter_rm_mod_check(10);
check_n(N * 9 / 10);