diff --git a/include/core/block.h b/include/core/block.h index 0f30c4da..9bb1877f 100644 --- a/include/core/block.h +++ b/include/core/block.h @@ -12,12 +12,12 @@ public: Block(uint16_t tile, uint16_t collision, uint16_t elevation); Block(const Block &); Block &operator=(const Block &); - bool operator ==(Block); - bool operator !=(Block); + bool operator ==(Block) const; + bool operator !=(Block) const; uint16_t tile:10; uint16_t collision:2; uint16_t elevation:4; - uint16_t rawValue(); + uint16_t rawValue() const; }; #endif // BLOCK_H diff --git a/include/core/blockdata.h b/include/core/blockdata.h index a8e29d36..a1e45b63 100644 --- a/include/core/blockdata.h +++ b/include/core/blockdata.h @@ -4,31 +4,13 @@ #include "block.h" -#include #include #include -class Blockdata : public QObject +class Blockdata : public QVector { - Q_OBJECT public: - explicit Blockdata(QObject *parent = nullptr); - ~Blockdata() { - if (blocks) delete blocks; - } - -public: - QVector *blocks = nullptr; - void addBlock(uint16_t); - void addBlock(Block); - QByteArray serialize(); - void copyFrom(Blockdata*); - Blockdata* copy(); - bool equals(Blockdata *); - -signals: - -public slots: + QByteArray serialize() const; }; #endif // BLOCKDATA_H diff --git a/include/core/editcommands.h b/include/core/editcommands.h index 8ff606f0..9b96ea3c 100644 --- a/include/core/editcommands.h +++ b/include/core/editcommands.h @@ -2,6 +2,8 @@ #ifndef EDITCOMMANDS_H #define EDITCOMMANDS_H +#include "blockdata.h" + #include #include @@ -41,9 +43,8 @@ enum CommandId { class PaintMetatile : public QUndoCommand { public: PaintMetatile(Map *map, - Blockdata *oldMetatiles, Blockdata *newMetatiles, + const Blockdata &oldMetatiles, const Blockdata &newMetatiles, unsigned actionId, QUndoCommand *parent = nullptr); - virtual ~PaintMetatile(); void undo() override; void redo() override; @@ -54,8 +55,8 @@ public: private: Map *map; - Blockdata *newMetatiles; - Blockdata *oldMetatiles; + Blockdata newMetatiles; + Blockdata oldMetatiles; unsigned actionId; }; @@ -67,7 +68,7 @@ private: class PaintCollision : public PaintMetatile { public: PaintCollision(Map *map, - Blockdata *oldCollision, Blockdata *newCollision, + const Blockdata &oldCollision, const Blockdata &newCollision, unsigned actionId, QUndoCommand *parent = nullptr) : PaintMetatile(map, oldCollision, newCollision, actionId, parent) { setText("Paint Collision"); @@ -82,9 +83,8 @@ public: class PaintBorder : public QUndoCommand { public: PaintBorder(Map *map, - Blockdata *oldBorder, Blockdata *newBorder, + const Blockdata &oldBorder, const Blockdata &newBorder, unsigned actionId, QUndoCommand *parent = nullptr); - ~PaintBorder(); void undo() override; void redo() override; @@ -95,8 +95,8 @@ public: private: Map *map; - Blockdata *newBorder; - Blockdata *oldBorder; + Blockdata newBorder; + Blockdata oldBorder; unsigned actionId; }; @@ -108,7 +108,7 @@ private: class BucketFillMetatile : public PaintMetatile { public: BucketFillMetatile(Map *map, - Blockdata *oldMetatiles, Blockdata *newMetatiles, + const Blockdata &oldMetatiles, const Blockdata &newMetatiles, unsigned actionId, QUndoCommand *parent = nullptr) : PaintMetatile(map, oldMetatiles, newMetatiles, actionId, parent) { setText("Bucket Fill Metatiles"); @@ -124,7 +124,7 @@ public: class BucketFillCollision : public PaintCollision { public: BucketFillCollision(Map *map, - Blockdata *oldCollision, Blockdata *newCollision, + const Blockdata &oldCollision, const Blockdata &newCollision, QUndoCommand *parent = nullptr) : PaintCollision(map, oldCollision, newCollision, -1, parent) { setText("Flood Fill Collision"); @@ -141,7 +141,7 @@ public: class MagicFillMetatile : public PaintMetatile { public: MagicFillMetatile(Map *map, - Blockdata *oldMetatiles, Blockdata *newMetatiles, + const Blockdata &oldMetatiles, const Blockdata &newMetatiles, unsigned actionId, QUndoCommand *parent = nullptr) : PaintMetatile(map, oldMetatiles, newMetatiles, actionId, parent) { setText("Magic Fill Metatiles"); @@ -156,7 +156,7 @@ public: class MagicFillCollision : public PaintCollision { public: MagicFillCollision(Map *map, - Blockdata *oldCollision, Blockdata *newCollision, + const Blockdata &oldCollision, const Blockdata &newCollision, QUndoCommand *parent = nullptr) : PaintCollision(map, oldCollision, newCollision, -1, parent) { setText("Magic Fill Collision"); @@ -172,9 +172,8 @@ public: class ShiftMetatiles : public QUndoCommand { public: ShiftMetatiles(Map *map, - Blockdata *oldMetatiles, Blockdata *newMetatiles, + const Blockdata &oldMetatiles, const Blockdata &newMetatiles, unsigned actionId, QUndoCommand *parent = nullptr); - ~ShiftMetatiles(); void undo() override; void redo() override; @@ -185,8 +184,8 @@ public: private: Map *map; - Blockdata *newMetatiles; - Blockdata *oldMetatiles; + Blockdata newMetatiles; + Blockdata oldMetatiles; unsigned actionId; }; @@ -197,11 +196,10 @@ private: class ResizeMap : public QUndoCommand { public: ResizeMap(Map *map, QSize oldMapDimensions, QSize newMapDimensions, - Blockdata *oldMetatiles, Blockdata *newMetatiles, + const Blockdata &oldMetatiles, const Blockdata &newMetatiles, QSize oldBorderDimensions, QSize newBorderDimensions, - Blockdata *oldBorder, Blockdata *newBorder, + const Blockdata &oldBorder, const Blockdata &newBorder, QUndoCommand *parent = nullptr); - ~ResizeMap(); void undo() override; void redo() override; @@ -222,11 +220,11 @@ private: int newBorderWidth; int newBorderHeight; - Blockdata *newMetatiles; - Blockdata *oldMetatiles; + Blockdata newMetatiles; + Blockdata oldMetatiles; - Blockdata *newBorder; - Blockdata *oldBorder; + Blockdata newBorder; + Blockdata oldBorder; }; @@ -238,7 +236,6 @@ public: EventMove(QList events, int deltaX, int deltaY, unsigned actionId, QUndoCommand *parent = nullptr); - ~EventMove(); void undo() override; void redo() override; @@ -262,7 +259,6 @@ public: EventShift(QList events, int deltaX, int deltaY, unsigned actionId, QUndoCommand *parent = nullptr); - ~EventShift(); int id() const override; private: QList events; @@ -276,7 +272,6 @@ class EventCreate : public QUndoCommand { public: EventCreate(Editor *editor, Map *map, Event *event, QUndoCommand *parent = nullptr); - ~EventCreate(); void undo() override; void redo() override; @@ -299,7 +294,6 @@ public: EventDelete(Editor *editor, Map *map, QList selectedEvents, Event *nextSelectedEvent, QUndoCommand *parent = nullptr); - ~EventDelete(); void undo() override; void redo() override; @@ -321,7 +315,6 @@ class EventDuplicate : public QUndoCommand { public: EventDuplicate(Editor *editor, Map *map, QList selectedEvents, QUndoCommand *parent = nullptr); - ~EventDuplicate(); void undo() override; void redo() override; @@ -343,9 +336,8 @@ class ScriptEditMap : public QUndoCommand { public: ScriptEditMap(Map *map, QSize oldMapDimensions, QSize newMapDimensions, - Blockdata *oldMetatiles, Blockdata *newMetatiles, + const Blockdata &oldMetatiles, const Blockdata &newMetatiles, QUndoCommand *parent = nullptr); - ~ScriptEditMap(); void undo() override; void redo() override; @@ -356,8 +348,8 @@ public: private: Map *map; - Blockdata *newMetatiles; - Blockdata *oldMetatiles; + Blockdata newMetatiles; + Blockdata oldMetatiles; int oldMapWidth; int oldMapHeight; diff --git a/include/core/event.h b/include/core/event.h index 4a6e7c4a..6ee59ac5 100644 --- a/include/core/event.h +++ b/include/core/event.h @@ -77,7 +77,7 @@ public: static Event* createNewSecretBaseEvent(Project*); OrderedJson::object buildObjectEventJSON(); - OrderedJson::object buildWarpEventJSON(QMap*); + OrderedJson::object buildWarpEventJSON(const QMap &); OrderedJson::object buildTriggerEventJSON(); OrderedJson::object buildWeatherTriggerEventJSON(); OrderedJson::object buildSignEventJSON(); diff --git a/include/core/map.h b/include/core/map.h index cedb7c19..dd6256cd 100644 --- a/include/core/map.h +++ b/include/core/map.h @@ -75,8 +75,8 @@ public: int getBorderHeight(); QPixmap render(bool ignoreCache, MapLayout * fromLayout = nullptr); QPixmap renderCollision(qreal opacity, bool ignoreCache); - bool mapBlockChanged(int i, Blockdata * cache); - bool borderBlockChanged(int i, Blockdata * cache); + bool mapBlockChanged(int i, const Blockdata &cache); + bool borderBlockChanged(int i, const Blockdata &cache); void cacheBlockdata(); void cacheCollision(); bool getBlock(int x, int y, Block *out); diff --git a/include/core/maplayout.h b/include/core/maplayout.h index d04fbab5..38bb3f23 100644 --- a/include/core/maplayout.h +++ b/include/core/maplayout.h @@ -24,15 +24,15 @@ public: QString tileset_secondary_label; Tileset *tileset_primary = nullptr; Tileset *tileset_secondary = nullptr; - Blockdata *blockdata = nullptr; + Blockdata blockdata; QImage border_image; QPixmap border_pixmap; - Blockdata *border = nullptr; - Blockdata *cached_blockdata = nullptr; - Blockdata *cached_collision = nullptr; - Blockdata *cached_border = nullptr; + Blockdata border; + Blockdata cached_blockdata; + Blockdata cached_collision; + Blockdata cached_border; struct { - Blockdata *blocks = nullptr; + Blockdata blocks; QSize dimensions; } lastCommitMapBlocks; // to track map changes }; diff --git a/include/core/parseutil.h b/include/core/parseutil.h index 96cc1201..7c9b225e 100644 --- a/include/core/parseutil.h +++ b/include/core/parseutil.h @@ -39,31 +39,30 @@ public: class ParseUtil { public: - ParseUtil(); - void set_root(QString); - static QString readTextFile(QString); + ParseUtil() { }; + void set_root(const QString &dir); + static QString readTextFile(const QString &path); static int textFileLineCount(const QString &path); - void strip_comment(QString*); - QList* parseAsm(QString); - int evaluateDefine(QString, QMap*); - QStringList readCArray(QString text, QString label); - QMap readNamedIndexCArray(QString text, QString label); - QString readCIncbin(QString text, QString label); - QMap readCDefines(QString filename, QStringList prefixes, QMap = QMap()); - void readCDefinesSorted(QString, QStringList, QStringList*, QMap = QMap()); - QList* getLabelMacros(QList*, QString); - QStringList* getLabelValues(QList*, QString); - bool tryParseJsonFile(QJsonDocument *out, QString filepath); - bool ensureFieldsExist(QJsonObject obj, QList fields); + QList parseAsm(const QString &filename); + int evaluateDefine(const QString&, const QMap&); + QStringList readCArray(const QString &text, const QString &label); + QMap readNamedIndexCArray(const QString &text, const QString &label); + QString readCIncbin(const QString &text, const QString &label); + QMap readCDefines(const QString &filename, const QStringList &prefixes, QMap = { }); + QStringList readCDefinesSorted(const QString&, const QStringList&, const QMap& = { }); + QList getLabelMacros(const QList&, const QString&); + QStringList getLabelValues(const QList&, const QString&); + bool tryParseJsonFile(QJsonDocument *out, const QString &filepath); + bool ensureFieldsExist(const QJsonObject &obj, const QList &fields); // Returns the 1-indexed line number for the definition of scriptLabel in the scripts file at filePath. // Returns 0 if a definition for scriptLabel cannot be found. static int getScriptLineNumber(const QString &filePath, const QString &scriptLabel); static int getRawScriptLineNumber(QString text, const QString &scriptLabel); static int getPoryScriptLineNumber(QString text, const QString &scriptLabel); - static QString &removeStringLiterals(QString &text); - static QString &removeLineComments(QString &text, const QString &commentSymbol); - static QString &removeLineComments(QString &text, const QStringList &commentSymbols); + static QString removeStringLiterals(QString text); + static QString removeLineComments(QString text, const QString &commentSymbol); + static QString removeLineComments(QString text, const QStringList &commentSymbols); static QStringList splitShellCommand(QStringView command); @@ -71,10 +70,10 @@ private: QString root; QString text; QString file; - QList tokenizeExpression(QString expression, QMap* knownIdentifiers); - QList generatePostfix(QList tokens); - int evaluatePostfix(QList postfix); - void error(QString message, QString expression); + QList tokenizeExpression(QString expression, const QMap &knownIdentifiers); + QList generatePostfix(const QList &tokens); + int evaluatePostfix(const QList &postfix); + void error(const QString &message, const QString &expression); }; #endif // PARSEUTIL_H diff --git a/include/project.h b/include/project.h index 085cd6d1..1ea1b1a3 100644 --- a/include/project.h +++ b/include/project.h @@ -31,35 +31,37 @@ public: Project(const Project &) = delete; Project & operator = (const Project &) = delete; + inline QWidget *parentWidget() const { return static_cast(parent()); } + public: QString root; - QStringList *groupNames = nullptr; - QMap *mapGroups; + QStringList groupNames; + QMap mapGroups; QList groupedMapNames; - QStringList *mapNames = nullptr; + QStringList mapNames; QMap miscConstants; QList healLocations; - QMap* mapConstantsToMapNames; - QMap* mapNamesToMapConstants; - QList mapLayoutsTable; - QList mapLayoutsTableMaster; + QMap mapConstantsToMapNames; + QMap mapNamesToMapConstants; + QStringList mapLayoutsTable; + QStringList mapLayoutsTableMaster; QString layoutsLabel; QMap mapLayouts; QMap mapLayoutsMaster; - QMap *mapSecToMapHoverName; + QMap mapSecToMapHoverName; QMap mapSectionNameToValue; QMap mapSectionValueToName; - QStringList *itemNames = nullptr; - QStringList *flagNames = nullptr; - QStringList *varNames = nullptr; - QStringList *movementTypes = nullptr; - QStringList *mapTypes = nullptr; - QStringList *mapBattleScenes = nullptr; - QStringList *weatherNames = nullptr; - QStringList *coordEventWeatherNames = nullptr; - QStringList *secretBaseIds = nullptr; - QStringList *bgEventFacingDirections = nullptr; - QStringList *trainerTypes = nullptr; + QStringList itemNames; + QStringList flagNames; + QStringList varNames; + QStringList movementTypes; + QStringList mapTypes; + QStringList mapBattleScenes; + QStringList weatherNames; + QStringList coordEventWeatherNames; + QStringList secretBaseIds; + QStringList bgEventFacingDirections; + QStringList trainerTypes; QMap metatileBehaviorMap; QMap metatileBehaviorMapInverse; QMap facingDirections; @@ -82,16 +84,16 @@ public: DataQualifiers getDataQualifiers(QString, QString); QMap dataQualifiers; - QMap *mapCache; + QMap mapCache; Map* loadMap(QString); Map* getMap(QString); - QMap *tilesetCache = nullptr; + QMap tilesetCache; Tileset* loadTileset(QString, Tileset *tileset = nullptr); Tileset* getTileset(QString, bool forceLoad = false); QMap tilesetLabels; - Blockdata* readBlockdata(QString); + Blockdata readBlockdata(QString); bool loadBlockdata(Map*); void saveTextFile(QString path, QString text); @@ -129,7 +131,7 @@ public: void saveLayoutBlockdata(Map*); void saveLayoutBorder(Map*); - void writeBlockdata(QString, Blockdata*); + void writeBlockdata(QString, const Blockdata &); void saveAllMaps(); void saveMap(Map*); void saveAllDataStructures(); @@ -219,8 +221,6 @@ private: static int default_map_size; static int max_object_events; - QWidget *parent; - signals: void reloadProject(); void uncheckMonitorFilesAction(); diff --git a/src/core/block.cpp b/src/core/block.cpp index 1479ed10..680384fd 100644 --- a/src/core/block.cpp +++ b/src/core/block.cpp @@ -27,17 +27,17 @@ Block &Block::operator=(const Block &other) { return *this; } -uint16_t Block::rawValue() { +uint16_t Block::rawValue() const { return static_cast( (tile & 0x3ff) + ((collision & 0x3) << 10) + ((elevation & 0xf) << 12)); } -bool Block::operator ==(Block other) { +bool Block::operator ==(Block other) const { return (tile == other.tile) && (collision == other.collision) && (elevation == other.elevation); } -bool Block::operator !=(Block other) { +bool Block::operator !=(Block other) const { return !(operator ==(other)); } diff --git a/src/core/blockdata.cpp b/src/core/blockdata.cpp index 77239add..5fcd4e32 100644 --- a/src/core/blockdata.cpp +++ b/src/core/blockdata.cpp @@ -1,54 +1,11 @@ #include "blockdata.h" -Blockdata::Blockdata(QObject *parent) : QObject(parent) -{ - blocks = new QVector; -} - -void Blockdata::addBlock(uint16_t word) { - Block block(word); - blocks->append(block); -} - -void Blockdata::addBlock(Block block) { - blocks->append(block); -} - -QByteArray Blockdata::serialize() { +QByteArray Blockdata::serialize() const { QByteArray data; - for (int i = 0; i < blocks->length(); i++) { - Block block = blocks->value(i); + for (const auto &block : *this) { uint16_t word = block.rawValue(); data.append(static_cast(word & 0xff)); data.append(static_cast((word >> 8) & 0xff)); } return data; } - -void Blockdata::copyFrom(Blockdata* other) { - blocks->clear(); - for (int i = 0; i < other->blocks->length(); i++) { - addBlock(other->blocks->value(i)); - } -} - -Blockdata* Blockdata::copy() { - Blockdata* blockdata = new Blockdata; - blockdata->copyFrom(this); - return blockdata; -} - -bool Blockdata::equals(Blockdata *other) { - if (!other) { - return false; - } - if (blocks->length() != other->blocks->length()) { - return false; - } - for (int i = 0; i < blocks->length(); i++) { - if (blocks->value(i) != other->blocks->value(i)) { - return false; - } - } - return true; -} diff --git a/src/core/editcommands.cpp b/src/core/editcommands.cpp index 05ecc22a..e7a3d300 100644 --- a/src/core/editcommands.cpp +++ b/src/core/editcommands.cpp @@ -31,8 +31,9 @@ void renderMapBlocks(Map *map, bool ignoreCache = false) { map->mapItem->draw(ignoreCache); map->collisionItem->draw(ignoreCache); } + PaintMetatile::PaintMetatile(Map *map, - Blockdata *oldMetatiles, Blockdata *newMetatiles, + const Blockdata &oldMetatiles, const Blockdata &newMetatiles, unsigned actionId, QUndoCommand *parent) : QUndoCommand(parent) { setText("Paint Metatiles"); @@ -43,21 +44,14 @@ PaintMetatile::PaintMetatile(Map *map, this->actionId = actionId; } -PaintMetatile::~PaintMetatile() { - if (newMetatiles) delete newMetatiles; - if (oldMetatiles) delete oldMetatiles; -} - void PaintMetatile::redo() { QUndoCommand::redo(); if (!map) return; - if (map->layout->blockdata) { - map->layout->blockdata->copyFrom(newMetatiles); - } + map->layout->blockdata = newMetatiles; - map->layout->lastCommitMapBlocks.blocks->copyFrom(map->layout->blockdata); + map->layout->lastCommitMapBlocks.blocks = map->layout->blockdata; renderMapBlocks(map); } @@ -65,11 +59,9 @@ void PaintMetatile::redo() { void PaintMetatile::undo() { if (!map) return; - if (map->layout->blockdata) { - map->layout->blockdata->copyFrom(oldMetatiles); - } + map->layout->blockdata = oldMetatiles; - map->layout->lastCommitMapBlocks.blocks->copyFrom(map->layout->blockdata); + map->layout->lastCommitMapBlocks.blocks = map->layout->blockdata; renderMapBlocks(map); @@ -79,13 +71,13 @@ void PaintMetatile::undo() { bool PaintMetatile::mergeWith(const QUndoCommand *command) { const PaintMetatile *other = static_cast(command); - if (this->map != other->map) + if (map != other->map) return false; if (actionId != other->actionId) return false; - this->newMetatiles->copyFrom(other->newMetatiles); + newMetatiles = other->newMetatiles; return true; } @@ -95,7 +87,7 @@ bool PaintMetatile::mergeWith(const QUndoCommand *command) { ******************************************************************************/ PaintBorder::PaintBorder(Map *map, - Blockdata *oldBorder, Blockdata *newBorder, + const Blockdata &oldBorder, const Blockdata &newBorder, unsigned actionId, QUndoCommand *parent) : QUndoCommand(parent) { setText("Paint Border"); @@ -106,19 +98,12 @@ PaintBorder::PaintBorder(Map *map, this->actionId = actionId; } -PaintBorder::~PaintBorder() { - if (newBorder) delete newBorder; - if (oldBorder) delete oldBorder; -} - void PaintBorder::redo() { QUndoCommand::redo(); if (!map) return; - if (map->layout->border) { - map->layout->border->copyFrom(newBorder); - } + map->layout->border = newBorder; map->borderItem->draw(); } @@ -126,9 +111,7 @@ void PaintBorder::redo() { void PaintBorder::undo() { if (!map) return; - if (map->layout->border) { - map->layout->border->copyFrom(oldBorder); - } + map->layout->border = oldBorder; map->borderItem->draw(); @@ -140,7 +123,7 @@ void PaintBorder::undo() { ******************************************************************************/ ShiftMetatiles::ShiftMetatiles(Map *map, - Blockdata *oldMetatiles, Blockdata *newMetatiles, + const Blockdata &oldMetatiles, const Blockdata &newMetatiles, unsigned actionId, QUndoCommand *parent) : QUndoCommand(parent) { setText("Shift Metatiles"); @@ -151,21 +134,14 @@ ShiftMetatiles::ShiftMetatiles(Map *map, this->actionId = actionId; } -ShiftMetatiles::~ShiftMetatiles() { - if (newMetatiles) delete newMetatiles; - if (oldMetatiles) delete oldMetatiles; -} - void ShiftMetatiles::redo() { QUndoCommand::redo(); if (!map) return; - if (map->layout->blockdata) { - map->layout->blockdata->copyFrom(newMetatiles); - } + map->layout->blockdata = newMetatiles; - map->layout->lastCommitMapBlocks.blocks->copyFrom(map->layout->blockdata); + map->layout->lastCommitMapBlocks.blocks = map->layout->blockdata; renderMapBlocks(map, true); } @@ -173,11 +149,9 @@ void ShiftMetatiles::redo() { void ShiftMetatiles::undo() { if (!map) return; - if (map->layout->blockdata) { - map->layout->blockdata->copyFrom(oldMetatiles); - } + map->layout->blockdata = oldMetatiles; - map->layout->lastCommitMapBlocks.blocks->copyFrom(map->layout->blockdata); + map->layout->lastCommitMapBlocks.blocks = map->layout->blockdata; renderMapBlocks(map, true); @@ -193,7 +167,7 @@ bool ShiftMetatiles::mergeWith(const QUndoCommand *command) { if (actionId != other->actionId) return false; - this->newMetatiles->copyFrom(other->newMetatiles); + this->newMetatiles = other->newMetatiles; return true; } @@ -203,9 +177,9 @@ bool ShiftMetatiles::mergeWith(const QUndoCommand *command) { ******************************************************************************/ ResizeMap::ResizeMap(Map *map, QSize oldMapDimensions, QSize newMapDimensions, - Blockdata *oldMetatiles, Blockdata *newMetatiles, + const Blockdata &oldMetatiles, const Blockdata &newMetatiles, QSize oldBorderDimensions, QSize newBorderDimensions, - Blockdata *oldBorder, Blockdata *newBorder, + const Blockdata &oldBorder, const Blockdata &newBorder, QUndoCommand *parent) : QUndoCommand(parent) { setText("Resize Map"); @@ -230,25 +204,16 @@ ResizeMap::ResizeMap(Map *map, QSize oldMapDimensions, QSize newMapDimensions, this->newBorder = newBorder; } -ResizeMap::~ResizeMap() { - if (newMetatiles) delete newMetatiles; - if (oldMetatiles) delete oldMetatiles; -} - void ResizeMap::redo() { QUndoCommand::redo(); if (!map) return; - if (map->layout->blockdata) { - map->layout->blockdata->copyFrom(newMetatiles); - map->setDimensions(newMapWidth, newMapHeight, false); - } + map->layout->blockdata = newMetatiles; + map->setDimensions(newMapWidth, newMapHeight, false); - if (map->layout->border) { - map->layout->border->copyFrom(newBorder); - map->setBorderDimensions(newBorderWidth, newBorderHeight, false); - } + map->layout->border = newBorder; + map->setBorderDimensions(newBorderWidth, newBorderHeight, false); map->layout->lastCommitMapBlocks.dimensions = QSize(map->getWidth(), map->getHeight()); @@ -258,15 +223,11 @@ void ResizeMap::redo() { void ResizeMap::undo() { if (!map) return; - if (map->layout->blockdata) { - map->layout->blockdata->copyFrom(oldMetatiles); - map->setDimensions(oldMapWidth, oldMapHeight, false); - } + map->layout->blockdata = oldMetatiles; + map->setDimensions(oldMapWidth, oldMapHeight, false); - if (map->layout->border) { - map->layout->border->copyFrom(oldBorder); - map->setBorderDimensions(oldBorderWidth, oldBorderHeight, false); - } + map->layout->border = oldBorder; + map->setBorderDimensions(oldBorderWidth, oldBorderHeight, false); map->layout->lastCommitMapBlocks.dimensions = QSize(map->getWidth(), map->getHeight()); @@ -292,8 +253,6 @@ EventMove::EventMove(QList events, this->actionId = actionId; } -EventMove::~EventMove() {} - void EventMove::redo() { QUndoCommand::redo(); @@ -340,8 +299,6 @@ EventShift::EventShift(QList events, setText("Shift Events"); } -EventShift::~EventShift() {} - int EventShift::id() const { return CommandId::ID_EventShift | getEventTypeMask(events); } @@ -360,13 +317,11 @@ EventCreate::EventCreate(Editor *editor, Map *map, Event *event, this->event = event; } -EventCreate::~EventCreate() {} - void EventCreate::redo() { QUndoCommand::redo(); map->addEvent(event); - + editor->project->loadEventPixmaps(map->getAllEvents()); editor->addMapEvent(event); @@ -412,8 +367,6 @@ EventDelete::EventDelete(Editor *editor, Map *map, this->nextSelectedEvent = nextSelectedEvent; } -EventDelete::~EventDelete() {} - void EventDelete::redo() { QUndoCommand::redo(); @@ -435,7 +388,7 @@ void EventDelete::redo() { void EventDelete::undo() { for (Event *event : selectedEvents) { map->addEvent(event); - + editor->project->loadEventPixmaps(map->getAllEvents()); editor->addMapEvent(event); } @@ -469,8 +422,6 @@ EventDuplicate::EventDuplicate(Editor *editor, Map *map, this->selectedEvents = selectedEvents; } -EventDuplicate::~EventDuplicate() {} - void EventDuplicate::redo() { QUndoCommand::redo(); @@ -517,7 +468,7 @@ int EventDuplicate::id() const { ScriptEditMap::ScriptEditMap(Map *map, QSize oldMapDimensions, QSize newMapDimensions, - Blockdata *oldMetatiles, Blockdata *newMetatiles, + const Blockdata &oldMetatiles, const Blockdata &newMetatiles, QUndoCommand *parent) : QUndoCommand(parent) { setText("Script Edit Map"); @@ -532,24 +483,17 @@ ScriptEditMap::ScriptEditMap(Map *map, this->newMapHeight = newMapDimensions.height(); } -ScriptEditMap::~ScriptEditMap() { - if (newMetatiles) delete newMetatiles; - if (oldMetatiles) delete oldMetatiles; -} - void ScriptEditMap::redo() { QUndoCommand::redo(); if (!map) return; - if (map->layout->blockdata) { - map->layout->blockdata->copyFrom(newMetatiles); - if (newMapWidth != map->getWidth() || newMapHeight != map->getHeight()) { - map->setDimensions(newMapWidth, newMapHeight, false); - } + map->layout->blockdata = newMetatiles; + if (newMapWidth != map->getWidth() || newMapHeight != map->getHeight()) { + map->setDimensions(newMapWidth, newMapHeight, false); } - map->layout->lastCommitMapBlocks.blocks->copyFrom(newMetatiles); + map->layout->lastCommitMapBlocks.blocks = newMetatiles; map->layout->lastCommitMapBlocks.dimensions = QSize(newMapWidth, newMapHeight); renderMapBlocks(map); @@ -558,14 +502,12 @@ void ScriptEditMap::redo() { void ScriptEditMap::undo() { if (!map) return; - if (map->layout->blockdata) { - map->layout->blockdata->copyFrom(oldMetatiles); - if (oldMapWidth != map->getWidth() || oldMapHeight != map->getHeight()) { - map->setDimensions(oldMapWidth, oldMapHeight, false); - } + map->layout->blockdata = oldMetatiles; + if (oldMapWidth != map->getWidth() || oldMapHeight != map->getHeight()) { + map->setDimensions(oldMapWidth, oldMapHeight, false); } - map->layout->lastCommitMapBlocks.blocks->copyFrom(oldMetatiles); + map->layout->lastCommitMapBlocks.blocks = oldMetatiles; map->layout->lastCommitMapBlocks.dimensions = QSize(oldMapWidth, oldMapHeight); renderMapBlocks(map); diff --git a/src/core/event.cpp b/src/core/event.cpp index 5b10d20f..ea8e078f 100644 --- a/src/core/event.cpp +++ b/src/core/event.cpp @@ -71,7 +71,7 @@ Event* Event::createNewObjectEvent(Project *project) event->put("event_group_type", "object_event_group"); event->put("event_type", EventType::Object); event->put("sprite", project->getEventObjGfxConstants().keys().first()); - event->put("movement_type", project->movementTypes->first()); + event->put("movement_type", project->movementTypes.first()); if (projectConfig.getObjectEventInConnectionEnabled()) { event->put("in_connection", false); } @@ -80,7 +80,7 @@ Event* Event::createNewObjectEvent(Project *project) event->put("script_label", "NULL"); event->put("event_flag", "0"); event->put("replacement", "0"); - event->put("trainer_type", project->trainerTypes->value(0, "0")); + event->put("trainer_type", project->trainerTypes.value(0, "0")); event->put("sight_radius_tree_id", 0); event->put("elevation", 3); return event; @@ -118,7 +118,7 @@ Event* Event::createNewTriggerEvent(Project *project) event->put("event_group_type", "coord_event_group"); event->put("event_type", EventType::Trigger); event->put("script_label", "NULL"); - event->put("script_var", project->varNames->first()); + event->put("script_var", project->varNames.first()); event->put("script_var_value", "0"); event->put("elevation", 0); return event; @@ -129,7 +129,7 @@ Event* Event::createNewWeatherTriggerEvent(Project *project) Event *event = new Event; event->put("event_group_type", "coord_event_group"); event->put("event_type", EventType::WeatherTrigger); - event->put("weather", project->coordEventWeatherNames->first()); + event->put("weather", project->coordEventWeatherNames.first()); event->put("elevation", 0); return event; } @@ -139,7 +139,7 @@ Event* Event::createNewSignEvent(Project *project) Event *event = new Event; event->put("event_group_type", "bg_event_group"); event->put("event_type", EventType::Sign); - event->put("player_facing_direction", project->bgEventFacingDirections->first()); + event->put("player_facing_direction", project->bgEventFacingDirections.first()); event->put("script_label", "NULL"); event->put("elevation", 0); return event; @@ -150,8 +150,8 @@ Event* Event::createNewHiddenItemEvent(Project *project) Event *event = new Event; event->put("event_group_type", "bg_event_group"); event->put("event_type", EventType::HiddenItem); - event->put("item", project->itemNames->first()); - event->put("flag", project->flagNames->first()); + event->put("item", project->itemNames.first()); + event->put("flag", project->flagNames.first()); event->put("elevation", 3); if (projectConfig.getHiddenItemQuantityEnabled()) { event->put("quantity", 1); @@ -167,7 +167,7 @@ Event* Event::createNewSecretBaseEvent(Project *project) Event *event = new Event; event->put("event_group_type", "bg_event_group"); event->put("event_type", EventType::SecretBase); - event->put("secret_base_id", project->secretBaseIds->first()); + event->put("secret_base_id", project->secretBaseIds.first()); event->put("elevation", 0); return event; } @@ -321,13 +321,13 @@ OrderedJson::object Event::buildObjectEventJSON() return eventObj; } -OrderedJson::object Event::buildWarpEventJSON(QMap *mapNamesToMapConstants) +OrderedJson::object Event::buildWarpEventJSON(const QMap &mapNamesToMapConstants) { OrderedJson::object warpObj; warpObj["x"] = this->getU16("x"); warpObj["y"] = this->getU16("y"); warpObj["elevation"] = this->getInt("elevation"); - warpObj["dest_map"] = mapNamesToMapConstants->value(this->get("destination_map_name")); + warpObj["dest_map"] = mapNamesToMapConstants.value(this->get("destination_map_name")); warpObj["dest_warp_id"] = this->getInt("destination_warp"); this->addCustomValuesTo(&warpObj); diff --git a/src/core/map.cpp b/src/core/map.cpp index 567c8a24..3d839ecc 100644 --- a/src/core/map.cpp +++ b/src/core/map.cpp @@ -78,96 +78,61 @@ int Map::getBorderHeight() { return layout->border_height.toInt(nullptr, 0); } -bool Map::mapBlockChanged(int i, Blockdata * cache) { - if (!cache) +bool Map::mapBlockChanged(int i, const Blockdata &cache) { + if (cache.length() <= i) return true; - if (!layout->blockdata) - return true; - if (!cache->blocks) - return true; - if (!layout->blockdata->blocks) - return true; - if (cache->blocks->length() <= i) - return true; - if (layout->blockdata->blocks->length() <= i) + if (layout->blockdata.length() <= i) return true; - return layout->blockdata->blocks->value(i) != cache->blocks->value(i); + return layout->blockdata.at(i) != cache.at(i); } -bool Map::borderBlockChanged(int i, Blockdata * cache) { - if (!cache) +bool Map::borderBlockChanged(int i, const Blockdata &cache) { + if (cache.length() <= i) return true; - if (!layout->border) - return true; - if (!cache->blocks) - return true; - if (!layout->border->blocks) - return true; - if (cache->blocks->length() <= i) - return true; - if (layout->border->blocks->length() <= i) + if (layout->border.length() <= i) return true; - return layout->border->blocks->value(i) != cache->blocks->value(i); + return layout->border.at(i) != cache.at(i); } void Map::cacheBorder() { - if (layout->cached_border) delete layout->cached_border; - layout->cached_border = new Blockdata; - if (layout->border && layout->border->blocks) { - for (int i = 0; i < layout->border->blocks->length(); i++) { - Block block = layout->border->blocks->value(i); - layout->cached_border->blocks->append(block); - } - } + layout->cached_border.clear(); + for (const auto &block : layout->border) + layout->cached_border.append(block); } void Map::cacheBlockdata() { - if (layout->cached_blockdata) delete layout->cached_blockdata; - layout->cached_blockdata = new Blockdata; - if (layout->blockdata && layout->blockdata->blocks) { - for (int i = 0; i < layout->blockdata->blocks->length(); i++) { - Block block = layout->blockdata->blocks->value(i); - layout->cached_blockdata->blocks->append(block); - } - } + layout->cached_blockdata.clear(); + for (const auto &block : layout->blockdata) + layout->cached_blockdata.append(block); } void Map::cacheCollision() { - if (layout->cached_collision) delete layout->cached_collision; - layout->cached_collision = new Blockdata; - if (layout->blockdata && layout->blockdata->blocks) { - for (int i = 0; i < layout->blockdata->blocks->length(); i++) { - Block block = layout->blockdata->blocks->value(i); - layout->cached_collision->blocks->append(block); - } - } + layout->cached_collision.clear(); + for (const auto &block : layout->blockdata) + layout->cached_collision.append(block); } QPixmap Map::renderCollision(qreal opacity, bool ignoreCache) { bool changed_any = false; int width_ = getWidth(); int height_ = getHeight(); - if ( - collision_image.isNull() - || collision_image.width() != width_ * 16 - || collision_image.height() != height_ * 16 - ) { + if (collision_image.isNull() || collision_image.width() != width_ * 16 || collision_image.height() != height_ * 16) { collision_image = QImage(width_ * 16, height_ * 16, QImage::Format_RGBA8888); changed_any = true; } - if (!(layout->blockdata && layout->blockdata->blocks && width_ && height_)) { + if (layout->blockdata.isEmpty() || !width_ || !height_) { collision_pixmap = collision_pixmap.fromImage(collision_image); return collision_pixmap; } QPainter painter(&collision_image); - for (int i = 0; i < layout->blockdata->blocks->length(); i++) { - if (!ignoreCache && layout->cached_collision && !mapBlockChanged(i, layout->cached_collision)) { + for (int i = 0; i < layout->blockdata.length(); i++) { + if (!ignoreCache && !mapBlockChanged(i, layout->cached_collision)) { continue; } changed_any = true; - Block block = layout->blockdata->blocks->value(i); + Block block = layout->blockdata.at(i); QImage metatile_image = getMetatileImage(block.tile, layout->tileset_primary, layout->tileset_secondary, metatileLayerOrder, metatileLayerOpacity); QImage collision_metatile_image = getCollisionMetatileImage(block); int map_y = width_ ? i / width_ : 0; @@ -192,26 +157,22 @@ QPixmap Map::render(bool ignoreCache = false, MapLayout * fromLayout) { bool changed_any = false; int width_ = getWidth(); int height_ = getHeight(); - if ( - image.isNull() - || image.width() != width_ * 16 - || image.height() != height_ * 16 - ) { + if (image.isNull() || image.width() != width_ * 16 || image.height() != height_ * 16) { image = QImage(width_ * 16, height_ * 16, QImage::Format_RGBA8888); changed_any = true; } - if (!(layout->blockdata && layout->blockdata->blocks && width_ && height_)) { + if (layout->blockdata.isEmpty() || !width_ || !height_) { pixmap = pixmap.fromImage(image); return pixmap; } QPainter painter(&image); - for (int i = 0; i < layout->blockdata->blocks->length(); i++) { + for (int i = 0; i < layout->blockdata.length(); i++) { if (!ignoreCache && !mapBlockChanged(i, layout->cached_blockdata)) { continue; } changed_any = true; - Block block = layout->blockdata->blocks->value(i); + Block block = layout->blockdata.at(i); QImage metatile_image = getMetatileImage( block.tile, fromLayout ? fromLayout->tileset_primary : layout->tileset_primary, @@ -245,18 +206,18 @@ QPixmap Map::renderBorder(bool ignoreCache) { layout->border_image = QImage(width_ * 16, height_ * 16, QImage::Format_RGBA8888); border_resized = true; } - if (!(layout->border && layout->border->blocks)) { + if (layout->border.isEmpty()) { layout->border_pixmap = layout->border_pixmap.fromImage(layout->border_image); return layout->border_pixmap; } QPainter painter(&layout->border_image); - for (int i = 0; i < layout->border->blocks->length(); i++) { + for (int i = 0; i < layout->border.length(); i++) { if (!ignoreCache && (!border_resized && !borderBlockChanged(i, layout->cached_border))) { continue; } changed_any = true; - Block block = layout->border->blocks->value(i); + Block block = layout->border.at(i); uint16_t tile = block.tile; QImage metatile_image = getMetatileImage(tile, layout->tileset_primary, layout->tileset_secondary, metatileLayerOrder, metatileLayerOpacity); int map_y = width_ ? i / width_ : 0; @@ -310,38 +271,38 @@ void Map::setNewDimensionsBlockdata(int newWidth, int newHeight) { int oldWidth = getWidth(); int oldHeight = getHeight(); - Blockdata* newBlockData = new Blockdata; + Blockdata newBlockdata; for (int y = 0; y < newHeight; y++) for (int x = 0; x < newWidth; x++) { if (x < oldWidth && y < oldHeight) { int index = y * oldWidth + x; - newBlockData->addBlock(layout->blockdata->blocks->value(index)); + newBlockdata.append(layout->blockdata.value(index)); } else { - newBlockData->addBlock(0); + newBlockdata.append(0); } } - layout->blockdata->copyFrom(newBlockData); + layout->blockdata = newBlockdata; } void Map::setNewBorderDimensionsBlockdata(int newWidth, int newHeight) { int oldWidth = getBorderWidth(); int oldHeight = getBorderHeight(); - Blockdata* newBlockData = new Blockdata; + Blockdata newBlockdata; for (int y = 0; y < newHeight; y++) for (int x = 0; x < newWidth; x++) { if (x < oldWidth && y < oldHeight) { int index = y * oldWidth + x; - newBlockData->addBlock(layout->border->blocks->value(index)); + newBlockdata.append(layout->border.value(index)); } else { - newBlockData->addBlock(0); + newBlockdata.append(0); } } - layout->border->copyFrom(newBlockData); + layout->border = newBlockdata; } void Map::setDimensions(int newWidth, int newHeight, bool setNewBlockdata) { @@ -368,21 +329,19 @@ void Map::setBorderDimensions(int newWidth, int newHeight, bool setNewBlockdata) } bool Map::getBlock(int x, int y, Block *out) { - if (layout->blockdata && layout->blockdata->blocks) { - if (x >= 0 && x < getWidth() && y >= 0 && y < getHeight()) { - int i = y * getWidth() + x; - *out = layout->blockdata->blocks->value(i); - return true; - } + if (x >= 0 && x < getWidth() && y >= 0 && y < getHeight()) { + int i = y * getWidth() + x; + *out = layout->blockdata.value(i); + return true; } return false; } void Map::setBlock(int x, int y, Block block, bool enableScriptCallback) { int i = y * getWidth() + x; - if (layout->blockdata && layout->blockdata->blocks && i < layout->blockdata->blocks->size()) { - Block prevBlock = layout->blockdata->blocks->value(i); - layout->blockdata->blocks->replace(i, block); + if (i < layout->blockdata.size()) { + Block prevBlock = layout->blockdata.at(i); + layout->blockdata.replace(i, block); if (enableScriptCallback) { Scripting::cb_MetatileChanged(x, y, prevBlock, block); } @@ -393,40 +352,40 @@ void Map::_floodFillCollisionElevation(int x, int y, uint16_t collision, uint16_ QList todo; todo.append(QPoint(x, y)); while (todo.length()) { - QPoint point = todo.takeAt(0); - x = point.x(); - y = point.y(); - Block block; - if (!getBlock(x, y, &block)) { - continue; - } + QPoint point = todo.takeAt(0); + x = point.x(); + y = point.y(); + Block block; + if (!getBlock(x, y, &block)) { + continue; + } - uint old_coll = block.collision; - uint old_elev = block.elevation; - if (old_coll == collision && old_elev == elevation) { - continue; - } + uint old_coll = block.collision; + uint old_elev = block.elevation; + if (old_coll == collision && old_elev == elevation) { + continue; + } - block.collision = collision; - block.elevation = elevation; - setBlock(x, y, block, true); - if (getBlock(x + 1, y, &block) && block.collision == old_coll && block.elevation == old_elev) { - todo.append(QPoint(x + 1, y)); - } - if (getBlock(x - 1, y, &block) && block.collision == old_coll && block.elevation == old_elev) { - todo.append(QPoint(x - 1, y)); - } - if (getBlock(x, y + 1, &block) && block.collision == old_coll && block.elevation == old_elev) { - todo.append(QPoint(x, y + 1)); - } - if (getBlock(x, y - 1, &block) && block.collision == old_coll && block.elevation == old_elev) { - todo.append(QPoint(x, y - 1)); - } + block.collision = collision; + block.elevation = elevation; + setBlock(x, y, block, true); + if (getBlock(x + 1, y, &block) && block.collision == old_coll && block.elevation == old_elev) { + todo.append(QPoint(x + 1, y)); + } + if (getBlock(x - 1, y, &block) && block.collision == old_coll && block.elevation == old_elev) { + todo.append(QPoint(x - 1, y)); + } + if (getBlock(x, y + 1, &block) && block.collision == old_coll && block.elevation == old_elev) { + todo.append(QPoint(x, y + 1)); + } + if (getBlock(x, y - 1, &block) && block.collision == old_coll && block.elevation == old_elev) { + todo.append(QPoint(x, y - 1)); + } } } void Map::floodFillCollisionElevation(int x, int y, uint16_t collision, uint16_t elevation) { - Block block;; + Block block; if (getBlock(x, y, &block) && (block.collision != collision || block.elevation != elevation)) { _floodFillCollisionElevation(x, y, collision, elevation); } diff --git a/src/core/parseutil.cpp b/src/core/parseutil.cpp index e59cee49..30ebe19c 100644 --- a/src/core/parseutil.cpp +++ b/src/core/parseutil.cpp @@ -6,15 +6,12 @@ #include #include -ParseUtil::ParseUtil() -{ -} -void ParseUtil::set_root(QString dir) { +void ParseUtil::set_root(const QString &dir) { this->root = dir; } -void ParseUtil::error(QString message, QString expression) { +void ParseUtil::error(const QString &message, const QString &expression) { QStringList lines = text.split(QRegularExpression("[\r\n]")); int lineNum = 0, colNum = 0; for (QString line : lines) { @@ -25,21 +22,7 @@ void ParseUtil::error(QString message, QString expression) { logError(QString("%1:%2:%3: %4").arg(file).arg(lineNum).arg(colNum).arg(message)); } -void ParseUtil::strip_comment(QString *line) { - bool in_string = false; - for (int i = 0; i < line->length(); i++) { - if (line->at(i) == '"') { - in_string = !in_string; - } else if (line->at(i) == '@') { - if (!in_string) { - line->truncate(i); - break; - } - } - } -} - -QString ParseUtil::readTextFile(QString path) { +QString ParseUtil::readTextFile(const QString &path) { QFile file(path); if (!file.open(QIODevice::ReadOnly)) { logError(QString("Could not open '%1': ").arg(path) + file.errorString()); @@ -59,45 +42,41 @@ int ParseUtil::textFileLineCount(const QString &path) { return text.split('\n').count() + 1; } -QList* ParseUtil::parseAsm(QString filename) { - QList *parsed = new QList; +QList ParseUtil::parseAsm(const QString &filename) { + QList parsed; - text = readTextFile(root + "/" + filename); - QStringList lines = text.split('\n'); - for (QString line : lines) { - QString label; - strip_comment(&line); - if (line.trimmed().isEmpty()) { - } else if (line.contains(':')) { - label = line.left(line.indexOf(':')); - QStringList *list = new QStringList; - list->append(".label"); // This is not a real keyword. It's used only to make the output more regular. - list->append(label); - parsed->append(*list); + text = readTextFile(root + '/' + filename); + const QStringList lines = removeLineComments(text, "@").split('\n'); + for (const auto &line : lines) { + const QString trimmedLine = line.trimmed(); + if (trimmedLine.isEmpty()) { + continue; + } + + if (line.contains(':')) { + const QString label = line.left(line.indexOf(':')); + const QStringList list{ ".label", label }; // .label is not a real keyword. It's used only to make the output more regular. + parsed.append(list); // There should not be anything else on the line. // gas will raise a syntax error if there is. } else { - line = line.trimmed(); - //parsed->append(line.split(QRegExp("\\s*,\\s*"))); - QString macro; - QStringList params; - int index = line.indexOf(QRegExp("\\s+")); - macro = line.left(index); - params = line.right(line.length() - index).trimmed().split(QRegExp("\\s*,\\s*")); + int index = trimmedLine.indexOf(QRegExp("\\s+")); + const QString macro = trimmedLine.left(index); + QStringList params(trimmedLine.right(trimmedLine.length() - index).trimmed().split(QRegExp("\\s*,\\s*"))); params.prepend(macro); - parsed->append(params); + parsed.append(params); } } return parsed; } -int ParseUtil::evaluateDefine(QString define, QMap* knownDefines) { +int ParseUtil::evaluateDefine(const QString &define, const QMap &knownDefines) { QList tokens = tokenizeExpression(define, knownDefines); QList postfixExpression = generatePostfix(tokens); return evaluatePostfix(postfixExpression); } -QList ParseUtil::tokenizeExpression(QString expression, QMap* knownIdentifiers) { +QList ParseUtil::tokenizeExpression(QString expression, const QMap &knownIdentifiers) { QList tokens; QStringList tokenTypes = (QStringList() << "hex" << "decimal" << "identifier" << "operator" << "leftparen" << "rightparen"); @@ -114,8 +93,8 @@ QList ParseUtil::tokenizeExpression(QString expression, QMapcontains(token)) { - QString actualToken = QString("%1").arg(knownIdentifiers->value(token)); + if (knownIdentifiers.contains(token)) { + QString actualToken = QString("%1").arg(knownIdentifiers.value(token)); expression = expression.replace(0, token.length(), actualToken); token = actualToken; tokenType = "decimal"; @@ -158,7 +137,7 @@ QMap Token::precedenceMap = QMap( // Shunting-yard algorithm for generating postfix notation. // https://en.wikipedia.org/wiki/Shunting-yard_algorithm -QList ParseUtil::generatePostfix(QList tokens) { +QList ParseUtil::generatePostfix(const QList &tokens) { QList output; QStack operatorStack; for (Token token : tokens) { @@ -200,7 +179,7 @@ QList ParseUtil::generatePostfix(QList tokens) { // Evaluate postfix expression. // https://en.wikipedia.org/wiki/Reverse_Polish_notation#Postfix_evaluation_algorithm -int ParseUtil::evaluatePostfix(QList postfix) { +int ParseUtil::evaluatePostfix(const QList &postfix) { QStack stack; for (Token token : postfix) { if (token.type == TokenClass::Operator && stack.size() > 1) { @@ -234,7 +213,7 @@ int ParseUtil::evaluatePostfix(QList postfix) { return stack.size() ? stack.pop().value.toInt(nullptr, 0) : 0; } -QString ParseUtil::readCIncbin(QString filename, QString label) { +QString ParseUtil::readCIncbin(const QString &filename, const QString &label) { QString path; if (label.isNull()) { @@ -257,7 +236,10 @@ QString ParseUtil::readCIncbin(QString filename, QString label) { return path; } -QMap ParseUtil::readCDefines(QString filename, QStringList prefixes, QMap allDefines) { +QMap ParseUtil::readCDefines(const QString &filename, + const QStringList &prefixes, + QMap allDefines) +{ QMap filteredDefines; file = filename; @@ -286,7 +268,7 @@ QMap ParseUtil::readCDefines(QString filename, QStringList prefixe QString name = match.captured("defineName"); QString expression = match.captured("defineValue"); if (expression == " ") continue; - int value = evaluateDefine(expression, &allDefines); + int value = evaluateDefine(expression, allDefines); allDefines.insert(name, value); for (QString prefix : prefixes) { if (name.startsWith(prefix) || QRegularExpression(prefix).match(name).hasMatch()) { @@ -297,7 +279,10 @@ QMap ParseUtil::readCDefines(QString filename, QStringList prefixe return filteredDefines; } -void ParseUtil::readCDefinesSorted(QString filename, QStringList prefixes, QStringList* definesToSet, QMap knownDefines) { +QStringList ParseUtil::readCDefinesSorted(const QString &filename, + const QStringList &prefixes, + const QMap &knownDefines) +{ QMap defines = readCDefines(filename, prefixes, knownDefines); // The defines should to be sorted by their underlying value, not alphabetically. @@ -306,10 +291,10 @@ void ParseUtil::readCDefinesSorted(QString filename, QStringList prefixes, QStri for (QString defineName : defines.keys()) { definesInverse.insert(defines[defineName], defineName); } - *definesToSet = definesInverse.values(); + return definesInverse.values(); } -QStringList ParseUtil::readCArray(QString filename, QString label) { +QStringList ParseUtil::readCArray(const QString &filename, const QString &label) { QStringList list; if (label.isNull()) { @@ -335,13 +320,13 @@ QStringList ParseUtil::readCArray(QString filename, QString label) { return list; } -QMap ParseUtil::readNamedIndexCArray(QString filename, QString label) { +QMap ParseUtil::readNamedIndexCArray(const QString &filename, const QString &label) { text = readTextFile(root + "/" + filename); QMap map; QRegularExpression re_text(QString(R"(\b%1\b\s*(\[?[^\]]*\])?\s*=\s*\{([^\}]*)\})").arg(label)); QString body = re_text.match(text).captured(2).replace(QRegularExpression("\\s*"), ""); - + QRegularExpression re("\\[(?[A-Za-z0-9_]*)\\]=(?&?[A-Za-z0-9_]*)"); QRegularExpressionMatchIterator iter = re.globalMatch(body); @@ -355,24 +340,23 @@ QMap ParseUtil::readNamedIndexCArray(QString filename, QString return map; } -QList* ParseUtil::getLabelMacros(QList *list, QString label) { +QList ParseUtil::getLabelMacros(const QList &list, const QString &label) { bool in_label = false; - QList *new_list = new QList; - for (int i = 0; i < list->length(); i++) { - QStringList params = list->value(i); - QString macro = params.value(0); + QList new_list; + for (const auto ¶ms : list) { + const QString macro = params.value(0); if (macro == ".label") { if (params.value(1) == label) { in_label = true; } else if (in_label) { // If nothing has been read yet, assume the label // we're looking for is in a stack of labels. - if (new_list->length() > 0) { + if (new_list.length() > 0) { break; } } } else if (in_label) { - new_list->append(params); + new_list.append(params); } } return new_list; @@ -380,32 +364,31 @@ QList* ParseUtil::getLabelMacros(QList *list, QString // For if you don't care about filtering by macro, // and just want all values associated with some label. -QStringList* ParseUtil::getLabelValues(QList *list, QString label) { - list = getLabelMacros(list, label); - QStringList *values = new QStringList; - for (int i = 0; i < list->length(); i++) { - QStringList params = list->value(i); - QString macro = params.value(0); +QStringList ParseUtil::getLabelValues(const QList &list, const QString &label) { + const QList labelMacros = getLabelMacros(list, label); + QStringList values; + for (const auto ¶ms : labelMacros) { + const QString macro = params.value(0); if (macro == ".align" || macro == ".ifdef" || macro == ".ifndef") { continue; } - for (int j = 1; j < params.length(); j++) { - values->append(params.value(j)); + for (int i = 1; i < params.length(); i++) { + values.append(params.value(i)); } } return values; } -bool ParseUtil::tryParseJsonFile(QJsonDocument *out, QString filepath) { +bool ParseUtil::tryParseJsonFile(QJsonDocument *out, const QString &filepath) { QFile file(filepath); if (!file.open(QIODevice::ReadOnly)) { logError(QString("Error: Could not open %1 for reading").arg(filepath)); return false; } - QByteArray data = file.readAll(); + const QByteArray data = file.readAll(); QJsonParseError parseError; - QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &parseError); + const QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &parseError); file.close(); if (parseError.error != QJsonParseError::NoError) { logError(QString("Error: Failed to parse json file %1: %2").arg(filepath).arg(parseError.errorString())); @@ -416,7 +399,7 @@ bool ParseUtil::tryParseJsonFile(QJsonDocument *out, QString filepath) { return true; } -bool ParseUtil::ensureFieldsExist(QJsonObject obj, QList fields) { +bool ParseUtil::ensureFieldsExist(const QJsonObject &obj, const QList &fields) { for (QString field : fields) { if (!obj.contains(field)) { logError(QString("JSON object is missing field '%1'.").arg(field)); @@ -439,8 +422,8 @@ int ParseUtil::getScriptLineNumber(const QString &filePath, const QString &scrip } int ParseUtil::getRawScriptLineNumber(QString text, const QString &scriptLabel) { - removeStringLiterals(text); - removeLineComments(text, "@"); + text = removeStringLiterals(text); + text = removeLineComments(text, "@"); static const QRegularExpression re_incScriptLabel("\\b(?