Skip to content

Add cmSystemTools::ExpandedLists and cmSystemTools::ExpandedListArgument methods

Changes

In cmSystemTools this

  • renames the method ExpandList to ExpandLists and makes it iterator based

and adds the methods

  • std::vector<std::string> ExpandedLists(InputIt first, InputIt last)
  • std::vector<std::string> ExpandedListArgument(const std::string& arg, bool emptyArgs)

Both return the std::vector<std::string> instead of taking a return vector reference like cmSystemTools::ExpandLists and cmSystemTools::ExpandListArgument.

Motivation

Since C++17 return value optimization is mandatory, so returning a std:vector<std::string> from a function should be (at least) as fast as passing a return vector reference to the function.

The new methods can replace cmSystemTools::ExpandLists and cmSystemTools::ExpandListArgument in many cases which leads to shorter and simpler syntax.

E.g. the commonly used pattern

  if (const char* value = X->GetProperty("A_KEY_STRING")) {
    std::vector<std::string> valuesList;
    cmSystemTools::ExpandListArgument(value, valuesList);
    for (std::string const& i : valuesList) {
      doSomething(i);
    }
  }

becomes

  if (const char* value = X->GetProperty("A_KEY_STRING")) {
    for (std::string const& i :
      cmSystemTools::ExpandedListArgument(value)) {
      doSomething(i);
    }
  }
Edited by Sebastian Holtermann

Merge request reports