[Libreoffice-commits] core.git: Branch 'feature/formula-core-rework' - 2 commits - sc/inc sc/source
Kohei Yoshida
kohei.yoshida at gmail.com
Mon Aug 12 18:52:01 PDT 2013
Rebased ref, commits from common ancestor:
commit 7514df659bc12509880f7b74cd9a7820c96526fb
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date: Mon Aug 12 21:51:33 2013 -0400
Compile token array only once per formula group.
Change-Id: I70694ee8834b1b2f2ebdfaa90582ccfb19db0210
diff --git a/sc/inc/formulacell.hxx b/sc/inc/formulacell.hxx
index 2e7c724..985aebe 100644
--- a/sc/inc/formulacell.hxx
+++ b/sc/inc/formulacell.hxx
@@ -51,13 +51,17 @@ struct SC_DLLPUBLIC ScFormulaCellGroup : boost::noncopyable
ScTokenArray* mpCode;
SCROW mnStart; // Start offset of that cell
SCROW mnLength; // How many of these do we have ?
- bool mbInvariant;
+ short mnFormatType;
+ bool mbInvariant:1;
+ bool mbSubTotal:1;
sc::GroupCalcState meCalcState;
ScFormulaCellGroup();
~ScFormulaCellGroup();
void setCode( const ScTokenArray& rCode );
+ void compileCode(
+ ScDocument& rDoc, const ScAddress& rPos, formula::FormulaGrammar::Grammar eGram );
};
inline void intrusive_ptr_add_ref(const ScFormulaCellGroup *p)
diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx
index 1e120ee..f40e5a5 100644
--- a/sc/source/core/data/formulacell.cxx
+++ b/sc/source/core/data/formulacell.cxx
@@ -387,7 +387,9 @@ ScFormulaCellGroup::ScFormulaCellGroup() :
mpCode(NULL),
mnStart(0),
mnLength(0),
+ mnFormatType(NUMBERFORMAT_NUMBER),
mbInvariant(false),
+ mbSubTotal(false),
meCalcState(sc::GroupCalcEnabled)
{
}
@@ -405,6 +407,26 @@ void ScFormulaCellGroup::setCode( const ScTokenArray& rCode )
mpCode->GenHash();
}
+void ScFormulaCellGroup::compileCode(
+ ScDocument& rDoc, const ScAddress& rPos, FormulaGrammar::Grammar eGram )
+{
+ if (!mpCode)
+ return;
+
+ if (mpCode->GetLen() && !mpCode->GetCodeError() && !mpCode->GetCodeLen())
+ {
+ ScCompiler aComp(&rDoc, rPos, *mpCode);
+ aComp.SetGrammar(eGram);
+ mbSubTotal = aComp.CompileTokenArray();
+ mnFormatType = aComp.GetNumFormatType();
+ }
+ else
+ {
+ mpCode->Reset();
+ mbSubTotal = mpCode->GetNextOpCodeRPN(ocSubTotal) != NULL;
+ }
+}
+
// ============================================================================
ScFormulaCell::ScFormulaCell( ScDocument* pDoc, const ScAddress& rPos,
@@ -500,12 +522,12 @@ ScFormulaCell::ScFormulaCell(
pNextTrack(0),
nSeenInIteration(0),
cMatrixFlag ( cInd ),
- nFormatType ( NUMBERFORMAT_NUMBER ),
+ nFormatType(xGroup->mnFormatType),
bDirty(false),
bChanged( false ),
bRunning( false ),
bCompile( false ),
- bSubTotal( false ),
+ bSubTotal(xGroup->mbSubTotal),
bIsIterCell( false ),
bInChangeTrack( false ),
bTableOpDirty( false ),
@@ -513,21 +535,6 @@ ScFormulaCell::ScFormulaCell(
mbNeedsNumberFormat( false ),
aPos( rPos )
{
- // UPN-Array generation
- if( pCode->GetLen() && !pCode->GetCodeError() && !pCode->GetCodeLen() )
- {
- ScCompiler aComp( pDocument, aPos, *pCode);
- aComp.SetGrammar(eTempGrammar);
- bSubTotal = aComp.CompileTokenArray();
- nFormatType = aComp.GetNumFormatType();
- }
- else
- {
- pCode->Reset();
- if ( pCode->GetNextOpCodeRPN( ocSubTotal ) )
- bSubTotal = true;
- }
-
if (bSubTotal)
pDocument->AddSubTotalCell(this);
}
diff --git a/sc/source/filter/excel/excform.cxx b/sc/source/filter/excel/excform.cxx
index e236dad..e9f5cf6 100644
--- a/sc/source/filter/excel/excform.cxx
+++ b/sc/source/filter/excel/excform.cxx
@@ -118,6 +118,10 @@ void ImportExcel::Formula(
if (!xGroup)
return;
+ if (xGroup->mnStart == aScPos.Row())
+ // Generate code for the top cell only.
+ xGroup->compileCode(*pD, aScPos, formula::FormulaGrammar::GRAM_DEFAULT);
+
ScFormulaCell* pCell = new ScFormulaCell(pD, aScPos, xGroup);
pD->EnsureTable(aScPos.Tab());
bool bInserted = pD->SetGroupFormulaCell(aScPos, pCell);
diff --git a/sc/source/filter/oox/formulabuffer.cxx b/sc/source/filter/oox/formulabuffer.cxx
index e4277c0..dce36d7 100644
--- a/sc/source/filter/oox/formulabuffer.cxx
+++ b/sc/source/filter/oox/formulabuffer.cxx
@@ -200,6 +200,9 @@ void FormulaBuffer::applySharedFormulas( sal_Int32 nTab )
ScAddress aPos;
ScUnoConversion::FillScAddress(aPos, rAddr);
+ if (xGroup->mnStart == aPos.Row())
+ // Generate code for the top cell only.
+ xGroup->compileCode(rDoc, aPos, formula::FormulaGrammar::GRAM_DEFAULT);
ScFormulaCell* pCell = new ScFormulaCell(&rDoc, aPos, xGroup);
bool bInserted = rDoc.SetGroupFormulaCell(aPos, pCell);
diff --git a/sc/source/filter/orcus/interface.cxx b/sc/source/filter/orcus/interface.cxx
index 495715f..6c9512a 100644
--- a/sc/source/filter/orcus/interface.cxx
+++ b/sc/source/filter/orcus/interface.cxx
@@ -387,6 +387,8 @@ void ScOrcusSheet::set_shared_formula(
if (!xGroup)
return;
+ // Generate code for the top cell only.
+ xGroup->compileCode(mrDoc.getDoc(), aPos, formula::FormulaGrammar::GRAM_DEFAULT);
ScFormulaCell* pCell = new ScFormulaCell(&mrDoc.getDoc(), aPos, xGroup);
mrDoc.setFormulaCell(aPos, pCell);
cellInserted();
commit 84c4c6a901a90dda1514071455db682a000b1934
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date: Mon Aug 12 21:20:01 2013 -0400
Return something.
Change-Id: I46ff752f62d2f3fc988bbacc58097ee36e87182f
diff --git a/sc/source/filter/excel/xetable.cxx b/sc/source/filter/excel/xetable.cxx
index d7b6499..8e0d763 100644
--- a/sc/source/filter/excel/xetable.cxx
+++ b/sc/source/filter/excel/xetable.cxx
@@ -230,6 +230,8 @@ XclExpShrfmlaRef XclExpShrfmlaBuffer::CreateOrExtendShrfmla(
xRec = aIt->second;
xRec->ExtendRange( rScPos );
}
+
+ return xRec;
}
// Multiple operations ========================================================
More information about the Libreoffice-commits
mailing list