[Libreoffice-commits] .: Branch 'feature/matrix-new-backend' - sc/source
Kohei Yoshida
kohei at kemper.freedesktop.org
Wed Jul 18 07:21:14 PDT 2012
sc/source/core/inc/interpre.hxx | 2
sc/source/core/tool/interpr5.cxx | 103 +++++++++++----------------------------
2 files changed, 32 insertions(+), 73 deletions(-)
New commits:
commit f6e504023c6a98ac57d5ff19863bb66c99eddd43
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date: Wed Jul 18 10:20:33 2012 -0400
It's now faster to start empty and fill non-empty elements.
The new matrix backend allows to init with empty elements. Let's
take advantage of this.
Change-Id: Id11a933e50bcd75a5be85a1b3d0bbff0b4041b46
diff --git a/sc/source/core/inc/interpre.hxx b/sc/source/core/inc/interpre.hxx
index de577ca..9b22682 100644
--- a/sc/source/core/inc/interpre.hxx
+++ b/sc/source/core/inc/interpre.hxx
@@ -114,7 +114,7 @@ public:
/// if denominator is 0.0
static inline double div( const double& fNumerator, const double& fDenominator );
- ScMatrixRef GetNewMat(SCSIZE nC, SCSIZE nR);
+ ScMatrixRef GetNewMat(SCSIZE nC, SCSIZE nR, bool bEmpty = false);
enum VolatileType {
VOLATILE,
diff --git a/sc/source/core/tool/interpr5.cxx b/sc/source/core/tool/interpr5.cxx
index ba868bc..c689729 100644
--- a/sc/source/core/tool/interpr5.cxx
+++ b/sc/source/core/tool/interpr5.cxx
@@ -323,10 +323,15 @@ void ScInterpreter:: ScLCM()
}
}
-ScMatrixRef ScInterpreter::GetNewMat(SCSIZE nC, SCSIZE nR)
+ScMatrixRef ScInterpreter::GetNewMat(SCSIZE nC, SCSIZE nR, bool bEmpty)
{
RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "sc", "er", "ScInterpreter::GetNewMat" );
- ScMatrixRef pMat = new ScMatrix(nC, nR, 0.0);
+ ScMatrixRef pMat;
+ if (bEmpty)
+ pMat = new ScMatrix(nC, nR);
+ else
+ pMat = new ScMatrix(nC, nR, 0.0);
+
pMat->SetErrorInterpreter( this);
// A temporary matrix is mutable and ScMatrix::CloneIfConst() returns the
// very matrix.
@@ -366,54 +371,21 @@ ScMatrixRef ScInterpreter::CreateMatrixFromDoubleRef( const FormulaToken* pToken
{
SCSIZE nMatCols = static_cast<SCSIZE>(nCol2 - nCol1 + 1);
SCSIZE nMatRows = static_cast<SCSIZE>(nRow2 - nRow1 + 1);
- pMat = GetNewMat( nMatCols, nMatRows);
+ pMat = GetNewMat( nMatCols, nMatRows, true);
if (pMat && !nGlobalError)
{
- // Set position where the next entry is expected.
- SCROW nNextRow = nRow1;
- SCCOL nNextCol = nCol1;
- // Set last position as if there was a previous entry.
- SCROW nThisRow = nRow2;
- SCCOL nThisCol = nCol1 - 1;
- ScCellIterator aCellIter( pDok, nCol1, nRow1, nTab1, nCol2,
- nRow2, nTab2);
+ ScCellIterator aCellIter(
+ pDok, nCol1, nRow1, nTab1, nCol2, nRow2, nTab2);
+
for (ScBaseCell* pCell = aCellIter.GetFirst(); pCell; pCell =
aCellIter.GetNext())
{
- nThisCol = aCellIter.GetCol();
- nThisRow = aCellIter.GetRow();
- if (nThisCol != nNextCol || nThisRow != nNextRow)
- {
- // Fill empty between iterator's positions.
- for ( ; nNextCol <= nThisCol; ++nNextCol)
- {
- SCSIZE nC = nNextCol - nCol1;
- SCSIZE nMatStopRow = ((nNextCol < nThisCol) ?
- nMatRows : nThisRow - nRow1);
- for (SCSIZE nR = nNextRow - nRow1; nR <
- nMatStopRow; ++nR)
- {
- pMat->PutEmpty( nC, nR);
- }
- nNextRow = nRow1;
- }
- }
- if (nThisRow == nRow2)
- {
- nNextCol = nThisCol + 1;
- nNextRow = nRow1;
- }
- else
- {
- nNextCol = nThisCol;
- nNextRow = nThisRow + 1;
- }
+ SCCOL nThisCol = aCellIter.GetCol();
+ SCROW nThisRow = aCellIter.GetRow();
if (HasCellEmptyData(pCell))
- {
- pMat->PutEmpty( static_cast<SCSIZE>(nThisCol-nCol1),
- static_cast<SCSIZE>(nThisRow-nRow1));
- }
- else if (HasCellValueData(pCell))
+ continue;
+
+ if (HasCellValueData(pCell))
{
ScAddress aAdr( nThisCol, nThisRow, nTab1);
double fVal = GetCellValue( aAdr, pCell);
@@ -425,38 +397,25 @@ ScMatrixRef ScInterpreter::CreateMatrixFromDoubleRef( const FormulaToken* pToken
pMat->PutDouble( fVal,
static_cast<SCSIZE>(nThisCol-nCol1),
static_cast<SCSIZE>(nThisRow-nRow1));
+ continue;
}
- else
- {
- String aStr;
- GetCellString( aStr, pCell);
- if ( nGlobalError )
- {
- double fVal = CreateDoubleError( nGlobalError);
- nGlobalError = 0;
- pMat->PutDouble( fVal,
- static_cast<SCSIZE>(nThisCol-nCol1),
- static_cast<SCSIZE>(nThisRow-nRow1));
- }
- else
- pMat->PutString( aStr,
- static_cast<SCSIZE>(nThisCol-nCol1),
- static_cast<SCSIZE>(nThisRow-nRow1));
- }
- }
- // Fill empty if iterator's last position wasn't the end.
- if (nThisCol != nCol2 || nThisRow != nRow2)
- {
- for ( ; nNextCol <= nCol2; ++nNextCol)
+
+ String aStr;
+ GetCellString( aStr, pCell);
+ if ( nGlobalError )
{
- SCSIZE nC = nNextCol - nCol1;
- for (SCSIZE nR = nNextRow - nRow1; nR < nMatRows; ++nR)
- {
- pMat->PutEmpty( nC, nR);
- }
- nNextRow = nRow1;
+ double fVal = CreateDoubleError( nGlobalError);
+ nGlobalError = 0;
+ pMat->PutDouble( fVal,
+ static_cast<SCSIZE>(nThisCol-nCol1),
+ static_cast<SCSIZE>(nThisRow-nRow1));
}
+ else
+ pMat->PutString( aStr,
+ static_cast<SCSIZE>(nThisCol-nCol1),
+ static_cast<SCSIZE>(nThisRow-nRow1));
}
+
if (pTokenMatrixMap)
pTokenMatrixMap->insert( ScTokenMatrixMap::value_type(
pToken, new ScMatrixToken( pMat)));
More information about the Libreoffice-commits
mailing list