summaryrefslogtreecommitdiffstats
path: root/Source/cmStringAlgorithms.cxx
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2022-12-01 12:57:55 (GMT)
committerKitware Robot <kwrobot@kitware.com>2022-12-01 12:58:05 (GMT)
commit907402b147c2c5d207addea8c912d451ed24ff52 (patch)
treefa557e002d2ca71d4e2df93ee092dba9404e225e /Source/cmStringAlgorithms.cxx
parent5a415b492bee526d987cbec9785b60106a0700bf (diff)
parentbeba50bd61d32ea68acffca67a48bd7e81e6e097 (diff)
downloadCMake-907402b147c2c5d207addea8c912d451ed24ff52.zip
CMake-907402b147c2c5d207addea8c912d451ed24ff52.tar.gz
CMake-907402b147c2c5d207addea8c912d451ed24ff52.tar.bz2
Merge topic 'cmstrcat-move-first-arg'
beba50bd61 cmStrCat(): optimize when first argument is an rvalue string d6f2a7ab4b cmStringCommand: remove use of cmCatViews() Acked-by: Kitware Robot <kwrobot@kitware.com> Tested-by: buildbot <buildbot@kitware.com> Merge-request: !7969
Diffstat (limited to 'Source/cmStringAlgorithms.cxx')
-rw-r--r--Source/cmStringAlgorithms.cxx18
1 files changed, 13 insertions, 5 deletions
diff --git a/Source/cmStringAlgorithms.cxx b/Source/cmStringAlgorithms.cxx
index f73c854..e559cfa 100644
--- a/Source/cmStringAlgorithms.cxx
+++ b/Source/cmStringAlgorithms.cxx
@@ -203,15 +203,23 @@ cmAlphaNum::cmAlphaNum(double val)
MakeDigits(this->View_, this->Digits_, "%g", val);
}
-std::string cmCatViews(std::initializer_list<cm::string_view> views)
+std::string cmCatViews(cm::optional<std::string>&& first,
+ std::initializer_list<cm::string_view> views)
{
- std::size_t total_size = 0;
+ std::size_t totalSize = 0;
for (cm::string_view const& view : views) {
- total_size += view.size();
+ totalSize += view.size();
}
- std::string result(total_size, '\0');
- std::string::iterator sit = result.begin();
+ std::string result;
+ std::string::size_type initialLen = 0;
+ if (first) {
+ totalSize += first->length();
+ initialLen = first->length();
+ result = std::move(*first);
+ }
+ result.resize(totalSize);
+ std::string::iterator sit = result.begin() + initialLen;
for (cm::string_view const& view : views) {
sit = std::copy_n(view.data(), view.size(), sit);
}