diff options
-rw-r--r-- | sc/inc/matrixoperators.hxx | 2 | ||||
-rw-r--r-- | sc/inc/scmatrix.hxx | 21 | ||||
-rw-r--r-- | sc/source/core/tool/interpr5.cxx | 2 | ||||
-rw-r--r-- | sc/source/core/tool/interpr6.cxx | 4 | ||||
-rw-r--r-- | sc/source/core/tool/matrixoperators.cxx | 2 | ||||
-rw-r--r-- | sc/source/core/tool/scmatrix.cxx | 34 |
6 files changed, 33 insertions, 32 deletions
diff --git a/sc/inc/matrixoperators.hxx b/sc/inc/matrixoperators.hxx index 36fa1cabe3d6..813813626350 100644 --- a/sc/inc/matrixoperators.hxx +++ b/sc/inc/matrixoperators.hxx @@ -48,7 +48,7 @@ struct SumSquare struct Product { static const double InitVal; - void operator()(KahanSum& rAccum, double fVal) const; + void operator()(double& rAccum, double fVal) const; }; } diff --git a/sc/inc/scmatrix.hxx b/sc/inc/scmatrix.hxx index 463b15e17b42..c91253811398 100644 --- a/sc/inc/scmatrix.hxx +++ b/sc/inc/scmatrix.hxx @@ -140,29 +140,30 @@ public: * summation algorithm, * https://en.wikipedia.org/wiki/Kahan_summation_algorithm */ - struct IterateResult + struct IterateResultMultiple { double mfFirst; double mfRest; size_t mnCount; - IterateResult(double fFirst, double fRest, size_t nCount) : + IterateResultMultiple(double fFirst, double fRest, size_t nCount) : mfFirst(fFirst), mfRest(fRest), mnCount(nCount) {} }; /** - * Version of IterateResult for using Kahan sum. + * Iterator for executing one operation with the matrix data. */ - struct KahanIterateResult + template<typename tRes> + struct IterateResult { - KahanSum maAccumulator; + tRes maAccumulator; size_t mnCount; - KahanIterateResult(double fAccumulator, size_t nCount) + IterateResult(tRes fAccumulator, size_t nCount) : maAccumulator(fAccumulator), mnCount(nCount) {} - - double get() const { return maAccumulator.get(); } }; + typedef IterateResult<KahanSum> KahanIterateResult; + typedef IterateResult<double> DoubleIterateResult; /** Checks nC or nR for zero and uses GetElementsMax() whether a matrix of @@ -378,7 +379,7 @@ public: KahanIterateResult Sum( bool bTextAsZero, bool bIgnoreErrorValues = false ) const ; KahanIterateResult SumSquare( bool bTextAsZero, bool bIgnoreErrorValues = false ) const ; - KahanIterateResult Product( bool bTextAsZero, bool bIgnoreErrorValues = false ) const ; + DoubleIterateResult Product( bool bTextAsZero, bool bIgnoreErrorValues = false ) const ; size_t Count(bool bCountStrings, bool bCountErrors, bool bIgnoreEmptyStrings = false) const ; size_t MatchDoubleInColumns(double fValue, size_t nCol1, size_t nCol2) const ; size_t MatchStringInColumns(const svl::SharedString& rStr, size_t nCol1, size_t nCol2) const ; @@ -410,7 +411,7 @@ public: void DivOp(bool bFlag, double fVal, const ScMatrix& rMat) ; void PowOp(bool bFlag, double fVal, const ScMatrix& rMat) ; - std::vector<ScMatrix::IterateResult> Collect(const std::vector<sc::op::Op>& aOp) ; + std::vector<ScMatrix::IterateResultMultiple> Collect(const std::vector<sc::op::Op>& aOp) ; void ExecuteOperation(const std::pair<size_t, size_t>& rStartPos, const std::pair<size_t, size_t>& rEndPos, DoubleOpFunction aDoubleFunc, BoolOpFunction aBoolFunc, StringOpFunction aStringFunc, diff --git a/sc/source/core/tool/interpr5.cxx b/sc/source/core/tool/interpr5.cxx index 613c467cbdc2..1e16518ae8da 100644 --- a/sc/source/core/tool/interpr5.cxx +++ b/sc/source/core/tool/interpr5.cxx @@ -1853,7 +1853,7 @@ void ScInterpreter::ScSumXMY2() } else { - PushDouble(pResMat->SumSquare(false).get()); + PushDouble(pResMat->SumSquare(false).maAccumulator.get()); } } diff --git a/sc/source/core/tool/interpr6.cxx b/sc/source/core/tool/interpr6.cxx index 0e2824ef1f2e..1c7ed73d5c93 100644 --- a/sc/source/core/tool/interpr6.cxx +++ b/sc/source/core/tool/interpr6.cxx @@ -403,8 +403,8 @@ static void IterateMatrix( break; case ifPRODUCT: { - ScMatrix::KahanIterateResult aRes = pMat->Product(bTextAsZero, bIgnoreErrVal); - fRes *= aRes.get(); + ScMatrix::DoubleIterateResult aRes = pMat->Product(bTextAsZero, bIgnoreErrVal); + fRes *= aRes.maAccumulator; rCount += aRes.mnCount; } break; diff --git a/sc/source/core/tool/matrixoperators.cxx b/sc/source/core/tool/matrixoperators.cxx index e65d4d7c0dc2..780f789ed94f 100644 --- a/sc/source/core/tool/matrixoperators.cxx +++ b/sc/source/core/tool/matrixoperators.cxx @@ -19,7 +19,7 @@ void SumSquare::operator()(KahanSum& rAccum, double fVal) const { rAccum += fVal const double SumSquare::InitVal = 0.0; -void Product::operator()(KahanSum& rAccum, double fVal) const { rAccum *= fVal; } +void Product::operator()(double& rAccum, double fVal) const { rAccum *= fVal; } const double Product::InitVal = 1.0; } diff --git a/sc/source/core/tool/scmatrix.cxx b/sc/source/core/tool/scmatrix.cxx index a10863ea3a53..d3c8667c66c1 100644 --- a/sc/source/core/tool/scmatrix.cxx +++ b/sc/source/core/tool/scmatrix.cxx @@ -304,7 +304,7 @@ public: ScMatrix::KahanIterateResult Sum( bool bTextAsZero, bool bIgnoreErrorValues ) const; ScMatrix::KahanIterateResult SumSquare( bool bTextAsZero, bool bIgnoreErrorValues ) const; - ScMatrix::KahanIterateResult Product( bool bTextAsZero, bool bIgnoreErrorValues ) const; + ScMatrix::DoubleIterateResult Product( bool bTextAsZero, bool bIgnoreErrorValues ) const; size_t Count(bool bCountStrings, bool bCountErrors, bool bIgnoreEmptyStrings) const; size_t MatchDoubleInColumns(double fValue, size_t nCol1, size_t nCol2) const; size_t MatchStringInColumns(const svl::SharedString& rStr, size_t nCol1, size_t nCol2) const; @@ -328,7 +328,7 @@ public: const ScMatrix::EmptyOpFunction& aEmptyFunc) const; template<typename T> - std::vector<ScMatrix::IterateResult> ApplyCollectOperation(const std::vector<T>& aOp); + std::vector<ScMatrix::IterateResultMultiple> ApplyCollectOperation(const std::vector<T>& aOp); void MatConcat(SCSIZE nMaxCol, SCSIZE nMaxRow, const ScMatrixRef& xMat1, const ScMatrixRef& xMat2, SvNumberFormatter& rFormatter, svl::SharedStringPool& rPool); @@ -1107,11 +1107,11 @@ double ScMatrixImpl::Xor() const namespace { -template<typename Op> +template<typename Op, typename tRes> class WalkElementBlocks { Op maOp; - ScMatrix::KahanIterateResult maRes; + ScMatrix::IterateResult<tRes> maRes; bool mbTextAsZero:1; bool mbIgnoreErrorValues:1; public: @@ -1120,7 +1120,7 @@ public: mbTextAsZero(bTextAsZero), mbIgnoreErrorValues(bIgnoreErrorValues) {} - const ScMatrix::KahanIterateResult& getResult() const { return maRes; } + const ScMatrix::IterateResult<tRes>& getResult() const { return maRes; } void operator() (const MatrixImplType::element_block_node_type& node) { @@ -1173,7 +1173,7 @@ template<typename Op> class WalkElementBlocksMultipleValues { const std::vector<Op>* mpOp; - std::vector<ScMatrix::IterateResult> maRes; + std::vector<ScMatrix::IterateResultMultiple> maRes; bool mbFirst:1; public: WalkElementBlocksMultipleValues(const std::vector<Op>& aOp) : @@ -1200,7 +1200,7 @@ public: return *this; } - const std::vector<ScMatrix::IterateResult>& getResult() const { return maRes; } + const std::vector<ScMatrix::IterateResultMultiple>& getResult() const { return maRes; } void operator() (const MatrixImplType::element_block_node_type& node) { @@ -2080,10 +2080,10 @@ public: namespace { -template<typename TOp> -ScMatrix::KahanIterateResult GetValueWithCount(bool bTextAsZero, bool bIgnoreErrorValues, const MatrixImplType& maMat) +template<typename TOp, typename tRes> +ScMatrix::IterateResult<tRes> GetValueWithCount(bool bTextAsZero, bool bIgnoreErrorValues, const MatrixImplType& maMat) { - WalkElementBlocks<TOp> aFunc(bTextAsZero, bIgnoreErrorValues); + WalkElementBlocks<TOp, tRes> aFunc(bTextAsZero, bIgnoreErrorValues); aFunc = maMat.walk(aFunc); return aFunc.getResult(); } @@ -2092,17 +2092,17 @@ ScMatrix::KahanIterateResult GetValueWithCount(bool bTextAsZero, bool bIgnoreErr ScMatrix::KahanIterateResult ScMatrixImpl::Sum(bool bTextAsZero, bool bIgnoreErrorValues) const { - return GetValueWithCount<sc::op::Sum>(bTextAsZero, bIgnoreErrorValues, maMat); + return GetValueWithCount<sc::op::Sum, KahanSum>(bTextAsZero, bIgnoreErrorValues, maMat); } ScMatrix::KahanIterateResult ScMatrixImpl::SumSquare(bool bTextAsZero, bool bIgnoreErrorValues) const { - return GetValueWithCount<sc::op::SumSquare>(bTextAsZero, bIgnoreErrorValues, maMat); + return GetValueWithCount<sc::op::SumSquare, KahanSum>(bTextAsZero, bIgnoreErrorValues, maMat); } -ScMatrix::KahanIterateResult ScMatrixImpl::Product(bool bTextAsZero, bool bIgnoreErrorValues) const +ScMatrix::DoubleIterateResult ScMatrixImpl::Product(bool bTextAsZero, bool bIgnoreErrorValues) const { - return GetValueWithCount<sc::op::Product>(bTextAsZero, bIgnoreErrorValues, maMat); + return GetValueWithCount<sc::op::Product, double>(bTextAsZero, bIgnoreErrorValues, maMat); } size_t ScMatrixImpl::Count(bool bCountStrings, bool bCountErrors, bool bIgnoreEmptyStrings) const @@ -2423,7 +2423,7 @@ void ScMatrixImpl::ApplyOperation(T aOp, ScMatrixImpl& rMat) } template<typename T> -std::vector<ScMatrix::IterateResult> ScMatrixImpl::ApplyCollectOperation(const std::vector<T>& aOp) +std::vector<ScMatrix::IterateResultMultiple> ScMatrixImpl::ApplyCollectOperation(const std::vector<T>& aOp) { WalkElementBlocksMultipleValues<T> aFunc(aOp); aFunc = maMat.walk(std::move(aFunc)); @@ -3218,7 +3218,7 @@ ScMatrix::KahanIterateResult ScMatrix::SumSquare(bool bTextAsZero, bool bIgnoreE return pImpl->SumSquare(bTextAsZero, bIgnoreErrorValues); } -ScMatrix::KahanIterateResult ScMatrix::Product(bool bTextAsZero, bool bIgnoreErrorValues) const +ScMatrix::DoubleIterateResult ScMatrix::Product(bool bTextAsZero, bool bIgnoreErrorValues) const { return pImpl->Product(bTextAsZero, bIgnoreErrorValues); } @@ -3425,7 +3425,7 @@ void ScMatrix::ExecuteOperation(const std::pair<size_t, size_t>& rStartPos, pImpl->ExecuteOperation(rStartPos, rEndPos, aDoubleFunc, aBoolFunc, aStringFunc, aEmptyFunc); } -std::vector<ScMatrix::IterateResult> ScMatrix::Collect(const std::vector<sc::op::Op>& aOp) +std::vector<ScMatrix::IterateResultMultiple> ScMatrix::Collect(const std::vector<sc::op::Op>& aOp) { return pImpl->ApplyCollectOperation(aOp); } |