1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-26 16:24:35 +01:00

Use std::unique_ptr for ObjectManager and ObjectRepository

This commit is contained in:
Matt
2018-08-29 01:17:15 +02:00
parent 04928d4b84
commit 837c0a9e7f
3 changed files with 22 additions and 24 deletions

View File

@@ -33,15 +33,13 @@
class ObjectManager final : public IObjectManager
{
private:
std::shared_ptr<IObjectRepository> _objectRepository;
IObjectRepository& _objectRepository;
std::vector<Object*> _loadedObjects;
public:
explicit ObjectManager(std::shared_ptr<IObjectRepository> objectRepository)
explicit ObjectManager(IObjectRepository& objectRepository)
: _objectRepository(objectRepository)
{
Guard::ArgumentNotNull(objectRepository);
_loadedObjects.resize(OBJECT_ENTRY_COUNT);
UpdateSceneryGroupIndexes();
@@ -79,7 +77,7 @@ public:
Object* GetLoadedObject(const rct_object_entry* entry) override
{
Object* loadedObject = nullptr;
const ObjectRepositoryItem* ori = _objectRepository->FindObject(entry);
const ObjectRepositoryItem* ori = _objectRepository.FindObject(entry);
if (ori != nullptr)
{
loadedObject = ori->LoadedObject;
@@ -101,7 +99,7 @@ public:
Object* LoadObject(const rct_object_entry* entry) override
{
Object* loadedObject = nullptr;
const ObjectRepositoryItem* ori = _objectRepository->FindObject(entry);
const ObjectRepositoryItem* ori = _objectRepository.FindObject(entry);
if (ori != nullptr)
{
loadedObject = ori->LoadedObject;
@@ -154,7 +152,7 @@ public:
for (size_t i = 0; i < count; i++)
{
const rct_object_entry* entry = &entries[i];
const ObjectRepositoryItem* ori = _objectRepository->FindObject(entry);
const ObjectRepositoryItem* ori = _objectRepository.FindObject(entry);
if (ori != nullptr)
{
Object* loadedObject = ori->LoadedObject;
@@ -200,10 +198,10 @@ public:
std::vector<const ObjectRepositoryItem*> GetPackableObjects() override
{
std::vector<const ObjectRepositoryItem*> objects;
size_t numObjects = _objectRepository->GetNumObjects();
size_t numObjects = _objectRepository.GetNumObjects();
for (size_t i = 0; i < numObjects; i++)
{
const ObjectRepositoryItem* item = &_objectRepository->GetObjects()[i];
const ObjectRepositoryItem* item = &_objectRepository.GetObjects()[i];
if (item->LoadedObject != nullptr && item->LoadedObject->GetLegacyData() != nullptr && IsObjectCustom(item))
{
objects.push_back(item);
@@ -299,10 +297,10 @@ private:
if (object != nullptr)
{
// TODO try to prevent doing a repository search
const ObjectRepositoryItem* ori = _objectRepository->FindObject(object->GetObjectEntry());
const ObjectRepositoryItem* ori = _objectRepository.FindObject(object->GetObjectEntry());
if (ori != nullptr)
{
_objectRepository->UnregisterLoadedObject(ori, object);
_objectRepository.UnregisterLoadedObject(ori, object);
}
// Because it's possible to have the same loaded object for multiple
@@ -430,7 +428,7 @@ private:
continue;
}
ori = _objectRepository->FindObject(&entry);
ori = _objectRepository.FindObject(&entry);
if (ori == nullptr)
{
if (object_entry_get_type(&entry) != OBJECT_TYPE_SCENARIO_TEXT)
@@ -450,7 +448,7 @@ private:
loadedObject = ori->LoadedObject;
if (loadedObject == nullptr)
{
loadedObject = _objectRepository->LoadObject(ori);
loadedObject = _objectRepository.LoadObject(ori);
if (loadedObject == nullptr)
{
invalidEntries.push_back(entry);
@@ -474,7 +472,7 @@ private:
const ObjectRepositoryItem* ori = nullptr;
if (!object_entry_is_empty(entry))
{
ori = _objectRepository->FindObject(entry);
ori = _objectRepository.FindObject(entry);
if (ori == nullptr && object_entry_get_type(entry) != OBJECT_TYPE_SCENARIO_TEXT)
{
missingObjects.push_back(*entry);
@@ -534,7 +532,7 @@ private:
loadedObject = ori->LoadedObject;
if (loadedObject == nullptr)
{
loadedObject = _objectRepository->LoadObject(ori);
loadedObject = _objectRepository.LoadObject(ori);
if (loadedObject == nullptr)
{
std::lock_guard<std::mutex> guard(commonMutex);
@@ -546,7 +544,7 @@ private:
std::lock_guard<std::mutex> guard(commonMutex);
loadedObjects.push_back(loadedObject);
// Connect the ori to the registered object
_objectRepository->RegisterLoadedObject(ori, loadedObject);
_objectRepository.RegisterLoadedObject(ori, loadedObject);
}
}
}
@@ -582,13 +580,13 @@ private:
if (loadedObject == nullptr)
{
// Try to load object
loadedObject = _objectRepository->LoadObject(ori);
loadedObject = _objectRepository.LoadObject(ori);
if (loadedObject != nullptr)
{
loadedObject->Load();
// Connect the ori to the registered object
_objectRepository->RegisterLoadedObject(ori, loadedObject);
_objectRepository.RegisterLoadedObject(ori, loadedObject);
}
}
return loadedObject;
@@ -625,7 +623,7 @@ private:
}
};
std::unique_ptr<IObjectManager> CreateObjectManager(std::shared_ptr<IObjectRepository> objectRepository)
std::unique_ptr<IObjectManager> CreateObjectManager(IObjectRepository& objectRepository)
{
return std::make_unique<ObjectManager>(objectRepository);
}