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 | |
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...
-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; |