diff options
author | Mike Buland <eichlan@xagasoft.com> | 2007-03-19 18:44:25 +0000 |
---|---|---|
committer | Mike Buland <eichlan@xagasoft.com> | 2007-03-19 18:44:25 +0000 |
commit | 2b8255fabce194b35f7b2a350fd08f43d1e698a6 (patch) | |
tree | 61ef7a7918b603d37d022bd0cb599b238615816b | |
parent | 5a345983b99ecf8528d58ddca2ab5f52d87d9a95 (diff) | |
download | libbu++-2b8255fabce194b35f7b2a350fd08f43d1e698a6.tar.gz libbu++-2b8255fabce194b35f7b2a350fd08f43d1e698a6.tar.bz2 libbu++-2b8255fabce194b35f7b2a350fd08f43d1e698a6.tar.xz libbu++-2b8255fabce194b35f7b2a350fd08f43d1e698a6.zip |
Fixed some bugs and added some new goo. You can serialize FStrings and Heshes
now.
-rw-r--r-- | src/fstring.h | 61 | ||||
-rw-r--r-- | src/hash.h | 47 | ||||
-rw-r--r-- | src/serializer.cpp | 94 | ||||
-rw-r--r-- | src/serializer.h | 29 | ||||
-rw-r--r-- | src/tests/fstring.cpp | 1 |
5 files changed, 162 insertions, 70 deletions
diff --git a/src/fstring.h b/src/fstring.h index 585073f..2f508b7 100644 --- a/src/fstring.h +++ b/src/fstring.h | |||
@@ -3,8 +3,10 @@ | |||
3 | 3 | ||
4 | #include <stdint.h> | 4 | #include <stdint.h> |
5 | #include <memory> | 5 | #include <memory> |
6 | #include "serializable.h" | ||
7 | #include "serializer.h" | ||
6 | 8 | ||
7 | template< typename chr=char > | 9 | template< typename chr > |
8 | struct FStringChunk | 10 | struct FStringChunk |
9 | { | 11 | { |
10 | long nLength; | 12 | long nLength; |
@@ -23,9 +25,12 @@ struct FStringChunk | |||
23 | * data is actually copied. This also means that you never need to put any | 25 | * data is actually copied. This also means that you never need to put any |
24 | * FBasicString into a ref-counting container class. | 26 | * FBasicString into a ref-counting container class. |
25 | */ | 27 | */ |
26 | template< typename chr=char, typename chralloc=std::allocator<chr>, typename chunkalloc=std::allocator<struct FStringChunk<chr> > > | 28 | template< typename chr, typename chralloc=std::allocator<chr>, typename chunkalloc=std::allocator<struct FStringChunk<chr> > > |
27 | class FBasicString | 29 | class FBasicString : public Serializable |
28 | { | 30 | { |
31 | #ifndef VALTEST | ||
32 | #define cpy( dest, src, size ) memcpy( dest, src, size*sizeof(chr) ) | ||
33 | #endif | ||
29 | private: | 34 | private: |
30 | typedef struct FStringChunk<chr> Chunk; | 35 | typedef struct FStringChunk<chr> Chunk; |
31 | typedef struct FBasicString<chr, chralloc, chunkalloc> MyType; | 36 | typedef struct FBasicString<chr, chralloc, chunkalloc> MyType; |
@@ -57,16 +62,6 @@ public: | |||
57 | append( pData, nLength ); | 62 | append( pData, nLength ); |
58 | } | 63 | } |
59 | 64 | ||
60 | /* | ||
61 | FBasicString( MyType &rSrc ) : | ||
62 | nLength( 0 ), | ||
63 | pnRefs( NULL ), | ||
64 | pFirst( NULL ), | ||
65 | pLast( NULL ) | ||
66 | { | ||
67 | joinShare( rSrc ); | ||
68 | }*/ | ||
69 | |||
70 | FBasicString( const MyType &rSrc ) : | 65 | FBasicString( const MyType &rSrc ) : |
71 | nLength( 0 ), | 66 | nLength( 0 ), |
72 | pnRefs( NULL ), | 67 | pnRefs( NULL ), |
@@ -131,6 +126,23 @@ public: | |||
131 | realClear(); | 126 | realClear(); |
132 | } | 127 | } |
133 | 128 | ||
129 | void resize( long nNewSize ) | ||
130 | { | ||
131 | if( nLength == nNewSize ) | ||
132 | return; | ||
133 | |||
134 | flatten(); | ||
135 | |||
136 | Chunk *pNew = newChunk( nNewSize ); | ||
137 | long nNewLen = (nNewSize<nLength)?(nNewSize):(nLength); | ||
138 | cpy( pNew->pData, pFirst->pData, nNewLen ); | ||
139 | pNew->pData[nNewLen] = (chr)0; | ||
140 | aChr.deallocate( pFirst->pData, pFirst->nLength+1 ); | ||
141 | aChunk.deallocate( pFirst, 1 ); | ||
142 | pFirst = pLast = pNew; | ||
143 | nLength = nNewSize; | ||
144 | } | ||
145 | |||
134 | chr *c_str() | 146 | chr *c_str() |
135 | { | 147 | { |
136 | if( pFirst == NULL ) | 148 | if( pFirst == NULL ) |
@@ -243,6 +255,27 @@ public: | |||
243 | return pFirst->pData[nIndex]; | 255 | return pFirst->pData[nIndex]; |
244 | } | 256 | } |
245 | 257 | ||
258 | void serialize( class Serializer &ar ) | ||
259 | { | ||
260 | if( ar.isLoading() ) | ||
261 | { | ||
262 | clear(); | ||
263 | long nLen; | ||
264 | ar >> nLen; | ||
265 | |||
266 | Chunk *pNew = newChunk( nLen ); | ||
267 | ar.read( pNew->pData, nLen*sizeof(chr) ); | ||
268 | appendChunk( pNew ); | ||
269 | } | ||
270 | else | ||
271 | { | ||
272 | flatten(); | ||
273 | |||
274 | ar << nLength; | ||
275 | ar.write( pFirst->pData, nLength*sizeof(chr) ); | ||
276 | } | ||
277 | } | ||
278 | |||
246 | private: | 279 | private: |
247 | void flatten() const | 280 | void flatten() const |
248 | { | 281 | { |
@@ -471,6 +504,7 @@ private: | |||
471 | realClear(); | 504 | realClear(); |
472 | } | 505 | } |
473 | 506 | ||
507 | #ifdef VALTEST | ||
474 | void cpy( chr *dest, const chr *src, long count ) const | 508 | void cpy( chr *dest, const chr *src, long count ) const |
475 | { | 509 | { |
476 | for( int j = 0; j < count; j++ ) | 510 | for( int j = 0; j < count; j++ ) |
@@ -480,6 +514,7 @@ private: | |||
480 | src++; | 514 | src++; |
481 | } | 515 | } |
482 | } | 516 | } |
517 | #endif | ||
483 | 518 | ||
484 | void initCount() const | 519 | void initCount() const |
485 | { | 520 | { |
@@ -7,6 +7,8 @@ | |||
7 | #include <iostream> | 7 | #include <iostream> |
8 | #include "exceptionbase.h" | 8 | #include "exceptionbase.h" |
9 | #include "hashable.h" | 9 | #include "hashable.h" |
10 | #include "serializable.h" | ||
11 | #include "serializer.h" | ||
10 | 12 | ||
11 | #define bitsToBytes( n ) (n/32+(n%32>0 ? 1 : 0)) | 13 | #define bitsToBytes( n ) (n/32+(n%32>0 ? 1 : 0)) |
12 | 14 | ||
@@ -241,7 +243,7 @@ public: | |||
241 | 243 | ||
242 | uint32_t size() | 244 | uint32_t size() |
243 | { | 245 | { |
244 | return nFilled; | 246 | return nFilled-nDeleted; |
245 | } | 247 | } |
246 | 248 | ||
247 | uint32_t getDeleted() | 249 | uint32_t getDeleted() |
@@ -667,4 +669,47 @@ template<> bool __cmpHashKeys<std::string>( const std::string &a, const std::str | |||
667 | template<> uint32_t __calcHashCode<Hashable>( const Hashable &k ); | 669 | template<> uint32_t __calcHashCode<Hashable>( const Hashable &k ); |
668 | template<> bool __cmpHashKeys<Hashable>( const Hashable &a, const Hashable &b ); | 670 | template<> bool __cmpHashKeys<Hashable>( const Hashable &a, const Hashable &b ); |
669 | 671 | ||
672 | template<typename key, typename value> | ||
673 | Serializer &operator<<( Serializer &ar, Hash<key,value> &h ) | ||
674 | { | ||
675 | ar << h.size(); | ||
676 | for( typename Hash<key,value>::iterator i = h.begin(); i != h.end(); i++ ) | ||
677 | { | ||
678 | std::pair<key,value> p = *i; | ||
679 | ar << p.first << p.second; | ||
680 | } | ||
681 | |||
682 | return ar; | ||
683 | } | ||
684 | |||
685 | template<typename key, typename value> | ||
686 | Serializer &operator>>( Serializer &ar, Hash<key,value> &h ) | ||
687 | { | ||
688 | h.clear(); | ||
689 | uint32_t nSize; | ||
690 | ar >> nSize; | ||
691 | |||
692 | for( uint32_t j = 0; j < nSize; j++ ) | ||
693 | { | ||
694 | key k; value v; | ||
695 | ar >> k >> v; | ||
696 | h.insert( k, v ); | ||
697 | } | ||
698 | |||
699 | return ar; | ||
700 | } | ||
701 | |||
702 | template<typename key, typename value> | ||
703 | Serializer &operator&&( Serializer &ar, Hash<key,value> &h ) | ||
704 | { | ||
705 | if( ar.isLoading() ) | ||
706 | { | ||
707 | return ar >> h; | ||
708 | } | ||
709 | else | ||
710 | { | ||
711 | return ar << h; | ||
712 | } | ||
713 | } | ||
714 | |||
670 | #endif | 715 | #endif |
diff --git a/src/serializer.cpp b/src/serializer.cpp index 407aab2..636224e 100644 --- a/src/serializer.cpp +++ b/src/serializer.cpp | |||
@@ -59,6 +59,11 @@ Serializer &Serializer::operator<<(uint64_t p) | |||
59 | write( &p, sizeof(p) ); | 59 | write( &p, sizeof(p) ); |
60 | return *this; | 60 | return *this; |
61 | } | 61 | } |
62 | Serializer &Serializer::operator<<(long p) | ||
63 | { | ||
64 | write( &p, sizeof(p) ); | ||
65 | return *this; | ||
66 | } | ||
62 | Serializer &Serializer::operator<<(float p) | 67 | Serializer &Serializer::operator<<(float p) |
63 | { | 68 | { |
64 | write( &p, sizeof(p) ); | 69 | write( &p, sizeof(p) ); |
@@ -120,6 +125,11 @@ Serializer &Serializer::operator>>(uint64_t &p) | |||
120 | read( &p, sizeof(p) ); | 125 | read( &p, sizeof(p) ); |
121 | return *this; | 126 | return *this; |
122 | } | 127 | } |
128 | Serializer &Serializer::operator>>(long &p) | ||
129 | { | ||
130 | read( &p, sizeof(p) ); | ||
131 | return *this; | ||
132 | } | ||
123 | Serializer &Serializer::operator>>(float &p) | 133 | Serializer &Serializer::operator>>(float &p) |
124 | { | 134 | { |
125 | read( &p, sizeof(p) ); | 135 | read( &p, sizeof(p) ); |
@@ -136,149 +146,149 @@ Serializer &Serializer::operator>>(long double &p) | |||
136 | return *this; | 146 | return *this; |
137 | } | 147 | } |
138 | 148 | ||
139 | /*Serializer::Serializer &operator&(bool &p) | 149 | Serializer &Serializer::operator&&(bool &p) |
140 | { | 150 | { |
141 | if (bLoading) | 151 | if (bLoading) |
142 | { | 152 | { |
143 | return *this << p; | 153 | return *this >> p; |
144 | } | 154 | } |
145 | else | 155 | else |
146 | { | 156 | { |
147 | return *this >> p; | 157 | return *this << p; |
148 | } | 158 | } |
149 | } | 159 | } |
150 | 160 | ||
151 | Serializer::Serializer &operator&(int8_t &p) | 161 | Serializer &Serializer::operator&&(int8_t &p) |
152 | { | 162 | { |
153 | if (bLoading) | 163 | if (bLoading) |
154 | { | 164 | { |
155 | return *this << p; | 165 | return *this >> p; |
156 | } | 166 | } |
157 | else | 167 | else |
158 | { | 168 | { |
159 | return *this >> p; | 169 | return *this << p; |
160 | } | 170 | } |
161 | } | 171 | } |
162 | 172 | ||
163 | Serializer::Serializer &operator&(int16_t &p) | 173 | Serializer &Serializer::operator&&(int16_t &p) |
164 | { | 174 | { |
165 | if (bLoading) | 175 | if (bLoading) |
166 | { | 176 | { |
167 | return *this << p; | 177 | return *this >> p; |
168 | } | 178 | } |
169 | else | 179 | else |
170 | { | 180 | { |
171 | return *this >> p; | 181 | return *this << p; |
172 | } | 182 | } |
173 | } | 183 | } |
174 | 184 | ||
175 | Serializer::Serializer &operator&(int32_t &p) | 185 | Serializer &Serializer::operator&&(int32_t &p) |
176 | { | 186 | { |
177 | if (bLoading) | 187 | if (bLoading) |
178 | { | 188 | { |
179 | return *this << p; | 189 | return *this >> p; |
180 | } | 190 | } |
181 | else | 191 | else |
182 | { | 192 | { |
183 | return *this >> p; | 193 | return *this << p; |
184 | } | 194 | } |
185 | } | 195 | } |
186 | 196 | ||
187 | Serializer::Serializer &operator&(int64_t &p) | 197 | Serializer &Serializer::operator&&(int64_t &p) |
188 | { | 198 | { |
189 | if (bLoading) | 199 | if (bLoading) |
190 | { | 200 | { |
191 | return *this << p; | 201 | return *this >> p; |
192 | } | 202 | } |
193 | else | 203 | else |
194 | { | 204 | { |
195 | return *this >> p; | 205 | return *this << p; |
196 | } | 206 | } |
197 | } | 207 | } |
198 | 208 | ||
199 | Serializer::Serializer &operator&(uint8_t &p) | 209 | Serializer &Serializer::operator&&(uint8_t &p) |
200 | { | 210 | { |
201 | if (bLoading) | 211 | if (bLoading) |
202 | { | 212 | { |
203 | return *this << p; | 213 | return *this >> p; |
204 | } | 214 | } |
205 | else | 215 | else |
206 | { | 216 | { |
207 | return *this >> p; | 217 | return *this << p; |
208 | } | 218 | } |
209 | } | 219 | } |
210 | 220 | ||
211 | Serializer::Serializer &operator&(uint16_t &p) | 221 | Serializer &Serializer::operator&&(uint16_t &p) |
212 | { | 222 | { |
213 | if (bLoading) | 223 | if (bLoading) |
214 | { | 224 | { |
215 | return *this << p; | 225 | return *this >> p; |
216 | } | 226 | } |
217 | else | 227 | else |
218 | { | 228 | { |
219 | return *this >> p; | 229 | return *this << p; |
220 | } | 230 | } |
221 | } | 231 | } |
222 | 232 | ||
223 | Serializer::Serializer &operator&(uint32_t &p) | 233 | Serializer &Serializer::operator&&(uint32_t &p) |
224 | { | 234 | { |
225 | if (bLoading) | 235 | if (bLoading) |
226 | { | 236 | { |
227 | return *this << p; | 237 | return *this >> p; |
228 | } | 238 | } |
229 | else | 239 | else |
230 | { | 240 | { |
231 | return *this >> p; | 241 | return *this << p; |
232 | } | 242 | } |
233 | } | 243 | } |
234 | 244 | ||
235 | Serializer::Serializer &operator&(uint64_t &p) | 245 | Serializer &Serializer::operator&&(uint64_t &p) |
236 | { | 246 | { |
237 | if (bLoading) | 247 | if (bLoading) |
238 | { | 248 | { |
239 | return *this << p; | 249 | return *this >> p; |
240 | } | 250 | } |
241 | else | 251 | else |
242 | { | 252 | { |
243 | return *this >> p; | 253 | return *this << p; |
244 | } | 254 | } |
245 | } | 255 | } |
246 | 256 | ||
247 | Serializer::Serializer &operator&(float &p) | 257 | Serializer &Serializer::operator&&(float &p) |
248 | { | 258 | { |
249 | if (bLoading) | 259 | if (bLoading) |
250 | { | 260 | { |
251 | return *this << p; | 261 | return *this >> p; |
252 | } | 262 | } |
253 | else | 263 | else |
254 | { | 264 | { |
255 | return *this >> p; | 265 | return *this << p; |
256 | } | 266 | } |
257 | } | 267 | } |
258 | 268 | ||
259 | Serializer::Serializer &operator&(double &p) | 269 | Serializer &Serializer::operator&&(double &p) |
260 | { | 270 | { |
261 | if (bLoading) | 271 | if (bLoading) |
262 | { | 272 | { |
263 | return *this << p; | 273 | return *this >> p; |
264 | } | 274 | } |
265 | else | 275 | else |
266 | { | 276 | { |
267 | return *this >> p; | 277 | return *this << p; |
268 | } | 278 | } |
269 | } | 279 | } |
270 | 280 | ||
271 | Serializer::Serializer &operator&(long double &p) | 281 | Serializer &Serializer::operator&&(long double &p) |
272 | { | 282 | { |
273 | if (bLoading) | 283 | if (bLoading) |
274 | { | 284 | { |
275 | return *this << p; | 285 | return *this >> p; |
276 | } | 286 | } |
277 | else | 287 | else |
278 | { | 288 | { |
279 | return *this >> p; | 289 | return *this << p; |
280 | } | 290 | } |
281 | }*/ | 291 | } |
282 | 292 | ||
283 | 293 | ||
284 | Serializer &operator<<(Serializer &s, Serializable &p) | 294 | Serializer &operator<<(Serializer &s, Serializable &p) |
@@ -293,17 +303,17 @@ Serializer &operator>>(Serializer &s, Serializable &p) | |||
293 | return s; | 303 | return s; |
294 | } | 304 | } |
295 | 305 | ||
296 | /*Serializer::Serializer &operator&(Serializable &p) | 306 | Serializer &operator&&(Serializer &s, Serializable &p) |
297 | { | 307 | { |
298 | if (bLoading) | 308 | if (s.isLoading()) |
299 | { | 309 | { |
300 | return *this << p; | 310 | return s >> p; |
301 | } | 311 | } |
302 | else | 312 | else |
303 | { | 313 | { |
304 | return *this >> p; | 314 | return s << p; |
305 | } | 315 | } |
306 | }*/ | 316 | } |
307 | 317 | ||
308 | Serializer &operator<<( Serializer &ar, std::string &s ) | 318 | Serializer &operator<<( Serializer &ar, std::string &s ) |
309 | { | 319 | { |
diff --git a/src/serializer.h b/src/serializer.h index e79c810..3af489c 100644 --- a/src/serializer.h +++ b/src/serializer.h | |||
@@ -35,6 +35,7 @@ public: | |||
35 | virtual Serializer &operator<<(uint16_t); | 35 | virtual Serializer &operator<<(uint16_t); |
36 | virtual Serializer &operator<<(uint32_t); | 36 | virtual Serializer &operator<<(uint32_t); |
37 | virtual Serializer &operator<<(uint64_t); | 37 | virtual Serializer &operator<<(uint64_t); |
38 | virtual Serializer &operator<<(long); | ||
38 | virtual Serializer &operator<<(float); | 39 | virtual Serializer &operator<<(float); |
39 | virtual Serializer &operator<<(double); | 40 | virtual Serializer &operator<<(double); |
40 | virtual Serializer &operator<<(long double); | 41 | virtual Serializer &operator<<(long double); |
@@ -48,30 +49,30 @@ public: | |||
48 | virtual Serializer &operator>>(uint16_t &); | 49 | virtual Serializer &operator>>(uint16_t &); |
49 | virtual Serializer &operator>>(uint32_t &); | 50 | virtual Serializer &operator>>(uint32_t &); |
50 | virtual Serializer &operator>>(uint64_t &); | 51 | virtual Serializer &operator>>(uint64_t &); |
52 | virtual Serializer &operator>>(long &); | ||
51 | virtual Serializer &operator>>(float &); | 53 | virtual Serializer &operator>>(float &); |
52 | virtual Serializer &operator>>(double &); | 54 | virtual Serializer &operator>>(double &); |
53 | virtual Serializer &operator>>(long double &); | 55 | virtual Serializer &operator>>(long double &); |
54 | 56 | ||
55 | /* | 57 | virtual Serializer &operator&&(bool &); |
56 | virtual Serializer &operator&(bool &); | 58 | virtual Serializer &operator&&(int8_t &); |
57 | virtual Serializer &operator&(int8_t &); | 59 | virtual Serializer &operator&&(int16_t &); |
58 | virtual Serializer &operator&(int16_t &); | 60 | virtual Serializer &operator&&(int32_t &); |
59 | virtual Serializer &operator&(int32_t &); | 61 | virtual Serializer &operator&&(int64_t &); |
60 | virtual Serializer &operator&(int64_t &); | 62 | virtual Serializer &operator&&(uint8_t &); |
61 | virtual Serializer &operator&(uint8_t &); | 63 | virtual Serializer &operator&&(uint16_t &); |
62 | virtual Serializer &operator&(uint16_t &); | 64 | virtual Serializer &operator&&(uint32_t &); |
63 | virtual Serializer &operator&(uint32_t &); | 65 | virtual Serializer &operator&&(uint64_t &); |
64 | virtual Serializer &operator&(uint64_t &); | 66 | virtual Serializer &operator&&(float &); |
65 | virtual Serializer &operator&(float &); | 67 | virtual Serializer &operator&&(double &); |
66 | virtual Serializer &operator&(double &); | 68 | virtual Serializer &operator&&(long double &); |
67 | virtual Serializer &operator&(long double &); | ||
68 | */ | ||
69 | 69 | ||
70 | //virtual Serializer &operator&(Serializable &); | 70 | //virtual Serializer &operator&(Serializable &); |
71 | }; | 71 | }; |
72 | 72 | ||
73 | Serializer &operator<<(Serializer &, class Serializable &); | 73 | Serializer &operator<<(Serializer &, class Serializable &); |
74 | Serializer &operator>>(Serializer &, class Serializable &); | 74 | Serializer &operator>>(Serializer &, class Serializable &); |
75 | Serializer &operator&&(Serializer &s, class Serializable &p); | ||
75 | 76 | ||
76 | Serializer &operator<<(Serializer &, std::string &); | 77 | Serializer &operator<<(Serializer &, std::string &); |
77 | Serializer &operator>>(Serializer &, std::string &); | 78 | Serializer &operator>>(Serializer &, std::string &); |
diff --git a/src/tests/fstring.cpp b/src/tests/fstring.cpp index 33e24b4..271738c 100644 --- a/src/tests/fstring.cpp +++ b/src/tests/fstring.cpp | |||
@@ -41,6 +41,7 @@ int main( int argc, char *argv ) | |||
41 | pem; | 41 | pem; |
42 | 42 | ||
43 | thing( str2 ); | 43 | thing( str2 ); |
44 | thing("test."); | ||
44 | 45 | ||
45 | printf("%d == %d\n", __calcHashCode( str ), __calcHashCode( str.c_str() ) ); | 46 | printf("%d == %d\n", __calcHashCode( str ), __calcHashCode( str.c_str() ) ); |
46 | } | 47 | } |