From e9bb2e6f09d711833e659db3b229326d5e997266 Mon Sep 17 00:00:00 2001 From: Thorsten Behrens Date: Sun, 24 May 2015 17:21:47 +0200 Subject: tdf#62525: use cow_wrapper for SdrTextAttribute Change-Id: I8daf6d155c631cbdb850a6af95c92a578905d6e6 --- include/svx/sdr/attribute/sdrtextattribute.hxx | 7 +- svx/source/sdr/attribute/sdrtextattribute.cxx | 91 ++++++-------------------- 2 files changed, 25 insertions(+), 73 deletions(-) diff --git a/include/svx/sdr/attribute/sdrtextattribute.hxx b/include/svx/sdr/attribute/sdrtextattribute.hxx index 637b769faa97..66e3e7ace384 100644 --- a/include/svx/sdr/attribute/sdrtextattribute.hxx +++ b/include/svx/sdr/attribute/sdrtextattribute.hxx @@ -24,7 +24,7 @@ #include #include #include - +#include // predefines @@ -50,8 +50,11 @@ namespace drawinglayer { class SdrTextAttribute { + public: + typedef o3tl::cow_wrapper< ImpSdrTextAttribute > ImplType; + private: - ImpSdrTextAttribute* mpSdrTextAttribute; + ImplType mpSdrTextAttribute; public: /// constructors/assignmentoperator/destructor diff --git a/svx/source/sdr/attribute/sdrtextattribute.cxx b/svx/source/sdr/attribute/sdrtextattribute.cxx index 57d2dfd065d7..45b55fbe84ba 100644 --- a/svx/source/sdr/attribute/sdrtextattribute.cxx +++ b/svx/source/sdr/attribute/sdrtextattribute.cxx @@ -25,7 +25,7 @@ #include #include #include - +#include namespace drawinglayer @@ -35,9 +35,6 @@ namespace drawinglayer class ImpSdrTextAttribute { public: - // refcounter - sal_uInt32 mnRefCount; - // all-text attributes. The SdrText itself and a copy // of the OPO const SdrText* mpSdrText; @@ -90,8 +87,7 @@ namespace drawinglayer bool bInEditMode, bool bFixedCellHeight, bool bWrongSpell) - : mnRefCount(0), - mpSdrText(pSdrText), + : mpSdrText(pSdrText), mpOutlinerParaObject(new OutlinerParaObject(rOutlinerParaObject)), maSdrFormTextAttribute(), maTextLeftDistance(aTextLeftDistance), @@ -128,8 +124,7 @@ namespace drawinglayer } ImpSdrTextAttribute() - : mnRefCount(0), - mpSdrText(0), + : mpSdrText(0), mpOutlinerParaObject(0), maSdrFormTextAttribute(), maTextLeftDistance(0), @@ -151,14 +146,6 @@ namespace drawinglayer { } - ~ImpSdrTextAttribute() - { - if(mpOutlinerParaObject) - { - delete mpOutlinerParaObject; - } - } - // data read access const SdrText& getSdrText() const { @@ -241,24 +228,14 @@ namespace drawinglayer && isFixedCellHeight() == rCandidate.isFixedCellHeight() && isWrongSpell() == rCandidate.isWrongSpell()); } - - static ImpSdrTextAttribute* get_global_default() - { - static ImpSdrTextAttribute* pDefault = 0; - - if(!pDefault) - { - // use default constructor - pDefault = new ImpSdrTextAttribute(); - - // never delete; start with RefCount 1, not 0 - pDefault->mnRefCount++; - } - - return pDefault; - } }; + namespace + { + struct theGlobalDefault : + public rtl::Static< SdrTextAttribute::ImplType, theGlobalDefault > {}; + } + SdrTextAttribute::SdrTextAttribute( const SdrText& rSdrText, const OutlinerParaObject& rOutlinerParaObject, @@ -278,75 +255,47 @@ namespace drawinglayer bool bInEditMode, bool bFixedCellHeight, bool bWrongSpell) - : mpSdrTextAttribute(new ImpSdrTextAttribute( - &rSdrText, rOutlinerParaObject, eFormTextStyle, aTextLeftDistance, aTextUpperDistance, - aTextRightDistance, aTextLowerDistance, aSdrTextHorzAdjust, aSdrTextVertAdjust, bContour, - bFitToSize, bAutoFit, bHideContour, bBlink, bScroll, bInEditMode, bFixedCellHeight, bWrongSpell)) + : mpSdrTextAttribute( + ImpSdrTextAttribute( + &rSdrText, rOutlinerParaObject, eFormTextStyle, aTextLeftDistance, + aTextUpperDistance, aTextRightDistance, aTextLowerDistance, + aSdrTextHorzAdjust, aSdrTextVertAdjust, bContour, bFitToSize, bAutoFit, + bHideContour, bBlink, bScroll, bInEditMode, bFixedCellHeight, bWrongSpell)) { } SdrTextAttribute::SdrTextAttribute() - : mpSdrTextAttribute(ImpSdrTextAttribute::get_global_default()) + : mpSdrTextAttribute(theGlobalDefault::get()) { - mpSdrTextAttribute->mnRefCount++; } SdrTextAttribute::SdrTextAttribute(const SdrTextAttribute& rCandidate) : mpSdrTextAttribute(rCandidate.mpSdrTextAttribute) { - mpSdrTextAttribute->mnRefCount++; } SdrTextAttribute::~SdrTextAttribute() { - if(mpSdrTextAttribute->mnRefCount) - { - mpSdrTextAttribute->mnRefCount--; - } - else - { - delete mpSdrTextAttribute; - } } bool SdrTextAttribute::isDefault() const { - return mpSdrTextAttribute == ImpSdrTextAttribute::get_global_default(); + return mpSdrTextAttribute.same_object(theGlobalDefault::get()); } SdrTextAttribute& SdrTextAttribute::operator=(const SdrTextAttribute& rCandidate) { - if(rCandidate.mpSdrTextAttribute != mpSdrTextAttribute) - { - if(mpSdrTextAttribute->mnRefCount) - { - mpSdrTextAttribute->mnRefCount--; - } - else - { - delete mpSdrTextAttribute; - } - - mpSdrTextAttribute = rCandidate.mpSdrTextAttribute; - mpSdrTextAttribute->mnRefCount++; - } - + mpSdrTextAttribute = rCandidate.mpSdrTextAttribute; return *this; } bool SdrTextAttribute::operator==(const SdrTextAttribute& rCandidate) const { - if(rCandidate.mpSdrTextAttribute == mpSdrTextAttribute) - { - return true; - } - + // tdf#87509 default attr is always != non-default attr, even with same values if(rCandidate.isDefault() != isDefault()) - { return false; - } - return (*rCandidate.mpSdrTextAttribute == *mpSdrTextAttribute); + return rCandidate.mpSdrTextAttribute == mpSdrTextAttribute; } const SdrText& SdrTextAttribute::getSdrText() const -- cgit