00001 00002 00003 00004 00005 00006
00007 #ifndef skHASHTBL_H
00008 #define skHASHTBL_H
00009
00010
00011 #include "skGeneral.h"
00012 #include "skAlist.h"
00013
00017 class skHashEntry
00018 {
00019 public:
00023 skHashEntry(void * k,void * v)
00024 : m_Key(k), m_Value(v) {
00025 }
00029 int operator==(const skHashEntry& h) {
00030 return this==&h;
00031 }
00032 void * m_Key;
00033 void * m_Value;
00034 };
00035
00036 typedef skTAList<skHashEntry> skHashEntryList;
00037 typedef skTAListIterator<skHashEntry> skHashEntryListIterator;
00038
00042
00043 class skHashTable
00044 {
00045 public:
00049 void clear();
00053 void clearAndDestroyKeys();
00057 void clearAndDestroyValues();
00061 void clearAndDestroy();
00065 USize entries() const;
00069 virtual ~skHashTable();
00070 protected:
00074 skHashTable(USize size);
00078 void insertKeyAndValue(void * key, void * value);
00082 void * value(void * key) const;
00086 void del(void * key);
00090 void delKeyNotValue(void * key);
00094 void remove(void * key);
00098 virtual USize hashKey(void * key) const=0;
00102 virtual int compareKeys(void * key1, void * key2) const=0;
00106 virtual void deleteKey(void * key)=0;
00110 virtual void deleteValue(void * value)=0;
00111 private:
00115 skHashTable();
00119 skHashTable(const skHashTable&);
00123 skHashTable& operator=(const skHashTable&);
00127 skHashEntry * findEntry(void * key,USize & slot) const;
00131 skHashEntry * findEntry(void * key) const;
00135 skHashEntryList * m_Slots;
00139 USize m_Size;
00143 USize m_NumEntries;
00144 friend class skHashTableIterator;
00145 };
00149 class skHashTableIterator
00150 {
00151 public:
00155 virtual ~skHashTableIterator();
00159 int operator()();
00160 protected:
00164 skHashTableIterator(const skHashTable&);
00168 void * key() const;
00172 void * value() const;
00173 private:
00177 skHashTableIterator& operator=(const skHashTableIterator&);
00181 const skHashTable& m_Table;
00185 USize m_Slot;
00189 void * m_Value;
00193 void * m_Key;
00197 skHashEntryListIterator * m_ListIterator;
00198 };
00199 #define TT_PREFIX template <class TKey,class TValue>
00200
00201 const int DEFAULT_skHashTable_SIZE=3;
00205 template <class TKey,class TValue> class skTHashTable: public skHashTable
00206 {
00207 public:
00211 skTHashTable(USize size);
00215 skTHashTable();
00219 ~skTHashTable();
00223 void insertKeyAndValue(TKey * key, TValue * value);
00227 TValue * value(const TKey * key);
00231 void del(const TKey * key);
00235 void delKeyNotValue(const TKey * key);
00239 void remove(const TKey * key);
00240
00241 protected:
00245 int compareKeys(void * key1, void * key2) const;
00249 void deleteKey(void * key);
00253 void deleteValue(void * value);
00257 USize hashKey(void * key) const;
00258 };
00262 template <class TKey,class TValue> class skTHashTableIterator: public skHashTableIterator
00263 {
00264 public:
00268 skTHashTableIterator(const skTHashTable<TKey,TValue>&);
00272 TKey * key() const;
00276 TValue * value() const;
00277 };
00278
00279 #include "skHashTable.inl"
00280
00281 #endif