MetaCore/Source/MetaCoreFoundation/Private/MetaCoreAssetDependencyGraph.cpp
2026-06-04 09:33:04 +08:00

100 lines
3.3 KiB
C++

#include "MetaCoreFoundation/MetaCoreAssetDependencyGraph.h"
namespace MetaCore {
MetaCoreAssetDependencyGraph& MetaCoreAssetDependencyGraph::Get() {
static MetaCoreAssetDependencyGraph graph;
return graph;
}
void MetaCoreAssetDependencyGraph::SetDependencies(
const MetaCoreAssetGuid& assetGuid,
const AssetGuidSet& dependencies
) {
if (!assetGuid.IsValid()) {
return;
}
std::scoped_lock lock(Mutex_);
if (const auto previous = Dependencies_.find(assetGuid); previous != Dependencies_.end()) {
for (const MetaCoreAssetGuid& dependency : previous->second) {
if (auto dependents = Dependents_.find(dependency); dependents != Dependents_.end()) {
dependents->second.erase(assetGuid);
if (dependents->second.empty()) {
Dependents_.erase(dependents);
}
}
}
}
AssetGuidSet validDependencies;
for (const MetaCoreAssetGuid& dependency : dependencies) {
if (!dependency.IsValid() || dependency == assetGuid) {
continue;
}
validDependencies.insert(dependency);
Dependents_[dependency].insert(assetGuid);
}
if (validDependencies.empty()) {
Dependencies_.erase(assetGuid);
} else {
Dependencies_[assetGuid] = std::move(validDependencies);
}
}
MetaCoreAssetDependencyGraph::AssetGuidSet MetaCoreAssetDependencyGraph::GetDependencies(
const MetaCoreAssetGuid& assetGuid
) const {
std::scoped_lock lock(Mutex_);
const auto iterator = Dependencies_.find(assetGuid);
return iterator == Dependencies_.end() ? AssetGuidSet{} : iterator->second;
}
MetaCoreAssetDependencyGraph::AssetGuidSet MetaCoreAssetDependencyGraph::GetDependents(
const MetaCoreAssetGuid& assetGuid
) const {
std::scoped_lock lock(Mutex_);
const auto iterator = Dependents_.find(assetGuid);
return iterator == Dependents_.end() ? AssetGuidSet{} : iterator->second;
}
void MetaCoreAssetDependencyGraph::RemoveAsset(const MetaCoreAssetGuid& assetGuid) {
if (!assetGuid.IsValid()) {
return;
}
std::scoped_lock lock(Mutex_);
if (const auto dependencies = Dependencies_.find(assetGuid); dependencies != Dependencies_.end()) {
for (const MetaCoreAssetGuid& dependency : dependencies->second) {
if (auto dependents = Dependents_.find(dependency); dependents != Dependents_.end()) {
dependents->second.erase(assetGuid);
if (dependents->second.empty()) {
Dependents_.erase(dependents);
}
}
}
Dependencies_.erase(dependencies);
}
if (const auto dependents = Dependents_.find(assetGuid); dependents != Dependents_.end()) {
for (const MetaCoreAssetGuid& dependent : dependents->second) {
if (auto dependencies = Dependencies_.find(dependent); dependencies != Dependencies_.end()) {
dependencies->second.erase(assetGuid);
if (dependencies->second.empty()) {
Dependencies_.erase(dependencies);
}
}
}
Dependents_.erase(dependents);
}
}
void MetaCoreAssetDependencyGraph::Clear() {
std::scoped_lock lock(Mutex_);
Dependencies_.clear();
Dependents_.clear();
}
} // namespace MetaCore