metaforce/Runtime/CSimplePool.cpp

72 lines
2.0 KiB
C++
Raw Permalink Normal View History

#include "Runtime/CSimplePool.hpp"
#include "Runtime/CToken.hpp"
#include "Runtime/IVParamObj.hpp"
#include <cassert>
2021-04-10 01:42:06 -07:00
namespace metaforce {
CSimplePool::CSimplePool(IFactory& factory)
2018-12-07 21:30:43 -08:00
: x18_factory(factory), x1c_paramXfer(new TObjOwnerParam<IObjectStore*>(this)) {}
2018-12-07 21:30:43 -08:00
CSimplePool::~CSimplePool() { assert(x8_resources.empty() && "Dangling CSimplePool resources detected"); }
2018-12-07 21:30:43 -08:00
CToken CSimplePool::GetObj(const SObjectTag& tag, const CVParamTransfer& paramXfer) {
if (!tag) {
2018-12-07 21:30:43 -08:00
return {};
}
const auto iter = x8_resources.find(tag);
if (iter != x8_resources.end()) {
2018-12-07 21:30:43 -08:00
return CToken(iter->second);
}
auto* const ret = new CObjectReference(*this, nullptr, tag, paramXfer);
x8_resources.emplace(tag, ret);
2018-12-07 21:30:43 -08:00
return CToken(ret);
}
2018-12-07 21:30:43 -08:00
CToken CSimplePool::GetObj(const SObjectTag& tag) { return GetObj(tag, x1c_paramXfer); }
2018-12-07 21:30:43 -08:00
CToken CSimplePool::GetObj(std::string_view resourceName) { return GetObj(resourceName, x1c_paramXfer); }
2018-12-07 21:30:43 -08:00
CToken CSimplePool::GetObj(std::string_view resourceName, const CVParamTransfer& paramXfer) {
const SObjectTag* tag = x18_factory.GetResourceIdByName(resourceName);
if (!tag)
return {};
return GetObj(*tag, paramXfer);
}
2018-12-07 21:30:43 -08:00
bool CSimplePool::HasObject(const SObjectTag& tag) const {
auto iter = x8_resources.find(tag);
if (iter != x8_resources.cend())
return true;
return x18_factory.CanBuild(tag);
}
2018-12-07 21:30:43 -08:00
bool CSimplePool::ObjectIsLive(const SObjectTag& tag) const {
auto iter = x8_resources.find(tag);
if (iter == x8_resources.cend())
return false;
return iter->second->IsLoaded();
}
2018-12-07 21:30:43 -08:00
void CSimplePool::Flush() {}
2018-12-07 21:30:43 -08:00
void CSimplePool::ObjectUnreferenced(const SObjectTag& tag) {
auto iter = x8_resources.find(tag);
if (iter != x8_resources.end())
x8_resources.erase(iter);
}
2018-12-07 21:30:43 -08:00
std::vector<SObjectTag> CSimplePool::GetReferencedTags() const {
std::vector<SObjectTag> ret;
ret.reserve(x8_resources.size());
for (const auto& obj : x8_resources)
ret.push_back(obj.first);
return ret;
2017-02-11 19:17:18 -08:00
}
2021-04-10 01:42:06 -07:00
} // namespace metaforce