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

STL

开发平台:

Visual C++

  1. /* vim: set tabstop=4 : */
  2. #ifndef __febird_io_DataIO_Version_h__
  3. #define __febird_io_DataIO_Version_h__
  4. #if defined(_MSC_VER) && (_MSC_VER >= 1020)
  5. # pragma once
  6. #endif
  7. #include "../stdtypes.h"
  8. //#include "var_int.h"
  9. #include <boost/strong_typedef.hpp>
  10. #include "../pass_by_value.h"
  11. namespace febird {
  12. BOOST_STRONG_TYPEDEF(uint32_t, serialize_version_t)
  13. //! 可以在 DATA_IO_VERSIONED_LOAD_SAVE 宏中使用
  14. //!
  15. //! 用来声明只序列化更高 version 的对象成员
  16. //! @see DataIO_version_manager::since
  17. //!
  18. template<class Class>
  19. class DataIO_since_version_proxy
  20. {
  21. unsigned int m_min_owner_version;
  22. unsigned int m_version;
  23. Class& m_object;
  24. public:
  25. DataIO_since_version_proxy(unsigned int min_owner_version, unsigned int loaded_owner_version, Class& object)
  26. : m_min_owner_version(min_owner_version)
  27. , m_version(loaded_owner_version)
  28. , m_object(object)
  29. {
  30. }
  31. template<class Input> friend void
  32. DataIO_loadObject(Input& input, DataIO_since_version_proxy x)
  33. {
  34. if (x.m_version >= x.m_min_owner_version)
  35. {
  36. input >> x.m_object;
  37. }
  38. }
  39. template<class Output> friend void 
  40. DataIO_saveObject(Output& output, const DataIO_since_version_proxy& x)
  41. {
  42. if (x.m_version >= x.m_min_owner_version)
  43. {
  44. output << x.m_object;
  45. }
  46. }
  47. };
  48. //! 可以在 DATA_IO_VERSIONED_LOAD_SAVE 宏中使用
  49. //!
  50. //! 当载入对象时,用来把 version 拷贝到成员
  51. //! @see DataIO_version_manager::get_version
  52. //!
  53. class DataIO_copy_version_proxy
  54. {
  55. uint32_t& m_version;
  56. uint32_t  m_loadedVersion;
  57. public:
  58. DataIO_copy_version_proxy(uint32_t& version, uint32_t loadedVersion)
  59. : m_version(version), m_loadedVersion(loadedVersion) {}
  60. template<class Input> friend void
  61. DataIO_loadObject(Input& input, DataIO_copy_version_proxy x)
  62. {
  63. x.m_version = x.m_loadedVersion;
  64. }
  65. template<class Output> friend void 
  66. DataIO_saveObject(Output& output, const DataIO_copy_version_proxy& x)
  67. {
  68. // ignore
  69. }
  70. };
  71. //! 可以在 DATA_IO_REG_LOAD_SAVE_V 宏中使用
  72. //!
  73. //! 用来在派生类中调用基类的 load(object, version)/save(object, version)
  74. //! 
  75. //! @see DataIO_version_manager::base_object
  76. template<class BaseClassPtr>
  77. class DataIO_base_class_version_load_save
  78. {
  79. BaseClassPtr m_base;
  80. unsigned int m_version;
  81. public:
  82. DataIO_base_class_version_load_save(BaseClassPtr pbase, unsigned int version)
  83. : m_base(pbase), m_version(version) {}
  84. template<class Input> friend void
  85. DataIO_loadObject(Input& input, DataIO_base_class_version_load_save x)
  86. {
  87. x.m_base->load(input, x.m_version);
  88. }
  89. template<class Output> friend void 
  90. DataIO_saveObject(Output& output, const DataIO_base_class_version_load_save& x)
  91. {
  92. x.m_base->save(output, x.m_version);
  93. }
  94. };
  95. //! 版本管理
  96. //!
  97. //! @see DATA_IO_REG_VERSION_SERIALIZE/DATA_IO_REG_LOAD_SAVE_V
  98. //!
  99. template<class ThisClass> class DataIO_version_manager
  100. {
  101. unsigned int m_version;
  102. public:
  103. DataIO_version_manager(unsigned int loaded_owner_version)
  104. : m_version(loaded_owner_version)
  105. {
  106. }
  107. template<class Class>
  108. pass_by_value<DataIO_since_version_proxy<Class> >
  109. since(unsigned int min_owner_version, Class& object)
  110. {
  111. return pass_by_value<DataIO_since_version_proxy<Class> >
  112. (DataIO_since_version_proxy<Class>(min_owner_version, m_version, object));
  113. }
  114. template<class Class>
  115. DataIO_since_version_proxy<const Class>
  116. since(unsigned int min_owner_version, const Class& object)
  117. {
  118. return DataIO_since_version_proxy<const Class>(min_owner_version, m_version, object);
  119. }
  120. pass_by_value<DataIO_copy_version_proxy>
  121. get_version(uint32_t& version)
  122. {
  123. return pass_by_value<DataIO_copy_version_proxy>
  124. (DataIO_copy_version_proxy(version, m_version));
  125. }
  126. //! version is const when save()
  127. DataIO_copy_version_proxy
  128. get_version(const uint32_t& version)
  129. {
  130. static uint32_t v2;
  131. return DataIO_copy_version_proxy(v2, m_version);
  132. }
  133. //! for loading
  134. template<class BaseClass>
  135. pass_by_value<DataIO_base_class_version_load_save<BaseClass*> >
  136. base_object(BaseClass* self)
  137. {
  138. return pass_by_value<DataIO_base_class_version_load_save<BaseClass*> >
  139. (DataIO_base_class_version_load_save<BaseClass*>(self, m_version));
  140. }
  141. //! for saving
  142. template<class BaseClass>
  143. DataIO_base_class_version_load_save<const BaseClass*>
  144. base_object(const BaseClass* self)
  145. {
  146. return DataIO_base_class_version_load_save<const BaseClass*>(self, m_version);
  147. }
  148. };
  149. } // namespace febird
  150. #endif // __febird_io_DataIO_Version_h__