aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp
diff options
context:
space:
mode:
authorinnokentii <innokentii@yandex-team.com>2022-11-11 16:06:16 +0300
committerinnokentii <innokentii@yandex-team.com>2022-11-11 16:06:16 +0300
commiteb299967e503717d223751ed6a2f3c834429f60e (patch)
tree0b0396dcb7e8ba05351de1d63804d81982f36445 /library/cpp
parent34d7ddb0a460e57587d80c1a118b87cfdc5460ad (diff)
downloadydb-eb299967e503717d223751ed6a2f3c834429f60e.tar.gz
Add Detach to TSharedData
add Detach to TSharedData
Diffstat (limited to 'library/cpp')
-rw-r--r--library/cpp/actors/util/contiguous_data.h2
-rw-r--r--library/cpp/actors/util/shared_data.h14
-rw-r--r--library/cpp/actors/util/shared_data_native_rope_backend_ut.cpp2
-rw-r--r--library/cpp/actors/util/shared_data_rope_backend_ut.cpp2
-rw-r--r--library/cpp/actors/util/shared_data_ut.cpp22
5 files changed, 36 insertions, 6 deletions
diff --git a/library/cpp/actors/util/contiguous_data.h b/library/cpp/actors/util/contiguous_data.h
index c52ef4b7d8..382b19f82c 100644
--- a/library/cpp/actors/util/contiguous_data.h
+++ b/library/cpp/actors/util/contiguous_data.h
@@ -639,7 +639,7 @@ class TContiguousData {
NActors::TSharedData GetRawTrimmed(size_t size) const {
NActors::TSharedData result = GetRaw<NActors::TSharedData>();
- result.Trim(size);
+ result.TrimBack(size);
return result;
}
diff --git a/library/cpp/actors/util/shared_data.h b/library/cpp/actors/util/shared_data.h
index 6fdc9bf35f..8425738578 100644
--- a/library/cpp/actors/util/shared_data.h
+++ b/library/cpp/actors/util/shared_data.h
@@ -101,7 +101,7 @@ namespace NActors {
* Underlying data is not reallocated
* Returns trimmed amount in bytes
*/
- size_t Trim(size_t size) noexcept {
+ size_t TrimBack(size_t size) noexcept {
size_t trimmed = 0;
if (Size_ > size) {
trimmed = Size_ - size;
@@ -115,6 +115,18 @@ namespace NActors {
}
/**
+ * Copies data to new allocated buffer if data is shared
+ * New container loses original owner
+ * Returns pointer to mutable buffer
+ */
+ char* Detach() {
+ if (IsShared()) {
+ *this = TSharedData::Copy(data(), size());
+ }
+ return Data_;
+ }
+
+ /**
* Returns a view of underlying data starting with pos and up to len bytes
*/
TStringBuf Slice(size_t pos = 0, size_t len = -1) const noexcept {
diff --git a/library/cpp/actors/util/shared_data_native_rope_backend_ut.cpp b/library/cpp/actors/util/shared_data_native_rope_backend_ut.cpp
index 443fc149da..4939403454 100644
--- a/library/cpp/actors/util/shared_data_native_rope_backend_ut.cpp
+++ b/library/cpp/actors/util/shared_data_native_rope_backend_ut.cpp
@@ -221,7 +221,7 @@ namespace NActors {
UNIT_ASSERT_EQUAL(dataCopy.data(), data.data());
rope.Insert(rope.End(), TRope(data));
rope.Insert(rope.End(), TRope(data));
- dataCopy.Trim(10);
+ dataCopy.TrimBack(10);
UNIT_ASSERT_EQUAL(rope.GetSize(), data.size() * 3);
}
UNIT_ASSERT(data.IsPrivate());
diff --git a/library/cpp/actors/util/shared_data_rope_backend_ut.cpp b/library/cpp/actors/util/shared_data_rope_backend_ut.cpp
index 3ffe14a544..b2b4e04634 100644
--- a/library/cpp/actors/util/shared_data_rope_backend_ut.cpp
+++ b/library/cpp/actors/util/shared_data_rope_backend_ut.cpp
@@ -221,7 +221,7 @@ namespace NActors {
UNIT_ASSERT_EQUAL(dataCopy.data(), data.data());
rope.Insert(rope.End(), TRope(MakeIntrusive<TRopeSharedDataBackend>(data)));
rope.Insert(rope.End(), TRope(MakeIntrusive<TRopeSharedDataBackend>(data)));
- dataCopy.Trim(10);
+ dataCopy.TrimBack(10);
UNIT_ASSERT_EQUAL(rope.GetSize(), data.size() * 3);
}
UNIT_ASSERT(data.IsPrivate());
diff --git a/library/cpp/actors/util/shared_data_ut.cpp b/library/cpp/actors/util/shared_data_ut.cpp
index 8ed0df6866..0a510122b4 100644
--- a/library/cpp/actors/util/shared_data_ut.cpp
+++ b/library/cpp/actors/util/shared_data_ut.cpp
@@ -43,6 +43,12 @@ namespace NActors {
UNIT_ASSERT_VALUES_EQUAL(TString(data.Slice(1, 3)), TString("ell"));
UNIT_ASSERT_VALUES_EQUAL(TString(data.Slice(1, 100)), TString("ello"));
UNIT_ASSERT_VALUES_EQUAL(TString(data.Slice(0, 4)), TString("Hell"));
+
+ link = data;
+ UNIT_ASSERT(link.data() == data.data());
+ UNIT_ASSERT_VALUES_UNEQUAL(link.Detach(), data.data());
+ UNIT_ASSERT_EQUAL(data.size(), link.size());
+ UNIT_ASSERT_VALUES_EQUAL(TString(data.Slice()), TString(link.Slice()));
}
Y_UNIT_TEST(TrimBehavior) {
@@ -53,14 +59,14 @@ namespace NActors {
// Trim to non-zero does not change addresses
const char* ptr1 = data.data();
- data.Trim(31);
+ data.TrimBack(31);
const char* ptr2 = data.data();
UNIT_ASSERT_VALUES_EQUAL(data.size(), 31u);
UNIT_ASSERT(ptr1 == ptr2);
// Trim to zero releases underlying data
- data.Trim(0);
+ data.TrimBack(0);
UNIT_ASSERT_VALUES_EQUAL(data.size(), 0u);
UNIT_ASSERT(data.data() == nullptr);
@@ -179,6 +185,18 @@ namespace NActors {
UNIT_ASSERT(owner.NextDeallocated() == ptr);
UNIT_ASSERT(owner.NextDeallocated() == nullptr);
+
+ // Test Detach copies correctly and doesn't affect owned data
+ {
+ auto data = owner.Allocate(42);
+ auto disowned = data;
+ disowned.Detach();
+ UNIT_ASSERT(owner.NextDeallocated() == nullptr);
+ }
+
+ UNIT_ASSERT(owner.NextDeallocated() == ptr);
+ UNIT_ASSERT(owner.NextDeallocated() == nullptr);
+
}
}