mirror of
https://github.com/Kitware/CMake.git
synced 2025-10-15 03:48:02 +08:00
cmStringAlgorithms: Move generic strings join function to public API
Move `cmJoinImpl` from `cmStringAlgorithms.cxx` to the `cmStringAlgorithms.h` as `cmJoinStrings`. Two existing overloads are not suitable for reverse iterators due to the hardcoded type of the first parameter. The signature is similar to the generic (template) `cmJoin`. With `enable_if` "magic", `cmJoinString` could be renamed to `cmJoin` in the future. Also, replace `getJoinedLength` with `std::accumulate`.
This commit is contained in:
@@ -7,6 +7,8 @@
|
||||
#include <cctype>
|
||||
#include <cstring>
|
||||
#include <initializer_list>
|
||||
#include <iterator>
|
||||
#include <numeric>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
@@ -77,6 +79,38 @@ std::string cmJoin(Range const& rng, cm::string_view separator)
|
||||
return os.str();
|
||||
}
|
||||
|
||||
/** Generic function to join strings range with separator
|
||||
* and initial leading string into a single string.
|
||||
*/
|
||||
template <typename Range>
|
||||
std::string cmJoinStrings(Range const& rng, cm::string_view separator,
|
||||
cm::string_view initial)
|
||||
{
|
||||
if (rng.empty()) {
|
||||
return { std::begin(initial), std::end(initial) };
|
||||
}
|
||||
|
||||
std::string result;
|
||||
result.reserve(
|
||||
std::accumulate(std::begin(rng), std::end(rng),
|
||||
initial.size() + (rng.size() - 1) * separator.size(),
|
||||
[](std::size_t sum, const std::string& item) {
|
||||
return sum + item.size();
|
||||
}));
|
||||
result.append(std::begin(initial), std::end(initial));
|
||||
|
||||
auto begin = std::begin(rng);
|
||||
auto end = std::end(rng);
|
||||
result += *begin;
|
||||
|
||||
for (++begin; begin != end; ++begin) {
|
||||
result.append(std::begin(separator), std::end(separator));
|
||||
result += *begin;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Faster overloads for std::string ranges.
|
||||
* If @a initial is provided, it prepends the resulted string without
|
||||
|
Reference in New Issue
Block a user