Webmaster  |  Imprint 
C++ Server Pages
Main  |  License  |  Documentation  |  Download 

/home/tommi/cxxtools/include/cxxtools/serializationinfo.h

00001 /*
00002  * Copyright (C) 2005-2008 by Dr. Marc Boris Duerner
00003  * 
00004  * This library is free software; you can redistribute it and/or
00005  * modify it under the terms of the GNU Lesser General Public
00006  * License as published by the Free Software Foundation; either
00007  * version 2.1 of the License, or (at your option) any later version.
00008  * 
00009  * As a special exception, you may use this file as part of a free
00010  * software library without restriction. Specifically, if other files
00011  * instantiate templates or use macros or inline functions from this
00012  * file, or you compile this file and link it with other files to
00013  * produce an executable, this file does not by itself cause the
00014  * resulting executable to be covered by the GNU General Public
00015  * License. This exception does not however invalidate any other
00016  * reasons why the executable file might be covered by the GNU Library
00017  * General Public License.
00018  * 
00019  * This library is distributed in the hope that it will be useful,
00020  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00021  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00022  * Lesser General Public License for more details.
00023  * 
00024  * You should have received a copy of the GNU Lesser General Public
00025  * License along with this library; if not, write to the Free Software
00026  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
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; // only refs
00264         mutable const std::type_info* _fixupInfo; // only refs
00265         cxxtools::String _value;        // values/refs
00266         Nodes _nodes;             // objects/arrays
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 } // namespace cxxtools
00836 
00837 
00838 #endif
Copyright © 2008 The Tntnet Development Team
Tntnet 1.6