summaryrefslogtreecommitdiffstats
path: root/library/cpp
diff options
context:
space:
mode:
authorvadim-xd <[email protected]>2026-05-19 10:43:11 +0300
committervadim-xd <[email protected]>2026-05-19 11:24:01 +0300
commit01de5d42afdaae5348a2ca2e9f47bdf038d29b11 (patch)
treea190869e9a836d4be518b1869a29bea970461c17 /library/cpp
parentfc5b2b4628c15b8189e99c3b45e27c6aaa02c6cf (diff)
Add Concat for arbitrary string types
commit_hash:b9f1c87173a18fb59f8cf684191efd4436dd6012
Diffstat (limited to 'library/cpp')
-rw-r--r--library/cpp/containers/cow_string/cow_string.h40
1 files changed, 4 insertions, 36 deletions
diff --git a/library/cpp/containers/cow_string/cow_string.h b/library/cpp/containers/cow_string/cow_string.h
index 0ffea0ac2bf..34dcff81e8a 100644
--- a/library/cpp/containers/cow_string/cow_string.h
+++ b/library/cpp/containers/cow_string/cow_string.h
@@ -321,44 +321,12 @@ 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...);
- }
-
- template <typename... R>
- static size_t SumLength(const TCharType /*s1*/, const R&... r) noexcept {
- return 1 + SumLength(r...);
- }
-
- static constexpr size_t SumLength() noexcept {
- return 0;
- }
-
- template <typename... R>
- static void CopyAll(TCharType* p, const TBasicStringBuf<TCharType, TTraits> s, const R&... r) {
- TTraits::copy(p, s.data(), s.size());
- CopyAll(p + s.size(), r...);
- }
-
- template <typename... R, class TNextCharType, typename = std::enable_if_t<std::is_same<TCharType, TNextCharType>::value>>
- static void CopyAll(TCharType* p, const TNextCharType s, const R&... r) {
- p[0] = s;
- CopyAll(p + 1, r...);
- }
-
- static void CopyAll(TCharType*) noexcept {
- }
+ using TJoinHelper = TStringJoinHelper<TCharType, TTraits>;
template <typename... R>
static inline TBasicCowString JoinImpl(const R&... r) {
- TBasicCowString s{TUninitialized{SumLength(r...)}};
-
- TBasicCowString::CopyAll((TCharType*)s.data(), r...);
-
+ TBasicCowString s{TUninitialized{TJoinHelper::SumLength(r...)}};
+ TJoinHelper::CopyAll((TCharType*)s.data(), r...);
return s;
}
@@ -375,7 +343,7 @@ public:
template <typename... R>
static inline TBasicCowString Join(const R&... r) {
- return JoinImpl(TJoinParam<R>(r)...);
+ return JoinImpl(typename TJoinHelper::template TJoinParam<R>(r)...);
}
// ~~~ Assignment ~~~ : FAMILY0(TBasicCowString&, assign);