diff options
author | Brad King <brad.king@kitware.com> | 2022-12-01 12:57:55 (GMT) |
---|---|---|
committer | Kitware Robot <kwrobot@kitware.com> | 2022-12-01 12:58:05 (GMT) |
commit | 907402b147c2c5d207addea8c912d451ed24ff52 (patch) | |
tree | fa557e002d2ca71d4e2df93ee092dba9404e225e /Source/cmStringAlgorithms.cxx | |
parent | 5a415b492bee526d987cbec9785b60106a0700bf (diff) | |
parent | beba50bd61d32ea68acffca67a48bd7e81e6e097 (diff) | |
download | CMake-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.cxx | 18 |
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); } |