summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Buland <eichlan@xagasoft.com>2006-11-21 15:13:30 +0000
committerMike Buland <eichlan@xagasoft.com>2006-11-21 15:13:30 +0000
commit525b50abe6b5a6e06c2b4ba327c9490de5277a5b (patch)
tree682f8ac5f55bcdce83b0c8baf17ec3f6a4226835
parentbea5b488189383ddcaafbdc427555226003d2b00 (diff)
downloadlibbu++-525b50abe6b5a6e06c2b4ba327c9490de5277a5b.tar.gz
libbu++-525b50abe6b5a6e06c2b4ba327c9490de5277a5b.tar.bz2
libbu++-525b50abe6b5a6e06c2b4ba327c9490de5277a5b.tar.xz
libbu++-525b50abe6b5a6e06c2b4ba327c9490de5277a5b.zip
OK, everything that did work works, but now the HashProxy is as fast as insert,
and has more options. Use [] all you want!
Diffstat (limited to '')
-rw-r--r--src/hash.h39
1 files changed, 24 insertions, 15 deletions
diff --git a/src/hash.h b/src/hash.h
index 2dac257..c4f4b43 100644
--- a/src/hash.h
+++ b/src/hash.h
@@ -26,35 +26,43 @@ struct __calcNextTSize_fast
26template<typename key, typename value, typename sizecalc = __calcNextTSize_fast, typename keyalloc = std::allocator<key>, typename valuealloc = std::allocator<value>, typename challoc = std::allocator<uint32_t> > 26template<typename key, typename value, typename sizecalc = __calcNextTSize_fast, typename keyalloc = std::allocator<key>, typename valuealloc = std::allocator<value>, typename challoc = std::allocator<uint32_t> >
27class Hash; 27class Hash;
28 28
29template< typename key, typename value, typename sizecalc, typename keyalloc, typename valuealloc, typename challoc > 29template< typename key, typename _value, typename sizecalc, typename keyalloc, typename valuealloc, typename challoc >
30struct HashProxy 30struct HashProxy
31{ 31{
32 friend class Hash<key, value, sizecalc, keyalloc, valuealloc, challoc>; 32 friend class Hash<key, _value, sizecalc, keyalloc, valuealloc, challoc>;
33private: 33private:
34 HashProxy( Hash<key, value, sizecalc, keyalloc, valuealloc, challoc> &h, key *k, value *v, uint32_t hash ) : 34 HashProxy( Hash<key, _value, sizecalc, keyalloc, valuealloc, challoc> &h, key *k, uint32_t nPos, uint32_t hash ) :
35 hsh( h ), 35 hsh( h ),
36 pKey( k ), 36 pKey( k ),
37 pValue( v ), 37 nPos( nPos ),
38 hash( hash ), 38 hash( hash ),
39 bFilled( false ) 39 bFilled( false )
40 { 40 {
41 } 41 }
42 42
43 HashProxy( Hash<key, value, sizecalc, keyalloc, valuealloc, challoc> &h, value *pValue ) : 43 HashProxy( Hash<key, _value, sizecalc, keyalloc, valuealloc, challoc> &h, _value *pValue ) :
44 hsh( h ), 44 hsh( h ),
45 pValue( pValue ), 45 pValue( pValue ),
46 bFilled( true ) 46 bFilled( true )
47 { 47 {
48 } 48 }
49 49
50 Hash<key, value, sizecalc, keyalloc, valuealloc, challoc> &hsh; 50 Hash<key, _value, sizecalc, keyalloc, valuealloc, challoc> &hsh;
51 key *pKey; 51 key *pKey;
52 value *pValue; 52 _value *pValue;
53 bool bFilled; 53 bool bFilled;
54 uint32_t hash; 54 uint32_t hash;
55 uint32_t nPos;
55 56
56public: 57public:
57 operator value() 58 operator _value()
59 {
60 if( bFilled == false )
61 throw "Nope, no data there";
62 return *pValue;
63 }
64
65 _value value()
58 { 66 {
59 if( bFilled == false ) 67 if( bFilled == false )
60 throw "Nope, no data there"; 68 throw "Nope, no data there";
@@ -66,15 +74,16 @@ public:
66 return bFilled; 74 return bFilled;
67 } 75 }
68 76
69 value operator=( value nval ) 77 _value operator=( _value nval )
70 { 78 {
71 if( bFilled ) 79 if( bFilled )
72 { 80 {
73 hsh.va.destroy( KEEP GOING HERE 81 hsh.va.destroy( pValue );
74 hsh.insert( tKey, nval ); 82 hsh.va.construct( pValue, nval );
75 } 83 }
76 else 84 else
77 { 85 {
86 hsh.fill( nPos, *pKey, nval, hash );
78 } 87 }
79 88
80 return nval; 89 return nval;
@@ -84,7 +93,7 @@ public:
84template<typename key, typename value, typename sizecalc, typename keyalloc, typename valuealloc, typename challoc > 93template<typename key, typename value, typename sizecalc, typename keyalloc, typename valuealloc, typename challoc >
85class Hash 94class Hash
86{ 95{
87 friend HashProxy; 96 friend struct HashProxy<key, value, sizecalc, keyalloc, valuealloc, challoc>;
88public: 97public:
89 Hash() : 98 Hash() :
90 nCapacity( 11 ), 99 nCapacity( 11 ),
@@ -379,9 +388,9 @@ private:
379 void fill( uint32_t loc, key &k, value &v, uint32_t hash ) 388 void fill( uint32_t loc, key &k, value &v, uint32_t hash )
380 { 389 {
381 bFilled[loc/32] |= (1<<(loc%32)); 390 bFilled[loc/32] |= (1<<(loc%32));
382 va.construct( &aValues[nPos], v ); 391 va.construct( &aValues[loc], v );
383 ka.construct( &aKeys[nPos], k ); 392 ka.construct( &aKeys[loc], k );
384 aHashCodes[nPos] = hash; 393 aHashCodes[loc] = hash;
385 nFilled++; 394 nFilled++;
386 } 395 }
387 396