diff options
author | alexvru <alexvru@ydb.tech> | 2023-07-12 11:13:51 +0300 |
---|---|---|
committer | alexvru <alexvru@ydb.tech> | 2023-07-12 11:13:51 +0300 |
commit | 805223580f2054e7d21ff57cb6119d992c6e1af9 (patch) | |
tree | d0c03c9b74e5bc56d5be7597cb38bd67805972ef /library/cpp | |
parent | f15a5a2053e3c943171d08dc844a6117b1716c2d (diff) | |
download | ydb-805223580f2054e7d21ff57cb6119d992c6e1af9.tar.gz |
Switch to TRope reply in TEvGet query result KIKIMR-18394
Diffstat (limited to 'library/cpp')
-rw-r--r-- | library/cpp/actors/util/rc_buf.h | 90 | ||||
-rw-r--r-- | library/cpp/actors/util/rope.h | 19 |
2 files changed, 48 insertions, 61 deletions
diff --git a/library/cpp/actors/util/rc_buf.h b/library/cpp/actors/util/rc_buf.h index 60d0ef904a..11a09f5b9a 100644 --- a/library/cpp/actors/util/rc_buf.h +++ b/library/cpp/actors/util/rc_buf.h @@ -446,14 +446,12 @@ class TRcBuf { } return Visit(Owner, [](EType, auto& value) -> TContiguousSpan { using T = std::decay_t<decltype(value)>; - if constexpr (std::is_same_v<T, TString>) { - return {&(*value.cbegin()), value.size()}; - } else if constexpr (std::is_same_v<T, NActors::TSharedData> || std::is_same_v<T, TInternalBackend>) { + if constexpr (std::is_same_v<T, TString> || std::is_same_v<T, NActors::TSharedData> || std::is_same_v<T, TInternalBackend>) { return {value.data(), value.size()}; } else if constexpr (std::is_same_v<T, IContiguousChunk::TPtr>) { return value->GetData(); } else { - return {}; + static_assert(TDependentFalse<T>, "unexpected type"); } }); } @@ -479,7 +477,7 @@ class TRcBuf { } else if constexpr (std::is_same_v<T, IContiguousChunk::TPtr>) { return value->GetDataMut(); } else { - return {}; + static_assert(TDependentFalse<T>, "unexpected type"); } }); } @@ -497,7 +495,7 @@ class TRcBuf { } else if constexpr (std::is_same_v<T, IContiguousChunk::TPtr>) { return value->UnsafeGetDataMut(); } else { - return {}; + static_assert(TDependentFalse<T>, "unexpected type"); } }); } @@ -515,7 +513,7 @@ class TRcBuf { } else if constexpr (std::is_same_v<T, IContiguousChunk::TPtr>) { return value->GetOccupiedMemorySize(); } else { - Y_FAIL(); + static_assert(TDependentFalse<T>, "unexpected type"); } }); } @@ -582,28 +580,26 @@ class TRcBuf { return false; } - template <class TResult> - TResult GetRaw() const { + template <typename TResult, typename TCallback> + std::invoke_result_t<TCallback, const TResult*> ApplySpecificValue(TCallback&& callback) const { + static_assert(std::is_same_v<TResult, TString> || + std::is_same_v<TResult, NActors::TSharedData> || + std::is_same_v<TResult, TInternalBackend> || + std::is_same_v<TResult, IContiguousChunk::TPtr>); + if (!Owner) { - return TResult{}; + return callback(nullptr); } - return Visit(Owner, [](EType, auto& value) { + return Visit(Owner, [&](EType, auto& value) { using T = std::decay_t<decltype(value)>; if constexpr (std::is_same_v<T, TResult>) { - return value; + return callback(&value); } else { - Y_FAIL(); - return TResult{}; // unreachable + return callback(nullptr); } }); } - NActors::TSharedData GetRawTrimmed(size_t size) const { - NActors::TSharedData result = GetRaw<NActors::TSharedData>(); - result.TrimBack(size); - return result; - } - explicit operator bool() const { return static_cast<bool>(Owner); } @@ -845,28 +841,6 @@ public: return Backend.ContainsNativeType<TType>(); } - template <class TResult> - TResult GetRaw() const { - return Backend.GetRaw<TResult>(); - } - - NActors::TSharedData GetRawTrimmed(size_t size) const { - return Backend.GetRawTrimmed(size); - } - - bool ReferencesWholeContainer() const { - return Backend.GetData().size() == GetSize(); - } - - - bool ReferencesTrimableToWholeContainer() const { - if (ContainsNativeType<NActors::TSharedData>()) { - return Backend.GetData().size() == (GetSize() + UnsafeTailroom()); - } else { - return ReferencesWholeContainer(); - } - } - bool CanGrowFront() const noexcept { return Backend.CanGrowFront(Begin); } @@ -913,18 +887,30 @@ public: template <class TResult> TResult ExtractUnderlyingContainerOrCopy() const { - if (ContainsNativeType<TResult>() && (ReferencesWholeContainer() || ReferencesTrimableToWholeContainer())) { - using T = std::decay_t<TResult>; - if constexpr (std::is_same_v<T, NActors::TSharedData>) { - return GetRawTrimmed(GetSize()); - } else { - return GetRaw<TResult>(); + static_assert(std::is_same_v<TResult, TString> || + std::is_same_v<TResult, NActors::TSharedData> || + std::is_same_v<TResult, TInternalBackend>); + + constexpr bool isSharedData = std::is_same_v<TResult, NActors::TSharedData>; + TResult res; + + const bool found = Backend.ApplySpecificValue<TResult>([&](const TResult *raw) { + if (raw && raw->data() == Begin && (isSharedData ? End <= Begin + raw->size() : End == Begin + raw->size())) { + if constexpr (isSharedData) { + raw->TrimBack(size()); + } + res = TResult(*raw); + return true; } + return false; + }); + + if (!found) { + res = TResult::Uninitialized(GetSize()); + char* data = NContiguousDataDetails::TContainerTraits<TResult>::UnsafeGetDataMut(res); + std::memcpy(data, GetData(), GetSize()); } - TResult res = TResult::Uninitialized(GetSize()); - char* data = NContiguousDataDetails::TContainerTraits<TResult>::UnsafeGetDataMut(res); - std::memcpy(data, Begin, End - Begin); return res; } @@ -932,7 +918,7 @@ public: return {GetData(), GetSize()}; } - TStringBuf Slice(size_t pos = 0, size_t len = -1) const noexcept { + TStringBuf Slice(size_t pos = 0, size_t len = Max<size_t>()) const noexcept { pos = Min(pos, size()); len = Min(len, size() - pos); return {const_cast<TRcBuf*>(this)->UnsafeGetDataMut() + pos, len}; diff --git a/library/cpp/actors/util/rope.h b/library/cpp/actors/util/rope.h index 3c65588181..9df251db9c 100644 --- a/library/cpp/actors/util/rope.h +++ b/library/cpp/actors/util/rope.h @@ -455,6 +455,10 @@ public: return !Size; } + bool empty() const { + return IsEmpty(); + } + operator bool() const { return Chain; } @@ -699,10 +703,7 @@ public: // Use this method carefully -- it may significantly reduce performance when misused. TString ConvertToString() const { - // TODO(innokentii): could be microoptimized for single TString case - TString res = TString::Uninitialized(GetSize()); - Begin().ExtractPlainDataAndAdvance(res.Detach(), res.size()); - return res; + return ExtractUnderlyingContainerOrCopy<TString>(); } /** @@ -710,14 +711,14 @@ public: */ template <class TResult> TResult ExtractUnderlyingContainerOrCopy() const { - if (IsContiguous() && GetSize() != 0) { - const auto& chunk = Begin().GetChunk(); - return chunk.ExtractUnderlyingContainerOrCopy<TResult>(); + if (Chain.begin() != Chain.end() && ++Chain.begin() == Chain.end()) { + return Chain.GetFirstChunk().ExtractUnderlyingContainerOrCopy<TResult>(); } - TResult res = TResult::Uninitialized(GetSize()); + const size_t size = GetSize(); + TResult res = TResult::Uninitialized(size); char* data = NContiguousDataDetails::TContainerTraits<TResult>::UnsafeGetDataMut(res); - Begin().ExtractPlainDataAndAdvance(data, res.size()); + Begin().ExtractPlainDataAndAdvance(data, size); return res; } |