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