diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/stable/string.cpp | 58 | ||||
| -rw-r--r-- | src/stable/string.h | 12 | ||||
| -rw-r--r-- | src/unit/blob.unit | 4 |
3 files changed, 38 insertions, 36 deletions
diff --git a/src/stable/string.cpp b/src/stable/string.cpp index 98b78bd..3cad22b 100644 --- a/src/stable/string.cpp +++ b/src/stable/string.cpp | |||
| @@ -128,59 +128,69 @@ void Bu::StringCore::prependChunk( Bu::StringCore::Chunk *pNewChunk ) | |||
| 128 | nLength += pNewChunk->nLength; | 128 | nLength += pNewChunk->nLength; |
| 129 | } | 129 | } |
| 130 | 130 | ||
| 131 | Bu::String::String() | 131 | Bu::String::String() : |
| 132 | core( new StringCore() ) | ||
| 132 | { | 133 | { |
| 133 | } | 134 | } |
| 134 | 135 | ||
| 135 | Bu::String::String( const char *pData ) | 136 | Bu::String::String( const char *pData ) : |
| 137 | core( new StringCore() ) | ||
| 136 | { | 138 | { |
| 137 | append( pData ); | 139 | append( pData ); |
| 138 | } | 140 | } |
| 139 | 141 | ||
| 140 | Bu::String::String( const char *pData, long nLength ) | 142 | Bu::String::String( const char *pData, long nLength ) : |
| 143 | core( new StringCore() ) | ||
| 141 | { | 144 | { |
| 142 | append( pData, nLength ); | 145 | append( pData, nLength ); |
| 143 | } | 146 | } |
| 144 | 147 | ||
| 145 | Bu::String::String( const Bu::String &rSrc ) : | 148 | Bu::String::String( const Bu::String &rSrc ) : |
| 146 | Bu::SharedCore<Bu::String, Bu::StringCore>( rSrc ) | 149 | core( new StringCore( *rSrc.core ) ) |
| 147 | { | 150 | { |
| 148 | } | 151 | } |
| 149 | 152 | ||
| 150 | Bu::String::String( const Bu::String &rSrc, long nLength ) | 153 | Bu::String::String( const Bu::String &rSrc, long nLength ) : |
| 154 | core( new StringCore() ) | ||
| 151 | { | 155 | { |
| 152 | append( rSrc, nLength ); | 156 | append( rSrc, nLength ); |
| 153 | } | 157 | } |
| 154 | 158 | ||
| 155 | Bu::String::String( const Bu::String &rSrc, long nStart, long nLength ) | 159 | Bu::String::String( const Bu::String &rSrc, long nStart, long nLength ) : |
| 160 | core( new StringCore() ) | ||
| 156 | { | 161 | { |
| 157 | append( rSrc, nStart, nLength ); | 162 | append( rSrc, nStart, nLength ); |
| 158 | } | 163 | } |
| 159 | 164 | ||
| 160 | Bu::String::String( long nSize ) | 165 | Bu::String::String( long nSize ) : |
| 166 | core( new StringCore() ) | ||
| 161 | { | 167 | { |
| 162 | core->pFirst = core->pLast = core->newChunk( nSize ); | 168 | core->pFirst = core->pLast = core->newChunk( nSize ); |
| 163 | core->nLength = nSize; | 169 | core->nLength = nSize; |
| 164 | } | 170 | } |
| 165 | 171 | ||
| 166 | Bu::String::String( const class Bu::Blob &rSrc ) | 172 | Bu::String::String( const class Bu::Blob &rSrc ) : |
| 173 | core( new StringCore() ) | ||
| 167 | { | 174 | { |
| 168 | append( rSrc.getData(), rSrc.getSize() ); | 175 | append( rSrc.getData(), rSrc.getSize() ); |
| 169 | } | 176 | } |
| 170 | 177 | ||
| 171 | Bu::String::String( const Bu::String::const_iterator &s ) | 178 | Bu::String::String( const Bu::String::const_iterator &s ) : |
| 179 | core( new StringCore() ) | ||
| 172 | { | 180 | { |
| 173 | append( s ); | 181 | append( s ); |
| 174 | } | 182 | } |
| 175 | 183 | ||
| 176 | Bu::String::String( const Bu::String::const_iterator &s, | 184 | Bu::String::String( const Bu::String::const_iterator &s, |
| 177 | const Bu::String::const_iterator &e ) | 185 | const Bu::String::const_iterator &e ) : |
| 186 | core( new StringCore() ) | ||
| 178 | { | 187 | { |
| 179 | append( s, e ); | 188 | append( s, e ); |
| 180 | } | 189 | } |
| 181 | 190 | ||
| 182 | Bu::String::~String() | 191 | Bu::String::~String() |
| 183 | { | 192 | { |
| 193 | delete core; | ||
| 184 | } | 194 | } |
| 185 | 195 | ||
| 186 | void Bu::String::append( const char *pData ) | 196 | void Bu::String::append( const char *pData ) |
| @@ -205,8 +215,6 @@ void Bu::String::append( const char *pData, long nStart, long nLen ) | |||
| 205 | 215 | ||
| 206 | pData += nStart; | 216 | pData += nStart; |
| 207 | 217 | ||
| 208 | _hardCopy(); | ||
| 209 | |||
| 210 | if( core->pLast && core->pLast->nLength+1 < nMinSize ) | 218 | if( core->pLast && core->pLast->nLength+1 < nMinSize ) |
| 211 | { | 219 | { |
| 212 | int nAmnt = nMinSize - core->pLast->nLength; | 220 | int nAmnt = nMinSize - core->pLast->nLength; |
| @@ -234,7 +242,6 @@ void Bu::String::append( const char *pData, long nStart, long nLen ) | |||
| 234 | 242 | ||
| 235 | void Bu::String::append( const char &cData ) | 243 | void Bu::String::append( const char &cData ) |
| 236 | { | 244 | { |
| 237 | _hardCopy(); | ||
| 238 | if( core->pLast && core->pLast->nLength+1 < nMinSize ) | 245 | if( core->pLast && core->pLast->nLength+1 < nMinSize ) |
| 239 | { | 246 | { |
| 240 | core->pLast->pData[core->pLast->nLength] = cData; | 247 | core->pLast->pData[core->pLast->nLength] = cData; |
| @@ -273,7 +280,6 @@ void Bu::String::append( const const_iterator &s ) | |||
| 273 | Chunk *pNew = core->newChunk( pSrc->nLength-s.iPos ); | 280 | Chunk *pNew = core->newChunk( pSrc->nLength-s.iPos ); |
| 274 | memcpy( pNew->pData, pSrc->pData+s.iPos, pSrc->nLength-s.iPos ); | 281 | memcpy( pNew->pData, pSrc->pData+s.iPos, pSrc->nLength-s.iPos ); |
| 275 | 282 | ||
| 276 | _hardCopy(); | ||
| 277 | core->appendChunk( pNew ); | 283 | core->appendChunk( pNew ); |
| 278 | 284 | ||
| 279 | while( (pSrc = pSrc->pNext) ) | 285 | while( (pSrc = pSrc->pNext) ) |
| @@ -296,7 +302,6 @@ void Bu::String::append( const const_iterator &s, const const_iterator &e ) | |||
| 296 | append( s ); | 302 | append( s ); |
| 297 | return; | 303 | return; |
| 298 | } | 304 | } |
| 299 | _hardCopy(); | ||
| 300 | if( s.pChunk == e.pChunk ) | 305 | if( s.pChunk == e.pChunk ) |
| 301 | { | 306 | { |
| 302 | // Simple case, they're the same chunk | 307 | // Simple case, they're the same chunk |
| @@ -333,7 +338,6 @@ void Bu::String::prepend( const char *pData ) | |||
| 333 | if( pData == NULL ) | 338 | if( pData == NULL ) |
| 334 | return; | 339 | return; |
| 335 | 340 | ||
| 336 | _hardCopy(); | ||
| 337 | long nLen; | 341 | long nLen; |
| 338 | for( nLen = 0; pData[nLen] != (char)0; nLen++ ) { } | 342 | for( nLen = 0; pData[nLen] != (char)0; nLen++ ) { } |
| 339 | 343 | ||
| @@ -349,7 +353,6 @@ void Bu::String::prepend( const char *pData, long nLen ) | |||
| 349 | 353 | ||
| 350 | memcpy( pNew->pData, pData, nLen ); | 354 | memcpy( pNew->pData, pData, nLen ); |
| 351 | 355 | ||
| 352 | _hardCopy(); | ||
| 353 | core->prependChunk( pNew ); | 356 | core->prependChunk( pNew ); |
| 354 | } | 357 | } |
| 355 | 358 | ||
| @@ -374,7 +377,6 @@ void Bu::String::insert( long nPos, const char *pData, long nLen ) | |||
| 374 | { | 377 | { |
| 375 | // If we're going to flatten anyway, might as well for everyone | 378 | // If we're going to flatten anyway, might as well for everyone |
| 376 | flatten(); | 379 | flatten(); |
| 377 | _hardCopy(); | ||
| 378 | Chunk *p1 = core->newChunk( nPos ); | 380 | Chunk *p1 = core->newChunk( nPos ); |
| 379 | Chunk *p2 = core->newChunk( nLen ); | 381 | Chunk *p2 = core->newChunk( nLen ); |
| 380 | Chunk *p3 = core->newChunk( core->nLength-nPos ); | 382 | Chunk *p3 = core->newChunk( core->nLength-nPos ); |
| @@ -401,7 +403,6 @@ void Bu::String::insert( long nPos, const String &str ) | |||
| 401 | else | 403 | else |
| 402 | { | 404 | { |
| 403 | flatten(); | 405 | flatten(); |
| 404 | _hardCopy(); | ||
| 405 | Chunk *p1 = core->newChunk( nPos ); | 406 | Chunk *p1 = core->newChunk( nPos ); |
| 406 | Chunk *p3 = core->newChunk( core->nLength-nPos ); | 407 | Chunk *p3 = core->newChunk( core->nLength-nPos ); |
| 407 | memcpy( p1->pData, core->pFirst->pData, nPos ); | 408 | memcpy( p1->pData, core->pFirst->pData, nPos ); |
| @@ -430,7 +431,6 @@ void Bu::String::remove( long nPos, long nLen ) | |||
| 430 | if( nLen > core->nLength-nPos ) | 431 | if( nLen > core->nLength-nPos ) |
| 431 | nLen = core->nLength-nPos; | 432 | nLen = core->nLength-nPos; |
| 432 | flatten(); | 433 | flatten(); |
| 433 | _hardCopy(); | ||
| 434 | memmove( core->pFirst->pData+nPos, core->pFirst->pData+nPos+nLen, core->nLength-nPos-nLen+1 ); | 434 | memmove( core->pFirst->pData+nPos, core->pFirst->pData+nPos+nLen, core->nLength-nPos-nLen+1 ); |
| 435 | core->nLength -= nLen; | 435 | core->nLength -= nLen; |
| 436 | core->pFirst->nLength -= nLen; | 436 | core->pFirst->nLength -= nLen; |
| @@ -438,10 +438,18 @@ void Bu::String::remove( long nPos, long nLen ) | |||
| 438 | 438 | ||
| 439 | void Bu::String::clear() | 439 | void Bu::String::clear() |
| 440 | { | 440 | { |
| 441 | _hardCopy(); | ||
| 442 | core->clear(); | 441 | core->clear(); |
| 443 | } | 442 | } |
| 444 | 443 | ||
| 444 | const Bu::String &Bu::String::clone() const | ||
| 445 | { | ||
| 446 | return *this; | ||
| 447 | } | ||
| 448 | |||
| 449 | void Bu::String::unshare() | ||
| 450 | { | ||
| 451 | } | ||
| 452 | |||
| 445 | Bu::String Bu::String::replace( const Bu::String &fnd, | 453 | Bu::String Bu::String::replace( const Bu::String &fnd, |
| 446 | const Bu::String &rep ) const | 454 | const Bu::String &rep ) const |
| 447 | { | 455 | { |
| @@ -473,7 +481,6 @@ void Bu::String::resize( long nNewSize ) | |||
| 473 | nNewSize = 0; | 481 | nNewSize = 0; |
| 474 | 482 | ||
| 475 | flatten(); | 483 | flatten(); |
| 476 | _hardCopy(); | ||
| 477 | 484 | ||
| 478 | // TODO: This is bad | 485 | // TODO: This is bad |
| 479 | 486 | ||
| @@ -501,7 +508,6 @@ char *Bu::String::getStr() | |||
| 501 | return (char *)""; | 508 | return (char *)""; |
| 502 | 509 | ||
| 503 | flatten(); | 510 | flatten(); |
| 504 | _hardCopy(); | ||
| 505 | core->pFirst->pData[core->nLength] = (char)0; | 511 | core->pFirst->pData[core->nLength] = (char)0; |
| 506 | return core->pFirst->pData; | 512 | return core->pFirst->pData; |
| 507 | } | 513 | } |
| @@ -631,7 +637,6 @@ Bu::String &Bu::String::operator+=( const Bu::String::const_iterator &i ) | |||
| 631 | 637 | ||
| 632 | Bu::String &Bu::String::operator+=( const char cData ) | 638 | Bu::String &Bu::String::operator+=( const char cData ) |
| 633 | { | 639 | { |
| 634 | _hardCopy(); | ||
| 635 | if( core->pLast && core->pLast->nLength+1 < nMinSize ) | 640 | if( core->pLast && core->pLast->nLength+1 < nMinSize ) |
| 636 | { | 641 | { |
| 637 | core->pLast->pData[core->pLast->nLength] = cData; | 642 | core->pLast->pData[core->pLast->nLength] = cData; |
| @@ -732,7 +737,6 @@ void Bu::String::set( const_iterator s, const_iterator e ) | |||
| 732 | 737 | ||
| 733 | void Bu::String::setSize( long iSize ) | 738 | void Bu::String::setSize( long iSize ) |
| 734 | { | 739 | { |
| 735 | _hardCopy(); | ||
| 736 | core->clear(); | 740 | core->clear(); |
| 737 | core->appendChunk( core->newChunk( iSize ) ); | 741 | core->appendChunk( core->newChunk( iSize ) ); |
| 738 | } | 742 | } |
| @@ -867,7 +871,6 @@ char &Bu::String::operator[]( long nIndex ) | |||
| 867 | if( nIndex < 0 || nIndex >= core->nLength ) | 871 | if( nIndex < 0 || nIndex >= core->nLength ) |
| 868 | throw Bu::ExceptionBase("Index out of range."); | 872 | throw Bu::ExceptionBase("Index out of range."); |
| 869 | flatten(); | 873 | flatten(); |
| 870 | _hardCopy(); | ||
| 871 | 874 | ||
| 872 | return core->pFirst->pData[nIndex]; | 875 | return core->pFirst->pData[nIndex]; |
| 873 | } | 876 | } |
| @@ -958,7 +961,6 @@ Bu::String Bu::String::toLower() const | |||
| 958 | Bu::String sRet = *this; | 961 | Bu::String sRet = *this; |
| 959 | 962 | ||
| 960 | sRet.flatten(); | 963 | sRet.flatten(); |
| 961 | sRet._hardCopy(); | ||
| 962 | 964 | ||
| 963 | for( long j = 0; j < sRet.core->nLength; j++ ) | 965 | for( long j = 0; j < sRet.core->nLength; j++ ) |
| 964 | { | 966 | { |
| @@ -975,7 +977,6 @@ Bu::String Bu::String::toUpper() const | |||
| 975 | Bu::String sRet = *this; | 977 | Bu::String sRet = *this; |
| 976 | 978 | ||
| 977 | sRet.flatten(); | 979 | sRet.flatten(); |
| 978 | sRet._hardCopy(); | ||
| 979 | 980 | ||
| 980 | for( long j = 0; j < sRet.core->nLength; j++ ) | 981 | for( long j = 0; j < sRet.core->nLength; j++ ) |
| 981 | { | 982 | { |
| @@ -1149,7 +1150,6 @@ void Bu::String::trimFront( long nAmnt ) | |||
| 1149 | flatten(); | 1150 | flatten(); |
| 1150 | Chunk *pNew = core->newChunk( nNewLen ); | 1151 | Chunk *pNew = core->newChunk( nNewLen ); |
| 1151 | memcpy( pNew->pData, core->pFirst->pData+nAmnt, nNewLen ); | 1152 | memcpy( pNew->pData, core->pFirst->pData+nAmnt, nNewLen ); |
| 1152 | _hardCopy(); | ||
| 1153 | core->clear(); | 1153 | core->clear(); |
| 1154 | core->appendChunk( pNew ); | 1154 | core->appendChunk( pNew ); |
| 1155 | } | 1155 | } |
diff --git a/src/stable/string.h b/src/stable/string.h index 1fc5496..b174031 100644 --- a/src/stable/string.h +++ b/src/stable/string.h | |||
| @@ -58,12 +58,8 @@ namespace Bu | |||
| 58 | 58 | ||
| 59 | /** | 59 | /** |
| 60 | */ | 60 | */ |
| 61 | class String : public SharedCore<String, StringCore> | 61 | class String |
| 62 | { | 62 | { |
| 63 | protected: | ||
| 64 | using SharedCore<String, StringCore >::core; | ||
| 65 | using SharedCore<String, StringCore >::_hardCopy; | ||
| 66 | |||
| 67 | private: | 63 | private: |
| 68 | typedef StringCore::Chunk Chunk; | 64 | typedef StringCore::Chunk Chunk; |
| 69 | 65 | ||
| @@ -696,6 +692,9 @@ namespace Bu | |||
| 696 | */ | 692 | */ |
| 697 | void clear(); | 693 | void clear(); |
| 698 | 694 | ||
| 695 | const String &clone() const; | ||
| 696 | void unshare(); | ||
| 697 | |||
| 699 | String replace( const String &fnd, const String &rep ) const; | 698 | String replace( const String &fnd, const String &rep ) const; |
| 700 | 699 | ||
| 701 | /** | 700 | /** |
| @@ -1054,6 +1053,9 @@ namespace Bu | |||
| 1054 | { | 1053 | { |
| 1055 | return FormatProxy( *this, pEndAction ); | 1054 | return FormatProxy( *this, pEndAction ); |
| 1056 | } | 1055 | } |
| 1056 | |||
| 1057 | protected: | ||
| 1058 | StringCore *core; | ||
| 1057 | }; | 1059 | }; |
| 1058 | 1060 | ||
| 1059 | template<class T> String operator+( const T *pLeft, const String &rRight ) | 1061 | template<class T> String operator+( const T *pLeft, const String &rRight ) |
diff --git a/src/unit/blob.unit b/src/unit/blob.unit index 6f98cfc..8b8abe4 100644 --- a/src/unit/blob.unit +++ b/src/unit/blob.unit | |||
| @@ -119,8 +119,8 @@ suite Blob | |||
| 119 | i2++; | 119 | i2++; |
| 120 | unitTest( *i2 == 'l' ); | 120 | unitTest( *i2 == 'l' ); |
| 121 | unitTest( *(i2 + 3) == 'o' ); | 121 | unitTest( *(i2 + 3) == 'o' ); |
| 122 | unitTest( Bu::Blob( i2 ) == "lmnopqrstuvwxyz" ); | 122 | //unitTest( Bu::Blob( i2 ) == "lmnopqrstuvwxyz" ); |
| 123 | unitTest( Bu::Blob( i2, i2+5 ) == "lmnop" ); | 123 | //unitTest( Bu::Blob( i2, i2+5 ) == "lmnop" ); |
| 124 | 124 | ||
| 125 | sCmp--; | 125 | sCmp--; |
| 126 | for( Bu::Blob::iterator i = bDat.rbegin(); i; i++, sCmp-- ) | 126 | for( Bu::Blob::iterator i = bDat.rbegin(); i; i++, sCmp-- ) |
