diff options
| author | William Casarin <jb55@jb55.com> | 2018-07-09 22:28:25 -0700 |
|---|---|---|
| committer | William Casarin <jb55@jb55.com> | 2018-07-09 22:31:48 -0700 |
| commit | 9593fc545950782ed75f12f53238b07885559b2b (patch) | |
| tree | 9c7c2f7cbb427c54e9184cb61eedce737a6cbc6f /ccan/htable/test/run.c | |
| parent | bd8c223756d2f912526ecef53bae0cc8e0c63442 (diff) | |
remove ccan for now
Diffstat (limited to 'ccan/htable/test/run.c')
| -rw-r--r-- | ccan/htable/test/run.c | 212 |
1 files changed, 0 insertions, 212 deletions
diff --git a/ccan/htable/test/run.c b/ccan/htable/test/run.c deleted file mode 100644 index 46514c7..0000000 --- a/ccan/htable/test/run.c +++ /dev/null @@ -1,212 +0,0 @@ -#include <ccan/htable/htable.h> -#include <ccan/htable/htable.c> -#include <ccan/tap/tap.h> -#include <stdbool.h> -#include <string.h> - -#define NUM_BITS 7 -#define NUM_VALS (1 << NUM_BITS) - -/* We use the number divided by two as the hash (for lots of - collisions), plus set all the higher bits so we can detect if they - don't get masked out. */ -static size_t hash(const void *elem, void *unused UNNEEDED) -{ - size_t h = *(uint64_t *)elem / 2; - h |= -1UL << NUM_BITS; - return h; -} - -static bool objcmp(const void *htelem, void *cmpdata) -{ - return *(uint64_t *)htelem == *(uint64_t *)cmpdata; -} - -static void add_vals(struct htable *ht, - const uint64_t val[], - unsigned int off, unsigned int num) -{ - uint64_t i; - - for (i = off; i < off+num; i++) { - if (htable_get(ht, hash(&i, NULL), objcmp, &i)) { - fail("%llu already in hash", (long long)i); - return; - } - htable_add(ht, hash(&val[i], NULL), &val[i]); - if (htable_get(ht, hash(&i, NULL), objcmp, &i) != &val[i]) { - fail("%llu not added to hash", (long long)i); - return; - } - } - pass("Added %llu numbers to hash", (long long)i); -} - -#if 0 -static void refill_vals(struct htable *ht, - const uint64_t val[], unsigned int num) -{ - uint64_t i; - - for (i = 0; i < num; i++) { - if (htable_get(ht, hash(&i, NULL), objcmp, &i)) - continue; - htable_add(ht, hash(&val[i], NULL), &val[i]); - } -} -#endif - -static void find_vals(struct htable *ht, - const uint64_t val[], unsigned int num) -{ - uint64_t i; - - for (i = 0; i < num; i++) { - if (htable_get(ht, hash(&i, NULL), objcmp, &i) != &val[i]) { - fail("%llu not found in hash", (long long)i); - return; - } - } - pass("Found %llu numbers in hash", (long long)i); -} - -static void del_vals(struct htable *ht, - const uint64_t val[], unsigned int num) -{ - uint64_t i; - - for (i = 0; i < num; i++) { - if (!htable_del(ht, hash(&val[i], NULL), &val[i])) { - fail("%llu not deleted from hash", (long long)i); - return; - } - } - pass("Deleted %llu numbers in hash", (long long)i); -} - -static bool check_mask(struct htable *ht, uint64_t val[], unsigned num) -{ - uint64_t i; - - for (i = 0; i < num; i++) { - if (((uintptr_t)&val[i] & ht->common_mask) != ht->common_bits) - return false; - } - return true; -} - -int main(void) -{ - unsigned int i, weight; - uintptr_t perfect_bit; - struct htable ht; - uint64_t val[NUM_VALS]; - uint64_t dne; - void *p; - struct htable_iter iter; - - plan_tests(36); - for (i = 0; i < NUM_VALS; i++) - val[i] = i; - dne = i; - - htable_init(&ht, hash, NULL); - ok1(ht.max == 0); - ok1(ht.bits == 0); - - /* We cannot find an entry which doesn't exist. */ - ok1(!htable_get(&ht, hash(&dne, NULL), objcmp, &dne)); - - /* This should increase it once. */ - add_vals(&ht, val, 0, 1); - ok1(ht.bits == 1); - ok1(ht.max == 1); - weight = 0; - for (i = 0; i < sizeof(ht.common_mask) * CHAR_BIT; i++) { - if (ht.common_mask & ((uintptr_t)1 << i)) { - weight++; - } - } - /* Only one bit should be clear. */ - ok1(weight == i-1); - - /* Mask should be set. */ - ok1(check_mask(&ht, val, 1)); - - /* This should increase it again. */ - add_vals(&ht, val, 1, 1); - ok1(ht.bits == 2); - ok1(ht.max == 3); - - /* Mask should be set. */ - ok1(ht.common_mask != 0); - ok1(ht.common_mask != -1); - ok1(check_mask(&ht, val, 2)); - - /* Now do the rest. */ - add_vals(&ht, val, 2, NUM_VALS - 2); - - /* Find all. */ - find_vals(&ht, val, NUM_VALS); - ok1(!htable_get(&ht, hash(&dne, NULL), objcmp, &dne)); - - /* Walk once, should get them all. */ - i = 0; - for (p = htable_first(&ht,&iter); p; p = htable_next(&ht, &iter)) - i++; - ok1(i == NUM_VALS); - - i = 0; - for (p = htable_prev(&ht, &iter); p; p = htable_prev(&ht, &iter)) - i++; - ok1(i == NUM_VALS); - - /* Delete all. */ - del_vals(&ht, val, NUM_VALS); - ok1(!htable_get(&ht, hash(&val[0], NULL), objcmp, &val[0])); - - /* Worst case, a "pointer" which doesn't have any matching bits. */ - htable_add(&ht, 0, (void *)~(uintptr_t)&val[NUM_VALS-1]); - htable_add(&ht, hash(&val[NUM_VALS-1], NULL), &val[NUM_VALS-1]); - ok1(ht.common_mask == 0); - ok1(ht.common_bits == 0); - /* Get rid of bogus pointer before we trip over it! */ - htable_del(&ht, 0, (void *)~(uintptr_t)&val[NUM_VALS-1]); - - /* Add the rest. */ - add_vals(&ht, val, 0, NUM_VALS-1); - - /* Check we can find them all. */ - find_vals(&ht, val, NUM_VALS); - ok1(!htable_get(&ht, hash(&dne, NULL), objcmp, &dne)); - - /* Corner cases: wipe out the perfect bit using bogus pointer. */ - htable_clear(&ht); - htable_add(&ht, 0, (void *)((uintptr_t)&val[NUM_VALS-1])); - ok1(ht.perfect_bit); - perfect_bit = ht.perfect_bit; - htable_add(&ht, 0, (void *)((uintptr_t)&val[NUM_VALS-1] - | perfect_bit)); - ok1(ht.perfect_bit == 0); - htable_del(&ht, 0, (void *)((uintptr_t)&val[NUM_VALS-1] | perfect_bit)); - - /* Enlarging should restore it... */ - add_vals(&ht, val, 0, NUM_VALS-1); - - ok1(ht.perfect_bit != 0); - htable_clear(&ht); - - ok1(htable_init_sized(&ht, hash, NULL, 1024)); - ok1(ht.max >= 1024); - htable_clear(&ht); - - ok1(htable_init_sized(&ht, hash, NULL, 1023)); - ok1(ht.max >= 1023); - htable_clear(&ht); - - ok1(htable_init_sized(&ht, hash, NULL, 1025)); - ok1(ht.max >= 1025); - htable_clear(&ht); - - return exit_status(); -} |
