diff options
Diffstat (limited to '')
| -rw-r--r-- | src/unstable/blobbuilder.cpp | 129 |
1 files changed, 127 insertions, 2 deletions
diff --git a/src/unstable/blobbuilder.cpp b/src/unstable/blobbuilder.cpp index 7ea159d..d4b458b 100644 --- a/src/unstable/blobbuilder.cpp +++ b/src/unstable/blobbuilder.cpp | |||
| @@ -60,6 +60,22 @@ void Bu::BlobBuilderCore::Chunk::append( const char *&pSrc, int32_t &iLength ) | |||
| 60 | iLength -= iCopy; | 60 | iLength -= iCopy; |
| 61 | } | 61 | } |
| 62 | 62 | ||
| 63 | Bu::BlobBuilderCore::Chunk *Bu::BlobBuilderCore::Chunk::split( int32_t iIndex ) | ||
| 64 | { | ||
| 65 | if( iIndex == 0 ) | ||
| 66 | return NULL; | ||
| 67 | |||
| 68 | if( iIndex >= iLength ) | ||
| 69 | return NULL; | ||
| 70 | |||
| 71 | Chunk *pNew = new Chunk( pData+iIndex, iLength-iIndex ); | ||
| 72 | iLength -= iIndex; | ||
| 73 | pNew->pNext = pNext; | ||
| 74 | pNext = pNew; | ||
| 75 | |||
| 76 | return pNew; | ||
| 77 | } | ||
| 78 | |||
| 63 | ///// | 79 | ///// |
| 64 | // BlobBuilderCore | 80 | // BlobBuilderCore |
| 65 | // | 81 | // |
| @@ -119,12 +135,83 @@ void Bu::BlobBuilderCore::append( const char *pSrc, int32_t iLength ) | |||
| 119 | } | 135 | } |
| 120 | } | 136 | } |
| 121 | 137 | ||
| 138 | void Bu::BlobBuilderCore::prepend( const char *pSrc, int32_t iLength ) | ||
| 139 | { | ||
| 140 | if( pFirst == 0 ) | ||
| 141 | { | ||
| 142 | pFirst = pLast = new Chunk( pSrc, iLength ); | ||
| 143 | } | ||
| 144 | else | ||
| 145 | { | ||
| 146 | Chunk *pNew = new Chunk( pSrc, iLength ); | ||
| 147 | pNew->pNext = pFirst; | ||
| 148 | pFirst = pNew; | ||
| 149 | } | ||
| 150 | } | ||
| 151 | |||
| 152 | void Bu::BlobBuilderCore::insert( int32_t iBefore, const char *pSrc, | ||
| 153 | int32_t iLength ) | ||
| 154 | { | ||
| 155 | if( iBefore <= 0 ) | ||
| 156 | { | ||
| 157 | prepend( pSrc, iLength ); | ||
| 158 | return; | ||
| 159 | } | ||
| 160 | if( iBefore >= this->iLength ) | ||
| 161 | { | ||
| 162 | append( pSrc, iLength ); | ||
| 163 | return; | ||
| 164 | } | ||
| 165 | |||
| 166 | Chunk *pCur = pFirst; | ||
| 167 | while( pCur ) | ||
| 168 | { | ||
| 169 | if( iBefore == 0 ) | ||
| 170 | { | ||
| 171 | // Insert between chunks, no splitting required. | ||
| 172 | Chunk *pNew = new Chunk( pSrc, iLength ); | ||
| 173 | pNew->pNext = pCur->pNext; | ||
| 174 | pCur->pNext = pNew; | ||
| 175 | if( pLast == pCur ) | ||
| 176 | pLast = pNew; | ||
| 177 | } | ||
| 178 | if( iBefore < pCur->iLength ) | ||
| 179 | { | ||
| 180 | // This is the chunk we need to split. | ||
| 181 | Chunk *pNew = pCur->split( iBefore ); | ||
| 182 | if( pLast == pCur ) | ||
| 183 | pLast = pNew; | ||
| 184 | continue; | ||
| 185 | } | ||
| 186 | pCur = pCur->pNext; | ||
| 187 | } | ||
| 188 | } | ||
| 189 | |||
| 122 | void Bu::BlobBuilderCore::set( const char *pSrc, int32_t iLength ) | 190 | void Bu::BlobBuilderCore::set( const char *pSrc, int32_t iLength ) |
| 123 | { | 191 | { |
| 124 | clear(); | 192 | clear(); |
| 125 | append( pSrc, iLength ); | 193 | append( pSrc, iLength ); |
| 126 | } | 194 | } |
| 127 | 195 | ||
| 196 | void Bu::BlobBuilderCore::copyTo( void *pDestRaw, int32_t iLength ) const | ||
| 197 | { | ||
| 198 | char *pDest = reinterpret_cast<char *>(pDestRaw); | ||
| 199 | |||
| 200 | Chunk *pCur = pFirst; | ||
| 201 | while( pCur && iLength ) | ||
| 202 | { | ||
| 203 | int32_t iChunkLen = pCur->iLength; | ||
| 204 | if( iChunkLen > iLength ) | ||
| 205 | iChunkLen = iLength; | ||
| 206 | |||
| 207 | memcpy( pDest, pCur->pData, iChunkLen ); | ||
| 208 | pDest += iChunkLen; | ||
| 209 | iLength -= iChunkLen; | ||
| 210 | |||
| 211 | pCur = pCur->pNext; | ||
| 212 | } | ||
| 213 | } | ||
| 214 | |||
| 128 | ////// | 215 | ////// |
| 129 | // BlobBuilder | 216 | // BlobBuilder |
| 130 | // | 217 | // |
| @@ -154,6 +241,11 @@ void Bu::BlobBuilder::set( const char *pSrc, int32_t iLength ) | |||
| 154 | core->set( pSrc, iLength ); | 241 | core->set( pSrc, iLength ); |
| 155 | } | 242 | } |
| 156 | 243 | ||
| 244 | void Bu::BlobBuilder::set( const char *pSrc ) | ||
| 245 | { | ||
| 246 | set( pSrc, strlen( pSrc ) ); | ||
| 247 | } | ||
| 248 | |||
| 157 | void Bu::BlobBuilder::append( const Blob &rSrc ) | 249 | void Bu::BlobBuilder::append( const Blob &rSrc ) |
| 158 | { | 250 | { |
| 159 | _hardCopy(); | 251 | _hardCopy(); |
| @@ -166,24 +258,44 @@ void Bu::BlobBuilder::append( const char *pSrc, int32_t iLength ) | |||
| 166 | core->append( pSrc, iLength ); | 258 | core->append( pSrc, iLength ); |
| 167 | } | 259 | } |
| 168 | 260 | ||
| 261 | void Bu::BlobBuilder::append( const char *pSrc ) | ||
| 262 | { | ||
| 263 | append( pSrc, strlen( pSrc ) ); | ||
| 264 | } | ||
| 265 | |||
| 169 | void Bu::BlobBuilder::prepend( const Blob &rSrc ) | 266 | void Bu::BlobBuilder::prepend( const Blob &rSrc ) |
| 170 | { | 267 | { |
| 171 | _hardCopy(); | 268 | _hardCopy(); |
| 269 | core->prepend( rSrc.getData(), rSrc.getSize() ); | ||
| 172 | } | 270 | } |
| 173 | 271 | ||
| 174 | void Bu::BlobBuilder::prepend( const char *pSrc, int32_t iLength ) | 272 | void Bu::BlobBuilder::prepend( const char *pSrc, int32_t iLength ) |
| 175 | { | 273 | { |
| 176 | _hardCopy(); | 274 | _hardCopy(); |
| 275 | core->prepend( pSrc, iLength ); | ||
| 276 | } | ||
| 277 | |||
| 278 | void Bu::BlobBuilder::prepend( const char *pSrc ) | ||
| 279 | { | ||
| 280 | prepend( pSrc, strlen( pSrc ) ); | ||
| 177 | } | 281 | } |
| 178 | 282 | ||
| 179 | void Bu::BlobBuilder::insert( int32_t iBefore, const Blob &rSrc ) | 283 | void Bu::BlobBuilder::insert( int32_t iBefore, const Blob &rSrc ) |
| 180 | { | 284 | { |
| 181 | _hardCopy(); | 285 | _hardCopy(); |
| 286 | core->insert( iBefore, rSrc.getData(), rSrc.getSize() ); | ||
| 182 | } | 287 | } |
| 183 | 288 | ||
| 184 | void Bu::BlobBuilder::insert( int32_t iBefore, const char *pSrc, const Bu::Blob &rSrc ) | 289 | void Bu::BlobBuilder::insert( int32_t iBefore, const char *pSrc, |
| 290 | int32_t iLength ) | ||
| 185 | { | 291 | { |
| 186 | _hardCopy(); | 292 | _hardCopy(); |
| 293 | core->insert( iBefore, pSrc, iLength ); | ||
| 294 | } | ||
| 295 | |||
| 296 | void Bu::BlobBuilder::insert( int32_t iBefore, const char *pSrc ) | ||
| 297 | { | ||
| 298 | insert( iBefore, pSrc, strlen( pSrc ) ); | ||
| 187 | } | 299 | } |
| 188 | 300 | ||
| 189 | void Bu::BlobBuilder::clear() | 301 | void Bu::BlobBuilder::clear() |
| @@ -199,23 +311,36 @@ int32_t Bu::BlobBuilder::getSize() const | |||
| 199 | 311 | ||
| 200 | Bu::Blob Bu::BlobBuilder::getBlob() const | 312 | Bu::Blob Bu::BlobBuilder::getBlob() const |
| 201 | { | 313 | { |
| 202 | Blob bRet(); | 314 | return Blob( *this ); |
| 315 | } | ||
| 316 | |||
| 317 | void Bu::BlobBuilder::copyTo( void *pDestRaw, int32_t iDestSize ) const | ||
| 318 | { | ||
| 319 | core->copyTo( pDestRaw, iDestSize ); | ||
| 203 | } | 320 | } |
| 204 | 321 | ||
| 205 | Bu::BlobBuilder &Bu::BlobBuilder::operator=( const Blob &rSrc ) | 322 | Bu::BlobBuilder &Bu::BlobBuilder::operator=( const Blob &rSrc ) |
| 206 | { | 323 | { |
| 324 | set( rSrc ); | ||
| 325 | return *this; | ||
| 207 | } | 326 | } |
| 208 | 327 | ||
| 209 | Bu::BlobBuilder &Bu::BlobBuilder::operator=( const char *pSrc ) | 328 | Bu::BlobBuilder &Bu::BlobBuilder::operator=( const char *pSrc ) |
| 210 | { | 329 | { |
| 330 | set( pSrc ); | ||
| 331 | return *this; | ||
| 211 | } | 332 | } |
| 212 | 333 | ||
| 213 | Bu::BlobBuilder &Bu::BlobBuilder::operator+=( const Blob &rSrc ) | 334 | Bu::BlobBuilder &Bu::BlobBuilder::operator+=( const Blob &rSrc ) |
| 214 | { | 335 | { |
| 336 | append( rSrc ); | ||
| 337 | return *this; | ||
| 215 | } | 338 | } |
| 216 | 339 | ||
| 217 | Bu::BlobBuilder &Bu::BlobBuilder::operator+=( const char *pSrc ) | 340 | Bu::BlobBuilder &Bu::BlobBuilder::operator+=( const char *pSrc ) |
| 218 | { | 341 | { |
| 342 | append( pSrc ); | ||
| 343 | return *this; | ||
| 219 | } | 344 | } |
| 220 | 345 | ||
| 221 | 346 | ||
