00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef _BASIC_HASH_TABLE_HH
00021 #define _BASIC_HASH_TABLE_HH
00022
00023 #ifndef _HASH_TABLE_HH
00024 #include "HashTable.hh"
00025 #endif
00026
00027
00028
00029
00030 #define SMALL_HASH_TABLE_SIZE 4
00031
00032 class BasicHashTable: public HashTable {
00033 private:
00034 class TableEntry;
00035
00036 public:
00037 BasicHashTable(int keyType);
00038 virtual ~BasicHashTable();
00039
00040
00041 class Iterator; friend class Iterator;
00042 class Iterator: public HashTable::Iterator {
00043 public:
00044 Iterator(BasicHashTable& table);
00045
00046 private:
00047 void* next(char const*& key);
00048
00049 private:
00050 BasicHashTable& fTable;
00051 unsigned fNextIndex;
00052 TableEntry* fNextEntry;
00053 };
00054
00055 private:
00056 virtual void* Add(char const* key, void* value);
00057
00058 virtual Boolean Remove(char const* key);
00059 virtual void* Lookup(char const* key) const;
00060
00061 virtual unsigned numEntries() const;
00062
00063 private:
00064 class TableEntry {
00065 public:
00066 TableEntry* fNext;
00067 char const* key;
00068 void* value;
00069 };
00070
00071 TableEntry* lookupKey(char const* key, unsigned& index) const;
00072
00073 Boolean keyMatches(char const* key1, char const* key2) const;
00074
00075
00076 TableEntry* insertNewEntry(unsigned index, char const* key);
00077
00078 void assignKey(TableEntry* entry, char const* key);
00079
00080
00081 void deleteEntry(unsigned index, TableEntry* entry);
00082 void deleteKey(TableEntry* entry);
00083
00084
00085 void rebuild();
00086
00087 unsigned hashIndexFromKey(char const* key) const;
00088
00089
00090 unsigned randomIndex(unsigned long i) const {
00091 return (((i*1103515245) >> fDownShift) & fMask);
00092 }
00093
00094 private:
00095 TableEntry** fBuckets;
00096 TableEntry* fStaticBuckets[SMALL_HASH_TABLE_SIZE];
00097 unsigned fNumBuckets, fNumEntries, fRebuildSize, fDownShift, fMask;
00098 int fKeyType;
00099 };
00100
00101 #endif