]> git.sesse.net Git - casparcg/blobdiff - common/endian.h
Merge pull request #493 from dimitry-ishenko-casparcg/2.1.0
[casparcg] / common / endian.h
index 6d17d691802e709ab041f04e216b832a3da1847b..e29a4be0599dbc197f5aef72d17b34f9c91cc60e 100644 (file)
 #pragma once
 
 #include <type_traits>
+#include <cstdint>
 
+#ifdef _MSC_VER
 #include <intrin.h>
+#endif
 
 namespace caspar {
 
 template<typename T>
-typename std::enable_if<sizeof(T) == sizeof(unsigned char), T>::type swap_byte_order(
+typename std::enable_if<sizeof(T) == sizeof(std::uint8_t), T>::type swap_byte_order(
                const T& value)
 {
        return value;
 }
 
 template<typename T>
-typename std::enable_if<sizeof(T) == sizeof(unsigned short), T>::type swap_byte_order(
+typename std::enable_if<sizeof(T) == sizeof(std::uint16_t), T>::type swap_byte_order(
                const T& value)
 {
+#ifdef _MSC_VER
        auto swapped = _byteswap_ushort(reinterpret_cast<const unsigned short&>(value));
+#elif __GNUC__
+       auto swapped = __builtin_bswap16(value);
+#endif
+
        return reinterpret_cast<const T&>(swapped);
 }
 
 template<typename T>
-typename std::enable_if<sizeof(T) == sizeof(unsigned long), T>::type swap_byte_order(
+typename std::enable_if<sizeof(T) == sizeof(std::uint32_t), T>::type swap_byte_order(
                const T& value)
 {
+#ifdef _MSC_VER
        auto swapped = _byteswap_ulong(reinterpret_cast<const unsigned long&>(value));
-    return reinterpret_cast<const T&>(swapped);
+#elif __GNUC__
+       auto swapped = __builtin_bswap32(value);
+#endif
+
+       return reinterpret_cast<const T&>(swapped);
 }
 
 template<typename T>
-typename std::enable_if<sizeof(T) == sizeof(unsigned long long), T>::type swap_byte_order(
+typename std::enable_if<sizeof(T) == sizeof(std::uint64_t), T>::type swap_byte_order(
                const T& value)
 {
+#ifdef _MSC_VER
        auto swapped = _byteswap_uint64(reinterpret_cast<const unsigned long long&>(value));
-    return reinterpret_cast<const T&>(swapped);
+#elif __GNUC__
+       auto swapped = __builtin_bswap64(value);
+#endif
+
+       return reinterpret_cast<const T&>(swapped);
 }
 
 }