
Here's my proposed <boost/detail/endian.hpp>. I'm just verifying that everything still compiles for me and the appropriate tests now succeed before committing. I copied the endian-detection code from <boost/detail/limits.hpp>, and therefore reproduced the SGI copyright notice. I'm not sure if this endianness detection was part of the original SGI version of that file, but it appears that a number of Boosters have added various CPUs to the list. Not sure if this is the correct copyright to use in this case. I also added the #if defined (__GLIBC__) block at the top. This should aid in ports to any platform where GNU libc is used, but where the CPU is not one of the small set of known types. I took the liberty of adding the macro BOOST_BYTE_ORDER, which is the moral equivalent of __BYTE_ORDER from GNU libc's <endian.h>. Let me know if this namespace pollution is a bad idea and I'll remove it, but I think it is more useful than BOOST_{BIG, LITTLE}_ENDIAN. I won't even begin to try and address Jody's point about runtime endian-switching CPUs. Yikes! /* * Copyright (c) 1997 * Silicon Graphics Computer Systems, Inc. * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, * provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in supporting documentation. Silicon Graphics makes no * representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied warranty. */ /* * Copyright notice reproduced from <boost/detail/limits.hpp>, from * which this code was originally taken. * * Modified by Caleb Epstein to use <endian.h> with GNU libc and to * defined the BOOST_ENDIAN macro. */ #ifndef BOOST_DETAIL_ENDIAN_HPP #define BOOST_DETAIL_ENDIAN_HPP // GNU libc offers the helpful header <endian.h> which defines // __BYTE_ORDER #if defined (__GLIBC__) # include <endian.h> # if (__BYTE_ORDER == __LITTLE_ENDIAN) # define BOOST_LITTLE_ENDIAN # elif (__BYTE_ORDER == __BIG_ENDIAN) # define BOOST_BIG_ENDIAN # elif (__BYTE_ORDER == __PDP_ENDIAN) # define BOOST_PDP_ENDIAN # else # error Unknown machine endianness detected. # endif # define BOOST_BYTE_ORDER __BYTE_ORDER #elif defined(__sparc) || defined(__sparc__) \ || defined(_POWER) || defined(__powerpc__) \ || defined(__ppc__) || defined(__hppa) \ || defined(_MIPSEB) || defined(_POWER) \ || defined(__s390__) # define BOOST_BIG_ENDIAN # define BOOST_BYTE_ORDER 4321 #elif defined(__i386__) || defined(__alpha__) \ || defined(__ia64) || defined(__ia64__) # define BOOST_LITTLE_ENDIAN # define BOOST_BYTE_ORDER 1234 #else # error The file boost/detail/endian.hpp needs to be set up for your CPU type. #endif #endif -- Caleb Epstein caleb dot epstein at gmail dot com