diff options
| author | pechatnov <[email protected]> | 2025-09-15 09:44:04 +0300 |
|---|---|---|
| committer | pechatnov <[email protected]> | 2025-09-15 10:01:05 +0300 |
| commit | e2627eae787b33c23ad5c80d0a722db7dea1f85a (patch) | |
| tree | 42eecffb9eb1d5920d28c86899619892216b6bea | |
| parent | b8338af1f7e07524e182c3f82446d51385097e55 (diff) | |
Minor improvements of TUnversionedOwningValue
commit_hash:daa56397ad31c71b85ae80c912fd68bf384493af
| -rw-r--r-- | yt/yt/client/table_client/unittests/unversioned_row_ut.cpp | 10 | ||||
| -rw-r--r-- | yt/yt/client/table_client/unversioned_row.cpp | 8 | ||||
| -rw-r--r-- | yt/yt/client/table_client/unversioned_row.h | 25 |
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; |
