serialization works for containment and inheritance
This commit is contained in:
@@ -12,6 +12,7 @@
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <list>
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <typeinfo>
|
||||
@@ -42,7 +43,12 @@ class MethodTrace {
|
||||
};
|
||||
#define TRACE MethodTrace XXX_METHOD(this, __PRETTY_FUNCTION__)
|
||||
#define LOG(X) std::clog<<__PRETTY_FUNCTION__<<"\t**** "<<X<<std::endl
|
||||
|
||||
#define ASSERT(X, Y) { \
|
||||
if (!(Y)) { \
|
||||
LOG(X); \
|
||||
} \
|
||||
assert(Y); \
|
||||
}
|
||||
|
||||
|
||||
/*! @mainpage
|
||||
@@ -578,6 +584,7 @@ namespace xml {
|
||||
virtual Node& set(const Attributes& o) throw();
|
||||
Node& clear() throw ();
|
||||
std::string name() const throw();
|
||||
Node& name(const std::string& n) throw();
|
||||
Node& min(size_type m) throw();
|
||||
size_type min() const throw();
|
||||
Node& max(size_type m) throw();
|
||||
@@ -639,6 +646,7 @@ namespace xml {
|
||||
Node& operator=(const std::string& contents) throw();
|
||||
operator std::string() const throw();
|
||||
operator bool() const throw();
|
||||
operator char() const throw();
|
||||
operator signed char() const throw();
|
||||
operator unsigned char() const throw();
|
||||
operator signed short() const throw();
|
||||
@@ -687,8 +695,12 @@ namespace xml {
|
||||
duplicate_attribute, attributes_in_end_tag,
|
||||
illegal_attribute, mandatory_attribute_missing,
|
||||
wrong_node_number);
|
||||
void reset() throw();
|
||||
private:
|
||||
friend class stream_error;
|
||||
friend class Serialize;
|
||||
Node& operator*() throw(factory_not_valid);
|
||||
Node*const operator->() throw(factory_not_valid);
|
||||
bool ws(char c) throw();
|
||||
std::auto_ptr<Node> read(std::istream& is, const Node& position)
|
||||
throw(wrong_end_tag, wrong_start_tag, tag_expected, type_mismatch,
|
||||
@@ -809,14 +821,78 @@ namespace xml {
|
||||
//! You must call Serialize::className() if you use this constructor!
|
||||
Serialize() throw();
|
||||
Serialize(const std::string& className) throw();
|
||||
Serialize(const Serialize& other) throw();
|
||||
virtual ~Serialize();
|
||||
Serialize& operator=(const Serialize& other) throw();
|
||||
Serialize& className(const std::string& name) throw();
|
||||
Serialize& persist(Serialize& ser) throw();
|
||||
Serialize& persist(Serialize& member,
|
||||
const std::string& name) throw();
|
||||
template<typename TYPE, class ALLOC>
|
||||
Serialize& persist(std::list<TYPE, ALLOC>& member,
|
||||
const std::string& name) throw() {
|
||||
return persist(member, name, name);
|
||||
}
|
||||
template<typename TYPE, class ALLOC>
|
||||
Serialize& persist(std::list<TYPE, ALLOC>& member,
|
||||
const std::string& list,
|
||||
const std::string& item) throw() {
|
||||
mapName<std::list<TYPE, ALLOC> >()[std::make_pair(this, list)]
|
||||
= &member;
|
||||
mapMember<std::list<TYPE, ALLOC> >()[&member] = list;
|
||||
_xmlNames[list] = &typeid(TYPE);
|
||||
Serialize ser(list);
|
||||
TYPE dummy;
|
||||
ser.persist(dummy, item);
|
||||
*_xmlFactory<<(xml::Node(list).limits(1,1)
|
||||
<<(*ser._xmlFactory)[0].limits(0, 0));
|
||||
return *this;
|
||||
}
|
||||
Serialize& persist(bool& member,
|
||||
const std::string& name) throw();
|
||||
Serialize& persist(char& member,
|
||||
const std::string& name) throw();
|
||||
Serialize& persist(unsigned char& member,
|
||||
const std::string& name) throw();
|
||||
Serialize& persist(signed char& member,
|
||||
const std::string& name) throw();
|
||||
Serialize& persist(unsigned short& member,
|
||||
const std::string& name) throw();
|
||||
Serialize& persist(signed short& member,
|
||||
const std::string& name) throw();
|
||||
Serialize& persist(unsigned int& member,
|
||||
const std::string& name) throw();
|
||||
Serialize& persist(signed int& member,
|
||||
const std::string& name) throw();
|
||||
Serialize& persist(unsigned long& member,
|
||||
const std::string& name) throw();
|
||||
Serialize& persist(signed long& member,
|
||||
const std::string& name) throw();
|
||||
Serialize& persist(float& member,
|
||||
const std::string& name) throw();
|
||||
Serialize& persist(double& member,
|
||||
const std::string& name) throw();
|
||||
Serialize& persist(std::string& member,
|
||||
const std::string& name) throw();
|
||||
std::ostream& saveXml(std::ostream& os,
|
||||
const std::string& name = std::string()) const throw();
|
||||
std::istream& loadXml(std::istream& is,
|
||||
const std::string& name = std::string());
|
||||
std::string schema() const throw();
|
||||
protected:
|
||||
virtual void initXmlMembers();
|
||||
private:
|
||||
void clear() throw();
|
||||
void copy(const Serialize& o) throw();
|
||||
template<typename TYPE>
|
||||
Serialize& persist(TYPE& member, const std::string& name) throw() {
|
||||
assert(mapName<TYPE>().find(std::make_pair(this, name))==mapName<TYPE>().end());
|
||||
assert(mapMember<TYPE>().find(&member)==mapMember<TYPE>().end());
|
||||
assert(_xmlNames.find(name)==_xmlNames.end());
|
||||
Serialize& persistSimpleType(TYPE& member,
|
||||
const std::string& name) throw() {
|
||||
ASSERT("type: "<<typeid(TYPE).name()<<"; name="<<name,
|
||||
mapName<TYPE>().find(std::make_pair(this, name))
|
||||
==mapName<TYPE>().end());
|
||||
ASSERT("type: "<<typeid(TYPE).name()<<"; name="<<name,
|
||||
mapMember<TYPE>().find(&member)==mapMember<TYPE>().end());
|
||||
ASSERT("type: "<<typeid(TYPE).name()<<"; name="<<name,
|
||||
_xmlNames.find(name)==_xmlNames.end());
|
||||
mapName<TYPE>()[std::make_pair(this, name)] = &member;
|
||||
mapMember<TYPE>()[&member] = name;
|
||||
_xmlNames[name] = &typeid(TYPE);
|
||||
@@ -825,11 +901,6 @@ namespace xml {
|
||||
_xmlFactory = schema;
|
||||
return *this;
|
||||
}
|
||||
std::ostream& saveXml(std::ostream& os) const throw();
|
||||
std::istream& loadXml(std::istream& is);
|
||||
protected:
|
||||
virtual void initXmlMembers();
|
||||
private:
|
||||
template<typename TYPE>
|
||||
std::map<std::pair<const Serialize*, std::string>, TYPE*>&
|
||||
mapName() const {
|
||||
@@ -841,13 +912,19 @@ namespace xml {
|
||||
return MAP;
|
||||
}
|
||||
template<typename TYPE> void fromNode(TYPE* member, xml::Node& node) {
|
||||
*member =
|
||||
(TYPE)dynamic_cast<xml::String&>(node[mapMember<TYPE>()[member]]);
|
||||
*member = (TYPE)dynamic_cast<xml::String&>(node);
|
||||
}
|
||||
/*
|
||||
template<typename TYPE, class ALLOC>
|
||||
void fromNode(std::list<TYPE, ALLOC>* member, xml::Node& node) {
|
||||
member->clear();
|
||||
for (xml::Node::size_type i(0); i<node.children(); ++i)
|
||||
...
|
||||
}*/
|
||||
template<typename TYPE> void toNode(TYPE* member, xml::Node& node) const {
|
||||
std::stringstream ss;
|
||||
ss<<*member;
|
||||
node[mapMember<TYPE>()[member]].text(ss.str());
|
||||
node.text(ss.str());
|
||||
}
|
||||
std::map<std::string, const std::type_info*> _xmlNames;
|
||||
xml::Factory _xmlFactory;
|
||||
|
286
src/xml.cxx
286
src/xml.cxx
@@ -330,6 +330,11 @@ namespace xml {
|
||||
std::string Node::name() const throw() {
|
||||
return _name;
|
||||
}
|
||||
//! Set a new node's tag name.
|
||||
Node& Node::name(const std::string& n) throw() {
|
||||
_name = n;
|
||||
return *this;
|
||||
}
|
||||
//! Set minimum number of instances (in a xml::Factory).
|
||||
/*! @copydoc limits */
|
||||
Node& Node::min(Node::size_type m) throw() {
|
||||
@@ -598,6 +603,12 @@ namespace xml {
|
||||
ss>>res;
|
||||
return res;
|
||||
}
|
||||
String::operator char() const throw() {
|
||||
char res;
|
||||
std::stringstream ss(text());
|
||||
ss>>res;
|
||||
return res;
|
||||
}
|
||||
String::operator signed char() const throw() {
|
||||
signed char res;
|
||||
std::stringstream ss(text());
|
||||
@@ -849,6 +860,21 @@ namespace xml {
|
||||
e.line(_line);
|
||||
throw;
|
||||
}
|
||||
void Factory::reset() throw() {
|
||||
_line = 0;
|
||||
_open = 0;
|
||||
_template = xml::Node("<xml::start>");
|
||||
}
|
||||
Node& Factory::operator*() throw(factory_not_valid) try {
|
||||
return _template[0];
|
||||
} catch (...) {
|
||||
throw factory_not_valid();
|
||||
}
|
||||
Node*const Factory::operator->() throw(factory_not_valid) try {
|
||||
return &_template[0];
|
||||
} catch (...) {
|
||||
throw factory_not_valid();
|
||||
}
|
||||
bool Factory::ws(char c) throw() {
|
||||
static char last(0);
|
||||
if ((c=='\n'||c=='\r')&&last!='\n'&&last!='\r') ++_line;
|
||||
@@ -995,22 +1021,184 @@ namespace xml {
|
||||
xml::Node& node) {
|
||||
//! @todo improve this (inefficient)
|
||||
std::stringstream ss; // simple but inefficient: rewrite and reread
|
||||
ss<<node[member->_xmlFactory->name()];
|
||||
member->loadXml(ss);
|
||||
ss<<node;
|
||||
member->loadXml(ss, node.name());
|
||||
}
|
||||
template<> void Serialize::toNode<Serialize>(Serialize* member,
|
||||
xml::Node& node) const {
|
||||
//! @todo improve this (inefficient)
|
||||
std::stringstream ss; // simple but inefficient: write and reread
|
||||
member->saveXml(ss);
|
||||
node[member->_xmlFactory->name()] = *member->_xmlFactory.read(ss);
|
||||
xml::Node& node) const {
|
||||
std::stringstream ss;
|
||||
member->saveXml(ss, node.name());
|
||||
xml::Factory factory(node);
|
||||
node = *factory.read(ss);
|
||||
}
|
||||
//----------------------------------------------------------------------------
|
||||
Serialize::Serialize() throw() {}
|
||||
Serialize::Serialize(const std::string& className) throw():
|
||||
_xmlFactory(xml::Node(xml::String(className).limits(1,1))) {
|
||||
}
|
||||
Serialize::Serialize(const Serialize& other) throw() {
|
||||
copy(other);
|
||||
}
|
||||
Serialize::~Serialize() {
|
||||
clear();
|
||||
}
|
||||
Serialize& Serialize::operator=(const Serialize& other) throw() {
|
||||
copy(other);
|
||||
return *this;
|
||||
}
|
||||
Serialize& Serialize::className(const std::string& name) throw() {
|
||||
xml::Node node(xml::Node(xml::String(name).limits(1,1)));
|
||||
if (_xmlFactory) {
|
||||
for (xml::Node::size_type i(0); i<_xmlFactory->children(); ++i)
|
||||
node<<(*_xmlFactory)[i];
|
||||
}
|
||||
_xmlFactory=node;
|
||||
return *this;
|
||||
}
|
||||
Serialize& Serialize::persist(Serialize& ser,
|
||||
const std::string& name) throw() {
|
||||
if (!ser._xmlFactory) ser.initXmlMembers();
|
||||
mapName<Serialize>()[std::make_pair(this, name)] = &ser;
|
||||
mapMember<Serialize>()[&ser] = name;
|
||||
_xmlNames[name] = &typeid(Serialize);
|
||||
xml::Node schema(*_xmlFactory);
|
||||
xml::Node node(xml::Node(name).limits(1,1));
|
||||
for (xml::Node::size_type i(0); i<ser._xmlFactory->children(); ++i)
|
||||
node<<(*ser._xmlFactory)[i];
|
||||
_xmlFactory = schema<<node;
|
||||
return *this;
|
||||
}
|
||||
Serialize& Serialize::persist(bool& member,
|
||||
const std::string& name) throw() {
|
||||
return persistSimpleType(member, name);
|
||||
}
|
||||
Serialize& Serialize::persist(char& member,
|
||||
const std::string& name) throw() {
|
||||
return persistSimpleType(member, name);
|
||||
}
|
||||
Serialize& Serialize::persist(unsigned char& member,
|
||||
const std::string& name) throw() {
|
||||
return persistSimpleType(member, name);
|
||||
}
|
||||
Serialize& Serialize::persist(signed char& member,
|
||||
const std::string& name) throw() {
|
||||
return persistSimpleType(member, name);
|
||||
}
|
||||
Serialize& Serialize::persist(unsigned short& member,
|
||||
const std::string& name) throw() {
|
||||
return persistSimpleType(member, name);
|
||||
}
|
||||
Serialize& Serialize::persist(signed short& member,
|
||||
const std::string& name) throw() {
|
||||
return persistSimpleType(member, name);
|
||||
}
|
||||
Serialize& Serialize::persist(unsigned int& member,
|
||||
const std::string& name) throw() {
|
||||
return persistSimpleType(member, name);
|
||||
}
|
||||
Serialize& Serialize::persist(signed int& member,
|
||||
const std::string& name) throw() {
|
||||
return persistSimpleType(member, name);
|
||||
}
|
||||
Serialize& Serialize::persist(unsigned long& member,
|
||||
const std::string& name) throw() {
|
||||
return persistSimpleType(member, name);
|
||||
}
|
||||
Serialize& Serialize::persist(signed long& member,
|
||||
const std::string& name) throw() {
|
||||
return persistSimpleType(member, name);
|
||||
}
|
||||
Serialize& Serialize::persist(float& member,
|
||||
const std::string& name) throw() {
|
||||
return persistSimpleType(member, name);
|
||||
}
|
||||
Serialize& Serialize::persist(double& member,
|
||||
const std::string& name) throw() {
|
||||
return persistSimpleType(member, name);
|
||||
}
|
||||
Serialize& Serialize::persist(std::string& member,
|
||||
const std::string& name) throw() {
|
||||
return persistSimpleType(member, name);
|
||||
}
|
||||
std::ostream& Serialize::saveXml(std::ostream& os,
|
||||
const std::string& name) const throw() {
|
||||
if (!_xmlFactory) const_cast<Serialize*>(this)->initXmlMembers();
|
||||
xml::Node node(*_xmlFactory);
|
||||
if (name.size()) node.name(name);
|
||||
for (std::map<std::string, const std::type_info*>::const_iterator
|
||||
it(_xmlNames.begin());
|
||||
it!=_xmlNames.end(); ++it) {
|
||||
#define QWERTZ_CHECK_TYPE_ZTREWQ___XXX(TYPE) \
|
||||
if (*it->second==typeid(TYPE)) \
|
||||
toNode(mapName<TYPE>()[std::make_pair(this, it->first)], \
|
||||
node[it->first]); \
|
||||
else
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(Serialize)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(std::string)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(float)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(double)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(bool)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(char)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(signed char)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(unsigned char)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(short)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(signed short)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(unsigned short)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(int)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(signed int)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(unsigned int)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(long)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(signed long)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(unsigned long)
|
||||
throw std::runtime_error(it->second->name());
|
||||
#undef QWERTZ_CHECK_TYPE_ZTREWQ___XXX
|
||||
}
|
||||
os<<node;
|
||||
return os;
|
||||
}
|
||||
std::istream& Serialize::loadXml(std::istream& is, const std::string& name) {
|
||||
if (!_xmlFactory) initXmlMembers();
|
||||
xml::Factory factory(_xmlFactory);
|
||||
if (name.size()) factory->name(name);
|
||||
std::auto_ptr<xml::Node> node(factory.read(is));
|
||||
for (std::map<std::string, const std::type_info*>::const_iterator
|
||||
it(_xmlNames.begin());
|
||||
it!=_xmlNames.end(); ++it) {
|
||||
#define QWERTZ_CHECK_TYPE_ZTREWQ___XXX(TYPE) \
|
||||
if (*it->second==typeid(TYPE)) \
|
||||
fromNode(mapName<TYPE>()[std::make_pair(this, it->first)], \
|
||||
(*node)[it->first]); \
|
||||
else
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(Serialize)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(std::string)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(float)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(double)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(bool)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(char)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(signed char)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(unsigned char)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(short)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(signed short)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(unsigned short)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(int)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(signed int)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(unsigned int)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(long)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(signed long)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(unsigned long)
|
||||
throw std::runtime_error(it->second->name());
|
||||
#undef QWERTZ_CHECK_TYPE_ZTREWQ___XXX
|
||||
}
|
||||
return is;
|
||||
}
|
||||
std::string Serialize::schema() const throw() {
|
||||
if (!_xmlFactory) const_cast<Serialize*>(this)->initXmlMembers();
|
||||
std::stringstream ss;
|
||||
ss<<*_xmlFactory;
|
||||
return ss.str();
|
||||
}
|
||||
void Serialize::initXmlMembers() {}
|
||||
void Serialize::clear() throw() {
|
||||
// Remove my entries from the maps
|
||||
for (std::map<std::string, const std::type_info*>::const_iterator
|
||||
it(_xmlNames.begin());
|
||||
@@ -1042,86 +1230,10 @@ namespace xml {
|
||||
#undef QWERTZ_CHECK_TYPE_ZTREWQ___XXX
|
||||
}
|
||||
}
|
||||
Serialize& Serialize::className(const std::string& name) throw() {
|
||||
_xmlFactory=xml::Node(xml::String(name).limits(1,1));
|
||||
return *this;
|
||||
void Serialize::copy(const Serialize& o) throw() {
|
||||
clear();
|
||||
_xmlFactory.reset();
|
||||
initXmlMembers();
|
||||
}
|
||||
Serialize& Serialize::persist(Serialize& ser) throw() {
|
||||
ser.initXmlMembers();
|
||||
std::string name(ser._xmlFactory->name());
|
||||
mapName<Serialize>()[std::make_pair(this, name)] = &ser;
|
||||
mapMember<Serialize>()[&ser] = name;
|
||||
_xmlNames[name] = &typeid(Serialize);
|
||||
xml::Node schema(*_xmlFactory);
|
||||
schema<<*ser._xmlFactory;
|
||||
_xmlFactory = schema;
|
||||
return *this;
|
||||
}
|
||||
std::ostream& Serialize::saveXml(std::ostream& os) const throw() {
|
||||
if (!_xmlFactory) const_cast<Serialize*>(this)->initXmlMembers();
|
||||
xml::Node node(*_xmlFactory);
|
||||
for (std::map<std::string, const std::type_info*>::const_iterator
|
||||
it(_xmlNames.begin());
|
||||
it!=_xmlNames.end(); ++it) {
|
||||
#define QWERTZ_CHECK_TYPE_ZTREWQ___XXX(TYPE) \
|
||||
if (*it->second==typeid(TYPE)) \
|
||||
toNode(mapName<TYPE>()[std::make_pair(this, it->first)], node); \
|
||||
else
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(Serialize)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(std::string)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(float)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(double)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(bool)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(char)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(signed char)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(unsigned char)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(short)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(signed short)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(unsigned short)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(int)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(signed int)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(unsigned int)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(long)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(signed long)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(unsigned long)
|
||||
throw std::runtime_error(it->second->name());
|
||||
#undef QWERTZ_CHECK_TYPE_ZTREWQ___XXX
|
||||
}
|
||||
os<<node;
|
||||
return os;
|
||||
}
|
||||
std::istream& Serialize::loadXml(std::istream& is) {
|
||||
if (!_xmlFactory) initXmlMembers();
|
||||
std::auto_ptr<xml::Node> node(_xmlFactory.read(is));
|
||||
for (std::map<std::string, const std::type_info*>::const_iterator
|
||||
it(_xmlNames.begin());
|
||||
it!=_xmlNames.end(); ++it) {
|
||||
#define QWERTZ_CHECK_TYPE_ZTREWQ___XXX(TYPE) \
|
||||
if (*it->second==typeid(TYPE)) \
|
||||
fromNode(mapName<TYPE>()[std::make_pair(this, it->first)], *node); \
|
||||
else
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(Serialize)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(std::string)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(float)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(double)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(bool)
|
||||
//QWERTZ_CHECK_TYPE_ZTREWQ___XXX(char)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(signed char)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(unsigned char)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(short)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(signed short)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(unsigned short)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(int)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(signed int)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(unsigned int)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(long)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(signed long)
|
||||
QWERTZ_CHECK_TYPE_ZTREWQ___XXX(unsigned long)
|
||||
throw std::runtime_error(it->second->name());
|
||||
#undef QWERTZ_CHECK_TYPE_ZTREWQ___XXX
|
||||
}
|
||||
return is;
|
||||
}
|
||||
void Serialize::initXmlMembers() {}
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user