diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/hash.h | 63 |
1 files changed, 39 insertions, 24 deletions
| @@ -31,45 +31,60 @@ 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 ) : | 34 | HashProxy( Hash<key, value, sizecalc, keyalloc, valuealloc, challoc> &h, key *k, value *v, uint32_t hash ) : |
| 35 | hsh( h ), | 35 | hsh( h ), |
| 36 | tKey( k ), | 36 | pKey( k ), |
| 37 | tValue( v ), | 37 | pValue( v ), |
| 38 | bFilled( true ) | 38 | hash( hash ), |
| 39 | bFilled( false ) | ||
| 39 | { | 40 | { |
| 40 | } | 41 | } |
| 41 | 42 | ||
| 42 | HashProxy( Hash<key, value, sizecalc, keyalloc, valuealloc, challoc> &h, key k ) : | 43 | HashProxy( Hash<key, value, sizecalc, keyalloc, valuealloc, challoc> &h, value *pValue ) : |
| 43 | hsh( h ), | 44 | hsh( h ), |
| 44 | tKey( k ), | 45 | pValue( pValue ), |
| 45 | bFilled( false ) | 46 | bFilled( true ) |
| 46 | { | 47 | { |
| 47 | } | 48 | } |
| 48 | 49 | ||
| 49 | Hash<key, value, sizecalc, keyalloc, valuealloc, challoc> &hsh; | 50 | Hash<key, value, sizecalc, keyalloc, valuealloc, challoc> &hsh; |
| 50 | key tKey; | 51 | key *pKey; |
| 51 | value tValue; | 52 | value *pValue; |
| 52 | bool bFilled; | 53 | bool bFilled; |
| 54 | uint32_t hash; | ||
| 53 | 55 | ||
| 54 | public: | 56 | public: |
| 55 | operator value() | 57 | operator value() |
| 56 | { | 58 | { |
| 57 | if( bFilled == false ) | 59 | if( bFilled == false ) |
| 58 | throw "Nope, no data there"; | 60 | throw "Nope, no data there"; |
| 59 | return tValue; | 61 | return *pValue; |
| 62 | } | ||
| 63 | |||
| 64 | bool isFilled() | ||
| 65 | { | ||
| 66 | return bFilled; | ||
| 60 | } | 67 | } |
| 61 | 68 | ||
| 62 | value operator=( value nval ) | 69 | value operator=( value nval ) |
| 63 | { | 70 | { |
| 64 | hsh.insert( tKey, nval ); | 71 | if( bFilled ) |
| 72 | { | ||
| 73 | hsh.va.destroy( KEEP GOING HERE | ||
| 74 | hsh.insert( tKey, nval ); | ||
| 75 | } | ||
| 76 | else | ||
| 77 | { | ||
| 78 | } | ||
| 79 | |||
| 65 | return nval; | 80 | return nval; |
| 66 | } | 81 | } |
| 67 | |||
| 68 | }; | 82 | }; |
| 69 | 83 | ||
| 70 | template<typename key, typename value, typename sizecalc, typename keyalloc, typename valuealloc, typename challoc > | 84 | template<typename key, typename value, typename sizecalc, typename keyalloc, typename valuealloc, typename challoc > |
| 71 | class Hash | 85 | class Hash |
| 72 | { | 86 | { |
| 87 | friend HashProxy; | ||
| 73 | public: | 88 | public: |
| 74 | Hash() : | 89 | Hash() : |
| 75 | nCapacity( 11 ), | 90 | nCapacity( 11 ), |
| @@ -143,11 +158,11 @@ public: | |||
| 143 | 158 | ||
| 144 | if( bFill ) | 159 | if( bFill ) |
| 145 | { | 160 | { |
| 146 | return HashProxy<key, value, sizecalc, keyalloc, valuealloc, challoc>( *this, aKeys[nPos], aValues[nPos] ); | 161 | return HashProxy<key, value, sizecalc, keyalloc, valuealloc, challoc>( *this, &aValues[nPos] ); |
| 147 | } | 162 | } |
| 148 | else | 163 | else |
| 149 | { | 164 | { |
| 150 | return HashProxy<key, value, sizecalc, keyalloc, valuealloc, challoc>( *this, k ); | 165 | return HashProxy<key, value, sizecalc, keyalloc, valuealloc, challoc>( *this, &k, nPos, hash ); |
| 151 | } | 166 | } |
| 152 | } | 167 | } |
| 153 | 168 | ||
| @@ -164,11 +179,7 @@ public: | |||
| 164 | } | 179 | } |
| 165 | else | 180 | else |
| 166 | { | 181 | { |
| 167 | va.construct( &aValues[nPos], v ); | 182 | fill( nPos, k, v, hash ); |
| 168 | ka.construct( &aKeys[nPos], k ); | ||
| 169 | fill( nPos ); | ||
| 170 | aHashCodes[nPos] = hash; | ||
| 171 | nFilled++; | ||
| 172 | } | 183 | } |
| 173 | } | 184 | } |
| 174 | 185 | ||
| @@ -276,11 +287,6 @@ public: | |||
| 276 | ca.deallocate( aOldHashCodes, nOldCapacity ); | 287 | ca.deallocate( aOldHashCodes, nOldCapacity ); |
| 277 | } | 288 | } |
| 278 | 289 | ||
| 279 | void fill( uint32_t loc ) | ||
| 280 | { | ||
| 281 | bFilled[loc/32] |= (1<<(loc%32)); | ||
| 282 | } | ||
| 283 | |||
| 284 | bool isFilled( uint32_t loc ) | 290 | bool isFilled( uint32_t loc ) |
| 285 | { | 291 | { |
| 286 | return (bFilled[loc/32]&(1<<(loc%32)))!=0; | 292 | return (bFilled[loc/32]&(1<<(loc%32)))!=0; |
| @@ -370,6 +376,15 @@ public: | |||
| 370 | } | 376 | } |
| 371 | 377 | ||
| 372 | private: | 378 | private: |
| 379 | void fill( uint32_t loc, key &k, value &v, uint32_t hash ) | ||
| 380 | { | ||
| 381 | bFilled[loc/32] |= (1<<(loc%32)); | ||
| 382 | va.construct( &aValues[nPos], v ); | ||
| 383 | ka.construct( &aKeys[nPos], k ); | ||
| 384 | aHashCodes[nPos] = hash; | ||
| 385 | nFilled++; | ||
| 386 | } | ||
| 387 | |||
| 373 | std::pair<key,value> getAtPos( uint32_t nPos ) | 388 | std::pair<key,value> getAtPos( uint32_t nPos ) |
| 374 | { | 389 | { |
| 375 | return std::pair<key,value>(aKeys[nPos],aValues[nPos]); | 390 | return std::pair<key,value>(aKeys[nPos],aValues[nPos]); |
