aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp
diff options
context:
space:
mode:
authorinnokentii <innokentii@yandex-team.com>2022-11-14 14:20:53 +0300
committerinnokentii <innokentii@yandex-team.com>2022-11-14 14:20:53 +0300
commit7498e8ebce130b426f39a04a925842fca21a52f2 (patch)
treed8be3455fa7a98257191110d7eae1e9b257f9f34 /library/cpp
parent6c32f50a2ea79060b1d1724b915a6965c78d18c6 (diff)
downloadydb-7498e8ebce130b426f39a04a925842fca21a52f2.tar.gz
Improve TContiguouseData interface
improve TContiguousData interface
Diffstat (limited to 'library/cpp')
-rw-r--r--library/cpp/actors/util/contiguous_data.h26
-rw-r--r--library/cpp/actors/util/contiguous_data_ut.cpp23
2 files changed, 40 insertions, 9 deletions
diff --git a/library/cpp/actors/util/contiguous_data.h b/library/cpp/actors/util/contiguous_data.h
index 382b19f82c1..d7123ca4570 100644
--- a/library/cpp/actors/util/contiguous_data.h
+++ b/library/cpp/actors/util/contiguous_data.h
@@ -882,6 +882,16 @@ public:
}
}
+ static TContiguousData Copy(TContiguousSpan data, size_t headroom = 0, size_t tailroom = 0) {
+ TContiguousData res = Uninitialized(data.size(), headroom, tailroom);
+ std::memcpy(res.UnsafeGetDataMut(), data.GetData(), data.GetSize());
+ return res;
+ }
+
+ static TContiguousData Copy(const char* data, size_t size, size_t headroom = 0, size_t tailroom = 0) {
+ return Copy({data, size}, headroom, tailroom);
+ }
+
static NActors::TSharedData UninitializedSharedData(size_t size) {
return NActors::TSharedData::AttachUnsafe(TBackend::TSharedDataControllingOwner::Allocate(size), size);
}
@@ -1062,10 +1072,18 @@ public:
}
}
- void Trim(size_t size, size_t frontOffset = 0) {
- Y_VERIFY(size <= End - Begin - frontOffset);
- Begin = Begin + frontOffset;
- End = Begin + size;
+ void TrimBack(size_t size) {
+ Y_VERIFY(size <= GetSize());
+ End = End - (GetSize() - size);
+ }
+
+ void TrimFront(size_t size) {
+ Y_VERIFY(size <= GetSize());
+ Begin = Begin + (GetSize() - size);
+ }
+
+ char* Detach() {
+ return GetDataMut();
}
size_t UnsafeHeadroom() const {
diff --git a/library/cpp/actors/util/contiguous_data_ut.cpp b/library/cpp/actors/util/contiguous_data_ut.cpp
index b7b9029f85e..6452e748b81 100644
--- a/library/cpp/actors/util/contiguous_data_ut.cpp
+++ b/library/cpp/actors/util/contiguous_data_ut.cpp
@@ -50,6 +50,16 @@ Y_UNIT_TEST_SUITE(TContiguousData) {
constSharedData);
}
+ Y_UNIT_TEST(Detach) {
+ TContiguousData data = TContiguousData::Copy(TString("test"));
+ TContiguousData data2 = data;
+ char* res = data2.Detach();
+ UNIT_ASSERT_UNEQUAL(data.GetData(), data2.GetData());
+ UNIT_ASSERT_EQUAL(res, data2.GetData());
+ UNIT_ASSERT_EQUAL(::memcmp(res, "test", 4), 0);
+ UNIT_ASSERT_EQUAL(::memcmp(data.GetData(), "test", 4), 0);
+ }
+
Y_UNIT_TEST(Resize) {
TContiguousData data = TContiguousData::Uninitialized(10, 20, 30);
UNIT_ASSERT_EQUAL(data.size(), 10);
@@ -108,7 +118,8 @@ Y_UNIT_TEST_SUITE(TContiguousData) {
UNIT_ASSERT_EQUAL(otherData.Headroom(), 15);
UNIT_ASSERT_EQUAL(otherData.Tailroom(), 30);
UNIT_ASSERT_EQUAL(otherData.GetOccupiedMemorySize(), 60);
- data.Trim(10, 5);
+ data.TrimBack(15);
+ data.TrimFront(10);
UNIT_ASSERT_EQUAL(data.size(), 10);
UNIT_ASSERT_EQUAL(data.Headroom(), 20);
UNIT_ASSERT_EQUAL(data.Tailroom(), 30);
@@ -118,16 +129,18 @@ Y_UNIT_TEST_SUITE(TContiguousData) {
Y_UNIT_TEST(Trim) {
TContiguousData data = TContiguousData::Uninitialized(10, 20, 30);
TContiguousData otherData(data);
- otherData.Trim(5);
+ otherData.TrimBack(5);
UNIT_ASSERT_EQUAL(data.data(), otherData.data());
UNIT_ASSERT_EQUAL(otherData.Headroom(), 20);
UNIT_ASSERT_EQUAL(otherData.Tailroom(), 0);
TContiguousData otherData2(data);
- otherData2.Trim(1, 1);
+ otherData2.TrimBack(2);
+ otherData2.TrimFront(1);
UNIT_ASSERT_EQUAL(data.data() + 1, otherData2.data());
UNIT_ASSERT_EQUAL(otherData2.Headroom(), 0);
UNIT_ASSERT_EQUAL(otherData2.Tailroom(), 0);
- otherData.Trim(1, 1);
+ otherData.TrimBack(2);
+ otherData.TrimFront(1);
UNIT_ASSERT_EQUAL(otherData.data(), otherData2.data());
data.GrowFront(5);
data.GrowBack(5);
@@ -139,7 +152,7 @@ Y_UNIT_TEST_SUITE(TContiguousData) {
UNIT_ASSERT_UNEQUAL(data.data() + 6, otherData2.data());
data = TContiguousData::Uninitialized(10);
otherData = data;
- data.Trim(5);
+ data.TrimBack(5);
UNIT_ASSERT_EQUAL(data.data(), otherData.data());
UNIT_ASSERT_EQUAL(data.size(), 5);
}