8fe73b6ad4f53397bf95e30427fec2f2bbe73ccd
[rrq/rrqmisc.git] / tests / example-hashvector.c
1 #include <stdlib.h>
2 #include <string.h>
3 #include "hashvector.h"
4
5 typedef struct _ipslot {
6     int family;
7     unsigned char data[32];
8     unsigned int bits;
9 } ipslot;
10
11 static unsigned long voidp_hashcode(itemkeyfun *this,void *key) {
12     return hashvector_hashcode( key, sizeof( ipslot ) );
13 }
14
15 static void* voidp_itemkey(itemkeyfun *this,void *item) {
16     return item;
17 }
18
19 static int voidp_haskey(itemkeyfun *this,void *item,void *key) {
20     return memcmp( item, key, sizeof( ipslot ) ) == 0;
21 }
22
23 static void voidp_releasekey(itemkeyfun *this,void *key) {
24 }
25
26 static int shrink(vector *pv,unsigned long index,void *item,void *data) {
27     if ( item ) {
28         if ( item == HV_HOLE ) {
29             ((hashvector*) data)->holes--;
30         } else {
31             free( item );
32             ((hashvector*) data)->fill--;
33         }
34     }
35     return 0;
36 }
37
38 int main(int argc,char **argv) {
39     itemkeyfun voidpfun = {
40         .hashcode = voidp_hashcode,
41         .itemkey = voidp_itemkey,
42         .haskey = voidp_haskey,
43         .releasekey = voidp_releasekey
44     };
45     hashvector hv = {
46         .table = { 1, 4, 0 },
47         .fill = 0,
48         .holes = 0,
49         .type = &voidpfun
50     };
51     int i = 0;
52     for ( ; i < 259; i++ ) {
53         ipslot *item = (ipslot*) calloc( 1, sizeof( ipslot ) );
54         if ( i > 250 ) {
55             int n = i;
56             i = n;
57         }
58         item->family = i;
59         memcpy( item->data, "10.10.10.1", 10 );
60         hashvector_add( &hv, item );
61     }
62     for ( i = 256; i < 260; i++ ) {
63         vector_index index = i;
64         void ** slot = vector_next_used( &hv.table, &index );
65         if ( slot && *slot != HV_HOLE ) {
66             hashvector_delete( &hv, *slot );
67         }
68     }
69     vector_resize( &hv.table, 256, shrink, &hv );
70     return 0;
71 }