[Libreoffice-commits] .: 2 commits - sc/inc sc/source

Kohei Yoshida kohei at kemper.freedesktop.org
Fri Jan 28 19:31:40 PST 2011


 sc/inc/funcdesc.hxx              |   29 ++++++++---------------
 sc/source/core/data/funcdesc.cxx |   48 ++++++++++++++++++++++++++++++++++-----
 2 files changed, 52 insertions(+), 25 deletions(-)

New commits:
commit 2f4dcbe19d3e423db5ccfd129013f833f0cfbb12
Author: Kohei Yoshida <kyoshida at novell.com>
Date:   Fri Jan 28 22:27:59 2011 -0500

    For some reason STLPort didn't like assigning list to vector.
    
    The code is correct & should work, but for some reason STLPort didn't
    like assigning list's data into vector via assign() method.  Luckily
    ctor assignment and swap did the trick.

diff --git a/sc/source/core/data/funcdesc.cxx b/sc/source/core/data/funcdesc.cxx
index 8073256..68dc04b 100644
--- a/sc/source/core/data/funcdesc.cxx
+++ b/sc/source/core/data/funcdesc.cxx
@@ -549,9 +549,9 @@ ScFunctionList::ScFunctionList() :
     }
 
     //Move list to vector for better random access performance
-    aFunctionList.reserve(tmpFuncList.size());
-    aFunctionList.assign(tmpFuncList.begin(),tmpFuncList.end());
+    ::std::vector<const ScFuncDesc*> tmp(tmpFuncList.begin(), tmpFuncList.end());
     tmpFuncList.clear();
+    aFunctionList.swap(tmp);
 
     //Initialize iterator
     aFunctionListIter = aFunctionList.end();
commit 406fb636d4365482079c9cd083476aca87406242
Author: Thies Pierdola <thiespierdola at gmail.com>
Date:   Fri Jan 28 21:56:06 2011 +0100

    Replaced tools/list by std::vector in ScFunctionList
    
    As the random access Get is called a couple of thousand times each time
    a spreadsheet function is used, the use of vector should have a huge
    performance gain.

diff --git a/sc/inc/funcdesc.hxx b/sc/inc/funcdesc.hxx
index 49909c5..8a2404d 100644
--- a/sc/inc/funcdesc.hxx
+++ b/sc/inc/funcdesc.hxx
@@ -29,14 +29,10 @@
 #ifndef SC_FUNCDESC_HXX
 #define SC_FUNCDESC_HXX
 
-/* Function descriptions for function wizard / autopilot / most recent used
- * list et al. Separated from the global.hxx lump, implementation still in
- * global.cxx
- */
+/* Function descriptions for function wizard / autopilot */
 
 #include "scfuncs.hrc"
 
-#include <tools/list.hxx>
 #include <formula/IFunctionDescription.hxx>
 #include <sal/types.h>
 #include <rtl/ustring.hxx>
@@ -240,26 +236,21 @@ public:
     ScFunctionList();
     ~ScFunctionList();
 
-    sal_uInt32           GetCount() const
-                    { return aFunctionList.Count(); }
+    sal_uInt32 GetCount() const
+               { return aFunctionList.size(); }
 
-    const ScFuncDesc*   First()
-                        { return (const ScFuncDesc*) aFunctionList.First(); }
+    const ScFuncDesc* First();
 
-    const ScFuncDesc*   Next()
-                        { return (const ScFuncDesc*) aFunctionList.Next(); }
+    const ScFuncDesc* Next();
 
-    const ScFuncDesc* GetFunction( sal_uInt32 nIndex ) const
-        { return static_cast<const ScFuncDesc*>(aFunctionList.GetObject(nIndex)); }
+    const ScFuncDesc* GetFunction( sal_uInt32 nIndex ) const;
 
-    ScFuncDesc* GetFunction( sal_uInt32 nIndex )
-        { return static_cast<ScFuncDesc*>(aFunctionList.GetObject(nIndex)); }
-
-    xub_StrLen      GetMaxFuncNameLen() const
-                    { return nMaxFuncNameLen; }
+    xub_StrLen GetMaxFuncNameLen() const
+               { return nMaxFuncNameLen; }
 
 private:
-    List        aFunctionList; /**< List of functions */
+    ::std::vector<const ScFuncDesc*> aFunctionList; /**< List of functions */
+    ::std::vector<const ScFuncDesc*>::iterator aFunctionListIter; /**< position in function list */
     xub_StrLen  nMaxFuncNameLen; /**< Length of longest function name */
 };
 
diff --git a/sc/source/core/data/funcdesc.cxx b/sc/source/core/data/funcdesc.cxx
index 2d34426..8073256 100644
--- a/sc/source/core/data/funcdesc.cxx
+++ b/sc/source/core/data/funcdesc.cxx
@@ -39,7 +39,6 @@
 
 #include <rtl/ustring.hxx>
 #include <rtl/ustrbuf.hxx>
-#include <tools/list.hxx>
 #include <tools/rcid.h>
 #include <tools/resid.hxx>
 #include <tools/string.hxx>
@@ -379,14 +378,13 @@ ScFunctionList::ScFunctionList() :
     ScFuncDesc* pDesc = NULL;
     xub_StrLen nStrLen = 0;
     FuncCollection* pFuncColl;
+    ::std::list<ScFuncDesc*> tmpFuncList;
     sal_uInt16 nDescBlock[] =
     {
         RID_SC_FUNCTION_DESCRIPTIONS1,
         RID_SC_FUNCTION_DESCRIPTIONS2
     };
 
-    aFunctionList.Clear();
-
     for (sal_uInt16 k = 0; k < SAL_N_ELEMENTS(nDescBlock); ++k)
     {
         ::std::auto_ptr<ScResourcePublisher> pBlock( new ScResourcePublisher( ScResId( nDescBlock[k] ) ) );
@@ -412,7 +410,7 @@ ScFunctionList::ScFunctionList() :
                 else
                 {
                     pDesc->nFIndex = i;
-                    aFunctionList.Insert( pDesc, LIST_APPEND );
+                    tmpFuncList.push_back(pDesc);
 
                     nStrLen = (*(pDesc->pFuncName)).getLength();
                     if (nStrLen > nMaxFuncNameLen)
@@ -524,7 +522,7 @@ ScFunctionList::ScFunctionList() :
             }
         }
 
-        aFunctionList.Insert(pDesc, LIST_APPEND);
+        tmpFuncList.push_back(pDesc);
         nStrLen = (*(pDesc->pFuncName)).getLength();
         if ( nStrLen > nMaxFuncNameLen)
             nMaxFuncNameLen = nStrLen;
@@ -541,7 +539,7 @@ ScFunctionList::ScFunctionList() :
 
         if ( pUnoAddIns->FillFunctionDesc( nFunc, *pDesc ) )
         {
-            aFunctionList.Insert(pDesc, LIST_APPEND);
+            tmpFuncList.push_back(pDesc);
             nStrLen = (*(pDesc->pFuncName)).getLength();
             if (nStrLen > nMaxFuncNameLen)
                 nMaxFuncNameLen = nStrLen;
@@ -549,6 +547,14 @@ ScFunctionList::ScFunctionList() :
         else
             delete pDesc;
     }
+
+    //Move list to vector for better random access performance
+    aFunctionList.reserve(tmpFuncList.size());
+    aFunctionList.assign(tmpFuncList.begin(),tmpFuncList.end());
+    tmpFuncList.clear();
+
+    //Initialize iterator
+    aFunctionListIter = aFunctionList.end();
 }
 
 ScFunctionList::~ScFunctionList()
@@ -561,6 +567,36 @@ ScFunctionList::~ScFunctionList()
     }
 }
 
+const ScFuncDesc* ScFunctionList::First()
+{
+    const ScFuncDesc* pDesc = NULL;
+    aFunctionListIter = aFunctionList.begin();
+    if(aFunctionListIter != aFunctionList.end())
+        pDesc = *aFunctionListIter;
+
+    return pDesc;
+}
+
+const ScFuncDesc* ScFunctionList::Next()
+{
+    const ScFuncDesc* pDesc = NULL;
+    if(aFunctionListIter != aFunctionList.end())
+    {
+        if((++aFunctionListIter) != aFunctionList.end())
+            pDesc = *aFunctionListIter;
+    }
+    return pDesc;
+}
+
+const ScFuncDesc* ScFunctionList::GetFunction( sal_uInt32 nIndex ) const
+{
+    const ScFuncDesc* pDesc = NULL;
+    if(nIndex < aFunctionList.size())
+        pDesc = aFunctionList.at(nIndex);
+
+    return pDesc;
+}
+
 //===================================================================
 // class ScFunctionCategory:
 //===================================================================


More information about the Libreoffice-commits mailing list