using boost::any for storing member pointers to any type

This commit is contained in:
Marc Wäckerlin
2009-04-27 11:34:39 +00:00
parent c16fe5421e
commit 1e09b8a696
2 changed files with 15 additions and 67 deletions

View File

@@ -17,6 +17,7 @@
#include <memory>
#include <typeinfo>
#include <stdexcept>
#include <boost/any.hpp>
#include <cassert>
#include <iostream>
@@ -836,10 +837,7 @@ namespace xml {
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);
_xmlNames[list] = &member;
Serialize ser(list);
TYPE dummy;
ser.persist(dummy, item);
@@ -886,31 +884,12 @@ namespace xml {
template<typename TYPE>
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);
_xmlNames[name] = &member;
xml::Node schema(*_xmlFactory);
schema<<xml::String(name).limits(1,1);
_xmlFactory = schema;
return *this;
}
template<typename TYPE>
std::map<std::pair<const Serialize*, std::string>, TYPE*>&
mapName() const {
static std::map<std::pair<const Serialize*, std::string>, TYPE*> MAP;
return MAP;
}
template<typename TYPE> std::map<TYPE*, std::string>& mapMember() const {
static std::map<TYPE*, std::string> MAP;
return MAP;
}
template<typename TYPE> void fromNode(TYPE* member, xml::Node& node) {
*member = (TYPE)dynamic_cast<xml::String&>(node);
}
@@ -926,7 +905,7 @@ namespace xml {
ss<<*member;
node.text(ss.str());
}
std::map<std::string, const std::type_info*> _xmlNames;
std::map<std::string, boost::any> _xmlNames;
xml::Factory _xmlFactory;
};