Hi,
I have submitted a patch for review:
    https://gerrit.libreoffice.org/3074
To pull it, you can do:
    git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/74/3074/1
fdo#62525: use cow_wrapper for FontAttribute
Change-Id: Ic07da7c7cf225a910e6f0fa4f6d20c4700e7ec7a
---
M drawinglayer/inc/drawinglayer/attribute/fontattribute.hxx
M drawinglayer/source/attribute/fontattribute.cxx
2 files changed, 31 insertions(+), 63 deletions(-)
diff --git a/drawinglayer/inc/drawinglayer/attribute/fontattribute.hxx 
b/drawinglayer/inc/drawinglayer/attribute/fontattribute.hxx
index 36686fe..b49ab83 100644
--- a/drawinglayer/inc/drawinglayer/attribute/fontattribute.hxx
+++ b/drawinglayer/inc/drawinglayer/attribute/fontattribute.hxx
@@ -21,6 +21,7 @@
 #define INCLUDED_DRAWINGLAYER_ATTRIBUTE_FONTATTRIBUTE_HXX
 
 #include <drawinglayer/drawinglayerdllapi.h>
+#include <o3tl/cow_wrapper.hxx>
 
 //////////////////////////////////////////////////////////////////////////////
 // predefines
@@ -44,8 +45,11 @@
          */
         class DRAWINGLAYER_DLLPUBLIC FontAttribute
         {
+        public:
+            typedef o3tl::cow_wrapper< ImpFontAttribute > ImplType;
+
         private:
-            ImpFontAttribute*               mpFontAttribute;
+            ImplType mpFontAttribute;
 
         public:
             /// constructors/assignmentoperator/destructor
diff --git a/drawinglayer/source/attribute/fontattribute.cxx 
b/drawinglayer/source/attribute/fontattribute.cxx
index 627fb6c..c2f23a7 100644
--- a/drawinglayer/source/attribute/fontattribute.cxx
+++ b/drawinglayer/source/attribute/fontattribute.cxx
@@ -29,9 +29,6 @@
         class ImpFontAttribute
         {
         public:
-            // refcounter
-            sal_uInt32                              mnRefCount;
-
             /// core data
             String                                      maFamilyName;       // Font Family Name
             String                                      maStyleName;        // Font Style Name
@@ -57,8 +54,7 @@
                 bool bOutline,
                 bool bRTL,
                 bool bBiDiStrong)
-            :   mnRefCount(0),
-                maFamilyName(rFamilyName),
+            :   maFamilyName(rFamilyName),
                 maStyleName(rStyleName),
                 mnWeight(nWeight),
                 mbSymbol(bSymbol),
@@ -68,6 +64,20 @@
                 mbRTL(bRTL),
                 mbBiDiStrong(bBiDiStrong),
                 mbMonospaced(bMonospaced)
+            {
+            }
+
+            ImpFontAttribute()
+            :   maFamilyName(String()),
+                maStyleName(String()),
+                mnWeight(0),
+                mbSymbol(false),
+                mbVertical(false),
+                mbItalic(false),
+                mbOutline(false),
+                mbRTL(false),
+                mbBiDiStrong(false),
+                mbMonospaced(false)
             {
             }
 
@@ -96,25 +106,13 @@
                     && getBiDiStrong() == rCompare.getBiDiStrong()
                     && getMonospaced() == rCompare.getMonospaced());
             }
-
-            static ImpFontAttribute* get_global_default()
-            {
-                static ImpFontAttribute* pDefault = 0;
-
-                if(!pDefault)
-                {
-                    pDefault = new ImpFontAttribute(
-                        String(), String(),
-                        0,
-                        false, false, false, false, false, false, false);
-
-                    // never delete; start with RefCount 1, not 0
-                    pDefault->mnRefCount++;
-                }
-
-                return pDefault;
-            }
         };
+
+        namespace
+        {
+            struct theGlobalDefault :
+                public rtl::Static< FontAttribute::ImplType, theGlobalDefault > {};
+        }
 
         FontAttribute::FontAttribute(
             const String& rFamilyName,
@@ -127,73 +125,39 @@
             bool bOutline,
             bool bRTL,
             bool bBiDiStrong)
-        :   mpFontAttribute(new ImpFontAttribute(
+        :   mpFontAttribute(ImpFontAttribute(
                 rFamilyName, rStyleName, nWeight, bSymbol, bVertical, bItalic, bMonospaced, 
bOutline, bRTL, bBiDiStrong))
         {
         }
 
         FontAttribute::FontAttribute()
-        :   mpFontAttribute(ImpFontAttribute::get_global_default())
+        :   mpFontAttribute(theGlobalDefault::get())
         {
-            mpFontAttribute->mnRefCount++;
         }
 
         FontAttribute::FontAttribute(const FontAttribute& rCandidate)
         :   mpFontAttribute(rCandidate.mpFontAttribute)
         {
-            mpFontAttribute->mnRefCount++;
         }
 
         FontAttribute::~FontAttribute()
         {
-            if(mpFontAttribute->mnRefCount)
-            {
-                mpFontAttribute->mnRefCount--;
-            }
-            else
-            {
-                delete mpFontAttribute;
-            }
         }
 
         bool FontAttribute::isDefault() const
         {
-            return mpFontAttribute == ImpFontAttribute::get_global_default();
+            return mpFontAttribute.same_object(theGlobalDefault::get());
         }
 
         FontAttribute& FontAttribute::operator=(const FontAttribute& rCandidate)
         {
-            if(rCandidate.mpFontAttribute != mpFontAttribute)
-            {
-                if(mpFontAttribute->mnRefCount)
-                {
-                    mpFontAttribute->mnRefCount--;
-                }
-                else
-                {
-                    delete mpFontAttribute;
-                }
-
-                mpFontAttribute = rCandidate.mpFontAttribute;
-                mpFontAttribute->mnRefCount++;
-            }
-
+            mpFontAttribute = rCandidate.mpFontAttribute;
             return *this;
         }
 
         bool FontAttribute::operator==(const FontAttribute& rCandidate) const
         {
-            if(rCandidate.mpFontAttribute == mpFontAttribute)
-            {
-                return true;
-            }
-
-            if(rCandidate.isDefault() != isDefault())
-            {
-                return false;
-            }
-
-            return (*rCandidate.mpFontAttribute == *mpFontAttribute);
+            return rCandidate.mpFontAttribute == mpFontAttribute;
         }
 
         const String& FontAttribute::getFamilyName() const
-- 
To view, visit https://gerrit.libreoffice.org/3074
To unsubscribe, visit https://gerrit.libreoffice.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ic07da7c7cf225a910e6f0fa4f6d20c4700e7ec7a
Gerrit-PatchSet: 1
Gerrit-Project: core
Gerrit-Branch: master
Gerrit-Owner: Thomas Arnhold <thomas@arnhold.org>
Context
- [PATCH] fdo#62525: use cow_wrapper for FontAttribute · Thomas Arnhold (via Code Review)
 
  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.