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 | |
| 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!
| -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 | ||
