diff options
| author | eichlan <eichlan@raspberry> | 2019-06-24 16:10:03 -0700 |
|---|---|---|
| committer | eichlan <eichlan@raspberry> | 2019-06-24 16:10:03 -0700 |
| commit | bfc1e2d595452c068a2b66be1436aa34f1083f3d (patch) | |
| tree | 00d5d22b733348c555f0f36cd7b3b545a729874a /src/unstable | |
| parent | f79794995d0cfe0af59737f9c7dba683a1ccfe84 (diff) | |
| download | libbu++-bfc1e2d595452c068a2b66be1436aa34f1083f3d.tar.gz libbu++-bfc1e2d595452c068a2b66be1436aa34f1083f3d.tar.bz2 libbu++-bfc1e2d595452c068a2b66be1436aa34f1083f3d.tar.xz libbu++-bfc1e2d595452c068a2b66be1436aa34f1083f3d.zip | |
Bu::BlobBuilder compiles & is closer to working...
Diffstat (limited to 'src/unstable')
| -rw-r--r-- | src/unstable/blobbuilder.cpp | 76 | ||||
| -rw-r--r-- | src/unstable/blobbuilder.h | 7 |
2 files changed, 76 insertions, 7 deletions
diff --git a/src/unstable/blobbuilder.cpp b/src/unstable/blobbuilder.cpp index a62b98c..7ea159d 100644 --- a/src/unstable/blobbuilder.cpp +++ b/src/unstable/blobbuilder.cpp | |||
| @@ -8,22 +8,32 @@ | |||
| 8 | #include "bu/blobbuilder.h" | 8 | #include "bu/blobbuilder.h" |
| 9 | #include "bu/blob.h" | 9 | #include "bu/blob.h" |
| 10 | 10 | ||
| 11 | #define PAGE_SIZE 1024 | ||
| 12 | |||
| 11 | ///// | 13 | ///// |
| 12 | // BlobBuilderCore::Chunk | 14 | // BlobBuilderCore::Chunk |
| 13 | // | 15 | // |
| 14 | 16 | ||
| 15 | Bu::BlobBuilderCore::Chunk::Chunk() : | 17 | Bu::BlobBuilderCore::Chunk::Chunk( const char *pSrc, int32_t iLength ) : |
| 16 | iLength( 0 ), | 18 | iLength( iLength ), |
| 17 | pData( 0 ), | 19 | pData( 0 ), |
| 18 | pNext( 0 ) | 20 | pNext( 0 ) |
| 19 | { | 21 | { |
| 22 | if( iLength < PAGE_SIZE ) | ||
| 23 | { | ||
| 24 | pData = new char[PAGE_SIZE]; | ||
| 25 | } | ||
| 26 | else | ||
| 27 | { | ||
| 28 | pData = new char[iLength]; | ||
| 29 | } | ||
| 30 | memcpy( pData, pSrc, iLength ); | ||
| 20 | } | 31 | } |
| 21 | 32 | ||
| 22 | Bu::BlobBuilderCore::Chunk::~Chunk() | 33 | Bu::BlobBuilderCore::Chunk::~Chunk() |
| 23 | { | 34 | { |
| 24 | delete[] pData; | 35 | delete[] pData; |
| 25 | pData = 0; | 36 | pData = 0; |
| 26 | delete pNext; | ||
| 27 | pNext = 0; | 37 | pNext = 0; |
| 28 | 38 | ||
| 29 | // Why not delete pNext here? A BlobBuilder could easily wind up having | 39 | // Why not delete pNext here? A BlobBuilder could easily wind up having |
| @@ -32,6 +42,24 @@ Bu::BlobBuilderCore::Chunk::~Chunk() | |||
| 32 | // in the core down below. | 42 | // in the core down below. |
| 33 | } | 43 | } |
| 34 | 44 | ||
| 45 | void Bu::BlobBuilderCore::Chunk::append( const char *&pSrc, int32_t &iLength ) | ||
| 46 | { | ||
| 47 | if( this->iLength >= PAGE_SIZE ) | ||
| 48 | { | ||
| 49 | // This chunk is full, just return. | ||
| 50 | return; | ||
| 51 | } | ||
| 52 | int32_t iCopy = PAGE_SIZE-this->iLength; | ||
| 53 | if( iCopy > iLength ) | ||
| 54 | { | ||
| 55 | iCopy = iLength; | ||
| 56 | } | ||
| 57 | memcpy( pData+this->iLength, pSrc, iCopy ); | ||
| 58 | this->iLength += iCopy; | ||
| 59 | pSrc += iCopy; | ||
| 60 | iLength -= iCopy; | ||
| 61 | } | ||
| 62 | |||
| 35 | ///// | 63 | ///// |
| 36 | // BlobBuilderCore | 64 | // BlobBuilderCore |
| 37 | // | 65 | // |
| @@ -64,15 +92,37 @@ void Bu::BlobBuilderCore::clear() | |||
| 64 | Chunk *pNext = pCur->pNext; | 92 | Chunk *pNext = pCur->pNext; |
| 65 | delete pCur; | 93 | delete pCur; |
| 66 | pCur = pNext; | 94 | pCur = pNext; |
| 67 | |||
| 68 | } | 95 | } |
| 69 | delete pFirst; | 96 | delete pFirst; |
| 70 | pFirst = pLast = 0; | 97 | pFirst = pLast = 0; |
| 71 | iLength = 0; | 98 | iLength = 0; |
| 72 | } | 99 | } |
| 73 | 100 | ||
| 74 | void Bu::BlobBuilderCore::append( const *pSrc, int32_t iLength ) | 101 | void Bu::BlobBuilderCore::append( const char *pSrc, int32_t iLength ) |
| 102 | { | ||
| 103 | if( pFirst == 0 ) | ||
| 104 | { | ||
| 105 | // Nothing in the list, just add a chunk. | ||
| 106 | pFirst = pLast = new Chunk( pSrc, iLength ); | ||
| 107 | return; | ||
| 108 | } | ||
| 109 | else if( pLast->iLength < 1024 ) | ||
| 110 | { | ||
| 111 | // Append to the last chunk first, this will modify pSrc & iLength. | ||
| 112 | pLast->append( pSrc, iLength ); | ||
| 113 | } | ||
| 114 | |||
| 115 | // If there's unused data at the end, append it now. | ||
| 116 | if( iLength > 0 ) | ||
| 117 | { | ||
| 118 | pLast->pNext = new Chunk( pSrc, iLength ); | ||
| 119 | } | ||
| 120 | } | ||
| 121 | |||
| 122 | void Bu::BlobBuilderCore::set( const char *pSrc, int32_t iLength ) | ||
| 75 | { | 123 | { |
| 124 | clear(); | ||
| 125 | append( pSrc, iLength ); | ||
| 76 | } | 126 | } |
| 77 | 127 | ||
| 78 | ////// | 128 | ////// |
| @@ -94,46 +144,62 @@ Bu::BlobBuilder::~BlobBuilder() | |||
| 94 | 144 | ||
| 95 | void Bu::BlobBuilder::set( const Blob &rSrc ) | 145 | void Bu::BlobBuilder::set( const Blob &rSrc ) |
| 96 | { | 146 | { |
| 147 | _hardCopy(); | ||
| 148 | core->set( rSrc.getData(), rSrc.getSize() ); | ||
| 97 | } | 149 | } |
| 98 | 150 | ||
| 99 | void Bu::BlobBuilder::set( const char *pSrc, int32_t iLength ) | 151 | void Bu::BlobBuilder::set( const char *pSrc, int32_t iLength ) |
| 100 | { | 152 | { |
| 153 | _hardCopy(); | ||
| 154 | core->set( pSrc, iLength ); | ||
| 101 | } | 155 | } |
| 102 | 156 | ||
| 103 | void Bu::BlobBuilder::append( const Blob &rSrc ) | 157 | void Bu::BlobBuilder::append( const Blob &rSrc ) |
| 104 | { | 158 | { |
| 159 | _hardCopy(); | ||
| 160 | core->append( rSrc.getData(), rSrc.getSize() ); | ||
| 105 | } | 161 | } |
| 106 | 162 | ||
| 107 | void Bu::BlobBuilder::append( const char *pSrc, int32_t iLength ) | 163 | void Bu::BlobBuilder::append( const char *pSrc, int32_t iLength ) |
| 108 | { | 164 | { |
| 165 | _hardCopy(); | ||
| 166 | core->append( pSrc, iLength ); | ||
| 109 | } | 167 | } |
| 110 | 168 | ||
| 111 | void Bu::BlobBuilder::prepend( const Blob &rSrc ) | 169 | void Bu::BlobBuilder::prepend( const Blob &rSrc ) |
| 112 | { | 170 | { |
| 171 | _hardCopy(); | ||
| 113 | } | 172 | } |
| 114 | 173 | ||
| 115 | void Bu::BlobBuilder::prepend( const char *pSrc, int32_t iLength ) | 174 | void Bu::BlobBuilder::prepend( const char *pSrc, int32_t iLength ) |
| 116 | { | 175 | { |
| 176 | _hardCopy(); | ||
| 117 | } | 177 | } |
| 118 | 178 | ||
| 119 | void Bu::BlobBuilder::insert( int32_t iBefore, const Blob &rSrc ) | 179 | void Bu::BlobBuilder::insert( int32_t iBefore, const Blob &rSrc ) |
| 120 | { | 180 | { |
| 181 | _hardCopy(); | ||
| 121 | } | 182 | } |
| 122 | 183 | ||
| 123 | void Bu::BlobBuilder::insert( int32_t iBefore, const char *pSrc, const Bu::Blob &rSrc ) | 184 | void Bu::BlobBuilder::insert( int32_t iBefore, const char *pSrc, const Bu::Blob &rSrc ) |
| 124 | { | 185 | { |
| 186 | _hardCopy(); | ||
| 125 | } | 187 | } |
| 126 | 188 | ||
| 127 | void Bu::BlobBuilder::clear() | 189 | void Bu::BlobBuilder::clear() |
| 128 | { | 190 | { |
| 191 | _hardCopy(); | ||
| 192 | core->clear(); | ||
| 129 | } | 193 | } |
| 130 | 194 | ||
| 131 | int32_t Bu::BlobBuilder::getSize() const | 195 | int32_t Bu::BlobBuilder::getSize() const |
| 132 | { | 196 | { |
| 197 | return core->iLength; | ||
| 133 | } | 198 | } |
| 134 | 199 | ||
| 135 | Bu::Blob Bu::BlobBuilder::getBlob() const | 200 | Bu::Blob Bu::BlobBuilder::getBlob() const |
| 136 | { | 201 | { |
| 202 | Blob bRet(); | ||
| 137 | } | 203 | } |
| 138 | 204 | ||
| 139 | Bu::BlobBuilder &Bu::BlobBuilder::operator=( const Blob &rSrc ) | 205 | Bu::BlobBuilder &Bu::BlobBuilder::operator=( const Blob &rSrc ) |
diff --git a/src/unstable/blobbuilder.h b/src/unstable/blobbuilder.h index c1dbed1..9b5e390 100644 --- a/src/unstable/blobbuilder.h +++ b/src/unstable/blobbuilder.h | |||
| @@ -24,9 +24,11 @@ namespace Bu | |||
| 24 | class Chunk | 24 | class Chunk |
| 25 | { | 25 | { |
| 26 | public: | 26 | public: |
| 27 | Chunk(); | 27 | Chunk( const char *pSrc, int32_t iLength ); |
| 28 | ~Chunk(); | 28 | ~Chunk(); |
| 29 | 29 | ||
| 30 | void append( const char *&pSrc, int32_t &iLength ); | ||
| 31 | |||
| 30 | int32_t iLength; | 32 | int32_t iLength; |
| 31 | char *pData; | 33 | char *pData; |
| 32 | Chunk *pNext; | 34 | Chunk *pNext; |
| @@ -37,7 +39,8 @@ namespace Bu | |||
| 37 | virtual ~BlobBuilderCore(); | 39 | virtual ~BlobBuilderCore(); |
| 38 | 40 | ||
| 39 | void clear(); | 41 | void clear(); |
| 40 | void append( const *pSrc, int32_t iLength ); | 42 | void append( const char *pSrc, int32_t iLength ); |
| 43 | void set( const char *pSrc, int32_t iLength ); | ||
| 41 | 44 | ||
| 42 | Chunk *pFirst; | 45 | Chunk *pFirst; |
| 43 | Chunk *pLast; | 46 | Chunk *pLast; |
