mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-23 05:40:02 +00:00
Pulled out EndianSwap into its own function.
Change-Id: I4a587102db8c435b739c92b6c464c94c4ea1fe42
This commit is contained in:
@@ -151,39 +151,41 @@ inline void EndianCheck() {
|
|||||||
(void)endiantest;
|
(void)endiantest;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename T> 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<uint16_t *>(&t));
|
||||||
|
return *reinterpret_cast<T *>(&r);
|
||||||
|
} else if (sizeof(T) == 4) {
|
||||||
|
auto r = __builtin_bswap32(*reinterpret_cast<uint32_t *>(&t));
|
||||||
|
return *reinterpret_cast<T *>(&r);
|
||||||
|
} else if (sizeof(T) == 8) {
|
||||||
|
auto r = __builtin_bswap64(*reinterpret_cast<uint64_t *>(&t));
|
||||||
|
return *reinterpret_cast<T *>(&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<typename T> T EndianScalar(T t) {
|
template<typename T> T EndianScalar(T t) {
|
||||||
#if FLATBUFFERS_LITTLEENDIAN
|
#if FLATBUFFERS_LITTLEENDIAN
|
||||||
return t;
|
return t;
|
||||||
#else
|
#else
|
||||||
#if defined(_MSC_VER)
|
return EndianSwap(t);
|
||||||
#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<uint16_t *>(&t));
|
|
||||||
return *reinterpret_cast<T *>(&r);
|
|
||||||
} else if (sizeof(T) == 4) {
|
|
||||||
auto r = __builtin_bswap32(*reinterpret_cast<uint32_t *>(&t));
|
|
||||||
return *reinterpret_cast<T *>(&r);
|
|
||||||
} else if (sizeof(T) == 8) {
|
|
||||||
auto r = __builtin_bswap64(*reinterpret_cast<uint64_t *>(&t));
|
|
||||||
return *reinterpret_cast<T *>(&r);
|
|
||||||
} else {
|
|
||||||
assert(0);
|
|
||||||
}
|
|
||||||
#if defined(_MSC_VER)
|
|
||||||
#pragma pop_macro("__builtin_bswap16")
|
|
||||||
#pragma pop_macro("__builtin_bswap32")
|
|
||||||
#pragma pop_macro("__builtin_bswap64")
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user