aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorinnokentii <innokentii@yandex-team.com>2022-12-13 15:22:28 +0300
committerinnokentii <innokentii@yandex-team.com>2022-12-13 15:22:28 +0300
commit1ab9ee3dfe0ab4023a3a57bf55de31dff3eac908 (patch)
tree49281129fa2e474ed2ceae61823b5737e69a17b2
parent3e76f9f3fefc86eb2f0151ce8ad18d0816ce3522 (diff)
downloadydb-1ab9ee3dfe0ab4023a3a57bf55de31dff3eac908.tar.gz
Add TStringBuf conversion operator for TRcBuf
add TStringBuf conversion operator add TStringBuf conversion operator
-rw-r--r--library/cpp/actors/util/rc_buf.h28
-rw-r--r--library/cpp/actors/util/rc_buf_ut.cpp12
-rw-r--r--library/cpp/actors/util/rope.h12
3 files changed, 36 insertions, 16 deletions
diff --git a/library/cpp/actors/util/rc_buf.h b/library/cpp/actors/util/rc_buf.h
index ac770e1f00..1a492064ee 100644
--- a/library/cpp/actors/util/rc_buf.h
+++ b/library/cpp/actors/util/rc_buf.h
@@ -688,7 +688,7 @@ class TRcBuf {
}
};
- static constexpr struct TOwnedSlice {} OwnedSlice{};
+ static constexpr struct TOwnedPiece {} OwnedPiece{};
TBackend Backend; // who actually holds the data
const char *Begin; // data start
@@ -711,7 +711,7 @@ class TRcBuf {
End = Begin + span.size();
}
- TRcBuf(TOwnedSlice, const char *data, size_t size, const TRcBuf& from)
+ TRcBuf(TOwnedPiece, const char *data, size_t size, const TRcBuf& from)
: TRcBuf(from.Backend, {data, size})
{
Y_VERIFY(data >= from.GetData());
@@ -720,12 +720,12 @@ class TRcBuf {
Backend.UpdateCookiesUnsafe(Begin, End);
}
- TRcBuf(TOwnedSlice, const char *begin, const char *end, const TRcBuf& from)
- : TRcBuf(OwnedSlice, begin, end - begin, from)
+ TRcBuf(TOwnedPiece, const char *begin, const char *end, const TRcBuf& from)
+ : TRcBuf(OwnedPiece, begin, end - begin, from)
{}
public:
- static constexpr struct TSlice {} Slice{};
+ static constexpr struct TPiece {} Piece{};
enum class EResizeResult {
NoAlloc,
@@ -770,7 +770,7 @@ public:
: TRcBuf(backend, backend->GetData())
{}
- TRcBuf(TSlice, const char *data, size_t size, const TRcBuf& from)
+ TRcBuf(TPiece, const char *data, size_t size, const TRcBuf& from)
: TRcBuf(from.Backend, {data, size})
{
Y_VERIFY(data >= from.GetData());
@@ -778,8 +778,8 @@ public:
Y_VERIFY(data + size <= from.GetData() + from.GetSize());
}
- TRcBuf(TSlice, const char *begin, const char *end, const TRcBuf& from)
- : TRcBuf(Slice, begin, end - begin, from)
+ TRcBuf(TPiece, const char *begin, const char *end, const TRcBuf& from)
+ : TRcBuf(Piece, begin, end - begin, from)
{}
TRcBuf(const TRcBuf& other)
@@ -806,7 +806,7 @@ public:
if (headroom == 0 && tailroom == 0) {
TInternalBackend res = TInternalBackend::Uninitialized(size);
return TRcBuf(
- OwnedSlice,
+ OwnedPiece,
res.data(),
res.data() + res.size(),
TRcBuf(res));
@@ -918,6 +918,16 @@ public:
return {GetData(), GetSize()};
}
+ TStringBuf Slice(size_t pos = 0, size_t len = -1) const noexcept {
+ pos = Min(pos, size());
+ len = Min(len, size() - pos);
+ return {const_cast<TRcBuf*>(this)->UnsafeGetDataMut() + pos, len};
+ }
+
+ explicit operator TStringBuf() const noexcept {
+ return Slice();
+ }
+
TMutableContiguousSpan GetContiguousSpanMut() {
return {GetDataMut(), GetSize()};
}
diff --git a/library/cpp/actors/util/rc_buf_ut.cpp b/library/cpp/actors/util/rc_buf_ut.cpp
index 9b8af6421d..c23e8b68d0 100644
--- a/library/cpp/actors/util/rc_buf_ut.cpp
+++ b/library/cpp/actors/util/rc_buf_ut.cpp
@@ -10,6 +10,16 @@ Y_UNIT_TEST_SUITE(TRcBuf) {
UNIT_ASSERT_EQUAL(sizeof(TRcBuf), 4 * sizeof(uintptr_t));
}
+ Y_UNIT_TEST(Slice) {
+ auto data = TRcBuf::Copy("Hello", 5);
+ UNIT_ASSERT_VALUES_EQUAL(TString(TStringBuf(data)), TString("Hello"));
+ UNIT_ASSERT_VALUES_EQUAL(TString(data.Slice()), TString("Hello"));
+ UNIT_ASSERT_VALUES_EQUAL(TString(data.Slice(1)), TString("ello"));
+ 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"));
+ }
+
Y_UNIT_TEST(CrossCompare) {
TString str = "some very long string";
const TString constStr(str);
@@ -159,7 +169,7 @@ Y_UNIT_TEST_SUITE(TRcBuf) {
Y_UNIT_TEST(SliceUnshare) {
TRcBuf data = TRcBuf::Uninitialized(10, 20, 30);
- TRcBuf otherData(TRcBuf::Slice, data.data() + 1, data.size() - 2, data);
+ TRcBuf otherData(TRcBuf::Piece, data.data() + 1, data.size() - 2, data);
UNIT_ASSERT_EQUAL(otherData.Headroom(), 0);
UNIT_ASSERT_EQUAL(otherData.Tailroom(), 0);
}
diff --git a/library/cpp/actors/util/rope.h b/library/cpp/actors/util/rope.h
index a0e38535a6..4aacb41089 100644
--- a/library/cpp/actors/util/rope.h
+++ b/library/cpp/actors/util/rope.h
@@ -407,13 +407,13 @@ public:
while (begin.Iter != end.Iter) {
const size_t size = begin.ContiguousSize();
- Chain.PutToEnd(TRcBuf::Slice, begin.ContiguousData(), size, begin.GetChunk());
+ Chain.PutToEnd(TRcBuf::Piece, begin.ContiguousData(), size, begin.GetChunk());
begin.AdvanceToNextContiguousBlock();
Size += size;
}
if (begin != end && end.PointsToChunkMiddle()) {
- Chain.PutToEnd(TRcBuf::Slice, begin.Ptr, end.Ptr, begin.GetChunk());
+ Chain.PutToEnd(TRcBuf::Piece, begin.Ptr, end.Ptr, begin.GetChunk());
Size += end.Ptr - begin.Ptr;
}
}
@@ -534,7 +534,7 @@ public:
return;
}
}
- dest->Chain.PutToEnd(TRcBuf::Slice, first->Begin, first->Begin + num, *first);
+ dest->Chain.PutToEnd(TRcBuf::Piece, first->Begin, first->Begin + num, *first);
first->Begin += num;
}
}
@@ -552,7 +552,7 @@ public:
// check if we have to split the block
if (pos.PointsToChunkMiddle()) {
- pos.Iter = Chain.InsertBefore(pos.Iter, TRcBuf::Slice, pos->Begin, pos.Ptr, pos.GetChunk());
+ pos.Iter = Chain.InsertBefore(pos.Iter, TRcBuf::Piece, pos->Begin, pos.Ptr, pos.GetChunk());
++pos.Iter;
pos->Begin = pos.Ptr;
}
@@ -854,7 +854,7 @@ private:
auto addBlock = [&](const TRcBuf& from, const char *begin, const char *end) {
if (target) {
- target->Chain.PutToEnd(TRcBuf::Slice, begin, end, from);
+ target->Chain.PutToEnd(TRcBuf::Piece, begin, end, from);
target->Size += end - begin;
}
Size -= end - begin;
@@ -868,7 +868,7 @@ private:
const char *firstChunkBegin = begin.PointsToChunkMiddle() ? begin->Begin : nullptr;
begin->Begin = end.Ptr; // this affects both begin and end iterator pointed values
if (firstChunkBegin) {
- Chain.InsertBefore(begin.Iter, TRcBuf::Slice, firstChunkBegin, begin.Ptr, chunkToSplit);
+ Chain.InsertBefore(begin.Iter, TRcBuf::Piece, firstChunkBegin, begin.Ptr, chunkToSplit);
}
} else {
// check the first iterator -- if it starts not from the begin of the block, we have to adjust end of the