Skip to content
  • Sebastian Holtermann's avatar
    cmSystemTools: Add ExpandedListArgument and ExpandedLists methods · cdff7f4e
    Sebastian Holtermann authored
    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);
        }
      }
    ```
    cdff7f4e