diff options
author | Mike Buland <eichlan@xagasoft.com> | 2006-11-21 15:13:30 +0000 |
---|---|---|
committer | Mike Buland <eichlan@xagasoft.com> | 2006-11-21 15:13:30 +0000 |
commit | 525b50abe6b5a6e06c2b4ba327c9490de5277a5b (patch) | |
tree | 682f8ac5f55bcdce83b0c8baf17ec3f6a4226835 /src/hash.h | |
parent | bea5b488189383ddcaafbdc427555226003d2b00 (diff) | |
download | libbu++-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.h | 39 |
1 files changed, 24 insertions, 15 deletions
@@ -26,35 +26,43 @@ struct __calcNextTSize_fast | |||
26 | template<typename key, typename value, typename sizecalc = __calcNextTSize_fast, typename keyalloc = std::allocator<key>, typename valuealloc = std::allocator<value>, typename challoc = std::allocator<uint32_t> > | 26 | template<typename key, typename value, typename sizecalc = __calcNextTSize_fast, typename keyalloc = std::allocator<key>, typename valuealloc = std::allocator<value>, typename challoc = std::allocator<uint32_t> > |
27 | class Hash; | 27 | class Hash; |
28 | 28 | ||
29 | template< typename key, typename value, typename sizecalc, typename keyalloc, typename valuealloc, typename challoc > | 29 | template< typename key, typename _value, typename sizecalc, typename keyalloc, typename valuealloc, typename challoc > |
30 | struct HashProxy | 30 | struct HashProxy |
31 | { | 31 | { |
32 | friend class Hash<key, value, sizecalc, keyalloc, valuealloc, challoc>; | 32 | friend class Hash<key, _value, sizecalc, keyalloc, valuealloc, challoc>; |
33 | private: | 33 | private: |
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 | ||
56 | public: | 57 | public: |
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: | |||
84 | template<typename key, typename value, typename sizecalc, typename keyalloc, typename valuealloc, typename challoc > | 93 | template<typename key, typename value, typename sizecalc, typename keyalloc, typename valuealloc, typename challoc > |
85 | class Hash | 94 | class Hash |
86 | { | 95 | { |
87 | friend HashProxy; | 96 | friend struct HashProxy<key, value, sizecalc, keyalloc, valuealloc, challoc>; |
88 | public: | 97 | public: |
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 | ||