From 44e7cb139d921d6c003d4367a8064bc653342541 Mon Sep 17 00:00:00 2001 From: Thomas Arnhold Date: Tue, 2 Apr 2013 14:39:54 +0200 Subject: fdo#62525: use cow_wrapper for LineAttribute Change-Id: I8934156790051d52dd317b6654b1cc2e1bc381a4 --- .../inc/drawinglayer/attribute/lineattribute.hxx | 6 +- drawinglayer/source/attribute/lineattribute.cxx | 84 ++++++---------------- 2 files changed, 26 insertions(+), 64 deletions(-) (limited to 'drawinglayer') diff --git a/drawinglayer/inc/drawinglayer/attribute/lineattribute.hxx b/drawinglayer/inc/drawinglayer/attribute/lineattribute.hxx index 4984a1268d23..58eb987714e3 100644 --- a/drawinglayer/inc/drawinglayer/attribute/lineattribute.hxx +++ b/drawinglayer/inc/drawinglayer/attribute/lineattribute.hxx @@ -24,6 +24,7 @@ #include #include +#include ////////////////////////////////////////////////////////////////////////////// // predefines @@ -44,8 +45,11 @@ namespace drawinglayer { class DRAWINGLAYER_DLLPUBLIC LineAttribute { + public: + typedef o3tl::cow_wrapper< ImpLineAttribute > ImplType; + private: - ImpLineAttribute* mpLineAttribute; + ImplType mpLineAttribute; public: /// constructors/assignmentoperator/destructor diff --git a/drawinglayer/source/attribute/lineattribute.cxx b/drawinglayer/source/attribute/lineattribute.cxx index 6d506c01ae2c..e7859bf45cc3 100644 --- a/drawinglayer/source/attribute/lineattribute.cxx +++ b/drawinglayer/source/attribute/lineattribute.cxx @@ -19,6 +19,7 @@ #include #include +#include ////////////////////////////////////////////////////////////////////////////// @@ -29,9 +30,6 @@ namespace drawinglayer class ImpLineAttribute { public: - // refcounter - sal_uInt32 mnRefCount; - // data definitions basegfx::BColor maColor; // color double mfWidth; // absolute line width @@ -43,14 +41,21 @@ namespace drawinglayer double fWidth, basegfx::B2DLineJoin aB2DLineJoin, com::sun::star::drawing::LineCap aLineCap) - : mnRefCount(0), - maColor(rColor), + : maColor(rColor), mfWidth(fWidth), meLineJoin(aB2DLineJoin), meLineCap(aLineCap) { } + ImpLineAttribute() + : maColor(basegfx::BColor()), + mfWidth(0.0), + meLineJoin(basegfx::B2DLINEJOIN_ROUND), + meLineCap(com::sun::star::drawing::LineCap_BUTT) + { + } + // data read access const basegfx::BColor& getColor() const { return maColor; } double getWidth() const { return mfWidth; } @@ -64,34 +69,21 @@ namespace drawinglayer && getLineJoin() == rCandidate.getLineJoin() && getLineCap() == rCandidate.getLineCap()); } - - static ImpLineAttribute* get_global_default() - { - static ImpLineAttribute* pDefault = 0; - - if(!pDefault) - { - pDefault = new ImpLineAttribute( - basegfx::BColor(), - 0.0, - basegfx::B2DLINEJOIN_ROUND, - com::sun::star::drawing::LineCap_BUTT); - - // never delete; start with RefCount 1, not 0 - pDefault->mnRefCount++; - } - - return pDefault; - } }; + namespace + { + struct theGlobalDefault : + public rtl::Static< LineAttribute::ImplType, theGlobalDefault > {}; + } + LineAttribute::LineAttribute( const basegfx::BColor& rColor, double fWidth, basegfx::B2DLineJoin aB2DLineJoin, com::sun::star::drawing::LineCap aLineCap) : mpLineAttribute( - new ImpLineAttribute( + ImpLineAttribute( rColor, fWidth, aB2DLineJoin, @@ -100,67 +92,33 @@ namespace drawinglayer } LineAttribute::LineAttribute() - : mpLineAttribute(ImpLineAttribute::get_global_default()) + : mpLineAttribute(theGlobalDefault::get()) { - mpLineAttribute->mnRefCount++; } LineAttribute::LineAttribute(const LineAttribute& rCandidate) : mpLineAttribute(rCandidate.mpLineAttribute) { - mpLineAttribute->mnRefCount++; } LineAttribute::~LineAttribute() { - if(mpLineAttribute->mnRefCount) - { - mpLineAttribute->mnRefCount--; - } - else - { - delete mpLineAttribute; - } } bool LineAttribute::isDefault() const { - return mpLineAttribute == ImpLineAttribute::get_global_default(); + return mpLineAttribute.same_object(theGlobalDefault::get()); } LineAttribute& LineAttribute::operator=(const LineAttribute& rCandidate) { - if(rCandidate.mpLineAttribute != mpLineAttribute) - { - if(mpLineAttribute->mnRefCount) - { - mpLineAttribute->mnRefCount--; - } - else - { - delete mpLineAttribute; - } - - mpLineAttribute = rCandidate.mpLineAttribute; - mpLineAttribute->mnRefCount++; - } - + mpLineAttribute = rCandidate.mpLineAttribute; return *this; } bool LineAttribute::operator==(const LineAttribute& rCandidate) const { - if(rCandidate.mpLineAttribute == mpLineAttribute) - { - return true; - } - - if(rCandidate.isDefault() != isDefault()) - { - return false; - } - - return (*rCandidate.mpLineAttribute == *mpLineAttribute); + return rCandidate.mpLineAttribute == mpLineAttribute; } const basegfx::BColor& LineAttribute::getColor() const -- cgit