diff options
| -rw-r--r-- | llvm/include/llvm/Support/Endian.h | 11 | ||||
| -rw-r--r-- | llvm/include/llvm/Support/SwapByteOrder.h | 7 | ||||
| -rw-r--r-- | llvm/unittests/Support/EndianTest.cpp | 9 |
3 files changed, 27 insertions, 0 deletions
diff --git a/llvm/include/llvm/Support/Endian.h b/llvm/include/llvm/Support/Endian.h index 5c1e89ae793..d8be94427d7 100644 --- a/llvm/include/llvm/Support/Endian.h +++ b/llvm/include/llvm/Support/Endian.h @@ -338,6 +338,17 @@ using unaligned_int32_t = using unaligned_int64_t = detail::packed_endian_specific_integral<int64_t, native, unaligned>; +template <typename T> +using little_t = detail::packed_endian_specific_integral<T, little, unaligned>; +template <typename T> +using big_t = detail::packed_endian_specific_integral<T, big, unaligned>; + +template <typename T> +using aligned_little_t = + detail::packed_endian_specific_integral<T, little, aligned>; +template <typename T> +using aligned_big_t = detail::packed_endian_specific_integral<T, big, aligned>; + namespace endian { template <typename T> inline T read(const void *P, endianness E) { diff --git a/llvm/include/llvm/Support/SwapByteOrder.h b/llvm/include/llvm/Support/SwapByteOrder.h index f58b4d911d4..380ca0a781f 100644 --- a/llvm/include/llvm/Support/SwapByteOrder.h +++ b/llvm/include/llvm/Support/SwapByteOrder.h @@ -115,6 +115,13 @@ inline double getSwappedBytes(double C) { return out.d; } +template <typename T> +inline typename std::enable_if<std::is_enum<T>::value, T>::type +getSwappedBytes(T C) { + return static_cast<T>( + getSwappedBytes(static_cast<typename std::underlying_type<T>::type>(C))); +} + template<typename T> inline void swapByteOrder(T &Value) { Value = getSwappedBytes(Value); diff --git a/llvm/unittests/Support/EndianTest.cpp b/llvm/unittests/Support/EndianTest.cpp index c2b29288537..b5e4a9c8d14 100644 --- a/llvm/unittests/Support/EndianTest.cpp +++ b/llvm/unittests/Support/EndianTest.cpp @@ -200,4 +200,13 @@ TEST(Endian, PackedEndianSpecificIntegral) { EXPECT_EQ(*big_val, *little_val); } +TEST(Endian, PacketEndianSpecificIntegralAsEnum) { + enum class Test : uint16_t { ONETWO = 0x0102, TWOONE = 0x0201 }; + unsigned char bytes[] = {0x01, 0x02}; + using LittleTest = little_t<Test>; + using BigTest = big_t<Test>; + EXPECT_EQ(Test::TWOONE, *reinterpret_cast<LittleTest *>(bytes)); + EXPECT_EQ(Test::ONETWO, *reinterpret_cast<BigTest *>(bytes)); +} + } // end anon namespace |

