ee8f2cba74695f39f16faf47eb8aaa4facd3d9cf
[rrq/rrqmisc.git] / vector / stringitem.c
1 #include <string.h>
2 #include <stringitem.h>
3 #include <HashVector.h>
4
5 /**
6  * This callback function returns the hashcode of a key. The hashcode
7  * is used for indexing into the backing Vector for finding the an
8  * item via its key. The same key must map consistently to the same
9  * hashcode while the hashtable contains an item with that key.
10  * Different keys map map to the same hashcode, in which case the
11  * Vector placement is made at the first empty or hole slot following
12  * the hashcode index.
13  */
14 static unsigned long stringitem_hashcode(void *this,void *key) {
15     return HashVector_hashcode( (unsigned char*)key, strlen( (char*)key ) );
16 }
17
18 /**
19  * This callback function determines whether an item has a
20  * given key or not.
21  */
22 static int stringitem_haskey(void *this,void *item,void *key) {
23     return strcmp( item, key ) == 0;
24 }
25
26 /**
27  * This callback function returns the key of an item by considering
28  * the arity and schema.
29  */
30 static void *stringitem_itemkey(void *this,void *item) {
31     return item;
32 }
33
34 /**
35  * This callback function handles a key obtained from the itemkey
36  * callback function to reclaim temporary allocation.
37  */
38 static void stringitem_releasekey(void *this,void *key) {
39 }
40
41 /**
42  * This callback function writes a representation of an item into
43  * a character buffer.
44  */
45 static int stringitem_tostring(void *this,void *item,char *buffer,int limit) {
46     if ( item ) {
47         return snprintf( buffer, limit, "\"%s\"", (char*) item );
48     }
49     return snprintf( buffer, limit, "(null)" );
50 }
51
52 ItemKeyFun stringitem = {
53     .hashcode = stringitem_hashcode,
54     .haskey = stringitem_haskey,
55     .itemkey = stringitem_itemkey,
56     .releasekey = stringitem_releasekey,
57     .tostring = stringitem_tostring
58 };