diff options
author | vadim-xd <vadim-xd@yandex-team.com> | 2024-04-24 13:25:19 +0300 |
---|---|---|
committer | vadim-xd <vadim-xd@yandex-team.com> | 2024-04-24 13:39:57 +0300 |
commit | bbed856c22afd405647fc7f687e0f883f72a9bb4 (patch) | |
tree | 2262491f9465acf48ff6d123431331ff67695fb7 | |
parent | 45ae70c23d0d732b2275a4bda5ab3f59afb29d83 (diff) | |
download | ydb-bbed856c22afd405647fc7f687e0f883f72a9bb4.tar.gz |
Construct TStringBufs in TString::Join earlier
d1c15e5770c2a6a72226f3c4c76810231e4f9fe3
-rw-r--r-- | util/generic/string.h | 18 |
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); |