A Demo Project for the UnrealEngineSDK
Loading...
Searching...
No Matches
EnumUtils.h
Go to the documentation of this file.
1// Copyright(c) PixoVR, LLC. All Rights Reserved.
2
3#pragma once
4
5#include "CoreMinimal.h"
6#include <type_traits>
7
8namespace EnumUtils
9{
10 namespace {
11 template<typename TEnum>
12 void ForEachEnumValue_IncrementImpl(TEnum BeginEnumValue, TEnum EndEnumValue, TFunction<void(TEnum)> Op)
13 {
14 if (ensure(Op))
15 {
16 for (TEnum EnumValue = BeginEnumValue; EnumValue <= EndEnumValue;)
17 {
18 Op(EnumValue);
19
20 uint8 EnumIndex = (uint8)EnumValue;
21 EnumValue = (TEnum)(++EnumIndex);
22 }
23 }
24 }
25
26 template<typename TEnum>
27 void ForEachEnumValue_ShiftImpl(TEnum BeginEnumValue, TEnum EndEnumValue, TFunction<void(TEnum)> Op)
28 {
29 if (ensure(Op))
30 {
31 if(BeginEnumValue == (TEnum)0)
32 {
33 Op((TEnum)0);
34 }
35
36 const uint8 EndEnumIndex = (uint8)EndEnumValue;
37
38 for (uint8 ShiftIndex = FMath::Log2((float)BeginEnumValue); ; ++ShiftIndex)
39 {
40 const uint8 EnumIndex = (1 << ShiftIndex);
41 const TEnum EnumValue = (TEnum)EnumIndex;
42 if (EnumIndex > EndEnumIndex || EnumIndex == 0)
43 {
44 break;
45 }
46 Op(EnumValue);
47 }
48 }
49 }
50 };
51
52 template<typename TEnum>
54 {
55 FText operator()(TEnum EnumValue) const {
56 UEnum* EnumClass = StaticEnum<TEnum>();
57 LowLevelFatalError(TEXT("GetEnumValueAsText function is not implemented for %s"), *EnumClass->CppType);
58
59 return FText::FromString("INVALID");
60 }
61 };
62
66 //template<> struct EnumUtils::GetEnumValueAsText_Implementation<CustomEnumType>
67 //{
68 // FText operator()(CustomEnumType EnumValue) const {
69 // // Your logic here
70 // return FText::FromString("Some text");
71 // }
72 //};
73 template<typename TEnum>
74 FText GetEnumValueAsText(TEnum EnumValue)
75 {
76 // For the C++ enum.
77 static_assert(TIsEnum<TEnum>::Value, "Should only call this with enum types");
79 }
80
84 //template<> struct EnumUtils::GetEnumValueAsText_Implementation<CustomEnumType>
85 //{
86 // FText operator()(CustomEnumType EnumValue) const {
87 // // Your logic here
88 // return FText::FromString("Some text");
89 // }
90 //};
91 template<typename TEnum>
92 FString GetEnumValueAsString(TEnum EnumValue)
93 {
94 // For the C++ enum.
95 static_assert(TIsEnum<TEnum>::Value, "Should only call this with enum types");
96 return GetEnumValueAsText<TEnum>(EnumValue).ToString();
97 }
98
99 template<typename TEnum>
100 bool IsValidEnumValue(int64 Value)
101 {
102 // For the C++ enum.
103 static_assert(TIsEnum<TEnum>::Value, "Should only call this with enum types");
104
105 UEnum* EnumClass = StaticEnum<TEnum>();
106 check(EnumClass != nullptr);
107 return EnumClass->IsValidEnumValue(Value);
108 }
109
110 template<typename TEnum>
111 void ForEachEnumValue(TEnum BeginEnumValue, TEnum EndEnumValue, TFunction<void(TEnum)> Op)
112 {
113 // For the C++ enum.
114 static_assert(TIsEnum<TEnum>::Value, "Should only call this with enum types");
115
116 // BeginEnumValue and EndEnumValue should be range limits in ascending order (e.g. Begin <= End )
117 check((uint8)BeginEnumValue <= (uint8)EndEnumValue);
118
119 UEnum* EnumClass = StaticEnum<TEnum>();
120 check(EnumClass != nullptr);
121
122 int64 CheckIndexType = (int64)EndEnumValue;
123 --CheckIndexType;
124 if (EnumClass->IsValidEnumValue(CheckIndexType))
125 {
126 ForEachEnumValue_IncrementImpl(BeginEnumValue, EndEnumValue, Op);
127 }
128 else
129 {
130 ForEachEnumValue_ShiftImpl(BeginEnumValue, EndEnumValue, Op);
131 }
132 }
133
134 template<typename T>
135 auto GetEnumValue(const T InValue)
136 {
137 return static_cast<typename std::underlying_type<T>::type>(InValue);
138 }
139 template<class TEnum>
140 auto GetEnumsOffset(TEnum FirstValue, TEnum SecondValue)
141 {
142 static_assert(TIsEnum<TEnum>::Value, "Should only call this with enum types");
143 return EnumUtils::GetEnumValue(FirstValue) - EnumUtils::GetEnumValue(SecondValue);
144 }
145};
void ForEachEnumValue_IncrementImpl(TEnum BeginEnumValue, TEnum EndEnumValue, TFunction< void(TEnum)> Op)
Definition EnumUtils.h:12
void ForEachEnumValue_ShiftImpl(TEnum BeginEnumValue, TEnum EndEnumValue, TFunction< void(TEnum)> Op)
Definition EnumUtils.h:27
auto GetEnumValue(const T InValue)
Definition EnumUtils.h:135
FString GetEnumValueAsString(TEnum EnumValue)
Definition EnumUtils.h:92
void ForEachEnumValue(TEnum BeginEnumValue, TEnum EndEnumValue, TFunction< void(TEnum)> Op)
Definition EnumUtils.h:111
FText GetEnumValueAsText(TEnum EnumValue)
Definition EnumUtils.h:74
auto GetEnumsOffset(TEnum FirstValue, TEnum SecondValue)
Definition EnumUtils.h:140
bool IsValidEnumValue(int64 Value)
Definition EnumUtils.h:100
FText operator()(TEnum EnumValue) const
Definition EnumUtils.h:55