DataIO.h
上传用户:kx_jwh
上传日期:2021-09-03
资源大小:76k
文件大小:8k
源码类别:

STL

开发平台:

Visual C++

  1. /* vim: set tabstop=4 : */
  2. #ifndef __febird_io_DataIO_h__
  3. #define __febird_io_DataIO_h__
  4. #if defined(_MSC_VER) && (_MSC_VER >= 1020)
  5. # pragma once
  6. #endif
  7. #include "DataInput.h"
  8. #include "DataOutput.h"
  9. #ifndef BOOST_INTRUSIVE_PTR_HPP_INCLUDED
  10. #  include <boost/intrusive_ptr.hpp>
  11. #endif
  12. #ifndef BOOST_SCOPED_PTR_HPP_INCLUDED
  13. #  include <boost/scoped_ptr.hpp>
  14. #endif
  15. #ifndef BOOST_SHARED_PTR_HPP_INCLUDED
  16. #  include <boost/shared_ptr.hpp>
  17. #endif
  18. namespace febird {
  19. //////////////////////////////////////////////////////////////////////////
  20. DataIO_IsDump_TypeTrue2(LittleEndianNoVarInt, var_uint16_t)
  21. DataIO_IsDump_TypeTrue2(LittleEndianNoVarInt, var_uint32_t)
  22. DataIO_IsDump_TypeTrue2(LittleEndianNoVarInt, var_uint64_t)
  23. DataIO_IsDump_TypeTrue2(LittleEndianNoVarInt, var_int16_t)
  24. DataIO_IsDump_TypeTrue2(LittleEndianNoVarInt, var_int32_t)
  25. DataIO_IsDump_TypeTrue2(LittleEndianNoVarInt, var_int64_t)
  26. DataIO_IsDump_TypeTrue2(PortableNoVarInt, var_uint16_t)
  27. DataIO_IsDump_TypeTrue2(PortableNoVarInt, var_uint32_t)
  28. DataIO_IsDump_TypeTrue2(PortableNoVarInt, var_uint64_t)
  29. DataIO_IsDump_TypeTrue2(PortableNoVarInt, var_int16_t)
  30. DataIO_IsDump_TypeTrue2(PortableNoVarInt, var_int32_t)
  31. DataIO_IsDump_TypeTrue2(PortableNoVarInt, var_int64_t)
  32. // use template, only when use the member, it will instantiate the template
  33. // this trick will avoid 'no default construct' compile error
  34. #if 0
  35. #define DATA_IO_DYNA_CREATE(Class) 
  36. template<class Dummy> static Class* newInstance() { return new Class; }
  37. #else
  38. #define DATA_IO_DYNA_CREATE(Class)
  39. #endif
  40. /**
  41.  @{
  42.  @brief 同时声明 load/save
  43.  */
  44. #define DATA_IO_REG_LOAD_SAVE(Class) 
  45. DATA_IO_DYNA_CREATE(Class)
  46. DATA_IO_REG_LOAD(Class)
  47. DATA_IO_REG_SAVE(Class)
  48. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  49. #define DATA_IO_REG_LOAD_SAVE_V(Class, CurrentVersion) 
  50. DATA_IO_DYNA_CREATE(Class)
  51. DATA_IO_REG_LOAD_V(Class, CurrentVersion)
  52. DATA_IO_REG_SAVE_V(Class, CurrentVersion)
  53. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  54. //@}
  55. #define DATA_IO_IDENTITY(x) x
  56. //!@{
  57. //! can be used by code generator!!
  58. //
  59. #define DATA_IO_LOAD_SAVE(Class, Members)
  60. template<class DataIO> void load(DataIO& aDataIO)     { aDataIO Members; }
  61. template<class DataIO> void save(DataIO& aDataIO) const { aDataIO Members; }
  62. DATA_IO_OPTIMIZE_ELEMEN_LOAD(DATA_IO_IDENTITY, Class, Members)
  63. DATA_IO_OPTIMIZE_ELEMEN_SAVE(DATA_IO_IDENTITY, Class, Members)
  64. DATA_IO_OPTIMIZE_VECTOR_LOAD(Class, Class, Members) 
  65. DATA_IO_OPTIMIZE_VECTOR_SAVE(Class, Class, Members) 
  66. DATA_IO_OPTIMIZE_ARRAY_LOAD(Class, Class, Members) 
  67. DATA_IO_OPTIMIZE_ARRAY_SAVE(Class, Class, Members) 
  68. DATA_IO_REG_LOAD(Class)
  69. DATA_IO_REG_SAVE(Class)
  70. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  71. //@}
  72. //!@{
  73. //
  74. #define DATA_IO_LOAD_SAVE_E(Class, Members)
  75.   class Class##_fdio : public Class
  76.   {
  77. template<class DataIO> void load(DataIO& aDataIO)     { aDataIO Members; }
  78. template<class DataIO> void save(DataIO& aDataIO) const { aDataIO Members; }
  79. DATA_IO_OPTIMIZE_ELEMEN_LOAD(static_cast<Class##_fdio&>, Class, Members)
  80. DATA_IO_OPTIMIZE_ELEMEN_SAVE(static_cast<const Class##_fdio&>, Class, Members)
  81. DATA_IO_OPTIMIZE_VECTOR_LOAD(Class##_fdio, Class, Members) 
  82. DATA_IO_OPTIMIZE_VECTOR_SAVE(Class##_fdio, Class, Members) 
  83. DATA_IO_OPTIMIZE_ARRAY_LOAD(Class##_fdio, Class, Members) 
  84. DATA_IO_OPTIMIZE_ARRAY_SAVE(Class##_fdio, Class, Members) 
  85. template<class DataIO> friend
  86. void DataIO_loadObject(DataIO& dio, Class& x)
  87. {
  88. static_cast<Class##_fdio&>(x).load(dio);
  89. }
  90. template<class DataIO> friend
  91. void DataIO_saveObject(DataIO&dio,const Class&x)
  92. {
  93. static_cast<const Class##_fdio&>(x).save(dio);
  94. }
  95. DATA_IO_REG_LOAD(Class##_fdio)
  96. DATA_IO_REG_SAVE(Class##_fdio)
  97.   };
  98. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  99. //@}
  100. /**
  101.  @{
  102.  @name versioned_serialization
  103.  
  104.  can easily use:
  105.   DATA_IO_LOAD_SAVE_V(Class, member1 & vmg.since(20, member2) & member3 & vmg.get_version(version))
  106.   - 'vmg.since(20, member2)' means member2 will be serialized only when Class's version large or equal than 20
  107.   - 'vmg.get_version(version)' will copy version to Class's member 'version'
  108.  */
  109. #define DATA_IO_GEN_LOAD_SAVE_V(Class, Members)
  110. template<class DataIO> void
  111. load(DataIO& aDataIO, unsigned _U_version)
  112. {
  113. febird::DataIO_version_manager<Class> vmg(_U_version);
  114. aDataIO Members;
  115. }
  116. template<class DataIO> void
  117. save(DataIO& aDataIO, unsigned _U_version) const
  118. {
  119. febird::DataIO_version_manager<Class> vmg(_U_version);
  120. aDataIO Members;
  121. }
  122. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  123. //!@{
  124. #define DATA_IO_LOAD_SAVE_V(Class, CurrentVersion, Members)
  125. DATA_IO_GEN_LOAD_SAVE_V(Class, Members)
  126. DATA_IO_REG_LOAD_SAVE_V(Class, CurrentVersion)
  127. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  128. //@}
  129. //!@{
  130. #define DATA_IO_LOAD_SAVE_EV(Class, CurrentVersion, Members)
  131.   class Class##_fdio : public Class
  132.   {
  133. DATA_IO_GEN_LOAD_SAVE_V(Class##_fdio, Members)
  134. template<class DataIO> friend 
  135. void DataIO_loadObject(DataIO& dio, Class& x)
  136. {
  137. static_cast<Class##_fdio&>(x).load(dio,
  138. DataIO_load_check_version(
  139. dio, CurrentVersion, BOOST_STRINGIZE(Class)));
  140. }
  141. template<class DataIO> friend 
  142. void DataIO_saveObject(DataIO& dio, const Class& x)
  143. {
  144. dio << febird::serialize_version_t(CurrentVersion);
  145. static_cast<const Class##_fdio&>(x)
  146. .save(dio, CurrentVersion);
  147. }
  148.   };
  149. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  150. //@}
  151. #define DATA_IO_DISABLE_LOAD_SAVE(Class) 
  152. DATA_IO_DISABLE_LOAD(Class) 
  153. DATA_IO_DISABLE_SAVE(Class)
  154. //////////////////////////////////////////////////////////////////////////////////////////
  155. /*
  156. #define Gen_DataIO_IsDump_True(Class) 
  157.   template<class DataIO> inline boost::mpl::true_
  158.   DataIO_IsDump(DataIO*, Class* ) { return boost::mpl::true_(); }
  159. */
  160. //! must be called in global namespace
  161. //! Class will be simply dump read/write
  162. //! called by operator& operator<< operator>>
  163. #define DATA_IO_DUMP_RAW_MEM(Class)
  164.   namespace febird {
  165. template<class Input>
  166. void DataIO_loadObject(Input& in, Class& x)
  167. {
  168. in.ensureRead(&x, sizeof(Class));
  169. }
  170. template<class Output>
  171. void DataIO_saveObject(Output& out, const Class& x)
  172. {
  173. out.ensureWrite(&x, sizeof(Class));
  174. }
  175. template<> struct DataIO_need_bswap<Class>
  176. : public boost::mpl::bool_<false> {};
  177. template<class DataIO>
  178. struct DataIO_is_dump<DataIO, Class>
  179. : public boost::mpl::bool_<true> {};
  180.   } /* namespace febird */
  181. // DataIO_IsDump_TypeTrue1(Class)
  182. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  183. //! define an input/output object of stream
  184. //!
  185. //! @param dio_t obj type of input/output
  186. //! @param dio_v obj name of input/output
  187. //! @param stream stream which you want to trait as input/output object
  188. //! 
  189. //! @note
  190. //!  -# template expression of dio_t must has not any comma(',')
  191. //!  -# now all dio_t take a stream(not a stream*) has no extra member
  192. //!     so it is safe to trait a stream as such a dio_t
  193. //!  -# but must assert sizeof(dio_t) == sizeof(stream)
  194. //!     if I add dynamic load/save polymorphic object future, this would need
  195. //!     dynamic type list in an input/output object, so can not trait stream
  196. //!     as such input/output object, the static_assert is needable
  197. //!
  198. #define DATA_IO_DEFINE_REF(dio_t, dio_v, stream) 
  199. dio_t& dio_v = static_cast<dio_t&>(stream); 
  200. BOOST_STATIC_ASSERT(sizeof(dio_t) == sizeof(stream))
  201. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  202. } // namespace febird
  203. #endif // __febird_io_DataIO_h__