--- parser3/src/include/pa_hash.h 2001/01/29 20:10:31 1.11 +++ parser3/src/include/pa_hash.h 2001/03/11 08:16:32 1.22 @@ -1,10 +1,9 @@ /* - $Id: pa_hash.h,v 1.11 2001/01/29 20:10:31 paf Exp $ -*/ - -/* - + Parser + Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) + Author: Alexander Petrosyan (http://design.ru/paf) + $Id: pa_hash.h,v 1.22 2001/03/11 08:16:32 paf Exp $ */ #ifndef PA_HASH_H @@ -12,12 +11,11 @@ #include +#include "pa_pool.h" #include "pa_types.h" #include "pa_string.h" -class Pool; - -class Hash { +class Hash : virtual public Pooled { public: typedef String Key; @@ -25,32 +23,42 @@ public: public: - void *operator new(size_t size, Pool& apool); - Hash(Pool& apool, bool athread_safe); + Hash(Pool& apool,bool) : Pooled(apool) { construct(apool, true); } + Hash(Pool& apool) : Pooled(apool) { construct(apool, false); } // useful generic hash function - static uint generic_code(uint aresult, char *start, uint size); + static uint generic_code(uint aresult, const char *start, uint allocated); - // put a [value] under the [key] - /*SYNCHRONIZED*/ void put(Key& key, Value *value); + // put a [value] under the [key], return existed or not + /*SYNCHRONIZED*/ bool put(const Key& key, Value *value); // get associated [value] by the [key] - /*SYNCHRONIZED*/ Value *get(Key& key); + /*SYNCHRONIZED*/ Value *get(const Key& key) const; + + // put a [value] under the [key] if that [key] existed, return existed or not + /*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)); } + void put(const Key& key, String *value) { put(key, static_cast(value)); } - void put(Key& key, int value) { put(key, reinterpret_cast(value)); } - void put(Key& key, String *value) { put(key, static_cast(value)); } + int get_int(const Key& key) { return reinterpret_cast(get(key)); } + const String *get_string(const Key& key) { return static_cast(get(key)); } - int get_int(Key& key) { return reinterpret_cast(get(key)); } - String *get_string(Key& key) { return static_cast(get(key)); } + int size() { return used; } protected: - // the pool I'm allocated on - Pool& pool; + void construct(Pool& apool, bool athread_safe); private: - // expand when these %% of size exausted + // expand when these %% of allocated exausted enum { THRESHOLD_PERCENT=75 }; @@ -58,15 +66,15 @@ private: // am I thread-safe? bool thread_safe; - // the index of [size] in [sizes] - int size_index; + // the index of [allocated] in [allocates] + int allocates_index; - // possible [sizes]. prime numbers - static uint sizes[]; - static int sizes_count; + // possible [allocates]. prime numbers + static uint allocates[]; + static int allocates_count; // number of allocated pairs - int size; + int allocated; // helper: expanding when used == threshold int threshold; @@ -79,13 +87,13 @@ private: friend Hash; uint code; - Key key; + const Key key; Value *value; Pair *link; - void *operator new(size_t size, Pool& apool); + void *operator new(size_t allocated, Pool& apool); - Pair(uint acode, Key& akey, Value *avalue, Pair *alink) : + Pair(uint acode, const Key& akey, Value *avalue, Pair *alink) : code(acode), key(akey), value(avalue), @@ -101,7 +109,7 @@ private: private: //disabled //Hash(Hash&) {} - Hash& operator = (Hash&) { return *this; } + Hash& operator = (const Hash&) { return *this; } }; #endif