]> granicus.if.org Git - taglib/commitdiff
Make use of the Boost Endian library for byte swapping.
authorTsuda Kageyu <tsuda.kageyu@gmail.com>
Fri, 13 Nov 2015 01:58:23 +0000 (10:58 +0900)
committerTsuda Kageyu <tsuda.kageyu@gmail.com>
Fri, 13 Nov 2015 01:58:23 +0000 (10:58 +0900)
It's likely to be better at choosing the most efficient method than our CMake tests.

ConfigureChecks.cmake
config.h.cmake
taglib/toolkit/tutils.h

index 5c740756fc93896a797f18237807ced18de6839a..3fa01bb1bd905ec6e28bafb85aebc26ffb941579 100644 (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()
index 12e713fc5db636b3e8ac2c1183098a8841d4d4e8..55affab6cc7e3996cdf5f6c86cacd80cc8e44f3a 100644 (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
index 82f1dd9af5ff3467fc9df1a07114464c0ea35470..5c204d852de2ea4a936e7971f7d2a63f1806fd67 100644 (file)
 #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);