diff options
| author | Mike Buland <eichlan@xagasoft.com> | 2019-08-08 09:59:52 -0700 |
|---|---|---|
| committer | Mike Buland <eichlan@xagasoft.com> | 2019-08-08 09:59:52 -0700 |
| commit | 238244337283a7f888cf49a1e56b809c22466a63 (patch) | |
| tree | 5262c5bfed957edc0906c002e0e94bbc88154d08 /src | |
| parent | af4bc8816eb4b4cb4821b24706f55b518a43968d (diff) | |
| download | libbu++-238244337283a7f888cf49a1e56b809c22466a63.tar.gz libbu++-238244337283a7f888cf49a1e56b809c22466a63.tar.bz2 libbu++-238244337283a7f888cf49a1e56b809c22466a63.tar.xz libbu++-238244337283a7f888cf49a1e56b809c22466a63.zip | |
Fixed a bug in the BlobBuilder.
Appending wasn't working correctly.
Diffstat (limited to '')
| -rw-r--r-- | src/unit/blobbuilder.unit | 13 | ||||
| -rw-r--r-- | src/unstable/blobbuilder.cpp | 37 | ||||
| -rw-r--r-- | src/unstable/blobbuilder.h | 6 |
3 files changed, 55 insertions, 1 deletions
diff --git a/src/unit/blobbuilder.unit b/src/unit/blobbuilder.unit index 84bf549..7f3fb93 100644 --- a/src/unit/blobbuilder.unit +++ b/src/unit/blobbuilder.unit | |||
| @@ -17,6 +17,7 @@ suite BlobBuilder | |||
| 17 | { | 17 | { |
| 18 | test append | 18 | test append |
| 19 | { | 19 | { |
| 20 | /* | ||
| 20 | Bu::BlobBuilder a; | 21 | Bu::BlobBuilder a; |
| 21 | a.append("a"); | 22 | a.append("a"); |
| 22 | a.append("bc"); | 23 | a.append("bc"); |
| @@ -24,5 +25,17 @@ suite BlobBuilder | |||
| 24 | Bu::println(">%1<\n\n").arg( a.getBlob() ); | 25 | Bu::println(">%1<\n\n").arg( a.getBlob() ); |
| 25 | a.append("abcdef"); | 26 | a.append("abcdef"); |
| 26 | Bu::println(">%1<\n\n").arg( a.getBlob() ); | 27 | Bu::println(">%1<\n\n").arg( a.getBlob() ); |
| 28 | */ | ||
| 29 | } | ||
| 30 | |||
| 31 | test appendChar | ||
| 32 | { | ||
| 33 | Bu::BlobBuilder a; | ||
| 34 | for( int j = 0; j < 20; j++ ) | ||
| 35 | { | ||
| 36 | a += 'A'; | ||
| 37 | } | ||
| 38 | Bu::println("%1").arg( a.getBlob() ); | ||
| 39 | unitTest( a.getBlob() == "AAAAAAAAAAAAAAAAAAAA" ); | ||
| 27 | } | 40 | } |
| 28 | } | 41 | } |
diff --git a/src/unstable/blobbuilder.cpp b/src/unstable/blobbuilder.cpp index 497a1a1..43c0779 100644 --- a/src/unstable/blobbuilder.cpp +++ b/src/unstable/blobbuilder.cpp | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | 7 | ||
| 8 | #include "bu/blobbuilder.h" | 8 | #include "bu/blobbuilder.h" |
| 9 | #include "bu/blob.h" | 9 | #include "bu/blob.h" |
| 10 | #include "bu/exceptionbase.h" | ||
| 10 | 11 | ||
| 11 | #define PAGE_SIZE 8 | 12 | #define PAGE_SIZE 8 |
| 12 | 13 | ||
| @@ -132,6 +133,7 @@ void Bu::BlobBuilderCore::append( const char *pSrc, int32_t iLength ) | |||
| 132 | if( iLength > 0 ) | 133 | if( iLength > 0 ) |
| 133 | { | 134 | { |
| 134 | pLast->pNext = new Chunk( pSrc, iLength ); | 135 | pLast->pNext = new Chunk( pSrc, iLength ); |
| 136 | pLast = pLast->pNext; | ||
| 135 | } | 137 | } |
| 136 | } | 138 | } |
| 137 | 139 | ||
| @@ -214,6 +216,21 @@ void Bu::BlobBuilderCore::copyTo( void *pDestRaw, int32_t iLength ) const | |||
| 214 | } | 216 | } |
| 215 | } | 217 | } |
| 216 | 218 | ||
| 219 | char Bu::BlobBuilderCore::getAt( int32_t iIndex ) const | ||
| 220 | { | ||
| 221 | if( iIndex < 0 || iIndex >= iLength ) | ||
| 222 | throw Bu::ExceptionBase("Requseted index is out of range."); | ||
| 223 | |||
| 224 | Chunk *pCur = pFirst; | ||
| 225 | while( iIndex >= pCur->iLength ) | ||
| 226 | { | ||
| 227 | iIndex -= pCur->iLength; | ||
| 228 | pCur = pCur->pNext; | ||
| 229 | } | ||
| 230 | |||
| 231 | return pCur->pData[iIndex]; | ||
| 232 | } | ||
| 233 | |||
| 217 | ////// | 234 | ////// |
| 218 | // BlobBuilder | 235 | // BlobBuilder |
| 219 | // | 236 | // |
| @@ -245,6 +262,7 @@ void Bu::BlobBuilder::set( const char *pSrc, int32_t iLength ) | |||
| 245 | 262 | ||
| 246 | void Bu::BlobBuilder::set( const char *pSrc ) | 263 | void Bu::BlobBuilder::set( const char *pSrc ) |
| 247 | { | 264 | { |
| 265 | _hardCopy(); | ||
| 248 | set( pSrc, strlen( pSrc ) ); | 266 | set( pSrc, strlen( pSrc ) ); |
| 249 | } | 267 | } |
| 250 | 268 | ||
| @@ -262,6 +280,7 @@ void Bu::BlobBuilder::append( const char *pSrc, int32_t iLength ) | |||
| 262 | 280 | ||
| 263 | void Bu::BlobBuilder::append( const char *pSrc ) | 281 | void Bu::BlobBuilder::append( const char *pSrc ) |
| 264 | { | 282 | { |
| 283 | _hardCopy(); | ||
| 265 | append( pSrc, strlen( pSrc ) ); | 284 | append( pSrc, strlen( pSrc ) ); |
| 266 | } | 285 | } |
| 267 | 286 | ||
| @@ -279,6 +298,7 @@ void Bu::BlobBuilder::prepend( const char *pSrc, int32_t iLength ) | |||
| 279 | 298 | ||
| 280 | void Bu::BlobBuilder::prepend( const char *pSrc ) | 299 | void Bu::BlobBuilder::prepend( const char *pSrc ) |
| 281 | { | 300 | { |
| 301 | _hardCopy(); | ||
| 282 | prepend( pSrc, strlen( pSrc ) ); | 302 | prepend( pSrc, strlen( pSrc ) ); |
| 283 | } | 303 | } |
| 284 | 304 | ||
| @@ -297,6 +317,7 @@ void Bu::BlobBuilder::insert( int32_t iBefore, const char *pSrc, | |||
| 297 | 317 | ||
| 298 | void Bu::BlobBuilder::insert( int32_t iBefore, const char *pSrc ) | 318 | void Bu::BlobBuilder::insert( int32_t iBefore, const char *pSrc ) |
| 299 | { | 319 | { |
| 320 | _hardCopy(); | ||
| 300 | insert( iBefore, pSrc, strlen( pSrc ) ); | 321 | insert( iBefore, pSrc, strlen( pSrc ) ); |
| 301 | } | 322 | } |
| 302 | 323 | ||
| @@ -321,6 +342,11 @@ void Bu::BlobBuilder::copyTo( void *pDestRaw, int32_t iDestSize ) const | |||
| 321 | core->copyTo( pDestRaw, iDestSize ); | 342 | core->copyTo( pDestRaw, iDestSize ); |
| 322 | } | 343 | } |
| 323 | 344 | ||
| 345 | char Bu::BlobBuilder::operator[]( int32_t iIndex ) const | ||
| 346 | { | ||
| 347 | return core->getAt( iIndex ); | ||
| 348 | } | ||
| 349 | |||
| 324 | Bu::BlobBuilder &Bu::BlobBuilder::operator=( const Blob &rSrc ) | 350 | Bu::BlobBuilder &Bu::BlobBuilder::operator=( const Blob &rSrc ) |
| 325 | { | 351 | { |
| 326 | set( rSrc ); | 352 | set( rSrc ); |
| @@ -333,6 +359,12 @@ Bu::BlobBuilder &Bu::BlobBuilder::operator=( const char *pSrc ) | |||
| 333 | return *this; | 359 | return *this; |
| 334 | } | 360 | } |
| 335 | 361 | ||
| 362 | Bu::BlobBuilder &Bu::BlobBuilder::operator=( const char chr ) | ||
| 363 | { | ||
| 364 | set( &chr, 1 ); | ||
| 365 | return *this; | ||
| 366 | } | ||
| 367 | |||
| 336 | Bu::BlobBuilder &Bu::BlobBuilder::operator+=( const Blob &rSrc ) | 368 | Bu::BlobBuilder &Bu::BlobBuilder::operator+=( const Blob &rSrc ) |
| 337 | { | 369 | { |
| 338 | append( rSrc ); | 370 | append( rSrc ); |
| @@ -345,4 +377,9 @@ Bu::BlobBuilder &Bu::BlobBuilder::operator+=( const char *pSrc ) | |||
| 345 | return *this; | 377 | return *this; |
| 346 | } | 378 | } |
| 347 | 379 | ||
| 380 | Bu::BlobBuilder &Bu::BlobBuilder::operator+=( const char chr ) | ||
| 381 | { | ||
| 382 | append( &chr, 1 ); | ||
| 383 | return *this; | ||
| 384 | } | ||
| 348 | 385 | ||
diff --git a/src/unstable/blobbuilder.h b/src/unstable/blobbuilder.h index 744212a..c343a4f 100644 --- a/src/unstable/blobbuilder.h +++ b/src/unstable/blobbuilder.h | |||
| @@ -53,7 +53,8 @@ namespace Bu | |||
| 53 | void prepend( const char *pSrc, int32_t iLength ); | 53 | void prepend( const char *pSrc, int32_t iLength ); |
| 54 | void insert( int32_t iBefore, const char *pSrc, int32_t iLength ); | 54 | void insert( int32_t iBefore, const char *pSrc, int32_t iLength ); |
| 55 | void set( const char *pSrc, int32_t iLength ); | 55 | void set( const char *pSrc, int32_t iLength ); |
| 56 | void copyTo( void *pDestRaw, int32_t iLength ) const; | 56 | void copyTo( void *pDestRaw, int32_t iLength ) const; |
| 57 | char getAt( int32_t iIndex ) const; | ||
| 57 | 58 | ||
| 58 | Chunk *pFirst; | 59 | Chunk *pFirst; |
| 59 | Chunk *pLast; | 60 | Chunk *pLast; |
| @@ -110,11 +111,14 @@ namespace Bu | |||
| 110 | int32_t getSize() const; | 111 | int32_t getSize() const; |
| 111 | Blob getBlob() const; | 112 | Blob getBlob() const; |
| 112 | void copyTo( void *pDestRaw, int32_t iDestSize ) const; | 113 | void copyTo( void *pDestRaw, int32_t iDestSize ) const; |
| 114 | char operator[]( int32_t iIndex ) const; | ||
| 113 | 115 | ||
| 114 | BlobBuilder &operator=( const Blob &rSrc ); | 116 | BlobBuilder &operator=( const Blob &rSrc ); |
| 115 | BlobBuilder &operator=( const char *pSrc ); | 117 | BlobBuilder &operator=( const char *pSrc ); |
| 118 | BlobBuilder &operator=( const char chr ); | ||
| 116 | BlobBuilder &operator+=( const Blob &rSrc ); | 119 | BlobBuilder &operator+=( const Blob &rSrc ); |
| 117 | BlobBuilder &operator+=( const char *pSrc ); | 120 | BlobBuilder &operator+=( const char *pSrc ); |
| 121 | BlobBuilder &operator+=( const char chr ); | ||
| 118 | private: | 122 | private: |
| 119 | }; | 123 | }; |
| 120 | }; | 124 | }; |
