I am trying to add a “better for loop” in my blueprint function library.
I came across the question in the title, and implemented the following psuedo-code from the answer from that question:
// .h
UENUM(BlueprintType)
enum class EMyEnum : uint8
{
BranchA,
BranchB
};
UFUNCTION(BlueprintCallable, Category = "Stuff", Meta = (ExpandEnumAsExecs = "Branches"))
void DoSomeBranch(int32 SomeInput, EMyEnum& Branches)
// .cpp
void AMyClass::DoSomeBranch(int32 SomeInput, EMyEnum& Branches)
{
if (SomeInput == 1)
{
Branches = EMyEnum::BranchA;
}
else
{
Branches = EMyEnum::BranchB;
}
}
It works perfectly, however when I tried to implement it as a “better for loop” like so:
// .h
UENUM(BlueprintType)
enum class EmultiExecutionHandler : uint8
{
Loop_Body,
Completed
};
UFUNCTION(BlueprintCallable, meta = (ExpandEnumAsExecs = handled, Category = "Utilities|Flow Control", DefaultToSelf, HideSelfPin, DisplayName = "MEH_Cfor", KeyWords = "m,me,meh,mehc,mehcf,mehcfo,mehcfor,cfor,for,loop"))
void mehCfor(int32 iterStart, int32& index, int32 comparison, int32 iterEnd, bool positive, int32 amount, EmultiExecutionHandler& handled);
// .cpp
void UMyBlueprintFunctionLibrary::mehCfor(int32 iterStart, int32& index, const int32 comparison, const int32 iterEnd, const bool positive, const int32 amount, EmultiExecutionHandler& handled)
{
if(positive)
{
if(comparison == 0)
for(iterStart; iterStart == iterEnd; iterStart += amount) {
if(iterStart != iterEnd)
{
index = iterStart;
handled = EmultiExecutionHandler::Loop_Body;
}
if(iterStart == iterEnd)
{
index = iterStart;
handled = EmultiExecutionHandler::Completed;
}
}
if(comparison == 1)
for(iterStart; iterStart <= iterEnd; iterStart += amount) {
if(iterStart > iterEnd)
{
index = iterStart;
handled = EmultiExecutionHandler::Loop_Body;
}
else
{
index = iterStart;
handled = EmultiExecutionHandler::Completed;
}
}
if(comparison == 2)
for(iterStart; iterStart >= iterEnd; iterStart += amount) {
if(iterStart < iterEnd)
{
index = iterStart;
handled = EmultiExecutionHandler::Loop_Body;
}
else
{
index = iterStart;
handled = EmultiExecutionHandler::Completed;
}
}
if(comparison == 3)
for(iterStart; iterStart < iterEnd; iterStart += amount) {
if(iterStart >= iterEnd)
{
index = iterStart;
handled = EmultiExecutionHandler::Loop_Body;
}
else
{
index = iterStart;
handled = EmultiExecutionHandler::Completed;
}
}
if(comparison == 4)
for(iterStart; iterStart > iterEnd; iterStart += amount) {
if(iterStart <= iterEnd)
{
index = iterStart;
handled = EmultiExecutionHandler::Loop_Body;
}
else
{
index = iterStart;
handled = EmultiExecutionHandler::Completed;
}
}
if(comparison == 5)
for(iterStart; iterStart != iterEnd; iterStart += amount) {
if(iterStart == iterEnd)
{
index = iterStart;
handled = EmultiExecutionHandler::Loop_Body;
}
else
{
index = iterStart;
handled = EmultiExecutionHandler::Completed;
}
}
}
else
{
if(comparison == 0)
for(iterStart; iterStart == iterEnd; iterStart -= amount) {
if(iterStart != iterEnd)
{
index = iterStart;
handled = EmultiExecutionHandler::Loop_Body;
}
else
{
index = iterStart;
handled = EmultiExecutionHandler::Completed;
}
}
if(comparison == 1)
for(iterStart; iterStart <= iterEnd; iterStart -= amount) {
if(iterStart > iterEnd)
{
index = iterStart;
handled = EmultiExecutionHandler::Loop_Body;
}
else
{
index = iterStart;
handled = EmultiExecutionHandler::Completed;
}
}
if(comparison == 2)
for(iterStart; iterStart >= iterEnd; iterStart -= amount) {
if(iterStart < iterEnd)
{
index = iterStart;
handled = EmultiExecutionHandler::Loop_Body;
}
else
{
index = iterStart;
handled = EmultiExecutionHandler::Completed;
}
}
if(comparison == 3)
for(iterStart; iterStart < iterEnd; iterStart -= amount) {
if(iterStart >= iterEnd)
{
index = iterStart;
handled = EmultiExecutionHandler::Loop_Body;
}
else
{
index = iterStart;
handled = EmultiExecutionHandler::Completed;
}
}
if(comparison == 4)
for(iterStart; iterStart > iterEnd; iterStart -= amount) {
if(iterStart <= iterEnd)
{
index = iterStart;
handled = EmultiExecutionHandler::Loop_Body;
}
else
{
index = iterStart;
handled = EmultiExecutionHandler::Completed;
}
}
if(comparison == 5)
for(iterStart; iterStart != iterEnd; iterStart -= amount) {
if(iterStart == iterEnd)
{
index = iterStart;
handled = EmultiExecutionHandler::Loop_Body;
}
else
{
index = iterStart;
handled = EmultiExecutionHandler::Completed;
}
}
}
}
It seems to either loop always on zero if zero is within the range, or it never resolves to “handled = EmultiExecutionHandler::Loop_Body;” and instead always returns with “handled = EmultiExecutionHandler::Completed;” even when used like the standard for loop.
Any help much appreciated!