aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvadim-xd <vadim-xd@yandex-team.com>2024-04-24 13:25:19 +0300
committervadim-xd <vadim-xd@yandex-team.com>2024-04-24 13:39:57 +0300
commitbbed856c22afd405647fc7f687e0f883f72a9bb4 (patch)
tree2262491f9465acf48ff6d123431331ff67695fb7
parent45ae70c23d0d732b2275a4bda5ab3f59afb29d83 (diff)
downloadydb-bbed856c22afd405647fc7f687e0f883f72a9bb4.tar.gz
Construct TStringBufs in TString::Join earlier
d1c15e5770c2a6a72226f3c4c76810231e4f9fe3
-rw-r--r--util/generic/string.h18
1 files changed, 13 insertions, 5 deletions
diff --git a/util/generic/string.h b/util/generic/string.h
index b03b7f7625..fe4be818cc 100644
--- a/util/generic/string.h
+++ b/util/generic/string.h
@@ -534,6 +534,9 @@ public:
}
private:
+ template <typename T>
+ using TJoinParam = std::conditional_t<std::is_same_v<T, TCharType>, TCharType, TBasicStringBuf<TCharType, TTraits>>;
+
template <typename... R>
static size_t SumLength(const TBasicStringBuf<TCharType, TTraits> s1, const R&... r) noexcept {
return s1.size() + SumLength(r...);
@@ -563,6 +566,15 @@ private:
static void CopyAll(TCharType*) noexcept {
}
+ template <typename... R>
+ static inline TBasicString JoinImpl(const R&... r) {
+ TBasicString s{TUninitialized{SumLength(r...)}};
+
+ TBasicString::CopyAll((TCharType*)s.data(), r...);
+
+ return s;
+ }
+
public:
Y_REINITIALIZES_OBJECT inline void clear() noexcept {
#ifdef TSTRING_IS_STD_STRING
@@ -580,11 +592,7 @@ public:
template <typename... R>
static inline TBasicString Join(const R&... r) {
- TBasicString s{TUninitialized{SumLength(r...)}};
-
- TBasicString::CopyAll((TCharType*)s.data(), r...);
-
- return s;
+ return JoinImpl(TJoinParam<R>(r)...);
}
// ~~~ Assignment ~~~ : FAMILY0(TBasicString&, assign);