44 #include <boost/serialization/access.hpp> 
   45 #include <boost/serialization/export.hpp> 
   47 #include <boost/mpl/for_each.hpp> 
   48 #include <boost/mpl/remove_if.hpp> 
   49 #include <boost/serialization/nvp.hpp> 
   58 #include <boost/preprocessor/comma_if.hpp> 
   59 #include <boost/preprocessor/repeat.hpp> 
   60 #include <boost/preprocessor/inc.hpp> 
   61 #include <boost/preprocessor/cat.hpp> 
   62 #include <boost/preprocessor/tuple/to_seq.hpp> 
   78 namespace serialization {
 
   87         public wrapper_traits<const hrp< T > >
 
   94     explicit hrp(
const char * name_, T &t) :
 
   95         m_str(new std::string),
 
   96         m_name(name_), m_value(&t) {}
 
   98     const char * 
name()
 const {
 
  103     template<
class Archivex>
 
  104     void save( Archivex & ar, 
const unsigned int )
 const {
 
  112     template<
class Archivex>
 
  113     void load( Archivex & ar, 
const unsigned int ) {
 
  116     BOOST_SERIALIZATION_SPLIT_MEMBER()
 
  122 #ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING 
  130     boost::serialization::make_hrp(BOOST_PP_STRINGIZE(name), name) 
  156 #define _AR_OP(r,data,elem) data&BOOST_SERIALIZATION_BASE_OBJECT_NVP(elem); 
  158 #define NVP(data) BOOST_SERIALIZATION_NVP(data) 
  168 #ifdef ULIB_CFG_INTRUSIVE_SERIALIZATION_OBJECT 
  169 #  define ULIB_SERIALIZABLE_OBJECT        _ULIB_DETAIL_INTRUSIVE_SERIALIZABLE_OBJECT 
  170 #  define ULIB_SERIALIZE_OBJECT(_Ob,...)  _ULIB_DETAIL_INTRUSIVE_SERIALIZE_OBJECT(_Ob,__VA_ARGS__) 
  171 #  define _AR_(_name)                     _ULIB_DETAIL_INTRUSIVE_AR_(_name) 
  173 #  define ULIB_SERIALIZABLE(_Ob)           _ULIB_DETAIL_UNINTRUSIVE_SERIALIZABLE(_Ob) \ 
  174                                             ULIB_CLASS_EXPORT_KEY(_Ob) 
  175 #  define ULIB_SERIALIZE(_Ob,...)          _ULIB_DETAIL_UNINTRUSIVE_SERIALIZE(_Ob) 
  176 #  define ULIB_SERIALIZE_DERIVED(_Ob,...)  _ULIB_DETAIL_UNINTRUSIVE_SERIALIZE_DERIVED(_Ob,__VA_ARGS__) 
  177 #  define ULIB_SERIALIZABLE_OBJECT(_Ob)    _ULIB_DETAIL_UNINTRUSIVE_SERIALIZABLE_OBJECT(_Ob) \ 
  178                                             ULIB_CLASS_EXPORT_OBJECT_KEY(_Ob) 
  179 #  define ULIB_SERIALIZE_OBJECT(_Ob,...)   _ULIB_DETAIL_UNINTRUSIVE_SERIALIZE_OBJECT(_Ob,__VA_ARGS__) 
  180 #  define ULIB_SERIALIZE_OBJECT_PROPS(_Ob) _ULIB_DETAIL_UNINTRUSIVE_SERIALIZE_PROPS(_Ob) 
  181 #  define AR(_name)                        _ULIB_DETAIL_UNINTRUSIVE_AR_(_name) 
  182 #  define HR(_name)                        _ULIB_DETAIL_UNINTRUSIVE_AR_(_name) 
  186 #define ULIB_SERIALIZE_ACCESS                                        \ 
  187     friend class boost::serialization::access;                       \ 
  188     template <class T> friend class boost::serialization::access2; 
  190 #define ULIB_CLASS_EXPORT_KEY(_FullNamespaceClass)                   \ 
  191     BOOST_CLASS_EXPORT_KEY(_FullNamespaceClass) 
  193 #define ULIB_CLASS_EXPORT_OBJECT_KEY(_FullNamespaceClass)            \ 
  194     BOOST_CLASS_EXPORT_KEY(_FullNamespaceClass)                      \ 
  195     BOOST_CLASS_EXPORT_KEY(_FullNamespaceClass::ObjectProps)         \ 
  196     BOOST_CLASS_EXPORT_KEY(uLib::ObjectPropsImpl<_FullNamespaceClass>) 
  199 #define _SERIALIZE_IMPL_SEQ  \ 
  200     (uLib::Archive::text_iarchive) \ 
  201     (uLib::Archive::text_oarchive) \ 
  202     (uLib::Archive::hrt_iarchive)  \ 
  203     (uLib::Archive::hrt_oarchive)  \ 
  204     (uLib::Archive::xml_iarchive)  \ 
  205     (uLib::Archive::xml_oarchive)  \ 
  206     (uLib::Archive::log_archive) 
  210 #define _ULIB_DETAIL_SPECIALIZE_IS_VIRTUAL_BASE(_Base,_Derived)    namespace boost{ template<> struct is_virtual_base_of<_Base,_Derived>: public boost::mpl::true_ {}; } 
  211 #define _ULIB_DETAIL_SPECIALIZE_IS_VIRTUAL_BASE_OP(r,data,elem) _ULIB_DETAIL_SPECIALIZE_IS_VIRTUAL_BASE(elem,data) 
  223 #define _ULIB_DETAIL_INTRUSIVE_AR_(name) ar & BOOST_SERIALIZATION_NVP(name); 
  225 #define _ULIB_DETAIL_INTRUSIVE_SERIALIZE_FUNC(Class,Archive) \ 
  226     template void Class::serialize(Archive &ar,const unsigned int); 
  228 #define _ULIB_DETAIL_INTRUSIVE_SERIALIZE_FUNC_OP(r,data,elem) _ULIB_DETAIL_INTRUSIVE_SERIALIZE_FUNC(data,elem); 
  230 #define _ULIB_DETAIL_INTRUSIVE_SERIALIZABLE_OBJECT \ 
  231     typedef boost::mpl::bool_<true> serializable;                                                \ 
  232     typedef boost::mpl::remove_if< TypeList, IsUnSerializable >::type SerilizableTypeList;       \ 
  233     void PrintSerializableListId() { boost::mpl::for_each<SerilizableTypeList>(PrintTypeId()); } \ 
  234     template <class ArchiveT> void serialize(ArchiveT &ar,const unsigned int version);           \ 
  235     template <class ArchiveT> void serialize_parents(ArchiveT &ar,const unsigned int version);   \ 
  236     template <class ArchiveT> void save_override(ArchiveT &ar,const unsigned int version); 
  238 #define _ULIB_DETAIL_INTRUSIVE_SERIALIZE_OBJECT(_Ob,...) \ 
  239     template <class ArchiveT> void _Ob::serialize(ArchiveT &ar, const unsigned int version) { \ 
  240     boost::serialization::void_cast_register<_Ob,_Ob::BaseClass>(static_cast<_Ob *>(NULL),static_cast<_Ob::BaseClass *>(NULL));   \ 
  241     _Ob::serialize_parents(ar,version); \ 
  242     _Ob::save_override(ar,version); }\ 
  243     template <class ArchiveT> void _Ob::serialize_parents(ArchiveT &ar, const unsigned int v) { \ 
  244     BOOST_PP_SEQ_FOR_EACH(_AR_OP,ar,BOOST_PP_TUPLE_TO_SEQ((__VA_ARGS__))); } \ 
  245     BOOST_PP_SEQ_FOR_EACH(_ULIB_DETAIL_INTRUSIVE_SERIALIZE_FUNC_OP,_Ob,_SERIALIZE_IMPL_SEQ)\ 
  246     BOOST_PP_SEQ_FOR_EACH(_ULIB_DETAIL_SPECIALIZE_IS_VIRTUAL_BASE_OP,_Ob,BOOST_PP_TUPLE_TO_SEQ((__VA_ARGS__))) \ 
  247     ULIB_CLASS_EXPORT_IMPLEMENT(_Ob) \ 
  249     namespace serialization { \ 
  250     template<class ArchiveT> inline void load_construct_data(ArchiveT & ar, _Ob *o, const unsigned int file_version) \ 
  251     { ::new(o)_Ob(); o->init_parameters(); } }}\ 
  252     template <class ArchiveT> void _Ob::save_override(ArchiveT &ar, const unsigned int version) 
  264 #define _UNAR_OP(r,data,elem) ar&boost::serialization::make_nvp(BOOST_PP_STRINGIZE(elem),boost::serialization::base_object<elem>(ob)); 
  266 #define _ULIB_DETAIL_UNINTRUSIVE_SERIALIZE_FUNC(Class,Archive) \ 
  267     template void boost::serialization::serialize(Archive &ar, Class &ob, const unsigned int i); 
  269 #define _ULIB_DETAIL_UNINTRUSIVE_SERIALIZE_FUNC_OP(r,data,elem) _ULIB_DETAIL_UNINTRUSIVE_SERIALIZE_FUNC(data,elem) 
  275 #define _ULIB_DETAIL_UNINTRUSIVE_SERIALIZABLE(_Ob) \ 
  276     namespace boost { namespace serialization { \ 
  277     template <class ArchiveT> void serialize         (ArchiveT &ar, _Ob &ob, const unsigned int version); \ 
  278     template <class ArchiveT> void serialize_parents (ArchiveT &ar, _Ob &ob, const unsigned int version); \ 
  279     template <> struct access2< _Ob > { template <class ArchiveT> static void save_override (ArchiveT &ar, _Ob &ob, const unsigned int version); }; }} 
  281 #define _ULIB_DETAIL_UNINTRUSIVE_SERIALIZE(_Ob) \ 
  282     namespace boost { namespace serialization { \ 
  283     template <class ArchiveT> void serialize_parents(ArchiveT &ar, _Ob &ob, const unsigned int v) {} \ 
  284     template <class ArchiveT> void serialize  (ArchiveT &ar, _Ob &ob, const unsigned int version) { \ 
  285     serialize_parents(ar,ob,version);  \ 
  286     access2< _Ob >::save_override(ar,ob,version); } }}\ 
  287     ULIB_CLASS_EXPORT_IMPLEMENT(_Ob) \ 
  288     BOOST_PP_SEQ_FOR_EACH(_ULIB_DETAIL_UNINTRUSIVE_SERIALIZE_FUNC_OP,_Ob,_SERIALIZE_IMPL_SEQ)\ 
  289     template <class ArchiveT> void boost::serialization::access2< _Ob >::save_override(ArchiveT &ar, _Ob &ob, const unsigned int version) 
  291 #define _ULIB_DETAIL_UNINTRUSIVE_SERIALIZE_DERIVED(_Ob,...) \ 
  292     namespace boost { namespace serialization { \ 
  293     template <class ArchiveT> void serialize_parents(ArchiveT &ar, _Ob &ob, const unsigned int v) { \ 
  294     BOOST_PP_IF(BOOST_PP_VARIADIC_SIZE((__VA_ARGS__)),BOOST_PP_SEQ_FOR_EACH(_UNAR_OP,ob,BOOST_PP_TUPLE_TO_SEQ((__VA_ARGS__)));,) } \ 
  295     template <class ArchiveT> void serialize  (ArchiveT &ar, _Ob &ob, const unsigned int version) { \ 
  296     serialize_parents(ar,ob,version);  \ 
  297     access2< _Ob >::save_override    (ar,ob,version); } }}\ 
  298     ULIB_CLASS_EXPORT_IMPLEMENT(_Ob) \ 
  299     BOOST_PP_SEQ_FOR_EACH(_ULIB_DETAIL_UNINTRUSIVE_SERIALIZE_FUNC_OP,_Ob,_SERIALIZE_IMPL_SEQ) \ 
  300     BOOST_PP_SEQ_FOR_EACH(_ULIB_DETAIL_SPECIALIZE_IS_VIRTUAL_BASE_OP,_Ob,BOOST_PP_TUPLE_TO_SEQ((__VA_ARGS__))) \ 
  301     template <class ArchiveT> void boost::serialization::access2< _Ob >::save_override(ArchiveT &ar, _Ob &ob, const unsigned int version) 
  304 #define _ULIB_DETAIL_UNINTRUSIVE_SERIALIZABLE_OBJECT(_Ob) \ 
  305     namespace boost { namespace serialization { \ 
  306     template <class ArchiveT> void serialize         (ArchiveT &ar, _Ob &ob, const unsigned int version); \ 
  307     template <class ArchiveT> void serialize_parents (ArchiveT &ar, _Ob &ob, const unsigned int version); \ 
  308     template <> struct access2< _Ob > { template <class ArchiveT> static void save_override (ArchiveT &ar, _Ob &ob, const unsigned int version); }; \ 
  309     template <class ArchiveT> void serialize         (ArchiveT &ar, class _Ob::ObjectProps &ob, const unsigned int version); \ 
  310     template <class ArchiveT> void save_override     (ArchiveT &ar, class _Ob::ObjectProps &ob, const unsigned int version); }} 
  312 #define _ULIB_DETAIL_UNINTRUSIVE_SERIALIZE_OBJECT(_Ob,...) \ 
  313     namespace boost { namespace serialization { \ 
  314     template <class ArchiveT> void serialize_parents(ArchiveT &ar, _Ob &ob, const unsigned int v) { \ 
  315      BOOST_PP_SEQ_FOR_EACH(_UNAR_OP,ob,BOOST_PP_TUPLE_TO_SEQ((__VA_ARGS__))); \ 
  317     template<class ArchiveT> inline void load_construct_data(ArchiveT & ar, _Ob *ob, const unsigned int file_version) { \ 
  318     ::new(ob)_Ob(); uLib::detail::ObjectProps::initializer::init_object(ob); } \ 
  319     template <class ArchiveT> void serialize  (ArchiveT &ar, _Ob &ob, const unsigned int version) { \ 
  320     void_cast_register<_Ob,_Ob::BaseClass>(static_cast<_Ob *>(NULL),static_cast<_Ob::BaseClass *>(NULL));   \ 
  321     serialize_parents(ar,ob,version);  \ 
  322     access2< _Ob >::save_override    (ar,ob,version); } }}\ 
  323     ULIB_CLASS_EXPORT_IMPLEMENT(_Ob) \ 
  324     BOOST_PP_SEQ_FOR_EACH(_ULIB_DETAIL_SPECIALIZE_IS_VIRTUAL_BASE_OP,_Ob,BOOST_PP_TUPLE_TO_SEQ((__VA_ARGS__))) \ 
  325     BOOST_PP_SEQ_FOR_EACH(_ULIB_DETAIL_UNINTRUSIVE_SERIALIZE_FUNC_OP,_Ob,_SERIALIZE_IMPL_SEQ)\ 
  326     template <class ArchiveT> void boost::serialization::access2< _Ob >::save_override(ArchiveT &ar, _Ob &ob, const unsigned int version) 
  328 #define _ULIB_DETAIL_UNINTRUSIVE_SERIALIZE_PROPS(_Ob) \ 
  329     namespace boost { namespace serialization { \ 
  330     template <class ArchiveT> void serialize  (ArchiveT &ar, _Ob::ObjectProps &ob, const unsigned int version) { \ 
  331     save_override    (ar,ob,version); } }}\ 
  332     BOOST_PP_SEQ_FOR_EACH(_ULIB_DETAIL_UNINTRUSIVE_SERIALIZE_FUNC_OP,_Ob::ObjectProps,_SERIALIZE_IMPL_SEQ)\ 
  333     ULIB_CLASS_EXPORT_IMPLEMENT(_Ob::ObjectProps) \ 
  334     ULIB_CLASS_EXPORT_IMPLEMENT(uLib::ObjectPropsImpl<_Ob>) \ 
  335     template <class ArchiveT> void boost::serialization::save_override(ArchiveT &ar, _Ob::ObjectProps &ob, const unsigned int version) 
  338 #define _ULIB_DETAIL_UNINTRUSIVE_AR_(name) boost::serialization::make_nvp(BOOST_PP_STRINGIZE(name),ob.name) 
  372     template <
class ThisClass, 
class Archive>
 
  378             m_ar & boost::serialization::make_nvp(
 
  380                         boost::serialization::base_object<T>(
m_object));
 
  412 #endif // U_SERIALIZABLE_H 
const char * name() const 
Definition: Serializable.h:98
serialize_baseobject(ThisClass &o, Archive &ar)
Definition: Serializable.h:376
Definition: Serializable.h:370
void operator()(T &o)
Definition: Serializable.h:377
Definition: Serializable.h:81
Definition: Serializable.h:356
const hrp< T > make_hrp(const char *name, T &t)
Definition: Serializable.h:125
Archive & m_ar
Definition: Serializable.h:375
virtual ~Serializable()
Definition: Serializable.h:397
void save(Archivex &ar, const unsigned int) const 
Definition: Serializable.h:104
void load(Archivex &ar, const unsigned int)
Definition: Serializable.h:113
Definition: Serializable.h:373
Definition: Serializable.h:394
friend class boost::serialization::access
Definition: Serializable.h:395
hrp(const char *name_, T &t)
Definition: Serializable.h:94
ThisClass & m_object
Definition: Serializable.h:374
Definition: Serializable.h:364
Definition: Archives.h:87