GHash.h
1//========================================================================
2//
3// GHash.h
4//
5// Copyright 2001-2002 Glyph & Cog, LLC
6//
7//========================================================================
8
9#ifndef GHASH_H
10#define GHASH_H
11
12#include <aconf.h>
13
14
15#include "gtypes.h"
16
17class GString;
18struct GHashBucket;
19struct GHashIter;
20
21//------------------------------------------------------------------------
22
23class GHash {
24public:
25
26 GHash(GBool deleteKeysA = gFalse);
27 ~GHash();
28 void add(GString *key, void *val);
29 void *lookup(const GString *key);
30 void *lookup(const char *key);
31 void *remove(const GString *key);
32 void *remove(const char *key);
33 int getLength() { return len; }
34 void startIter(GHashIter **iter);
35 GBool getNext(GHashIter **iter, GString **key, void **val);
36 void killIter(GHashIter **iter);
37
38private:
39
40 GHashBucket *find(const GString *key, int *h);
41 GHashBucket *find(const char *key, int *h);
42 int hash(const GString *key);
43 int hash(const char *key);
44
45 GBool deleteKeys; // set if key strings should be deleted
46 int size; // number of buckets
47 int len; // number of entries
48 GHashBucket **tab;
49};
50
51#define deleteGHash(hash, T) \
52 do { \
53 GHash *_hash = (hash); \
54 { \
55 GHashIter *_iter; \
56 GString *_key; \
57 void *_p; \
58 _hash->startIter(&_iter); \
59 while (_hash->getNext(&_iter, &_key, &_p)) { \
60 delete (T*)_p; \
61 } \
62 delete _hash; \
63 } \
64 } while(0)
65
66#endif