X-Git-Url: https://pd.if.org/git/?p=jsw;a=blobdiff_plain;f=jsw_hlib.h;fp=jsw_hlib.h;h=78cbdd79c2a6f3c4e10b723c1d474d43960f14ec;hp=7765cd805b6597f3fe4cf89b87bc6a0a2b0bdb27;hb=9fa959d28f32ae94111296c238b1e76caf152078;hpb=b8dc7e923f9cf71c3c722b872494fe639ba4621f diff --git a/jsw_hlib.h b/jsw_hlib.h index 7765cd8..78cbdd7 100644 --- a/jsw_hlib.h +++ b/jsw_hlib.h @@ -1,124 +1,124 @@ -#ifndef JSW_HLIB -#define JSW_HLIB - -/* - Hash table library using separate chaining - - > Created (Julienne Walker): August 7, 2005 - > Modified (Julienne Walker): August 11, 2005 - - This code is in the public domain. Anyone may - use it or change it in any way that they see - fit. The author assumes no responsibility for - damages incurred through use of the original - code or any variations thereof. - - It is requested, but not required, that due - credit is given to the original author and - anyone who has modified the code through - a header comment, such as this one. -*/ -#ifdef __cplusplus -#include - -using std::size_t; - -extern "C" { -#else -#include -#endif - -typedef struct jsw_hash jsw_hash_t; - -/* Application specific hash function */ -typedef unsigned (*hash_f) ( const void *key ); - -/* Application specific key comparison function */ -typedef int (*cmp_f) ( const void *a, const void *b ); - -/* Application specific key copying function */ -typedef void *(*keydup_f) ( const void *key ); - -/* Application specific data copying function */ -typedef void *(*itemdup_f) ( const void *item ); - -/* Application specific key deletion function */ -typedef void (*keyrel_f) ( void *key ); - -/* Application specific data deletion function */ -typedef void (*itemrel_f) ( void *item ); - -typedef struct jsw_hstat { - double load; /* Table load factor: (M chains)/(table size) */ - double achain; /* Average chain length */ - size_t lchain; /* Longest chain */ - size_t schain; /* Shortest non-empty chain */ -} jsw_hstat_t; - -/* - Create a new hash table with a capacity of size, and - user defined functions for handling keys and items. - - Returns: An empty hash table, or NULL on failure. -*/ -jsw_hash_t *jsw_hnew ( size_t size, hash_f hash, cmp_f cmp, - keydup_f keydup, itemdup_f itemdup, - keyrel_f keyrel, itemrel_f itemrel ); - -/* Release all memory used by the hash table */ -void jsw_hdelete ( jsw_hash_t *htab ); - -/* - Find an item with the selected key - - Returns: The item, or NULL if not found -*/ -void *jsw_hfind ( jsw_hash_t *htab, void *key ); - -/* - Insert an item with the selected key - - Returns: non-zero for success, zero for failure -*/ -int jsw_hinsert ( jsw_hash_t *htab, void *key, void *item ); - -/* - Remove an item with the selected key - - Returns: non-zero for success, zero for failure -*/ -int jsw_herase ( jsw_hash_t *htab, void *key ); - -/* - Grow or shrink the table, this is a slow operation - - Returns: non-zero for success, zero for failure -*/ -int jsw_hresize ( jsw_hash_t *htab, size_t new_size ); - -/* Reset the traversal markers to the beginning */ -void jsw_hreset ( jsw_hash_t *htab ); - -/* Traverse forward by one key */ -int jsw_hnext ( jsw_hash_t *htab ); - -/* Get the current key */ -const void *jsw_hkey ( jsw_hash_t *htab ); - -/* Get the current item */ -void *jsw_hitem ( jsw_hash_t *htab ); - -/* Current number of items in the table */ -size_t jsw_hsize ( jsw_hash_t *htab ); - -/* Total allowable number of items without resizing */ -size_t jsw_hcapacity ( jsw_hash_t *htab ); - -/* Get statistics for the hash table */ -jsw_hstat_t *jsw_hstat ( jsw_hash_t *htab ); - -#ifdef __cplusplus -} -#endif - -#endif +#ifndef JSW_HLIB +#define JSW_HLIB + +/* + Hash table library using separate chaining + + > Created (Julienne Walker): August 7, 2005 + > Modified (Julienne Walker): August 11, 2005 + + This code is in the public domain. Anyone may + use it or change it in any way that they see + fit. The author assumes no responsibility for + damages incurred through use of the original + code or any variations thereof. + + It is requested, but not required, that due + credit is given to the original author and + anyone who has modified the code through + a header comment, such as this one. +*/ +#ifdef __cplusplus +#include + +using std::size_t; + +extern "C" { +#else +#include +#endif + +typedef struct jsw_hash jsw_hash_t; + +/* Application specific hash function */ +typedef unsigned (*hash_f) ( const void *key ); + +/* Application specific key comparison function */ +typedef int (*cmp_f) ( const void *a, const void *b ); + +/* Application specific key copying function */ +typedef void *(*keydup_f) ( const void *key ); + +/* Application specific data copying function */ +typedef void *(*itemdup_f) ( const void *item ); + +/* Application specific key deletion function */ +typedef void (*keyrel_f) ( void *key ); + +/* Application specific data deletion function */ +typedef void (*itemrel_f) ( void *item ); + +typedef struct jsw_hstat { + double load; /* Table load factor: (M chains)/(table size) */ + double achain; /* Average chain length */ + size_t lchain; /* Longest chain */ + size_t schain; /* Shortest non-empty chain */ +} jsw_hstat_t; + +/* + Create a new hash table with a capacity of size, and + user defined functions for handling keys and items. + + Returns: An empty hash table, or NULL on failure. +*/ +jsw_hash_t *jsw_hnew ( size_t size, hash_f hash, cmp_f cmp, + keydup_f keydup, itemdup_f itemdup, + keyrel_f keyrel, itemrel_f itemrel ); + +/* Release all memory used by the hash table */ +void jsw_hdelete ( jsw_hash_t *htab ); + +/* + Find an item with the selected key + + Returns: The item, or NULL if not found +*/ +void *jsw_hfind ( jsw_hash_t *htab, void *key ); + +/* + Insert an item with the selected key + + Returns: non-zero for success, zero for failure +*/ +int jsw_hinsert ( jsw_hash_t *htab, void *key, void *item ); + +/* + Remove an item with the selected key + + Returns: non-zero for success, zero for failure +*/ +int jsw_herase ( jsw_hash_t *htab, void *key ); + +/* + Grow or shrink the table, this is a slow operation + + Returns: non-zero for success, zero for failure +*/ +int jsw_hresize ( jsw_hash_t *htab, size_t new_size ); + +/* Reset the traversal markers to the beginning */ +void jsw_hreset ( jsw_hash_t *htab ); + +/* Traverse forward by one key */ +int jsw_hnext ( jsw_hash_t *htab ); + +/* Get the current key */ +const void *jsw_hkey ( jsw_hash_t *htab ); + +/* Get the current item */ +void *jsw_hitem ( jsw_hash_t *htab ); + +/* Current number of items in the table */ +size_t jsw_hsize ( jsw_hash_t *htab ); + +/* Total allowable number of items without resizing */ +size_t jsw_hcapacity ( jsw_hash_t *htab ); + +/* Get statistics for the hash table */ +jsw_hstat_t *jsw_hstat ( jsw_hash_t *htab ); + +#ifdef __cplusplus +} +#endif + +#endif