1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-06 06:32:56 +01:00

Extend FlagHolder methods

This commit is contained in:
Gymnasiast
2025-03-07 22:52:15 +01:00
parent 1c2e22e859
commit 7038cd8a4d

View File

@@ -16,6 +16,14 @@ struct FlagHolder
{
THolderType holder{};
FlagHolder() = default;
template<typename... TTypes>
FlagHolder(TTypes... types)
: holder(EnumsToFlags(types...))
{
}
constexpr void clearAll()
{
holder = 0;
@@ -31,9 +39,35 @@ struct FlagHolder
return (holder & EnumToFlag(flag)) != 0;
}
constexpr void set(TEnumType flag)
template<typename... TTypes>
[[nodiscard]] constexpr bool hasAny(TTypes... types) const
{
holder |= EnumToFlag(flag);
return (holder & EnumsToFlags(types...)) != 0;
}
template<typename... TTypes>
[[nodiscard]] constexpr bool hasAll(TTypes... types) const
{
return (holder & EnumsToFlags(types...)) == EnumsToFlags(types...);
}
template<typename... TTypes>
constexpr void set(TTypes... types)
{
holder |= EnumsToFlags(types...);
}
/**
* For situations where you dont know upfront whether to set or unset the flag,
* e.g. in game actions where this is passed as a variable.
* Otherwise, use set/unset, which are slightly more efficient.
*/
constexpr void set(TEnumType flag, bool on)
{
if (on)
set(flag);
else
unset(flag);
}
constexpr void unset(TEnumType flag)
@@ -41,6 +75,12 @@ struct FlagHolder
holder &= ~EnumToFlag(flag);
}
template<typename... TTypes>
constexpr void unset(TTypes... types)
{
holder &= ~EnumsToFlags(types...);
}
constexpr void flip(TEnumType flag)
{
holder ^= EnumToFlag(flag);