From 1a1525a15501072da93ec0a7c1ef356886bd13a8 Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Thu, 24 Dec 2015 17:51:04 +0100 Subject: LAB: Avoid manual memory management of ViewData --- engines/lab/processroom.cpp | 14 ++++++------- engines/lab/processroom.h | 3 +-- engines/lab/resource.cpp | 49 +++++++++++++++------------------------------ engines/lab/resource.h | 4 ++-- 4 files changed, 26 insertions(+), 44 deletions(-) (limited to 'engines') diff --git a/engines/lab/processroom.cpp b/engines/lab/processroom.cpp index e49d2acd02..daf4f3ba84 100644 --- a/engines/lab/processroom.cpp +++ b/engines/lab/processroom.cpp @@ -56,16 +56,16 @@ ViewData *LabEngine::getViewData(uint16 roomNum, uint16 direction) { if (_rooms[roomNum]._roomMsg.empty()) _resource->readViews(roomNum); - ViewData *view = _rooms[roomNum]._view[direction]; + Common::List &views = _rooms[roomNum]._view[direction]; - do { - if (checkConditions(view->_condition)) - break; + Common::List::iterator view; - view = view->_nextCondition; - } while (true); + for (view = views.begin(); view != views.end(); ++view) { + if (checkConditions(view->_condition)) + return &(*view); + } - return view; + error("No view with matching condition found"); } CloseData *LabEngine::getObject(Common::Point pos, CloseDataPtr closePtr) { diff --git a/engines/lab/processroom.h b/engines/lab/processroom.h index 0cfe98f9df..88dd544f7b 100644 --- a/engines/lab/processroom.h +++ b/engines/lab/processroom.h @@ -150,7 +150,6 @@ struct CloseData { struct ViewData { Common::Array _condition; Common::String _graphicName; - ViewData *_nextCondition; CloseDataPtr _closeUps; }; @@ -173,7 +172,7 @@ struct Rule { struct RoomData { uint16 _doors[4]; byte _transitionType; - ViewData *_view[4]; + Common::List _view[4]; RuleList _rules; Common::String _roomMsg; }; diff --git a/engines/lab/resource.cpp b/engines/lab/resource.cpp index bd86cd3f4d..5de2df802d 100644 --- a/engines/lab/resource.cpp +++ b/engines/lab/resource.cpp @@ -108,11 +108,6 @@ void Resource::readRoomData(const Common::String fileName) { curRoom->_doors[kDirectionEast] = dataFile->readUint16LE(); curRoom->_doors[kDirectionWest] = dataFile->readUint16LE(); curRoom->_transitionType = dataFile->readByte(); - - curRoom->_view[kDirectionNorth] = nullptr; - curRoom->_view[kDirectionSouth] = nullptr; - curRoom->_view[kDirectionEast] = nullptr; - curRoom->_view[kDirectionWest] = nullptr; } delete dataFile; @@ -142,10 +137,10 @@ void Resource::readViews(uint16 roomNum) { RoomData *curRoom = &_vm->_rooms[roomNum]; curRoom->_roomMsg = readString(dataFile); - curRoom->_view[kDirectionNorth] = readView(dataFile); - curRoom->_view[kDirectionSouth] = readView(dataFile); - curRoom->_view[kDirectionEast] = readView(dataFile); - curRoom->_view[kDirectionWest] = readView(dataFile); + readView(dataFile, curRoom->_view[kDirectionNorth]); + readView(dataFile, curRoom->_view[kDirectionSouth]); + readView(dataFile, curRoom->_view[kDirectionEast]); + readView(dataFile, curRoom->_view[kDirectionWest]); readRule(dataFile, curRoom->_rules); _vm->updateMusicAndEvents(); @@ -326,34 +321,22 @@ void Resource::freeCloseUps(CloseData *closeUps) { } } -ViewData *Resource::readView(Common::File *file) { - ViewData *view = nullptr; - ViewData *prev = nullptr; - ViewData *head = nullptr; - +void Resource::readView(Common::File *file, Common::List &list) { + list.clear(); while (file->readByte() == 1) { - view = new ViewData(); - if (!head) - head = view; - if (prev) - prev->_nextCondition = view; - view->_condition = readConditions(file); - view->_graphicName = readString(file); - view->_closeUps = readCloseUps(0, file); - view->_nextCondition = nullptr; - prev = view; - } + list.push_back(ViewData()); + ViewData &view = list.back(); - return head; + view._condition = readConditions(file); + view._graphicName = readString(file); + view._closeUps = readCloseUps(0, file); + } } -void Resource::freeView(ViewData *view) { - while (view) { - ViewData *nextView = view->_nextCondition; - freeCloseUps(view->_closeUps); - delete view; - view = nextView; - } +void Resource::freeView(Common::List &view) { + Common::List::iterator i; + for (i = view.begin(); i != view.end(); ++i) + freeCloseUps(i->_closeUps); } } // End of namespace Lab diff --git a/engines/lab/resource.h b/engines/lab/resource.h index d3ed3633df..39672d1e32 100644 --- a/engines/lab/resource.h +++ b/engines/lab/resource.h @@ -115,8 +115,8 @@ private: void freeAction(Action *action); CloseData *readCloseUps(uint16 depth, Common::File *file); void freeCloseUps(CloseData *closeUps); - ViewData *readView(Common::File *file); - void freeView(ViewData *view); + void readView(Common::File *file, Common::List &view); + void freeView(Common::List &view); void readStaticText(); Common::String translateFileName(const Common::String filename); -- cgit v1.2.3