// Copyright Epic Games, Inc. All Rights Reserved. #include "Interfaces/MetasoundFrontendInterfaceBindingRegistry.h" #include "HAL/PlatformTime.h" #include "Interfaces/MetasoundFrontendInterfaceRegistry.h" #include "Interfaces/MetasoundFrontendInterfaceBindingRegistryPrivate.h" #include "MetasoundFrontendRegistryTransaction.h" #include "MetasoundTrace.h" namespace Metasound::Frontend { FInterfaceBindingRegistryEntry::FInterfaceBindingRegistryEntry(const FMetasoundFrontendInterfaceBinding& InBinding) : OutputInterfaceVersion(InBinding.OutputInterfaceVersion) , VertexBindings(InBinding.VertexBindings) , BindingPriority(InBinding.BindingPriority) { } const FMetasoundFrontendVersion& FInterfaceBindingRegistryEntry::GetOutputInterfaceVersion() const { return OutputInterfaceVersion; } const TArray& FInterfaceBindingRegistryEntry::GetVertexBindings() const { return VertexBindings; } int32 FInterfaceBindingRegistryEntry::GetBindingPriority() const { return BindingPriority; } bool FInterfaceBindingRegistry::FindInterfaceBindingEntries(const FMetasoundFrontendVersion& InInputInterfaceVersion, TArray& OutEntries) const { TArray*> FoundEntries; const FInterfaceRegistryKey Key = GetInterfaceRegistryKey(InInputInterfaceVersion); Entries.MultiFindPointer(Key, FoundEntries); OutEntries.Reset(); Algo::Transform(FoundEntries, OutEntries, [](const TUniquePtr* FoundEntry) { const FInterfaceBindingRegistryEntry* EntryPtr = FoundEntry->Get(); return EntryPtr; }); return !OutEntries.IsEmpty(); } void FInterfaceBindingRegistry::RegisterInterfaceBinding(const FMetasoundFrontendVersion& InInputInterfaceVersion, TUniquePtr&& InEntry) { FInterfaceRegistryKey Key = GetInterfaceRegistryKey(InInputInterfaceVersion); Entries.Add(MoveTemp(Key), MoveTemp(InEntry)); } bool FInterfaceBindingRegistry::UnregisterInterfaceBinding(const FMetasoundFrontendVersion& InInputInterfaceVersion, const FMetasoundFrontendVersion& InOutputInterfaceVersion) { TArray*> FoundEntries; const FInterfaceRegistryKey Key = GetInterfaceRegistryKey(InInputInterfaceVersion); Entries.MultiFindPointer(Key, FoundEntries); for (const TUniquePtr* EntryPtr : FoundEntries) { const FInterfaceBindingRegistryEntry* Entry = (*EntryPtr).Get(); check(Entry); if (Entry->GetOutputInterfaceVersion() == InOutputInterfaceVersion) { if (Entries.RemoveSingle(Key, *EntryPtr) > 0) { return true; } } } return false; } bool FInterfaceBindingRegistry::UnregisterAllInterfaceBindings(const FMetasoundFrontendVersion& InInputInterfaceVersion) { FInterfaceRegistryKey Key = GetInterfaceRegistryKey(InInputInterfaceVersion); return Entries.Remove(Key) > 0; } IInterfaceBindingRegistry& IInterfaceBindingRegistry::Get() { static FInterfaceBindingRegistry Registry; return Registry; } } // namespace Metasound::Frontend