diff options
author | Tor Lillqvist <tml@collabora.com> | 2017-06-16 00:18:57 +0300 |
---|---|---|
committer | Tor Lillqvist <tml@collabora.com> | 2017-06-16 12:17:40 +0200 |
commit | 5c81adc51a05a016e754de7961d3a7bdb4494e01 (patch) | |
tree | fbfdca0ef841a545ed10d612df83631c50c24bfc /sc | |
parent | 468fc3847cfd65217949630e2ffd9fb0a89e9cbb (diff) |
Get rid of the index inside FormulaTokenArray
Instead, use FormulaTokenArrrayPlainIterator everywhere, especially in
the FormulaCompiler.
This is the final step of a long chain of commits. (Split up into many
"uncontroversial" bits, and then this, to make potential bisecting
easier.)
Also added a logging operator<< for FormulaTokenArray, for SAL_DEBUG,
SAL_INFO etc goodness.
Change-Id: I02fe29f3f1e0dc33e5cba69e594223b4178a12bc
Reviewed-on: https://gerrit.libreoffice.org/38851
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Tor Lillqvist <tml@collabora.com>
Diffstat (limited to 'sc')
-rw-r--r-- | sc/source/core/tool/compiler.cxx | 51 | ||||
-rw-r--r-- | sc/source/core/tool/interpr4.cxx | 5 |
2 files changed, 27 insertions, 29 deletions
diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index 943c89dcc960..50775af00b57 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -4361,6 +4361,7 @@ ScTokenArray* ScCompiler::CompileString( const OUString& rFormula ) ScTokenArray aArr; pArr = &aArr; + maArrIterator = FormulaTokenArrayPlainIterator(*pArr); aFormula = comphelper::string::strip(rFormula, ' '); nSrcPos = 0; @@ -4645,6 +4646,7 @@ ScTokenArray* ScCompiler::CompileString( const OUString& rFormula ) ScTokenArray* pNew = new ScTokenArray( aArr ); pNew->GenHash(); pArr = pNew; + maArrIterator = FormulaTokenArrayPlainIterator(*pArr); if (!maExternalFiles.empty()) { @@ -4675,6 +4677,7 @@ ScTokenArray* ScCompiler::CompileString( const OUString& rFormula, const OUStrin // remember pArr, in case a subsequent CompileTokenArray() is executed. ScTokenArray* pNew = new ScTokenArray( aTokenArray ); pArr = pNew; + maArrIterator = FormulaTokenArrayPlainIterator(*pArr); return pNew; } } @@ -4707,8 +4710,8 @@ bool ScCompiler::HandleRange() // or if not directly between ocSep/parenthesis, // e.g. SUM(...;(...;...)) no, SUM(...;(...)*3) yes, // in short: if it isn't a self-contained expression. - FormulaToken* p1 = pArr->PeekPrevNoSpaces(); - FormulaToken* p2 = pArr->PeekNextNoSpaces(); + FormulaToken* p1 = maArrIterator.PeekPrevNoSpaces(); + FormulaToken* p2 = maArrIterator.PeekNextNoSpaces(); OpCode eOp1 = (p1 ? p1->GetOpCode() : ocSep); OpCode eOp2 = (p2 ? p2->GetOpCode() : ocSep); bool bBorder1 = (eOp1 == ocSep || eOp1 == ocOpen); @@ -4719,7 +4722,6 @@ bool ScCompiler::HandleRange() pNew = new ScTokenArray(); pNew->AddOpCode( ocClose ); PushTokenArray( pNew, true ); - pNew->Reset(); } pNew = pRangeData->GetCode()->Clone(); pNew->SetFromRangeName( true ); @@ -4737,13 +4739,12 @@ bool ScCompiler::HandleRange() SetRelNameReference(); MoveRelWrap(pRangeData->GetMaxCol(), pRangeData->GetMaxRow()); } - pNew->Reset(); + maArrIterator.Reset(); if ( bAddPair ) { pNew = new ScTokenArray(); pNew->AddOpCode( ocOpen ); PushTokenArray( pNew, true ); - pNew->Reset(); } return GetToken(); } @@ -4755,7 +4756,6 @@ bool ScCompiler::HandleRange() pNew = new ScTokenArray; pNew->Add( new FormulaErrorToken( FormulaError::NoName)); PushTokenArray( pNew, true ); - pNew->Reset(); return GetToken(); } return true; @@ -4791,12 +4791,12 @@ bool ScCompiler::HandleExternalReference(const FormulaToken& _aToken) ScTokenArray* pNew = xNew->Clone(); PushTokenArray( pNew, true); - if (pNew->GetNextReference() != nullptr) + if (FormulaTokenArrayPlainIterator(*pNew).GetNextReference() != nullptr) { SetRelNameReference(); MoveRelWrap(MAXCOL, MAXROW); } - pNew->Reset(); + maArrIterator.Reset(); return GetToken(); } default: @@ -4808,8 +4808,8 @@ bool ScCompiler::HandleExternalReference(const FormulaToken& _aToken) void ScCompiler::AdjustSheetLocalNameRelReferences( SCTAB nDelta ) { - pArr->Reset(); - for (formula::FormulaToken* t = pArr->GetNextReference(); t; t = pArr->GetNextReference()) + maArrIterator.Reset(); + for (formula::FormulaToken* t = maArrIterator.GetNextReference(); t; t = maArrIterator.GetNextReference()) { ScSingleRefData& rRef1 = *t->GetSingleRef(); if (rRef1.IsTabRel()) @@ -4827,9 +4827,9 @@ void ScCompiler::AdjustSheetLocalNameRelReferences( SCTAB nDelta ) void ScCompiler::SetRelNameReference() { - pArr->Reset(); - for( formula::FormulaToken* t = pArr->GetNextReference(); t; - t = pArr->GetNextReference() ) + maArrIterator.Reset(); + for( formula::FormulaToken* t = maArrIterator.GetNextReference(); t; + t = maArrIterator.GetNextReference() ) { ScSingleRefData& rRef1 = *t->GetSingleRef(); if ( rRef1.IsColRel() || rRef1.IsRowRel() || rRef1.IsTabRel() ) @@ -4847,9 +4847,9 @@ void ScCompiler::SetRelNameReference() // don't call for other token arrays! void ScCompiler::MoveRelWrap( SCCOL nMaxCol, SCROW nMaxRow ) { - pArr->Reset(); - for( formula::FormulaToken* t = pArr->GetNextReference(); t; - t = pArr->GetNextReference() ) + maArrIterator.Reset(); + for( formula::FormulaToken* t = maArrIterator.GetNextReference(); t; + t = maArrIterator.GetNextReference() ) { if ( t->GetType() == svSingleRef || t->GetType() == svExternalSingleRef ) ScRefUpdate::MoveRelWrap( pDoc, aPos, nMaxCol, nMaxRow, SingleDoubleRefModifier( *t->GetSingleRef() ).Ref() ); @@ -4863,9 +4863,9 @@ void ScCompiler::MoveRelWrap( SCCOL nMaxCol, SCROW nMaxRow ) void ScCompiler::MoveRelWrap( ScTokenArray& rArr, ScDocument* pDoc, const ScAddress& rPos, SCCOL nMaxCol, SCROW nMaxRow ) { - rArr.Reset(); - for( formula::FormulaToken* t = rArr.GetNextReference(); t; - t = rArr.GetNextReference() ) + formula::FormulaTokenArrayPlainIterator aIter(rArr); + for( formula::FormulaToken* t = aIter.GetNextReference(); t; + t = aIter.GetNextReference() ) { if ( t->GetType() == svSingleRef || t->GetType() == svExternalSingleRef ) ScRefUpdate::MoveRelWrap( pDoc, rPos, nMaxCol, nMaxRow, SingleDoubleRefModifier( *t->GetSingleRef() ).Ref() ); @@ -5031,7 +5031,7 @@ void ScCompiler::CreateStringFromSingleRef( OUStringBuffer& rBuffer, const Formu GetSetupTabNames(), aRef, true, (pArr && pArr->IsFromRangeName())); } } - else if (pArr && (p = pArr->PeekPrevNoSpaces()) && p->GetOpCode() == ocTableRefOpen) + else if (pArr && (p = maArrIterator.PeekPrevNoSpaces()) && p->GetOpCode() == ocTableRefOpen) { OUString aStr; ScAddress aAbs = rRef.toAbs(aPos); @@ -5351,8 +5351,8 @@ bool ScCompiler::HandleColRowName() bFound = true; else { - FormulaToken* p1 = pArr->PeekPrevNoSpaces(); - FormulaToken* p2 = pArr->PeekNextNoSpaces(); + FormulaToken* p1 = maArrIterator.PeekPrevNoSpaces(); + FormulaToken* p2 = maArrIterator.PeekNextNoSpaces(); // begin/end of a formula => single OpCode eOp1 = p1 ? p1->GetOpCode() : ocAdd; OpCode eOp2 = p2 ? p2->GetOpCode() : ocAdd; @@ -5422,7 +5422,6 @@ bool ScCompiler::HandleColRowName() } } PushTokenArray( pNew, true ); - pNew->Reset(); return GetToken(); } } @@ -5447,7 +5446,6 @@ bool ScCompiler::HandleDbData() ScTokenArray* pNew = new ScTokenArray(); pNew->AddDoubleReference( aRefData ); PushTokenArray( pNew, true ); - pNew->Reset(); return GetToken(); } return true; @@ -5455,7 +5453,7 @@ bool ScCompiler::HandleDbData() bool ScCompiler::GetTokenIfOpCode( OpCode eOp ) { - const formula::FormulaToken* p = pArr->PeekNextNoSpaces(); + const formula::FormulaToken* p = maArrIterator.PeekNextNoSpaces(); if (p && p->GetOpCode() == eOp) return GetToken(); return false; @@ -5590,7 +5588,7 @@ bool ScCompiler::HandleTableRef() } eState = sOpen; do { - const formula::FormulaToken* p = pArr->PeekNextNoSpaces(); + const formula::FormulaToken* p = maArrIterator.PeekNextNoSpaces(); if (!p) eState = sStop; else @@ -5762,7 +5760,6 @@ bool ScCompiler::HandleTableRef() SetError( FormulaError::Pair); } PushTokenArray( pNew, true ); - pNew->Reset(); return GetToken(); } return true; diff --git a/sc/source/core/tool/interpr4.cxx b/sc/source/core/tool/interpr4.cxx index 37c9db979aec..6b5247b0889b 100644 --- a/sc/source/core/tool/interpr4.cxx +++ b/sc/source/core/tool/interpr4.cxx @@ -1296,7 +1296,8 @@ void ScInterpreter::GetExternalDoubleRef( return; } - formula::FormulaToken* pToken = pArray->First(); + formula::FormulaTokenArrayPlainIterator aIter(*pArray); + formula::FormulaToken* pToken = aIter.First(); if (pToken->GetType() == svError) { SetError( pToken->GetError()); @@ -1308,7 +1309,7 @@ void ScInterpreter::GetExternalDoubleRef( return; } - if (pArray->Next()) + if (aIter.Next()) { // Can't handle more than one matrix per parameter. SetError( FormulaError::IllegalArgument); |