1 #include <ccan/tap/tap.h>
2 #define CCAN_JMAP_DEBUG
3 #include <ccan/jmap/jmap.c>
6 JMAP_MEMBERS(unsigned long, unsigned long);
9 int main(int argc, char *argv[])
12 unsigned long i, *value;
17 map = jmap_new(struct map);
18 ok1(jmap_error(map) == NULL);
20 ok1(jmap_test(map, 0) == false);
21 ok1(jmap_del(map, 0) == false);
22 ok1(jmap_add(map, 0, 1) == true);
23 ok1(jmap_test(map, 0) == true);
24 ok1(jmap_get(map, 0) == 1);
25 ok1(jmap_get(map, 1) == 0);
26 ok1(jmap_del(map, 0) == true);
28 ok1(jmap_popcount(map, 0, -1) == 0);
29 ok1(jmap_nth(map, 0, 0) == 0);
30 ok1(jmap_nth(map, 0, -1) == (size_t)-1);
31 ok1(jmap_first(map) == 0);
32 ok1(jmap_last(map) == 0);
34 ok1(jmap_getval(map, 0) == NULL);
36 /* Map a million indices, 16 apart. */
37 for (i = 0; i < 1000000; i++)
38 jmap_add(map, (i << 4) + 1, (i << 5) + 1);
40 /* This only take 6.3MB on my 32-bit system. */
41 diag("%u bytes memory used\n", (unsigned)JudyLMemUsed(map->raw.judy));
43 ok1(jmap_get(map, 1) == 1);
44 ok1(jmap_get(map, (999999 << 4) + 1) == (999999 << 5) + 1);
45 ok1(jmap_popcount(map, 0, -1) == 1000000);
46 ok1(jmap_nth(map, 0, -1) == 1);
47 ok1(jmap_nth(map, 999999, -1) == (999999 << 4) + 1);
48 ok1(jmap_nth(map, 1000000, -1) == (size_t)-1);
49 ok1(jmap_first(map) == 1);
50 ok1(jmap_last(map) == (999999 << 4) + 1);
51 ok1(jmap_next(map, 1) == (1 << 4) + 1);
52 ok1(jmap_next(map, (999999 << 4) + 1) == 0);
53 ok1(jmap_prev(map, 2) == 1);
54 ok1(jmap_prev(map, 0) == 0);
55 ok1(jmap_error(map) == NULL);
58 value = jmap_getval(map, 1);
59 ok1(value && *value == 1);
61 ok1(jmap_get(map, 1) == 2);
62 jmap_putval(map, &value);
63 ok1(jmap_get(map, 1) == 2);
64 ok1(jmap_set(map, 1, 1));
66 value = jmap_getval(map, (999999 << 4) + 1);
67 ok1(value && *value == (999999 << 5) + 1);
68 jmap_putval(map, &value);
70 value = jmap_nthval(map, 0, &i);
72 ok1(value && *value == 1);
73 jmap_putval(map, &value);
74 value = jmap_nthval(map, 999999, &i);
75 ok1(i == (999999 << 4) + 1);
76 ok1(value && *value == (999999 << 5) + 1);
77 jmap_putval(map, &value);
78 ok1(jmap_nthval(map, 1000000, &i) == NULL);
80 value = jmap_firstval(map, &i);
82 ok1(value && *value == 1);
83 jmap_putval(map, &value);
84 ok1(jmap_prevval(map, &i) == NULL);
87 value = jmap_nextval(map, &i);
88 ok1(i == (1 << 4) + 1);
89 ok1(value && *value == (1 << 5) + 1);
90 jmap_putval(map, &value);
92 value = jmap_lastval(map, &i);
93 ok1(i == (999999 << 4) + 1);
94 ok1(value && *value == (999999 << 5) + 1);
95 jmap_putval(map, &value);
96 ok1(jmap_nextval(map, &i) == NULL);
98 i = (999999 << 4) + 1;
99 value = jmap_prevval(map, &i);
100 ok1(i == (999998 << 4) + 1);
101 ok1(value && *value == (999998 << 5) + 1);
102 jmap_putval(map, &value);
104 /* Test error handling */
105 JU_ERRNO(&map->raw.err) = 100;
106 JU_ERRID(&map->raw.err) = 991;
107 err = jmap_error(map);
109 ok1(strstr(err, "100"));
110 ok1(strstr(err, "991"));
111 ok1(err == map->raw.errstr);
114 return exit_status();