summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Lillqvist <tml@collabora.com>2017-06-19 11:37:43 +0300
committerTor Lillqvist <tml@collabora.com>2017-06-19 12:23:24 +0300
commitc3fae6be6067572aaf9f0c72ad35b69019a79135 (patch)
treedab6a4ac276daa0fcc54d09b36f42323376c56eb
parentcfd5d203e9c641c150f92c2b1ee5b84e89e6dc99 (diff)
Add yet another kind of iterator for the two arrays in FormulaTokenArray
This one has no extra functionality at all, and its only purpose is to be used in range-based for loops. If there is a cleaner way to do this, feel free. Not sure if this functionality could or should be combined with either of the two existing iterator classes related to FormulaTokenArray (FormulaTokenIterator and FormulaTokenArrayPlainIterator). Probably not. Change-Id: I32599b0800fd2585624d3742a46ad4896ce7e47a
-rw-r--r--formula/source/core/api/token.cxx48
-rw-r--r--include/formula/tokenarray.hxx36
2 files changed, 58 insertions, 26 deletions
diff --git a/formula/source/core/api/token.cxx b/formula/source/core/api/token.cxx
index 2cd4b63f92a4..bb634fcdfa46 100644
--- a/formula/source/core/api/token.cxx
+++ b/formula/source/core/api/token.cxx
@@ -495,15 +495,15 @@ FormulaToken* FormulaTokenArray::FirstRPNToken() const
bool FormulaTokenArray::HasReferences() const
{
- for (sal_uInt16 i = 0; i < nLen; ++i)
+ for (auto i: Tokens())
{
- if (pCode[i]->IsRef())
+ if (i->IsRef())
return true;
}
- for (sal_uInt16 i = 0; i < nRPN; ++i)
+ for (auto i: RPNTokens())
{
- if (pRPN[i]->IsRef())
+ if (i->IsRef())
return true;
}
@@ -512,9 +512,9 @@ bool FormulaTokenArray::HasReferences() const
bool FormulaTokenArray::HasExternalRef() const
{
- for ( sal_uInt16 j=0; j < nLen; j++ )
+ for (auto i: Tokens())
{
- if (pCode[j]->IsExternalRef())
+ if (i->IsExternalRef())
return true;
}
return false;
@@ -522,9 +522,9 @@ bool FormulaTokenArray::HasExternalRef() const
bool FormulaTokenArray::HasOpCode( OpCode eOp ) const
{
- for ( sal_uInt16 j=0; j < nLen; j++ )
+ for (auto i: Tokens())
{
- if ( pCode[j]->GetOpCode() == eOp )
+ if (i->GetOpCode() == eOp)
return true;
}
return false;
@@ -532,9 +532,9 @@ bool FormulaTokenArray::HasOpCode( OpCode eOp ) const
bool FormulaTokenArray::HasOpCodeRPN( OpCode eOp ) const
{
- for ( sal_uInt16 j=0; j < nRPN; j++ )
+ for (auto i: RPNTokens())
{
- if ( pRPN[j]->GetOpCode() == eOp )
+ if (i->GetOpCode() == eOp)
return true;
}
return false;
@@ -542,9 +542,9 @@ bool FormulaTokenArray::HasOpCodeRPN( OpCode eOp ) const
bool FormulaTokenArray::HasNameOrColRowName() const
{
- for ( sal_uInt16 j=0; j < nLen; j++ )
+ for (auto i: Tokens())
{
- if( pCode[j]->GetType() == svIndex || pCode[j]->GetOpCode() == ocColRowName )
+ if (i->GetType() == svIndex || i->GetOpCode() == ocColRowName )
return true;
}
return false;
@@ -552,12 +552,9 @@ bool FormulaTokenArray::HasNameOrColRowName() const
bool FormulaTokenArray::HasOpCodes(const unordered_opcode_set& rOpCodes) const
{
- FormulaToken** p = pCode;
- FormulaToken** pEnd = p + static_cast<size_t>(nLen);
- for (; p != pEnd; ++p)
+ for (auto i: Tokens())
{
- OpCode eOp = (*p)->GetOpCode();
- if (rOpCodes.count(eOp) > 0)
+ if (rOpCodes.count(i->GetOpCode()) > 0)
return true;
}
@@ -853,9 +850,8 @@ bool FormulaTokenArray::HasMatrixDoubleRefOps()
std::unique_ptr<FormulaToken*[]> pStack(new FormulaToken* [nRPN]);
FormulaToken* pResult = new FormulaDoubleToken( 0.0 );
short sp = 0;
- for ( sal_uInt16 j = 0; j < nRPN; j++ )
+ for ( auto t: RPNTokens() )
{
- FormulaToken* t = pRPN[j];
OpCode eOp = t->GetOpCode();
sal_uInt8 nParams = t->GetParamCount();
switch ( eOp )
@@ -1248,9 +1244,9 @@ bool FormulaMissingContext::AddMissing( FormulaTokenArray *pNewArr, const Missin
bool FormulaTokenArray::NeedsPodfRewrite( const MissingConventionODF & rConv )
{
- for ( int i = 0; i < nLen; ++i )
+ for ( auto i: Tokens() )
{
- if ( rConv.isRewriteNeeded( pCode[i]->GetOpCode()))
+ if ( rConv.isRewriteNeeded( i->GetOpCode()))
return true;
}
return false;
@@ -1258,9 +1254,9 @@ bool FormulaTokenArray::NeedsPodfRewrite( const MissingConventionODF & rConv )
bool FormulaTokenArray::NeedsOoxmlRewrite()
{
- for ( int i = 0; i < nLen; ++i )
+ for ( auto i: Tokens() )
{
- if ( MissingConventionOOXML::isRewriteNeeded( pCode[i]->GetOpCode()))
+ if ( MissingConventionOOXML::isRewriteNeeded( i->GetOpCode()))
return true;
}
return false;
@@ -1484,12 +1480,12 @@ FormulaToken* FormulaTokenArray::AddOpCode( OpCode eOp )
void FormulaTokenArray::ReinternStrings( svl::SharedStringPool& rPool )
{
- for (sal_uInt16 i=0; i < nLen; ++i)
+ for (auto i: Tokens())
{
- switch (pCode[i]->GetType())
+ switch (i->GetType())
{
case svString:
- pCode[i]->SetString( rPool.intern( pCode[i]->GetString().getString()));
+ i->SetString( rPool.intern( i->GetString().getString()));
break;
default:
; // nothing
diff --git a/include/formula/tokenarray.hxx b/include/formula/tokenarray.hxx
index 2014994e03fc..7252613cf713 100644
--- a/include/formula/tokenarray.hxx
+++ b/include/formula/tokenarray.hxx
@@ -112,6 +112,30 @@ public:
typedef std::unordered_set<OpCode, std::hash<std::underlying_type<OpCode>::type> > unordered_opcode_set;
+class FORMULA_DLLPUBLIC FormulaTokenArrayStandardIterator
+{
+private:
+ FormulaToken** mpBegin;
+ FormulaToken** mpEnd;
+
+public:
+ FormulaTokenArrayStandardIterator(FormulaToken** pBegin, sal_uInt16 nSize) :
+ mpBegin(pBegin),
+ mpEnd(pBegin + nSize)
+ {
+ }
+
+ FormulaToken** begin() const
+ {
+ return mpBegin;
+ }
+
+ FormulaToken** end() const
+ {
+ return mpEnd;
+ }
+};
+
class FORMULA_DLLPUBLIC FormulaTokenArray
{
protected:
@@ -247,7 +271,19 @@ public:
}
FormulaToken** GetArray() const { return pCode; }
+
+ FormulaTokenArrayStandardIterator Tokens() const
+ {
+ return FormulaTokenArrayStandardIterator(pCode, nLen);
+ }
+
FormulaToken** GetCode() const { return pRPN; }
+
+ FormulaTokenArrayStandardIterator RPNTokens() const
+ {
+ return FormulaTokenArrayStandardIterator(pRPN, nRPN);
+ }
+
sal_uInt16 GetLen() const { return nLen; }
sal_uInt16 GetCodeLen() const { return nRPN; }
FormulaError GetCodeError() const { return nError; }