sc/source/core/tool/scmatrix.cxx |   78 ++++++++++++++++++++++++++++++---------
 1 file changed, 60 insertions(+), 18 deletions(-)

New commits:
commit 3ec61ffcbe95a64a2fe72f21c1ee1cd531d09755
Author: Kohei Yoshida <kohei.yosh...@collabora.com>
Date:   Thu Jan 2 14:43:04 2014 -0500

    Speed up matrix element access by storing last access position.
    
    This should speed up normal element access if the elements are accessed
    in sequential order.
    
    Change-Id: Ia5c688ed79aabbc1fdcfc4dd5bf4b25359a585d5

diff --git a/sc/source/core/tool/scmatrix.cxx b/sc/source/core/tool/scmatrix.cxx
index 1a5ebbb..ba6d578 100644
--- a/sc/source/core/tool/scmatrix.cxx
+++ b/sc/source/core/tool/scmatrix.cxx
@@ -191,6 +191,7 @@ _Comp CompareMatrixElemFunc<_Comp>::maComp;
 class ScMatrixImpl
 {
     MatrixImplType maMat;
+    mutable MatrixImplType::const_position_type maMatPos;
     MatrixImplType maMatFlag;
     ScInterpreter* pErrorInterpreter;
     bool            mbCloneIfConst; // Whether the matrix is cloned with a 
CloneIfConst() call.
@@ -287,13 +288,22 @@ private:
 };
 
 ScMatrixImpl::ScMatrixImpl(SCSIZE nC, SCSIZE nR) :
-    maMat(nR, nC), maMatFlag(nR, nC), pErrorInterpreter(NULL), 
mbCloneIfConst(true) {}
+    maMat(nR, nC), maMatFlag(nR, nC), pErrorInterpreter(NULL), 
mbCloneIfConst(true)
+{
+    maMatPos = maMat.end_position();
+}
 
 ScMatrixImpl::ScMatrixImpl(SCSIZE nC, SCSIZE nR, double fInitVal) :
-    maMat(nR, nC, fInitVal), maMatFlag(nR, nC), pErrorInterpreter(NULL), 
mbCloneIfConst(true) {}
+    maMat(nR, nC, fInitVal), maMatFlag(nR, nC), pErrorInterpreter(NULL), 
mbCloneIfConst(true)
+{
+    maMatPos = maMat.end_position();
+}
 
 ScMatrixImpl::ScMatrixImpl( size_t nC, size_t nR, const std::vector<bool>& 
rInitVals ) :
-    maMat(nR, nC, rInitVals.begin(), rInitVals.end()), maMatFlag(nR, nC), 
pErrorInterpreter(NULL), mbCloneIfConst(true) {}
+    maMat(nR, nC, rInitVals.begin(), rInitVals.end()), maMatFlag(nR, nC), 
pErrorInterpreter(NULL), mbCloneIfConst(true)
+{
+    maMatPos = maMat.end_position();
+}
 
 ScMatrixImpl::~ScMatrixImpl()
 {
@@ -303,6 +313,7 @@ ScMatrixImpl::~ScMatrixImpl()
 void ScMatrixImpl::Clear()
 {
     maMat.clear();
+    maMatPos = maMat.end_position();
     maMatFlag.clear();
 }
 
@@ -319,12 +330,14 @@ bool ScMatrixImpl::IsImmutable() const
 void ScMatrixImpl::Resize(SCSIZE nC, SCSIZE nR)
 {
     maMat.resize(nR, nC);
+    maMatPos = maMat.end_position();
     maMatFlag.resize(nR, nC);
 }
 
 void ScMatrixImpl::Resize(SCSIZE nC, SCSIZE nR, double fVal)
 {
     maMat.resize(nR, nC, fVal);
+    maMatPos = maMat.end_position();
     maMatFlag.resize(nR, nC);
 }
 
@@ -390,7 +403,10 @@ void ScMatrixImpl::SetErrorAtInterpreter( sal_uInt16 
nError ) const
 void ScMatrixImpl::PutDouble(double fVal, SCSIZE nC, SCSIZE nR)
 {
     if (ValidColRow( nC, nR))
+    {
         maMat.set(nR, nC, fVal);
+        maMatPos = maMat.end_position();
+    }
     else
     {
         OSL_FAIL("ScMatrixImpl::PutDouble: dimension error");
@@ -400,7 +416,10 @@ void ScMatrixImpl::PutDouble(double fVal, SCSIZE nC, 
SCSIZE nR)
 void ScMatrixImpl::PutDouble(const double* pArray, size_t nLen, SCSIZE nC, 
SCSIZE nR)
 {
     if (ValidColRow( nC, nR))
+    {
         maMat.set(nR, nC, pArray, pArray + nLen);
+        maMatPos = maMat.end_position();
+    }
     else
     {
         OSL_FAIL("ScMatrixImpl::PutDouble: dimension error");
@@ -417,7 +436,10 @@ void ScMatrixImpl::PutDouble( double fVal, SCSIZE nIndex)
 void ScMatrixImpl::PutString(const svl::SharedString& rStr, SCSIZE nC, SCSIZE 
nR)
 {
     if (ValidColRow( nC, nR))
+    {
         maMat.set(nR, nC, rStr);
+        maMatPos = maMat.end_position();
+    }
     else
     {
         OSL_FAIL("ScMatrixImpl::PutString: dimension error");
@@ -427,7 +449,10 @@ void ScMatrixImpl::PutString(const svl::SharedString& 
rStr, SCSIZE nC, SCSIZE nR
 void ScMatrixImpl::PutString(const svl::SharedString* pArray, size_t nLen, 
SCSIZE nC, SCSIZE nR)
 {
     if (ValidColRow( nC, nR))
+    {
         maMat.set(nR, nC, pArray, pArray + nLen);
+        maMatPos = maMat.end_position();
+    }
     else
     {
         OSL_FAIL("ScMatrixImpl::PutString: dimension error");
@@ -446,6 +471,7 @@ void ScMatrixImpl::PutEmpty(SCSIZE nC, SCSIZE nR)
     if (ValidColRow( nC, nR))
     {
         maMat.set_empty(nR, nC);
+        maMatPos = maMat.end_position();
         maMatFlag.set(nR, nC, false); // zero flag to indicate that this is 
'empty', not 'empty path'.
     }
     else
@@ -459,6 +485,7 @@ void ScMatrixImpl::PutEmptyPath(SCSIZE nC, SCSIZE nR)
     if (ValidColRow( nC, nR))
     {
         maMat.set_empty(nR, nC);
+        maMatPos = maMat.end_position();
         maMatFlag.set(nR, nC, true); // non-zero flag to indicate empty 'path'.
     }
     else
@@ -470,12 +497,16 @@ void ScMatrixImpl::PutEmptyPath(SCSIZE nC, SCSIZE nR)
 void ScMatrixImpl::PutError( sal_uInt16 nErrorCode, SCSIZE nC, SCSIZE nR )
 {
     maMat.set(nR, nC, CreateDoubleError(nErrorCode));
+    maMatPos = maMat.end_position();
 }
 
 void ScMatrixImpl::PutBoolean(bool bVal, SCSIZE nC, SCSIZE nR)
 {
     if (ValidColRow( nC, nR))
+    {
         maMat.set(nR, nC, bVal);
+        maMatPos = maMat.end_position();
+    }
     else
     {
         OSL_FAIL("ScMatrixImpl::PutBoolean: dimension error");
@@ -486,7 +517,8 @@ sal_uInt16 ScMatrixImpl::GetError( SCSIZE nC, SCSIZE nR) 
const
 {
     if (ValidColRowOrReplicated( nC, nR ))
     {
-        double fVal = maMat.get_numeric(nR, nC);
+        maMatPos = maMat.position(maMatPos, nR, nC);
+        double fVal = maMat.get_numeric(maMatPos);
         return GetDoubleErrorValue(fVal);
     }
     else
@@ -500,7 +532,8 @@ double ScMatrixImpl::GetDouble(SCSIZE nC, SCSIZE nR) const
 {
     if (ValidColRowOrReplicated( nC, nR ))
     {
-        double fVal = maMat.get_numeric(nR, nC);
+        maMatPos = maMat.position(maMatPos, nR, nC);
+        double fVal = maMat.get_numeric(maMatPos);
         if ( pErrorInterpreter )
         {
             sal_uInt16 nError = GetDoubleErrorValue(fVal);
@@ -528,17 +561,17 @@ svl::SharedString ScMatrixImpl::GetString(SCSIZE nC, 
SCSIZE nR) const
     if (ValidColRowOrReplicated( nC, nR ))
     {
         double fErr = 0.0;
-        MatrixImplType::const_position_type aPos = maMat.position(nR, nC);
-        switch (maMat.get_type(aPos))
+        maMatPos = maMat.position(maMatPos, nR, nC);
+        switch (maMat.get_type(maMatPos))
         {
             case mdds::mtm::element_string:
-                return maMat.get_string(aPos);
+                return maMat.get_string(maMatPos);
             case mdds::mtm::element_empty:
                 return svl::SharedString::getEmptyString();
             case mdds::mtm::element_numeric:
             case mdds::mtm::element_boolean:
                 OSL_FAIL("ScMatrixImpl::GetString: access error, no string");
-                fErr = maMat.get_numeric(aPos);
+                fErr = maMat.get_numeric(maMatPos);
             default:
                 OSL_FAIL("ScMatrixImpl::GetString: access error, no string");
         }
@@ -567,11 +600,11 @@ svl::SharedString ScMatrixImpl::GetString( 
SvNumberFormatter& rFormatter, SCSIZE
     }
 
     double fVal = 0.0;
-    MatrixImplType::const_position_type aPos = maMat.position(nR, nC);
-    switch (maMat.get_type(aPos))
+    maMatPos = maMat.position(maMatPos, nR, nC);
+    switch (maMat.get_type(maMatPos))
     {
         case mdds::mtm::element_string:
-            return maMat.get_string(aPos).getString();
+            return maMat.get_string(maMatPos).getString();
         case mdds::mtm::element_empty:
         {
             if (!maMatFlag.get<bool>(nR, nC))
@@ -588,7 +621,7 @@ svl::SharedString ScMatrixImpl::GetString( 
SvNumberFormatter& rFormatter, SCSIZE
         }
         case mdds::mtm::element_numeric:
         case mdds::mtm::element_boolean:
-            fVal = maMat.get_numeric(aPos);
+            fVal = maMat.get_numeric(maMatPos);
         break;
         default:
             ;
@@ -613,21 +646,21 @@ ScMatrixValue ScMatrixImpl::Get(SCSIZE nC, SCSIZE nR) 
const
     ScMatrixValue aVal;
     if (ValidColRowOrReplicated(nC, nR))
     {
-        MatrixImplType::const_position_type aPos = maMat.position(nR, nC);
-        mdds::mtm::element_t eType = maMat.get_type(aPos);
+        maMatPos = maMat.position(maMatPos, nR, nC);
+        mdds::mtm::element_t eType = maMat.get_type(maMatPos);
         switch (eType)
         {
             case mdds::mtm::element_boolean:
                 aVal.nType = SC_MATVAL_BOOLEAN;
-                aVal.fVal = maMat.get_boolean(aPos);
+                aVal.fVal = maMat.get_boolean(maMatPos);
             break;
             case mdds::mtm::element_numeric:
                 aVal.nType = SC_MATVAL_VALUE;
-                aVal.fVal = maMat.get_numeric(aPos);
+                aVal.fVal = maMat.get_numeric(maMatPos);
             break;
             case mdds::mtm::element_string:
                 aVal.nType = SC_MATVAL_STRING;
-                aVal.aStr = maMat.get_string(aPos);
+                aVal.aStr = maMat.get_string(maMatPos);
             break;
             case mdds::mtm::element_empty:
                 // Empty path equals empty plus flag.
@@ -739,12 +772,14 @@ void ScMatrixImpl::MatCopy(ScMatrixImpl& mRes) const
     }
 
     mRes.maMat.copy(maMat);
+    mRes.maMatPos = mRes.maMat.end_position();
 }
 
 void ScMatrixImpl::MatTrans(ScMatrixImpl& mRes) const
 {
     mRes.maMat = maMat;
     mRes.maMat.transpose();
+    mRes.maMatPos = mRes.maMat.end_position();
 }
 
 void ScMatrixImpl::FillDouble( double fVal, SCSIZE nC1, SCSIZE nR1, SCSIZE 
nC2, SCSIZE nR2 )
@@ -756,6 +791,7 @@ void ScMatrixImpl::FillDouble( double fVal, SCSIZE nC1, 
SCSIZE nR1, SCSIZE nC2,
             // Passing value array is much faster.
             std::vector<double> aVals(nR2-nR1+1, fVal);
             maMat.set(nR1, j, aVals.begin(), aVals.end());
+            maMatPos = maMat.end_position();
         }
     }
     else
@@ -770,6 +806,7 @@ void ScMatrixImpl::CompareEqual()
     CompareMatrixElemFunc<ElemEqualZero> aFunc(aSize.row, aSize.column);
     maMat.walk(aFunc);
     aFunc.swap(maMat);
+    maMatPos = maMat.end_position();
 }
 
 void ScMatrixImpl::CompareNotEqual()
@@ -778,6 +815,7 @@ void ScMatrixImpl::CompareNotEqual()
     CompareMatrixElemFunc<ElemNotEqualZero> aFunc(aSize.row, aSize.column);
     maMat.walk(aFunc);
     aFunc.swap(maMat);
+    maMatPos = maMat.end_position();
 }
 
 void ScMatrixImpl::CompareLess()
@@ -786,6 +824,7 @@ void ScMatrixImpl::CompareLess()
     CompareMatrixElemFunc<ElemLessZero> aFunc(aSize.row, aSize.column);
     maMat.walk(aFunc);
     aFunc.swap(maMat);
+    maMatPos = maMat.end_position();
 }
 
 void ScMatrixImpl::CompareGreater()
@@ -794,6 +833,7 @@ void ScMatrixImpl::CompareGreater()
     CompareMatrixElemFunc<ElemGreaterZero> aFunc(aSize.row, aSize.column);
     maMat.walk(aFunc);
     aFunc.swap(maMat);
+    maMatPos = maMat.end_position();
 }
 
 void ScMatrixImpl::CompareLessEqual()
@@ -802,6 +842,7 @@ void ScMatrixImpl::CompareLessEqual()
     CompareMatrixElemFunc<ElemLessEqualZero> aFunc(aSize.row, aSize.column);
     maMat.walk(aFunc);
     aFunc.swap(maMat);
+    maMatPos = maMat.end_position();
 }
 
 void ScMatrixImpl::CompareGreaterEqual()
@@ -810,6 +851,7 @@ void ScMatrixImpl::CompareGreaterEqual()
     CompareMatrixElemFunc<ElemGreaterEqualZero> aFunc(aSize.row, aSize.column);
     maMat.walk(aFunc);
     aFunc.swap(maMat);
+    maMatPos = maMat.end_position();
 }
 
 namespace {
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to