From c30bd1266f73e88f21fc70550eeb38428c6c5e75 Mon Sep 17 00:00:00 2001 From: Matt Date: Fri, 12 Feb 2021 19:30:53 +0200 Subject: [PATCH] Refactor IStream::ReadArray to return unique_ptr --- src/openrct2/FileClassifier.cpp | 7 +++---- src/openrct2/config/Config.cpp | 2 +- src/openrct2/config/Config.h | 2 +- src/openrct2/core/DataSerialiserTraits.h | 11 ++++------- src/openrct2/core/IStream.hpp | 7 ++++--- src/openrct2/drawing/Drawing.Sprite.cpp | 12 ++++++------ src/openrct2/drawing/Drawing.h | 3 ++- src/openrct2/object/RideObject.cpp | 3 +-- src/openrct2/rct1/S4Importer.cpp | 6 ++---- src/openrct2/rct12/SawyerEncoding.cpp | 3 ++- src/openrct2/rct2/S6Exporter.cpp | 3 +-- 11 files changed, 27 insertions(+), 32 deletions(-) diff --git a/src/openrct2/FileClassifier.cpp b/src/openrct2/FileClassifier.cpp index bb3bdb13f3..6aa2b7b3f9 100644 --- a/src/openrct2/FileClassifier.cpp +++ b/src/openrct2/FileClassifier.cpp @@ -97,8 +97,7 @@ static bool TryClassifyAsS4(OpenRCT2::IStream* stream, ClassifiedFileInfo* resul try { size_t dataLength = static_cast(stream->GetLength()); - auto deleter_lambda = [dataLength](uint8_t* ptr) { Memory::FreeArray(ptr, dataLength); }; - std::unique_ptr data(stream->ReadArray(dataLength), deleter_lambda); + auto data = stream->ReadArray(dataLength); stream->SetPosition(originalPosition); int32_t fileTypeVersion = sawyercoding_detect_file_type(data.get(), dataLength); @@ -134,8 +133,8 @@ static bool TryClassifyAsTD4_TD6(OpenRCT2::IStream* stream, ClassifiedFileInfo* try { size_t dataLength = static_cast(stream->GetLength()); - auto deleter_lambda = [dataLength](uint8_t* ptr) { Memory::FreeArray(ptr, dataLength); }; - std::unique_ptr data(stream->ReadArray(dataLength), deleter_lambda); + + auto data = stream->ReadArray(dataLength); stream->SetPosition(originalPosition); if (sawyercoding_validate_track_checksum(data.get(), dataLength)) diff --git a/src/openrct2/config/Config.cpp b/src/openrct2/config/Config.cpp index fda925b638..06007c8c19 100644 --- a/src/openrct2/config/Config.cpp +++ b/src/openrct2/config/Config.cpp @@ -998,7 +998,7 @@ bool RCT1DataPresentAtLocation(const utf8* path) return Csg1datPresentAtLocation(path) && Csg1idatPresentAtLocation(path) && CsgAtLocationIsUsable(path); } -bool CsgIsUsable(rct_gx csg) +bool CsgIsUsable(const rct_gx& csg) { return csg.header.num_entries == RCT1_NUM_LL_CSG_ENTRIES; } diff --git a/src/openrct2/config/Config.h b/src/openrct2/config/Config.h index d2b3667118..badf2b1fdf 100644 --- a/src/openrct2/config/Config.h +++ b/src/openrct2/config/Config.h @@ -258,5 +258,5 @@ std::string FindCsg1datAtLocation(const utf8* path); bool Csg1datPresentAtLocation(const utf8* path); std::string FindCsg1idatAtLocation(const utf8* path); bool Csg1idatPresentAtLocation(const utf8* path); -bool CsgIsUsable(rct_gx csg); +bool CsgIsUsable(const rct_gx& csg); bool CsgAtLocationIsUsable(const utf8* path); diff --git a/src/openrct2/core/DataSerialiserTraits.h b/src/openrct2/core/DataSerialiserTraits.h index 348200b7d2..6128404106 100644 --- a/src/openrct2/core/DataSerialiserTraits.h +++ b/src/openrct2/core/DataSerialiserTraits.h @@ -161,10 +161,8 @@ template<> struct DataSerializerTraits_t res = ""; return; } - const char* str = stream->ReadArray(len); - res.assign(str, len); - - Memory::FreeArray(str, len); + auto str = stream->ReadArray(len); + res.assign(str.get(), len); } static void log(OpenRCT2::IStream* stream, const std::string& str) { @@ -620,9 +618,8 @@ template<> struct DataSerializerTraits_t uint32_t temp; stream->Read(&temp); val.flags = ByteSwapBE(temp); - const char* str = stream->ReadArray(12); - memcpy(val.nameWOC, str, 12); - Memory::FreeArray(str, 12); + auto str = stream->ReadArray(12); + memcpy(val.nameWOC, str.get(), 12); } static void log(OpenRCT2::IStream* stream, const rct_object_entry& val) { diff --git a/src/openrct2/core/IStream.hpp b/src/openrct2/core/IStream.hpp index 9cf5016fb2..6f751dc77c 100644 --- a/src/openrct2/core/IStream.hpp +++ b/src/openrct2/core/IStream.hpp @@ -14,6 +14,7 @@ #include "Memory.hpp" #include +#include #include #include #include @@ -191,10 +192,10 @@ namespace OpenRCT2 Write(&value); } - template T* ReadArray(size_t count) + template std::unique_ptr ReadArray(size_t count) { - T* buffer = Memory::AllocateArray(count); - Read(buffer, sizeof(T) * count); + auto buffer = std::make_unique(count); + Read(buffer.get(), sizeof(T) * count); return buffer; } diff --git a/src/openrct2/drawing/Drawing.Sprite.cpp b/src/openrct2/drawing/Drawing.Sprite.cpp index 470aa9d451..50fe767c8b 100644 --- a/src/openrct2/drawing/Drawing.Sprite.cpp +++ b/src/openrct2/drawing/Drawing.Sprite.cpp @@ -220,7 +220,7 @@ bool gfx_load_g1(const IPlatformEnvironment& env) // Fix entry data offsets for (uint32_t i = 0; i < _g1.header.num_entries; i++) { - _g1.elements[i].offset += reinterpret_cast(_g1.data); + _g1.elements[i].offset += reinterpret_cast(_g1.data.get()); } return true; } @@ -241,21 +241,21 @@ bool gfx_load_g1(const IPlatformEnvironment& env) void gfx_unload_g1() { - SafeFree(_g1.data); + _g1.data.reset(); _g1.elements.clear(); _g1.elements.shrink_to_fit(); } void gfx_unload_g2() { - SafeFree(_g2.data); + _g2.data.reset(); _g2.elements.clear(); _g2.elements.shrink_to_fit(); } void gfx_unload_csg() { - SafeFree(_csg.data); + _csg.data.reset(); _csg.elements.clear(); _csg.elements.shrink_to_fit(); } @@ -283,7 +283,7 @@ bool gfx_load_g2() // Fix entry data offsets for (uint32_t i = 0; i < _g2.header.num_entries; i++) { - _g2.elements[i].offset += reinterpret_cast(_g2.data); + _g2.elements[i].offset += reinterpret_cast(_g2.data.get()); } return true; } @@ -340,7 +340,7 @@ bool gfx_load_csg() // Fix entry data offsets for (uint32_t i = 0; i < _csg.header.num_entries; i++) { - _csg.elements[i].offset += reinterpret_cast(_csg.data); + _csg.elements[i].offset += reinterpret_cast(_csg.data.get()); // RCT1 used zoomed offsets that counted from the beginning of the file, rather than from the current sprite. if (_csg.elements[i].flags & G1_FLAG_HAS_ZOOM_SPRITE) { diff --git a/src/openrct2/drawing/Drawing.h b/src/openrct2/drawing/Drawing.h index 5ce7c36321..453b641d19 100644 --- a/src/openrct2/drawing/Drawing.h +++ b/src/openrct2/drawing/Drawing.h @@ -16,6 +16,7 @@ #include "../world/Location.hpp" #include "Text.h" +#include #include #include @@ -97,7 +98,7 @@ struct rct_gx { rct_g1_header header; std::vector elements; - void* data; + std::unique_ptr data; }; struct rct_drawpixelinfo diff --git a/src/openrct2/object/RideObject.cpp b/src/openrct2/object/RideObject.cpp index dab1f77045..a49efe3c60 100644 --- a/src/openrct2/object/RideObject.cpp +++ b/src/openrct2/object/RideObject.cpp @@ -160,8 +160,7 @@ void RideObject::ReadLegacy(IReadObjectContext* context, IStream* stream) _legacyType.vehicles[i].peep_loading_waypoint_segments = 0; auto data = stream->ReadArray(numPeepLoadingPositions); - _peepLoadingPositions[i] = std::vector(data, data + numPeepLoadingPositions); - Memory::Free(data); + _peepLoadingPositions[i] = std::vector(data.get(), data.get() + numPeepLoadingPositions); } } diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index adf7183c36..115c5646d6 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -301,10 +301,8 @@ private: { auto s4 = std::make_unique(); size_t dataSize = stream->GetLength() - stream->GetPosition(); - auto deleter_lambda = [dataSize](uint8_t* ptr) { Memory::FreeArray(ptr, dataSize); }; - auto data = std::unique_ptr(stream->ReadArray(dataSize), deleter_lambda); - auto decodedData = std::unique_ptr)>( - Memory::Allocate(sizeof(rct1_s4)), &Memory::Free); + auto data = stream->ReadArray(dataSize); + auto decodedData = std::make_unique(sizeof(rct1_s4)); size_t decodedSize; int32_t fileType = sawyercoding_detect_file_type(data.get(), dataSize); diff --git a/src/openrct2/rct12/SawyerEncoding.cpp b/src/openrct2/rct12/SawyerEncoding.cpp index e0da9f2c16..0172d68d5b 100644 --- a/src/openrct2/rct12/SawyerEncoding.cpp +++ b/src/openrct2/rct12/SawyerEncoding.cpp @@ -73,7 +73,8 @@ namespace SawyerEncoding try { - auto data{ stream->ReadArray(dataSize) }; + const auto buffer = stream->ReadArray(dataSize); + const auto* data = buffer.get(); uint32_t checksum = 0; for (size_t i = 0; i < dataSize; i++, ++data) { diff --git a/src/openrct2/rct2/S6Exporter.cpp b/src/openrct2/rct2/S6Exporter.cpp index 738a355a72..232ebb508b 100644 --- a/src/openrct2/rct2/S6Exporter.cpp +++ b/src/openrct2/rct2/S6Exporter.cpp @@ -140,8 +140,7 @@ void S6Exporter::Save(OpenRCT2::IStream* stream, bool isScenario) // Read all written bytes back into a single buffer stream->SetPosition(0); - auto data = std::unique_ptr>( - stream->ReadArray(fileSize), Memory::Free); + auto data = stream->ReadArray(fileSize); uint32_t checksum = sawyercoding_calculate_checksum(data.get(), fileSize); // Write the checksum on the end