How To Iterate Over UENUM
Table of Contents
Sometimes we want to iterate over enum values.
In the Unreal Engine, We already have macros about making rages for UENUM.
First, Let’s make a test enum type.
UENUM(BlueprintType)
enum class ETest : uint8
{
ZERO,
FIRST,
SECOND,
THIRD,
FOURTH,
FIFTH
};
That looks decent enum type.
We also need to print the enum value name for the test.
template<typename TEnum>
static FString EnumToString(const FString& Name, TEnum Value)
{
const UEnum* EnumPtr = FindObject<UEnum>(ANY_PACKAGE, *Name, true);
if (UNLIKELY(!IsValid(EnumPtr)))
return FString("Invalid");
return EnumPtr->GetNameStringByValue((int32)Value);
}
Okay, I think we’re ready! Let’s get into the topic.
There are 3 types of enum range macro.
ENUM_RANGE_BY_COUNT #
This is a simple one.
It makes iterator range from the initial value to counted value.
If we declare a range like below, We’ll Iterator 3 elements from the initial value.
ENUM_RANGE_BY_COUNT(ETest, 3);
Now we can iterate UENUM value with TEnumRange<> like this.
for (ETest Iter : TEnumRange<ETest>())
{
GEngine->AddOnScreenDebugMessage(-1, 999.f, FColor::Cyan, EnumToString<ETest>("ETest",Iter));
}
You can see that we print only 3 elements.
ENUM_RANGE_BY_FIRST_AND_LAST #
This version allows us to set the range scope ourselves.
If we declare a range like below, We’ll Iterator elements that from value to value.
from 2(ETest::SECOND) to 5(ETest::FIFTH)
ENUM_RANGE_BY_FIRST_AND_LAST(ETest, 2, 5);
You can see that we print from 2 to 5 value.
ENUM_RANGE_BY_VALUES #
This version is quite interesting.
Let’s say we make our enum values non-contiguous like this.
UENUM(BlueprintType)
enum class ETest : uint8
{
ZERO = 0,
FIRST = 3,
SECOND = 5,
THIRD = 10,
FOURTH = 99,
FIFTH = 128
};
We can’t use the macro that was explained before. Because this enum is non-contiguous.
If we declare macro like below, We’ll Iterator non-contiguous enum range with specific individual values.
ENUM_RANGE_BY_VALUES(ETest, ETest::FIRST, ETest::FOURTH);
If you want to go deeper #
You can find more details on these macro in EnumRange.h
Engine\Source\Runtime\Core\Public\Misc\EnumRange.h