100 lines
3.3 KiB
C++
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
|