/*#io
docCopyright("Steve Dekorte", 2002)
docLicense("BSD revised")
docDescription("""
Hash - Hash table with buckets
keys and values are references (they are not copied or freed)
key pointers are assumed unique
Hash can store a large number of values with a reasonable
trade off between lookup time and memory usage.
Collisions are put in a linked list. The storage sized is increased
and the records rehashed if the ratio of records/storage size exceeds
a defined amount. The storage size (currently), never shrinks.
Note: not optimized
should probably use open addressing instead for better use of CPU cache
""")
*/
#ifndef HASH_DEFINED
#define HASH_DEFINED 1
#include "Common.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef struct HashRecord HashRecord;
struct HashRecord
{
void *key;
void *value;
HashRecord *next; // next record in the bucket
HashRecord *nextRecord; // link to next record in entire record list
HashRecord *previousRecord; // link to previous record in entire record list
};
// ---------------------------------------------------------------------
typedef struct
{
HashRecord **records;
size_t size;
size_t count;
HashRecord *first;
HashRecord *current;
} Hash;
BASEKIT_API Hash *Hash_new(void);
BASEKIT_API Hash *Hash_clone(Hash *self);
BASEKIT_API void Hash_copy_(Hash *self, Hash *other);
BASEKIT_API void Hash_free(Hash *self);
BASEKIT_API void Hash_freeRecords(Hash *self);
BASEKIT_API void Hash_clean(Hash *self);
BASEKIT_API void Hash_rehash(Hash *self);
BASEKIT_API void *Hash_firstKey(Hash *self);
BASEKIT_API void *Hash_nextKey(Hash *self);
BASEKIT_API void *Hash_firstValue(Hash *self);
BASEKIT_API void *Hash_nextValue(Hash *self);
BASEKIT_API void Hash_verify(Hash *self);
BASEKIT_API size_t Hash_count(Hash *self);
BASEKIT_API HashRecord *Hash_recordAt_(Hash *self, int index);
BASEKIT_API void *Hash_keyAt_(Hash *self, int index);
BASEKIT_API void *Hash_valueAt_(Hash *self, int index);
BASEKIT_API int Hash_indexForValue_(Hash *self, void *v);
BASEKIT_API void *Hash_at_(Hash *self, void *w);
BASEKIT_API void Hash_at_put_(Hash *self, void *w, void *v);
BASEKIT_API void Hash_removeKey_(Hash *self, void *w);
BASEKIT_API void Hash_removeValue_(Hash *self, void *value);
// enumeration
typedef void (HashDoCallback)(void *);
BASEKIT_API void Hash_do_(Hash *self, HashDoCallback *callback);
//void Hash_doOnKeyAndValue_(Hash *self, HashDoCallback *callback);
BASEKIT_API void Hash_doOnKey_(Hash *self, HashDoCallback *callback);
//void Hash_UnitTest(void);
#include "Hash_inline.h"
#ifdef __cplusplus
}
#endif
#endif
syntax highlighted by Code2HTML, v. 0.9.1