Переглянути джерело

Replace string copy by using pure iterators.

Kim Kulling 1 місяць тому
батько
коміт
f7d2de1efc
2 змінених файлів з 39 додано та 27 видалено
  1. 31 21
      code/AssetLib/Obj/ObjFileParser.cpp
  2. 8 6
      code/AssetLib/Obj/ObjTools.h

+ 31 - 21
code/AssetLib/Obj/ObjFileParser.cpp

@@ -140,9 +140,11 @@ void ObjFileParser::parseFile(IOStreamBuffer<char> &streamBuffer) {
         if (insideCstype) {
             switch (*m_DataIt) {
             case 'e': {
-                std::string name;
-                getNameNoSpace(m_DataIt, m_DataItEnd, name);
-                insideCstype = name != "end";
+                char *name{nullptr};
+                size_t len{0};
+                getNameNoSpace(m_DataIt, m_DataItEnd, &name, len);
+                //insideCstype = name != "end";
+                insideCstype = strncmp(name, "end", len)  == 0;
             } break;
             }
             goto pf_skip_line;
@@ -198,32 +200,37 @@ void ObjFileParser::parseFile(IOStreamBuffer<char> &streamBuffer) {
 
         case 'u': // Parse a material desc. setter
         {
-            std::string name;
+            //std::string name;
+            char *name{nullptr};
+            size_t len{ 0 };
+            getNameNoSpace(m_DataIt, m_DataItEnd, &name, len);
 
-            getNameNoSpace(m_DataIt, m_DataItEnd, name);
+            //size_t nextSpace = name.find(' ');
+            //if (nextSpace != std::string::npos)
+            //    name = name.substr(0, nextSpace);
 
-            size_t nextSpace = name.find(' ');
-            if (nextSpace != std::string::npos)
-                name = name.substr(0, nextSpace);
-
-            if (name == "usemtl") {
+            //if (name == "usemtl") {
+            if (strncmp(name, "usemtl", len) == 0) {
                 getMaterialDesc();
             }
         } break;
 
         case 'm': // Parse a material library or merging group ('mg')
         {
-            std::string name;
-
-            getNameNoSpace(m_DataIt, m_DataItEnd, name);
+//            std::string name;
+            char *name{nullptr};
+            size_t len{ 0 };
+            getNameNoSpace(m_DataIt, m_DataItEnd, &name, len);
 
-            size_t nextSpace = name.find(' ');
-            if (nextSpace != std::string::npos)
-                name = name.substr(0, nextSpace);
+            //size_t nextSpace = name.find(' ');
+            //if (nextSpace != std::string::npos)
+            //  name = name.substr(0, nextSpace);
 
-            if (name == "mg")
+            if (strncmp(name, "mg", len) == 0)
+            //if (name == "mg")
                 getGroupNumberAndResolution();
-            else if (name == "mtllib")
+            //else if (name == "mtllib")
+            else if (strncmp(name, "mtllib", len) == 0)
                 getMaterialLib();
             else
                 goto pf_skip_line;
@@ -246,9 +253,12 @@ void ObjFileParser::parseFile(IOStreamBuffer<char> &streamBuffer) {
 
         case 'c': // handle cstype section start
         {
-            std::string name;
-            getNameNoSpace(m_DataIt, m_DataItEnd, name);
-            insideCstype = name == "cstype";
+            //std::string name;
+            char *name{nullptr};
+            size_t len{0};
+            getNameNoSpace(m_DataIt, m_DataItEnd, &name, len);
+            //insideCstype = name == "cstype";
+            insideCstype = strncmp(name, "cstype", len) == 0;
             goto pf_skip_line;
         }
 

+ 8 - 6
code/AssetLib/Obj/ObjTools.h

@@ -177,8 +177,9 @@ inline char_t getName(char_t it, char_t end, std::string &name) {
  *  @return Current-iterator with new position
  */
 template <class char_t>
-inline char_t getNameNoSpace(char_t it, char_t end, std::string &name) {
-    name = "";
+inline char_t getNameNoSpace(char_t it, char_t end, char **name, size_t &len) {
+    *name = nullptr;
+    len = 0;
     if (isEndOfBuffer(it, end)) {
         return end;
     }
@@ -186,22 +187,23 @@ inline char_t getNameNoSpace(char_t it, char_t end, std::string &name) {
     char *pStart = &(*it);
     while (!isEndOfBuffer(it, end) && !IsLineEnd(*it) && !IsSpaceOrNewLine(*it)) {
         ++it;
+        ++len;
     }
 
     while (isEndOfBuffer(it, end) || IsLineEnd(*it) || IsSpaceOrNewLine(*it)) {
         --it;
+        --len;
     }
     ++it;
+    ++len;
 
     // Get name
     // if there is no name, and the previous char is a separator, come back to start
     while (&(*it) < pStart) {
         ++it;
+        ++len;
     }
-    std::string strName(pStart, &(*it));
-    if (!strName.empty()) {
-        name = strName;
-    }
+    *name = pStart;
 
     return it;
 }