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