]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Avoid 'std::string::find' for performance reasons.
authorDavid Wells <wellsd2@rpi.edu>
Tue, 3 Jan 2017 17:06:06 +0000 (12:06 -0500)
committerDavid Wells <wellsd2@rpi.edu>
Wed, 4 Jan 2017 00:54:48 +0000 (19:54 -0500)
This was caught by cppcheck.

cmake/scripts/expand_instantiations.cc
source/base/parameter_handler.cc

index 01f114359649584a08b7382f6907040119583b28..855b9d6a2de3b89b5d8d69d5ab012c9026b0fdb7 100644 (file)
@@ -44,6 +44,7 @@
 // Author: Wolfgang Bangerth, 2007
 
 
+#include <algorithm>
 #include <iostream>
 #include <fstream>
 #include <map>
@@ -61,6 +62,16 @@ std::map<std::string, std::list<std::string> >  expansion_lists;
 
 /* ======================== auxiliary functions ================= */
 
+// Return whether or not one string starts with a given prefix
+bool
+has_prefix(const std::string &base, const std::string &prefix)
+{
+  if (prefix.size() > base.size())
+    return false;
+  else
+    return std::equal(prefix.begin(), prefix.end(), base.begin());
+}
+
 
 // replace all occurrences of 'pattern' by 'substitute' in 'in', and
 // return the result
@@ -297,14 +308,14 @@ void read_expansion_lists (const std::string &filename)
       name = get_substring_with_delim (whole_file, " :");
 
       skip_space (whole_file);
-      if (whole_file.find (":=") != 0)
+      if (!has_prefix(whole_file, ":="))
         {
           std::cerr << "Invalid entry <" << name << '>' << std::endl;
           std::exit (1);
         }
       whole_file.erase (0, 2);
       skip_space (whole_file);
-      if (whole_file.find ("{") != 0)
+      if (whole_file[0] != '{')
         {
           std::cerr << "Invalid entry <" << name << '>' << std::endl;
           std::exit (1);
@@ -315,7 +326,7 @@ void read_expansion_lists (const std::string &filename)
       std::string
       expansion = get_substring_with_delim (whole_file, "}");
 
-      if (whole_file.find ("}") != 0)
+      if (whole_file[0] != '}')
         {
           std::cerr << "Invalid entry <" << name << '>' << std::endl;
           std::exit (1);
@@ -416,14 +427,14 @@ void process_instantiations ()
   while (whole_file.size() != 0)
     {
       skip_space (whole_file);
-      if (whole_file.find ("for") != 0)
+      if (!has_prefix(whole_file, "for"))
         {
           std::cerr << "Invalid instantiation list: missing 'for'" << std::endl;
           std::exit (1);
         }
       whole_file.erase (0, 3);
       skip_space (whole_file);
-      if (whole_file.find ("(") != 0)
+      if (whole_file[0] != '(')
         {
           std::cerr << "Invalid instantiation list: missing '('" << std::endl;
           std::exit (1);
@@ -436,7 +447,7 @@ void process_instantiations ()
         = split_string_list (get_substring_with_delim (whole_file,
                                                        ")"),
                              ';');
-      if (whole_file.find (")") != 0)
+      if (whole_file[0] != ')')
         {
           std::cerr << "Invalid instantiation list: missing ')'" << std::endl;
           std::exit (1);
@@ -471,7 +482,7 @@ void process_instantiations ()
 
       // now read the part in {...}
       skip_space (whole_file);
-      if (whole_file.find ("{") != 0)
+      if (whole_file[0] != '{')
         {
           std::cerr << "Invalid substitution text" << std::endl;
           std::exit (1);
index b7bc4f21da8a99fba2a6971c222012ef42fe0b4f..c507aeefc2dcae821ef01d46f54962120e7654e9 100644 (file)
@@ -2918,8 +2918,8 @@ ParameterHandler::scan_line (std::string         line,
       return;
     }
   // enter subsection
-  else if ((line.find ("SUBSECTION ") == 0) ||
-           (line.find ("subsection ") == 0))
+  else if (Utilities::match_at_string_start(line, "SUBSECTION ") ||
+           Utilities::match_at_string_start(line, "subsection "))
     {
       // delete this prefix
       line.erase (0, std::string("subsection").length()+1);
@@ -2936,8 +2936,8 @@ ParameterHandler::scan_line (std::string         line,
       subsection_path.push_back (subsection);
     }
   // exit subsection
-  else if ((line.find ("END") == 0) ||
-           (line.find ("end") == 0))
+  else if (Utilities::match_at_string_start(line, "END") ||
+           Utilities::match_at_string_start(line, "end"))
     {
       line.erase (0, 3);
       while ((line.size() > 0) && (std::isspace(line[0])))
@@ -2954,8 +2954,8 @@ ParameterHandler::scan_line (std::string         line,
       leave_subsection ();
     }
   // regular entry
-  else if ((line.find ("SET ") == 0) ||
-           (line.find ("set ") == 0))
+  else if (Utilities::match_at_string_start(line, "SET ") ||
+           Utilities::match_at_string_start(line, "set "))
     {
       // erase "set" statement
       line.erase (0, 4);
@@ -3022,8 +3022,8 @@ ParameterHandler::scan_line (std::string         line,
         }
     }
   // an include statement?
-  else if ((line.find ("INCLUDE ") == 0) ||
-           (line.find ("include ") == 0))
+  else if (Utilities::match_at_string_start(line, "include ") ||
+           Utilities::match_at_string_start(line, "INCLUDE "))
     {
       // erase "include " statement and eliminate spaces
       line.erase (0, 7);

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.