diff options
author | Brad King <brad.king@kitware.com> | 2023-08-08 13:18:46 (GMT) |
---|---|---|
committer | Kitware Robot <kwrobot@kitware.com> | 2023-08-08 13:39:05 (GMT) |
commit | 1b42365bb348eedd3d99a4a75bd9ac506850749e (patch) | |
tree | fd78e4dc5d420f4cd6363808c6cd06dedf52edcb /Source | |
parent | ed0450ed8ae6dda69301dbd3be50b9c82e28827b (diff) | |
parent | ee5edf77dbb23470b5641b0973ac384a4e38848b (diff) | |
download | CMake-1b42365bb348eedd3d99a4a75bd9ac506850749e.zip CMake-1b42365bb348eedd3d99a4a75bd9ac506850749e.tar.gz CMake-1b42365bb348eedd3d99a4a75bd9ac506850749e.tar.bz2 |
Merge topic 'cmList-append-regression'
ee5edf77db Merge branch 'backport-3.27-cmList-append-regression' into cmList-append-regression
a9a34edc82 cmList: Fix performance regression in append/prepend
7f9f96151a cmList: Fix performance regression in append/prepend
Acked-by: Kitware Robot <kwrobot@kitware.com>
Acked-by: buildbot <buildbot@kitware.com>
Merge-request: !8684
Diffstat (limited to 'Source')
-rw-r--r-- | Source/cmList.cxx | 16 | ||||
-rw-r--r-- | Source/cmList.h | 38 |
2 files changed, 32 insertions, 22 deletions
diff --git a/Source/cmList.cxx b/Source/cmList.cxx index 3835e59..939fbb5 100644 --- a/Source/cmList.cxx +++ b/Source/cmList.cxx @@ -803,27 +803,35 @@ cmList& cmList::transform(TransformAction action, return *this; } -std::string& cmList::append(std::string& list, cm::string_view value) +std::string& cmList::append(std::string& list, std::string&& value) { if (list.empty()) { - list = std::string(value); + list = std::move(value); } else { list += cmStrCat(cmList::element_separator, value); } return list; } +std::string& cmList::append(std::string& list, cm::string_view value) +{ + return cmList::append(list, std::string{ value }); +} -std::string& cmList::prepend(std::string& list, cm::string_view value) +std::string& cmList::prepend(std::string& list, std::string&& value) { if (list.empty()) { - list = std::string(value); + list = std::move(value); } else { list.insert(0, cmStrCat(value, cmList::element_separator)); } return list; } +std::string& cmList::prepend(std::string& list, cm::string_view value) +{ + return cmList::prepend(list, std::string{ value }); +} cmList::size_type cmList::ComputeIndex(index_type pos, bool boundCheck) const { diff --git a/Source/cmList.h b/Source/cmList.h index dc5850a..2667586 100644 --- a/Source/cmList.h +++ b/Source/cmList.h @@ -10,7 +10,6 @@ #include <initializer_list> #include <iterator> #include <memory> -#include <numeric> #include <stdexcept> #include <string> #include <utility> @@ -1086,6 +1085,7 @@ public: // but without any intermediate expansion. So the operation is simply a // string concatenation with special handling for the CMake list item // separator + static std::string& append(std::string& list, std::string&& value); static std::string& append(std::string& list, cm::string_view value); template <typename InputIterator> static std::string& append(std::string& list, InputIterator first, @@ -1095,15 +1095,11 @@ public: return list; } - return cmList::append(list, - cm::string_view{ std::accumulate( - std::next(first), last, *first, - [](const std::string& a, const std::string& b) { - return a + - std::string(cmList::element_separator) + b; - }) }); + return cmList::append( + list, cmList::Join(first, last, cmList::element_separator)); } + static std::string& prepend(std::string& list, std::string&& value); static std::string& prepend(std::string& list, cm::string_view value); template <typename InputIterator> static std::string& prepend(std::string& list, InputIterator first, @@ -1113,13 +1109,8 @@ public: return list; } - return cmList::prepend(list, - cm::string_view{ std::accumulate( - std::next(first), last, *first, - [](std::string a, const std::string& b) { - return std::move(a) + - std::string(cmList::element_separator) + b; - }) }); + return cmList::prepend( + list, cmList::Join(first, last, cmList::element_separator)); } template <typename Range, @@ -1209,11 +1200,22 @@ private: return std::string{}; } + return cmList::Join(std::begin(r), std::end(r), glue); + } + template <typename InputIterator> + static std::string Join(InputIterator first, InputIterator last, + cm::string_view glue) + { + if (first == last) { + return std::string{}; + } + const auto sep = std::string{ glue }; - std::string joined = cmList::ToString(*std::begin(r)); - for (auto it = std::next(std::begin(r)); it != std::end(r); ++it) { - joined += sep + cmList::ToString(*it); + std::string joined = cmList::ToString(*first); + for (auto it = std::next(first); it != last; ++it) { + joined += sep; + joined += cmList::ToString(*it); } return joined; |