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