@@ -2061,19 +2061,33 @@ class TValueBuilderImpl {
20612061public:
20622062 TValueBuilderImpl ()
20632063 : TypeBuilder_()
2064+ , Arena(nullptr )
2065+ , ProtoValue_(ProtoValueHeap)
2066+ {
2067+ PushPath (ProtoValue_);
2068+ }
2069+
2070+ TValueBuilderImpl (google::protobuf::Arena* arena)
2071+ : TypeBuilder_()
2072+ , Arena(arena)
2073+ , ProtoValue_(*google::protobuf::Arena::CreateMessage<Ydb::Value>(Arena))
20642074 {
20652075 PushPath (ProtoValue_);
20662076 }
20672077
20682078 TValueBuilderImpl (const TType& type)
20692079 : TypeBuilder_()
2080+ , Arena(nullptr )
2081+ , ProtoValue_(ProtoValueHeap)
20702082 {
20712083 PushPath (ProtoValue_);
20722084 GetType ().CopyFrom (type.GetProto ());
20732085 }
20742086
20752087 TValueBuilderImpl (Ydb::Type& type, Ydb::Value& value)
20762088 : TypeBuilder_(type)
2089+ , Arena(nullptr )
2090+ , ProtoValue_(ProtoValueHeap)
20772091 {
20782092 PushPath (value);
20792093 }
@@ -2088,10 +2102,15 @@ class TValueBuilderImpl {
20882102 TValue BuildValue () {
20892103 CheckValue ();
20902104
2091- Ydb::Value value;
2092- value.Swap (&ProtoValue_);
2093-
2094- return TValue (TypeBuilder_.Build (), std::move (value));
2105+ if (Arena) {
2106+ auto * value = google::protobuf::Arena::CreateMessage<Ydb::Value>(Arena);
2107+ value->Swap (&ProtoValue_);
2108+ return TValue (TypeBuilder_.Build (), value);
2109+ } else {
2110+ Ydb::Value value;
2111+ value.Swap (&ProtoValue_);
2112+ return TValue (TypeBuilder_.Build (), std::move (value));
2113+ }
20952114 }
20962115
20972116 void Bool (bool value) {
@@ -2803,7 +2822,12 @@ class TValueBuilderImpl {
28032822private:
28042823 // TTypeBuilder TypeBuilder_;
28052824 TTypeBuilder::TImpl TypeBuilder_;
2806- Ydb::Value ProtoValue_;
2825+ google::protobuf::Arena* Arena;
2826+ Ydb::Value ProtoValueHeap;
2827+
2828+ // either ProtoValueHeap or a reference to the arena allocated protobuf
2829+ Ydb::Value& ProtoValue_;
2830+
28072831 std::map<const Ydb::StructType*, TMembersMap> StructsMap_;
28082832
28092833 TStackVec<TProtoPosition, 8 > Path_;
@@ -2819,8 +2843,8 @@ template<typename TDerived>
28192843TValueBuilderBase<TDerived>::~TValueBuilderBase () = default ;
28202844
28212845template <typename TDerived>
2822- TValueBuilderBase<TDerived>::TValueBuilderBase()
2823- : Impl_(new TValueBuilderImpl()) {}
2846+ TValueBuilderBase<TDerived>::TValueBuilderBase(google::protobuf::Arena* arena )
2847+ : Impl_(new TValueBuilderImpl(arena )) {}
28242848
28252849template <typename TDerived>
28262850TValueBuilderBase<TDerived>::TValueBuilderBase(const TType& type)
@@ -3382,8 +3406,8 @@ template class TValueBuilderBase<TParamValueBuilder>;
33823406
33833407// //////////////////////////////////////////////////////////////////////////////
33843408
3385- TValueBuilder::TValueBuilder ()
3386- : TValueBuilderBase() {}
3409+ TValueBuilder::TValueBuilder (google::protobuf::Arena* arena )
3410+ : TValueBuilderBase(arena ) {}
33873411
33883412TValueBuilder::TValueBuilder (const TType& type)
33893413 : TValueBuilderBase(type) {}
0 commit comments