Files
UnrealEngine/Engine/Plugins/Experimental/CommonConversation/Source/CommonConversationRuntime/Private/ConversationMemory.cpp
2025-05-18 13:04:45 +08:00

47 lines
1.6 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "ConversationMemory.h"
#include "ConversationTaskNode.h"
FConversationMemory::FConversationTaskMemoryKey::FConversationTaskMemoryKey(const UConversationTaskNode& SourceTaskInstance, const UScriptStruct* TaskMemoryStructClass)
: SourceTaskInstanceKey(&SourceTaskInstance)
, TaskMemoryStructClassKey(TaskMemoryStructClass)
, KeyHash(0)
{
KeyHash = HashCombine(KeyHash, GetTypeHash(SourceTaskInstanceKey));
KeyHash = HashCombine(KeyHash, GetTypeHash(TaskMemoryStructClassKey));
}
const UScriptStruct* FConversationMemory::FConversationTaskMemoryKey::GetTaskMemoryStruct() const
{
const UObject* TaskMemoryStructClass = TaskMemoryStructClassKey.ResolveObjectPtr();
return Cast<UScriptStruct>(TaskMemoryStructClass);
}
FConversationMemory::~FConversationMemory()
{
for (auto& TaskMemoryEntry : TaskMemory)
{
if (const UScriptStruct* TaskMemoryType = TaskMemoryEntry.Key.GetTaskMemoryStruct())
{
TaskMemoryType->DestroyStruct(TaskMemoryEntry.Value);
}
}
}
void* FConversationMemory::GetTaskMemoryOfType(const UConversationTaskNode& Task, const UScriptStruct* TaskMemoryStructType)
{
FConversationTaskMemoryKey TaskMemoryKey(Task, TaskMemoryStructType);
void** ExistingMemoryPtr = TaskMemory.Find(TaskMemoryKey);
if (ExistingMemoryPtr == nullptr)
{
void* NewTaskMemory = TaskMemoryAllocator.Allocate(TaskMemoryStructType->GetStructureSize());
TaskMemoryStructType->InitializeStruct(NewTaskMemory);
TaskMemory.Add(TaskMemoryKey, NewTaskMemory);
return NewTaskMemory;
}
return *ExistingMemoryPtr;
}