14 static A_INLINE int_node
*int_entry(void const *node
)
16 return a_cast_r(int_node
*, a_cast_r(a_uptr
, node
) - a_offsetof(int_node
, node
)); /* NOLINT */
19 static int int_cmp(void const *lhs
, void const *rhs
)
21 int a
= int_entry(lhs
)->data
;
22 int b
= int_entry(rhs
)->data
;
23 return (a
> b
) - (a
< b
);
26 static int intcmp(void const *lhs
, void const *rhs
)
28 int a
= *a_int_(const *, lhs
);
29 int b
= *a_int_(const *, rhs
);
30 return (a
> b
) - (a
< b
);
33 static int test(unsigned long n
)
37 a_rbt_node
*cur
, *next
;
38 a_str str
= A_STR_INIT
;
39 a_rbt root
= A_RBT_ROOT
;
40 int *sorted
= a_new(int, A_NULL
, n
);
41 int_node
*vec
= a_new(int_node
, A_NULL
, n
);
42 for (i
= 0; i
< n
; ++i
)
44 a_str_setf(&str
, "%u", i
);
45 vec
[i
].data
= sorted
[i
] = a_cast_s(int, a_hash_bkdr(a_str_ptr(&str
), 0));
46 a_rbt_insert(&root
, &vec
[i
].node
, int_cmp
);
49 debug("insert 0x%04X/0x%04lX\n", i
, n
);
54 for (i
= 0; i
< n
; ++i
)
56 TEST_BUG(a_rbt_search(&root
, &vec
[i
].node
, int_cmp
));
59 qsort(sorted
, n
, sizeof(int), intcmp
);
62 for (i
= 0; i
< n
; ++i
)
66 A_RBT_FOREACH(cur
, &root
)
68 int_node
*it
= int_entry(cur
);
69 TEST_BUG(it
->data
== sorted
[x
]);
73 for (i
= 0; i
< n
; ++i
)
75 TEST_BUG(vec
[i
].reached
);
80 for (i
= 0; i
< n
; ++i
)
84 A_RBT_FOREACH_REVERSE(cur
, &root
)
86 int_node
*it
= int_entry(cur
);
87 TEST_BUG(it
->data
== sorted
[--x
]);
90 for (i
= 0; i
< n
; ++i
)
92 TEST_BUG(vec
[i
].reached
);
96 for (i
= 0; i
< n
; ++i
)
100 A_RBT_PRE_FOREACH(cur
, &root
)
102 int_node
*it
= int_entry(cur
);
105 for (i
= 0; i
< n
; ++i
)
107 TEST_BUG(vec
[i
].reached
);
110 for (i
= 0; i
< n
; ++i
)
114 A_RBT_PRE_FOREACH_REVERSE(cur
, &root
)
116 int_node
*it
= int_entry(cur
);
119 for (i
= 0; i
< n
; ++i
)
121 TEST_BUG(vec
[i
].reached
);
124 for (i
= 0; i
< n
; ++i
)
128 A_RBT_POST_FOREACH(cur
, &root
)
130 int_node
*it
= int_entry(cur
);
133 for (i
= 0; i
< n
; ++i
)
135 TEST_BUG(vec
[i
].reached
);
138 for (i
= 0; i
< n
; ++i
)
142 A_RBT_POST_FOREACH_REVERSE(cur
, &root
)
144 int_node
*it
= int_entry(cur
);
147 for (i
= 0; i
< n
; ++i
)
149 TEST_BUG(vec
[i
].reached
);
152 for (i
= 0; i
< n
; ++i
)
154 a_rbt_remove(&root
, &vec
[i
].node
);
157 debug("remove 0x%04X/0x%04lX\n", i
, n
);
161 TEST_BUG(!a_rbt_search(&root
, &vec
->node
, int_cmp
));
163 for (i
= 0; i
< n
; ++i
)
165 a_rbt_insert(&root
, &vec
[i
].node
, int_cmp
);
168 A_RBT_FORTEAR(cur
, next
, &root
)
170 int_entry(cur
)->reached
= 1;
172 for (i
= 0; i
< n
; ++i
)
174 TEST_BUG(vec
[i
].reached
);
182 int main(int argc
, char *argv
[]) /* NOLINT(misc-definitions-in-headers) */
184 unsigned long n
= 0x1000;
185 if (argc
> 1) { n
= strtoul(argv
[1], A_NULL
, 0); }