Add `checkFlagEnum()` and tests for `flagenumclass.h`

This commit is contained in:
Martchus 2022-07-29 22:01:51 +02:00
parent 82f835546e
commit a1aef36c83
2 changed files with 44 additions and 0 deletions

View File

@ -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 <typename FlagEnumClass, Traits::EnableIf<IsFlagEnumClass<FlagEnumClass>> * = nullptr>
constexpr bool checkFlagEnum(FlagEnumClass flagVariable, FlagEnumClass flagsToCheck)
{
return (static_cast<typename std::underlying_type<FlagEnumClass>::type>(flagVariable)
& static_cast<typename std::underlying_type<FlagEnumClass>::type>(flagsToCheck))
== static_cast<typename std::underlying_type<FlagEnumClass>::type>(flagsToCheck);
}
} // namespace CppUtilities
#endif // CPP_UTILITIES_FLAG_ENUM_CLASS_H

View File

@ -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