[PATCH] fdo#62525: use cow_wrapper for SdrShadowAttribute
Thomas Arnhold (via Code Review)
gerrit at gerrit.libreoffice.org
Sat Mar 23 12:35:04 PDT 2013
Hi,
I have submitted a patch for review:
https://gerrit.libreoffice.org/2946
To pull it, you can do:
git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/46/2946/1
fdo#62525: use cow_wrapper for SdrShadowAttribute
Thanks to Thorsten.
Change-Id: I9b5435d2326e9ebf340e88025eeea25ff6388ea2
---
M drawinglayer/inc/drawinglayer/attribute/sdrshadowattribute.hxx
M drawinglayer/source/attribute/sdrshadowattribute.cxx
2 files changed, 26 insertions(+), 63 deletions(-)
diff --git a/drawinglayer/inc/drawinglayer/attribute/sdrshadowattribute.hxx b/drawinglayer/inc/drawinglayer/attribute/sdrshadowattribute.hxx
index 91657cd..ee1f362 100644
--- a/drawinglayer/inc/drawinglayer/attribute/sdrshadowattribute.hxx
+++ b/drawinglayer/inc/drawinglayer/attribute/sdrshadowattribute.hxx
@@ -21,6 +21,7 @@
#define INCLUDED_DRAWINGLAYER_ATTRIBUTE_SDRSHADOWATTRIBUTE_HXX
#include <drawinglayer/drawinglayerdllapi.h>
+#include <o3tl/cow_wrapper.hxx>
//////////////////////////////////////////////////////////////////////////////
// predefines
@@ -42,8 +43,11 @@
{
class DRAWINGLAYER_DLLPUBLIC SdrShadowAttribute
{
+ public:
+ typedef o3tl::cow_wrapper< ImpSdrShadowAttribute > ImplType;
+
private:
- ImpSdrShadowAttribute* mpSdrShadowAttribute;
+ ImplType mpSdrShadowAttribute;
public:
/// constructors/assignmentoperator/destructor
diff --git a/drawinglayer/source/attribute/sdrshadowattribute.cxx b/drawinglayer/source/attribute/sdrshadowattribute.cxx
index f6b5e49..9705f6a 100644
--- a/drawinglayer/source/attribute/sdrshadowattribute.cxx
+++ b/drawinglayer/source/attribute/sdrshadowattribute.cxx
@@ -20,6 +20,7 @@
#include <drawinglayer/attribute/sdrshadowattribute.hxx>
#include <basegfx/vector/b2dvector.hxx>
#include <basegfx/color/bcolor.hxx>
+#include <rtl/instance.hxx>
//////////////////////////////////////////////////////////////////////////////
@@ -30,9 +31,6 @@
class ImpSdrShadowAttribute
{
public:
- // refcounter
- sal_uInt32 mnRefCount;
-
// shadow definitions
basegfx::B2DVector maOffset; // shadow offset 1/100th mm
double mfTransparence; // [0.0 .. 1.0], 0.0==no transp.
@@ -42,10 +40,16 @@
const basegfx::B2DVector& rOffset,
double fTransparence,
const basegfx::BColor& rColor)
- : mnRefCount(0),
- maOffset(rOffset),
+ : maOffset(rOffset),
mfTransparence(fTransparence),
maColor(rColor)
+ {
+ }
+
+ ImpSdrShadowAttribute()
+ : maOffset(basegfx::B2DVector()),
+ mfTransparence(0.0),
+ maColor(basegfx::BColor())
{
}
@@ -60,97 +64,52 @@
&& getTransparence() == rCandidate.getTransparence()
&& getColor() == rCandidate.getColor());
}
-
- static ImpSdrShadowAttribute* get_global_default()
- {
- static ImpSdrShadowAttribute* pDefault = 0;
-
- if(!pDefault)
- {
- pDefault = new ImpSdrShadowAttribute(
- basegfx::B2DVector(),
- 0.0,
- basegfx::BColor());
-
- // never delete; start with RefCount 1, not 0
- pDefault->mnRefCount++;
- }
-
- return pDefault;
- }
};
+
+ namespace
+ {
+ struct theGlobalDefault :
+ public rtl::Static< SdrShadowAttribute::ImplType, theGlobalDefault > {};
+ }
+
SdrShadowAttribute::SdrShadowAttribute(
const basegfx::B2DVector& rOffset,
double fTransparence,
const basegfx::BColor& rColor)
- : mpSdrShadowAttribute(new ImpSdrShadowAttribute(
+ : mpSdrShadowAttribute(ImpSdrShadowAttribute(
rOffset, fTransparence, rColor))
{
}
SdrShadowAttribute::SdrShadowAttribute()
- : mpSdrShadowAttribute(ImpSdrShadowAttribute::get_global_default())
+ : mpSdrShadowAttribute(theGlobalDefault::get())
{
- mpSdrShadowAttribute->mnRefCount++;
}
SdrShadowAttribute::SdrShadowAttribute(const SdrShadowAttribute& rCandidate)
: mpSdrShadowAttribute(rCandidate.mpSdrShadowAttribute)
{
- mpSdrShadowAttribute->mnRefCount++;
}
SdrShadowAttribute::~SdrShadowAttribute()
{
- if(mpSdrShadowAttribute->mnRefCount)
- {
- mpSdrShadowAttribute->mnRefCount--;
- }
- else
- {
- delete mpSdrShadowAttribute;
- }
}
bool SdrShadowAttribute::isDefault() const
{
- return mpSdrShadowAttribute == ImpSdrShadowAttribute::get_global_default();
+ return mpSdrShadowAttribute.same_object(theGlobalDefault::get());
}
SdrShadowAttribute& SdrShadowAttribute::operator=(const SdrShadowAttribute& rCandidate)
{
- if(rCandidate.mpSdrShadowAttribute != mpSdrShadowAttribute)
- {
- if(mpSdrShadowAttribute->mnRefCount)
- {
- mpSdrShadowAttribute->mnRefCount--;
- }
- else
- {
- delete mpSdrShadowAttribute;
- }
-
- mpSdrShadowAttribute = rCandidate.mpSdrShadowAttribute;
- mpSdrShadowAttribute->mnRefCount++;
- }
-
+ mpSdrShadowAttribute = rCandidate.mpSdrShadowAttribute;
return *this;
}
bool SdrShadowAttribute::operator==(const SdrShadowAttribute& rCandidate) const
{
- if(rCandidate.mpSdrShadowAttribute == mpSdrShadowAttribute)
- {
- return true;
- }
-
- if(rCandidate.isDefault() != isDefault())
- {
- return false;
- }
-
- return (*rCandidate.mpSdrShadowAttribute == *mpSdrShadowAttribute);
+ return mpSdrShadowAttribute == rCandidate.mpSdrShadowAttribute;
}
const basegfx::B2DVector& SdrShadowAttribute::getOffset() const
--
To view, visit https://gerrit.libreoffice.org/2946
To unsubscribe, visit https://gerrit.libreoffice.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I9b5435d2326e9ebf340e88025eeea25ff6388ea2
Gerrit-PatchSet: 1
Gerrit-Project: core
Gerrit-Branch: master
Gerrit-Owner: Thomas Arnhold <thomas at arnhold.org>
More information about the LibreOffice
mailing list