Date: prev next · Thread: first prev next last
2013 Archives by date, by thread · List index


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@arnhold.org>


Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.