00001 //======================================================================== 00002 // 00003 // GHash.h 00004 // 00005 // Copyright 2001 Derek B. Noonburg 00006 // 00007 //======================================================================== 00008 00009 #ifndef GHASH_H 00010 #define GHASH_H 00011 00012 #ifdef __GNUC__ 00013 #pragma interface 00014 #endif 00015 00016 #include "gtypes.h" 00017 00018 class GString; 00019 struct GHashBucket; 00020 struct GHashIter; 00021 00022 //------------------------------------------------------------------------ 00023 00024 class GHash { 00025 public: 00026 00027 GHash(GBool deleteKeysA = gFalse); 00028 ~GHash(); 00029 void add(GString *key, void *val); 00030 void *lookup(GString *key); 00031 void *lookup(char *key); 00032 void *remove(GString *key); 00033 void *remove(char *key); 00034 int getLength() { return len; } 00035 void startIter(GHashIter **iter); 00036 GBool getNext(GHashIter **iter, GString **key, void **val); 00037 void killIter(GHashIter **iter); 00038 00039 private: 00040 00041 GHashBucket *find(GString *key, int *h); 00042 GHashBucket *find(char *key, int *h); 00043 int hash(GString *key); 00044 int hash(char *key); 00045 00046 GBool deleteKeys; // set if key strings should be deleted 00047 int size; // number of buckets 00048 int len; // number of entries 00049 GHashBucket **tab; 00050 }; 00051 00052 #define deleteGHash(hash, T) \ 00053 do { \ 00054 GHash *_hash = (hash); \ 00055 { \ 00056 GHashIter *_iter; \ 00057 GString *_key; \ 00058 void *_p; \ 00059 _hash->startIter(&_iter); \ 00060 while (_hash->getNext(&_iter, &_key, &_p)) { \ 00061 delete (T*)_p; \ 00062 } \ 00063 delete _hash; \ 00064 } \ 00065 } while(0) 00066 00067 #endif
1.4.2