summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThorbjørn Lindeijer <bjorn@lindeijer.nl>2024-06-26 01:37:48 +0200
committerThorbjørn Lindeijer <bjorn@lindeijer.nl>2024-09-27 18:38:28 +0200
commit51f0c23ac190c83bebeace8a49cd2ecd1143fa8c (patch)
treee45ceab35b6cc419f80be6c86753b6ccd1cd22f0 /src
parent632da15234851f3decdbb29cbeb15e1950e41a0d (diff)
downloadmana-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.cpp4
-rw-r--r--src/effectmanager.cpp2
-rw-r--r--src/gui/serverdialog.cpp4
-rw-r--r--src/gui/skilldialog.cpp4
-rw-r--r--src/gui/updaterwindow.cpp2
-rw-r--r--src/net/manaserv/inventoryhandler.cpp4
-rw-r--r--src/particle.cpp4
-rw-r--r--src/particleemitter.cpp6
-rw-r--r--src/resources/attributes.cpp2
-rw-r--r--src/resources/chardb.cpp2
-rw-r--r--src/resources/itemdb.cpp10
-rw-r--r--src/resources/mapreader.cpp18
-rw-r--r--src/resources/monsterdb.cpp2
-rw-r--r--src/resources/npcdb.cpp2
-rw-r--r--src/resources/settingsmanager.cpp4
-rw-r--r--src/resources/specialdb.cpp3
-rw-r--r--src/resources/spritedef.cpp6
-rw-r--r--src/resources/theme.cpp6
-rw-r--r--src/units.cpp2
-rw-r--r--src/utils/xml.cpp2
-rw-r--r--src/utils/xml.h32
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