diff options
author | Dennis Francis <dennis.francis@collabora.co.uk> | 2018-05-02 14:22:09 +0530 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2018-06-26 15:41:54 +0200 |
commit | 60c5ca1b874ead7251653d01b0d50fdd42482e09 (patch) | |
tree | 0de305ced26b3d65f4419df6282562456c377fb5 /formula | |
parent | 6d22d02c321bc9f8f539865fd0fd3046e3ef3c6f (diff) |
More Implicit intersection computation
Do implicit intersection computation for
for single parameter functions while generating
RPN token array when the argument is a doubleref
with relative row references. This optimization
is not done when under forced array mode or
matrix formula mode.
The computation logic was already present in ScInterpreter,
so factored it out and reused.
This also adds unit tests to ensure correctness of
II computation for various cases.
Change-Id: I509c3f6f811aa036b1dc3296e8f68904b26c3c49
Reviewed-on: https://gerrit.libreoffice.org/53885
Tested-by: Jenkins
Reviewed-by: Eike Rathke <erack@redhat.com>
Diffstat (limited to 'formula')
-rw-r--r-- | formula/source/core/api/FormulaCompiler.cxx | 24 | ||||
-rw-r--r-- | formula/source/ui/dlg/formula.cxx | 2 |
2 files changed, 20 insertions, 6 deletions
diff --git a/formula/source/core/api/FormulaCompiler.cxx b/formula/source/core/api/FormulaCompiler.cxx index f5e06e77deba..671d2c2b9f62 100644 --- a/formula/source/core/api/FormulaCompiler.cxx +++ b/formula/source/core/api/FormulaCompiler.cxx @@ -697,7 +697,7 @@ void FormulaCompiler::OpCodeMap::putOpCode( const OUString & rStr, const OpCode // class FormulaCompiler -FormulaCompiler::FormulaCompiler( FormulaTokenArray& rArr ) +FormulaCompiler::FormulaCompiler( FormulaTokenArray& rArr, bool bComputeII, bool bMatrixFlag ) : nCurrentFactorParam(0), pArr( &rArr ), @@ -714,13 +714,15 @@ FormulaCompiler::FormulaCompiler( FormulaTokenArray& rArr ) glSubTotal( false ), needsRPNTokenCheck( false ), mbJumpCommandReorder(true), - mbStopOnError(true) + mbStopOnError(true), + mbComputeII(bComputeII), + mbMatrixFlag(bMatrixFlag) { } FormulaTokenArray FormulaCompiler::smDummyTokenArray; -FormulaCompiler::FormulaCompiler() +FormulaCompiler::FormulaCompiler(bool bComputeII, bool bMatrixFlag) : nCurrentFactorParam(0), pArr( nullptr ), @@ -737,7 +739,9 @@ FormulaCompiler::FormulaCompiler() glSubTotal( false ), needsRPNTokenCheck( false ), mbJumpCommandReorder(true), - mbStopOnError(true) + mbStopOnError(true), + mbComputeII(bComputeII), + mbMatrixFlag(bMatrixFlag) { } @@ -1549,6 +1553,7 @@ void FormulaCompiler::Factor() else { // standard handling of 1-parameter opcodes + OpCode eMyLastOp = eOp; pFacToken = mpToken; eOp = NextToken(); if( nNumFmt == SvNumFormatType::UNDEFINED && eOp == ocNot ) @@ -1564,7 +1569,14 @@ void FormulaCompiler::Factor() if (eOp != ocClose) SetError( FormulaError::PairExpected); else if ( pArr->GetCodeError() == FormulaError::NONE ) + { pFacToken->SetByte( 1 ); + if (mbComputeII && IsIIOpCode(eMyLastOp)) + { + FormulaToken** pArg = pCode - 1; + HandleIIOpCode(eMyLastOp, pFacToken->GetInForceArray(), &pArg, 1); + } + } PutCode( pFacToken ); NextToken(); } @@ -1606,7 +1618,7 @@ void FormulaCompiler::Factor() sal_uInt32 nSepCount = 0; if( !bNoParam ) { - bool bDoIICompute = IsIIOpCode(eMyLastOp); + bool bDoIICompute = mbComputeII && IsIIOpCode(eMyLastOp); // Array of FormulaToken double pointers to collect the parameters of II opcodes. FormulaToken*** pArgArray = nullptr; if (bDoIICompute) @@ -1633,7 +1645,7 @@ void FormulaCompiler::Factor() pArgArray[nSepCount - 1] = pCode - 1; // Add rest of the arguments } if (bDoIICompute) - HandleIIOpCode(eMyLastOp, pArgArray, + HandleIIOpCode(eMyLastOp, pFacToken->GetInForceArray(), pArgArray, std::min(nSepCount, static_cast<sal_uInt32>(FORMULA_MAXPARAMSII))); } if (bBadName) diff --git a/formula/source/ui/dlg/formula.cxx b/formula/source/ui/dlg/formula.cxx index e5b07260915a..5abc04622e15 100644 --- a/formula/source/ui/dlg/formula.cxx +++ b/formula/source/ui/dlg/formula.cxx @@ -831,6 +831,8 @@ void FormulaDlg_Impl::UpdateTokenArray( const OUString& rStrExp) // #i101512# Disable special handling of jump commands. pCompiler->EnableJumpCommandReorder(false); pCompiler->EnableStopOnError(false); + pCompiler->SetComputeIIFlag(true); + pCompiler->SetMatrixFlag(m_bUserMatrixFlag); pCompiler->CompileTokenArray(); } |