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