|
|
@@ -12,7 +12,6 @@
|
|
|
#include <utility>
|
|
|
#include <vector>
|
|
|
|
|
|
-#include <cm/optional>
|
|
|
#include <cm/string_view>
|
|
|
|
|
|
#include "cmRange.h"
|
|
|
@@ -147,8 +146,8 @@ std::vector<std::string> cmExpandedLists(InputIt first, InputIt last)
|
|
|
}
|
|
|
|
|
|
/** Concatenate string pieces into a single string. */
|
|
|
-std::string cmCatViews(cm::optional<std::string>&& first,
|
|
|
- std::initializer_list<cm::string_view> views);
|
|
|
+std::string cmCatViews(
|
|
|
+ std::initializer_list<std::pair<cm::string_view, std::string*>> views);
|
|
|
|
|
|
/** Utility class for cmStrCat. */
|
|
|
class cmAlphaNum
|
|
|
@@ -162,6 +161,10 @@ public:
|
|
|
: View_(str)
|
|
|
{
|
|
|
}
|
|
|
+ cmAlphaNum(std::string&& str)
|
|
|
+ : RValueString_(&str)
|
|
|
+ {
|
|
|
+ }
|
|
|
cmAlphaNum(const char* str)
|
|
|
: View_(str)
|
|
|
{
|
|
|
@@ -184,45 +187,34 @@ public:
|
|
|
{
|
|
|
}
|
|
|
|
|
|
- cm::string_view View() const { return this->View_; }
|
|
|
+ cm::string_view View() const
|
|
|
+ {
|
|
|
+ if (this->RValueString_) {
|
|
|
+ return *this->RValueString_;
|
|
|
+ }
|
|
|
+ return this->View_;
|
|
|
+ }
|
|
|
+
|
|
|
+ std::string* RValueString() const { return this->RValueString_; }
|
|
|
|
|
|
private:
|
|
|
+ std::string* RValueString_ = nullptr;
|
|
|
cm::string_view View_;
|
|
|
char Digits_[32];
|
|
|
};
|
|
|
|
|
|
-template <typename A, typename B, typename... AV>
|
|
|
-class cmStrCatHelper
|
|
|
-{
|
|
|
-public:
|
|
|
- static std::string Compute(cmAlphaNum const& a, cmAlphaNum const& b,
|
|
|
- AV const&... args)
|
|
|
- {
|
|
|
- return cmCatViews(
|
|
|
- cm::nullopt,
|
|
|
- { a.View(), b.View(), static_cast<cmAlphaNum const&>(args).View()... });
|
|
|
- }
|
|
|
-};
|
|
|
-
|
|
|
-template <typename B, typename... AV>
|
|
|
-class cmStrCatHelper<std::string, B, AV...>
|
|
|
-{
|
|
|
-public:
|
|
|
- static std::string Compute(std::string&& a, cmAlphaNum const& b,
|
|
|
- AV const&... args)
|
|
|
- {
|
|
|
- return cmCatViews(
|
|
|
- std::move(a),
|
|
|
- { b.View(), static_cast<cmAlphaNum const&>(args).View()... });
|
|
|
- }
|
|
|
-};
|
|
|
-
|
|
|
/** Concatenate string pieces and numbers into a single string. */
|
|
|
template <typename A, typename B, typename... AV>
|
|
|
inline std::string cmStrCat(A&& a, B&& b, AV&&... args)
|
|
|
{
|
|
|
- return cmStrCatHelper<A, B, AV...>::Compute(
|
|
|
- std::forward<A>(a), std::forward<B>(b), std::forward<AV>(args)...);
|
|
|
+ static auto const makePair =
|
|
|
+ [](const cmAlphaNum& arg) -> std::pair<cm::string_view, std::string*> {
|
|
|
+ return { arg.View(), arg.RValueString() };
|
|
|
+ };
|
|
|
+
|
|
|
+ return cmCatViews({ makePair(std::forward<A>(a)),
|
|
|
+ makePair(std::forward<B>(b)),
|
|
|
+ makePair(std::forward<AV>(args))... });
|
|
|
}
|
|
|
|
|
|
/** Joins wrapped elements of a range with separator into a single string. */
|
|
|
@@ -233,10 +225,13 @@ std::string cmWrap(cm::string_view prefix, Range const& rng,
|
|
|
if (rng.empty()) {
|
|
|
return std::string();
|
|
|
}
|
|
|
- return cmCatViews(
|
|
|
- cm::nullopt,
|
|
|
- { prefix, cmJoin(rng, cmCatViews(cm::nullopt, { suffix, sep, prefix })),
|
|
|
- suffix });
|
|
|
+ return cmCatViews({ { prefix, nullptr },
|
|
|
+ { cmJoin(rng,
|
|
|
+ cmCatViews({ { suffix, nullptr },
|
|
|
+ { sep, nullptr },
|
|
|
+ { prefix, nullptr } })),
|
|
|
+ nullptr },
|
|
|
+ { suffix, nullptr } });
|
|
|
}
|
|
|
|
|
|
/** Joins wrapped elements of a range with separator into a single string. */
|