mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2026-01-06 06:32:56 +01:00
Extend FlagHolder methods
This commit is contained in:
@@ -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 don’t 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);
|
||||
|
||||
Reference in New Issue
Block a user