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);
|
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
|
} // namespace CppUtilities
|
||||||
|
|
||||||
#endif // CPP_UTILITIES_FLAG_ENUM_CLASS_H
|
#endif // CPP_UTILITIES_FLAG_ENUM_CLASS_H
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
#include "../misc/flagenumclass.h"
|
||||||
#include "../misc/levenshtein.h"
|
#include "../misc/levenshtein.h"
|
||||||
#include "../misc/multiarray.h"
|
#include "../misc/multiarray.h"
|
||||||
|
|
||||||
|
@ -171,3 +172,35 @@ void MiscTests::testTestUtilities()
|
||||||
|
|
||||||
TESTUTILS_ASSERT_LIKE("assert like works", ".*foo.*", " foo ");
|
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