--- parser3/src/include/pa_hash.h 2001/02/25 13:23:00 1.18 +++ parser3/src/include/pa_hash.h 2001/03/19 17:42:12 1.29 @@ -1,10 +1,11 @@ -/* - $Id: pa_hash.h,v 1.18 2001/02/25 13:23:00 paf Exp $ -*/ +/** @file + Parser: hash class decl. -/* + Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) + Author: Alexander Petrosyan (http://design.ru/paf) + $Id: pa_hash.h,v 1.29 2001/03/19 17:42:12 paf Exp $ */ #ifndef PA_HASH_H @@ -16,40 +17,65 @@ #include "pa_types.h" #include "pa_string.h" -class Hash : virtual public Pooled { + +/** + Pooled hash. + + Automatically rehashed when almost full. + + The only object that can be thread safe, wich is specified in constructor, + default 'not safe'. +*/ +class Hash : public Pooled { public: - typedef String Key; - typedef void Value; + typedef String Key; ///< hash Key type. longing for templates + typedef void Value; ///< hash Value type. longing for templates + + /// foreach iterator function type + typedef void (*Foreach_func)(const Key& key, Value *value, void *info); public: - Hash(Pool& apool,bool) : Pooled(apool) { construct(apool, true); } - Hash(Pool& apool) : Pooled(apool) { construct(apool, false); } + Hash(Pool& apool,bool athread_safe=false) : Pooled(apool) { + construct(apool, athread_safe); + } - // useful generic hash function - static uint generic_code(uint aresult, const char *start, uint size); + /// useful generic hash function + static uint generic_code(uint aresult, const char *start, uint allocated); - // put a [value] under the [key], return existed or not + /// put a [value] under the [key], return existed or not /*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; - // 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 put_replace(const Key& key, Value *value); - // put a [value] under the [key] if that [key] NOT existed, return existed or not + /// 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 + /// 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)); } + //@{ + /// handy get, longing for Hash, Hash int get_int(const Key& key) { return reinterpret_cast(get(key)); } - String *get_string(const Key& key) { return static_cast(get(key)); } + const String *get_string(const Key& key) { return static_cast(get(key)); } + //@} + + /// number of elements in hash + int size() { return used; } + + /// iterate over all not zero elements + void foreach(Foreach_func func, void *info=0); + + /// remove all elements + void clear(); protected: @@ -57,7 +83,7 @@ protected: private: - // expand when these %% of size exausted + // expand when these %% of allocated exausted enum { THRESHOLD_PERCENT=75 }; @@ -65,15 +91,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; @@ -90,7 +116,7 @@ private: Value *value; 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) : code(acode),