From 2d427e0502e0bcbc0a76badd0c8dea634ddd273a Mon Sep 17 00:00:00 2001 From: Wouter van Oortmerssen Date: Mon, 25 Jul 2016 16:26:50 -0700 Subject: [PATCH] Pulled out EndianSwap into its own function. Change-Id: I4a587102db8c435b739c92b6c464c94c4ea1fe42 --- include/flatbuffers/flatbuffers.h | 60 ++++++++++++++++--------------- 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/include/flatbuffers/flatbuffers.h b/include/flatbuffers/flatbuffers.h index 921d1dac1..1a6908261 100644 --- a/include/flatbuffers/flatbuffers.h +++ b/include/flatbuffers/flatbuffers.h @@ -151,39 +151,41 @@ inline void EndianCheck() { (void)endiantest; } +template T EndianSwap(T t) { + #if defined(_MSC_VER) + #pragma push_macro("__builtin_bswap16") + #pragma push_macro("__builtin_bswap32") + #pragma push_macro("__builtin_bswap64") + #define __builtin_bswap16 _byteswap_ushort + #define __builtin_bswap32 _byteswap_ulong + #define __builtin_bswap64 _byteswap_uint64 + #endif + if (sizeof(T) == 1) { // Compile-time if-then's. + return t; + } else if (sizeof(T) == 2) { + auto r = __builtin_bswap16(*reinterpret_cast(&t)); + return *reinterpret_cast(&r); + } else if (sizeof(T) == 4) { + auto r = __builtin_bswap32(*reinterpret_cast(&t)); + return *reinterpret_cast(&r); + } else if (sizeof(T) == 8) { + auto r = __builtin_bswap64(*reinterpret_cast(&t)); + return *reinterpret_cast(&r); + } else { + assert(0); + } + #if defined(_MSC_VER) + #pragma pop_macro("__builtin_bswap16") + #pragma pop_macro("__builtin_bswap32") + #pragma pop_macro("__builtin_bswap64") + #endif +} + template T EndianScalar(T t) { #if FLATBUFFERS_LITTLEENDIAN return t; #else - #if defined(_MSC_VER) - #pragma push_macro("__builtin_bswap16") - #pragma push_macro("__builtin_bswap32") - #pragma push_macro("__builtin_bswap64") - #define __builtin_bswap16 _byteswap_ushort - #define __builtin_bswap32 _byteswap_ulong - #define __builtin_bswap64 _byteswap_uint64 - #endif - // If you're on the few remaining big endian platforms, we make the bold - // assumption you're also on gcc/clang, and thus have bswap intrinsics: - if (sizeof(T) == 1) { // Compile-time if-then's. - return t; - } else if (sizeof(T) == 2) { - auto r = __builtin_bswap16(*reinterpret_cast(&t)); - return *reinterpret_cast(&r); - } else if (sizeof(T) == 4) { - auto r = __builtin_bswap32(*reinterpret_cast(&t)); - return *reinterpret_cast(&r); - } else if (sizeof(T) == 8) { - auto r = __builtin_bswap64(*reinterpret_cast(&t)); - return *reinterpret_cast(&r); - } else { - assert(0); - } - #if defined(_MSC_VER) - #pragma pop_macro("__builtin_bswap16") - #pragma pop_macro("__builtin_bswap32") - #pragma pop_macro("__builtin_bswap64") - #endif + return EndianSwap(t); #endif }