1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-18 04:23:20 +01:00

Close #13000: Refactor ObjectFactory to use unique_ptr

Employs the smart pointer unique_ptr for safer memory management.

Classes involved:
 - ObjectRepository
 - ObjectManager
This commit is contained in:
Vinicius Sa
2020-10-14 16:56:48 -03:00
committed by GitHub
parent 0c283ba3e7
commit 711dd00cde
11 changed files with 129 additions and 163 deletions

View File

@@ -94,7 +94,7 @@ public:
public:
std::tuple<bool, ObjectRepositoryItem> Create([[maybe_unused]] int32_t language, const std::string& path) const override
{
Object* object = nullptr;
std::unique_ptr<Object> object;
auto extension = Path::GetExtension(path);
if (String::Equals(extension, ".json", true))
{
@@ -117,7 +117,6 @@ public:
item.Authors = object->GetAuthors();
item.Sources = object->GetSourceGames();
object->SetRepositoryItem(&item);
delete object;
return std::make_tuple(true, item);
}
return std::make_tuple(false, ObjectRepositoryItem());
@@ -290,7 +289,7 @@ public:
return nullptr;
}
Object* LoadObject(const ObjectRepositoryItem* ori) override
std::unique_ptr<Object> LoadObject(const ObjectRepositoryItem* ori) override
{
Guard::ArgumentNotNull(ori, GUARD_LINE);
@@ -332,7 +331,7 @@ public:
object_entry_get_name_fixed(objectName, sizeof(objectName), objectEntry);
// Check that the object is loadable before writing it
Object* object = ObjectFactory::CreateObjectFromLegacyData(*this, objectEntry, data, dataSize);
auto object = ObjectFactory::CreateObjectFromLegacyData(*this, objectEntry, data, dataSize);
if (object == nullptr)
{
Console::Error::WriteLine("[%s] Unable to export object.", objectName);
@@ -694,9 +693,9 @@ const rct_object_entry* object_list_find(rct_object_entry* entry)
return result;
}
void* object_repository_load_object(const rct_object_entry* objectEntry)
std::unique_ptr<Object> object_repository_load_object(const rct_object_entry* objectEntry)
{
Object* object = nullptr;
std::unique_ptr<Object> object;
auto& objRepository = GetContext()->GetObjectRepository();
const ObjectRepositoryItem* ori = objRepository.FindObject(objectEntry);
if (ori != nullptr)
@@ -707,7 +706,7 @@ void* object_repository_load_object(const rct_object_entry* objectEntry)
object->Load();
}
}
return static_cast<void*>(object);
return object;
}
void scenario_translate(scenario_index_entry* scenarioEntry)
@@ -750,22 +749,6 @@ const ObjectRepositoryItem* object_repository_find_object_by_name(const char* na
return objectRepository.FindObject(name);
}
void object_delete(void* object)
{
if (object != nullptr)
{
Object* baseObject = static_cast<Object*>(object);
baseObject->Unload();
delete baseObject;
}
}
void object_draw_preview(const void* object, rct_drawpixelinfo* dpi, int32_t width, int32_t height)
{
const Object* baseObject = static_cast<const Object*>(object);
baseObject->DrawPreview(dpi, width, height);
}
bool object_entry_compare(const rct_object_entry* a, const rct_object_entry* b)
{
// If an official object don't bother checking checksum