diff options
Diffstat (limited to '')
-rw-r--r-- | src/archive.cpp | 41 | ||||
-rw-r--r-- | src/archive.h | 44 | ||||
-rw-r--r-- | src/hash.h | 7 |
3 files changed, 86 insertions, 6 deletions
diff --git a/src/archive.cpp b/src/archive.cpp index c759477..7208bae 100644 --- a/src/archive.cpp +++ b/src/archive.cpp | |||
@@ -2,7 +2,8 @@ | |||
2 | 2 | ||
3 | Bu::Archive::Archive( Stream &rStream, bool bLoading ) : | 3 | Bu::Archive::Archive( Stream &rStream, bool bLoading ) : |
4 | bLoading( bLoading ), | 4 | bLoading( bLoading ), |
5 | rStream( rStream ) | 5 | rStream( rStream ), |
6 | nNextID( 1 ) | ||
6 | { | 7 | { |
7 | } | 8 | } |
8 | 9 | ||
@@ -345,3 +346,41 @@ Bu::Archive &Bu::operator>>( Bu::Archive &ar, std::string &s ) | |||
345 | return ar; | 346 | return ar; |
346 | } | 347 | } |
347 | 348 | ||
349 | uint32_t Bu::Archive::getID( const void *ptr ) | ||
350 | { | ||
351 | if( hPtrID.has( (int)ptr ) ) | ||
352 | return hPtrID.get( (int)ptr ); | ||
353 | hPtrID.insert( (int)ptr, nNextID ); | ||
354 | return nNextID++; | ||
355 | } | ||
356 | |||
357 | void Bu::Archive::assocPtrID( void **ptr, uint32_t id ) | ||
358 | { | ||
359 | if( hPtrID.has( id ) ) | ||
360 | { | ||
361 | *ptr = (void *)hPtrID.get( id ); | ||
362 | return; | ||
363 | } | ||
364 | |||
365 | if( !hPtrDest.has( id ) ) | ||
366 | hPtrDest.insert( id, List<void **>() ); | ||
367 | |||
368 | hPtrDest[id].value().append( ptr ); | ||
369 | } | ||
370 | |||
371 | void Bu::Archive::readID( const void *ptr, uint32_t id ) | ||
372 | { | ||
373 | hPtrID.insert( id, (int)ptr ); | ||
374 | |||
375 | if( hPtrDest.has( id ) ) | ||
376 | { | ||
377 | Bu::List<void **> &l = hPtrDest.get( id ); | ||
378 | for( Bu::List<void **>::iterator i = l.begin(); i != l.end(); i++ ) | ||
379 | { | ||
380 | *(*i) = (void *)ptr; | ||
381 | } | ||
382 | |||
383 | hPtrDest.erase( id ); | ||
384 | } | ||
385 | } | ||
386 | |||
diff --git a/src/archive.h b/src/archive.h index 2f782d3..05c6f57 100644 --- a/src/archive.h +++ b/src/archive.h | |||
@@ -3,9 +3,11 @@ | |||
3 | 3 | ||
4 | #include <stdint.h> | 4 | #include <stdint.h> |
5 | #include <string> | 5 | #include <string> |
6 | #include "archival.h" | 6 | #include "bu/archival.h" |
7 | #include "stream.h" | 7 | #include "bu/stream.h" |
8 | #include <list> | 8 | #include <list> |
9 | #include "bu/hash.h" | ||
10 | #include "bu/list.h" | ||
9 | 11 | ||
10 | namespace Bu | 12 | namespace Bu |
11 | { | 13 | { |
@@ -117,8 +119,15 @@ namespace Bu | |||
117 | virtual Archive &operator&&(double &); | 119 | virtual Archive &operator&&(double &); |
118 | virtual Archive &operator&&(long double &); | 120 | virtual Archive &operator&&(long double &); |
119 | 121 | ||
122 | uint32_t getID( const void *ptr ); | ||
123 | void assocPtrID( void **ptr, uint32_t id ); | ||
124 | void readID( const void *ptr, uint32_t id ); | ||
125 | |||
120 | private: | 126 | private: |
121 | Stream &rStream; | 127 | Stream &rStream; |
128 | uint32_t nNextID; | ||
129 | Hash<uint32_t,uint32_t> hPtrID; | ||
130 | Hash<uint32_t,List<void **> > hPtrDest; | ||
122 | }; | 131 | }; |
123 | 132 | ||
124 | Archive &operator<<(Archive &, class Bu::Archival &); | 133 | Archive &operator<<(Archive &, class Bu::Archival &); |
@@ -168,6 +177,37 @@ namespace Bu | |||
168 | 177 | ||
169 | return ar; | 178 | return ar; |
170 | } | 179 | } |
180 | |||
181 | template<typename key, typename value> | ||
182 | Archive &operator<<( Archive &ar, Hash<key,value> &h ) | ||
183 | { | ||
184 | ar << h.size(); | ||
185 | for( typename Hash<key,value>::iterator i = h.begin(); i != h.end(); i++ ) | ||
186 | { | ||
187 | std::pair<key,value> p = *i; | ||
188 | ar << p.first << p.second; | ||
189 | } | ||
190 | |||
191 | return ar; | ||
192 | } | ||
193 | |||
194 | template<typename key, typename value> | ||
195 | Archive &operator>>( Archive &ar, Hash<key,value> &h ) | ||
196 | { | ||
197 | h.clear(); | ||
198 | uint32_t nSize; | ||
199 | ar >> nSize; | ||
200 | |||
201 | for( uint32_t j = 0; j < nSize; j++ ) | ||
202 | { | ||
203 | key k; value v; | ||
204 | ar >> k >> v; | ||
205 | h.insert( k, v ); | ||
206 | } | ||
207 | |||
208 | return ar; | ||
209 | } | ||
210 | |||
171 | } | 211 | } |
172 | 212 | ||
173 | #endif | 213 | #endif |
@@ -8,8 +8,8 @@ | |||
8 | #include <list> | 8 | #include <list> |
9 | #include <utility> | 9 | #include <utility> |
10 | #include "exceptionbase.h" | 10 | #include "exceptionbase.h" |
11 | #include "archival.h" | 11 | ///#include "archival.h" |
12 | #include "archive.h" | 12 | ///#include "archive.h" |
13 | 13 | ||
14 | #define bitsToBytes( n ) (n/32+(n%32>0 ? 1 : 0)) | 14 | #define bitsToBytes( n ) (n/32+(n%32>0 ? 1 : 0)) |
15 | 15 | ||
@@ -697,6 +697,7 @@ namespace Bu | |||
697 | template<> uint32_t __calcHashCode<std::string>( const std::string &k ); | 697 | template<> uint32_t __calcHashCode<std::string>( const std::string &k ); |
698 | template<> bool __cmpHashKeys<std::string>( const std::string &a, const std::string &b ); | 698 | template<> bool __cmpHashKeys<std::string>( const std::string &a, const std::string &b ); |
699 | 699 | ||
700 | /* | ||
700 | template<typename key, typename value> | 701 | template<typename key, typename value> |
701 | Archive &operator<<( Archive &ar, Hash<key,value> &h ) | 702 | Archive &operator<<( Archive &ar, Hash<key,value> &h ) |
702 | { | 703 | { |
@@ -725,7 +726,7 @@ namespace Bu | |||
725 | } | 726 | } |
726 | 727 | ||
727 | return ar; | 728 | return ar; |
728 | } | 729 | }*/ |
729 | 730 | ||
730 | /* | 731 | /* |
731 | template<typename key, typename value> | 732 | template<typename key, typename value> |