diff options
author | Thorbjørn Lindeijer <bjorn@lindeijer.nl> | 2024-06-26 01:37:48 +0200 |
---|---|---|
committer | Thorbjørn Lindeijer <bjorn@lindeijer.nl> | 2024-09-27 18:38:28 +0200 |
commit | 51f0c23ac190c83bebeace8a49cd2ecd1143fa8c (patch) | |
tree | e45ceab35b6cc419f80be6c86753b6ccd1cd22f0 /src | |
parent | 632da15234851f3decdbb29cbeb15e1950e41a0d (diff) | |
download | mana-51f0c23ac190c83bebeace8a49cd2ecd1143fa8c.tar.gz mana-51f0c23ac190c83bebeace8a49cd2ecd1143fa8c.tar.bz2 mana-51f0c23ac190c83bebeace8a49cd2ecd1143fa8c.tar.xz mana-51f0c23ac190c83bebeace8a49cd2ecd1143fa8c.zip |
Replaced for_each_xml_child_node macro with helper class
The new XML::Children class enables using a C++11 range-based for loop
to iterate over the children of an xmlNodePtr.
Diffstat (limited to 'src')
-rw-r--r-- | src/configuration.cpp | 4 | ||||
-rw-r--r-- | src/effectmanager.cpp | 2 | ||||
-rw-r--r-- | src/gui/serverdialog.cpp | 4 | ||||
-rw-r--r-- | src/gui/skilldialog.cpp | 4 | ||||
-rw-r--r-- | src/gui/updaterwindow.cpp | 2 | ||||
-rw-r--r-- | src/net/manaserv/inventoryhandler.cpp | 4 | ||||
-rw-r--r-- | src/particle.cpp | 4 | ||||
-rw-r--r-- | src/particleemitter.cpp | 6 | ||||
-rw-r--r-- | src/resources/attributes.cpp | 2 | ||||
-rw-r--r-- | src/resources/chardb.cpp | 2 | ||||
-rw-r--r-- | src/resources/itemdb.cpp | 10 | ||||
-rw-r--r-- | src/resources/mapreader.cpp | 18 | ||||
-rw-r--r-- | src/resources/monsterdb.cpp | 2 | ||||
-rw-r--r-- | src/resources/npcdb.cpp | 2 | ||||
-rw-r--r-- | src/resources/settingsmanager.cpp | 4 | ||||
-rw-r--r-- | src/resources/specialdb.cpp | 3 | ||||
-rw-r--r-- | src/resources/spritedef.cpp | 6 | ||||
-rw-r--r-- | src/resources/theme.cpp | 6 | ||||
-rw-r--r-- | src/units.cpp | 2 | ||||
-rw-r--r-- | src/utils/xml.cpp | 2 | ||||
-rw-r--r-- | src/utils/xml.h | 32 |
21 files changed, 73 insertions, 48 deletions
diff --git a/src/configuration.cpp b/src/configuration.cpp index 7d2b496f..e37fc1ba 100644 --- a/src/configuration.cpp +++ b/src/configuration.cpp @@ -211,14 +211,14 @@ void ConfigurationObject::initFromXML(xmlNodePtr parent_node) { clear(); - for_each_xml_child_node(node, parent_node) + for (auto node : XML::Children(parent_node)) { if (xmlStrEqual(node->name, BAD_CAST "list")) { // List option handling. std::string name = XML::getProperty(node, "name", std::string()); - for_each_xml_child_node(subnode, node) + for (auto subnode : XML::Children(node)) { if (xmlStrEqual(subnode->name, BAD_CAST name.c_str()) && subnode->type == XML_ELEMENT_NODE) diff --git a/src/effectmanager.cpp b/src/effectmanager.cpp index 3f9cf348..e318d1e6 100644 --- a/src/effectmanager.cpp +++ b/src/effectmanager.cpp @@ -47,7 +47,7 @@ EffectManager::EffectManager() logger->log("Effects are now loading"); } - for_each_xml_child_node(node, root) + for (auto node : XML::Children(root)) { if (xmlStrEqual(node->name, BAD_CAST "effect")) { diff --git a/src/gui/serverdialog.cpp b/src/gui/serverdialog.cpp index 5b8372ee..62437bab 100644 --- a/src/gui/serverdialog.cpp +++ b/src/gui/serverdialog.cpp @@ -443,7 +443,7 @@ void ServerDialog::loadServers() return; } - for_each_xml_child_node(serverNode, rootNode) + for (auto serverNode : XML::Children(rootNode)) { if (!xmlStrEqual(serverNode->name, BAD_CAST "server")) continue; @@ -481,7 +481,7 @@ void ServerDialog::loadServers() else version = strprintf(_("requires v%s"), version.c_str()); - for_each_xml_child_node(subNode, serverNode) + for (auto subNode : XML::Children(serverNode)) { if (xmlStrEqual(subNode->name, BAD_CAST "connection")) { diff --git a/src/gui/skilldialog.cpp b/src/gui/skilldialog.cpp index 7639f1d6..5b1676e2 100644 --- a/src/gui/skilldialog.cpp +++ b/src/gui/skilldialog.cpp @@ -357,7 +357,7 @@ void SkillDialog::loadSkills() return; } - for_each_xml_child_node(set, root) + for (auto set : XML::Children(root)) { if (xmlStrEqual(set->name, BAD_CAST "set") || xmlStrEqual(set->name, BAD_CAST "skill-set")) @@ -367,7 +367,7 @@ void SkillDialog::loadSkills() auto *model = new SkillModel(); - for_each_xml_child_node(node, set) + for (auto node : XML::Children(set)) { if (xmlStrEqual(node->name, BAD_CAST "skill")) { diff --git a/src/gui/updaterwindow.cpp b/src/gui/updaterwindow.cpp index 387b11ef..353e2b35 100644 --- a/src/gui/updaterwindow.cpp +++ b/src/gui/updaterwindow.cpp @@ -64,7 +64,7 @@ std::vector<UpdateFile> loadXMLFile(const std::string &fileName) return files; } - for_each_xml_child_node(fileNode, rootNode) + for (auto fileNode : XML::Children(rootNode)) { // Ignore all tags except for the "update" tags if (!xmlStrEqual(fileNode->name, BAD_CAST "update")) diff --git a/src/net/manaserv/inventoryhandler.cpp b/src/net/manaserv/inventoryhandler.cpp index ac3e0f5b..4c110179 100644 --- a/src/net/manaserv/inventoryhandler.cpp +++ b/src/net/manaserv/inventoryhandler.cpp @@ -211,7 +211,7 @@ void EquipBackend::readEquipFile() unsigned int slotIndex = 0; mVisibleSlots = 0; - for_each_xml_child_node(slotNode, rootNode) + for (auto slotNode : XML::Children(rootNode)) { if (!xmlStrEqual(slotNode->name, BAD_CAST "slot")) continue; @@ -257,7 +257,7 @@ void EquipBackend::readEquipFile() void EquipBackend::readBoxNode(xmlNodePtr slotNode) { - for_each_xml_child_node(boxNode, slotNode) + for (auto boxNode : XML::Children(slotNode)) { if (!xmlStrEqual(boxNode->name, BAD_CAST "box")) continue; diff --git a/src/particle.cpp b/src/particle.cpp index 56998df4..6d78024c 100644 --- a/src/particle.cpp +++ b/src/particle.cpp @@ -272,7 +272,7 @@ Particle *Particle::addEffect(const std::string &particleEffectFile, ResourceManager *resman = ResourceManager::getInstance(); // Parse particles - for_each_xml_child_node(effectChildNode, rootNode) + for (auto effectChildNode : XML::Children(rootNode)) { // We're only interested in particles if (!xmlStrEqual(effectChildNode->name, BAD_CAST "particle")) @@ -322,7 +322,7 @@ Particle *Particle::addEffect(const std::string &particleEffectFile, newParticle->setAllowSizeAdjust(resizeable); // Look for additional emitters for this particle - for_each_xml_child_node(emitterNode, effectChildNode) + for (auto emitterNode : XML::Children(effectChildNode)) { if (xmlStrEqual(emitterNode->name, BAD_CAST "emitter")) { diff --git a/src/particleemitter.cpp b/src/particleemitter.cpp index edb892e1..0afa4794 100644 --- a/src/particleemitter.cpp +++ b/src/particleemitter.cpp @@ -67,7 +67,7 @@ ParticleEmitter::ParticleEmitter(xmlNodePtr emitterNode, Particle *target, mOutputPause.set(0); mParticleAlpha.set(1.0f); - for_each_xml_child_node(propertyNode, emitterNode) + for (auto propertyNode : XML::Children(emitterNode)) { if (xmlStrEqual(propertyNode->name, BAD_CAST "property")) { @@ -202,7 +202,7 @@ ParticleEmitter::ParticleEmitter(xmlNodePtr emitterNode, Particle *target, ); // Get animation frames - for_each_xml_child_node(frameNode, propertyNode) + for (auto frameNode : XML::Children(propertyNode)) { int delay = XML::getProperty(frameNode, "delay", 0); int offsetX = XML::getProperty(frameNode, "offsetX", 0); @@ -280,7 +280,7 @@ ParticleEmitter::ParticleEmitter(xmlNodePtr emitterNode, Particle *target, imagesetPath.c_str())); // Get animation frames - for_each_xml_child_node(frameNode, propertyNode) + for (auto frameNode : XML::Children(propertyNode)) { int delay = XML::getProperty(frameNode, "delay", 0); int offsetX = XML::getProperty(frameNode, "offsetX", 0); diff --git a/src/resources/attributes.cpp b/src/resources/attributes.cpp index a9a3bd11..17bb40ac 100644 --- a/src/resources/attributes.cpp +++ b/src/resources/attributes.cpp @@ -277,7 +277,7 @@ namespace Attributes { attributes[id] = a; unsigned int count = 0; - for_each_xml_child_node(effectNode, node) + for (auto effectNode : XML::Children(node)) { if (!xmlStrEqual(effectNode->name, BAD_CAST "modifier")) continue; diff --git a/src/resources/chardb.cpp b/src/resources/chardb.cpp index 40ecd999..ff0a4749 100644 --- a/src/resources/chardb.cpp +++ b/src/resources/chardb.cpp @@ -58,7 +58,7 @@ void CharDB::load() return; } - for_each_xml_child_node(node, root) + for (auto node : XML::Children(root)) { if (xmlStrEqual(node->name, BAD_CAST "haircolor")) { diff --git a/src/resources/itemdb.cpp b/src/resources/itemdb.cpp index 8ba80a51..b4f959e9 100644 --- a/src/resources/itemdb.cpp +++ b/src/resources/itemdb.cpp @@ -152,7 +152,7 @@ void ItemDB::loadSoundRef(ItemInfo *itemInfo, xmlNodePtr node) void ItemDB::loadFloorSprite(SpriteDisplay *display, xmlNodePtr floorNode) { - for_each_xml_child_node(spriteNode, floorNode) + for (auto spriteNode : XML::Children(floorNode)) { if (xmlStrEqual(spriteNode->name, BAD_CAST "sprite")) { @@ -232,7 +232,7 @@ void ItemDB::loadCommonRef(ItemInfo *itemInfo, xmlNodePtr node, const std::strin itemInfo->setCriticalHitEffectId(criticalEffectId); // Load <sprite>, <sound>, and <floor> - for_each_xml_child_node(itemChild, node) + for (auto itemChild : XML::Children(node)) { if (xmlStrEqual(itemChild->name, BAD_CAST "sprite")) { @@ -423,7 +423,7 @@ void ManaServItemDB::readItemNode(xmlNodePtr node, const std::string &filename) // Load <equip>, and <effect> sub nodes. std::vector<std::string> effect; - for_each_xml_child_node(itemChild, node) + for (auto itemChild : XML::Children(node)) { if (xmlStrEqual(itemChild->name, BAD_CAST "equip")) { @@ -452,7 +452,7 @@ void ManaServItemDB::readItemNode(xmlNodePtr node, const std::string &filename) continue; } - for_each_xml_child_node(effectChild, itemChild) + for (auto effectChild : XML::Children(itemChild)) { if (xmlStrEqual(effectChild->name, BAD_CAST "modifier")) { @@ -505,7 +505,7 @@ void ManaServItemDB::readItemNode(xmlNodePtr node, const std::string &filename) itemInfo->mType = ITEM_USABLE; else if (itemInfo->mEquippable) itemInfo->mType = ITEM_EQUIPMENT_TORSO; - } // end for_each_xml_child_node(itemChild, node) + } // end for (auto itemChild : XML::Children(node)) itemInfo->mEffect = effect; diff --git a/src/resources/mapreader.cpp b/src/resources/mapreader.cpp index b49195fc..bbcd33e5 100644 --- a/src/resources/mapreader.cpp +++ b/src/resources/mapreader.cpp @@ -128,7 +128,7 @@ Map *MapReader::readMap(xmlNodePtr node, const std::string &path) Map *map = new Map(w, h, tilew, tileh); - for_each_xml_child_node(childNode, node) + for (auto childNode : XML::Children(node)) { if (xmlStrEqual(childNode->name, BAD_CAST "tileset")) { @@ -154,7 +154,7 @@ Map *MapReader::readMap(xmlNodePtr node, const std::string &path) const int offsetX = tileOffsetX * tilew; const int offsetY = tileOffsetY * tileh; - for_each_xml_child_node(objectNode, childNode) + for (auto objectNode : XML::Children(childNode)) { if (xmlStrEqual(objectNode->name, BAD_CAST "object")) { @@ -225,7 +225,7 @@ Map *MapReader::readMap(xmlNodePtr node, const std::string &path) */ static void readProperties(xmlNodePtr node, Properties *props) { - for_each_xml_child_node(childNode, node) + for (auto childNode : XML::Children(node)) { if (!xmlStrEqual(childNode->name, BAD_CAST "property")) continue; @@ -299,11 +299,11 @@ static void readLayer(xmlNodePtr node, Map *map) int y = 0; // Load the tile data - for_each_xml_child_node(childNode, node) + for (auto childNode : XML::Children(node)) { if (xmlStrEqual(childNode->name, BAD_CAST "properties")) { - for_each_xml_child_node(prop, childNode) + for (auto prop : XML::Children(childNode)) { if (!xmlStrEqual(prop->name, BAD_CAST "property")) continue; @@ -462,7 +462,7 @@ static void readLayer(xmlNodePtr node, Map *map) else { // Read plain XML map file - for_each_xml_child_node(childNode2, childNode) + for (auto childNode2 : XML::Children(childNode)) { if (!xmlStrEqual(childNode2->name, BAD_CAST "tile")) continue; @@ -518,7 +518,7 @@ static Tileset *readTileset(xmlNodePtr node, const std::string &path, const int tw = XML::getProperty(node, "tilewidth", map->getTileWidth()); const int th = XML::getProperty(node, "tileheight", map->getTileHeight()); - for_each_xml_child_node(childNode, node) + for (auto childNode : XML::Children(node)) { if (xmlStrEqual(childNode->name, BAD_CAST "image")) { @@ -547,7 +547,7 @@ static Tileset *readTileset(xmlNodePtr node, const std::string &path, { const int tileGID = firstGid + XML::getProperty(childNode, "id", 0); - for_each_xml_child_node(tileNode, childNode) + for (auto tileNode : XML::Children(childNode)) { if (xmlStrEqual(tileNode->name, BAD_CAST "animation")) readTileAnimation(tileNode, set, tileGID, map); @@ -566,7 +566,7 @@ static void readTileAnimation(xmlNodePtr tileNode, Map *map) { Animation ani; - for_each_xml_child_node(frameNode, tileNode) + for (auto frameNode : XML::Children(tileNode)) { if (xmlStrEqual(frameNode->name, BAD_CAST "frame")) { diff --git a/src/resources/monsterdb.cpp b/src/resources/monsterdb.cpp index fe2a3e97..283d62e7 100644 --- a/src/resources/monsterdb.cpp +++ b/src/resources/monsterdb.cpp @@ -87,7 +87,7 @@ void MonsterDB::readMonsterNode(xmlNodePtr node, const std::string &filename) SpriteDisplay display; //iterate <sprite>s and <sound>s - for_each_xml_child_node(spriteNode, node) + for (auto spriteNode : XML::Children(node)) { if (xmlStrEqual(spriteNode->name, BAD_CAST "sprite")) { diff --git a/src/resources/npcdb.cpp b/src/resources/npcdb.cpp index 853c229d..164dec18 100644 --- a/src/resources/npcdb.cpp +++ b/src/resources/npcdb.cpp @@ -61,7 +61,7 @@ void NPCDB::readNPCNode(xmlNodePtr node, const std::string &filename) node, "targetSelection", true)); SpriteDisplay display; - for_each_xml_child_node(spriteNode, node) + for (auto spriteNode : XML::Children(node)) { if (xmlStrEqual(spriteNode->name, BAD_CAST "sprite")) { diff --git a/src/resources/settingsmanager.cpp b/src/resources/settingsmanager.cpp index eceedcf4..56393546 100644 --- a/src/resources/settingsmanager.cpp +++ b/src/resources/settingsmanager.cpp @@ -130,7 +130,7 @@ namespace SettingsManager } // go through every node - for_each_xml_child_node(childNode, node) + for (auto childNode : XML::Children(node)) { if (childNode->type != XML_ELEMENT_NODE) continue; @@ -201,7 +201,7 @@ namespace SettingsManager const std::string name = XML::getProperty(childNode, "name", std::string()); if (name == "hair") { - for_each_xml_child_node(hairColorNode, childNode) + for (auto hairColorNode : XML::Children(childNode)) { if (xmlStrEqual(hairColorNode->name, BAD_CAST "color")) hairDB.readHairColorNode(hairColorNode, filename); diff --git a/src/resources/specialdb.cpp b/src/resources/specialdb.cpp index c2ff16c2..a6f6bac0 100644 --- a/src/resources/specialdb.cpp +++ b/src/resources/specialdb.cpp @@ -54,7 +54,7 @@ void SpecialDB::readSpecialSetNode(xmlNodePtr node, const std::string &filename) { std::string setName = XML::getProperty(node, "name", "Actions"); - for_each_xml_child_node(special, node) + for (auto special : XML::Children(node)) { if (xmlStrEqual(special->name, BAD_CAST "special")) { @@ -113,4 +113,3 @@ SpecialInfo *SpecialDB::get(int id) } return nullptr; } - diff --git a/src/resources/spritedef.cpp b/src/resources/spritedef.cpp index ec41aec0..54f28fe9 100644 --- a/src/resources/spritedef.cpp +++ b/src/resources/spritedef.cpp @@ -123,7 +123,7 @@ void SpriteDef::loadSprite(xmlNodePtr spriteNode, int variant, variant * XML::getProperty(spriteNode, "variant_offset", 0); } - for_each_xml_child_node(node, spriteNode) + for (auto node : XML::Children(spriteNode)) { if (xmlStrEqual(node->name, BAD_CAST "imageset")) { @@ -198,7 +198,7 @@ void SpriteDef::loadAction(xmlNodePtr node, int variant_offset) } // Load animations - for_each_xml_child_node(animationNode, node) + for (auto animationNode : XML::Children(node)) { if (xmlStrEqual(animationNode->name, BAD_CAST "animation")) { @@ -226,7 +226,7 @@ void SpriteDef::loadAnimation(xmlNodePtr animationNode, action->setAnimation(directionType, animation); // Get animation frames - for_each_xml_child_node(frameNode, animationNode) + for (auto frameNode : XML::Children(animationNode)) { const int delay = XML::getProperty(frameNode, "delay", DEFAULT_FRAME_DELAY); diff --git a/src/resources/theme.cpp b/src/resources/theme.cpp index 9a8ac7a7..725fcc1c 100644 --- a/src/resources/theme.cpp +++ b/src/resources/theme.cpp @@ -240,7 +240,7 @@ Skin *Theme::readSkin(const std::string &filename) memset(&border, 0, sizeof(ImageRect)); // iterate <widget>'s - for_each_xml_child_node(widgetNode, rootNode) + for (auto widgetNode : XML::Children(rootNode)) { if (!xmlStrEqual(widgetNode->name, BAD_CAST "widget")) continue; @@ -253,7 +253,7 @@ Skin *Theme::readSkin(const std::string &filename) // LEEOR / TODO: // We need to make provisions to load in a CloseButton image. For // now it can just be hard-coded. - for_each_xml_child_node(partNode, widgetNode) + for (auto partNode : XML::Children(widgetNode)) { if (!xmlStrEqual(partNode->name, BAD_CAST "part")) continue; @@ -544,7 +544,7 @@ void Theme::loadColors(std::string file) gcn::Color color; GradientType grad; - for_each_xml_child_node(node, root) + for (auto node : XML::Children(root)) { if (xmlStrEqual(node->name, BAD_CAST "color")) { diff --git a/src/units.cpp b/src/units.cpp index 03ec3118..b623b4bd 100644 --- a/src/units.cpp +++ b/src/units.cpp @@ -107,7 +107,7 @@ void Units::readUnitNode(xmlNodePtr node, const std::string &filename) ud.levels.push_back(bu); - for_each_xml_child_node(uLevel, node) + for (auto uLevel : XML::Children(node)) { if (xmlStrEqual(uLevel->name, BAD_CAST "level")) { diff --git a/src/utils/xml.cpp b/src/utils/xml.cpp index 252a9bd2..72de10c7 100644 --- a/src/utils/xml.cpp +++ b/src/utils/xml.cpp @@ -168,7 +168,7 @@ namespace XML xmlNodePtr findFirstChildByName(xmlNodePtr parent, const char *name) { - for_each_xml_child_node(child, parent) + for (auto child : XML::Children(parent)) if (xmlStrEqual(child->name, BAD_CAST name)) return child; diff --git a/src/utils/xml.h b/src/utils/xml.h index 256a964b..fe15273b 100644 --- a/src/utils/xml.h +++ b/src/utils/xml.h @@ -95,9 +95,35 @@ namespace XML * Initializes the XML engine. */ void init(); -} -#define for_each_xml_child_node(var, parent) \ - for (xmlNodePtr var = parent->xmlChildrenNode; var; var = var->next) + /** + * Helper class to iterate over the children of a node. Enables range-based + * for loops. + */ + class Children + { + public: + class Iterator + { + public: + explicit Iterator(xmlNodePtr node) : mNode(node) {} + + bool operator!=(const Iterator &other) const { return mNode != other.mNode; } + void operator++() { mNode = mNode->next; } + xmlNodePtr operator*() const { return mNode; } + + private: + xmlNodePtr mNode; + }; + + explicit Children(xmlNodePtr node) : mNode(node) {} + + Iterator begin() const { return Iterator(mNode->children); } + Iterator end() const { return Iterator(nullptr); } + + private: + xmlNodePtr mNode; + }; +} #endif // XML_H |