Browse Source

cmListCommand: Use cmRemoveIndices for REMOVE_AT subcommand.

Avoid repeatedly looping over the indices to process elements (even
without breaking out of the loop when the element is found).
Stephen Kelly 11 years ago
parent
commit
6a22e40147
1 changed files with 9 additions and 16 deletions
  1. 9 16
      Source/cmListCommand.cxx

+ 9 - 16
Source/cmListCommand.cxx

@@ -527,26 +527,19 @@ bool cmListCommand::HandleRemoveAtCommand(
     removed.push_back(static_cast<size_t>(item));
     }
 
+  std::sort(removed.begin(), removed.end());
+  removed.erase(std::unique(removed.begin(), removed.end()), removed.end());
+
+  varArgsExpanded.erase(cmRemoveIndices(varArgsExpanded, removed),
+                        varArgsExpanded.end());
+
   std::string value;
   const char* sep = "";
   for ( cc = 0; cc < varArgsExpanded.size(); ++ cc )
     {
-    size_t kk;
-    bool found = false;
-    for ( kk = 0; kk < removed.size(); ++ kk )
-      {
-      if ( cc == removed[kk] )
-        {
-        found = true;
-        }
-      }
-
-    if ( !found )
-      {
-      value += sep;
-      value += varArgsExpanded[cc];
-      sep = ";";
-      }
+    value += sep;
+    value += varArgsExpanded[cc];
+    sep = ";";
     }
 
   this->Makefile->AddDefinition(listName, value.c_str());