[PATCH] D59141: [Support/Endian] Add support for endian-specific enums

Pavel Labath via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 8 12:17:06 PST 2019


labath updated this revision to Diff 189907.
labath added a comment.

Add aligned_{big/little}_t as well.


Repository:
  rL LLVM

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D59141/new/

https://reviews.llvm.org/D59141

Files:
  include/llvm/Support/Endian.h
  include/llvm/Support/SwapByteOrder.h
  unittests/Support/EndianTest.cpp


Index: unittests/Support/EndianTest.cpp
===================================================================
--- unittests/Support/EndianTest.cpp
+++ unittests/Support/EndianTest.cpp
@@ -200,4 +200,13 @@
   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
Index: include/llvm/Support/SwapByteOrder.h
===================================================================
--- include/llvm/Support/SwapByteOrder.h
+++ include/llvm/Support/SwapByteOrder.h
@@ -115,6 +115,13 @@
   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);
Index: include/llvm/Support/Endian.h
===================================================================
--- include/llvm/Support/Endian.h
+++ include/llvm/Support/Endian.h
@@ -338,6 +338,17 @@
 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) {


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D59141.189907.patch
Type: text/x-patch
Size: 2008 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190308/a33bb915/attachment.bin>


More information about the llvm-commits mailing list