endian.h 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. /*
  2. Copyright Rene Rivera 2013-2015
  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. #include <boost/predef/os/android.h>
  15. /*`
  16. [heading `BOOST_ENDIAN_*`]
  17. Detection of endian memory ordering. There are four defined macros
  18. in this header that define the various generally possible endian
  19. memory orderings:
  20. * `BOOST_ENDIAN_BIG_BYTE`, byte-swapped big-endian.
  21. * `BOOST_ENDIAN_BIG_WORD`, word-swapped big-endian.
  22. * `BOOST_ENDIAN_LITTLE_BYTE`, byte-swapped little-endian.
  23. * `BOOST_ENDIAN_LITTLE_WORD`, word-swapped little-endian.
  24. The detection is conservative in that it only identifies endianness
  25. that it knows for certain. In particular bi-endianness is not
  26. indicated as is it not practically possible to determine the
  27. endianness from anything but an operating system provided
  28. header. And the currently known headers do not define that
  29. programatic bi-endianness is available.
  30. This implementation is a compilation of various publicly available
  31. information and acquired knowledge:
  32. # The indispensable documentation of "Pre-defined Compiler Macros"
  33. [@http://sourceforge.net/p/predef/wiki/Endianness Endianness].
  34. # The various endian specifications available in the
  35. [@http://wikipedia.org/ Wikipedia] computer architecture pages.
  36. # Generally available searches for headers that define endianness.
  37. */
  38. #define BOOST_ENDIAN_BIG_BYTE BOOST_VERSION_NUMBER_NOT_AVAILABLE
  39. #define BOOST_ENDIAN_BIG_WORD BOOST_VERSION_NUMBER_NOT_AVAILABLE
  40. #define BOOST_ENDIAN_LITTLE_BYTE BOOST_VERSION_NUMBER_NOT_AVAILABLE
  41. #define BOOST_ENDIAN_LITTLE_WORD BOOST_VERSION_NUMBER_NOT_AVAILABLE
  42. /* GNU libc provides a header defining __BYTE_ORDER, or _BYTE_ORDER.
  43. * And some OSs provide some for of endian header also.
  44. */
  45. #if !BOOST_ENDIAN_BIG_BYTE && !BOOST_ENDIAN_BIG_WORD && \
  46. !BOOST_ENDIAN_LITTLE_BYTE && !BOOST_ENDIAN_LITTLE_WORD
  47. # if BOOST_LIB_C_GNU || BOOST_OS_ANDROID
  48. # include <endian.h>
  49. # else
  50. # if BOOST_OS_MACOS
  51. # include <machine/endian.h>
  52. # else
  53. # if BOOST_OS_BSD
  54. # if BOOST_OS_BSD_OPEN
  55. # include <machine/endian.h>
  56. # else
  57. # include <sys/endian.h>
  58. # endif
  59. # endif
  60. # endif
  61. # endif
  62. # if defined(__BYTE_ORDER)
  63. # if defined(__BIG_ENDIAN) && (__BYTE_ORDER == __BIG_ENDIAN)
  64. # undef BOOST_ENDIAN_BIG_BYTE
  65. # define BOOST_ENDIAN_BIG_BYTE BOOST_VERSION_NUMBER_AVAILABLE
  66. # endif
  67. # if defined(__LITTLE_ENDIAN) && (__BYTE_ORDER == __LITTLE_ENDIAN)
  68. # undef BOOST_ENDIAN_LITTLE_BYTE
  69. # define BOOST_ENDIAN_LITTLE_BYTE BOOST_VERSION_NUMBER_AVAILABLE
  70. # endif
  71. # if defined(__PDP_ENDIAN) && (__BYTE_ORDER == __PDP_ENDIAN)
  72. # undef BOOST_ENDIAN_LITTLE_WORD
  73. # define BOOST_ENDIAN_LITTLE_WORD BOOST_VERSION_NUMBER_AVAILABLE
  74. # endif
  75. # endif
  76. # if !defined(__BYTE_ORDER) && defined(_BYTE_ORDER)
  77. # if defined(_BIG_ENDIAN) && (_BYTE_ORDER == _BIG_ENDIAN)
  78. # undef BOOST_ENDIAN_BIG_BYTE
  79. # define BOOST_ENDIAN_BIG_BYTE BOOST_VERSION_NUMBER_AVAILABLE
  80. # endif
  81. # if defined(_LITTLE_ENDIAN) && (_BYTE_ORDER == _LITTLE_ENDIAN)
  82. # undef BOOST_ENDIAN_LITTLE_BYTE
  83. # define BOOST_ENDIAN_LITTLE_BYTE BOOST_VERSION_NUMBER_AVAILABLE
  84. # endif
  85. # if defined(_PDP_ENDIAN) && (_BYTE_ORDER == _PDP_ENDIAN)
  86. # undef BOOST_ENDIAN_LITTLE_WORD
  87. # define BOOST_ENDIAN_LITTLE_WORD BOOST_VERSION_NUMBER_AVAILABLE
  88. # endif
  89. # endif
  90. #endif
  91. /* Built-in byte-swpped big-endian macros.
  92. */
  93. #if !BOOST_ENDIAN_BIG_BYTE && !BOOST_ENDIAN_BIG_WORD && \
  94. !BOOST_ENDIAN_LITTLE_BYTE && !BOOST_ENDIAN_LITTLE_WORD
  95. # if (defined(__BIG_ENDIAN__) && !defined(__LITTLE_ENDIAN__)) || \
  96. (defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN)) || \
  97. defined(__ARMEB__) || \
  98. defined(__THUMBEB__) || \
  99. defined(__AARCH64EB__) || \
  100. defined(_MIPSEB) || \
  101. defined(__MIPSEB) || \
  102. defined(__MIPSEB__)
  103. # undef BOOST_ENDIAN_BIG_BYTE
  104. # define BOOST_ENDIAN_BIG_BYTE BOOST_VERSION_NUMBER_AVAILABLE
  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 (defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)) || \
  112. (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. /* Some architectures are strictly one endianess (as opposed
  124. * the current common bi-endianess).
  125. */
  126. #if !BOOST_ENDIAN_BIG_BYTE && !BOOST_ENDIAN_BIG_WORD && \
  127. !BOOST_ENDIAN_LITTLE_BYTE && !BOOST_ENDIAN_LITTLE_WORD
  128. # include <boost/predef/architecture.h>
  129. # if BOOST_ARCH_M68K || \
  130. BOOST_ARCH_PARISC || \
  131. BOOST_ARCH_SPARC || \
  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_IA64 || \
  139. BOOST_ARCH_X86 || \
  140. BOOST_ARCH_BLACKFIN
  141. # undef BOOST_ENDIAN_LITTLE_BYTE
  142. # define BOOST_ENDIAN_LITTLE_BYTE BOOST_VERSION_NUMBER_AVAILABLE
  143. # endif
  144. #endif
  145. /* Windows on ARM, if not otherwise detected/specified, is always
  146. * byte-swaped little-endian.
  147. */
  148. #if !BOOST_ENDIAN_BIG_BYTE && !BOOST_ENDIAN_BIG_WORD && \
  149. !BOOST_ENDIAN_LITTLE_BYTE && !BOOST_ENDIAN_LITTLE_WORD
  150. # if BOOST_ARCH_ARM
  151. # include <boost/predef/os/windows.h>
  152. # if BOOST_OS_WINDOWS
  153. # undef BOOST_ENDIAN_LITTLE_BYTE
  154. # define BOOST_ENDIAN_LITTLE_BYTE BOOST_VERSION_NUMBER_AVAILABLE
  155. # endif
  156. # endif
  157. #endif
  158. #if BOOST_ENDIAN_BIG_BYTE
  159. # define BOOST_ENDIAN_BIG_BYTE_AVAILABLE
  160. #endif
  161. #if BOOST_ENDIAN_BIG_WORD
  162. # define BOOST_ENDIAN_BIG_WORD_BYTE_AVAILABLE
  163. #endif
  164. #if BOOST_ENDIAN_LITTLE_BYTE
  165. # define BOOST_ENDIAN_LITTLE_BYTE_AVAILABLE
  166. #endif
  167. #if BOOST_ENDIAN_LITTLE_WORD
  168. # define BOOST_ENDIAN_LITTLE_WORD_BYTE_AVAILABLE
  169. #endif
  170. #define BOOST_ENDIAN_BIG_BYTE_NAME "Byte-Swapped Big-Endian"
  171. #define BOOST_ENDIAN_BIG_WORD_NAME "Word-Swapped Big-Endian"
  172. #define BOOST_ENDIAN_LITTLE_BYTE_NAME "Byte-Swapped Little-Endian"
  173. #define BOOST_ENDIAN_LITTLE_WORD_NAME "Word-Swapped Little-Endian"
  174. #endif
  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)