Avatar

Game Developer

Lazy Perfectionist

How To Iterate Over UENUM

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));
	}

ENUM_RANGE_BY_COUNT

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);

ENUM_RANGE_BY_FIRST_AND_LAST

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);

ENUM_RANGE_BY_VALUES

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