diff --git a/taglib/toolkit/tbytevector.cpp b/taglib/toolkit/tbytevector.cpp index 63bce4cc..0ea7517c 100644 --- a/taglib/toolkit/tbytevector.cpp +++ b/taglib/toolkit/tbytevector.cpp @@ -31,19 +31,10 @@ #include #include -#if defined(HAVE_MSC_BYTESWAP) -# include -#elif defined(HAVE_GLIBC_BYTESWAP) -# include -#elif defined(HAVE_MAC_BYTESWAP) -# include -#elif defined(HAVE_OPENBSD_BYTESWAP) -# include -#endif - #include #include #include "trefcounter.h" +#include "tutils.h" #include "tbytevector.h" @@ -190,114 +181,6 @@ int findVector( return -1; } -template -T byteSwap(T x) -{ - // There should be all counterparts of to*() and from*() overloads for integral types. - debug("byteSwap() -- Non specialized version should not be called"); - return 0; -} - -template <> -ushort byteSwap(ushort x) -{ -#if defined(HAVE_GCC_BYTESWAP_16) - - return __builtin_bswap16(x); - -#elif defined(HAVE_MSC_BYTESWAP) - - return _byteswap_ushort(x); - -#elif defined(HAVE_GLIBC_BYTESWAP) - - return __bswap_16(x); - -#elif defined(HAVE_MAC_BYTESWAP) - - return OSSwapInt16(x); - -#elif defined(HAVE_OPENBSD_BYTESWAP) - - return swap16(x); - -#else - - return ((x >> 8) & 0xff) | ((x & 0xff) << 8); - -#endif -} - -template <> -uint byteSwap(uint x) -{ -#if defined(HAVE_GCC_BYTESWAP_32) - - return __builtin_bswap32(x); - -#elif defined(HAVE_MSC_BYTESWAP) - - return _byteswap_ulong(x); - -#elif defined(HAVE_GLIBC_BYTESWAP) - - return __bswap_32(x); - -#elif defined(HAVE_MAC_BYTESWAP) - - return OSSwapInt32(x); - -#elif defined(HAVE_OPENBSD_BYTESWAP) - - return swap32(x); - -#else - - return ((x & 0xff000000u) >> 24) - | ((x & 0x00ff0000u) >> 8) - | ((x & 0x0000ff00u) << 8) - | ((x & 0x000000ffu) << 24); - -#endif -} - -template <> -ulonglong byteSwap(ulonglong x) -{ -#if defined(HAVE_GCC_BYTESWAP_64) - - return __builtin_bswap64(x); - -#elif defined(HAVE_MSC_BYTESWAP) - - return _byteswap_uint64(x); - -#elif defined(HAVE_GLIBC_BYTESWAP) - - return __bswap_64(x); - -#elif defined(HAVE_MAC_BYTESWAP) - - return OSSwapInt64(x); - -#elif defined(HAVE_OPENBSD_BYTESWAP) - - return swap64(x); - -#else - - return ((x & 0xff00000000000000ull) >> 56) - | ((x & 0x00ff000000000000ull) >> 40) - | ((x & 0x0000ff0000000000ull) >> 24) - | ((x & 0x000000ff00000000ull) >> 8) - | ((x & 0x00000000ff000000ull) << 8) - | ((x & 0x0000000000ff0000ull) << 24) - | ((x & 0x000000000000ff00ull) << 40) - | ((x & 0x00000000000000ffull) << 56); - -#endif -} - template T toNumber(const ByteVector &v, size_t offset, size_t length, bool mostSignificantByteFirst) { @@ -333,7 +216,7 @@ T toNumber(const ByteVector &v, size_t offset, bool mostSignificantByteFirst) const bool swap != mostSignificantByteFirst; #endif if(swap) - return byteSwap(tmp); + return byteSwap(tmp); else return tmp; } @@ -349,7 +232,7 @@ ByteVector fromNumber(T value, bool mostSignificantByteFirst) const bool swap != mostSignificantByteFirst; #endif if(swap) - value = byteSwap(value); + value = byteSwap(value); return ByteVector(reinterpret_cast(&value), size); } diff --git a/taglib/toolkit/tstring.cpp b/taglib/toolkit/tstring.cpp index 8fcbb2de..d28855b8 100644 --- a/taglib/toolkit/tstring.cpp +++ b/taglib/toolkit/tstring.cpp @@ -33,21 +33,12 @@ #include "tdebug.h" #include "tstringlist.h" #include "trefcounter.h" +#include "tutils.h" #include #include #include -#if defined(HAVE_MSC_BYTESWAP) -# include -#elif defined(HAVE_GLIBC_BYTESWAP) -# include -#elif defined(HAVE_MAC_BYTESWAP) -# include -#elif defined(HAVE_OPENBSD_BYTESWAP) -# include -#endif - #ifdef HAVE_STD_CODECVT # include #else @@ -56,34 +47,6 @@ namespace { - inline TagLib::ushort byteSwap(TagLib::ushort x) - { -#if defined(HAVE_GCC_BYTESWAP_16) - - return __builtin_bswap16(x); - -#elif defined(HAVE_MSC_BYTESWAP) - - return _byteswap_ushort(x); - -#elif defined(HAVE_GLIBC_BYTESWAP) - - return __bswap_16(x); - -#elif defined(HAVE_MAC_BYTESWAP) - - return OSSwapInt16(x); - -#elif defined(HAVE_OPENBSD_BYTESWAP) - - return swap16(x); - -#else - - return ((x >> 8) & 0xff) | ((x & 0xff) << 8); - -#endif - } inline unsigned short combine(unsigned char c1, unsigned char c2) { diff --git a/taglib/toolkit/tutils.h b/taglib/toolkit/tutils.h new file mode 100644 index 00000000..73c35716 --- /dev/null +++ b/taglib/toolkit/tutils.h @@ -0,0 +1,151 @@ +/*************************************************************************** + copyright : (C) 2013 by Tsuda Kageyu + email : tsuda.kageyu@gmail.com + ***************************************************************************/ + +/*************************************************************************** + * This library is free software; you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License version * + * 2.1 as published by the Free Software Foundation. * + * * + * This library is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * + * 02110-1301 USA * + * * + * Alternatively, this file is available under the Mozilla Public * + * License Version 1.1. You may obtain a copy of the License at * + * http://www.mozilla.org/MPL/ * + ***************************************************************************/ + +#ifndef TAGLIB_TUTILS_H +#define TAGLIB_TUTILS_H + +// THIS FILE IS NOT A PART OF THE TAGLIB API + +#ifndef DO_NOT_DOCUMENT // tell Doxygen not to document this header + +#ifdef HAVE_CONFIG_H +#include +#endif + +#if defined(HAVE_MSC_BYTESWAP) +# include +#elif defined(HAVE_GLIBC_BYTESWAP) +# include +#elif defined(HAVE_MAC_BYTESWAP) +# include +#elif defined(HAVE_OPENBSD_BYTESWAP) +# include +#endif + +namespace TagLib +{ + + inline ushort byteSwap(ushort x) + { +#if defined(HAVE_GCC_BYTESWAP_16) + + return __builtin_bswap16(x); + +#elif defined(HAVE_MSC_BYTESWAP) + + return _byteswap_ushort(x); + +#elif defined(HAVE_GLIBC_BYTESWAP) + + return __bswap_16(x); + +#elif defined(HAVE_MAC_BYTESWAP) + + return OSSwapInt16(x); + +#elif defined(HAVE_OPENBSD_BYTESWAP) + + return swap16(x); + +#else + + return ((x >> 8) & 0xff) | ((x & 0xff) << 8); + +#endif + } + + inline uint byteSwap(uint x) + { +#if defined(HAVE_GCC_BYTESWAP_32) + + return __builtin_bswap32(x); + +#elif defined(HAVE_MSC_BYTESWAP) + + return _byteswap_ulong(x); + +#elif defined(HAVE_GLIBC_BYTESWAP) + + return __bswap_32(x); + +#elif defined(HAVE_MAC_BYTESWAP) + + return OSSwapInt32(x); + +#elif defined(HAVE_OPENBSD_BYTESWAP) + + return swap32(x); + +#else + + return ((x & 0xff000000u) >> 24) + | ((x & 0x00ff0000u) >> 8) + | ((x & 0x0000ff00u) << 8) + | ((x & 0x000000ffu) << 24); + +#endif + } + + inline ulonglong byteSwap(ulonglong x) + { +#if defined(HAVE_GCC_BYTESWAP_64) + + return __builtin_bswap64(x); + +#elif defined(HAVE_MSC_BYTESWAP) + + return _byteswap_uint64(x); + +#elif defined(HAVE_GLIBC_BYTESWAP) + + return __bswap_64(x); + +#elif defined(HAVE_MAC_BYTESWAP) + + return OSSwapInt64(x); + +#elif defined(HAVE_OPENBSD_BYTESWAP) + + return swap64(x); + +#else + + return ((x & 0xff00000000000000ull) >> 56) + | ((x & 0x00ff000000000000ull) >> 40) + | ((x & 0x0000ff0000000000ull) >> 24) + | ((x & 0x000000ff00000000ull) >> 8) + | ((x & 0x00000000ff000000ull) << 8) + | ((x & 0x0000000000ff0000ull) << 24) + | ((x & 0x000000000000ff00ull) << 40) + | ((x & 0x00000000000000ffull) << 56); + +#endif + } + +}; + +#endif + +#endif