From a1aef36c836844cbe0ee52e1482550d4c13fd928 Mon Sep 17 00:00:00 2001 From: Martchus Date: Fri, 29 Jul 2022 22:01:51 +0200 Subject: [PATCH] Add `checkFlagEnum()` and tests for `flagenumclass.h` --- misc/flagenumclass.h | 11 +++++++++++ tests/misctests.cpp | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/misc/flagenumclass.h b/misc/flagenumclass.h index b72f15e..e7e4a38 100644 --- a/misc/flagenumclass.h +++ b/misc/flagenumclass.h @@ -85,6 +85,17 @@ constexpr FlagEnumClass &modFlagEnum(FlagEnumClass &flagVariable, FlagEnumClass return value ? (flagVariable += relevantFlags) : (flagVariable -= relevantFlags); } +/*! + * \brief Returns whether the specified \a flagVariable has set all flags specified via \a flagsToCheck to true. + */ +template > * = nullptr> +constexpr bool checkFlagEnum(FlagEnumClass flagVariable, FlagEnumClass flagsToCheck) +{ + return (static_cast::type>(flagVariable) + & static_cast::type>(flagsToCheck)) + == static_cast::type>(flagsToCheck); +} + } // namespace CppUtilities #endif // CPP_UTILITIES_FLAG_ENUM_CLASS_H diff --git a/tests/misctests.cpp b/tests/misctests.cpp index 0dc1992..65a2126 100644 --- a/tests/misctests.cpp +++ b/tests/misctests.cpp @@ -1,3 +1,4 @@ +#include "../misc/flagenumclass.h" #include "../misc/levenshtein.h" #include "../misc/multiarray.h" @@ -171,3 +172,35 @@ void MiscTests::testTestUtilities() TESTUTILS_ASSERT_LIKE("assert like works", ".*foo.*", " foo "); } + +// test flagenumclass.h + +namespace FlagEnumTests { +enum class TestFlags { None, Foo = 1, Bar = 2, Baz = 4, Biz = 8 }; +} + +CPP_UTILITIES_MARK_FLAG_ENUM_CLASS(FlagEnumTests, FlagEnumTests::TestFlags); + +namespace FlagEnumTests { + +constexpr bool testFlagEnumClass() +{ + // test const operations + const auto testFlags = TestFlags::Foo | TestFlags::Baz; + static_assert(testFlags & TestFlags::Foo); + static_assert(!(testFlags & TestFlags::Bar)); + static_assert(testFlags & TestFlags::Baz); + static_assert(checkFlagEnum(testFlags, TestFlags::Foo | TestFlags::Baz)); + static_assert(checkFlagEnum(testFlags, TestFlags::Foo)); + static_assert(!checkFlagEnum(testFlags, TestFlags::Foo | TestFlags::Bar)); + + // test modifying + auto nonConstFlags = TestFlags::Foo | TestFlags::Biz; + modFlagEnum(nonConstFlags, TestFlags::Foo | TestFlags::Bar, false); + nonConstFlags += TestFlags::Bar; + modFlagEnum(nonConstFlags, TestFlags::Baz | TestFlags::Biz, true); + return nonConstFlags == (TestFlags::Bar | TestFlags::Baz | TestFlags::Biz); +} +static_assert(testFlagEnumClass()); + +} // namespace FlagEnumTests