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

STL

开发平台:

Visual C++

  1. /* vim: set tabstop=4 : */
  2. #ifndef __febird_io_byte_swap_impl_h__
  3. #define __febird_io_byte_swap_impl_h__
  4. #if defined(_MSC_VER) && (_MSC_VER >= 1020)
  5. # pragma once
  6. # include <intrin.h>
  7. # include <stdlib.h>
  8. #endif
  9. #include <boost/cstdint.hpp>
  10. namespace febird { 
  11. #if defined(_MSC_VER) && (_MSC_VER >= 1020) //&& defined(_M_IX86)
  12. inline unsigned short byte_swap(unsigned short x) { return _byteswap_ushort(x); }
  13. inline short byte_swap(short x) { return _byteswap_ushort(x); }
  14. inline unsigned int byte_swap(unsigned int x) { return _byteswap_ulong (x); }
  15. inline int byte_swap(int x) { return _byteswap_ulong (x); }
  16. inline unsigned long byte_swap(unsigned long x) { return _byteswap_ulong (x); }
  17. inline long byte_swap(long x) { return _byteswap_ulong (x); }
  18. inline unsigned __int64 byte_swap(unsigned __int64 x) { return _byteswap_uint64(x); }
  19. inline __int64 byte_swap(__int64 x) { return _byteswap_uint64(x); }
  20. inline wchar_t byte_swap(wchar_t x) { return _byteswap_ushort(x); }
  21. #elif defined(__GNUC__) && defined(__GNUC_MINOR__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))
  22. inline unsigned short byte_swap(unsigned short x) { return x << 8 | x >> 8; }
  23. inline short byte_swap(short x) { return x << 8 | (unsigned short)x >> 8; }
  24. inline unsigned int byte_swap(unsigned int x) { return __builtin_bswap32(x); }
  25. inline int byte_swap(int x) { return __builtin_bswap32 (x); }
  26. inline long long byte_swap(long long x) { return __builtin_bswap64(x); }
  27. inline unsigned long long byte_swap(unsigned long long x) { return __builtin_bswap64(x); }
  28. #if ULONG_MAX == 0xFFFFFFFF
  29. inline unsigned long byte_swap(unsigned long x) { return __builtin_bswap32(x); }
  30. inline long byte_swap(long x) { return __builtin_bswap32(x); }
  31. #else
  32. inline unsigned long byte_swap(unsigned long x) { return __builtin_bswap64(x); }
  33. inline long byte_swap(long x) { return __builtin_bswap64(x); }
  34. #endif // ULONG_MAX
  35. inline wchar_t byte_swap(wchar_t x) { return __builtin_bswap32(x); }
  36. #else
  37. inline unsigned short byte_swap(unsigned short x) { return x << 8 | x >> 8; }
  38. inline short byte_swap(short x) { return x << 8 | (unsigned short)x >> 8; }
  39. inline unsigned int byte_swap(unsigned int i)
  40. {
  41. unsigned int j;
  42. j =  (i << 24);
  43. j += (i <<  8) & 0x00FF0000;
  44. j += (i >>  8) & 0x0000FF00;
  45. j += (i >> 24);
  46. return j;
  47. }
  48. inline int byte_swap(int i) { return byte_swap((unsigned int)i); }
  49. inline unsigned long long byte_swap(unsigned long long i)
  50. {
  51. unsigned long long j;
  52. j =  (i << 56);
  53. j += (i << 40)&UINT64_C(0x00FF000000000000);
  54. j += (i << 24)&UINT64_C(0x0000FF0000000000);
  55. j += (i <<  8)&UINT64_C(0x000000FF00000000);
  56. j += (i >>  8)&UINT64_C(0x00000000FF000000);
  57. j += (i >> 24)&UINT64_C(0x0000000000FF0000);
  58. j += (i >> 40)&UINT64_C(0x000000000000FF00);
  59. j += (i >> 56);
  60. return j;
  61. }
  62. inline long long byte_swap(long long i) { return byte_swap((unsigned long long)(i)); }
  63. #if ULONG_MAX == 0xffffffff
  64. inline unsigned long byte_swap(unsigned long x) { return byte_swap((unsigned int)x); }
  65. inline long byte_swap(long x) { return byte_swap((unsigned int)x); }
  66. #else
  67. inline unsigned long byte_swap(unsigned long x) { return byte_swap((unsigned long long)x); }
  68. inline long byte_swap(long x) { return byte_swap((unsigned long long)x); }
  69. #endif // ULONG_MAX
  70. #endif
  71. } // namespace febird
  72. #endif // __febird_io_byte_swap_impl_h__