Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #ifndef CLEAN_SERIALIZATOR_HPP_
00039 #define CLEAN_SERIALIZATOR_HPP_
00040 #include <boost/archive/detail/oserializer.hpp>
00041 #include <boost/archive/detail/iserializer.hpp>
00042 #include <boost/serialization/array.hpp>
00043 #include <boost/serialization/string.hpp>
00044 #include <boost/serialization/collections_save_imp.hpp>
00045
00052 #define PP_LABUST_CLEAN_ARRAY_OSERIALIZATOR_IMPL(CLASS_NAME) \
00053 namespace boost{namespace archive{namespace detail{ \
00054 template<> \
00055 struct save_array_type<CLASS_NAME> \
00056 { \
00057 template<class T> \
00058 static void invoke(CLASS_NAME &ar, const T &t){ \
00059 typedef BOOST_DEDUCED_TYPENAME boost::remove_extent< T >::type value_type; \
00060 boost::archive::save_access::end_preamble(ar); \
00061 std::size_t c = sizeof(t) / ( \
00062 static_cast<const char *>(static_cast<const void *>(&t[1])) \
00063 - static_cast<const char *>(static_cast<const void *>(&t[0])) \
00064 ); \
00065 boost::serialization::collection_size_type count(c); \
00066 ar << boost::serialization::make_array(static_cast<value_type const*>(&t[0]),count); \
00067 } \
00068 };}}};
00069
00076 #define PP_LABUST_CLEAN_ARRAY_ISERIALIZATOR_IMPL(CLASS_NAME) \
00077 namespace boost{namespace archive{namespace detail{ \
00078 template<> \
00079 struct load_array_type<CLASS_NAME> { \
00080 template<class T> \
00081 static void invoke(CLASS_NAME &ar, T &t){ \
00082 typedef BOOST_DEDUCED_TYPENAME remove_extent< T >::type value_type; \
00083 std::size_t current_count = sizeof(t) / ( \
00084 static_cast<char *>(static_cast<void *>(&t[1])) \
00085 - static_cast<char *>(static_cast<void *>(&t[0])) \
00086 ); \
00087 boost::serialization::collection_size_type count(current_count); \
00088 ar >> serialization::make_array(static_cast<value_type*>(&t[0]),count); \
00089 } \
00090 };\
00091 }}};\
00092
00093
00096 template <class Archive>
00097 void clean_string_serialize(Archive &ar, const std::string& s)
00098 {
00099 uint32_t size = s.size();
00100 for(int i=0; i<size; ++i) ar & s[i];
00101 }
00102
00103
00104 #endif