205 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			205 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | /* | ||
|  | Copyright Rene Rivera 2013-2015 | ||
|  | Distributed under the Boost Software License, Version 1.0. | ||
|  | (See accompanying file LICENSE_1_0.txt or copy at | ||
|  | http://www.boost.org/LICENSE_1_0.txt) | ||
|  | */ | ||
|  | 
 | ||
|  | #ifndef BOOST_PREDEF_ENDIAN_H | ||
|  | #define BOOST_PREDEF_ENDIAN_H | ||
|  | 
 | ||
|  | #include <boost/predef/version_number.h> | ||
|  | #include <boost/predef/make.h> | ||
|  | #include <boost/predef/library/c/gnu.h> | ||
|  | #include <boost/predef/os/macos.h> | ||
|  | #include <boost/predef/os/bsd.h> | ||
|  | #include <boost/predef/os/android.h> | ||
|  | 
 | ||
|  | /*` | ||
|  | [heading `BOOST_ENDIAN_*`] | ||
|  | 
 | ||
|  | Detection of endian memory ordering. There are four defined macros | ||
|  | in this header that define the various generally possible endian | ||
|  | memory orderings: | ||
|  | 
 | ||
|  | * `BOOST_ENDIAN_BIG_BYTE`, byte-swapped big-endian. | ||
|  | * `BOOST_ENDIAN_BIG_WORD`, word-swapped big-endian. | ||
|  | * `BOOST_ENDIAN_LITTLE_BYTE`, byte-swapped little-endian. | ||
|  | * `BOOST_ENDIAN_LITTLE_WORD`, word-swapped little-endian. | ||
|  | 
 | ||
|  | The detection is conservative in that it only identifies endianness | ||
|  | that it knows for certain. In particular bi-endianness is not | ||
|  | indicated as is it not practically possible to determine the | ||
|  | endianness from anything but an operating system provided | ||
|  | header. And the currently known headers do not define that | ||
|  | programatic bi-endianness is available. | ||
|  | 
 | ||
|  | This implementation is a compilation of various publicly available | ||
|  | information and acquired knowledge: | ||
|  | 
 | ||
|  | # The indispensable documentation of "Pre-defined Compiler Macros" | ||
|  |   [@http://sourceforge.net/p/predef/wiki/Endianness Endianness]. | ||
|  | # The various endian specifications available in the | ||
|  |   [@http://wikipedia.org/ Wikipedia] computer architecture pages. | ||
|  | # Generally available searches for headers that define endianness. | ||
|  |  */ | ||
|  | 
 | ||
|  | #define BOOST_ENDIAN_BIG_BYTE BOOST_VERSION_NUMBER_NOT_AVAILABLE | ||
|  | #define BOOST_ENDIAN_BIG_WORD BOOST_VERSION_NUMBER_NOT_AVAILABLE | ||
|  | #define BOOST_ENDIAN_LITTLE_BYTE BOOST_VERSION_NUMBER_NOT_AVAILABLE | ||
|  | #define BOOST_ENDIAN_LITTLE_WORD BOOST_VERSION_NUMBER_NOT_AVAILABLE | ||
|  | 
 | ||
|  | /* GNU libc provides a header defining __BYTE_ORDER, or _BYTE_ORDER. | ||
|  |  * And some OSs provide some for of endian header also. | ||
|  |  */ | ||
|  | #if !BOOST_ENDIAN_BIG_BYTE && !BOOST_ENDIAN_BIG_WORD && \ | ||
|  |     !BOOST_ENDIAN_LITTLE_BYTE && !BOOST_ENDIAN_LITTLE_WORD | ||
|  | #   if BOOST_LIB_C_GNU || BOOST_OS_ANDROID | ||
|  | #       include <endian.h> | ||
|  | #   else | ||
|  | #       if BOOST_OS_MACOS | ||
|  | #           include <machine/endian.h> | ||
|  | #       else | ||
|  | #           if BOOST_OS_BSD | ||
|  | #               if BOOST_OS_BSD_OPEN | ||
|  | #                   include <machine/endian.h> | ||
|  | #               else | ||
|  | #                   include <sys/endian.h> | ||
|  | #               endif | ||
|  | #           endif | ||
|  | #       endif | ||
|  | #   endif | ||
|  | #   if defined(__BYTE_ORDER) | ||
|  | #       if defined(__BIG_ENDIAN) && (__BYTE_ORDER == __BIG_ENDIAN) | ||
|  | #           undef BOOST_ENDIAN_BIG_BYTE | ||
|  | #           define BOOST_ENDIAN_BIG_BYTE BOOST_VERSION_NUMBER_AVAILABLE | ||
|  | #       endif | ||
|  | #       if defined(__LITTLE_ENDIAN) && (__BYTE_ORDER == __LITTLE_ENDIAN) | ||
|  | #           undef BOOST_ENDIAN_LITTLE_BYTE | ||
|  | #           define BOOST_ENDIAN_LITTLE_BYTE BOOST_VERSION_NUMBER_AVAILABLE | ||
|  | #       endif | ||
|  | #       if defined(__PDP_ENDIAN) && (__BYTE_ORDER == __PDP_ENDIAN) | ||
|  | #           undef BOOST_ENDIAN_LITTLE_WORD | ||
|  | #           define BOOST_ENDIAN_LITTLE_WORD BOOST_VERSION_NUMBER_AVAILABLE | ||
|  | #       endif | ||
|  | #   endif | ||
|  | #   if !defined(__BYTE_ORDER) && defined(_BYTE_ORDER) | ||
|  | #       if defined(_BIG_ENDIAN) && (_BYTE_ORDER == _BIG_ENDIAN) | ||
|  | #           undef BOOST_ENDIAN_BIG_BYTE | ||
|  | #           define BOOST_ENDIAN_BIG_BYTE BOOST_VERSION_NUMBER_AVAILABLE | ||
|  | #       endif | ||
|  | #       if defined(_LITTLE_ENDIAN) && (_BYTE_ORDER == _LITTLE_ENDIAN) | ||
|  | #           undef BOOST_ENDIAN_LITTLE_BYTE | ||
|  | #           define BOOST_ENDIAN_LITTLE_BYTE BOOST_VERSION_NUMBER_AVAILABLE | ||
|  | #       endif | ||
|  | #       if defined(_PDP_ENDIAN) && (_BYTE_ORDER == _PDP_ENDIAN) | ||
|  | #           undef BOOST_ENDIAN_LITTLE_WORD | ||
|  | #           define BOOST_ENDIAN_LITTLE_WORD BOOST_VERSION_NUMBER_AVAILABLE | ||
|  | #       endif | ||
|  | #   endif | ||
|  | #endif | ||
|  | 
 | ||
|  | /* Built-in byte-swpped big-endian macros. | ||
|  |  */ | ||
|  | #if !BOOST_ENDIAN_BIG_BYTE && !BOOST_ENDIAN_BIG_WORD && \ | ||
|  |     !BOOST_ENDIAN_LITTLE_BYTE && !BOOST_ENDIAN_LITTLE_WORD | ||
|  | #   if (defined(__BIG_ENDIAN__) && !defined(__LITTLE_ENDIAN__)) || \ | ||
|  |        (defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN)) || \ | ||
|  |         defined(__ARMEB__) || \ | ||
|  |         defined(__THUMBEB__) || \ | ||
|  |         defined(__AARCH64EB__) || \ | ||
|  |         defined(_MIPSEB) || \ | ||
|  |         defined(__MIPSEB) || \ | ||
|  |         defined(__MIPSEB__) | ||
|  | #       undef BOOST_ENDIAN_BIG_BYTE | ||
|  | #       define BOOST_ENDIAN_BIG_BYTE BOOST_VERSION_NUMBER_AVAILABLE | ||
|  | #   endif | ||
|  | #endif | ||
|  | 
 | ||
|  | /* Built-in byte-swpped little-endian macros. | ||
|  |  */ | ||
|  | #if !BOOST_ENDIAN_BIG_BYTE && !BOOST_ENDIAN_BIG_WORD && \ | ||
|  |     !BOOST_ENDIAN_LITTLE_BYTE && !BOOST_ENDIAN_LITTLE_WORD | ||
|  | #   if (defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)) || \ | ||
|  |        (defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN)) || \ | ||
|  |         defined(__ARMEL__) || \ | ||
|  |         defined(__THUMBEL__) || \ | ||
|  |         defined(__AARCH64EL__) || \ | ||
|  |         defined(_MIPSEL) || \ | ||
|  |         defined(__MIPSEL) || \ | ||
|  |         defined(__MIPSEL__) | ||
|  | #       undef BOOST_ENDIAN_LITTLE_BYTE | ||
|  | #       define BOOST_ENDIAN_LITTLE_BYTE BOOST_VERSION_NUMBER_AVAILABLE | ||
|  | #   endif | ||
|  | #endif | ||
|  | 
 | ||
|  | /* Some architectures are strictly one endianess (as opposed | ||
|  |  * the current common bi-endianess). | ||
|  |  */ | ||
|  | #if !BOOST_ENDIAN_BIG_BYTE && !BOOST_ENDIAN_BIG_WORD && \ | ||
|  |     !BOOST_ENDIAN_LITTLE_BYTE && !BOOST_ENDIAN_LITTLE_WORD | ||
|  | #   include <boost/predef/architecture.h> | ||
|  | #   if BOOST_ARCH_M68K || \ | ||
|  |         BOOST_ARCH_PARISC || \ | ||
|  |         BOOST_ARCH_SPARC || \ | ||
|  |         BOOST_ARCH_SYS370 || \ | ||
|  |         BOOST_ARCH_SYS390 || \ | ||
|  |         BOOST_ARCH_Z | ||
|  | #       undef BOOST_ENDIAN_BIG_BYTE | ||
|  | #       define BOOST_ENDIAN_BIG_BYTE BOOST_VERSION_NUMBER_AVAILABLE | ||
|  | #   endif | ||
|  | #   if BOOST_ARCH_AMD64 || \ | ||
|  |         BOOST_ARCH_IA64 || \ | ||
|  |         BOOST_ARCH_X86 || \ | ||
|  |         BOOST_ARCH_BLACKFIN | ||
|  | #       undef BOOST_ENDIAN_LITTLE_BYTE | ||
|  | #       define BOOST_ENDIAN_LITTLE_BYTE BOOST_VERSION_NUMBER_AVAILABLE | ||
|  | #   endif | ||
|  | #endif | ||
|  | 
 | ||
|  | /* Windows on ARM, if not otherwise detected/specified, is always | ||
|  |  * byte-swaped little-endian. | ||
|  |  */ | ||
|  | #if !BOOST_ENDIAN_BIG_BYTE && !BOOST_ENDIAN_BIG_WORD && \ | ||
|  |     !BOOST_ENDIAN_LITTLE_BYTE && !BOOST_ENDIAN_LITTLE_WORD | ||
|  | #   if BOOST_ARCH_ARM | ||
|  | #       include <boost/predef/os/windows.h> | ||
|  | #       if BOOST_OS_WINDOWS | ||
|  | #           undef BOOST_ENDIAN_LITTLE_BYTE | ||
|  | #           define BOOST_ENDIAN_LITTLE_BYTE BOOST_VERSION_NUMBER_AVAILABLE | ||
|  | #       endif | ||
|  | #   endif | ||
|  | #endif | ||
|  | 
 | ||
|  | #if BOOST_ENDIAN_BIG_BYTE | ||
|  | #   define BOOST_ENDIAN_BIG_BYTE_AVAILABLE | ||
|  | #endif | ||
|  | #if BOOST_ENDIAN_BIG_WORD | ||
|  | #   define BOOST_ENDIAN_BIG_WORD_BYTE_AVAILABLE | ||
|  | #endif | ||
|  | #if BOOST_ENDIAN_LITTLE_BYTE | ||
|  | #   define BOOST_ENDIAN_LITTLE_BYTE_AVAILABLE | ||
|  | #endif | ||
|  | #if BOOST_ENDIAN_LITTLE_WORD | ||
|  | #   define BOOST_ENDIAN_LITTLE_WORD_BYTE_AVAILABLE | ||
|  | #endif | ||
|  | 
 | ||
|  | #define BOOST_ENDIAN_BIG_BYTE_NAME "Byte-Swapped Big-Endian" | ||
|  | #define BOOST_ENDIAN_BIG_WORD_NAME "Word-Swapped Big-Endian" | ||
|  | #define BOOST_ENDIAN_LITTLE_BYTE_NAME "Byte-Swapped Little-Endian" | ||
|  | #define BOOST_ENDIAN_LITTLE_WORD_NAME "Word-Swapped Little-Endian" | ||
|  | 
 | ||
|  | #endif | ||
|  | 
 | ||
|  | #include <boost/predef/detail/test.h> | ||
|  | BOOST_PREDEF_DECLARE_TEST(BOOST_ENDIAN_BIG_BYTE,BOOST_ENDIAN_BIG_BYTE_NAME) | ||
|  | 
 | ||
|  | #include <boost/predef/detail/test.h> | ||
|  | BOOST_PREDEF_DECLARE_TEST(BOOST_ENDIAN_BIG_WORD,BOOST_ENDIAN_BIG_WORD_NAME) | ||
|  | 
 | ||
|  | #include <boost/predef/detail/test.h> | ||
|  | BOOST_PREDEF_DECLARE_TEST(BOOST_ENDIAN_LITTLE_BYTE,BOOST_ENDIAN_LITTLE_BYTE_NAME) | ||
|  | 
 | ||
|  | #include <boost/predef/detail/test.h> | ||
|  | BOOST_PREDEF_DECLARE_TEST(BOOST_ENDIAN_LITTLE_WORD,BOOST_ENDIAN_LITTLE_WORD_NAME) |