diff options
author | Mike Buland <eichlan@xagasoft.com> | 2009-01-24 00:59:12 +0000 |
---|---|---|
committer | Mike Buland <eichlan@xagasoft.com> | 2009-01-24 00:59:12 +0000 |
commit | dfd5f8696787d18ae688b662040289f84b667fdd (patch) | |
tree | 6307e987456088304383c4552551e2995aec16d3 /src | |
parent | b53b359c8d5079c996e47abafdf76781c4b1afc0 (diff) | |
download | libbu++-dfd5f8696787d18ae688b662040289f84b667fdd.tar.gz libbu++-dfd5f8696787d18ae688b662040289f84b667fdd.tar.bz2 libbu++-dfd5f8696787d18ae688b662040289f84b667fdd.tar.xz libbu++-dfd5f8696787d18ae688b662040289f84b667fdd.zip |
Added some append and prepend functions and operators to Bu::List, now you can
append one list to another and the like.
Also, wow, I found a bug that's been around for ages, I guess we don't copy
hash tables often. The interesting thing is that it actually worked, it copied
but it would include any data that had been deleted in the old hash table but
not reclaimed yet and insert it as new data. Usually the key had been
completely destroyed (like with a string) so it came out as keyed to blank
string. So in cases like that, all deleted keys would collapse into one deleted
key in the new hash table.
Diffstat (limited to '')
-rw-r--r-- | src/hash.h | 15 | ||||
-rw-r--r-- | src/list.h | 34 |
2 files changed, 41 insertions, 8 deletions
@@ -268,7 +268,7 @@ namespace Bu | |||
268 | 268 | ||
269 | for( uint32_t j = 0; j < src.nCapacity; j++ ) | 269 | for( uint32_t j = 0; j < src.nCapacity; j++ ) |
270 | { | 270 | { |
271 | if( src.isFilled( j ) ) | 271 | if( src.isFilled( j ) && !src.isDeleted( j ) ) |
272 | { | 272 | { |
273 | insert( src.aKeys[j], src.aValues[j] ); | 273 | insert( src.aKeys[j], src.aValues[j] ); |
274 | } | 274 | } |
@@ -283,12 +283,11 @@ namespace Bu | |||
283 | { | 283 | { |
284 | for( uint32_t j = 0; j < nCapacity; j++ ) | 284 | for( uint32_t j = 0; j < nCapacity; j++ ) |
285 | { | 285 | { |
286 | if( isFilled( j ) ) | 286 | if( isFilled( j ) && !isDeleted( j ) ) |
287 | if( !isDeleted( j ) ) | 287 | { |
288 | { | 288 | va.destroy( &aValues[j] ); |
289 | va.destroy( &aValues[j] ); | 289 | ka.destroy( &aKeys[j] ); |
290 | ka.destroy( &aKeys[j] ); | 290 | } |
291 | } | ||
292 | } | 291 | } |
293 | va.deallocate( aValues, nCapacity ); | 292 | va.deallocate( aValues, nCapacity ); |
294 | ka.deallocate( aKeys, nCapacity ); | 293 | ka.deallocate( aKeys, nCapacity ); |
@@ -310,7 +309,7 @@ namespace Bu | |||
310 | 309 | ||
311 | for( uint32_t j = 0; j < src.nCapacity; j++ ) | 310 | for( uint32_t j = 0; j < src.nCapacity; j++ ) |
312 | { | 311 | { |
313 | if( src.isFilled( j ) ) | 312 | if( src.isFilled( j ) && !src.isDeleted( j ) ) |
314 | { | 313 | { |
315 | insert( src.aKeys[j], src.aValues[j] ); | 314 | insert( src.aKeys[j], src.aValues[j] ); |
316 | } | 315 | } |
@@ -82,6 +82,18 @@ namespace Bu | |||
82 | return *this; | 82 | return *this; |
83 | } | 83 | } |
84 | 84 | ||
85 | MyType &operator+=( const value &v ) | ||
86 | { | ||
87 | append( v ); | ||
88 | return *this; | ||
89 | } | ||
90 | |||
91 | MyType &operator+=( const MyType &src ) | ||
92 | { | ||
93 | append( src ); | ||
94 | return *this; | ||
95 | } | ||
96 | |||
85 | /** | 97 | /** |
86 | * Clear the data from the list. | 98 | * Clear the data from the list. |
87 | */ | 99 | */ |
@@ -142,6 +154,15 @@ namespace Bu | |||
142 | } | 154 | } |
143 | } | 155 | } |
144 | 156 | ||
157 | void append( const MyType &rSrc ) | ||
158 | { | ||
159 | for( typename MyType::const_iterator i = rSrc.begin(); | ||
160 | i != rSrc.end(); i++ ) | ||
161 | { | ||
162 | append( *i ); | ||
163 | } | ||
164 | } | ||
165 | |||
145 | /** | 166 | /** |
146 | * Prepend a value to the list. | 167 | * Prepend a value to the list. |
147 | *@param v (const value_type &) The value to prepend. | 168 | *@param v (const value_type &) The value to prepend. |
@@ -168,6 +189,19 @@ namespace Bu | |||
168 | } | 189 | } |
169 | 190 | ||
170 | /** | 191 | /** |
192 | * Prepend another list to the front of this one. This will prepend | ||
193 | * the rSrc list in reverse order...I may fix that later. | ||
194 | */ | ||
195 | void prepend( const MyType &rSrc ) | ||
196 | { | ||
197 | for( typename MyType::const_iterator i = rSrc.begin(); | ||
198 | i != rSrc.end(); i++ ) | ||
199 | { | ||
200 | prepend( *i ); | ||
201 | } | ||
202 | } | ||
203 | |||
204 | /** | ||
171 | * Insert a new item in sort order by searching for the first item that | 205 | * Insert a new item in sort order by searching for the first item that |
172 | * is larger and inserting this before it, or at the end if none are | 206 | * is larger and inserting this before it, or at the end if none are |
173 | * larger. If this is the only function used to insert data in the | 207 | * larger. If this is the only function used to insert data in the |