UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
EnumClassFlags.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5// Defines all bitwise operators for enum classes so it can be (mostly) used as a regular flags enum
6#define ENUM_CLASS_FLAGS(Enum) \
7 inline constexpr Enum& operator|=(Enum& Lhs, Enum Rhs) { return Lhs = (Enum)((__underlying_type(Enum))Lhs | (__underlying_type(Enum))Rhs); } \
8 inline constexpr Enum& operator&=(Enum& Lhs, Enum Rhs) { return Lhs = (Enum)((__underlying_type(Enum))Lhs & (__underlying_type(Enum))Rhs); } \
9 inline constexpr Enum& operator^=(Enum& Lhs, Enum Rhs) { return Lhs = (Enum)((__underlying_type(Enum))Lhs ^ (__underlying_type(Enum))Rhs); } \
10 inline constexpr Enum operator| (Enum Lhs, Enum Rhs) { return (Enum)((__underlying_type(Enum))Lhs | (__underlying_type(Enum))Rhs); } \
11 inline constexpr Enum operator& (Enum Lhs, Enum Rhs) { return (Enum)((__underlying_type(Enum))Lhs & (__underlying_type(Enum))Rhs); } \
12 inline constexpr Enum operator^ (Enum Lhs, Enum Rhs) { return (Enum)((__underlying_type(Enum))Lhs ^ (__underlying_type(Enum))Rhs); } \
13 inline constexpr bool operator! (Enum E) { return !(__underlying_type(Enum))E; } \
14 inline constexpr Enum operator~ (Enum E) { return (Enum)~(__underlying_type(Enum))E; }
15
16// Friends all bitwise operators for enum classes so the definition can be kept private / protected.
17#define FRIEND_ENUM_CLASS_FLAGS(Enum) \
18 friend constexpr Enum& operator|=(Enum& Lhs, Enum Rhs); \
19 friend constexpr Enum& operator&=(Enum& Lhs, Enum Rhs); \
20 friend constexpr Enum& operator^=(Enum& Lhs, Enum Rhs); \
21 friend constexpr Enum operator| (Enum Lhs, Enum Rhs); \
22 friend constexpr Enum operator& (Enum Lhs, Enum Rhs); \
23 friend constexpr Enum operator^ (Enum Lhs, Enum Rhs); \
24 friend constexpr bool operator! (Enum E); \
25 friend constexpr Enum operator~ (Enum E);
26
27template<typename Enum>
28constexpr bool EnumHasAllFlags(Enum Flags, Enum Contains)
29{
30 using UnderlyingType = __underlying_type(Enum);
31 return ((UnderlyingType)Flags & (UnderlyingType)Contains) == (UnderlyingType)Contains;
32}
33
34template<typename Enum>
35constexpr bool EnumHasAnyFlags(Enum Flags, Enum Contains)
36{
37 using UnderlyingType = __underlying_type(Enum);
38 return ((UnderlyingType)Flags & (UnderlyingType)Contains) != 0;
39}
40
54template <typename Enum>
55constexpr bool EnumOnlyContainsFlags(Enum Flags, Enum Contains)
56{
57 return EnumHasAllFlags(Contains, Flags);
58}
59
68template <typename Enum>
69constexpr bool EnumHasOneFlag(Enum Flags)
70{
71 using UnderlyingType = __underlying_type(Enum);
72 return ((UnderlyingType)Flags != 0) && (((UnderlyingType)Flags & ((UnderlyingType)Flags - 1)) == 0);
73}
74
83template <typename Enum>
85{
86 using UnderlyingType = __underlying_type(Enum);
87 return EnumHasOneFlag((Enum)((UnderlyingType)Flags & (UnderlyingType)OneOfFlags));
88}
89
90template<typename Enum>
92{
93 using UnderlyingType = __underlying_type(Enum);
94 Flags = (Enum)((UnderlyingType)Flags | (UnderlyingType)FlagsToAdd);
95}
96
97template<typename Enum>
99{
100 using UnderlyingType = __underlying_type(Enum);
101 Flags = (Enum)((UnderlyingType)Flags & ~(UnderlyingType)FlagsToRemove);
102}
103
104template <typename Enum>
106{
107 using UnderlyingType = __underlying_type(Enum);
108#ifdef _MSC_VER
109 #pragma warning(push)
110 #pragma warning(disable : 4146) // unary minus operator applied to unsigned type, result still unsigned
111#endif
112 return Flags & (Enum)(-(UnderlyingType)Flags);
113#ifdef _MSC_VER
114 #pragma warning(pop)
115#endif
116}
117
118template <typename Enum>
120{
121 using UnderlyingType = __underlying_type(Enum);
122 return (Enum)((UnderlyingType)Flags & ((UnderlyingType)Flags - 1));
123}
124
125template <typename Enum>
127{
128 using UnderlyingType = __underlying_type(Enum);
129
130 int Result = 0;
131 UnderlyingType Int = (UnderlyingType)Flags;
132 while (Int != 0)
133 {
134 ++Result;
135 Int &= Int - 1;
136 }
137 return Result;
138}
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
constexpr bool EnumOnlyContainsFlags(Enum Flags, Enum Contains)
Definition EnumClassFlags.h:55
constexpr bool EnumHasAnyFlags(Enum Flags, Enum Contains)
Definition EnumClassFlags.h:35
constexpr bool EnumHasAllFlags(Enum Flags, Enum Contains)
Definition EnumClassFlags.h:28
constexpr void EnumRemoveFlags(Enum &Flags, Enum FlagsToRemove)
Definition EnumClassFlags.h:98
constexpr void EnumAddFlags(Enum &Flags, Enum FlagsToAdd)
Definition EnumClassFlags.h:91
constexpr bool EnumHasAnyOneFlag(Enum Flags, Enum OneOfFlags)
Definition EnumClassFlags.h:84
constexpr Enum EnumLowestSetFlag(Enum Flags)
Definition EnumClassFlags.h:105
constexpr int EnumNumSetFlags(Enum Flags)
Definition EnumClassFlags.h:126
constexpr bool EnumHasOneFlag(Enum Flags)
Definition EnumClassFlags.h:69
constexpr Enum EnumRemoveLowestSetFlag(Enum Flags)
Definition EnumClassFlags.h:119