mirror of
https://github.com/Kitware/CMake.git
synced 2025-10-14 02:08:27 +08:00
Merge topic 'optimize-cmJoin'
38928ee3ee
cmStringAlgorithms: Add faster cmJoin overloads for strings
Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !5185
This commit is contained in:
@@ -7,6 +7,7 @@
|
|||||||
#include <cstddef> // IWYU pragma: keep
|
#include <cstddef> // IWYU pragma: keep
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
#include <iterator>
|
||||||
|
|
||||||
std::string cmTrimWhitespace(cm::string_view str)
|
std::string cmTrimWhitespace(cm::string_view str)
|
||||||
{
|
{
|
||||||
@@ -323,3 +324,52 @@ bool cmStrToULong(std::string const& str, unsigned long* value)
|
|||||||
{
|
{
|
||||||
return cmStrToULong(str.c_str(), value);
|
return cmStrToULong(str.c_str(), value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename Range>
|
||||||
|
std::size_t getJoinedLength(Range const& rng, cm::string_view separator)
|
||||||
|
{
|
||||||
|
std::size_t rangeLength{};
|
||||||
|
for (auto const& item : rng) {
|
||||||
|
rangeLength += item.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
auto const separatorsLength = (rng.size() - 1) * separator.size();
|
||||||
|
|
||||||
|
return rangeLength + separatorsLength;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Range>
|
||||||
|
std::string cmJoinImpl(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(initial.size() + getJoinedLength(rng, separator));
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string cmJoin(std::vector<std::string> const& rng,
|
||||||
|
cm::string_view separator, cm::string_view initial)
|
||||||
|
{
|
||||||
|
return cmJoinImpl(rng, separator, initial);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string cmJoin(cmStringRange const& rng, cm::string_view separator,
|
||||||
|
cm::string_view initial)
|
||||||
|
{
|
||||||
|
return cmJoinImpl(rng, separator, initial);
|
||||||
|
}
|
||||||
|
@@ -80,6 +80,17 @@ std::string cmJoin(Range const& rng, cm::string_view separator)
|
|||||||
return os.str();
|
return os.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Faster overloads for std::string ranges.
|
||||||
|
* If @a initial is provided, it prepends the resulted string without
|
||||||
|
* @a separator between them.
|
||||||
|
*/
|
||||||
|
std::string cmJoin(std::vector<std::string> const& rng,
|
||||||
|
cm::string_view separator, cm::string_view initial = {});
|
||||||
|
|
||||||
|
std::string cmJoin(cmStringRange const& rng, cm::string_view separator,
|
||||||
|
cm::string_view initial = {});
|
||||||
|
|
||||||
/** Extract tokens that are separated by any of the characters in @a sep. */
|
/** Extract tokens that are separated by any of the characters in @a sep. */
|
||||||
std::vector<std::string> cmTokenize(cm::string_view str, cm::string_view sep);
|
std::vector<std::string> cmTokenize(cm::string_view str, cm::string_view sep);
|
||||||
|
|
||||||
|
@@ -11,6 +11,7 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
#include <cm/iterator>
|
#include <cm/iterator>
|
||||||
|
#include <cm/string_view>
|
||||||
#include <cmext/string_view>
|
#include <cmext/string_view>
|
||||||
|
|
||||||
#include "cmsys/RegularExpression.hxx"
|
#include "cmsys/RegularExpression.hxx"
|
||||||
@@ -534,11 +535,14 @@ bool HandleAppendCommand(std::vector<std::string> const& args,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string& variable = args[1];
|
auto const& variableName = args[1];
|
||||||
|
|
||||||
|
cm::string_view oldView{ status.GetMakefile().GetSafeDefinition(
|
||||||
|
variableName) };
|
||||||
|
|
||||||
|
auto const newValue = cmJoin(cmMakeRange(args).advance(2), {}, oldView);
|
||||||
|
status.GetMakefile().AddDefinition(variableName, newValue);
|
||||||
|
|
||||||
std::string value = status.GetMakefile().GetSafeDefinition(variable);
|
|
||||||
value += cmJoin(cmMakeRange(args).advance(2), std::string());
|
|
||||||
status.GetMakefile().AddDefinition(variable, value);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user