Browse Source

improve performance of DataValidator and XML operations

Kolja Strohm 1 month ago
parent
commit
0d301472e5
5 changed files with 46 additions and 26 deletions
  1. 15 10
      JSON.cpp
  2. 7 0
      Text.cpp
  3. 4 0
      Text.h
  4. 14 15
      XML.cpp
  5. 6 1
      XML.h

+ 15 - 10
JSON.cpp

@@ -499,10 +499,10 @@ int Parser::findObjectEndInArray(const char* str)
 
 Text Parser::removeWhitespace(const char* str)
 {
-    int wsc = 0;
     int i = 0;
     bool esc = 0;
     bool strO = 0;
+    int l = 0;
     for (; str[i]; i++)
     {
         switch (str[i])
@@ -512,27 +512,31 @@ Text Parser::removeWhitespace(const char* str)
                 esc = !esc;
             else
                 esc = 0;
+            l++;
             break;
         case '"':
             if (!esc) strO = !strO;
             esc = 0;
+            l++;
             break;
         case ' ':
         case '\n':
         case '\t':
         case '\r':
-            if (!strO) wsc++;
+            if (strO) l++;
             esc = 0;
             break;
         default:
             esc = 0;
+            l++;
             break;
         }
     }
-    Text ret;
+    char* result = new char[l + 1];
     i = 0;
     esc = 0;
     strO = 0;
+    l = 0;
     for (; str[i]; i++)
     {
         switch (str[i])
@@ -542,27 +546,28 @@ Text Parser::removeWhitespace(const char* str)
                 esc = !esc;
             else
                 esc = 0;
-            ret.append(str[i]);
+            result[l++] = str[i];
             break;
         case '"':
             if (!esc) strO = !strO;
             esc = 0;
-            ret.append(str[i]);
+            result[l++] = str[i];
             break;
         case ' ':
         case '\n':
         case '\t':
         case '\r':
-            if (strO) ret.append(str[i]);
+            if (strO) result[l++] = str[i];
             esc = 0;
             break;
         default:
-            ret.append(str[i]);
+            result[l++] = str[i];
             esc = 0;
             break;
         }
     }
-    return ret;
+    result[l] = 0;
+    return Text::fromArray(result, l);
 }
 
 JSONValue* Parser::getValue(const char* str)
@@ -585,8 +590,8 @@ JSONValue* Parser::getValue(const char* str)
         bool isNumber = 1;
         for (const char* c = (*string.getText() == '-') ? string.getText() + 1
                                                         : string.getText();
-             *c;
-             c++)
+            *c;
+            c++)
             isNumber &= (*c >= '0' && *c <= '9') || *c == '.';
         if (isNumber) return new JSONNumber((double)string);
     }

+ 7 - 0
Text.cpp

@@ -1492,6 +1492,13 @@ bool Text::operator==(const Text& right) const
     return istGleich(right, right.getLength());
 }
 
+Text Text::fromArray(char* arr, int len)
+{
+    return Text(arr, len);
+}
+
+const Text Text::EMPTY = "";
+
 // Inhalt der TextReader Klasse
 // Konstructor
 //  txt: Der Text der gelesen werden soll. Er wird nicht kopiert sondern

+ 4 - 0
Text.h

@@ -565,6 +565,10 @@ namespace Framework
         DLLEXPORT Text operator+(const float num) const;
         //! Prüft ob der Text mit dem anderen Text übereinstimmt
         DLLEXPORT bool operator==(const Text& right) const;
+        //! creates a Text from a char array. the array will be deleted when the
+        //! destructor of Text is called
+        DLLEXPORT static Text fromArray(char* arr, int len);
+        static const Text EMPTY;
     };
 
     class TextReader : public Reader,

+ 14 - 15
XML.cpp

@@ -489,14 +489,14 @@ Text Element::getAttributeValue(int i) const
 
 // gibt den Wert eines Attributes zurück
 //  attribut: Der Name des Attributes
-Text Element::getAttributeValue(Text attribut) const
+const Text& Element::getAttributeValue(const Text& attribut) const
 {
     for (auto i = attributes->begin(), j = attributeValues->begin(); i && j;
         i++, j++)
     {
-        if (i->istGleich(attribut)) return j->getText();
+        if (i->istGleich(attribut)) return *j.val();
     }
-    return "";
+    return Text::EMPTY;
 }
 
 // gibt einen iterator zurück mit dem durch alle Attribut Namen iteriert werden
@@ -582,10 +582,7 @@ Element* Element::dublicate() const
 Editor::Editor(RCArray<Element>* elements)
     : ReferenceCounter()
 {
-    this->elements = new RCArray<Element>();
-    for (auto i : *elements)
-        this->elements->add(dynamic_cast<XML::Element*>(i->getThis()));
-    elements->release();
+    this->elements = elements;
 }
 
 Editor::Editor(const Editor& e)
@@ -695,19 +692,21 @@ ArrayIterator<Element*> Editor::end()
     return elements->end();
 }
 
+void Editor::selectAllElements(RCArray<Element>* zResult)
+{
+    for (auto i : *elements)
+    {
+        zResult->add(dynamic_cast<XML::Element*>(i->getThis()));
+        i->selectChildren().selectAllElements(zResult);
+    }
+}
+
 //! Gibt einen selector zurück der alle elemente beinhaltet die in diesem
 //! selector vorkommen und rekursiv alle Kinder der elemente Enthält
 Editor Editor::selectAllElements()
 {
     RCArray<Element>* list = new RCArray<Element>();
-    for (auto i : *elements)
-    {
-        list->add(dynamic_cast<XML::Element*>(i->getThis()));
-        for (Element* j : i->selectChildren().selectAllElements())
-        {
-            list->add(dynamic_cast<XML::Element*>(j->getThis()));
-        }
-    }
+    selectAllElements(list);
     return Editor(list);
 }
 

+ 6 - 1
XML.h

@@ -117,7 +117,7 @@ namespace Framework
             DLLEXPORT Text getAttributeValue(int i) const;
             //! gibt den Wert eines Attributes zurück
             //! \param attribut Der Name des Attributes
-            DLLEXPORT Text getAttributeValue(Text attribut) const;
+            DLLEXPORT const Text& getAttributeValue(const Text& attribut) const;
             //! gibt einen iterator zurück mit dem durch alle Attribut Namen
             //! iteriert werden kann
             DLLEXPORT ArrayIterator<Text*> getAttributeNames() const;
@@ -186,6 +186,11 @@ namespace Framework
             DLLEXPORT ArrayIterator<Element*> begin();
             //! Gibt das ende des iterators zurück
             DLLEXPORT ArrayIterator<Element*> end();
+
+        private:
+            DLLEXPORT void selectAllElements(RCArray<Element>* zResult);
+
+        public:
             //! Gibt einen selector zurück der alle elemente beinhaltet die in
             //! diesem selector vorkommen und rekursiv alle Kinder der elemente
             //! Enthält