00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef cxxtools_SerializationInfo_h
00029 #define cxxtools_SerializationInfo_h
00030
00031 #include <cxxtools/api.h>
00032 #include <cxxtools/string.h>
00033 #include <cxxtools/convert.h>
00034 #include <cxxtools/serializationerror.h>
00035 #include <vector>
00036 #include <set>
00037 #include <map>
00038 #include <list>
00039 #include <deque>
00040 #include <typeinfo>
00041
00042 namespace cxxtools {
00043
00046 class CXXTOOLS_API SerializationInfo
00047 {
00048 typedef std::vector<SerializationInfo> Nodes;
00049
00050 public:
00051 enum Category {
00052 Void = 0, Value = 1, Object = 2, Array = 6, Reference = 8
00053 };
00054
00055 class Iterator;
00056 class ConstIterator;
00057
00058 public:
00059 SerializationInfo();
00060
00061 SerializationInfo(const SerializationInfo& si);
00062
00063 ~SerializationInfo()
00064 {}
00065
00066 void reserve(size_t n);
00067
00068 Category category() const
00069 {
00070 return _category;
00071 }
00072
00073 void setCategory(Category cat)
00074 {
00075 _category = cat;
00076 }
00077
00078 SerializationInfo* parent()
00079 {
00080 return _parent;
00081 }
00082
00083 const SerializationInfo* parent() const
00084 {
00085 return _parent;
00086 }
00087
00088 const std::string& typeName() const
00089 {
00090 return _type;
00091 }
00092
00093 void setTypeName(const std::string& type)
00094 {
00095 _type = type;
00096 }
00097
00098 const std::string& name() const
00099 {
00100 return _name;
00101 }
00102
00103 void setName(const std::string& name)
00104 {
00105 _name = name;
00106 }
00107
00108 void setId(const std::string& id)
00109 {
00110 _id = id;
00111 }
00112
00113 const std::string& id() const
00114 {
00115 return _id;
00116 }
00117
00120 void setReference(void* ref);
00121
00124 SerializationInfo& addReference(const std::string& name, void* ref);
00125
00128 template <typename T>
00129 void toReference(T*& type) const
00130 {
00131 this->getReference( reinterpret_cast<void*&>(type), typeid(T) );
00132 }
00133
00136 template <typename T>
00137 void getReference(const std::string& name, T*& type) const
00138 {
00139 this->getMember(name).getReference( reinterpret_cast<void*&>(type), typeid(T) );
00140 }
00141
00142 void* fixupAddr() const;
00143
00144 const std::type_info& fixupInfo() const;
00145
00148 template <typename T>
00149 void setValue(const T& value)
00150 {
00151 convert(_value, value);
00152 _category = Value;
00153 }
00154
00157 template <typename T>
00158 T toValue() const
00159 {
00160 return convert<T>(_value);
00161 }
00162
00165 template <typename T>
00166 void toValue(T& value) const
00167 {
00168 convert(value, _value);
00169 }
00170
00173 const cxxtools::String& toString() const;
00174
00177 template <typename T>
00178 SerializationInfo& addValue(const std::string& name, const T& value)
00179 {
00180 SerializationInfo& info = this->addMember(name);
00181 info.setValue(value);
00182 return info;
00183 }
00184
00187 SerializationInfo& addMember(const std::string& name);
00188
00191 const SerializationInfo& getMember(const std::string& name) const;
00192
00197 template <typename T>
00198 friend T getValue(const std::string& name, SerializationInfo* si);
00199
00202 template <typename T>
00203 T getValue(const std::string& name) const
00204 {
00205 T value;
00206 const SerializationInfo& info = this->getMember(name);
00207 info.toValue(value);
00208 return value;
00209 }
00210
00213 template <typename T>
00214 void getValue(const std::string& name, T& value) const
00215 {
00216 const SerializationInfo& info = this->getMember(name);
00217 return info.toValue(value);
00218 }
00219
00225 const SerializationInfo* findMember(const std::string& name) const;
00226
00232 SerializationInfo* findMember(const std::string& name);
00233
00234 size_t memberCount() const
00235 {
00236 return _nodes.size();
00237 }
00238
00239 Iterator begin();
00240
00241 Iterator end();
00242
00243 ConstIterator begin() const;
00244
00245 ConstIterator end() const;
00246
00247 SerializationInfo& operator =(const SerializationInfo& si);
00248
00249 void clear();
00250
00251 protected:
00252 void getReference(void*& type, const std::type_info& ti) const;
00253
00254 void setParent(SerializationInfo& si)
00255 { _parent = &si; }
00256
00257 private:
00258 SerializationInfo* _parent;
00259 Category _category;
00260 std::string _name;
00261 std::string _type;
00262 std::string _id;
00263 mutable void* _fixupAddr;
00264 mutable const std::type_info* _fixupInfo;
00265 cxxtools::String _value;
00266 Nodes _nodes;
00267 };
00268
00269
00270 class SerializationInfo::Iterator
00271 {
00272 public:
00273 Iterator();
00274
00275 Iterator(const Iterator& other);
00276
00277 Iterator(SerializationInfo* info);
00278
00279 Iterator& operator=(const Iterator& other);
00280
00281 Iterator& operator++();
00282
00283 SerializationInfo& operator*();
00284
00285 SerializationInfo* operator->();
00286
00287 bool operator!=(const Iterator& other) const;
00288
00289 private:
00290 SerializationInfo* _info;
00291 };
00292
00293
00294 class SerializationInfo::ConstIterator
00295 {
00296 public:
00297 ConstIterator();
00298
00299 ConstIterator(const ConstIterator& other);
00300
00301 ConstIterator(const SerializationInfo* info);
00302
00303 ConstIterator& operator=(const ConstIterator& other);
00304
00305 ConstIterator& operator++();
00306
00307 const SerializationInfo& operator*() const;
00308
00309 const SerializationInfo* operator->() const;
00310
00311 bool operator!=(const ConstIterator& other) const;
00312
00313 private:
00314 const SerializationInfo* _info;
00315 };
00316
00317
00318 inline SerializationInfo::Iterator::Iterator()
00319 : _info(0)
00320 {}
00321
00322
00323 inline SerializationInfo::Iterator::Iterator(const Iterator& other)
00324 : _info(other._info)
00325 {}
00326
00327
00328 inline SerializationInfo::Iterator::Iterator(SerializationInfo* info)
00329 : _info(info)
00330 {}
00331
00332
00333 inline SerializationInfo::Iterator& SerializationInfo::Iterator::operator=(const Iterator& other)
00334 {
00335 _info = other._info;
00336 return *this;
00337 }
00338
00339
00340 inline SerializationInfo::Iterator& SerializationInfo::Iterator::operator++()
00341 {
00342 ++_info;
00343 return *this;
00344 }
00345
00346
00347 inline SerializationInfo& SerializationInfo::Iterator::operator*()
00348 {
00349 return *_info;
00350 }
00351
00352
00353 inline SerializationInfo* SerializationInfo::Iterator::operator->()
00354 {
00355 return _info;
00356 }
00357
00358
00359 inline bool SerializationInfo::Iterator::operator!=(const Iterator& other) const
00360 {
00361 return _info != other._info;
00362 }
00363
00364
00365 inline SerializationInfo::ConstIterator::ConstIterator()
00366 : _info(0)
00367 {}
00368
00369
00370 inline SerializationInfo::ConstIterator::ConstIterator(const ConstIterator& other)
00371 : _info(other._info)
00372 {}
00373
00374
00375 inline SerializationInfo::ConstIterator::ConstIterator(const SerializationInfo* info)
00376 : _info(info)
00377 {}
00378
00379
00380 inline SerializationInfo::ConstIterator& SerializationInfo::ConstIterator::operator=(const ConstIterator& other)
00381 {
00382 _info = other._info;
00383 return *this;
00384 }
00385
00386
00387 inline SerializationInfo::ConstIterator& SerializationInfo::ConstIterator::operator++()
00388 {
00389 ++_info;
00390 return *this;
00391 }
00392
00393
00394 inline const SerializationInfo& SerializationInfo::ConstIterator::operator*() const
00395 {
00396 return *_info;
00397 }
00398
00399
00400 inline const SerializationInfo* SerializationInfo::ConstIterator::operator->() const
00401 {
00402 return _info;
00403 }
00404
00405
00406 inline bool SerializationInfo::ConstIterator::operator!=(const ConstIterator& other) const
00407 {
00408 return _info != other._info;
00409 }
00410
00411
00412 inline void operator >>=(const SerializationInfo& si, bool& n)
00413 {
00414 si.toValue(n);
00415 }
00416
00417
00418 inline void operator <<=(SerializationInfo& si, bool n)
00419 {
00420 si.setValue(n);
00421 si.setTypeName("bool");
00422 }
00423
00424
00425 inline void operator >>=(const SerializationInfo& si, signed char& n)
00426 {
00427 si.toValue(n);
00428 }
00429
00430
00431 inline void operator <<=(SerializationInfo& si, signed char n)
00432 {
00433 si.setValue(n);
00434 si.setTypeName("char");
00435 }
00436
00437
00438 inline void operator >>=(const SerializationInfo& si, unsigned char& n)
00439 {
00440 si.toValue(n);
00441 }
00442
00443
00444 inline void operator <<=(SerializationInfo& si, unsigned char n)
00445 {
00446 si.setValue(n);
00447 si.setTypeName("char");
00448 }
00449
00450
00451 inline void operator >>=(const SerializationInfo& si, char& n)
00452 {
00453 si.toValue(n);
00454 }
00455
00456
00457 inline void operator <<=(SerializationInfo& si, char n)
00458 {
00459 si.setValue(n);
00460 si.setTypeName("char");
00461 }
00462
00463
00464 inline void operator >>=(const SerializationInfo& si, short& n)
00465 {
00466 si.toValue(n);
00467 }
00468
00469
00470 inline void operator <<=(SerializationInfo& si, short n)
00471 {
00472 si.setValue(n);
00473 si.setTypeName("int");
00474 }
00475
00476
00477 inline void operator >>=(const SerializationInfo& si, unsigned short& n)
00478 {
00479 si.toValue(n);
00480 }
00481
00482
00483 inline void operator <<=(SerializationInfo& si, unsigned short n)
00484 {
00485 si.setValue(n);
00486 si.setTypeName("int");
00487 }
00488
00489
00490 inline void operator >>=(const SerializationInfo& si, int& n)
00491 {
00492 si.toValue(n);
00493 }
00494
00495
00496 inline void operator <<=(SerializationInfo& si, int n)
00497 {
00498 si.setValue(n);
00499 si.setTypeName("int");
00500 }
00501
00502
00503 inline void operator >>=(const SerializationInfo& si, unsigned int& n)
00504 {
00505 si.toValue(n);
00506 }
00507
00508
00509 inline void operator <<=(SerializationInfo& si, unsigned int n)
00510 {
00511 si.setValue(n);
00512 si.setTypeName("int");
00513 }
00514
00515
00516 inline void operator >>=(const SerializationInfo& si, long& n)
00517 {
00518 si.toValue(n);
00519 }
00520
00521
00522 inline void operator <<=(SerializationInfo& si, long n)
00523 {
00524 si.setValue(n);
00525 si.setTypeName("int");
00526 }
00527
00528
00529 inline void operator >>=(const SerializationInfo& si, unsigned long& n)
00530 {
00531 si.toValue(n);
00532 }
00533
00534
00535 inline void operator <<=(SerializationInfo& si, unsigned long n)
00536 {
00537 si.setValue(n);
00538 si.setTypeName("int");
00539 }
00540
00541
00542 inline void operator >>=(const SerializationInfo& si, float& n)
00543 {
00544 si.toValue<float>(n);
00545 }
00546
00547
00548 inline void operator <<=(SerializationInfo& si, float n)
00549 {
00550 si.setValue(n);
00551 si.setTypeName("double");
00552 }
00553
00554
00555 inline void operator >>=(const SerializationInfo& si, double& n)
00556 {
00557 si.toValue<double>(n);
00558 }
00559
00560
00561 inline void operator <<=(SerializationInfo& si, double n)
00562 {
00563 si.setValue(n);
00564 si.setTypeName("double");
00565 }
00566
00567
00568 inline void operator >>=(const SerializationInfo& si, std::string& n)
00569 {
00570 si.toValue<std::string>(n);
00571 }
00572
00573
00574 inline void operator <<=(SerializationInfo& si, const std::string& n)
00575 {
00576 si.setValue(n);
00577 si.setTypeName("string");
00578 }
00579
00580
00581 inline void operator >>=(const SerializationInfo& si, cxxtools::String& n)
00582 {
00583 si.toValue<cxxtools::String>(n);
00584 }
00585
00586
00587 inline void operator <<=(SerializationInfo& si, const cxxtools::String& n)
00588 {
00589 si.setValue(n);
00590 si.setTypeName("string");
00591 }
00592
00593
00594 template <typename T, typename A>
00595 inline void operator >>=(const SerializationInfo& si, std::vector<T, A>& vec)
00596 {
00597 vec.clear();
00598 for(SerializationInfo::ConstIterator it = si.begin(); it != si.end(); ++it)
00599 {
00600 vec.resize( vec.size() + 1 );
00601 *it >>= vec.back();
00602 }
00603 }
00604
00605
00606 template <typename T, typename A>
00607 inline void operator <<=(SerializationInfo& si, const std::vector<T, A>& vec)
00608 {
00609 typename std::vector<T, A>::const_iterator it;
00610
00611 for(it = vec.begin(); it != vec.end(); ++it)
00612 {
00613 SerializationInfo& newSi = si.addMember(std::string());
00614 newSi <<= *it;
00615 }
00616
00617 si.setTypeName("array");
00618 si.setCategory(SerializationInfo::Array);
00619 }
00620
00621
00622 inline void operator >>=(const SerializationInfo& si, std::vector<int>& vec)
00623 {
00624 vec.clear();
00625 for(SerializationInfo::ConstIterator it = si.begin(); it != si.end(); ++it)
00626 {
00627 vec.resize( vec.size() + 1 );
00628 *it >>= vec.back();
00629 }
00630 }
00631
00632 inline void operator <<=(SerializationInfo& si, const std::vector<int>& vec)
00633 {
00634 std::vector<int>::const_iterator it;
00635
00636 for(it = vec.begin(); it != vec.end(); ++it)
00637 {
00638 SerializationInfo& newSi = si.addMember(std::string());
00639 newSi <<= *it;
00640 }
00641
00642 si.setTypeName("array");
00643 si.setCategory(SerializationInfo::Array);
00644 }
00645
00646
00647 template <typename T, typename A>
00648 inline void operator >>=(const SerializationInfo& si, std::list<T, A>& list)
00649 {
00650 list.clear();
00651 for(SerializationInfo::ConstIterator it = si.begin(); it != si.end(); ++it)
00652 {
00653 list.resize( list.size() + 1 );
00654 *it >>= list.back();
00655 }
00656 }
00657
00658
00659 template <typename T, typename A>
00660 inline void operator <<=(SerializationInfo& si, const std::list<T, A>& list)
00661 {
00662 typename std::list<T, A>::const_iterator it;
00663
00664 for(it = list.begin(); it != list.end(); ++it)
00665 {
00666 SerializationInfo& newSi = si.addMember(std::string());
00667 newSi <<= *it;
00668 }
00669
00670 si.setTypeName("list");
00671 si.setCategory(SerializationInfo::Array);
00672 }
00673
00674
00675 template <typename T, typename A>
00676 inline void operator >>=(const SerializationInfo& si, std::deque<T, A>& deque)
00677 {
00678 deque.clear();
00679 for(SerializationInfo::ConstIterator it = si.begin(); it != si.end(); ++it)
00680 {
00681 deque.resize( deque.size() + 1 );
00682 *it >>= deque.back();
00683 }
00684 }
00685
00686
00687 template <typename T, typename A>
00688 inline void operator <<=(SerializationInfo& si, const std::deque<T, A>& deque)
00689 {
00690 typename std::deque<T, A>::const_iterator it;
00691
00692 for(it = deque.begin(); it != deque.end(); ++it)
00693 {
00694 SerializationInfo& newSi = si.addMember(std::string());
00695 newSi <<= *it;
00696 }
00697
00698 si.setTypeName("deque");
00699 si.setCategory(SerializationInfo::Array);
00700 }
00701
00702
00703 template <typename T, typename C, typename A>
00704 inline void operator >>=(const SerializationInfo& si, std::set<T, C, A>& set)
00705 {
00706 set.clear();
00707 for(SerializationInfo::ConstIterator it = si.begin(); it != si.end(); ++it)
00708 {
00709 T t;
00710 *it >>= t;
00711 set.insert(t);
00712 }
00713 }
00714
00715
00716 template <typename T, typename C, typename A>
00717 inline void operator <<=(SerializationInfo& si, const std::set<T, C, A>& set)
00718 {
00719 typename std::set<T, C, A>::const_iterator it;
00720
00721 for(it = set.begin(); it != set.end(); ++it)
00722 {
00723 SerializationInfo& newSi = si.addMember(std::string());
00724 newSi <<= *it;
00725 }
00726
00727 si.setTypeName("set");
00728 si.setCategory(SerializationInfo::Array);
00729 }
00730
00731
00732 template <typename T, typename C, typename A>
00733 inline void operator >>=(const SerializationInfo& si, std::multiset<T, C, A>& multiset)
00734 {
00735 multiset.clear();
00736 for(SerializationInfo::ConstIterator it = si.begin(); it != si.end(); ++it)
00737 {
00738 T t;
00739 *it >>= t;
00740 multiset.insert(t);
00741 }
00742 }
00743
00744
00745 template <typename T, typename C, typename A>
00746 inline void operator <<=(SerializationInfo& si, const std::multiset<T, C, A>& multiset)
00747 {
00748 typename std::multiset<T, C, A>::const_iterator it;
00749
00750 for(it = multiset.begin(); it != multiset.end(); ++it)
00751 {
00752 SerializationInfo& newSi = si.addMember(std::string());
00753 newSi <<= *it;
00754 }
00755
00756 si.setTypeName("multiset");
00757 si.setCategory(SerializationInfo::Array);
00758 }
00759
00760
00761 template <typename A, typename B>
00762 inline void operator >>=(const SerializationInfo& si, std::pair<A, B>& p)
00763 {
00764 si.getMember("first") >>= p.first;
00765 si.getMember("second") >>= p.second;
00766 }
00767
00768
00769 template <typename A, typename B>
00770 inline void operator <<=(SerializationInfo& si, const std::pair<A, B>& p)
00771 {
00772 si.addMember("first") <<= p.first;
00773 si.addMember("second") <<= p.second;
00774 }
00775
00776
00777 template <typename K, typename V, typename P, typename A>
00778 inline void operator >>=(const SerializationInfo& si, std::map<K, V, P, A>& map)
00779 {
00780 map.clear();
00781 for(SerializationInfo::ConstIterator it = si.begin(); it != si.end(); ++it)
00782 {
00783 typename std::pair<K, V> v;
00784 *it >>= v;
00785 map.insert(v);
00786 }
00787 }
00788
00789
00790 template <typename K, typename V, typename P, typename A>
00791 inline void operator <<=(SerializationInfo& si, const std::map<K, V, P, A>& map)
00792 {
00793 typename std::map<K, V, P, A>::const_iterator it;
00794
00795 for(it = map.begin(); it != map.end(); ++it)
00796 {
00797 SerializationInfo& newSi = si.addMember(std::string());
00798 newSi <<= *it;
00799 }
00800
00801 si.setTypeName("map");
00802 si.setCategory(SerializationInfo::Array);
00803 }
00804
00805
00806 template <typename K, typename V, typename P, typename A>
00807 inline void operator >>=(const SerializationInfo& si, std::multimap<K, V, P, A>& multimap)
00808 {
00809 multimap.clear();
00810 for(SerializationInfo::ConstIterator it = si.begin(); it != si.end(); ++it)
00811 {
00812 typename std::pair<K, V> v;
00813 *it >>= v;
00814 multimap.insert(v);
00815 }
00816 }
00817
00818
00819 template <typename T, typename C, typename P, typename A>
00820 inline void operator <<=(SerializationInfo& si, const std::multimap<T, C, P, A>& multimap)
00821 {
00822 typename std::multimap<T, C, P, A>::const_iterator it;
00823
00824 for(it = multimap.begin(); it != multimap.end(); ++it)
00825 {
00826 SerializationInfo& newSi = si.addMember(std::string());
00827 newSi <<= *it;
00828 }
00829
00830 si.setTypeName("multimap");
00831 si.setCategory(SerializationInfo::Array);
00832 }
00833
00834
00835 }
00836
00837
00838 #endif