aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp
diff options
context:
space:
mode:
authoralexvru <alexvru@ydb.tech>2023-07-12 11:13:51 +0300
committeralexvru <alexvru@ydb.tech>2023-07-12 11:13:51 +0300
commit805223580f2054e7d21ff57cb6119d992c6e1af9 (patch)
treed0c03c9b74e5bc56d5be7597cb38bd67805972ef /library/cpp
parentf15a5a2053e3c943171d08dc844a6117b1716c2d (diff)
downloadydb-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.h90
-rw-r--r--library/cpp/actors/util/rope.h19
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;
}