63c55822fd8e4dca846a6e2da54ac81d8466cdb1
[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(void *key) {
12     return hashvector_hashcode( key, sizeof( ipslot ) );
13 }
14
15 static void* voidp_itemkey(void *item) {
16     return item;
17 }
18
19 static int voidp_haskey(void *item,void *key) {
20     return memcmp( item, key, sizeof( ipslot ) ) == 0;
21 }
22
23 static int shrink(vector *pv,unsigned long index,void *item,void *data) {
24     if ( item ) {
25         if ( item == HV_HOLE ) {
26             ((hashvector*) data)->holes--;
27         } else {
28             free( item );
29             ((hashvector*) data)->fill--;
30         }
31     }
32     return 0;
33 }
34
35 int main(int argc,char **argv) {
36     hashvector hv = {
37         .table = { 4, 0 },
38         .fill = 0,
39         .holes = 0,
40         .keyhashcode = voidp_hashcode,
41         .itemkey = voidp_itemkey,
42         .haskey = voidp_haskey
43     };
44     int i = 0;
45     for ( ; i < 259; i++ ) {
46         ipslot *item = (ipslot*) calloc( 1, sizeof( ipslot ) );
47         if ( i > 250 ) {
48             int n = i;
49             i = n;
50         }
51         item->family = i;
52         memcpy( item->data, "10.10.10.1", 10 );
53         hashvector_add( &hv, item );
54     }
55     for ( i = 256; i < 260; i++ ) {
56         vector_index index = i;
57         void ** slot = vector_next_used( &hv.table, &index, 0, 0 );
58         if ( slot && *slot != HV_HOLE ) {
59             hashvector_delete( &hv, *slot );
60         }
61     }
62     vector_resize( &hv.table, 256, shrink, &hv );
63     return 0;
64 }