#include <stdlib.h>
#include <stdio.h>
+#include "mymemory.h"
/**
* Hashtable linked node class, for chained storage of hash table conflicts. By
* @tparam _free Provide your own 'free' for the table, or default to
* snapshotting.
*/
-template<typename _Key, typename _Val, typename _KeyInt, int _Shift=0, void * (* _malloc)(size_t)=malloc, void * (* _calloc)(size_t, size_t)=calloc, void (*_free)(void *)=free>
+template<typename _Key, typename _Val, typename _KeyInt, int _Shift=0, void * (* _malloc)(size_t)=snapshot_malloc, void * (* _calloc)(size_t, size_t)=snapshot_calloc, void (*_free)(void *)=snapshot_free>
class HashTable {
public:
/**
/** Reset the table to its initial state. */
void reset() {
- for(int i=0;i<capacity;i++) {
+ for(unsigned int i=0;i<capacity;i++) {
struct hashlistnode<_Key,_Val, _malloc, _calloc, _free> * bin = table[i];
while(bin!=NULL) {
struct hashlistnode<_Key,_Val, _malloc, _calloc, _free> * next=bin->next;
/** Put a key value pair into the table. */
void put(_Key key, _Val val) {
- if(size > threshold) {
- //Resize
- unsigned int newsize = capacity << 1;
- resize(newsize);
- }
+ if (size > threshold)
+ resize(capacity << 1);
struct hashlistnode<_Key,_Val, _malloc, _calloc, _free> *ptr = table[(((_KeyInt)key) & mask)>>_Shift];
- size++;
struct hashlistnode<_Key,_Val, _malloc, _calloc, _free> *search = ptr;
while(search!=NULL) {
newptr->val=val;
newptr->next=ptr;
table[(((_KeyInt)key)&mask)>>_Shift]=newptr;
- }
-
- /** Put a key entry into the table. */
- _Val * ensureptr(_Key key) {
- if (size > threshold) {
- //Resize
- unsigned int newsize = capacity << 1;
- resize(newsize);
- }
-
- struct hashlistnode<_Key,_Val, _malloc, _calloc, _free> *ptr = table[(((_KeyInt)key) & mask)>>_Shift];
size++;
- struct hashlistnode<_Key,_Val, _malloc, _calloc, _free> *search = ptr;
-
- while(search!=NULL) {
- if (search->key==key) {
- return &search->val;
- }
- search=search->next;
- }
-
- struct hashlistnode<_Key,_Val, _malloc, _calloc, _free> *newptr=(struct hashlistnode<_Key,_Val, _malloc, _calloc, _free> *)new struct hashlistnode<_Key,_Val, _malloc, _calloc, _free>;
- newptr->key=key;
- newptr->next=ptr;
- table[(((_KeyInt)key)&mask)>>_Shift]=newptr;
- return &newptr->val;
}
/** Lookup the corresponding value for the given key. */
return (_Val)0;
}
- /** Lookup the corresponding value for the given key. */
- _Val * getptr(_Key key) {
- struct hashlistnode<_Key,_Val, _malloc, _calloc, _free> *search = table[(((_KeyInt)key) & mask)>>_Shift];
-
- while(search!=NULL) {
- if (search->key==key) {
- return & search->val;
- }
- search=search->next;
- }
- return (_Val *) NULL;
- }
-
/** Check whether the table contains a value for the given key. */
bool contains(_Key key) {
struct hashlistnode<_Key,_Val, _malloc, _calloc, _free> *search = table[(((_KeyInt)key) & mask)>>_Shift];