sw/source/core/doc/docfmt.cxx        |    2 
 sw/source/core/inc/UndoAttribute.hxx |    6 +-
 sw/source/core/inc/UndoCore.hxx      |    2 
 sw/source/core/undo/unattr.cxx       |   71 +++++++++++++++++++----------------
 sw/source/core/undo/undobj1.cxx      |   12 ++---
 sw/source/core/undo/unsect.cxx       |   49 ++++++++++++------------
 6 files changed, 76 insertions(+), 66 deletions(-)

New commits:
commit 672dce81178dc1b4b6ad54f2b5d922ee806acf91
Author:     Noel Grandin <noelgran...@gmail.com>
AuthorDate: Wed Sep 22 20:47:14 2021 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Thu Sep 23 09:19:44 2021 +0200

    no need to allocate these SfxItemSet on the heap
    
    Change-Id: Iefa9cb88eaadb4535bbbe59a939b9773d81a438d
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/122487
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/sw/source/core/doc/docfmt.cxx b/sw/source/core/doc/docfmt.cxx
index d2ccfaf81544..0f93a708c388 100644
--- a/sw/source/core/doc/docfmt.cxx
+++ b/sw/source/core/doc/docfmt.cxx
@@ -1898,7 +1898,7 @@ void SwDoc::ChgFormat(SwFormat & rFormat, const 
SfxItemSet & rSet)
         }
 
         GetIDocumentUndoRedo().AppendUndo(
-            std::make_unique<SwUndoFormatAttr>(aOldSet, rFormat, 
/*bSaveDrawPt*/true));
+            std::make_unique<SwUndoFormatAttr>(std::move(aOldSet), rFormat, 
/*bSaveDrawPt*/true));
     }
 
     rFormat.SetFormatAttr(rSet);
diff --git a/sw/source/core/inc/UndoAttribute.hxx 
b/sw/source/core/inc/UndoAttribute.hxx
index c1387cbda734..6c866342434a 100644
--- a/sw/source/core/inc/UndoAttribute.hxx
+++ b/sw/source/core/inc/UndoAttribute.hxx
@@ -86,7 +86,7 @@ class SwUndoFormatAttr final : public SwUndo
 {
     friend class SwUndoDefaultAttr;
     OUString m_sFormatName;
-    std::unique_ptr<SfxItemSet> m_pOldSet;      // old attributes
+    std::optional<SfxItemSet> m_oOldSet;      // old attributes
     sal_uLong m_nNodeIndex;
     const sal_uInt16 m_nFormatWhich;
     const bool m_bSaveDrawPt;
@@ -107,7 +107,7 @@ class SwUndoFormatAttr final : public SwUndo
 public:
     // register at the Format and save old attributes
     // --> OD 2008-02-27 #refactorlists# - removed <rNewSet>
-    SwUndoFormatAttr( const SfxItemSet& rOldSet,
+    SwUndoFormatAttr( SfxItemSet&& rOldSet,
                    SwFormat& rFormat,
                    bool bSaveDrawPt );
     SwUndoFormatAttr( const SfxPoolItem& rItem,
@@ -196,7 +196,7 @@ public:
 
 class SwUndoDefaultAttr final : public SwUndo
 {
-    std::unique_ptr<SfxItemSet> m_pOldSet;          // the old attributes
+    std::optional<SfxItemSet> m_oOldSet;          // the old attributes
     std::unique_ptr<SvxTabStopItem> m_pTabStop;
 
 public:
diff --git a/sw/source/core/inc/UndoCore.hxx b/sw/source/core/inc/UndoCore.hxx
index 62fcccd0231c..4f94a6b6cca0 100644
--- a/sw/source/core/inc/UndoCore.hxx
+++ b/sw/source/core/inc/UndoCore.hxx
@@ -190,7 +190,7 @@ class SwUndoSetFlyFormat final : public SwUndo, public 
SwClient
     SwFrameFormat* m_pFrameFormat;                  // saved FlyFormat
     const OUString m_DerivedFromFormatName;
     const OUString m_NewFormatName;
-    std::unique_ptr<SfxItemSet> m_pItemSet;               // the re-/ set 
attributes
+    std::optional<SfxItemSet> m_oItemSet;               // the re-/ set 
attributes
     sal_uLong m_nOldNode, m_nNewNode;
     sal_Int32 m_nOldContent, m_nNewContent;
     RndStdIds m_nOldAnchorType, m_nNewAnchorType;
diff --git a/sw/source/core/undo/unattr.cxx b/sw/source/core/undo/unattr.cxx
index 3c3f05ac1895..09b7e44bc7b8 100644
--- a/sw/source/core/undo/unattr.cxx
+++ b/sw/source/core/undo/unattr.cxx
@@ -82,7 +82,7 @@ void SwUndoFormatAttrHelper::SwClientNotify(const SwModify&, 
const SfxHint& rHin
     } else if(RES_ATTRSET_CHG == pOld->Which()) {
         auto& rChgSet = *static_cast<const SwAttrSetChg*>(pOld)->GetChgSet();
         if(!GetUndo())
-            m_pUndo.reset(new SwUndoFormatAttr(rChgSet, m_rFormat, 
m_bSaveDrawPt));
+            m_pUndo.reset(new SwUndoFormatAttr(SfxItemSet(rChgSet), m_rFormat, 
m_bSaveDrawPt));
         else {
             SfxItemIter aIter(rChgSet);
             for(auto pItem = aIter.GetCurItem(); pItem; pItem = 
aIter.NextItem())
@@ -91,13 +91,13 @@ void SwUndoFormatAttrHelper::SwClientNotify(const 
SwModify&, const SfxHint& rHin
     }
 }
 
-SwUndoFormatAttr::SwUndoFormatAttr( const SfxItemSet& rOldSet,
+SwUndoFormatAttr::SwUndoFormatAttr( SfxItemSet&& rOldSet,
                               SwFormat& rChgFormat,
                               bool bSaveDrawPt )
     : SwUndo( SwUndoId::INSFMTATTR, rChgFormat.GetDoc() )
     , m_sFormatName ( rChgFormat.GetName() )
     // #i56253#
-    , m_pOldSet( new SfxItemSet( rOldSet ) )
+    , m_oOldSet( std::move( rOldSet ) )
     , m_nNodeIndex( 0 )
     , m_nFormatWhich( rChgFormat.Which() )
     , m_bSaveDrawPt( bSaveDrawPt )
@@ -111,23 +111,23 @@ SwUndoFormatAttr::SwUndoFormatAttr( const SfxPoolItem& 
rItem, SwFormat& rChgForm
                               bool bSaveDrawPt )
     : SwUndo( SwUndoId::INSFMTATTR, rChgFormat.GetDoc() )
     , m_sFormatName(rChgFormat.GetName())
-    , m_pOldSet( rChgFormat.GetAttrSet().Clone( false ) )
+    , m_oOldSet( rChgFormat.GetAttrSet().CloneAsValue( false ) )
     , m_nNodeIndex( 0 )
     , m_nFormatWhich( rChgFormat.Which() )
     , m_bSaveDrawPt( bSaveDrawPt )
 {
     assert(m_sFormatName.getLength());
 
-    m_pOldSet->Put( rItem );
+    m_oOldSet->Put( rItem );
     Init( rChgFormat );
 }
 
 void SwUndoFormatAttr::Init( const SwFormat & rFormat )
 {
     // tdf#126017 never save SwNodeIndex, it will go stale
-    m_pOldSet->ClearItem(RES_CNTNT);
+    m_oOldSet->ClearItem(RES_CNTNT);
     // treat change of anchor specially
-    if ( SfxItemState::SET == m_pOldSet->GetItemState( RES_ANCHOR, false )) {
+    if ( SfxItemState::SET == m_oOldSet->GetItemState( RES_ANCHOR, false )) {
         SaveFlyAnchor( &rFormat, m_bSaveDrawPt );
     } else if ( RES_FRMFMT == m_nFormatWhich ) {
         const SwDoc* pDoc = rFormat.GetDoc();
@@ -159,7 +159,7 @@ void SwUndoFormatAttr::UndoImpl(::sw::UndoRedoContext & 
rContext)
     // OD 2004-10-26 #i35443#
     // Important note: <Undo(..)> also called by <ReDo(..)>
 
-    if (!m_pOldSet)
+    if (!m_oOldSet)
         return;
 
     SwFormat * pFormat = GetFormat(rContext.GetDoc());
@@ -170,7 +170,7 @@ void SwUndoFormatAttr::UndoImpl(::sw::UndoRedoContext & 
rContext)
     // restored, all other attributes are also restored.
     // Thus, keep track of its restoration
     bool bAnchorAttrRestored( false );
-    if ( SfxItemState::SET == m_pOldSet->GetItemState( RES_ANCHOR, false )) {
+    if ( SfxItemState::SET == m_oOldSet->GetItemState( RES_ANCHOR, false )) {
         bAnchorAttrRestored = RestoreFlyAnchor(rContext);
         if ( bAnchorAttrRestored ) {
             // Anchor attribute successful restored.
@@ -179,19 +179,22 @@ void SwUndoFormatAttr::UndoImpl(::sw::UndoRedoContext & 
rContext)
         } else {
             // Anchor attribute not restored due to invalid anchor position.
             // Thus, delete anchor attribute.
-            m_pOldSet->ClearItem( RES_ANCHOR );
+            m_oOldSet->ClearItem( RES_ANCHOR );
         }
     }
 
     if ( bAnchorAttrRestored )        return;
 
     SwUndoFormatAttrHelper aTmp( *pFormat, m_bSaveDrawPt );
-    pFormat->SetFormatAttr( *m_pOldSet );
+    pFormat->SetFormatAttr( *m_oOldSet );
     if ( aTmp.GetUndo() ) {
         // transfer ownership of helper object's old set
-        m_pOldSet = std::move(aTmp.GetUndo()->m_pOldSet);
+        if (aTmp.GetUndo()->m_oOldSet)
+            m_oOldSet.emplace(std::move(*aTmp.GetUndo()->m_oOldSet));
+        else
+            m_oOldSet.reset();
     } else {
-        m_pOldSet->ClearItem();
+        m_oOldSet->ClearItem();
     }
 
     if ( RES_FLYFRMFMT == m_nFormatWhich || RES_DRAWFRMFMT == m_nFormatWhich ) 
{
@@ -266,7 +269,7 @@ void SwUndoFormatAttr::RedoImpl(::sw::UndoRedoContext & 
rContext)
 
 void SwUndoFormatAttr::RepeatImpl(::sw::RepeatContext & rContext)
 {
-    if (!m_pOldSet)
+    if (!m_oOldSet)
         return;
 
     SwDoc & rDoc(rContext.GetDoc());
@@ -335,7 +338,7 @@ void SwUndoFormatAttr::PutAttr( const SfxPoolItem& rItem, 
const SwDoc& rDoc )
     {
         return; // tdf#126017 never save SwNodeIndex, it will go stale
     }
-    m_pOldSet->Put( rItem );
+    m_oOldSet->Put( rItem );
     if ( RES_ANCHOR == rItem.Which() )
     {
         SwFormat * pFormat = GetFormat( rDoc );
@@ -351,12 +354,12 @@ void SwUndoFormatAttr::SaveFlyAnchor( const SwFormat * 
pFormat, bool bSvDrwPt )
             Point aPt( static_cast<const 
SwFrameFormat*>(pFormat)->FindSdrObject()
                        ->GetRelativePos() );
             // store old value as attribute, to keep SwUndoFormatAttr small
-            m_pOldSet->Put( SwFormatFrameSize( SwFrameSize::Variable, aPt.X(), 
aPt.Y() ) );
+            m_oOldSet->Put( SwFormatFrameSize( SwFrameSize::Variable, aPt.X(), 
aPt.Y() ) );
         }
     }
 
     const SwFormatAnchor& rAnchor =
-        m_pOldSet->Get( RES_ANCHOR, false );
+        m_oOldSet->Get( RES_ANCHOR, false );
     if( !rAnchor.GetContentAnchor() )
         return;
 
@@ -375,7 +378,7 @@ void SwUndoFormatAttr::SaveFlyAnchor( const SwFormat * 
pFormat, bool bSvDrwPt )
     }
 
     SwFormatAnchor aAnchor( rAnchor.GetAnchorId(), nContent );
-    m_pOldSet->Put( aAnchor );
+    m_oOldSet->Put( aAnchor );
 }
 
 // #i35443# - Add return value, type <bool>.
@@ -387,7 +390,7 @@ bool 
SwUndoFormatAttr::RestoreFlyAnchor(::sw::UndoRedoContext & rContext)
     SwDoc *const pDoc = & rContext.GetDoc();
     SwFrameFormat* pFrameFormat = static_cast<SwFrameFormat*>( GetFormat( 
*pDoc ) );
     const SwFormatAnchor& rAnchor =
-        m_pOldSet->Get( RES_ANCHOR, false );
+        m_oOldSet->Get( RES_ANCHOR, false );
 
     SwFormatAnchor aNewAnchor( rAnchor.GetAnchorId() );
     if (RndStdIds::FLY_AT_PAGE != rAnchor.GetAnchorId()) {
@@ -420,10 +423,10 @@ bool 
SwUndoFormatAttr::RestoreFlyAnchor(::sw::UndoRedoContext & rContext)
     if( pDoc->getIDocumentLayoutAccess().GetCurrentViewShell() ) {
         if( RES_DRAWFRMFMT == pFrameFormat->Which() ) {
             // get the old cached value
-            const SwFormatFrameSize& rOldSize = m_pOldSet->Get( RES_FRM_SIZE );
+            const SwFormatFrameSize& rOldSize = m_oOldSet->Get( RES_FRM_SIZE );
             aDrawSavePt.setX( rOldSize.GetWidth() );
             aDrawSavePt.setY( rOldSize.GetHeight() );
-            m_pOldSet->ClearItem( RES_FRM_SIZE );
+            m_oOldSet->ClearItem( RES_FRM_SIZE );
 
             // write the current value into cache
             aDrawOldPt = pFrameFormat->FindSdrObject()->GetRelativePos();
@@ -458,15 +461,18 @@ bool 
SwUndoFormatAttr::RestoreFlyAnchor(::sw::UndoRedoContext & rContext)
     }
 
     {
-        m_pOldSet->Put( aNewAnchor );
+        m_oOldSet->Put( aNewAnchor );
         SwUndoFormatAttrHelper aTmp( *pFrameFormat, m_bSaveDrawPt );
-        pFrameFormat->SetFormatAttr( *m_pOldSet );
+        pFrameFormat->SetFormatAttr( *m_oOldSet );
         if ( aTmp.GetUndo() ) {
             m_nNodeIndex = aTmp.GetUndo()->m_nNodeIndex;
             // transfer ownership of helper object's old set
-            m_pOldSet = std::move(aTmp.GetUndo()->m_pOldSet);
+            if (aTmp.GetUndo()->m_oOldSet)
+                m_oOldSet.emplace(std::move(*aTmp.GetUndo()->m_oOldSet));
+            else
+                m_oOldSet.reset();
         } else {
-            m_pOldSet->ClearItem();
+            m_oOldSet->ClearItem();
         }
     }
 
@@ -477,7 +483,7 @@ bool 
SwUndoFormatAttr::RestoreFlyAnchor(::sw::UndoRedoContext & rContext)
         // change of the Contact object by setting the anchor.
         
pFrameFormat->CallSwClientNotify(sw::RestoreFlyAnchorHint(aDrawSavePt));
         // cache the old value again
-        m_pOldSet->Put(SwFormatFrameSize(SwFrameSize::Variable, 
aDrawOldPt.X(), aDrawOldPt.Y()));
+        m_oOldSet->Put(SwFormatFrameSize(SwFrameSize::Variable, 
aDrawOldPt.X(), aDrawOldPt.Y()));
     }
 
     if (RndStdIds::FLY_AS_CHAR == aNewAnchor.GetAnchorId()) {
@@ -848,10 +854,10 @@ SwUndoDefaultAttr::SwUndoDefaultAttr( const SfxItemSet& 
rSet, const SwDoc& rDoc
         // store separately, because it may change!
         m_pTabStop.reset(&pItem->Clone()->StaticWhichCast(RES_PARATR_TABSTOP));
         if ( 1 != rSet.Count() ) { // are there more attributes?
-            m_pOldSet.reset( new SfxItemSet( rSet ) );
+            m_oOldSet.emplace( rSet );
         }
     } else {
-        m_pOldSet.reset( new SfxItemSet( rSet ) );
+        m_oOldSet.emplace( rSet );
     }
 }
 
@@ -862,15 +868,16 @@ SwUndoDefaultAttr::~SwUndoDefaultAttr()
 void SwUndoDefaultAttr::UndoImpl(::sw::UndoRedoContext & rContext)
 {
     SwDoc & rDoc = rContext.GetDoc();
-    if (m_pOldSet)
+    if (m_oOldSet)
     {
         SwUndoFormatAttrHelper aTmp(
             *rDoc.GetDfltTextFormatColl() );
-        rDoc.SetDefault( *m_pOldSet );
-        m_pOldSet.reset();
+        rDoc.SetDefault( *m_oOldSet );
+        m_oOldSet.reset();
         if ( aTmp.GetUndo() ) {
             // transfer ownership of helper object's old set
-            m_pOldSet = std::move(aTmp.GetUndo()->m_pOldSet);
+            if (aTmp.GetUndo()->m_oOldSet)
+                m_oOldSet.emplace(std::move(*aTmp.GetUndo()->m_oOldSet));
         }
     }
     if (m_pTabStop)
diff --git a/sw/source/core/undo/undobj1.cxx b/sw/source/core/undo/undobj1.cxx
index 54b031c8de59..87e6c00677cb 100644
--- a/sw/source/core/undo/undobj1.cxx
+++ b/sw/source/core/undo/undobj1.cxx
@@ -488,8 +488,8 @@ SwUndoSetFlyFormat::SwUndoSetFlyFormat( SwFrameFormat& 
rFlyFormat, const SwFrame
     : SwUndo( SwUndoId::SETFLYFRMFMT, rFlyFormat.GetDoc() ), SwClient( 
&rFlyFormat ), m_pFrameFormat( &rFlyFormat ),
     m_DerivedFromFormatName( rFlyFormat.IsDefault() ? "" : 
rFlyFormat.DerivedFrom()->GetName() ),
     m_NewFormatName( rNewFrameFormat.GetName() ),
-    m_pItemSet( new SfxItemSet( *rFlyFormat.GetAttrSet().GetPool(),
-                                rFlyFormat.GetAttrSet().GetRanges() )),
+    m_oItemSet( std::in_place, *rFlyFormat.GetAttrSet().GetPool(),
+                rFlyFormat.GetAttrSet().GetRanges() ),
     m_nOldNode( 0 ), m_nNewNode( 0 ),
     m_nOldContent( 0 ), m_nNewContent( 0 ),
     m_nOldAnchorType( RndStdIds::FLY_AT_PARA ), m_nNewAnchorType( 
RndStdIds::FLY_AT_PARA ), m_bAnchorChanged( false )
@@ -571,11 +571,11 @@ void SwUndoSetFlyFormat::UndoImpl(::sw::UndoRedoContext & 
rContext)
     if( m_pFrameFormat->DerivedFrom() != pDerivedFromFrameFormat)
         m_pFrameFormat->SetDerivedFrom(pDerivedFromFrameFormat);
 
-    SfxItemIter aIter( *m_pItemSet );
+    SfxItemIter aIter( *m_oItemSet );
     for (const SfxPoolItem* pItem = aIter.GetCurItem(); pItem; pItem = 
aIter.NextItem())
     {
         if( IsInvalidItem( pItem ))
-            m_pFrameFormat->ResetFormatAttr( m_pItemSet->GetWhichByPos(
+            m_pFrameFormat->ResetFormatAttr( m_oItemSet->GetWhichByPos(
                                     aIter.GetCurPos() ));
         else
             m_pFrameFormat->SetFormatAttr( *pItem );
@@ -696,10 +696,10 @@ void SwUndoSetFlyFormat::PutAttr( sal_uInt16 nWhich, 
const SfxPoolItem* pItem )
             }
         }
         else
-            m_pItemSet->Put( *pItem );
+            m_oItemSet->Put( *pItem );
     }
     else
-        m_pItemSet->InvalidateItem( nWhich );
+        m_oItemSet->InvalidateItem( nWhich );
 }
 
 void SwUndoSetFlyFormat::SwClientNotify(const SwModify&, const SfxHint& rHint)
diff --git a/sw/source/core/undo/unsect.cxx b/sw/source/core/undo/unsect.cxx
index b2f14d8a4b44..9cc907084436 100644
--- a/sw/source/core/undo/unsect.cxx
+++ b/sw/source/core/undo/unsect.cxx
@@ -47,12 +47,12 @@
 /// class Calc needed for calculation of the hidden condition of a section.
 #include <calc.hxx>
 
-static std::unique_ptr<SfxItemSet> lcl_GetAttrSet( const SwSection& rSect )
+static std::optional<SfxItemSet> lcl_GetAttrSet( const SwSection& rSect )
 {
     // save attributes of the format (columns, color, ...)
     // Content and Protect items are not interesting since they are already
     // stored in Section, thus delete them.
-    std::unique_ptr<SfxItemSet> pAttr;
+    std::optional<SfxItemSet> oAttr;
     if( rSect.GetFormat() )
     {
         sal_uInt16 nCnt = 1;
@@ -61,16 +61,16 @@ static std::unique_ptr<SfxItemSet> lcl_GetAttrSet( const 
SwSection& rSect )
 
         if( nCnt < rSect.GetFormat()->GetAttrSet().Count() )
         {
-            pAttr.reset(new SfxItemSet( rSect.GetFormat()->GetAttrSet() ));
-            pAttr->ClearItem( RES_PROTECT );
-            pAttr->ClearItem( RES_CNTNT );
-            if( !pAttr->Count() )
+            oAttr.emplace( rSect.GetFormat()->GetAttrSet() );
+            oAttr->ClearItem( RES_PROTECT );
+            oAttr->ClearItem( RES_CNTNT );
+            if( !oAttr->Count() )
             {
-                pAttr.reset();
+                oAttr.reset();
             }
         }
     }
-    return pAttr;
+    return oAttr;
 }
 
 SwUndoInsSection::SwUndoInsSection(
@@ -322,7 +322,7 @@ class SwUndoDelSection
 private:
     std::unique_ptr<SwSectionData> const m_pSectionData; /// section not TOX
     std::unique_ptr<SwTOXBase> const m_pTOXBase; /// set iff section is TOX
-    std::unique_ptr<SfxItemSet> const m_pAttrSet;
+    std::optional<SfxItemSet> const m_oAttrSet;
     std::shared_ptr< ::sfx2::MetadatableUndo > const m_pMetadataUndo;
     sal_uLong const m_nStartNode;
     sal_uLong const m_nEndNode;
@@ -349,7 +349,7 @@ SwUndoDelSection::SwUndoDelSection(
     , m_pTOXBase( dynamic_cast<const SwTOXBaseSection*>( &rSection) !=  nullptr
             ? new SwTOXBase(static_cast<SwTOXBaseSection const&>(rSection))
             : nullptr )
-    , m_pAttrSet( ::lcl_GetAttrSet(rSection) )
+    , m_oAttrSet( ::lcl_GetAttrSet(rSection) )
     , m_pMetadataUndo( rSectionFormat.CreateUndo() )
     , m_nStartNode( pIndex->GetIndex() )
     , m_nEndNode( pIndex->GetNode().EndOfSectionIndex() )
@@ -364,16 +364,16 @@ void SwUndoDelSection::UndoImpl(::sw::UndoRedoContext & 
rContext)
     {
         // sw_redlinehide: this should work as-is; there will be another undo 
for the update
         rDoc.InsertTableOf(m_nStartNode, m_nEndNode-2, *m_pTOXBase,
-                m_pAttrSet.get());
+                m_oAttrSet ? &*m_oAttrSet : nullptr);
     }
     else
     {
         SwNodeIndex aStt( rDoc.GetNodes(), m_nStartNode );
         SwNodeIndex aEnd( rDoc.GetNodes(), m_nEndNode-2 );
         SwSectionFormat* pFormat = rDoc.MakeSectionFormat();
-        if (m_pAttrSet)
+        if (m_oAttrSet)
         {
-            pFormat->SetFormatAttr( *m_pAttrSet );
+            pFormat->SetFormatAttr( *m_oAttrSet );
         }
 
         /// OD 04.10.2002 #102894#
@@ -428,7 +428,7 @@ class SwUndoUpdateSection
 {
 private:
     std::unique_ptr<SwSectionData> m_pSectionData;
-    std::unique_ptr<SfxItemSet> m_pAttrSet;
+    std::optional<SfxItemSet> m_oAttrSet;
     sal_uLong const m_nStartNode;
     bool const m_bOnlyAttrChanged;
 
@@ -454,7 +454,7 @@ SwUndoUpdateSection::SwUndoUpdateSection(
         bool const bOnlyAttr)
     : SwUndo( SwUndoId::CHGSECTION, &pIndex->GetNode().GetDoc() )
     , m_pSectionData( new SwSectionData(rSection) )
-    , m_pAttrSet( ::lcl_GetAttrSet(rSection) )
+    , m_oAttrSet( ::lcl_GetAttrSet(rSection) )
     , m_nStartNode( pIndex->GetIndex() )
     , m_bOnlyAttrChanged( bOnlyAttr )
 {
@@ -470,19 +470,19 @@ void SwUndoUpdateSection::UndoImpl(::sw::UndoRedoContext 
& rContext)
     SwSection& rNdSect = pSectNd->GetSection();
     SwFormat* pFormat = rNdSect.GetFormat();
 
-    std::unique_ptr<SfxItemSet> pCur = ::lcl_GetAttrSet( rNdSect );
-    if (m_pAttrSet)
+    std::optional<SfxItemSet> oCur = ::lcl_GetAttrSet( rNdSect );
+    if (m_oAttrSet)
     {
         // The Content and Protect items must persist
         const SfxPoolItem* pItem;
-        m_pAttrSet->Put( pFormat->GetFormatAttr( RES_CNTNT ));
+        m_oAttrSet->Put( pFormat->GetFormatAttr( RES_CNTNT ));
         if( SfxItemState::SET == pFormat->GetItemState( RES_PROTECT, true, 
&pItem ))
         {
-            m_pAttrSet->Put( *pItem );
+            m_oAttrSet->Put( *pItem );
         }
-        pFormat->DelDiffs( *m_pAttrSet );
-        m_pAttrSet->ClearItem( RES_CNTNT );
-        pFormat->SetFormatAttr( *m_pAttrSet );
+        pFormat->DelDiffs( *m_oAttrSet );
+        m_oAttrSet->ClearItem( RES_CNTNT );
+        pFormat->SetFormatAttr( *m_oAttrSet );
     }
     else
     {
@@ -491,7 +491,10 @@ void SwUndoUpdateSection::UndoImpl(::sw::UndoRedoContext & 
rContext)
         pFormat->ResetFormatAttr( RES_HEADER, RES_OPAQUE );
         pFormat->ResetFormatAttr( RES_SURROUND, RES_FRMATR_END-1 );
     }
-    m_pAttrSet = std::move(pCur);
+    if (oCur)
+        m_oAttrSet.emplace(std::move(*oCur));
+    else
+        m_oAttrSet.reset();
 
     if (m_bOnlyAttrChanged)
         return;

Reply via email to