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

STL

开发平台:

Visual C++

  1. /* vim: set tabstop=4 : */
  2. #ifndef __febird_io_byte_swap_h__
  3. #define __febird_io_byte_swap_h__
  4. #include "byte_swap_impl.h"
  5. #include <boost/mpl/bool.hpp>
  6. //#include <boost/type_traits/detail/bool_trait_def.hpp>
  7. namespace febird { 
  8. // inline void byte_swap_in(float&) {}
  9. // inline void byte_swap_in(double&) {}
  10. // inline void byte_swap_in(long double&) {}
  11. // inline void byte_swap_in(char&) {}
  12. // inline void byte_swap_in(signed char&) {}
  13. // inline void byte_swap_in(unsigned char&) {}
  14. inline void byte_swap_in(unsigned short& x, boost::mpl::true_)
  15. {
  16. x = byte_swap(x);
  17. }
  18. inline void byte_swap_in(short& x, boost::mpl::true_)
  19. {
  20. x = byte_swap(x);
  21. }
  22. inline void byte_swap_in(unsigned int& i, boost::mpl::true_)
  23. {
  24. i = byte_swap(i);
  25. }
  26. inline void byte_swap_in(int& i, boost::mpl::true_)
  27. {
  28. i = byte_swap((unsigned int)i);
  29. }
  30. #if defined(BOOST_HAS_LONG_LONG)
  31. inline void byte_swap_in(unsigned long long& i, boost::mpl::true_)
  32. {
  33. i = byte_swap(i);
  34. }
  35. inline void byte_swap_in(long long& i, boost::mpl::true_)
  36. {
  37. i = byte_swap((unsigned long long)(i));
  38. }
  39. #elif defined(BOOST_HAS_MS_INT64)
  40. inline void byte_swap_in(unsigned __int64& i, boost::mpl::true_)
  41. {
  42. i = byte_swap(i);
  43. }
  44. inline void byte_swap_in(__int64& i, boost::mpl::true_)
  45. {
  46. i = byte_swap((unsigned __int64)(i));
  47. }
  48. #endif
  49. #if ULONG_MAX == 0xffffffff
  50. inline void byte_swap_in(unsigned long& x, boost::mpl::true_)
  51. {
  52. x = byte_swap((unsigned int)x);
  53. }
  54. inline void byte_swap_in(long& x, boost::mpl::true_)
  55. {
  56. x = byte_swap((unsigned int)x);
  57. }
  58. #else
  59. inline void byte_swap_in(unsigned long& x, boost::mpl::true_)
  60. {
  61. x = byte_swap((unsigned long long)x);
  62. }
  63. inline void byte_swap_in(long& x, boost::mpl::true_) 
  64. {
  65. x = byte_swap((unsigned long long)x);
  66. }
  67. #endif // ULONG_MAX
  68. template<class T, int Dim>
  69. void byte_swap_in(T (&a)[Dim], boost::mpl::true_)
  70. {
  71. for (int i = 0; i < Dim; ++i)
  72. byte_swap_in(a[i], boost::mpl::true_());
  73. }
  74. template<class T>
  75. void byte_swap_in(T&, boost::mpl::false_)
  76. {
  77. // do nothing
  78. }
  79. //////////////////////////////////////////////////////////////////////////
  80. // DataIO_need_bswap
  81. #if 0
  82.   #define DATA_IO_NEED_BYTE_SWAP(T, cbool) BOOST_TT_AUX_BOOL_TRAIT_SPEC1(DataIO_need_bswap, T, cbool)
  83.   BOOST_TT_AUX_BOOL_TRAIT_DEF1(DataIO_need_bswap, T, true)
  84. #else
  85.   #define DATA_IO_NEED_BYTE_SWAP(T, cbool) 
  86. template<> struct DataIO_need_bswap<T> : public boost::mpl::bool_<cbool> {};
  87.   template<class T>
  88.   struct DataIO_need_bswap : public boost::mpl::true_ { };
  89. #endif
  90. DATA_IO_NEED_BYTE_SWAP(     char, false)
  91. DATA_IO_NEED_BYTE_SWAP(  signed char, false)
  92. DATA_IO_NEED_BYTE_SWAP(unsigned char, false)
  93. DATA_IO_NEED_BYTE_SWAP(    float, false)
  94. DATA_IO_NEED_BYTE_SWAP(   double, false)
  95. DATA_IO_NEED_BYTE_SWAP(  long double, false)
  96. template<class T1, class T2>
  97. struct DataIO_need_bswap<std::pair<T1, T2> > : public
  98. boost::mpl::bool_<DataIO_need_bswap<T1>::value||DataIO_need_bswap<T1>::value>
  99. {
  100. };
  101. template<class T1, class T2>
  102. void byte_swap_in(std::pair<T1, T2>& x, typename DataIO_need_bswap<std::pair<T1,T2> >::type)
  103. {
  104. byte_swap_in(x.first,  typename DataIO_need_bswap<T1>::type());
  105. byte_swap_in(x.second, typename DataIO_need_bswap<T2>::type());
  106. }
  107. // 这个做成模板只是为了在 DATA_IO_LOAD_SAVE 中
  108. // 生成的 Class::byte_swap_in 是模板的,在没有使用的时候,不实例化
  109. template<class Bswap>
  110. class ByteSwapChain;
  111. // only boost::mpl::true_ is applied
  112. template<> class ByteSwapChain<boost::mpl::true_>
  113. {
  114. //  template<class T> void do_bswap(T& x, boost::mpl::true_ ) const { byte_swap_in(x); }
  115. // 
  116. //  template<class T> void do_bswap(T& x, boost::mpl::false_) const { }
  117. public:
  118. template<class T> ByteSwapChain operator&(T& x) const
  119. {
  120. //! 如果这个函数编译失败,很可能是用户代码声明了 DataIO_IsDump_TypeTrue1(T)
  121. //! 但 DataIO_is_realdump 推导的结果却是不可 dump
  122. //  用户定义为 DATA_IO_DUMP_RAW_MEM 的类可以被传入,此时 DataIO_need_bswap::value == false
  123. // do_bswap(x, typename DataIO_need_bswap<T>::type());
  124. // BOOST_STATIC_ASSERT(DataIO_need_bswap<T>::value);
  125. // byte_swap_in(x, boost::mpl::true_());
  126. byte_swap_in(x, typename DataIO_need_bswap<T>::type());
  127. return *this;
  128. }
  129. };
  130. template<class T>
  131. void byte_swap(T* p, size_t n)
  132. for (size_t i = n; i; --i, ++p)
  133. byte_swap_in(*p, boost::mpl::true_());
  134. }
  135. template<class Iter>
  136. void byte_swap(Iter first, Iter last)
  137. for (; first != last; ++first)
  138. byte_swap_in(*first, boost::mpl::true_());
  139. }
  140. inline void byte_swap(char* buffer, size_t length) { }
  141. inline void byte_swap(signed char* buffer, size_t length) { }
  142. inline void byte_swap(unsigned char* buffer, size_t length) { }
  143. } // namespace febird
  144. //#include <boost/type_traits/detail/bool_trait_undef.hpp>
  145. #endif // __febird_io_byte_swap_h__