summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpechatnov <[email protected]>2025-09-15 09:44:04 +0300
committerpechatnov <[email protected]>2025-09-15 10:01:05 +0300
commite2627eae787b33c23ad5c80d0a722db7dea1f85a (patch)
tree42eecffb9eb1d5920d28c86899619892216b6bea
parentb8338af1f7e07524e182c3f82446d51385097e55 (diff)
Minor improvements of TUnversionedOwningValue
commit_hash:daa56397ad31c71b85ae80c912fd68bf384493af
-rw-r--r--yt/yt/client/table_client/unittests/unversioned_row_ut.cpp10
-rw-r--r--yt/yt/client/table_client/unversioned_row.cpp8
-rw-r--r--yt/yt/client/table_client/unversioned_row.h25
3 files changed, 42 insertions, 1 deletions
diff --git a/yt/yt/client/table_client/unittests/unversioned_row_ut.cpp b/yt/yt/client/table_client/unittests/unversioned_row_ut.cpp
index 5b01c135494..1fe36b53417 100644
--- a/yt/yt/client/table_client/unittests/unversioned_row_ut.cpp
+++ b/yt/yt/client/table_client/unittests/unversioned_row_ut.cpp
@@ -29,6 +29,16 @@ TEST(TUnversionedOwningValueTest, String)
ASSERT_EQ(owningValue.GetStringRef().ToStringBuf(), string);
}
+TEST(TUnversionedOwningValueTest, FromSharedRef)
+{
+ auto string = TSharedRef::FromString("Hello world!");
+ auto owningValue = MakeUnversionedStringOwningValue(string);
+ TUnversionedValue value = owningValue;
+ ASSERT_EQ(owningValue.Type(), EValueType::String);
+ ASSERT_EQ(static_cast<const void*>(value.Data.String), static_cast<const void*>(string.data()));
+ ASSERT_EQ(owningValue.GetStringRef().ToStringBuf(), string.ToStringBuf());
+}
+
////////////////////////////////////////////////////////////////////////////////
TEST(TUnversionedOwningRowTest, DefaultCtor)
diff --git a/yt/yt/client/table_client/unversioned_row.cpp b/yt/yt/client/table_client/unversioned_row.cpp
index c1ffe0be370..a0cf5cb92c0 100644
--- a/yt/yt/client/table_client/unversioned_row.cpp
+++ b/yt/yt/client/table_client/unversioned_row.cpp
@@ -70,7 +70,8 @@ TUnversionedOwningValue::TUnversionedOwningValue(const TUnversionedValue& other)
, StringHolder_(nullptr)
{
if (IsStringLikeType(Value_.Type)) {
- auto ref = TSharedRef::FromString(TString{Value_.Data.String, Value_.Length});
+ auto ref = TSharedMutableRef::Allocate<TOwningValueTag>(Value_.Length, {.InitializeStorage = false});
+ ::memcpy(ref.data(), Value_.Data.String, Value_.Length);
Value_.Data.String = ref.data();
StringHolder_ = ref.ReleaseHolder();
}
@@ -111,6 +112,11 @@ TSharedRef TUnversionedOwningValue::GetStringRef() const
return TSharedRef(Value_.Data.String, Value_.Length, StringHolder_);
}
+TSharedRangeHolderPtr TUnversionedOwningValue::GetStringHolder() const
+{
+ return StringHolder_;
+}
+
////////////////////////////////////////////////////////////////////////////////
size_t EstimateRowValueSize(const TUnversionedValue& value, bool isInlineHunkValue)
diff --git a/yt/yt/client/table_client/unversioned_row.h b/yt/yt/client/table_client/unversioned_row.h
index 6ad9940d971..340a288e5d9 100644
--- a/yt/yt/client/table_client/unversioned_row.h
+++ b/yt/yt/client/table_client/unversioned_row.h
@@ -28,6 +28,11 @@ extern const TString SerializedNullRow;
////////////////////////////////////////////////////////////////////////////////
+struct TOwningValueTag
+{ };
+
+////////////////////////////////////////////////////////////////////////////////
+
//! Unversioned value with shared ownership of string value.
class TUnversionedOwningValue
{
@@ -55,6 +60,9 @@ public:
//! Returns string value. Call is valid only if value is string-like type.
TSharedRef GetStringRef() const;
+ //! Returns string holder. Returned value is null if value is not of string-like type.
+ TSharedRangeHolderPtr GetStringHolder() const;
+
private:
TUnversionedValue Value_;
TSharedRangeHolderPtr StringHolder_;
@@ -125,6 +133,23 @@ inline TUnversionedValue MakeUnversionedValueHeader(EValueType type, int id = 0,
////////////////////////////////////////////////////////////////////////////////
+inline TUnversionedOwningValue MakeUnversionedStringLikeOwningValue(EValueType valueType, TSharedRef value, int id = 0, EValueFlags flags = EValueFlags::None)
+{
+ return TUnversionedOwningValue(MakeUnversionedStringLikeValue(valueType, value.ToStringBuf(), id, flags), value.GetHolder());
+}
+
+inline TUnversionedOwningValue MakeUnversionedStringOwningValue(TSharedRef value, int id = 0, EValueFlags flags = EValueFlags::None)
+{
+ return TUnversionedOwningValue(MakeUnversionedStringValue(value.ToStringBuf(), id, flags), value.GetHolder());
+}
+
+inline TUnversionedOwningValue MakeUnversionedAnyOwningValue(TSharedRef value, int id = 0, EValueFlags flags = EValueFlags::None)
+{
+ return TUnversionedOwningValue(MakeUnversionedAnyValue(value.ToStringBuf(), id, flags), value.GetHolder());
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
struct TUnversionedRowHeader
{
ui32 Count;