|
|
| version 1.17, 2001/02/23 14:18:26 | version 1.26, 2001/03/18 12:10:55 |
|---|---|
| Line 1 | Line 1 |
| /* | /* |
| $Id$ | Parser |
| */ | Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) |
| Author: Alexander Petrosyan <paf@design.ru> (http://design.ru/paf) | |
| /* | |
| $Id$ | |
| */ | */ |
| #ifndef PA_HASH_H | #ifndef PA_HASH_H |
| Line 16 | Line 15 |
| #include "pa_types.h" | #include "pa_types.h" |
| #include "pa_string.h" | #include "pa_string.h" |
| class Hash : virtual public Pooled { | class Hash : public Pooled { |
| public: | public: |
| typedef String Key; | typedef String Key; |
| typedef void Value; | typedef void Value; |
| typedef void (*Foreach_func)(const Key& key, Value *value, void *info); | |
| public: | public: |
| Hash(Pool& apool,bool) : Pooled(apool) { construct(apool, true); } | Hash(Pool& apool,bool athread_safe=false) : Pooled(apool) { |
| Hash(Pool& apool) : Pooled(apool) { construct(apool, false); } | construct(apool, athread_safe); |
| } | |
| // useful generic hash function | // useful generic hash function |
| static uint generic_code(uint aresult, const char *start, uint size); | static uint generic_code(uint aresult, const char *start, uint allocated); |
| // put a [value] under the [key] | // put a [value] under the [key], return existed or not |
| /*SYNCHRONIZED*/ void put(const Key& key, Value *value); | /*SYNCHRONIZED*/ bool put(const Key& key, Value *value); |
| // get associated [value] by the [key] | // get associated [value] by the [key] |
| /*SYNCHRONIZED*/ Value *get(const Key& key) const; | /*SYNCHRONIZED*/ Value *get(const Key& key) const; |
| // put a [value] under the [key] if that [key] existed, return existed or not | // put a [value] under the [key] if that [key] existed, return existed or not |
| /*SYNCHRONIZED*/ bool replace(const Key& key, Value *value); | /*SYNCHRONIZED*/ bool put_replace(const Key& key, Value *value); |
| // put a [value] under the [key] if that [key] NOT existed, return existed or not | |
| /*SYNCHRONIZED*/ bool put_dont_replace(const Key& key, Value *value); | |
| // put all 'src' values if NO with same key existed | |
| /*SYNCHRONIZED*/ void merge_dont_replace(const Hash& src); | |
| void put(const Key& key, int value) { put(key, reinterpret_cast<Value *>(value)); } | void put(const Key& key, int value) { put(key, reinterpret_cast<Value *>(value)); } |
| void put(const Key& key, String *value) { put(key, static_cast<Value *>(value)); } | void put(const Key& key, String *value) { put(key, static_cast<Value *>(value)); } |
| int get_int(const Key& key) { return reinterpret_cast<int>(get(key)); } | int get_int(const Key& key) { return reinterpret_cast<int>(get(key)); } |
| String *get_string(const Key& key) { return static_cast<String *>(get(key)); } | const String *get_string(const Key& key) { return static_cast<String *>(get(key)); } |
| int size() { return used; } | |
| void foreach(Foreach_func func, void *info=0); | |
| protected: | protected: |
| Line 51 protected: | Line 63 protected: |
| private: | private: |
| // expand when these %% of size exausted | // expand when these %% of allocated exausted |
| enum { | enum { |
| THRESHOLD_PERCENT=75 | THRESHOLD_PERCENT=75 |
| }; | }; |
| Line 59 private: | Line 71 private: |
| // am I thread-safe? | // am I thread-safe? |
| bool thread_safe; | bool thread_safe; |
| // the index of [size] in [sizes] | // the index of [allocated] in [allocates] |
| int size_index; | int allocates_index; |
| // possible [sizes]. prime numbers | // possible [allocates]. prime numbers |
| static uint sizes[]; | static uint allocates[]; |
| static int sizes_count; | static int allocates_count; |
| // number of allocated pairs | // number of allocated pairs |
| int size; | int allocated; |
| // helper: expanding when used == threshold | // helper: expanding when used == threshold |
| int threshold; | int threshold; |
| Line 84 private: | Line 96 private: |
| Value *value; | Value *value; |
| Pair *link; | Pair *link; |
| void *operator new(size_t size, Pool& apool); | void *operator new(size_t allocated, Pool& apool); |
| Pair(uint acode, const Key& akey, Value *avalue, Pair *alink) : | Pair(uint acode, const Key& akey, Value *avalue, Pair *alink) : |
| code(acode), | code(acode), |