diff options
author | Thomas Arnhold <thomas@arnhold.org> | 2013-04-02 14:39:54 +0200 |
---|---|---|
committer | Thomas Arnhold <thomas@arnhold.org> | 2013-04-02 14:56:43 +0200 |
commit | 44e7cb139d921d6c003d4367a8064bc653342541 (patch) | |
tree | bda31f26eb167dbc1ede0412f4b251bd458d7767 /drawinglayer | |
parent | 67e5e3763f31fdc906c8e9b3239b636bce3139ed (diff) |
fdo#62525: use cow_wrapper for LineAttribute
Change-Id: I8934156790051d52dd317b6654b1cc2e1bc381a4
Diffstat (limited to 'drawinglayer')
-rw-r--r-- | drawinglayer/inc/drawinglayer/attribute/lineattribute.hxx | 6 | ||||
-rw-r--r-- | drawinglayer/source/attribute/lineattribute.cxx | 84 |
2 files changed, 26 insertions, 64 deletions
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 <basegfx/vector/b2enums.hxx> #include <com/sun/star/drawing/LineCap.hpp> +#include <o3tl/cow_wrapper.hxx> ////////////////////////////////////////////////////////////////////////////// // 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 <drawinglayer/attribute/lineattribute.hxx> #include <basegfx/color/bcolor.hxx> +#include <rtl/instance.hxx> ////////////////////////////////////////////////////////////////////////////// @@ -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 |