#ifndef INCLUDE_SF_SERIALIZEPARENT_HPP
#define INCLUDE_SF_SERIALIZEPARENT_HPP
#include <boost/serialization/base_object.hpp>
#include <SF/Archive.hpp>
#include <SF/SerializePolymorphic.hpp>
namespace SF {
template<typename Archive, typename Base, typename Derived>
class SerializeParent
{
public:
void operator()(Archive &ar, Derived &derived) const
{
ar & boost::serialization::base_object<Base>(derived);
}
};
template<typename Base, typename Derived>
class SerializeParent<SF::Archive, Base, Derived>
{
public:
void operator()(SF::Archive &ar, Derived &derived) const
{
SF::SerializerPolymorphic<Base,Derived>::instantiate();
ar & SF::Archive::PARENT & static_cast<Base &>(derived);
}
};
} // namespace SF
template<typename Base, typename Archive, typename Derived>
void serializeParent(Archive &ar, Derived &derived)
{
SF::SerializeParent<Archive, Base, Derived>()(ar, derived);
}
namespace SF {
template<typename Archive, typename Base, typename Derived>
class MyFunc
{
public:
void operator()(Archive &ar, Derived &derived) const
{
ar & boost::serialization::base_object<Base>(derived);
}
};
template<typename Base, typename Derived>
class MyFunc<SF::Archive, Base, Derived>
{
public:
void operator()(SF::Archive &ar, Derived &derived) const
{
SF::SerializerPolymorphic<Base,Derived>::instantiate();
ar & SF::Archive::PARENT & static_cast<Base &>(derived);
}
};
}
template<typename Base, typename Archive, typename Derived>
void myfunc(Archive &ar, Derived &derived)
{
//ar & boost::serialization::base_object<Base>(derived);
//MyFunc<Archive, Base, Derived> m;
//m.func(ar, derived);
//MyFunc<Archive, Base, Derived>().func(ar, derived);
//MyFunc<Archive, Base, Derived>()(ar, derived);
//SF::SerializeParent<Archive, Base, Derived>()(ar, derived);
SF::MyFunc<Archive, Base, Derived>()(ar, derived);
}
#endif // ! INCLUDE_SF_SERIALIZEPARENT_HPP