From e24c7a474cad86a55917675284597889f13cae33 Mon Sep 17 00:00:00 2001 From: bunnei Date: Thu, 5 Apr 2018 21:44:22 -0400 Subject: [PATCH 1/2] bit_field: Make all methods constexpr. --- src/common/bit_field.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/common/bit_field.h b/src/common/bit_field.h index 574e211a8..289a2a2ca 100644 --- a/src/common/bit_field.h +++ b/src/common/bit_field.h @@ -125,7 +125,7 @@ private: using StorageTypeWithEndian = typename AddEndian::type; public: - BitField& operator=(const BitField&) = default; + constexpr BitField& operator=(const BitField&) = default; /// Constants to allow limited introspection of fields if needed static constexpr std::size_t position = Position; @@ -166,15 +166,15 @@ public: // so that we can use this within unions constexpr BitField() = default; - FORCE_INLINE operator T() const { + constexpr FORCE_INLINE operator T() const { return Value(); } - FORCE_INLINE void Assign(const T& value) { + constexpr FORCE_INLINE void Assign(const T& value) { storage = (static_cast(storage) & ~mask) | FormatValue(value); } - FORCE_INLINE T Value() const { + constexpr T Value() const { return ExtractValue(storage); } From f8b3617394f08d0d310258433ce23ee0e703d7ce Mon Sep 17 00:00:00 2001 From: bunnei Date: Tue, 17 Apr 2018 18:00:18 -0400 Subject: [PATCH 2/2] bit_field: Remove is_pod check, add is_trivially_copyable_v. --- src/common/bit_field.h | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/common/bit_field.h b/src/common/bit_field.h index 289a2a2ca..99859d0b1 100644 --- a/src/common/bit_field.h +++ b/src/common/bit_field.h @@ -166,11 +166,11 @@ public: // so that we can use this within unions constexpr BitField() = default; - constexpr FORCE_INLINE operator T() const { + constexpr operator T() const { return Value(); } - constexpr FORCE_INLINE void Assign(const T& value) { + constexpr void Assign(const T& value) { storage = (static_cast(storage) & ~mask) | FormatValue(value); } @@ -191,12 +191,9 @@ private: static_assert(position < 8 * sizeof(T), "Invalid position"); static_assert(bits <= 8 * sizeof(T), "Invalid number of bits"); static_assert(bits > 0, "Invalid number of bits"); - static_assert(std::is_pod::value, "Invalid base type"); + static_assert(std::is_trivially_copyable_v, "T must be trivially copyable in a BitField"); }; #pragma pack() -static_assert(std::is_trivially_copyable>::value, - "BitField must be trivially copyable"); - template using BitFieldBE = BitField;