Hi,
I have submitted a patch for review:
    https://gerrit.libreoffice.org/3398
To pull it, you can do:
    git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/98/3398/1
Convert SmFontPickList from SfxPtrArr to std::vector
- removing SmPickList in the process, since it's only used
  as a base class for SmFontPickList
- and remove dynamic allocation, since we're always making our
  own copy, just store the data inline in the vector
Change-Id: Idedff240456788c473ac49bdaa3f6d27a217e3d6
---
M starmath/inc/utility.hxx
M starmath/source/utility.cxx
2 files changed, 71 insertions(+), 197 deletions(-)
diff --git a/starmath/inc/utility.hxx b/starmath/inc/utility.hxx
index 0f4a748..01a41cd 100644
--- a/starmath/inc/utility.hxx
+++ b/starmath/inc/utility.hxx
@@ -19,12 +19,12 @@
 #ifndef UTILITY_HXX
 #define UTILITY_HXX
 
-#include <sfx2/minarray.hxx>
 #include <vcl/font.hxx>
 #include <vcl/fixed.hxx>
 #include <vcl/combobox.hxx>
 #include <vcl/lstbox.hxx>
 #include <tools/fract.hxx>
+#include <deque>
 
 
 inline long SmPtsTo100th_mm(long nNumPts)
@@ -114,114 +114,38 @@
 
 ////////////////////////////////////////////////////////////
 //
-// SmPickList
-//
-
-class SmPickList : public SfxPtrArr
-{
-protected:
-    sal_uInt16  nSize;
-
-    virtual void   *CreateItem(const void *pItem) = 0;
-    virtual void    DestroyItem(void *pItem) = 0;
-
-    virtual bool    CompareItem(const void *pFirstItem, const void *pSecondItem) const = 0;
-
-    virtual OUString GetStringItem(void *pItem) = 0;
-
-    void       *GetPtr(sal_uInt16 nPos) const { return SfxPtrArr::GetObject(nPos); }
-    void      *&GetPtr(sal_uInt16 nPos) { return SfxPtrArr::GetObject(nPos); }
-    void        InsertPtr(sal_uInt16 nPos, void *pItem) { SfxPtrArr::Insert(nPos, pItem); }
-    void        RemovePtr(sal_uInt16 nPos, sal_uInt16 nCount = 1) { SfxPtrArr::Remove(nPos, 
nCount); }
-
-public:
-    SmPickList(sal_uInt16 nInitSize = 0, sal_uInt16 nMaxSize = 5);
-    virtual ~SmPickList();
-
-    SmPickList&   operator = (const SmPickList& rList);
-
-    void       *Get(sal_uInt16 nPos = 0) const { return GetPtr(nPos); }
-    using   SfxPtrArr::Insert;
-    void        Insert(const void* pItem);
-    void        Update(const void* pItem, const void *pNewItem);
-    using   SfxPtrArr::Remove;
-    void        Remove(const void* pItem);
-
-    using   SfxPtrArr::operator [];
-    void       *operator [] (sal_uInt16 nPos) const { return GetPtr(nPos); }
-
-    sal_uInt16      GetSize() const { return nSize; }
-    sal_uInt16      Count() const { return SfxPtrArr::Count(); }
-
-    void        Clear();
-};
-
-
-////////////////////////////////////////////////////////////
-//
 // SmFontPickList
 //
 
 class SmFontDialog;
 
-class SmFontPickList : public SmPickList
+class SmFontPickList
 {
 protected:
-    virtual void   *CreateItem(const void *pItem);
-    virtual void    DestroyItem(void *pItem);
+    sal_uInt16 nMaxItems;
+    std::deque<Font> aFontVec;
 
-    virtual bool    CompareItem(const void *pFirstItem, const void *pSecondItem) const;
-
-    virtual OUString GetStringItem(void *pItem);
+    bool     CompareItem(const Font & rFirstFont, const Font & rSecondFont) const;
+    OUString GetStringItem(const Font &rItem);
 
 public:
-    SmFontPickList()
-        : SmPickList(0, 5) {}
-    SmFontPickList(sal_uInt16 nInitSize, sal_uInt16 nMaxSize)
-        : SmPickList(nInitSize, nMaxSize) {}
-    SmFontPickList(const SmPickList& rOrig )
-        : SmPickList(rOrig) {}
+    SmFontPickList(sal_uInt16 nMax = 5) : nMaxItems(nMax) {}
     virtual ~SmFontPickList() { Clear(); }
 
-    using   SfxPtrArr::Insert;
     virtual void    Insert(const Font &rFont);
-    using   SmPickList::Update;
     virtual void    Update(const Font &rFont, const Font &rNewFont);
-    using   SfxPtrArr::Remove;
     virtual void    Remove(const Font &rFont);
 
-    using   SmPickList::Contains;
-    inline bool     Contains(const Font &rFont) const;
-    inline Font     Get(sal_uInt16 nPos = 0) const;
+    void     Clear();
+    bool     Contains(const Font &rFont) const;
+    Font     Get(sal_uInt16 nPos = 0) const;
 
-    inline SmFontPickList&  operator = (const SmFontPickList& rList);
-    using   SfxPtrArr::operator [];
-    inline Font             operator [] (sal_uInt16 nPos) const;
+    SmFontPickList&  operator = (const SmFontPickList& rList);
+    Font             operator [] (sal_uInt16 nPos) const;
 
     void            ReadFrom(const SmFontDialog& rDialog);
     void            WriteTo(SmFontDialog& rDialog) const;
 };
-
-inline SmFontPickList& SmFontPickList::operator = (const SmFontPickList& rList)
-{
-    *(SmPickList *)this = *(SmPickList *)&rList; return *this;
-}
-
-inline Font SmFontPickList::operator [] (sal_uInt16 nPos) const
-{
-    return *((Font *)SmPickList::operator[](nPos));
-}
-
-inline Font SmFontPickList::Get(sal_uInt16 nPos) const
-{
-    return nPos < Count() ? *((Font *)SmPickList::Get(nPos)) : Font();
-}
-
-inline bool SmFontPickList::Contains(const Font &rFont) const
-{
-    return SmPickList::Contains((void *)&rFont);
-}
-
 
 ////////////////////////////////////////////////////////////
 //
@@ -234,15 +158,13 @@
     DECL_LINK(SelectHdl, ListBox *);
 
 public:
-    SmFontPickListBox(Window* pParent, const ResId& rResId, sal_uInt16 nMax = 4);
+    SmFontPickListBox(Window* pParent, const ResId& rResId);
 
     SmFontPickListBox& operator = (const SmFontPickList& rList);
 
-    using   SfxPtrArr::Insert;
     virtual void    Insert(const Font &rFont);
     using   Window::Update;
     virtual void    Update(const Font &rFont, const Font &rNewFont);
-    using   SfxPtrArr::Remove;
     virtual void    Remove(const Font &rFont);
 };
 
diff --git a/starmath/source/utility.cxx b/starmath/source/utility.cxx
index cde1b35..1d450ec 100644
--- a/starmath/source/utility.cxx
+++ b/starmath/source/utility.cxx
@@ -50,122 +50,58 @@
 
 /**************************************************************************/
 
-SmPickList::SmPickList(sal_uInt16 nInitSize, sal_uInt16 nMaxSize) :
-    SfxPtrArr((sal_uInt8) nInitSize, 1)
+void SmFontPickList::Clear()
 {
-    nSize = nMaxSize;
+    aFontVec.clear();
 }
 
-
-SmPickList::~SmPickList()
+SmFontPickList& SmFontPickList::operator = (const SmFontPickList& rList)
 {
     Clear();
-}
-
-
-SmPickList& SmPickList::operator=(const SmPickList& rList)
-{
-    sal_uInt16  nPos;
-
-    Clear();
-    nSize = rList.nSize;
-    for (nPos = 0; nPos < rList.Count(); nPos++)
-        InsertPtr(nPos, CreateItem(rList.Get(nPos)));
+    nMaxItems = rList.nMaxItems;
+    for (sal_uInt16 nPos = 0; nPos < rList.aFontVec.size(); nPos++)
+        aFontVec.push_back( rList.aFontVec[nPos] );
 
     return *this;
 }
 
-
-void SmPickList::Insert(const void *pItem)
+Font SmFontPickList::operator [] (sal_uInt16 nPos) const
 {
-    Remove(pItem);
-    InsertPtr(0, CreateItem(pItem));
+    return aFontVec[nPos];
+}
 
-    if (Count() > nSize)
-    {
-        DestroyItem(GetPtr(nSize));
-        RemovePtr(nSize, 1);
-    }
+Font SmFontPickList::Get(sal_uInt16 nPos) const
+{
+    return nPos < aFontVec.size() ? aFontVec[nPos] : Font();
+}
+
+bool SmFontPickList::Contains(const Font &rFont) const
+{
+    return std::find( aFontVec.begin(), aFontVec.end(), rFont ) != aFontVec.end();
 }
 
 
-void SmPickList::Update(const void *pItem, const void *pNewItem)
-{
-    sal_uInt16  nPos;
 
-    for (nPos = 0; nPos < Count(); nPos++)
-        if (CompareItem(GetPtr(nPos), pItem))
-        {
-            DestroyItem(GetPtr(nPos));
-            GetPtr(nPos) = CreateItem(pNewItem);
-            break;
-        }
+
+bool SmFontPickList::CompareItem(const Font & rFirstFont, const Font & rSecondFont) const
+{
+  return rFirstFont.GetName() == rSecondFont.GetName() &&
+        rFirstFont.GetFamily()  == rSecondFont.GetFamily()  &&
+        rFirstFont.GetCharSet() == rSecondFont.GetCharSet() &&
+        rFirstFont.GetWeight()  == rSecondFont.GetWeight()  &&
+        rFirstFont.GetItalic()  == rSecondFont.GetItalic();
 }
 
-void SmPickList::Remove(const void *pItem)
+OUString SmFontPickList::GetStringItem(const Font &rFont)
 {
-    sal_uInt16  nPos;
+    OUStringBuffer aString(rFont.GetName());
 
-    for (nPos = 0; nPos < Count(); nPos++)
-        if (CompareItem(GetPtr(nPos), pItem))
-        {
-            DestroyItem(GetPtr(nPos));
-            RemovePtr(nPos, 1);
-            break;
-        }
-}
-
-void SmPickList::Clear()
-{
-    sal_uInt16  nPos;
-
-    for (nPos = 0; nPos < Count(); nPos++)
-        DestroyItem(GetPtr(nPos));
-
-    RemovePtr(0, Count());
-}
-
-
-/**************************************************************************/
-
-void * SmFontPickList::CreateItem(const void *pItem)
-{
-    return new Font(*((Font *) pItem));
-}
-
-void SmFontPickList::DestroyItem(void *pItem)
-{
-    delete (Font *)pItem;
-}
-
-bool SmFontPickList::CompareItem(const void *pFirstItem, const void *pSecondItem) const
-{
-    Font    *pFirstFont, *pSecondFont;
-
-    pFirstFont  = (Font *)pFirstItem;
-    pSecondFont = (Font *)pSecondItem;
-
-    if (pFirstFont->GetName() == pSecondFont->GetName())
-        if ((pFirstFont->GetFamily()  == pSecondFont->GetFamily())  &&
-            (pFirstFont->GetCharSet() == pSecondFont->GetCharSet()) &&
-            (pFirstFont->GetWeight()  == pSecondFont->GetWeight())  &&
-            (pFirstFont->GetItalic()  == pSecondFont->GetItalic()))
-            return (true);
-
-    return false;
-}
-
-OUString SmFontPickList::GetStringItem(void *pItem)
-{
-    Font *pFont = (Font *)pItem;
-    OUStringBuffer aString(pFont->GetName());
-
-    if (IsItalic( *pFont ))
+    if (IsItalic( rFont ))
     {
         aString.append(", ");
         aString.append(SM_RESSTR(RID_FONTITALIC));
     }
-    if (IsBold( *pFont ))
+    if (IsBold( rFont ))
     {
         aString.append(", ");
         aString.append(SM_RESSTR(RID_FONTBOLD));
@@ -176,17 +112,33 @@
 
 void SmFontPickList::Insert(const Font &rFont)
 {
-    SmPickList::Insert((void *)&rFont);
+    Remove(rFont);
+    aFontVec.push_front( rFont );
+
+    if (aFontVec.size() > nMaxItems)
+    {
+        aFontVec.pop_back();
+    }
 }
 
 void SmFontPickList::Update(const Font &rFont, const Font &rNewFont)
 {
-    SmPickList::Update((void *)&rFont, (void *)&rNewFont);
+    for (sal_uInt16 nPos = 0; nPos < aFontVec.size(); nPos++)
+        if (CompareItem( aFontVec[nPos], rFont ))
+        {
+            aFontVec[nPos] = rNewFont;
+            break;
+        }
 }
 
 void SmFontPickList::Remove(const Font &rFont)
 {
-    SmPickList::Remove((void *)&rFont);
+    for (sal_uInt16 nPos = 0; nPos < aFontVec.size(); nPos++)
+        if (CompareItem( aFontVec[nPos], rFont))
+        {
+            aFontVec.erase( aFontVec.begin() + nPos );
+            break;
+        }
 }
 
 
@@ -225,8 +177,8 @@
 }
 
 
-SmFontPickListBox::SmFontPickListBox(Window* pParent, const ResId& rResId, sal_uInt16 nMax) :
-    SmFontPickList(nMax, nMax),
+SmFontPickListBox::SmFontPickListBox(Window* pParent, const ResId& rResId) :
+    SmFontPickList(4),
     ListBox(pParent, rResId)
 {
     SetSelectHdl(LINK(this, SmFontPickListBox, SelectHdl));
@@ -239,11 +191,11 @@
 
     *(SmFontPickList *)this = rList;
 
-    for (nPos = 0; nPos < Count(); nPos++)
-        InsertEntry(GetStringItem(GetPtr(nPos)), nPos);
+    for (nPos = 0; nPos < aFontVec.size(); nPos++)
+        InsertEntry(GetStringItem(aFontVec[nPos]), nPos);
 
-    if (Count() > 0)
-        SelectEntry(GetStringItem(GetPtr(0)));
+    if (aFontVec.size() > 0)
+        SelectEntry(GetStringItem(aFontVec.front()));
 
     return *this;
 }
@@ -252,11 +204,11 @@
 {
     SmFontPickList::Insert(rFont);
 
-    RemoveEntry(GetStringItem(GetPtr(0)));
-    InsertEntry(GetStringItem(GetPtr(0)), 0);
-    SelectEntry(GetStringItem(GetPtr(0)));
+    RemoveEntry(GetStringItem(aFontVec.front()));
+    InsertEntry(GetStringItem(aFontVec.front()), 0);
+    SelectEntry(GetStringItem(aFontVec.front()));
 
-    while (GetEntryCount() > nSize)
+    while (GetEntryCount() > nMaxItems)
         RemoveEntry(GetEntryCount() - 1);
 
     return;
-- 
To view, visit https://gerrit.libreoffice.org/3398
To unsubscribe, visit https://gerrit.libreoffice.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Idedff240456788c473ac49bdaa3f6d27a217e3d6
Gerrit-PatchSet: 1
Gerrit-Project: core
Gerrit-Branch: master
Gerrit-Owner: Noel Grandin <noelgrandin@gmail.com>
Context
- [PATCH] Convert SmFontPickList from SfxPtrArr to std::vector · Noel Grandin (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.