endian.h 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. /*
  2. Copyright Redshift Software, Inc. 2013
  3. Distributed under the Boost Software License, Version 1.0.
  4. (See accompanying file LICENSE_1_0.txt or copy at
  5. http://www.boost.org/LICENSE_1_0.txt)
  6. */
  7. #ifndef BOOST_PREDEF_ENDIAN_H
  8. #define BOOST_PREDEF_ENDIAN_H
  9. #include <boost/predef/version_number.h>
  10. #include <boost/predef/make.h>
  11. #include <boost/predef/library/c/gnu.h>
  12. #include <boost/predef/os/macos.h>
  13. #include <boost/predef/os/bsd.h>
  14. /*`
  15. [heading `BOOST_ENDIAN_*`]
  16. Detection of endian memory ordering. There are four defined macros
  17. in this header that define the various generally possible endian
  18. memory orderings:
  19. * `BOOST_ENDIAN_BIG_BYTE`, byte-swapped big-endian.
  20. * `BOOST_ENDIAN_BIG_WORD`, word-swapped big-endian.
  21. * `BOOST_ENDIAN_LITTLE_BYTE`, byte-swapped little-endian.
  22. * `BOOST_ENDIAN_LITTLE_WORD`, word-swapped little-endian.
  23. The detection is conservative in that it only identifies endianness
  24. that it knows for certain. In particular bi-endianness is not
  25. indicated as is it not practically possible to determine the
  26. endianness from anything but an operating system provided
  27. header. And the currently known headers do not define that
  28. programatic bi-endianness is available.
  29. This implementation is a compilation of various publicly available
  30. information and acquired knowledge:
  31. # The indispensable documentation of "Pre-defined Compiler Macros"
  32. [@http://sourceforge.net/p/predef/wiki/Endianness Endianness].
  33. # The various endian specifications available in the
  34. [@http://wikipedia.org/ Wikipedia] computer architecture pages.
  35. # Generally available searches for headers that define endianness.
  36. */
  37. #define BOOST_ENDIAN_BIG_BYTE BOOST_VERSION_NUMBER_NOT_AVAILABLE
  38. #define BOOST_ENDIAN_BIG_WORD BOOST_VERSION_NUMBER_NOT_AVAILABLE
  39. #define BOOST_ENDIAN_LITTLE_BYTE BOOST_VERSION_NUMBER_NOT_AVAILABLE
  40. #define BOOST_ENDIAN_LITTLE_WORD BOOST_VERSION_NUMBER_NOT_AVAILABLE
  41. /* GNU libc provides a header defining __BYTE_ORDER, or _BYTE_ORDER.
  42. * And some OSs provide some for of endian header also.
  43. */
  44. #if !BOOST_ENDIAN_BIG_BYTE && !BOOST_ENDIAN_BIG_WORD && \
  45. !BOOST_ENDIAN_LITTLE_BYTE && !BOOST_ENDIAN_LITTLE_WORD
  46. # if BOOST_LIB_C_GNU
  47. # include <endian.h>
  48. # else
  49. # if BOOST_OS_MACOS
  50. # include <machine/endian.h>
  51. # else
  52. # if BOOST_OS_BSD
  53. # if BOOST_OS_BSD_OPEN
  54. # include <machine/endian.h>
  55. # else
  56. # include <sys/endian.h>
  57. # endif
  58. # endif
  59. # endif
  60. # endif
  61. # if defined(__BYTE_ORDER)
  62. # if (__BYTE_ORDER == __BIG_ENDIAN)
  63. # undef BOOST_ENDIAN_BIG_BYTE
  64. # define BOOST_ENDIAN_BIG_BYTE BOOST_VERSION_NUMBER_AVAILABLE
  65. # endif
  66. # if (__BYTE_ORDER == __LITTLE_ENDIAN)
  67. # undef BOOST_ENDIAN_LITTLE_BYTE
  68. # define BOOST_ENDIAN_LITTLE_BYTE BOOST_VERSION_NUMBER_AVAILABLE
  69. # endif
  70. # if (__BYTE_ORDER == __PDP_ENDIAN)
  71. # undef BOOST_ENDIAN_LITTLE_WORD
  72. # define BOOST_ENDIAN_LITTLE_WORD BOOST_VERSION_NUMBER_AVAILABLE
  73. # endif
  74. # endif
  75. # if !defined(__BYTE_ORDER) && defined(_BYTE_ORDER)
  76. # if (_BYTE_ORDER == _BIG_ENDIAN)
  77. # undef BOOST_ENDIAN_BIG_BYTE
  78. # define BOOST_ENDIAN_BIG_BYTE BOOST_VERSION_NUMBER_AVAILABLE
  79. # endif
  80. # if (_BYTE_ORDER == _LITTLE_ENDIAN)
  81. # undef BOOST_ENDIAN_LITTLE_BYTE
  82. # define BOOST_ENDIAN_LITTLE_BYTE BOOST_VERSION_NUMBER_AVAILABLE
  83. # endif
  84. # if (_BYTE_ORDER == _PDP_ENDIAN)
  85. # undef BOOST_ENDIAN_LITTLE_WORD
  86. # define BOOST_ENDIAN_LITTLE_WORD BOOST_VERSION_NUMBER_AVAILABLE
  87. # endif
  88. # endif
  89. #endif
  90. /* Built-in byte-swpped big-endian macros.
  91. */
  92. #if !BOOST_ENDIAN_BIG_BYTE && !BOOST_ENDIAN_BIG_WORD && \
  93. !BOOST_ENDIAN_LITTLE_BYTE && !BOOST_ENDIAN_LITTLE_WORD
  94. # if !BOOST_ENDIAN_BIG_BYTE
  95. # if (defined(__BIG_ENDIAN__) && !defined(__LITTLE_ENDIAN__)) || \
  96. defined(__ARMEB__) || \
  97. defined(__THUMBEB__) || \
  98. defined(__AARCH64EB__) || \
  99. defined(_MIPSEB) || \
  100. defined(__MIPSEB) || \
  101. defined(__MIPSEB__)
  102. # undef BOOST_ENDIAN_BIG_BYTE
  103. # define BOOST_ENDIAN_BIG_BYTE BOOST_VERSION_NUMBER_AVAILABLE
  104. # endif
  105. # endif
  106. #endif
  107. /* Built-in byte-swpped little-endian macros.
  108. */
  109. #if !BOOST_ENDIAN_BIG_BYTE && !BOOST_ENDIAN_BIG_WORD && \
  110. !BOOST_ENDIAN_LITTLE_BYTE && !BOOST_ENDIAN_LITTLE_WORD
  111. # if !BOOST_ENDIAN_LITTLE_BYTE
  112. # if (defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)) || \
  113. defined(__ARMEL__) || \
  114. defined(__THUMBEL__) || \
  115. defined(__AARCH64EL__) || \
  116. defined(_MIPSEL) || \
  117. defined(__MIPSEL) || \
  118. defined(__MIPSEL__)
  119. # undef BOOST_ENDIAN_LITTLE_BYTE
  120. # define BOOST_ENDIAN_LITTLE_BYTE BOOST_VERSION_NUMBER_AVAILABLE
  121. # endif
  122. # endif
  123. #endif
  124. /* Some architectures are strictly one endianess (as opposed
  125. * the current common bi-endianess).
  126. */
  127. #if !BOOST_ENDIAN_BIG_BYTE && !BOOST_ENDIAN_BIG_WORD && \
  128. !BOOST_ENDIAN_LITTLE_BYTE && !BOOST_ENDIAN_LITTLE_WORD
  129. # include <boost/predef/architecture.h>
  130. # if BOOST_ARCH_M68K || \
  131. BOOST_ARCH_PARISK || \
  132. BOOST_ARCH_SYS370 || \
  133. BOOST_ARCH_SYS390 || \
  134. BOOST_ARCH_Z
  135. # undef BOOST_ENDIAN_BIG_BYTE
  136. # define BOOST_ENDIAN_BIG_BYTE BOOST_VERSION_NUMBER_AVAILABLE
  137. # endif
  138. # if BOOST_ARCH_AMD64 || \
  139. BOOST_ARCH_IA64 || \
  140. BOOST_ARCH_X86 || \
  141. BOOST_ARCH_BLACKFIN
  142. # undef BOOST_ENDIAN_LITTLE_BYTE
  143. # define BOOST_ENDIAN_LITTLE_BYTE BOOST_VERSION_NUMBER_AVAILABLE
  144. # endif
  145. #endif
  146. /* Windows on ARM, if not otherwise detected/specified, is always
  147. * byte-swaped little-endian.
  148. */
  149. #if !BOOST_ENDIAN_BIG_BYTE && !BOOST_ENDIAN_BIG_WORD && \
  150. !BOOST_ENDIAN_LITTLE_BYTE && !BOOST_ENDIAN_LITTLE_WORD
  151. # if BOOST_ARCH_ARM
  152. # include <boost/predef/os/windows.h>
  153. # if BOOST_OS_WINDOWS
  154. # undef BOOST_ENDIAN_LITTLE_BYTE
  155. # define BOOST_ENDIAN_LITTLE_BYTE BOOST_VERSION_NUMBER_AVAILABLE
  156. # endif
  157. # endif
  158. #endif
  159. #if BOOST_ENDIAN_BIG_BYTE
  160. # define BOOST_ENDIAN_BIG_BYTE_AVAILABLE
  161. #endif
  162. #if BOOST_ENDIAN_BIG_WORD
  163. # define BOOST_ENDIAN_BIG_WORD_BYTE_AVAILABLE
  164. #endif
  165. #if BOOST_ENDIAN_LITTLE_BYTE
  166. # define BOOST_ENDIAN_LITTLE_BYTE_AVAILABLE
  167. #endif
  168. #if BOOST_ENDIAN_LITTLE_WORD
  169. # define BOOST_ENDIAN_LITTLE_WORD_BYTE_AVAILABLE
  170. #endif
  171. #define BOOST_ENDIAN_BIG_BYTE_NAME "Byte-Swapped Big-Endian"
  172. #define BOOST_ENDIAN_BIG_WORD_NAME "Word-Swapped Big-Endian"
  173. #define BOOST_ENDIAN_LITTLE_BYTE_NAME "Byte-Swapped Little-Endian"
  174. #define BOOST_ENDIAN_LITTLE_WORD_NAME "Word-Swapped Little-Endian"
  175. #include <boost/predef/detail/test.h>
  176. BOOST_PREDEF_DECLARE_TEST(BOOST_ENDIAN_BIG_BYTE,BOOST_ENDIAN_BIG_BYTE_NAME)
  177. #include <boost/predef/detail/test.h>
  178. BOOST_PREDEF_DECLARE_TEST(BOOST_ENDIAN_BIG_WORD,BOOST_ENDIAN_BIG_WORD_NAME)
  179. #include <boost/predef/detail/test.h>
  180. BOOST_PREDEF_DECLARE_TEST(BOOST_ENDIAN_LITTLE_BYTE,BOOST_ENDIAN_LITTLE_BYTE_NAME)
  181. #include <boost/predef/detail/test.h>
  182. BOOST_PREDEF_DECLARE_TEST(BOOST_ENDIAN_LITTLE_WORD,BOOST_ENDIAN_LITTLE_WORD_NAME)
  183. #endif