diff --git a/example/ex-bptree02.c b/example/ex-bptree02.c new file mode 100644 index 00000000..586d568a --- /dev/null +++ b/example/ex-bptree02.c @@ -0,0 +1,53 @@ +#include + +#include "m-bptree.h" + +BPTREE_MULTI_DEF2(multimap, 5, int, M_BASIC_OPLIST, int, M_BASIC_OPLIST) +#define M_OPL_map_multimap_t() BPTREE_OPLIST2(multimap, M_BASIC_OPLIST, M_BASIC_OPLIST) + +// Fill in with multiple value +static void +fill_in(multimap_t map) +{ + for(int i = 1 ; i < 100; i++) + multimap_set_at(map, i, i); + for(int i = 1 ; i < 100; i+=2) + multimap_set_at(map, i, i*i); + for(int i = 1 ; i < 100; i+=3) + multimap_set_at(map, i, i*i*i); +} + +static int +count(multimap_t map, int key) +{ + int n = 0; + multimap_it_t it; + // it_from is O(n*ln n) complexity + // it_while_p and next are O(1) complexity + for(multimap_it_from(it, map, key); multimap_it_while_p(it, key); multimap_next(it)) + n++; + return n; +} + +static void +print(multimap_t map) +{ + for(int i = 0; i < 101;i++) { + printf("Key=%d Count=%d ", i, count(map, i)); + multimap_it_t it; + for(multimap_it_from(it, map, i); multimap_it_while_p(it, i); multimap_next(it)) { + printf("Value=%d ", *multimap_ref(it)->value_ptr ); + } + printf("\n"); + } +} + +int main(void) +{ + multimap_t map; + multimap_init(map); + fill_in(map); + print(map); + multimap_clear(map); + exit(0); +}