From dbbc835ca275b6c8623e6adcaa8cd5e85e9d6aea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Thu, 16 Dec 2021 00:30:22 +0100 Subject: [PATCH] Havok: Add hkEnum and hkFlags --- lib/hkStubs/.clang-tidy | 3 + lib/hkStubs/CMakeLists.txt | 1 + .../Havok/Common/Base/Types/hkBaseDefs.h | 5 ++ .../Havok/Common/Base/Types/hkBaseTypes.h | 56 +++++++++++++++++++ lib/hkStubs/Havok/Common/Base/hkBase.h | 1 + 5 files changed, 66 insertions(+) create mode 100644 lib/hkStubs/.clang-tidy create mode 100644 lib/hkStubs/Havok/Common/Base/Types/hkBaseDefs.h diff --git a/lib/hkStubs/.clang-tidy b/lib/hkStubs/.clang-tidy new file mode 100644 index 00000000..31a44c37 --- /dev/null +++ b/lib/hkStubs/.clang-tidy @@ -0,0 +1,3 @@ +--- +InheritParentConfig: true +Checks: "-modernize-use-equals-default" diff --git a/lib/hkStubs/CMakeLists.txt b/lib/hkStubs/CMakeLists.txt index c6c2dead..b81a1684 100644 --- a/lib/hkStubs/CMakeLists.txt +++ b/lib/hkStubs/CMakeLists.txt @@ -2,6 +2,7 @@ project(hkStubs CXX ASM) add_library(hkStubs OBJECT Havok/Common/Base/Container/String/hkStringPtr.h + Havok/Common/Base/Types/hkBaseDefs.h Havok/Common/Base/Types/hkBaseTypes.h Havok/Common/Base/hkBase.h Havok/Common/Base/Math/hkMath.h diff --git a/lib/hkStubs/Havok/Common/Base/Types/hkBaseDefs.h b/lib/hkStubs/Havok/Common/Base/Types/hkBaseDefs.h new file mode 100644 index 00000000..c8e55687 --- /dev/null +++ b/lib/hkStubs/Havok/Common/Base/Types/hkBaseDefs.h @@ -0,0 +1,5 @@ +#pragma once + +#define HK_FORCE_INLINE inline +#define HK_ALWAYS_INLINE HK_FORCE_INLINE +#define HK_NEVER_INLINE __attribute__((noinline)) diff --git a/lib/hkStubs/Havok/Common/Base/Types/hkBaseTypes.h b/lib/hkStubs/Havok/Common/Base/Types/hkBaseTypes.h index 9e7752e6..5a7018b8 100644 --- a/lib/hkStubs/Havok/Common/Base/Types/hkBaseTypes.h +++ b/lib/hkStubs/Havok/Common/Base/Types/hkBaseTypes.h @@ -62,3 +62,59 @@ public: private: hkInt16 m_value; }; + +/// For storing an enum with a particular storage size when specifying the underlying type of the +/// enum is not an option. +template +struct hkEnum { + HK_ALWAYS_INLINE hkEnum() {} + + hkEnum(Enum value) { *this = value; } // NOLINT(google-explicit-constructor) + + // NOLINTNEXTLINE(google-explicit-constructor) + operator Enum() const { return static_cast(m_storage); } + + hkEnum& operator=(Enum value) { + m_storage = static_cast(value); + return *this; + } + + bool operator==(Enum e) const { return m_storage == static_cast(e); } + bool operator!=(Enum e) const { return m_storage != static_cast(e); } + + Storage m_storage; +}; + +template +class hkFlags { +public: + HK_FORCE_INLINE hkFlags() {} + HK_FORCE_INLINE explicit hkFlags(Storage s) : m_storage(s) {} + + HK_FORCE_INLINE void clear() { m_storage = 0; } + HK_FORCE_INLINE void clear(Storage mask) { m_storage &= ~mask; } + HK_FORCE_INLINE void setAll(Storage s) { m_storage = s; } + + HK_FORCE_INLINE void operator|=(Storage s) { m_storage |= s; } + HK_FORCE_INLINE void operator^=(Storage s) { m_storage ^= s; } + HK_FORCE_INLINE void operator&=(Storage s) { m_storage &= s; } + + HK_FORCE_INLINE void setWithMask(Storage s, Storage mask) { + m_storage = (m_storage & ~mask) | (s & mask); + } + + HK_FORCE_INLINE Storage get() const { return m_storage; } + HK_FORCE_INLINE bool anyIsSet(Storage mask) const { return (m_storage & mask) != 0; } + HK_FORCE_INLINE bool noneIsSet(Storage mask) const { return (m_storage & mask) == 0; } + HK_FORCE_INLINE bool allAreSet(Storage mask) const { return (m_storage & mask) == mask; } + + HK_FORCE_INLINE bool operator==(const hkFlags& other) const { + return other.m_storage == m_storage; + } + HK_FORCE_INLINE bool operator!=(const hkFlags& other) const { + return other.m_storage != m_storage; + } + +private: + Storage m_storage; +}; diff --git a/lib/hkStubs/Havok/Common/Base/hkBase.h b/lib/hkStubs/Havok/Common/Base/hkBase.h index ddb7b42b..c79c768a 100644 --- a/lib/hkStubs/Havok/Common/Base/hkBase.h +++ b/lib/hkStubs/Havok/Common/Base/hkBase.h @@ -2,6 +2,7 @@ #include #include +#include #include #include