Make use of the Boost Endian library for byte swapping.

It's likely to be better at choosing the most efficient method than our CMake tests.
This commit is contained in:
Tsuda Kageyu 2015-11-13 10:58:23 +09:00
parent 86c7e905ba
commit 6775cef651
3 changed files with 60 additions and 33 deletions

View File

@ -108,57 +108,69 @@ endif()
# Determine which kind of byte swap functions your compiler supports.
check_cxx_source_compiles("
#include <boost/endian/conversion.hpp>
int main() {
__builtin_bswap16(0);
__builtin_bswap32(0);
__builtin_bswap64(0);
boost::endian::endian_reverse(static_cast<uint16_t>(1));
boost::endian::endian_reverse(static_cast<uint32_t>(1));
boost::endian::endian_reverse(static_cast<uint64_t>(1));
return 0;
}
" HAVE_GCC_BYTESWAP)
" HAVE_BOOST_BYTESWAP)
if(NOT HAVE_GCC_BYTESWAP)
if(NOT HAVE_BOOST_BYTESWAP)
check_cxx_source_compiles("
#include <byteswap.h>
int main() {
__bswap_16(0);
__bswap_32(0);
__bswap_64(0);
__builtin_bswap16(0);
__builtin_bswap32(0);
__builtin_bswap64(0);
return 0;
}
" HAVE_GLIBC_BYTESWAP)
" HAVE_GCC_BYTESWAP)
if(NOT HAVE_GLIBC_BYTESWAP)
if(NOT HAVE_GCC_BYTESWAP)
check_cxx_source_compiles("
#include <stdlib.h>
#include <byteswap.h>
int main() {
_byteswap_ushort(0);
_byteswap_ulong(0);
_byteswap_uint64(0);
__bswap_16(0);
__bswap_32(0);
__bswap_64(0);
return 0;
}
" HAVE_MSC_BYTESWAP)
" HAVE_GLIBC_BYTESWAP)
if(NOT HAVE_MSC_BYTESWAP)
if(NOT HAVE_GLIBC_BYTESWAP)
check_cxx_source_compiles("
#include <libkern/OSByteOrder.h>
#include <stdlib.h>
int main() {
OSSwapInt16(0);
OSSwapInt32(0);
OSSwapInt64(0);
_byteswap_ushort(0);
_byteswap_ulong(0);
_byteswap_uint64(0);
return 0;
}
" HAVE_MAC_BYTESWAP)
" HAVE_MSC_BYTESWAP)
if(NOT HAVE_MAC_BYTESWAP)
if(NOT HAVE_MSC_BYTESWAP)
check_cxx_source_compiles("
#include <sys/endian.h>
#include <libkern/OSByteOrder.h>
int main() {
swap16(0);
swap32(0);
swap64(0);
OSSwapInt16(0);
OSSwapInt32(0);
OSSwapInt64(0);
return 0;
}
" HAVE_OPENBSD_BYTESWAP)
" HAVE_MAC_BYTESWAP)
if(NOT HAVE_MAC_BYTESWAP)
check_cxx_source_compiles("
#include <sys/endian.h>
int main() {
swap16(0);
swap32(0);
swap64(0);
return 0;
}
" HAVE_OPENBSD_BYTESWAP)
endif()
endif()
endif()
endif()

View File

@ -1,6 +1,7 @@
/* config.h. Generated by cmake from config.h.cmake */
/* Defined if your compiler supports some byte swap functions */
#cmakedefine HAVE_BOOST_BYTESWAP 1
#cmakedefine HAVE_GCC_BYTESWAP 1
#cmakedefine HAVE_GLIBC_BYTESWAP 1
#cmakedefine HAVE_MSC_BYTESWAP 1

View File

@ -31,10 +31,12 @@
#ifndef DO_NOT_DOCUMENT // tell Doxygen not to document this header
#ifdef HAVE_CONFIG_H
#include <config.h>
# include <config.h>
#endif
#if defined(HAVE_MSC_BYTESWAP)
#if defined(HAVE_BOOST_BYTESWAP)
# include <boost/endian/conversion.hpp>
#elif defined(HAVE_MSC_BYTESWAP)
# include <stdlib.h>
#elif defined(HAVE_GLIBC_BYTESWAP)
# include <byteswap.h>
@ -59,7 +61,11 @@ namespace TagLib
*/
inline ushort byteSwap(ushort x)
{
#if defined(HAVE_GCC_BYTESWAP)
#if defined(HAVE_BOOST_BYTESWAP)
return boost::endian::endian_reverse(x);
#elif defined(HAVE_GCC_BYTESWAP)
return __builtin_bswap16(x);
@ -91,7 +97,11 @@ namespace TagLib
*/
inline uint byteSwap(uint x)
{
#if defined(HAVE_GCC_BYTESWAP)
#if defined(HAVE_BOOST_BYTESWAP)
return boost::endian::endian_reverse(x);
#elif defined(HAVE_GCC_BYTESWAP)
return __builtin_bswap32(x);
@ -126,7 +136,11 @@ namespace TagLib
*/
inline ulonglong byteSwap(ulonglong x)
{
#if defined(HAVE_GCC_BYTESWAP)
#if defined(HAVE_BOOST_BYTESWAP)
return boost::endian::endian_reverse(x);
#elif defined(HAVE_GCC_BYTESWAP)
return __builtin_bswap64(x);