more potential session-save speedup.
authorRobin Gareus <robin@gareus.org>
Fri, 8 Apr 2016 19:03:23 +0000 (21:03 +0200)
committerRobin Gareus <robin@gareus.org>
Fri, 8 Apr 2016 19:03:23 +0000 (21:03 +0200)
std:vector trumps std::list speed in all aspects: traversal, insertion
(at end) and Deletion.  ..but we'll have to be careful about iterators..

libs/pbd/pbd/xml++.h
libs/pbd/xml++.cc

index 7b8649873ac1af3ffdd77c421ea3183ef2033638..dac8de67cd1473e781f1b579a81d2995445d9981 100644 (file)
@@ -28,7 +28,7 @@
  */
 
 #include <string>
-#include <list>
+#include <vector>
 #include <unordered_map>
 #include <cstdio>
 #include <cstdarg>
@@ -43,13 +43,13 @@ class XMLTree;
 class XMLNode;
 class XMLProperty;
 
-typedef std::list<XMLNode *>                   XMLNodeList;
-typedef std::list<boost::shared_ptr<XMLNode> > XMLSharedNodeList;
-typedef XMLNodeList::iterator                  XMLNodeIterator;
-typedef XMLNodeList::const_iterator            XMLNodeConstIterator;
-typedef std::list<XMLProperty*>                XMLPropertyList;
-typedef XMLPropertyList::iterator              XMLPropertyIterator;
-typedef XMLPropertyList::const_iterator        XMLPropertyConstIterator;
+typedef std::vector<XMLNode *>                   XMLNodeList;
+typedef std::vector<boost::shared_ptr<XMLNode> > XMLSharedNodeList;
+typedef XMLNodeList::iterator                    XMLNodeIterator;
+typedef XMLNodeList::const_iterator              XMLNodeConstIterator;
+typedef std::vector<XMLProperty*>                XMLPropertyList;
+typedef XMLPropertyList::iterator                XMLPropertyIterator;
+typedef XMLPropertyList::const_iterator          XMLPropertyConstIterator;
 typedef std::unordered_map<std::string, XMLProperty*>    XMLPropertyMap;
 
 class LIBPBD_API XMLTree {
index cc583fe86e14ab78fbcb969be39a994800728c87..b8fff12ad077f4a0e5477f4779dd2b89df05287a 100644 (file)
@@ -472,7 +472,10 @@ XMLNode::remove_property(const string& n)
 {
        if (_propmap.find(n) != _propmap.end()) {
                XMLProperty* p = _propmap[n];
-               _proplist.remove (p);
+               XMLPropertyIterator i = std::find(_proplist.begin(), _proplist.end(), p);
+               if (i != _proplist.end ()) {
+                       _proplist.erase (i);
+               }
                delete p;
                _propmap.erase(n);
        }
@@ -492,15 +495,12 @@ void
 XMLNode::remove_nodes(const string& n)
 {
        XMLNodeIterator i = _children.begin();
-       XMLNodeIterator tmp;
-
        while (i != _children.end()) {
-               tmp = i;
-               ++tmp;
                if ((*i)->name() == n) {
-                       _children.erase (i);
+                       i = _children.erase (i);
+               } else {
+                       ++i;
                }
-               i = tmp;
        }
 }
 
@@ -508,16 +508,14 @@ void
 XMLNode::remove_nodes_and_delete(const string& n)
 {
        XMLNodeIterator i = _children.begin();
-       XMLNodeIterator tmp;
 
        while (i != _children.end()) {
-               tmp = i;
-               ++tmp;
                if ((*i)->name() == n) {
                        delete *i;
-                       _children.erase (i);
+                       i = _children.erase (i);
+               } else {
+                       ++i;
                }
-               i = tmp;
        }
 }
 
@@ -525,20 +523,16 @@ void
 XMLNode::remove_nodes_and_delete(const string& propname, const string& val)
 {
        XMLNodeIterator i = _children.begin();
-       XMLNodeIterator tmp;
        XMLProperty* prop;
 
        while (i != _children.end()) {
-               tmp = i;
-               ++tmp;
-
                prop = (*i)->property(propname);
                if (prop && prop->value() == val) {
                        delete *i;
-                       _children.erase(i);
+                       i = _children.erase(i);
+               } else {
+                       ++i;
                }
-
-               i = tmp;
        }
 }