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

STL

开发平台:

Visual C++

  1. /* vim: set tabstop=4 : */
  2. #ifndef __febird_io_DataIO_Basic_h__
  3. #define __febird_io_DataIO_Basic_h__
  4. #if defined(_MSC_VER) && (_MSC_VER >= 1020)
  5. # pragma once
  6. #endif
  7. #include <utility>
  8. #ifndef BOOST_INTRUSIVE_PTR_HPP_INCLUDED
  9. #  include <boost/intrusive_ptr.hpp>
  10. #endif
  11. #ifndef BOOST_SCOPED_PTR_HPP_INCLUDED
  12. #  include <boost/scoped_ptr.hpp>
  13. #endif
  14. #ifndef BOOST_SHARED_PTR_HPP_INCLUDED
  15. #  include <boost/shared_ptr.hpp>
  16. #endif
  17. #if BOOST_VERSION < 103301
  18. # include <boost/limits.hpp>
  19. # include <boost/detail/limits.hpp>
  20. #else
  21. # include <boost/detail/endian.hpp>
  22. #endif
  23. #include <boost/cstdint.hpp>
  24. #include <boost/mpl/bool.hpp>
  25. #include "var_int.h"
  26. //#include <boost/type_traits/detail/bool_trait_def.hpp>
  27. namespace febird {
  28. //////////////////////////////////////////////////////////////////////////
  29. #ifdef BOOST_LITTLE_ENDIAN
  30. #define DATA_IO_BSWAP_FOR_BIG(T)    typename DataIO_need_bswap<T>::type
  31. #define DATA_IO_BSWAP_FOR_LITTLE(T) boost::mpl::false_
  32. #elif defined(BOOST_BIG_ENDIAN)
  33. #define DATA_IO_BSWAP_FOR_BIG(T)    boost::mpl::false_
  34. #define DATA_IO_BSWAP_FOR_LITTLE(T) typename DataIO_need_bswap<T>::type
  35. #else
  36. #error "must define BOOST_LITTLE_ENDIAN or BOOST_BIG_ENDIAN"
  37. #endif
  38. #if 0
  39. BOOST_TT_AUX_BOOL_TRAIT_DEF2(DataIO_is_dump, DataIO, T, false)
  40. #define DataIO_IsDump_TypeTrue1(T) 
  41. BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_1(class DataIO, DataIO_is_dump, DataIO, T, true)
  42. #define DataIO_IsDump_TypeTrue2(ByteOrder, T) 
  43. BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_1(class Stream, DataIO_is_dump, ByteOrder##Input<Stream>, T, true) 
  44. BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_1(class Stream, DataIO_is_dump, ByteOrder##Output<Stream>, T, true)
  45. // support std::pair
  46. // same as expand of BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_1
  47. // because one macro arg can not take unparented ','
  48. template<class DataIO, class X, class Y>
  49. struct DataIO_is_dump<DataIO, std::pair<X,Y> >
  50. BOOST_TT_AUX_BOOL_C_BASE((DataIO_is_dump<DataIO, X>::value && DataIO_is_dump<DataIO, Y>::value) && sizeof(std::pair<X,Y>) == sizeof(X) + sizeof(Y))
  51. {
  52.     BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL((DataIO_is_dump<DataIO, X>::value && DataIO_is_dump<DataIO, Y>::value) && sizeof(std::pair<X,Y>) == sizeof(X) + sizeof(Y))
  53. };
  54. #endif
  55. //! default false
  56. template<class DataIO, class T>
  57. struct DataIO_is_dump : public ::boost::mpl::false_
  58. {
  59. };
  60. #if defined(FEBIRD_DATA_IO_DISABLE_OPTIMIZE_DUMPABLE)
  61. #define DataIO_IsDump_TypeTrue1(T)
  62. #define DataIO_IsDump_TypeTrue2(ByteOrder, T)
  63. #else
  64. #define DataIO_IsDump_TypeTrue1(T) 
  65. template<class DataIO> struct DataIO_is_dump<DataIO, T> : public ::boost::mpl::true_ {};
  66. #define DataIO_IsDump_TypeTrue2(ByteOrder, T)
  67. template<class Stream>
  68. struct DataIO_is_dump<ByteOrder##Input<Stream>, T>
  69. : public ::boost::mpl::true_ {};
  70. template<class Stream>
  71. struct DataIO_is_dump<ByteOrder##Output<Stream>, T>
  72. : public ::boost::mpl::true_ {};
  73. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  74. #endif // FEBIRD_DATA_IO_DISABLE_OPTIMIZE_DUMPABLE
  75. DataIO_IsDump_TypeTrue1(float)
  76. DataIO_IsDump_TypeTrue1(double)
  77. DataIO_IsDump_TypeTrue1(long double)
  78. DataIO_IsDump_TypeTrue1(char)
  79. DataIO_IsDump_TypeTrue1(signed char)
  80. DataIO_IsDump_TypeTrue1(unsigned char)
  81. DataIO_IsDump_TypeTrue1(short)
  82. DataIO_IsDump_TypeTrue1(unsigned short)
  83. DataIO_IsDump_TypeTrue1(int)
  84. DataIO_IsDump_TypeTrue1(unsigned int)
  85. DataIO_IsDump_TypeTrue1(long)
  86. DataIO_IsDump_TypeTrue1(unsigned long)
  87. #if defined(BOOST_HAS_LONG_LONG)
  88. DataIO_IsDump_TypeTrue1(long long)
  89. DataIO_IsDump_TypeTrue1(unsigned long long)
  90. #elif defined(BOOST_HAS_MS_INT64)
  91. DataIO_IsDump_TypeTrue1(__int64)
  92. DataIO_IsDump_TypeTrue1(unsigned __int64)
  93. #endif
  94. // support std::pair
  95. template<class DataIO, class X, class Y>
  96. struct DataIO_is_dump<DataIO, std::pair<X,Y> > :
  97. public ::boost::mpl::bool_<DataIO_is_dump<DataIO, X>::value &&
  98.    DataIO_is_dump<DataIO, Y>::value &&
  99.    sizeof(std::pair<X,Y>) == sizeof(X)+sizeof(Y)>
  100. {
  101. };
  102. template<class DataIO, class T, int Dim>
  103. struct DataIO_is_dump<DataIO, T[Dim]> : public DataIO_is_dump<DataIO, T>::type
  104. {
  105. };
  106. template<class DataIO, class T, int Dim>
  107. struct DataIO_is_dump<DataIO, const T[Dim]> : public DataIO_is_dump<DataIO, T>::type
  108. {
  109. };
  110. //////////////////////////////////////////////////////////////////////////
  111. template<class DataIO, class Outer, int Size, bool Dumpable>
  112. struct DataIO_is_realdump
  113. {
  114. BOOST_STATIC_CONSTANT(int, size = Size);
  115. typedef boost::mpl::bool_<Dumpable> is_dump;
  116. #if (defined(_DEBUG) || !defined(NDEBUG)) && !defined(DATA_IO_DONT_CHECK_REAL_DUMP)
  117. const Outer* address;
  118. const char*  prev_member;
  119. DataIO_is_realdump(const Outer* p, const void* prev_member)
  120. : address(p), prev_member((const char*)prev_member) {}
  121. DataIO_is_realdump(const Outer* p)
  122. : address(p), prev_member((const char*)p) {}
  123. #else
  124. DataIO_is_realdump(const Outer*, const void* = 0) {}
  125. #endif
  126. #if (defined(_DEBUG) || !defined(NDEBUG)) && !defined(DATA_IO_DONT_CHECK_REAL_DUMP)
  127. template<class T>
  128. void check_member_order(const T& x, ::boost::mpl::true_)
  129. {
  130. // if member declaration order of &a&b&c&d is different with where they defined in class
  131. // here will raise an assertion fail
  132. //
  133. // 如果成员序列化声明的顺序 &a&b&c&d 和它们在类中定义的顺序不同
  134. // 这里会引发一个断言
  135. // 如果序列化了一个非类的成员(比如 &a&b&c&d 中可能一个标识符引用了不是雷成员的某个变量),也会引发断言
  136. assert((const char*)&x >= (const char*)address);
  137. assert((const char*)&x <= (const char*)address + sizeof(Outer) - sizeof(T));
  138. if (prev_member != (const char*)address)
  139. assert(prev_member < (const char*)&x);
  140. }
  141. template<class T>
  142. void check_member_order(const T&, ::boost::mpl::false_)
  143. {
  144. }
  145. #endif
  146. template<class T>
  147. DataIO_is_realdump<DataIO, Outer, Size+sizeof(T), boost::mpl::bool_<Dumpable && DataIO_is_dump<DataIO, T>::value>::value>
  148. operator&(const T& x)
  149. {
  150. typedef DataIO_is_realdump<DataIO, Outer, Size+sizeof(T), boost::mpl::bool_<Dumpable && DataIO_is_dump<DataIO, T>::value>::value> ret_t;
  151. #if (defined(_DEBUG) || !defined(NDEBUG)) && !defined(DATA_IO_DONT_CHECK_REAL_DUMP)
  152. check_member_order(x, ::boost::mpl::bool_<Dumpable && DataIO_is_dump<DataIO, T>::value>());
  153. return ret_t(address, &x);
  154. #else
  155. return ret_t(NULL);
  156. #endif
  157. }
  158. /*
  159. template<class T, int Dim>
  160. DataIO_is_realdump<DataIO, Outer, Size+sizeof(T)*Dim, boost::mpl::bool_<Dumpable && DataIO_is_dump<DataIO, T>::value>::value>
  161. operator&(const T (&x)[Dim])
  162. {
  163. typedef DataIO_is_realdump<DataIO, Outer, Size+sizeof(T)*Dim, boost::mpl::bool_<Dumpable && DataIO_is_dump<DataIO, T>::value>::value> ret_t;
  164. #if (defined(_DEBUG) || !defined(NDEBUG)) && !defined(DATA_IO_DONT_CHECK_REAL_DUMP)
  165. check_member_order(x, ::boost::mpl::bool_<Dumpable && DataIO_is_dump<DataIO, T>::value>());
  166. return ret_t(address, &x);
  167. #else
  168. return ret_t(NULL);
  169. #endif
  170. }
  171. */
  172. };
  173. // if not real_dumpable, then DataIO_is_dump must be false
  174. // if not real_dumpable, and  DataIO_is_dump is true, this is an error,
  175. // this error maybe caused by user defined a custom DataIO_is_dump trait
  176. //
  177. // if real_dumpable, DataIO_is_dump can be any, because '&' operator can not deduce DataIO_is_dump
  178. #define DATA_IO_OPT_TRAITS_VERIFY(DataIO, T, Real_Dumpable) 
  179. BOOST_STATIC_ASSERT(Real_Dumpable::value 
  180. || !Real_Dumpable::value && !(DataIO_is_dump<DataIO, T>::value))
  181. //////////////////////////////////////////////////////////////////////////////////////
  182. #define DATA_IO_BASE_IO(Self, Prefix, VarIntPrefix, IO, Stream) 
  183. Data##IO<CommonString##IO< 
  184. Prefix##String##IO< 
  185. BinFloat##IO< 
  186. VarIntPrefix##IO< 
  187. Prefix##Integer##IO<Stream, Self<Stream> >, 
  188. Self<Stream> >, 
  189. Self<Stream> >, 
  190. Self<Stream> >, 
  191. Self<Stream> >, 
  192. Self<Stream> >
  193. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  194. } // namespace febird
  195. //#include <boost/type_traits/detail/bool_trait_undef.hpp>
  196. #endif // __febird_io_DataIO_Basic_h__