Add `checkFlagEnum()` and tests for `flagenumclass.h`
This commit is contained in:
parent
82f835546e
commit
a1aef36c83
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue