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

STL

开发平台:

Visual C++

  1. /* vim: set tabstop=4 : */
  2. #include "DataOutput.h"
  3. #include <boost/type_traits/detail/bool_trait_def.hpp>
  4. namespace febird {
  5. class TestFixedSizeOutput
  6. {
  7. public:
  8. bool isFixed;
  9. TestFixedSizeOutput() : isFixed(true) {}
  10. template<class T> TestFixedSizeOutput& operator<<(const T& x)
  11. {
  12. DataIO_saveObject(*this, x);
  13. return *this;
  14. }
  15. template<class T> TestFixedSizeOutput& operator &(const T& x) { return *this << x; }
  16. #define DATA_IO_GEN_IsFixedSize(type) 
  17. TestFixedSizeOutput& operator &(const type&) { return *this; } 
  18. TestFixedSizeOutput& operator<<(const type&) { return *this; }
  19. DATA_IO_GEN_IsFixedSize(float)
  20. DATA_IO_GEN_IsFixedSize(double)
  21. DATA_IO_GEN_IsFixedSize(long double)
  22. DATA_IO_GEN_IsFixedSize(char)
  23. DATA_IO_GEN_IsFixedSize(unsigned char)
  24. DATA_IO_GEN_IsFixedSize(signed char)
  25. DATA_IO_GEN_IsFixedSize(wchar_t)
  26. DATA_IO_GEN_IsFixedSize(int)
  27. DATA_IO_GEN_IsFixedSize(unsigned int)
  28. DATA_IO_GEN_IsFixedSize(short)
  29. DATA_IO_GEN_IsFixedSize(unsigned short)
  30. DATA_IO_GEN_IsFixedSize(long)
  31. DATA_IO_GEN_IsFixedSize(unsigned long)
  32. #if defined(BOOST_HAS_LONG_LONG)
  33. DATA_IO_GEN_IsFixedSize(long long)
  34. DATA_IO_GEN_IsFixedSize(unsigned long long)
  35. #elif defined(BOOST_HAS_MS_INT64)
  36. DATA_IO_GEN_IsFixedSize(__int64)
  37. DATA_IO_GEN_IsFixedSize(unsigned __int64)
  38. #endif
  39. template<class T> TestFixedSizeOutput& operator&(pass_by_value<T> x) { return *this << x.val; }
  40. template<class T> TestFixedSizeOutput& operator&(boost::reference_wrapper<T> x) { return *this << x.get(); }
  41. template<class T> TestFixedSizeOutput& operator<<(pass_by_value<T> x) { return *this << x.val; }
  42. template<class T> TestFixedSizeOutput& operator<<(boost::reference_wrapper<T> x) { return *this << x.get(); }
  43. template<class T> TestFixedSizeOutput& operator&(const T* x) { return *this << *x; }
  44. template<class T> TestFixedSizeOutput& operator&(T* x) { return *this << *x; }
  45. template<class T> TestFixedSizeOutput& operator<<(const T* x) { return *this << *x; }
  46. template<class T> TestFixedSizeOutput& operator<<(T* x) { return *this << *x; }
  47. template<class T, int Dim>
  48. Final_Output& operator<<(const T (&x)[Dim]) { return *this << x[0]; }
  49. Final_Output& operator<<(const char* s) { isFixed = false; return *this; }
  50. Final_Output& operator<<(      char* s) { isFixed = false; return *this; }
  51. Final_Output& operator<<(const signed char* s) { isFixed = false; return *this; }
  52. Final_Output& operator<<(      signed char* s) { isFixed = false; return *this; }
  53. Final_Output& operator<<(const unsigned char* s) { isFixed = false; return *this; }
  54. Final_Output& operator<<(      unsigned char* s) { isFixed = false; return *this; }
  55. Final_Output& operator<<(const wchar_t* s){ isFixed = false; return *this; }
  56. Final_Output& operator<<(      wchar_t* s){ isFixed = false; return *this; }
  57. Final_Output& operator<<(const std::string& x){ isFixed = false; return *this; }
  58. Final_Output& operator<<(const std::wstring& x){ isFixed = false; return *this; }
  59. template<class Elem, class Alloc>
  60. Final_Output& operator<<(const std::vector<Elem, Alloc>& x){ isFixed = false; return *this; }
  61. template<class Elem, class Alloc>
  62. Final_Output& operator<<(const std::list<Elem, Alloc>& x){ isFixed = false; return *this; }
  63. template<class Elem, class Alloc>
  64. Final_Output& operator<<(const std::deque<Elem, Alloc>& x){ isFixed = false; return *this; }
  65. template<class Elem, class Compare, class Alloc>
  66. Final_Output& operator<<(const std::set<Elem, Compare, Alloc>& x){ isFixed = false; return *this; }
  67. template<class Elem, class Compare, class Alloc>
  68. Final_Output& operator<<(const std::multiset<Elem, Compare, Alloc>& x){ isFixed = false; return *this; }
  69. template<class Key, class Val, class Compare, class Alloc>
  70. Final_Output& operator<<(const std::map<Key, Val, Compare, Alloc>& x){ isFixed = false; return *this; }
  71. template<class Key, class Val, class Compare, class Alloc>
  72. Final_Output& operator<<(const std::multimap<Key, Val, Compare, Alloc>& x){ isFixed = false; return *this; }
  73. };
  74. template<class T> bool IsFixedSize(const T& x)
  75. {
  76. TestFixedSizeOutput test;
  77. test & x;
  78. return test.isFixed;
  79. }
  80. template<class Final_Output> class DataOutputMeasureBase
  81. {
  82. protected:
  83. size_t m_size;
  84. public:
  85. BOOST_STATIC_CONSTANT(bool, value = false);
  86. typedef boost::mpl::true_ type;
  87. DataOutputMeasureBase() { this->m_size = 0; }
  88. size_t size() const { return this->m_size(); }
  89. void ensureWrite(void* , size_t length) { this->m_size += length; }
  90. Final_Output& operator<<(serialize_version_t x) { return static_cast<Final_Output&>(*this) << var_uint32_t(x.t); }
  91. #define FEBIRD_GEN_MEASURE_SIZE(type, size) 
  92. Final_Output& operator<<(type x) { this->m_size += size; return static_cast<Final_Output&>(*this); }
  93. #define FEBIRD_GEN_MEASURE_SIZE_FUN(type) 
  94. Final_Output& operator<<(type x) { this->m_size += sizeof(type); return static_cast<Final_Output&>(*this); }
  95. #define FEBIRD_GEN_MEASURE_VAR_INT(type) 
  96. Final_Output& operator<<(type x) { this->m_size += sizeof_int(x); return static_cast<Final_Output&>(*this); }
  97. FEBIRD_GEN_MEASURE_VAR_INT(var_int16_t)
  98. FEBIRD_GEN_MEASURE_VAR_INT(var_uint16_t)
  99. FEBIRD_GEN_MEASURE_VAR_INT(var_int32_t)
  100. FEBIRD_GEN_MEASURE_VAR_INT(var_uint32_t)
  101. #if !defined(BOOST_NO_INTRINSIC_INT64_T)
  102. FEBIRD_GEN_MEASURE_VAR_INT(var_int64_t)
  103. FEBIRD_GEN_MEASURE_VAR_INT(var_uint64_t)
  104. #endif
  105. FEBIRD_GEN_MEASURE_SIZE_FUN(char)
  106. FEBIRD_GEN_MEASURE_SIZE_FUN(unsigned char)
  107. FEBIRD_GEN_MEASURE_SIZE_FUN(signed char)
  108. FEBIRD_GEN_MEASURE_SIZE_FUN(short)
  109. FEBIRD_GEN_MEASURE_SIZE_FUN(unsigned short)
  110. FEBIRD_GEN_MEASURE_SIZE_FUN(int)
  111. FEBIRD_GEN_MEASURE_SIZE_FUN(unsigned int)
  112. FEBIRD_GEN_MEASURE_SIZE_FUN(long)
  113. FEBIRD_GEN_MEASURE_SIZE_FUN(unsigned long)
  114. #if defined(BOOST_HAS_LONG_LONG)
  115. FEBIRD_GEN_MEASURE_SIZE_FUN(long long)
  116. FEBIRD_GEN_MEASURE_SIZE_FUN(unsigned long long)
  117. #elif defined(BOOST_HAS_MS_INT64)
  118. FEBIRD_GEN_MEASURE_SIZE_FUN(__int64)
  119. FEBIRD_GEN_MEASURE_SIZE_FUN(unsigned __int64)
  120. #endif
  121. FEBIRD_GEN_MEASURE_SIZE_FUN(float)
  122. FEBIRD_GEN_MEASURE_SIZE_FUN(double)
  123. FEBIRD_GEN_MEASURE_SIZE_FUN(long double)
  124. Final_Output& operator<<(const char* s)
  125. {
  126. var_uint32_t n(strlen(s));
  127. this->m_size += sizeof_int(n) + n;
  128. return static_cast<Final_Output&>(*this);
  129. }
  130. Final_Output& operator<<(const wchar_t* s)
  131. {
  132. var_uint32_t n(wcslen(s));
  133. this->m_size += sizeof_int(n) + n * sizeof(wchar_t);
  134. return static_cast<Final_Output&>(*this);
  135. }
  136. Final_Output& operator<<(const std::string& x)
  137. {
  138. var_uint32_t n(x.size());
  139. this->m_size += sizeof_int(n) + n.t;
  140. return static_cast<Final_Output&>(*this);
  141. }
  142. Final_Output& operator<<(const std::wstring& x)
  143. {
  144. var_uint32_t n(x.size());
  145. this->m_size += sizeof_int(n) + n.t * sizeof(wchar_t);
  146. return static_cast<Final_Output&>(*this);
  147. }
  148. template<class Elem, class Alloc>
  149. Final_Output& operator<<(const std::vector<Elem, Alloc>& x)
  150. {
  151. return measure_seq(x);
  152. }
  153. template<class Elem, class Alloc>
  154. Final_Output& operator<<(const std::list<Elem, Alloc>& x)
  155. {
  156. return measure_seq(x);
  157. }
  158. template<class Elem, class Alloc>
  159. Final_Output& operator<<(const std::deque<Elem, Alloc>& x)
  160. {
  161. return measure_seq(x);
  162. }
  163. template<class Elem, class Compare, class Alloc>
  164. Final_Output& operator<<(const std::set<Elem, Compare, Alloc>& x)
  165. {
  166. return measure_seq(x);
  167. }
  168. template<class Elem, class Compare, class Alloc>
  169. Final_Output& operator<<(const std::multiset<Elem, Compare, Alloc>& x)
  170. {
  171. return measure_seq(x);
  172. }
  173. template<class Key, class Val, class Compare, class Alloc>
  174. Final_Output& operator<<(const std::map<Key, Val, Compare, Alloc>& x)
  175. {
  176. return measure_seq(x);
  177. }
  178. template<class Key, class Val, class Compare, class Alloc>
  179. Final_Output& operator<<(const std::multimap<Key, Val, Compare, Alloc>& x)
  180. {
  181. return measure_seq(x);
  182. }
  183. protected:
  184. template<class Seq>
  185. Final_Output& measure_seq(const Seq& x)
  186. {
  187. if (x.empty())
  188. return 1; // 0 byte store var_uint32(x.size()=0)
  189. if (IsFixedSize(*x.begin()))
  190. measure_seq_fixed_elem(x);
  191. else
  192. measure_seq_var_elem(x);
  193. return static_cast<Final_Output&>(*this);
  194. }
  195. template<class Seq>
  196. void measure_seq_fixed_elem(const Seq& x)
  197. {
  198. var_uint32_t n(x.size());
  199. this->m_size += sizeof_int(x) + sizeof(typename Seq::value_type) * n.t;
  200. }
  201. template<class Seq>
  202. void measure_seq_var_elem(const Seq& x)
  203. {
  204. var_uint32_t n(x.size());
  205. static_cast<Final_Output&>(*this) << n;
  206. for (typename Seq::const_iterator i = x.begin(); i != x.end(); ++i)
  207. static_cast<Final_Output&>(*this) << *i;
  208. }
  209. };
  210. class DataOutputMeasure
  211. : public DataOutput<DataOutputMeasureBase, DataOutputMeasure>
  212. {
  213. public:
  214. };
  215. } // namespace febird