Files
UnrealEngineUWP/Engine/Plugins/Runtime/Metasound/Source/MetasoundFrontend/Private/MetasoundFrontendRegistryTransaction.cpp
phil popp 93b828681c Adding dedup logic for subgraph node registration
#rb Rob.Gay
#preflight 60c122be44f42400015599c9

#ROBOMERGE-SOURCE: CL 16612856 via CL 16614296
#ROBOMERGE-BOT: STARSHIP (Main -> Release-Engine-Test) (v828-16531559)

[CL 16614385 by phil popp in ue5-release-engine-test branch]
2021-06-09 18:20:38 -04:00

164 lines
3.6 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "MetasoundFrontendRegistryTransaction.h"
#include "CoreMinimal.h"
namespace Metasound
{
namespace Frontend
{
FRegistryTransactionID GetOriginRegistryTransactionID()
{
return 0;
}
FRegistryTransactionHistory::FRegistryTransactionHistory()
: Current(GetOriginRegistryTransactionID())
{
}
FRegistryTransactionID FRegistryTransactionHistory::Add(TUniquePtr<IRegistryTransaction>&& InRegistryTransaction)
{
FScopeLock Lock(&RegistryTransactionMutex);
if (ensure(InRegistryTransaction.IsValid()))
{
Current++;
IRegistryTransaction* RegistryTransactionPointer = InRegistryTransaction.Get();
int32 Index = RegistryTransactions.Num();
RegistryTransactions.Add(MoveTemp(InRegistryTransaction));
RegistryTransactionIndexMap.Add(Current, Index);
}
return Current;
}
FRegistryTransactionID FRegistryTransactionHistory::Add(const IRegistryTransaction& InRegistryTransaction)
{
return Add(InRegistryTransaction.Clone());
}
FRegistryTransactionID FRegistryTransactionHistory::GetCurrent() const
{
FScopeLock Lock(&RegistryTransactionMutex);
{
return Current;
}
}
TArray<const IRegistryTransaction*> FRegistryTransactionHistory::GetTransactions(FRegistryTransactionID InSince, FRegistryTransactionID* OutCurrent) const
{
FScopeLock Lock(&RegistryTransactionMutex);
{
TArray<const IRegistryTransaction*> Result;
if (nullptr != OutCurrent)
{
*OutCurrent = Current;
}
int32 Start = INDEX_NONE;
if (GetOriginRegistryTransactionID() == InSince)
{
Start = 0;
}
else if (const int32* Pos = RegistryTransactionIndexMap.Find(InSince))
{
Start = *Pos + 1;
}
if (INDEX_NONE != Start)
{
const int32 Num = RegistryTransactions.Num();
if (ensure(Start <= Num))
{
const int32 OutNum = Num - Start;
if (OutNum > 0)
{
Result.Reserve(OutNum);
for (int32 i = Start; i < Num; i++)
{
Result.Add(RegistryTransactions[i].Get());
}
}
}
}
return Result;
}
}
FRegistryTransactionPtr MakeAddNodeRegistryTransaction(const FNodeClassInfo& InInfo)
{
class FNodeRegistryTransaction : public IRegistryTransaction
{
public:
FNodeRegistryTransaction(const FNodeClassInfo& InNodeClassInfo)
: NodeClassInfo(InNodeClassInfo)
{
}
ETransactionType GetTransactionType() const override
{
return ETransactionType::Add;
}
TUniquePtr<IRegistryTransaction> Clone() const override
{
return MakeUnique<FNodeRegistryTransaction>(*this);
}
const FNodeClassInfo* GetNodeClassInfo() const
{
return &NodeClassInfo;
}
private:
FNodeClassInfo NodeClassInfo;
};
return MakeUnique<FNodeRegistryTransaction>(InInfo);
}
FRegistryTransactionPtr MakeRemoveNodeRegistryTransaction(const FNodeClassInfo& InInfo)
{
class FNodeRegistryTransaction : public IRegistryTransaction
{
public:
FNodeRegistryTransaction(const FNodeClassInfo& InNodeClassInfo)
: NodeClassInfo(InNodeClassInfo)
{
}
ETransactionType GetTransactionType() const override
{
return ETransactionType::Remove;
}
TUniquePtr<IRegistryTransaction> Clone() const override
{
return MakeUnique<FNodeRegistryTransaction>(*this);
}
const FNodeClassInfo* GetNodeClassInfo() const
{
return &NodeClassInfo;
}
private:
FNodeClassInfo NodeClassInfo;
};
return MakeUnique<FNodeRegistryTransaction>(InInfo);
}
}
}