From 837c0a9e7ff531c468b5d06e60d7cba2c1fe51eb Mon Sep 17 00:00:00 2001 From: Matt Date: Wed, 29 Aug 2018 01:17:15 +0200 Subject: [PATCH] Use std::unique_ptr for ObjectManager and ObjectRepository --- src/openrct2/Context.cpp | 8 +++--- src/openrct2/object/ObjectManager.cpp | 36 +++++++++++++-------------- src/openrct2/object/ObjectManager.h | 2 +- 3 files changed, 22 insertions(+), 24 deletions(-) diff --git a/src/openrct2/Context.cpp b/src/openrct2/Context.cpp index 120cd57d5b..a2d63360b8 100644 --- a/src/openrct2/Context.cpp +++ b/src/openrct2/Context.cpp @@ -84,8 +84,8 @@ namespace OpenRCT2 // Services std::shared_ptr _localisationService; - std::shared_ptr _objectRepository; - std::shared_ptr _objectManager; + std::unique_ptr _objectRepository; + std::unique_ptr _objectManager; std::unique_ptr _trackDesignRepository; std::unique_ptr _scenarioRepository; #ifdef __ENABLE_DISCORD__ @@ -309,8 +309,8 @@ namespace OpenRCT2 _env->SetBasePath(DIRBASE::RCT2, rct2InstallPath); } - _objectRepository = std::shared_ptr(CreateObjectRepository(_env)); - _objectManager = std::shared_ptr(CreateObjectManager(_objectRepository)); + _objectRepository = CreateObjectRepository(_env); + _objectManager = CreateObjectManager(*_objectRepository); _trackDesignRepository = CreateTrackDesignRepository(_env); _scenarioRepository = CreateScenarioRepository(_env); #ifdef __ENABLE_DISCORD__ diff --git a/src/openrct2/object/ObjectManager.cpp b/src/openrct2/object/ObjectManager.cpp index 58bbc2cfa0..52f43125f6 100644 --- a/src/openrct2/object/ObjectManager.cpp +++ b/src/openrct2/object/ObjectManager.cpp @@ -33,15 +33,13 @@ class ObjectManager final : public IObjectManager { private: - std::shared_ptr _objectRepository; + IObjectRepository& _objectRepository; std::vector _loadedObjects; public: - explicit ObjectManager(std::shared_ptr 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 GetPackableObjects() override { std::vector 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 guard(commonMutex); @@ -546,7 +544,7 @@ private: std::lock_guard 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 CreateObjectManager(std::shared_ptr objectRepository) +std::unique_ptr CreateObjectManager(IObjectRepository& objectRepository) { return std::make_unique(objectRepository); } diff --git a/src/openrct2/object/ObjectManager.h b/src/openrct2/object/ObjectManager.h index fd6dcbca5e..263841f9af 100644 --- a/src/openrct2/object/ObjectManager.h +++ b/src/openrct2/object/ObjectManager.h @@ -41,7 +41,7 @@ interface IObjectManager virtual std::vector GetPackableObjects() abstract; }; -std::unique_ptr CreateObjectManager(std::shared_ptr objectRepository); +std::unique_ptr CreateObjectManager(IObjectRepository& objectRepository); void* object_manager_get_loaded_object_by_index(size_t index); void* object_manager_get_loaded_object(const rct_object_entry* entry);