@@ -242,16 +242,14 @@ bool MessageProperties::streamInPropertyValue(const Property& p) const
242242 BSLS_ASSERT_SAFE (p.d_offset );
243243
244244 bmqu::BlobPosition position;
245- int rc = bmqu::BlobUtil::findOffsetSafe (&position,
246- d_blob.object (),
247- p.d_offset );
245+ int rc = bmqu::BlobUtil::findOffsetSafe (&position, *d_blob_p, p.d_offset );
248246 BSLS_ASSERT_SAFE (rc == 0 );
249247
250248 switch (p.d_type ) {
251249 case bmqt::PropertyType::e_BOOL: {
252250 char value;
253251 rc = bmqu::BlobUtil::readNBytes (&value,
254- d_blob. object () ,
252+ *d_blob_p ,
255253 position,
256254 sizeof (value));
257255
@@ -261,7 +259,7 @@ bool MessageProperties::streamInPropertyValue(const Property& p) const
261259 case bmqt::PropertyType::e_CHAR: {
262260 char value;
263261 rc = bmqu::BlobUtil::readNBytes (&value,
264- d_blob. object () ,
262+ *d_blob_p ,
265263 position,
266264 sizeof (value));
267265
@@ -271,7 +269,7 @@ bool MessageProperties::streamInPropertyValue(const Property& p) const
271269 case bmqt::PropertyType::e_SHORT: {
272270 bdlb::BigEndianInt16 nboValue;
273271 rc = bmqu::BlobUtil::readNBytes (reinterpret_cast <char *>(&nboValue),
274- d_blob. object () ,
272+ *d_blob_p ,
275273 position,
276274 sizeof (nboValue));
277275
@@ -281,7 +279,7 @@ bool MessageProperties::streamInPropertyValue(const Property& p) const
281279 case bmqt::PropertyType::e_INT32: {
282280 bdlb::BigEndianInt32 nboValue;
283281 rc = bmqu::BlobUtil::readNBytes (reinterpret_cast <char *>(&nboValue),
284- d_blob. object () ,
282+ *d_blob_p ,
285283 position,
286284 sizeof (nboValue));
287285
@@ -291,7 +289,7 @@ bool MessageProperties::streamInPropertyValue(const Property& p) const
291289 case bmqt::PropertyType::e_INT64: {
292290 bdlb::BigEndianInt64 nboValue;
293291 rc = bmqu::BlobUtil::readNBytes (reinterpret_cast <char *>(&nboValue),
294- d_blob. object () ,
292+ *d_blob_p ,
295293 position,
296294 sizeof (nboValue));
297295
@@ -302,7 +300,7 @@ bool MessageProperties::streamInPropertyValue(const Property& p) const
302300 case bmqt::PropertyType::e_STRING: {
303301 bsl::string value (p.d_length , ' ' );
304302 rc = bmqu::BlobUtil::readNBytes (&value[0 ],
305- d_blob. object () ,
303+ *d_blob_p ,
306304 position,
307305 p.d_length );
308306
@@ -312,7 +310,7 @@ bool MessageProperties::streamInPropertyValue(const Property& p) const
312310 case bmqt::PropertyType::e_BINARY: {
313311 bsl::vector<char > value (p.d_length );
314312 rc = bmqu::BlobUtil::readNBytes (&value[0 ],
315- d_blob. object () ,
313+ *d_blob_p ,
316314 position,
317315 p.d_length );
318316
@@ -336,6 +334,7 @@ MessageProperties::MessageProperties(bslma::Allocator* basicAllocator)
336334, d_totalSize(0 )
337335, d_originalSize(0 )
338336, d_blob()
337+ , d_blob_p(d_blob.address())
339338, d_isBlobConstructed(false )
340339, d_isDirty(true ) // by default, this should be true
341340, d_mphSize(0 )
@@ -344,6 +343,7 @@ MessageProperties::MessageProperties(bslma::Allocator* basicAllocator)
344343, d_dataOffset(0 )
345344, d_schema()
346345, d_originalNumProps(0 )
346+ , d_doDeepCopy(true )
347347{
348348}
349349
@@ -354,6 +354,7 @@ MessageProperties::MessageProperties(const MessageProperties& other,
354354, d_totalSize(other.d_totalSize)
355355, d_originalSize(other.d_originalSize)
356356, d_blob()
357+ , d_blob_p(d_blob.address())
357358, d_isBlobConstructed(false )
358359, d_isDirty(other.d_isDirty)
359360, d_mphSize(other.d_mphSize)
@@ -362,6 +363,7 @@ MessageProperties::MessageProperties(const MessageProperties& other,
362363, d_dataOffset(other.d_dataOffset)
363364, d_schema(other.d_schema)
364365, d_originalNumProps(other.d_originalNumProps)
366+ , d_doDeepCopy(other.d_doDeepCopy)
365367{
366368 if (other.d_isBlobConstructed ) {
367369 new (d_blob.buffer ())
@@ -394,6 +396,7 @@ MessageProperties& MessageProperties::operator=(const MessageProperties& rhs)
394396
395397 if (rhs.d_isBlobConstructed ) {
396398 new (d_blob.buffer ()) bdlbb::Blob (rhs.d_blob .object (), d_allocator_p);
399+ d_blob_p = d_blob.address ();
397400 d_isBlobConstructed = true ;
398401 }
399402
@@ -547,9 +550,15 @@ int MessageProperties::streamInHeader(const bdlbb::Blob& blob)
547550 return rc_INCORRECT_LENGTH; // RETURN
548551 }
549552
550- new (d_blob.buffer ()) bdlbb::Blob (d_allocator_p);
551- bdlbb::BlobUtil::append (d_blob.address (), blob, 0 , d_totalSize);
552- d_isBlobConstructed = true ;
553+ if (d_doDeepCopy) {
554+ new (d_blob.buffer ()) bdlbb::Blob (d_allocator_p);
555+ bdlbb::BlobUtil::append (d_blob.address (), blob, 0 , d_totalSize);
556+ d_blob_p = d_blob.address ();
557+ d_isBlobConstructed = true ;
558+ }
559+ else {
560+ d_blob_p = &blob;
561+ }
553562 d_originalSize = d_totalSize;
554563 d_originalNumProps = d_numProps;
555564
@@ -567,17 +576,16 @@ int MessageProperties::streamInPropertyHeader(Property* property,
567576 BSLS_ASSERT_SAFE (property);
568577 BSLS_ASSERT_SAFE (totalLength);
569578 BSLS_ASSERT_SAFE (d_dataOffset && start);
570- BSLS_ASSERT_SAFE (d_isBlobConstructed);
571579
572580 bmqu::BlobPosition position;
573581
574- if (bmqu::BlobUtil::findOffsetSafe (&position, d_blob. object () , start)) {
582+ if (bmqu::BlobUtil::findOffsetSafe (&position, *d_blob_p , start)) {
575583 // Failed to advance blob to next 'MessagePropertyHeader' location.
576584 return rc_NO_MSG_PROPERTY_HEADER; // RETURN
577585 }
578586
579587 bmqu::BlobObjectProxy<MessagePropertyHeader> mpHeader (
580- &d_blob. object () ,
588+ d_blob_p ,
581589 position,
582590 d_mphSize,
583591 true , // read flag
@@ -693,14 +701,14 @@ int MessageProperties::streamInPropertyHeader(Property* property,
693701 name->assign (nameLen, ' ' );
694702 bmqu::BlobPosition namePosition;
695703 int rc = bmqu::BlobUtil::findOffsetSafe (&namePosition,
696- d_blob. object () ,
704+ *d_blob_p ,
697705 offset);
698706 if (rc) {
699707 return rc_MISSING_PROPERTY_AREA; // RETURN
700708 }
701709
702710 rc = bmqu::BlobUtil::readNBytes (name->begin (),
703- d_blob. object () ,
711+ *d_blob_p ,
704712 namePosition,
705713 nameLen);
706714 if (rc) {
@@ -885,6 +893,8 @@ MessageProperties::streamOut(bdlbb::BlobBufferFactory* bufferFactory,
885893 }
886894
887895 new (d_blob.buffer ()) bdlbb::Blob (bufferFactory, d_allocator_p);
896+
897+ d_blob_p = d_blob.address ();
888898 d_isBlobConstructed = true ;
889899
890900 if (0 == numProperties ()) {
@@ -1006,7 +1016,7 @@ MessageProperties::streamOut(bdlbb::BlobBufferFactory* bufferFactory,
10061016 msgPropsHdr.reset ();
10071017 d_isDirty = false ;
10081018
1009- return d_blob. object () ;
1019+ return *d_blob_p ;
10101020}
10111021
10121022bsl::ostream& MessageProperties::print (bsl::ostream& stream,
0 commit comments