Merge pull request #7432 from IntelOrca/refactor/use-shared-ptr-2

Use shared_ptr for long-life objects (part 2)
This commit is contained in:
Ted John 2018-05-13 01:08:00 +01:00 committed by GitHub
commit 00278c6ca6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
21 changed files with 108 additions and 106 deletions

View File

@ -89,17 +89,17 @@ namespace OpenRCT2
// Services
std::shared_ptr<LocalisationService> _localisationService;
IObjectRepository * _objectRepository = nullptr;
IObjectManager * _objectManager = nullptr;
ITrackDesignRepository * _trackDesignRepository = nullptr;
IScenarioRepository * _scenarioRepository = nullptr;
std::shared_ptr<IObjectRepository> _objectRepository;
std::shared_ptr<IObjectManager> _objectManager;
std::unique_ptr<ITrackDesignRepository> _trackDesignRepository;
std::unique_ptr<IScenarioRepository> _scenarioRepository;
#ifdef __ENABLE_DISCORD__
std::unique_ptr<DiscordService> _discordService;
#endif
StdInOutConsole _stdInOutConsole;
// Game states
TitleScreen * _titleScreen = nullptr;
std::unique_ptr<TitleScreen> _titleScreen;
bool _initialised = false;
bool _isWindowMinimised = false;
@ -143,13 +143,6 @@ namespace OpenRCT2
EVP_MD_CTX_destroy(gHashCTX);
#endif // DISABLE_NETWORK
delete _titleScreen;
delete _scenarioRepository;
delete _trackDesignRepository;
delete _objectManager;
delete _objectRepository;
Instance = nullptr;
}
@ -173,24 +166,24 @@ namespace OpenRCT2
return *_localisationService;
}
IObjectManager * GetObjectManager() override
std::shared_ptr<IObjectManager> GetObjectManager() override
{
return _objectManager;
}
IObjectRepository * GetObjectRepository() override
std::shared_ptr<IObjectRepository> GetObjectRepository() override
{
return _objectRepository;
}
ITrackDesignRepository * GetTrackDesignRepository() override
{
return _trackDesignRepository;
return _trackDesignRepository.get();
}
IScenarioRepository * GetScenarioRepository() override
{
return _scenarioRepository;
return _scenarioRepository.get();
}
sint32 RunOpenRCT2(int argc, const char * * argv) override
@ -346,8 +339,8 @@ namespace OpenRCT2
_env->SetBasePath(DIRBASE::RCT2, rct2InstallPath);
}
_objectRepository = CreateObjectRepository(_env);
_objectManager = CreateObjectManager(_objectRepository);
_objectRepository = std::shared_ptr<IObjectRepository>(CreateObjectRepository(_env));
_objectManager = std::shared_ptr<IObjectManager>(CreateObjectManager(_objectRepository));
_trackDesignRepository = CreateTrackDesignRepository(_env);
_scenarioRepository = CreateScenarioRepository(_env);
#ifdef __ENABLE_DISCORD__
@ -432,7 +425,7 @@ namespace OpenRCT2
viewport_init_all();
game_init_all(150);
_titleScreen = new TitleScreen();
_titleScreen = std::make_unique<TitleScreen>();
return true;
}
@ -462,12 +455,12 @@ namespace OpenRCT2
if (info.Version <= FILE_TYPE_S4_CUTOFF)
{
// Save is an S4 (RCT1 format)
parkImporter.reset(ParkImporter::CreateS4());
parkImporter = ParkImporter::CreateS4();
}
else
{
// Save is an S6 (RCT2 format)
parkImporter.reset(ParkImporter::CreateS6(_objectRepository, _objectManager));
parkImporter = ParkImporter::CreateS6(_objectRepository, _objectManager);
}
try

View File

@ -98,8 +98,8 @@ namespace OpenRCT2
virtual std::shared_ptr<Ui::IUiContext> GetUiContext() abstract;
virtual std::shared_ptr<IPlatformEnvironment> GetPlatformEnvironment() abstract;
virtual Localisation::LocalisationService& GetLocalisationService() abstract;
virtual IObjectManager * GetObjectManager() abstract;
virtual IObjectRepository * GetObjectRepository() abstract;
virtual std::shared_ptr<IObjectManager> GetObjectManager() abstract;
virtual std::shared_ptr<IObjectRepository> GetObjectRepository() abstract;
virtual ITrackDesignRepository * GetTrackDesignRepository() abstract;
virtual IScenarioRepository * GetScenarioRepository() abstract;

View File

@ -99,9 +99,9 @@ ParkLoadResult * ParkLoadResult_CreateInvalidExtension()
namespace ParkImporter
{
IParkImporter * Create(const std::string &hintPath)
std::unique_ptr<IParkImporter> Create(const std::string &hintPath)
{
IParkImporter * parkImporter = nullptr;
std::unique_ptr<IParkImporter> parkImporter;
std::string extension = Path::GetExtension(hintPath);
if (ExtensionIsRCT1(extension))
{

View File

@ -29,6 +29,7 @@ enum PARK_LOAD_ERROR
PARK_LOAD_ERROR_UNKNOWN = 255
};
#include <memory>
#include <string>
#include <vector>
#include "core/String.hpp"
@ -79,9 +80,9 @@ public:
namespace ParkImporter
{
IParkImporter * Create(const std::string &hintPath);
IParkImporter * CreateS4();
IParkImporter * CreateS6(IObjectRepository * objectRepository, IObjectManager * objectManager);
std::unique_ptr<IParkImporter> Create(const std::string &hintPath);
std::unique_ptr<IParkImporter> CreateS4();
std::unique_ptr<IParkImporter> CreateS6(std::shared_ptr<IObjectRepository> objectRepository, std::shared_ptr<IObjectManager> objectManager);
bool ExtensionIsRCT1(const std::string &extension);
bool ExtensionIsScenario(const std::string &extension);

View File

@ -105,7 +105,7 @@ exitcode_t CommandLine::HandleCommandConvert(CommandLineArgEnumerator * enumerat
try
{
auto importer = std::unique_ptr<IParkImporter>(ParkImporter::Create(sourcePath));
auto importer = ParkImporter::Create(sourcePath);
importer->Load(sourcePath);
importer->Import();
}

View File

@ -1107,7 +1107,7 @@ void Network::Server_Send_MAP(NetworkConnection* connection)
// This will send all custom objects to connected clients
// TODO: fix it so custom objects negotiation is performed even in this case.
auto context = GetContext();
IObjectManager * objManager = context->GetObjectManager();
auto objManager = context->GetObjectManager();
objects = objManager->GetPackableObjects();
}
@ -1794,7 +1794,7 @@ void Network::Server_Client_Joined(const char* name, const std::string &keyhash,
chat_history_add(text);
auto context = GetContext();
IObjectManager * objManager = context->GetObjectManager();
auto objManager = context->GetObjectManager();
auto objects = objManager->GetPackableObjects();
Server_Send_OBJECTS(connection, objects);
@ -1815,7 +1815,7 @@ void Network::Server_Handle_TOKEN(NetworkConnection& connection, NetworkPacket&
void Network::Client_Handle_OBJECTS(NetworkConnection& connection, NetworkPacket& packet)
{
IObjectRepository * repo = GetContext()->GetObjectRepository();
auto repo = GetContext()->GetObjectRepository();
uint32 size;
packet >> size;
log_verbose("client received object list, it has %u entries", size);
@ -1868,7 +1868,7 @@ void Network::Server_Handle_OBJECTS(NetworkConnection& connection, NetworkPacket
return;
}
log_verbose("Client requested %u objects", size);
IObjectRepository * repo = GetContext()->GetObjectRepository();
auto repo = GetContext()->GetObjectRepository();
for (uint32 i = 0; i < size; i++)
{
const char * name = (const char *)packet.Read(8);
@ -2059,8 +2059,7 @@ bool Network::LoadMap(IStream * stream)
try
{
auto context = GetContext();
auto importer = std::unique_ptr<IParkImporter>(
ParkImporter::CreateS6(GetContext()->GetObjectRepository(), context->GetObjectManager()));
auto importer = ParkImporter::CreateS6(context->GetObjectRepository(), context->GetObjectManager());
importer->LoadFromStream(stream, false);
importer->Import();

View File

@ -36,19 +36,19 @@
class ObjectManager final : public IObjectManager
{
private:
IObjectRepository * _objectRepository;
std::vector<Object *> _loadedObjects;
std::shared_ptr<IObjectRepository> _objectRepository;
std::vector<Object *> _loadedObjects;
public:
explicit ObjectManager(IObjectRepository * objectRepository)
explicit ObjectManager(std::shared_ptr<IObjectRepository> objectRepository)
: _objectRepository(objectRepository)
{
Guard::ArgumentNotNull(objectRepository);
_objectRepository = objectRepository;
_loadedObjects.resize(OBJECT_ENTRY_COUNT);
UpdateSceneryGroupIndexes();
reset_type_to_ride_entry_index_map();
ResetTypeToRideEntryIndexMap();
}
~ObjectManager() override
@ -134,7 +134,7 @@ public:
}
_loadedObjects[slot] = loadedObject;
UpdateSceneryGroupIndexes();
reset_type_to_ride_entry_index_map();
ResetTypeToRideEntryIndexMap();
}
}
}
@ -165,7 +165,7 @@ public:
{
SetNewLoadedObjectList(std::get<1>(loadedObjects));
UpdateSceneryGroupIndexes();
reset_type_to_ride_entry_index_map();
ResetTypeToRideEntryIndexMap();
log_verbose("%u / %u new objects loaded", numNewLoadedObjects, requiredObjects.size());
return true;
}
@ -196,7 +196,7 @@ public:
if (numObjectsUnloaded > 0)
{
UpdateSceneryGroupIndexes();
reset_type_to_ride_entry_index_map();
ResetTypeToRideEntryIndexMap();
}
}
@ -207,7 +207,7 @@ public:
UnloadObject(object);
}
UpdateSceneryGroupIndexes();
reset_type_to_ride_entry_index_map();
ResetTypeToRideEntryIndexMap();
}
void ResetObjects() override
@ -221,7 +221,7 @@ public:
}
}
UpdateSceneryGroupIndexes();
reset_type_to_ride_entry_index_map();
ResetTypeToRideEntryIndexMap();
}
std::vector<const ObjectRepositoryItem *> GetPackableObjects() override
@ -546,6 +546,11 @@ private:
return loadedObject;
}
void ResetTypeToRideEntryIndexMap()
{
reset_type_to_ride_entry_index_map(*this);
}
static void ReportMissingObject(const rct_object_entry * entry)
{
utf8 objName[DAT_NAME_LENGTH + 1] = { 0 };
@ -572,28 +577,28 @@ private:
}
};
IObjectManager * CreateObjectManager(IObjectRepository * objectRepository)
std::unique_ptr<IObjectManager> CreateObjectManager(std::shared_ptr<IObjectRepository> objectRepository)
{
return new ObjectManager(objectRepository);
return std::make_unique<ObjectManager>(objectRepository);
}
void * object_manager_get_loaded_object_by_index(size_t index)
{
IObjectManager * objectManager = OpenRCT2::GetContext()->GetObjectManager();
auto objectManager = OpenRCT2::GetContext()->GetObjectManager();
Object * loadedObject = objectManager->GetLoadedObject(index);
return (void *)loadedObject;
}
void * object_manager_get_loaded_object(const rct_object_entry * entry)
{
IObjectManager * objectManager = OpenRCT2::GetContext()->GetObjectManager();
auto objectManager = OpenRCT2::GetContext()->GetObjectManager();
Object * loadedObject = objectManager->GetLoadedObject(entry);
return (void *)loadedObject;
}
uint8 object_manager_get_loaded_object_entry_index(const void * loadedObject)
{
IObjectManager * objectManager = OpenRCT2::GetContext()->GetObjectManager();
auto objectManager = OpenRCT2::GetContext()->GetObjectManager();
const Object * object = static_cast<const Object *>(loadedObject);
uint8 entryIndex = objectManager->GetLoadedObjectEntryIndex(object);
return entryIndex;
@ -601,20 +606,20 @@ uint8 object_manager_get_loaded_object_entry_index(const void * loadedObject)
void * object_manager_load_object(const rct_object_entry * entry)
{
IObjectManager * objectManager = OpenRCT2::GetContext()->GetObjectManager();
auto objectManager = OpenRCT2::GetContext()->GetObjectManager();
Object * loadedObject = objectManager->LoadObject(entry);
return (void *)loadedObject;
}
void object_manager_unload_objects(const rct_object_entry * entries, size_t count)
{
IObjectManager * objectManager = OpenRCT2::GetContext()->GetObjectManager();
auto objectManager = OpenRCT2::GetContext()->GetObjectManager();
objectManager->UnloadObjects(entries, count);
}
void object_manager_unload_all_objects()
{
IObjectManager * objectManager = OpenRCT2::GetContext()->GetObjectManager();
auto objectManager = OpenRCT2::GetContext()->GetObjectManager();
if (objectManager != nullptr)
{
objectManager->UnloadAll();

View File

@ -44,7 +44,7 @@ interface IObjectManager
virtual std::vector<const ObjectRepositoryItem *> GetPackableObjects() abstract;
};
IObjectManager * CreateObjectManager(IObjectRepository * objectRepository);
std::unique_ptr<IObjectManager> CreateObjectManager(std::shared_ptr<IObjectRepository> objectRepository);
void * object_manager_get_loaded_object_by_index(size_t index);
void * object_manager_get_loaded_object(const rct_object_entry * entry);

View File

@ -639,9 +639,9 @@ private:
}
};
IObjectRepository * CreateObjectRepository(const std::shared_ptr<IPlatformEnvironment>& env)
std::unique_ptr<IObjectRepository> CreateObjectRepository(const std::shared_ptr<IPlatformEnvironment>& env)
{
return new ObjectRepository(env);
return std::make_unique<ObjectRepository>(env);
}
bool IsObjectCustom(const ObjectRepositoryItem * object)
@ -671,14 +671,14 @@ void object_list_load()
auto objectRepository = context->GetObjectRepository();
objectRepository->LoadOrConstruct(localisationService.GetCurrentLanguage());
IObjectManager * objectManager = context->GetObjectManager();
auto objectManager = context->GetObjectManager();
objectManager->UnloadAll();
}
void * object_repository_load_object(const rct_object_entry * objectEntry)
{
Object * object = nullptr;
IObjectRepository * objRepository = GetContext()->GetObjectRepository();
auto objRepository = GetContext()->GetObjectRepository();
const ObjectRepositoryItem * ori = objRepository->FindObject(objectEntry);
if (ori != nullptr)
{
@ -710,7 +710,7 @@ void scenario_translate(scenario_index_entry * scenarioEntry, const rct_object_e
// Checks for a scenario string object (possibly for localisation)
if ((stexObjectEntry->flags & 0xFF) != 255)
{
IObjectRepository * objectRepository = GetContext()->GetObjectRepository();
auto objectRepository = GetContext()->GetObjectRepository();
const ObjectRepositoryItem * ori = objectRepository->FindObject(stexObjectEntry);
if (ori != nullptr)
{
@ -733,25 +733,25 @@ void scenario_translate(scenario_index_entry * scenarioEntry, const rct_object_e
size_t object_repository_get_items_count()
{
IObjectRepository * objectRepository = GetContext()->GetObjectRepository();
auto objectRepository = GetContext()->GetObjectRepository();
return objectRepository->GetNumObjects();
}
const ObjectRepositoryItem * object_repository_get_items()
{
IObjectRepository * objectRepository = GetContext()->GetObjectRepository();
auto objectRepository = GetContext()->GetObjectRepository();
return objectRepository->GetObjects();
}
const ObjectRepositoryItem * object_repository_find_object_by_entry(const rct_object_entry * entry)
{
IObjectRepository * objectRepository = GetContext()->GetObjectRepository();
auto objectRepository = GetContext()->GetObjectRepository();
return objectRepository->FindObject(entry);
}
const ObjectRepositoryItem * object_repository_find_object_by_name(const char * name)
{
IObjectRepository * objectRepository = GetContext()->GetObjectRepository();
auto objectRepository = GetContext()->GetObjectRepository();
return objectRepository->FindObject(name);
}

View File

@ -83,7 +83,7 @@ interface IObjectRepository
virtual void WritePackedObjects(IStream * stream, std::vector<const ObjectRepositoryItem *> &objects) abstract;
};
IObjectRepository * CreateObjectRepository(const std::shared_ptr<OpenRCT2::IPlatformEnvironment>& env);
std::unique_ptr<IObjectRepository> CreateObjectRepository(const std::shared_ptr<OpenRCT2::IPlatformEnvironment>& env);
bool IsObjectCustom(const ObjectRepositoryItem * object);

View File

@ -75,8 +75,8 @@ void SceneryGroupObject::DrawPreview(rct_drawpixelinfo * dpi, sint32 width, sint
void SceneryGroupObject::UpdateEntryIndexes()
{
auto context = GetContext();
IObjectRepository * objectRepository = context->GetObjectRepository();
IObjectManager * objectManager = context->GetObjectManager();
auto objectRepository = context->GetObjectRepository();
auto objectManager = context->GetObjectManager();
_legacyType.entry_count = 0;
for (const auto &objectEntry : _items)

View File

@ -1863,7 +1863,7 @@ private:
void LoadObjects(uint8 objectType, const std::vector<const char *> &entries)
{
IObjectManager * objectManager = OpenRCT2::GetContext()->GetObjectManager();
auto objectManager = OpenRCT2::GetContext()->GetObjectManager();
uint32 entryIndex = 0;
for (const char * objectName : entries)
@ -1912,7 +1912,7 @@ private:
void GetInvalidObjects(uint8 objectType, const std::vector<const char *> &entries, std::vector<rct_object_entry> &missingObjects)
{
IObjectRepository * objectRepository = OpenRCT2::GetContext()->GetObjectRepository();
auto objectRepository = OpenRCT2::GetContext()->GetObjectRepository();
for (const char * objectName : entries)
{
rct_object_entry entry;
@ -2832,9 +2832,9 @@ private:
}
};
IParkImporter * ParkImporter::CreateS4()
std::unique_ptr<IParkImporter> ParkImporter::CreateS4()
{
return new S4Importer();
return std::unique_ptr<S4Importer>();
}
ParkLoadResult * load_from_sv4(const utf8 * path)

View File

@ -107,7 +107,7 @@ void S6Exporter::Save(IStream * stream, bool isScenario)
// 2: Write packed objects
if (_s6.header.num_packed_objects > 0)
{
IObjectRepository * objRepo = OpenRCT2::GetContext()->GetObjectRepository();
auto objRepo = OpenRCT2::GetContext()->GetObjectRepository();
objRepo->WritePackedObjects(stream, ExportObjectsList);
}
@ -783,7 +783,7 @@ sint32 scenario_save(const utf8 * path, sint32 flags)
{
if (flags & S6_SAVE_FLAG_EXPORT)
{
IObjectManager * objManager = OpenRCT2::GetContext()->GetObjectManager();
auto objManager = OpenRCT2::GetContext()->GetObjectManager();
s6exporter->ExportObjectsList = objManager->GetPackableObjects();
}
s6exporter->RemoveTracklessRides = true;

View File

@ -68,15 +68,15 @@ public:
class S6Importer final : public IParkImporter
{
private:
IObjectRepository * const _objectRepository;
IObjectManager * const _objectManager;
std::shared_ptr<IObjectRepository> const _objectRepository;
std::shared_ptr<IObjectManager> const _objectManager;
const utf8 * _s6Path = nullptr;
rct_s6_data _s6 { };
uint8 _gameVersion = 0;
public:
S6Importer(IObjectRepository * objectRepository, IObjectManager * objectManager)
S6Importer(std::shared_ptr<IObjectRepository> objectRepository, std::shared_ptr<IObjectManager> objectManager)
: _objectRepository(objectRepository),
_objectManager(objectManager)
{
@ -852,9 +852,9 @@ public:
}
};
IParkImporter * ParkImporter::CreateS6(IObjectRepository * objectRepository, IObjectManager * objectManager)
std::unique_ptr<IParkImporter> ParkImporter::CreateS6(std::shared_ptr<IObjectRepository> objectRepository, std::shared_ptr<IObjectManager> objectManager)
{
return new S6Importer(objectRepository, objectManager);
return std::make_unique<S6Importer>(objectRepository, objectManager);
}
ParkLoadResult * load_from_sv6(const char * path)

View File

@ -283,23 +283,27 @@ rct_ride_entry * get_ride_entry_by_ride(Ride *ride)
*
* rct2: 0x006DED68
*/
void reset_type_to_ride_entry_index_map()
void reset_type_to_ride_entry_index_map(IObjectManager& objectManager)
{
size_t stride = MAX_RIDE_OBJECTS + 1;
uint8 * entryTypeTable = (uint8 *)malloc(RIDE_TYPE_COUNT * stride);
memset(entryTypeTable, 0xFF, RIDE_TYPE_COUNT * stride);
for (uint8 i = 0; i < MAX_RIDE_OBJECTS; i++) {
rct_ride_entry * rideEntry = get_ride_entry(i);
if (rideEntry == nullptr) {
continue;
}
for (uint8 j = 0; j < MAX_RIDE_TYPES_PER_RIDE_ENTRY; j++) {
uint8 rideType = rideEntry->ride_type[j];
if (rideType < RIDE_TYPE_COUNT) {
uint8 * entryArray = &entryTypeTable[rideType * stride];
uint8 * nextEntry = (uint8 *)memchr(entryArray, 0xFF, stride);
*nextEntry = i;
auto obj = objectManager.GetLoadedObject(OBJECT_TYPE_RIDE, i);
if (obj != nullptr)
{
for (uint8 j = 0; j < MAX_RIDE_TYPES_PER_RIDE_ENTRY; j++)
{
auto rideEntry = (rct_ride_entry *)obj->GetLegacyData();
uint8 rideType = rideEntry->ride_type[j];
if (rideType < RIDE_TYPE_COUNT)
{
uint8 * entryArray = &entryTypeTable[rideType * stride];
uint8 * nextEntry = (uint8 *)memchr(entryArray, 0xFF, stride);
*nextEntry = i;
}
}
}
}

View File

@ -25,6 +25,8 @@
#include "RideRatings.h"
#include "Vehicle.h"
interface IObjectManager;
#define MAX_RIDE_TYPES_PER_RIDE_ENTRY 3
// The max number of different types of vehicle.
// Examples of vehicles here are the locomotive, tender and carriage of the Miniature Railway.
@ -1038,7 +1040,7 @@ sint32 ride_get_unused_preset_vehicle_colour(uint8 ride_sub_type);
void ride_set_vehicle_colours_to_random_preset(Ride *ride, uint8 preset_index);
rct_ride_entry *get_ride_entry_by_ride(Ride *ride);
uint8 *get_ride_entry_indices_for_ride_type(uint8 rideType);
void reset_type_to_ride_entry_index_map();
void reset_type_to_ride_entry_index_map(IObjectManager& objectManager);
void ride_measurement_clear(Ride *ride);
void ride_measurements_update();
rct_ride_measurement *ride_get_measurement(sint32 rideIndex, rct_string_id *message);

View File

@ -166,7 +166,7 @@ public:
size_t GetCountForObjectEntry(uint8 rideType, const std::string &entry) const override
{
size_t count = 0;
const IObjectRepository * repo = GetContext()->GetObjectRepository();
const auto repo = GetContext()->GetObjectRepository();
for (const auto &item : _items)
{
@ -195,7 +195,7 @@ public:
size_t GetCountForRideGroup(uint8 rideType, const RideGroup * rideGroup) const override
{
size_t count = 0;
const IObjectRepository * repo = GetContext()->GetObjectRepository();
const auto repo = GetContext()->GetObjectRepository();
for (const auto &item : _items)
{
@ -227,7 +227,7 @@ public:
std::vector<track_design_file_ref> GetItemsForObjectEntry(uint8 rideType, const std::string &entry) const override
{
std::vector<track_design_file_ref> refs;
const IObjectRepository * repo = GetContext()->GetObjectRepository();
const auto repo = GetContext()->GetObjectRepository();
for (const auto &item : _items)
{
@ -260,7 +260,7 @@ public:
std::vector<track_design_file_ref> GetItemsForRideGroup(uint8 rideType, const RideGroup * rideGroup) const override
{
std::vector<track_design_file_ref> refs;
const IObjectRepository * repo = GetContext()->GetObjectRepository();
const auto repo = GetContext()->GetObjectRepository();
for (const auto &item : _items)
{
@ -398,9 +398,9 @@ private:
}
};
ITrackDesignRepository * CreateTrackDesignRepository(const std::shared_ptr<IPlatformEnvironment>& env)
std::unique_ptr<ITrackDesignRepository> CreateTrackDesignRepository(const std::shared_ptr<IPlatformEnvironment>& env)
{
return new TrackDesignRepository(env);
return std::make_unique<TrackDesignRepository>(env);
}
void track_repository_scan()

View File

@ -52,7 +52,7 @@ interface ITrackDesignRepository
virtual std::string Install(const std::string &path) abstract;
};
ITrackDesignRepository * CreateTrackDesignRepository(const std::shared_ptr<OpenRCT2::IPlatformEnvironment>& env);
std::unique_ptr<ITrackDesignRepository> CreateTrackDesignRepository(const std::shared_ptr<OpenRCT2::IPlatformEnvironment>& env);
std::string GetNameFromTrackPath(const std::string &path);
void track_repository_scan();

View File

@ -17,6 +17,7 @@
#include <algorithm>
#include <memory>
#include <vector>
#include "../Context.h"
#include "../core/Console.hpp"
#include "../core/File.h"
#include "../core/FileIndex.hpp"
@ -218,7 +219,7 @@ private:
bool result = false;
try
{
auto s4Importer = std::unique_ptr<IParkImporter>(ParkImporter::CreateS4());
auto s4Importer = ParkImporter::CreateS4();
s4Importer->LoadScenario(path.c_str(), true);
if (s4Importer->GetDetails(entry))
{
@ -728,17 +729,14 @@ private:
}
};
static ScenarioRepository * _scenarioRepository;
IScenarioRepository * CreateScenarioRepository(const std::shared_ptr<IPlatformEnvironment>& env)
std::unique_ptr<IScenarioRepository> CreateScenarioRepository(const std::shared_ptr<IPlatformEnvironment>& env)
{
_scenarioRepository = new ScenarioRepository(env);
return _scenarioRepository;
return std::make_unique<ScenarioRepository>(env);
}
IScenarioRepository * GetScenarioRepository()
{
return _scenarioRepository;
return GetContext()->GetScenarioRepository();
}
void scenario_repository_scan()

View File

@ -78,7 +78,7 @@ interface IScenarioRepository
virtual bool TryRecordHighscore(sint32 language, const utf8 * scenarioFileName, money32 companyValue, const utf8 * name) abstract;
};
IScenarioRepository * CreateScenarioRepository(const std::shared_ptr<OpenRCT2::IPlatformEnvironment>& env);
std::unique_ptr<IScenarioRepository> CreateScenarioRepository(const std::shared_ptr<OpenRCT2::IPlatformEnvironment>& env);
IScenarioRepository * GetScenarioRepository();
void scenario_repository_scan();

View File

@ -416,7 +416,7 @@ private:
}
else
{
auto parkImporter = std::unique_ptr<IParkImporter>(ParkImporter::Create(path));
auto parkImporter = ParkImporter::Create(path);
parkImporter->Load(path);
parkImporter->Import();
}
@ -451,7 +451,7 @@ private:
{
std::string extension = Path::GetExtension(hintPath);
bool isScenario = ParkImporter::ExtensionIsScenario(hintPath);
auto parkImporter = std::unique_ptr<IParkImporter>(ParkImporter::Create(hintPath));
auto parkImporter = ParkImporter::Create(hintPath);
parkImporter->LoadFromStream(stream, isScenario);
parkImporter->Import();
}