Files
UnrealEngine/Engine/Source/Runtime/UniversalObjectLocator/Private/UniversalObjectLocatorResolveParams.cpp
2025-05-18 13:04:45 +08:00

55 lines
1.1 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "UniversalObjectLocatorResolveParams.h"
#include "UniversalObjectLocatorFragmentType.h"
#include "UniversalObjectLocatorFragmentTypeHandle.h"
namespace UE::UniversalObjectLocator
{
FResolveParameterBuffer::FResolveParameterBuffer()
: Memory(nullptr)
, AllParameters(0u)
, Capacity(0u)
, Num(0u)
{
}
FResolveParameterBuffer::~FResolveParameterBuffer()
{
Destroy();
}
void FResolveParameterBuffer::Destroy()
{
check((Memory == nullptr) == (Num == 0));
if (Memory)
{
uint8 Index = 0;
uint32 RemainingParameters = AllParameters;
while (RemainingParameters != 0)
{
// Get the bit offset of the next reminaing bit
const uint8 BitIndex = static_cast<uint8>(FMath::CountTrailingZeros(RemainingParameters));
UScriptStruct* Type = FParameterTypeHandle(BitIndex).Resolve();
void* Ptr = GetHeader(Index).Resolve(Memory);
++Index;
if (ensure(Type))
{
Type->DestroyStruct(Ptr);
}
RemainingParameters = RemainingParameters & ~(1u << BitIndex);
}
if (bCanFreeMemory)
{
FMemory::Free(Memory);
}
}
}
} // namespace UE::UniversalObjectLocator