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 #ifndef _NET_COMMON_H
00027 #include <NetCommon.h>
00028 #endif
00029
00030
00031
00032
00033 #define SMALL_HASH_TABLE_SIZE 4
00034
00035 class BasicHashTable: public HashTable {
00036 private:
00037 class TableEntry;
00038
00039 public:
00040 BasicHashTable(int keyType);
00041 virtual ~BasicHashTable();
00042
00043
00044 class Iterator; friend class Iterator;
00045 class Iterator: public HashTable::Iterator {
00046 public:
00047 Iterator(BasicHashTable const& table);
00048
00049 private:
00050 void* next(char const*& key);
00051
00052 private:
00053 BasicHashTable const& fTable;
00054 unsigned fNextIndex;
00055 TableEntry* fNextEntry;
00056 };
00057
00058 private:
00059 virtual void* Add(char const* key, void* value);
00060
00061 virtual Boolean Remove(char const* key);
00062 virtual void* Lookup(char const* key) const;
00063
00064 virtual unsigned numEntries() const;
00065
00066 private:
00067 class TableEntry {
00068 public:
00069 TableEntry* fNext;
00070 char const* key;
00071 void* value;
00072 };
00073
00074 TableEntry* lookupKey(char const* key, unsigned& index) const;
00075
00076 Boolean keyMatches(char const* key1, char const* key2) const;
00077
00078
00079 TableEntry* insertNewEntry(unsigned index, char const* key);
00080
00081 void assignKey(TableEntry* entry, char const* key);
00082
00083
00084 void deleteEntry(unsigned index, TableEntry* entry);
00085 void deleteKey(TableEntry* entry);
00086
00087
00088 void rebuild();
00089
00090 unsigned hashIndexFromKey(char const* key) const;
00091
00092
00093 unsigned randomIndex(uintptr_t i) const {
00094 return (unsigned)(((i*1103515245) >> fDownShift) & fMask);
00095 }
00096
00097 private:
00098 TableEntry** fBuckets;
00099 TableEntry* fStaticBuckets[SMALL_HASH_TABLE_SIZE];
00100 unsigned fNumBuckets, fNumEntries, fRebuildSize, fDownShift, fMask;
00101 int fKeyType;
00102 };
00103
00104 #endif