[Libreoffice-commits] core.git: 3 commits - sc/inc sc/source
Kohei Yoshida
kohei.yoshida at collabora.com
Sat Oct 19 10:56:50 PDT 2013
sc/inc/compare.hxx | 2
sc/inc/scmatrix.hxx | 8 ++-
sc/source/core/inc/interpre.hxx | 2
sc/source/core/tool/interpr1.cxx | 83 +++++++++++++++++----------------------
sc/source/core/tool/scmatrix.cxx | 64 ++++++++++++++++++++++++------
5 files changed, 99 insertions(+), 60 deletions(-)
New commits:
commit 75e6bcba872bc1fd7b4316ff219fb6545e9f542d
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date: Sat Oct 19 13:55:53 2013 -0400
Construct and initialize result matrix in one step.
It's faster this way, than first constructing it then populating it
in two separate steps.
Change-Id: I61d30ed33a63dcf4c89b18d80ae4c3217cc43015
diff --git a/sc/inc/scmatrix.hxx b/sc/inc/scmatrix.hxx
index b2a5d8d..f2508a6 100644
--- a/sc/inc/scmatrix.hxx
+++ b/sc/inc/scmatrix.hxx
@@ -202,6 +202,8 @@ public:
ScMatrix(SCSIZE nC, SCSIZE nR);
ScMatrix(SCSIZE nC, SCSIZE nR, double fInitVal);
+ ScMatrix( size_t nC, size_t nR, const std::vector<bool>& rInitVals );
+
/** Clone the matrix. */
ScMatrix* Clone() const;
@@ -351,8 +353,8 @@ public:
double GetMaxValue( bool bTextAsZero ) const;
double GetMinValue( bool bTextAsZero ) const;
- void CompareMatrix(
- ScMatrix& rResMat, sc::Compare& rComp, size_t nMatPos, sc::CompareOptions* pOptions = NULL ) const;
+ ScMatrixRef CompareMatrix(
+ sc::Compare& rComp, size_t nMatPos, sc::CompareOptions* pOptions = NULL ) const;
/**
* Convert the content of matrix into a linear array of numeric values.
diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx
index 69cfa10..2cea9a2 100644
--- a/sc/source/core/tool/interpr1.cxx
+++ b/sc/source/core/tool/interpr1.cxx
@@ -1018,11 +1018,6 @@ sc::RangeMatrix ScInterpreter::CompareMat( ScQueryOp eOp, sc::CompareOptions* pO
else if (aMat[0].mpMat || aMat[1].mpMat)
{
size_t i = ( aMat[0].mpMat ? 0 : 1);
- SCSIZE nC, nR;
- aMat[i].mpMat->GetDimensions(nC, nR);
- aRes.mpMat = GetNewMat(nC, nR, false);
- if (!aRes.mpMat)
- return aRes;
aRes.mnCol1 = aMat[i].mnCol1;
aRes.mnRow1 = aMat[i].mnRow1;
@@ -1032,8 +1027,9 @@ sc::RangeMatrix ScInterpreter::CompareMat( ScQueryOp eOp, sc::CompareOptions* pO
aRes.mnTab2 = aMat[i].mnTab2;
ScMatrix& rMat = *aMat[i].mpMat;
- ScMatrix& rResMat = *aRes.mpMat;
- rMat.CompareMatrix(rResMat, aComp, i, pOptions);
+ aRes.mpMat = rMat.CompareMatrix(aComp, i, pOptions);
+ if (!aRes.mpMat)
+ return aRes;
}
nCurFmtType = nFuncFmtType = NUMBERFORMAT_LOGICAL;
diff --git a/sc/source/core/tool/scmatrix.cxx b/sc/source/core/tool/scmatrix.cxx
index 489dcfe..3fbdc7f 100644
--- a/sc/source/core/tool/scmatrix.cxx
+++ b/sc/source/core/tool/scmatrix.cxx
@@ -200,6 +200,9 @@ class ScMatrixImpl
public:
ScMatrixImpl(SCSIZE nC, SCSIZE nR);
ScMatrixImpl(SCSIZE nC, SCSIZE nR, double fInitVal);
+
+ ScMatrixImpl( size_t nC, size_t nR, const std::vector<bool>& rInitVals );
+
~ScMatrixImpl();
void Clear();
@@ -269,7 +272,7 @@ public:
double GetMaxValue( bool bTextAsZero ) const;
double GetMinValue( bool bTextAsZero ) const;
- void CompareMatrix( ScMatrix& rResMat, sc::Compare& rComp, size_t nMatPos, sc::CompareOptions* pOptions ) const;
+ ScMatrixRef CompareMatrix( sc::Compare& rComp, size_t nMatPos, sc::CompareOptions* pOptions ) const;
void GetDoubleArray( std::vector<double>& rArray, bool bEmptyAsZero ) const;
void MergeDoubleArray( std::vector<double>& rArray, ScMatrix::Op eOp ) const;
@@ -289,6 +292,9 @@ ScMatrixImpl::ScMatrixImpl(SCSIZE nC, SCSIZE nR) :
ScMatrixImpl::ScMatrixImpl(SCSIZE nC, SCSIZE nR, double fInitVal) :
maMat(nR, nC, fInitVal), maMatFlag(nR, nC), pErrorInterpreter(NULL), mbCloneIfConst(true) {}
+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) {}
+
ScMatrixImpl::~ScMatrixImpl()
{
Clear();
@@ -1516,8 +1522,8 @@ double ScMatrixImpl::GetMinValue( bool bTextAsZero ) const
return aFunc.getValue();
}
-void ScMatrixImpl::CompareMatrix(
- ScMatrix& rResMat, sc::Compare& rComp, size_t nMatPos, sc::CompareOptions* pOptions ) const
+ScMatrixRef ScMatrixImpl::CompareMatrix(
+ sc::Compare& rComp, size_t nMatPos, sc::CompareOptions* pOptions ) const
{
MatrixImplType::size_pair_type aSize = maMat.size();
size_t nSize = aSize.column * aSize.row;
@@ -1526,8 +1532,10 @@ void ScMatrixImpl::CompareMatrix(
// We assume the result matrix has the same dimension as this matrix.
const std::vector<bool>& rResVal = aFunc.getValues();
- if (nSize == rResVal.size())
- rResMat.pImpl->maMat.set(0, 0, rResVal.begin(), rResVal.end());
+ if (nSize != rResVal.size())
+ ScMatrixRef();
+
+ return ScMatrixRef(new ScMatrix(aSize.column, aSize.row, rResVal));
}
void ScMatrixImpl::GetDoubleArray( std::vector<double>& rArray, bool bEmptyAsZero ) const
@@ -1682,6 +1690,13 @@ ScMatrix::ScMatrix(SCSIZE nC, SCSIZE nR, double fInitVal) :
SAL_WARN_IF( !nR, "sc", "ScMatrix with 0 rows!");
}
+ScMatrix::ScMatrix( size_t nC, size_t nR, const std::vector<bool>& rInitVals ) :
+ pImpl(new ScMatrixImpl(nC, nR, rInitVals)), nRefCnt(0)
+{
+ SAL_WARN_IF( !nC, "sc", "ScMatrix with 0 columns!");
+ SAL_WARN_IF( !nR, "sc", "ScMatrix with 0 rows!");
+}
+
ScMatrix::~ScMatrix()
{
delete pImpl;
@@ -1985,9 +2000,10 @@ double ScMatrix::GetMinValue( bool bTextAsZero ) const
return pImpl->GetMinValue(bTextAsZero);
}
-void ScMatrix::CompareMatrix( ScMatrix& rResMat, sc::Compare& rComp, size_t nMatPos, sc::CompareOptions* pOptions ) const
+ScMatrixRef ScMatrix::CompareMatrix(
+ sc::Compare& rComp, size_t nMatPos, sc::CompareOptions* pOptions ) const
{
- pImpl->CompareMatrix(rResMat, rComp, nMatPos, pOptions);
+ return pImpl->CompareMatrix(rComp, nMatPos, pOptions);
}
void ScMatrix::GetDoubleArray( std::vector<double>& rArray, bool bEmptyAsZero ) const
commit 8e8b43a03e77dd251876c1de0ac06eeeb09192cd
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date: Sat Oct 19 13:08:46 2013 -0400
Generate boolean comparison result array in one step.
This is faster than doing it in two steps as was previously done.
Change-Id: I1417e9c6add9d20ee8d68f0c1c91c7d24a0f79b3
diff --git a/sc/inc/compare.hxx b/sc/inc/compare.hxx
index b4e4a50..0bbf8dc 100644
--- a/sc/inc/compare.hxx
+++ b/sc/inc/compare.hxx
@@ -35,9 +35,11 @@ struct Compare
bool bVal[2];
bool bEmpty[2];
+ ScQueryOp meOp;
bool mbIgnoreCase;
Compare( OUString* p1, OUString* p2 ) :
+ meOp(SC_EQUAL),
mbIgnoreCase(true)
{
pVal[0] = p1;
diff --git a/sc/inc/scmatrix.hxx b/sc/inc/scmatrix.hxx
index 6fe7a5e..b2a5d8d 100644
--- a/sc/inc/scmatrix.hxx
+++ b/sc/inc/scmatrix.hxx
@@ -109,6 +109,8 @@ struct ScMatrixValue
*/
class SC_DLLPUBLIC ScMatrix
{
+ friend class ScMatrixImpl;
+
ScMatrixImpl* pImpl;
mutable size_t nRefCnt; // reference count
diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx
index d308936..69cfa10 100644
--- a/sc/source/core/tool/interpr1.cxx
+++ b/sc/source/core/tool/interpr1.cxx
@@ -883,6 +883,7 @@ sc::RangeMatrix ScInterpreter::CompareMat( ScQueryOp eOp, sc::CompareOptions* pO
{
OUString aVal1, aVal2;
sc::Compare aComp( &aVal1, &aVal2 );
+ aComp.meOp = eOp;
aComp.mbIgnoreCase = pDok->GetDocOptions().IsIgnoreCase();
sc::RangeMatrix aMat[2];
ScAddress aAdr;
@@ -1033,32 +1034,6 @@ sc::RangeMatrix ScInterpreter::CompareMat( ScQueryOp eOp, sc::CompareOptions* pO
ScMatrix& rMat = *aMat[i].mpMat;
ScMatrix& rResMat = *aRes.mpMat;
rMat.CompareMatrix(rResMat, aComp, i, pOptions);
-
- switch (eOp)
- {
- case SC_EQUAL:
- aRes.mpMat->CompareEqual();
- break;
- case SC_LESS:
- aRes.mpMat->CompareLess();
- break;
- case SC_GREATER:
- aRes.mpMat->CompareGreater();
- break;
- case SC_LESS_EQUAL:
- aRes.mpMat->CompareLessEqual();
- break;
- case SC_GREATER_EQUAL:
- aRes.mpMat->CompareGreaterEqual();
- break;
- case SC_NOT_EQUAL:
- aRes.mpMat->CompareNotEqual();
- break;
- default:
- OSL_TRACE( "ScInterpreter::QueryMat: unhandled comparison operator: %d", (int)eOp);
- aRes.mpMat.reset();
- return aRes;
- }
}
nCurFmtType = nFuncFmtType = NUMBERFORMAT_LOGICAL;
diff --git a/sc/source/core/tool/scmatrix.cxx b/sc/source/core/tool/scmatrix.cxx
index cc2106d..489dcfe 100644
--- a/sc/source/core/tool/scmatrix.cxx
+++ b/sc/source/core/tool/scmatrix.cxx
@@ -1217,12 +1217,36 @@ class CompareMatrixFunc : std::unary_function<MatrixImplType::element_block_type
sc::Compare& mrComp;
size_t mnMatPos;
sc::CompareOptions* mpOptions;
-
- std::vector<double> maResValues;
+ std::vector<bool> maResValues;
void compare()
{
- maResValues.push_back(sc::CompareFunc(mrComp, mpOptions));
+ double fVal = sc::CompareFunc(mrComp, mpOptions);
+ bool bRes = false;
+ switch (mrComp.meOp)
+ {
+ case SC_EQUAL:
+ bRes = fVal == 0.0;
+ break;
+ case SC_LESS:
+ bRes = fVal < 0.0;
+ break;
+ case SC_GREATER:
+ bRes = fVal > 0.0;
+ break;
+ case SC_LESS_EQUAL:
+ bRes = fVal <= 0.0;
+ break;
+ case SC_GREATER_EQUAL:
+ bRes = fVal >= 0.0;
+ break;
+ case SC_NOT_EQUAL:
+ bRes = fVal != 0.0;
+ break;
+ default:
+ OSL_TRACE( "CompareMatrixFunc: unhandled comparison operator: %d", (int)mrComp.meOp);
+ }
+ maResValues.push_back(bRes);
}
public:
@@ -1295,7 +1319,7 @@ public:
}
}
- const std::vector<double>& getValues() const
+ const std::vector<bool>& getValues() const
{
return maResValues;
}
@@ -1501,9 +1525,9 @@ void ScMatrixImpl::CompareMatrix(
maMat.walk(aFunc);
// We assume the result matrix has the same dimension as this matrix.
- const std::vector<double>& rResVal = aFunc.getValues();
+ const std::vector<bool>& rResVal = aFunc.getValues();
if (nSize == rResVal.size())
- rResMat.PutDouble(&rResVal[0], rResVal.size(), 0, 0);
+ rResMat.pImpl->maMat.set(0, 0, rResVal.begin(), rResVal.end());
}
void ScMatrixImpl::GetDoubleArray( std::vector<double>& rArray, bool bEmptyAsZero ) const
commit 72d4b574f11979d5487309737172869e9c3181a9
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date: Sat Oct 19 11:27:24 2013 -0400
Do the two matrix comparisons both in CompareMat().
Change-Id: I1b4dab3f57dd7df556aa13fdd44a2d3ba2b01bd7
diff --git a/sc/source/core/inc/interpre.hxx b/sc/source/core/inc/interpre.hxx
index 11adc34..99fa566 100644
--- a/sc/source/core/inc/interpre.hxx
+++ b/sc/source/core/inc/interpre.hxx
@@ -386,7 +386,7 @@ double Compare();
/** @param pOptions
NULL means case sensitivity document option is to be used!
*/
-sc::RangeMatrix CompareMat( sc::CompareOptions* pOptions = NULL );
+sc::RangeMatrix CompareMat( ScQueryOp eOp, sc::CompareOptions* pOptions = NULL );
ScMatrixRef QueryMat( const ScMatrixRef& pMat, sc::CompareOptions& rOptions );
void ScEqual();
void ScNotEqual();
diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx
index e764d21..d308936 100644
--- a/sc/source/core/tool/interpr1.cxx
+++ b/sc/source/core/tool/interpr1.cxx
@@ -879,7 +879,7 @@ double ScInterpreter::Compare()
}
-sc::RangeMatrix ScInterpreter::CompareMat( sc::CompareOptions* pOptions )
+sc::RangeMatrix ScInterpreter::CompareMat( ScQueryOp eOp, sc::CompareOptions* pOptions )
{
OUString aVal1, aVal2;
sc::Compare aComp( &aVal1, &aVal2 );
@@ -987,6 +987,32 @@ sc::RangeMatrix ScInterpreter::CompareMat( sc::CompareOptions* pOptions )
aRes.mpMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NO_VALUE)), j, k);
}
}
+
+ switch (eOp)
+ {
+ case SC_EQUAL:
+ aRes.mpMat->CompareEqual();
+ break;
+ case SC_LESS:
+ aRes.mpMat->CompareLess();
+ break;
+ case SC_GREATER:
+ aRes.mpMat->CompareGreater();
+ break;
+ case SC_LESS_EQUAL:
+ aRes.mpMat->CompareLessEqual();
+ break;
+ case SC_GREATER_EQUAL:
+ aRes.mpMat->CompareGreaterEqual();
+ break;
+ case SC_NOT_EQUAL:
+ aRes.mpMat->CompareNotEqual();
+ break;
+ default:
+ OSL_TRACE( "ScInterpreter::QueryMat: unhandled comparison operator: %d", (int)eOp);
+ aRes.mpMat.reset();
+ return aRes;
+ }
}
else if (aMat[0].mpMat || aMat[1].mpMat)
{
@@ -1007,6 +1033,32 @@ sc::RangeMatrix ScInterpreter::CompareMat( sc::CompareOptions* pOptions )
ScMatrix& rMat = *aMat[i].mpMat;
ScMatrix& rResMat = *aRes.mpMat;
rMat.CompareMatrix(rResMat, aComp, i, pOptions);
+
+ switch (eOp)
+ {
+ case SC_EQUAL:
+ aRes.mpMat->CompareEqual();
+ break;
+ case SC_LESS:
+ aRes.mpMat->CompareLess();
+ break;
+ case SC_GREATER:
+ aRes.mpMat->CompareGreater();
+ break;
+ case SC_LESS_EQUAL:
+ aRes.mpMat->CompareLessEqual();
+ break;
+ case SC_GREATER_EQUAL:
+ aRes.mpMat->CompareGreaterEqual();
+ break;
+ case SC_NOT_EQUAL:
+ aRes.mpMat->CompareNotEqual();
+ break;
+ default:
+ OSL_TRACE( "ScInterpreter::QueryMat: unhandled comparison operator: %d", (int)eOp);
+ aRes.mpMat.reset();
+ return aRes;
+ }
}
nCurFmtType = nFuncFmtType = NUMBERFORMAT_LOGICAL;
@@ -1024,7 +1076,7 @@ ScMatrixRef ScInterpreter::QueryMat( const ScMatrixRef& pMat, sc::CompareOptions
PushString(rItem.maString.getString());
else
PushDouble(rItem.mfVal);
- ScMatrixRef pResultMatrix = CompareMat( &rOptions).mpMat;
+ ScMatrixRef pResultMatrix = CompareMat(rOptions.aQueryEntry.eOp, &rOptions).mpMat;
nCurFmtType = nSaveCurFmtType;
nFuncFmtType = nSaveFuncFmtType;
if (nGlobalError || !pResultMatrix)
@@ -1033,30 +1085,6 @@ ScMatrixRef ScInterpreter::QueryMat( const ScMatrixRef& pMat, sc::CompareOptions
return pResultMatrix;
}
- switch (rOptions.aQueryEntry.eOp)
- {
- case SC_EQUAL:
- pResultMatrix->CompareEqual();
- break;
- case SC_LESS:
- pResultMatrix->CompareLess();
- break;
- case SC_GREATER:
- pResultMatrix->CompareGreater();
- break;
- case SC_LESS_EQUAL:
- pResultMatrix->CompareLessEqual();
- break;
- case SC_GREATER_EQUAL:
- pResultMatrix->CompareGreaterEqual();
- break;
- case SC_NOT_EQUAL:
- pResultMatrix->CompareNotEqual();
- break;
- default:
- SetError( errIllegalArgument);
- OSL_TRACE( "ScInterpreter::QueryMat: unhandled comparison operator: %d", (int)rOptions.aQueryEntry.eOp);
- }
return pResultMatrix;
}
@@ -1064,14 +1092,13 @@ void ScInterpreter::ScEqual()
{
if ( GetStackType(1) == svMatrix || GetStackType(2) == svMatrix )
{
- sc::RangeMatrix aMat = CompareMat();
+ sc::RangeMatrix aMat = CompareMat(SC_EQUAL);
if (!aMat.mpMat)
{
PushIllegalParameter();
return;
}
- aMat.mpMat->CompareEqual();
PushMatrix(aMat);
}
else
@@ -1083,14 +1110,13 @@ void ScInterpreter::ScNotEqual()
{
if ( GetStackType(1) == svMatrix || GetStackType(2) == svMatrix )
{
- sc::RangeMatrix aMat = CompareMat();
+ sc::RangeMatrix aMat = CompareMat(SC_NOT_EQUAL);
if (!aMat.mpMat)
{
PushIllegalParameter();
return;
}
- aMat.mpMat->CompareNotEqual();
PushMatrix(aMat);
}
else
@@ -1102,14 +1128,13 @@ void ScInterpreter::ScLess()
{
if ( GetStackType(1) == svMatrix || GetStackType(2) == svMatrix )
{
- sc::RangeMatrix aMat = CompareMat();
+ sc::RangeMatrix aMat = CompareMat(SC_LESS);
if (!aMat.mpMat)
{
PushIllegalParameter();
return;
}
- aMat.mpMat->CompareLess();
PushMatrix(aMat);
}
else
@@ -1121,14 +1146,13 @@ void ScInterpreter::ScGreater()
{
if ( GetStackType(1) == svMatrix || GetStackType(2) == svMatrix )
{
- sc::RangeMatrix aMat = CompareMat();
+ sc::RangeMatrix aMat = CompareMat(SC_GREATER);
if (!aMat.mpMat)
{
PushIllegalParameter();
return;
}
- aMat.mpMat->CompareGreater();
PushMatrix(aMat);
}
else
@@ -1140,14 +1164,13 @@ void ScInterpreter::ScLessEqual()
{
if ( GetStackType(1) == svMatrix || GetStackType(2) == svMatrix )
{
- sc::RangeMatrix aMat = CompareMat();
+ sc::RangeMatrix aMat = CompareMat(SC_LESS_EQUAL);
if (!aMat.mpMat)
{
PushIllegalParameter();
return;
}
- aMat.mpMat->CompareLessEqual();
PushMatrix(aMat);
}
else
@@ -1159,14 +1182,13 @@ void ScInterpreter::ScGreaterEqual()
{
if ( GetStackType(1) == svMatrix || GetStackType(2) == svMatrix )
{
- sc::RangeMatrix aMat = CompareMat();
+ sc::RangeMatrix aMat = CompareMat(SC_GREATER_EQUAL);
if (!aMat.mpMat)
{
PushIllegalParameter();
return;
}
- aMat.mpMat->CompareGreaterEqual();
PushMatrix(aMat);
}
else
More information about the Libreoffice-commits
mailing list