diff options
Diffstat (limited to 'src/common/swap.h')
-rw-r--r-- | src/common/swap.h | 32 |
1 files changed, 18 insertions, 14 deletions
diff --git a/src/common/swap.h b/src/common/swap.h index f51751d29..beedd6c7e 100644 --- a/src/common/swap.h +++ b/src/common/swap.h @@ -25,6 +25,8 @@ #include <sys/endian.h> #endif +#include <cstring> + #include "common/common_types.h" // GCC 4.6+ @@ -89,27 +91,29 @@ inline u64 swap64(u64 data) {return ((u64)swap32(data) << 32) | swap32(data >> 3 #endif inline float swapf(float f) { - union { - float f; - unsigned int u32; - } dat1, dat2; + static_assert(sizeof(u32) == sizeof(float), + "float must be the same size as uint32_t."); + + u32 value; + std::memcpy(&value, &f, sizeof(u32)); - dat1.f = f; - dat2.u32 = swap32(dat1.u32); + value = swap32(value); + std::memcpy(&f, &value, sizeof(u32)); - return dat2.f; + return f; } inline double swapd(double f) { - union { - double f; - unsigned long long u64; - } dat1, dat2; + static_assert(sizeof(u64) == sizeof(double), + "double must be the same size as uint64_t."); + + u64 value; + std::memcpy(&value, &f, sizeof(u64)); - dat1.f = f; - dat2.u64 = swap64(dat1.u64); + value = swap64(value); + std::memcpy(&f, &value, sizeof(u64)); - return dat2.f; + return f; } } // Namespace Common |