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