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