sc/source/core/tool/interpr6.cxx | 91 +++++++++++++-------------------------- 1 file changed, 32 insertions(+), 59 deletions(-)
New commits: commit 83da402fbf02f5aa778b6d3554275b14f40d8bc5 Author: László Németh <[email protected]> Date: Fri Mar 3 14:05:46 2017 +0100 Revert "Adapt FuncSum to vectorize better." This reverts commit 258e48d6d9c0d2ea9621b248239c0e1708a85cda. Change-Id: I96ce1e63d2d0c300cbe25afdd9c139b2d76464eb diff --git a/sc/source/core/tool/interpr6.cxx b/sc/source/core/tool/interpr6.cxx index 78d6f47..fedf026 100644 --- a/sc/source/core/tool/interpr6.cxx +++ b/sc/source/core/tool/interpr6.cxx @@ -203,6 +203,8 @@ double ScInterpreter::GetGammaDist( double fX, double fAlpha, double fLambda ) return GetLowRegIGamma( fAlpha, fX / fLambda); } +namespace { + class NumericCellAccumulator { double mfFirst; @@ -212,69 +214,38 @@ class NumericCellAccumulator public: NumericCellAccumulator() : mfFirst(0.0), mfRest(0.0), mnError(0) {} - void operator() (const sc::CellStoreType::value_type& rNode, size_t nOffset, size_t nDataSize) + void operator() (size_t, double fVal) { - switch (rNode.type) - { - case sc::element_type_numeric: - { - const double *p = &sc::numeric_block::at(*rNode.data, nOffset); - size_t i = 0; - - // Store the first non-zero value in mfFirst (for some reason). - if (!mfFirst) - { - for (i = 0; i < nDataSize; ++i) - { - if (!mfFirst) - mfFirst = p[i]; - else - break; - } - } - p += i; - nDataSize -= i; - if (nDataSize == 0) - return; - - sc::ArraySumFunctor functor(p, nDataSize); - - mfRest += functor(); - break; - } + if ( !mfFirst ) + mfFirst = fVal; + else + mfRest += fVal; + } - case sc::element_type_formula: - { - sc::formula_block::const_iterator it = sc::formula_block::begin(*rNode.data); - std::advance(it, nOffset); - sc::formula_block::const_iterator itEnd = it; - std::advance(itEnd, nDataSize); - for (; it != itEnd; ++it) - { - double fVal = 0.0; - sal_uInt16 nErr = 0; - ScFormulaCell& rCell = const_cast<ScFormulaCell&>(*(*it)); - if (!rCell.GetErrorOrValue(nErr, fVal)) - // The cell has neither error nor value. Perhaps string result. - continue; + void operator() (size_t, const ScFormulaCell* pCell) + { + if (mnError) + // Skip all the rest if we have an error. + return; - if (nErr) - { - // Cell has error - skip all the rest - mnError = nErr; - return; - } + double fVal = 0.0; + sal_uInt16 nErr = 0; + ScFormulaCell& rCell = const_cast<ScFormulaCell&>(*pCell); + if (!rCell.GetErrorOrValue(nErr, fVal)) + // The cell has neither error nor value. Perhaps string result. + return; - if ( !mfFirst ) - mfFirst = fVal; - else - mfRest += fVal; - } - } - break; - default: - ; + if (nErr) + { + // Cell has error. + mnError = nErr; + return; } + + if ( !mfFirst ) + mfFirst = fVal; + else + mfRest += fVal; } sal_uInt16 getError() const { return mnError; } @@ -376,7 +347,7 @@ public: return; NumericCellAccumulator aFunc; - maPos.miCellPos = sc::ParseBlock(maPos.miCellPos, mpCol->GetCellStore(), aFunc, nRow1, nRow2); + maPos.miCellPos = sc::ParseFormulaNumeric(maPos.miCellPos, mpCol->GetCellStore(), nRow1, nRow2, aFunc); mnError = aFunc.getError(); if (mnError) return; @@ -459,6 +430,8 @@ void IterateMatrix( } } +} + double ScInterpreter::IterateParameters( ScIterFunc eFunc, bool bTextAsZero ) { short nParamCount = GetByte();
_______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
