summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2023-08-08 13:18:46 (GMT)
committerKitware Robot <kwrobot@kitware.com>2023-08-08 13:39:05 (GMT)
commit1b42365bb348eedd3d99a4a75bd9ac506850749e (patch)
treefd78e4dc5d420f4cd6363808c6cd06dedf52edcb /Source
parented0450ed8ae6dda69301dbd3be50b9c82e28827b (diff)
parentee5edf77dbb23470b5641b0973ac384a4e38848b (diff)
downloadCMake-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.cxx16
-rw-r--r--Source/cmList.h38
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;