summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorTor Lillqvist <tml@collabora.com>2017-06-16 00:18:57 +0300
committerTor Lillqvist <tml@collabora.com>2017-06-16 12:17:40 +0200
commit5c81adc51a05a016e754de7961d3a7bdb4494e01 (patch)
treefbfdca0ef841a545ed10d612df83631c50c24bfc /sc
parent468fc3847cfd65217949630e2ffd9fb0a89e9cbb (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.cxx51
-rw-r--r--sc/source/core/tool/interpr4.cxx5
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);