--- parser3/src/include/pa_hash.h 2010/08/04 15:08:44 1.82 +++ parser3/src/include/pa_hash.h 2015/03/12 08:18:18 1.86 @@ -1,7 +1,7 @@ /** @file Parser: hash class decl. - Copyright (c) 2001-2009 ArtLebedev Group (http://www.artlebedev.com) + Copyright (c) 2001-2012 Art. Lebedev Studio (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) */ @@ -17,7 +17,7 @@ #ifndef PA_HASH_H #define PA_HASH_H -static const char * const IDENT_HASH_H="$Date: 2010/08/04 15:08:44 $"; +#define IDENT_PA_HASH_H "$Id: pa_hash.h,v 1.86 2015/03/12 08:18:18 misha Exp $" #include "pa_memory.h" #include "pa_types.h" @@ -120,7 +120,6 @@ public: HASH() { allocated=Hash_allocates[allocates_index=0]; - threshold=allocated*THRESHOLD_PERCENT/100; fpairs_count=fused_refs=0; refs=new(UseGC) Pair*[allocated]; #ifdef HASH_ORDER @@ -132,7 +131,6 @@ public: HASH(const HASH& source) { allocates_index=source.allocates_index; allocated=source.allocated; - threshold=source.threshold; fused_refs=source.fused_refs; fpairs_count=source.fpairs_count; refs=new(UseGC) Pair*[allocated]; @@ -246,10 +244,23 @@ public: } #ifdef HASH_ORDER + String::Body first_key() const { + return (first) ? String::Body(first->key, first->code) : String::Body(); + } + V first_value() const { return (first) ? first->value : V(0); } + String::Body last_key() const { + if (fpairs_count) { + Pair* pair = (Pair*)((char *)last - offsetof(Pair, next)); + return String::Body(pair->key, pair->code); + } else { + return String::Body(); + } + } + V last_value() const { return (fpairs_count) ? ((Pair *)((char *)last - offsetof(Pair, next)))->value : V(0); } @@ -346,20 +357,12 @@ public: protected: - /// expand when these %% of allocated exausted - enum { - THRESHOLD_PERCENT=75 - }; - /// the index of [allocated] in [Hash_allocates] int allocates_index; /// number of allocated pairs int allocated; - /// helper: expanding when fused_refs == threshold - int threshold; - /// used pairs int fused_refs; @@ -389,18 +392,17 @@ protected: Pair **last; #endif - /// filled to threshold: needs expanding - bool is_full() { return fused_refs==threshold; } + /// filled to threshold (THRESHOLD_PERCENT=75), needs expanding + bool is_full() { return fused_refs + allocated/4 >= allocated; } /// allocate larger buffer & rehash void expand() { int old_allocated=allocated; Pair **old_refs=refs; - allocates_index=allocates_index+1 class HASH_STRING: #ifndef HASH_ORDER /// Auto-object used to temporarily substituting/removing string hash values -template +template class Temp_hash_value { - HashString &fhash; - K fname; + H *fhash; + String::Body fname; V saved_value; public: - Temp_hash_value(HashString& ahash, K aname, V avalue) : - fhash(ahash), - fname(aname), - saved_value(ahash.get(aname)) { - fhash.put(aname, avalue); + Temp_hash_value(H *ahash, String::Body aname, V avalue) : fhash(ahash), fname(aname) { + if(fhash){ + saved_value=fhash->get(aname); + fhash->put(aname, avalue); + } } - ~Temp_hash_value() { - fhash.put(fname, saved_value); + ~Temp_hash_value() { + if(fhash) + fhash->put(fname, saved_value); } }; #endif