diff options
-rw-r--r-- | sc/inc/scmatrix.hxx | 2 | ||||
-rw-r--r-- | sc/source/core/tool/scmatrix.cxx | 96 |
2 files changed, 53 insertions, 45 deletions
diff --git a/sc/inc/scmatrix.hxx b/sc/inc/scmatrix.hxx index 1eab349abc1d..1e4c74ff99b3 100644 --- a/sc/inc/scmatrix.hxx +++ b/sc/inc/scmatrix.hxx @@ -202,7 +202,7 @@ public: ScMatrix(SCSIZE nC, SCSIZE nR); ScMatrix(SCSIZE nC, SCSIZE nR, double fInitVal); - ScMatrix( size_t nC, size_t nR, const std::vector<bool>& rInitVals ); + ScMatrix( size_t nC, size_t nR, const std::vector<double>& rInitVals ); /** Clone the matrix. */ ScMatrix* Clone() const; diff --git a/sc/source/core/tool/scmatrix.cxx b/sc/source/core/tool/scmatrix.cxx index 964fd471723a..25ccff56bdce 100644 --- a/sc/source/core/tool/scmatrix.cxx +++ b/sc/source/core/tool/scmatrix.cxx @@ -70,51 +70,63 @@ typedef mdds::multi_type_matrix<custom_string_trait> MatrixImplType; namespace { -struct ElemEqualZero : public unary_function<double, bool> +struct ElemEqualZero : public unary_function<double, double> { - bool operator() (double val) const + double operator() (double val) const { - return val == 0.0; + if (!::rtl::math::isFinite(val)) + return val; + return val == 0.0 ? 1.0 : 0.0; } }; -struct ElemNotEqualZero : public unary_function<double, bool> +struct ElemNotEqualZero : public unary_function<double, double> { - bool operator() (double val) const + double operator() (double val) const { - return val != 0.0; + if (!::rtl::math::isFinite(val)) + return val; + return val != 0.0 ? 1.0 : 0.0; } }; -struct ElemGreaterZero : public unary_function<double, bool> +struct ElemGreaterZero : public unary_function<double, double> { - bool operator() (double val) const + double operator() (double val) const { - return val > 0.0; + if (!::rtl::math::isFinite(val)) + return val; + return val > 0.0 ? 1.0 : 0.0; } }; -struct ElemLessZero : public unary_function<double, bool> +struct ElemLessZero : public unary_function<double, double> { - bool operator() (double val) const + double operator() (double val) const { - return val < 0.0; + if (!::rtl::math::isFinite(val)) + return val; + return val < 0.0 ? 1.0 : 0.0; } }; -struct ElemGreaterEqualZero : public unary_function<double, bool> +struct ElemGreaterEqualZero : public unary_function<double, double> { - bool operator() (double val) const + double operator() (double val) const { - return val >= 0.0; + if (!::rtl::math::isFinite(val)) + return val; + return val >= 0.0 ? 1.0 : 0.0; } }; -struct ElemLessEqualZero : public unary_function<double, bool> +struct ElemLessEqualZero : public unary_function<double, double> { - bool operator() (double val) const + double operator() (double val) const { - return val <= 0.0; + if (!::rtl::math::isFinite(val)) + return val; + return val <= 0.0 ? 1.0 : 0.0; } }; @@ -123,7 +135,7 @@ class CompareMatrixElemFunc : std::unary_function<MatrixImplType::element_block_ { static _Comp maComp; - std::vector<bool> maNewMatValues; + std::vector<double> maNewMatValues; // double instead of bool to transport error values size_t mnRow; size_t mnCol; public: @@ -145,13 +157,6 @@ public: for (; it != itEnd; ++it) { double fVal = *it; - if (!rtl::math::isFinite(fVal)) - { - /* FIXME: this silently skips an error instead of propagating it! */ - maNewMatValues.push_back(false); - continue; - } - maNewMatValues.push_back(maComp(fVal)); } } @@ -173,7 +178,7 @@ public: case mdds::mtm::element_empty: default: // Fill it with false. - maNewMatValues.resize(maNewMatValues.size() + node.size, false); + maNewMatValues.resize(maNewMatValues.size() + node.size, 0.0); } } @@ -200,7 +205,7 @@ public: ScMatrixImpl(SCSIZE nC, SCSIZE nR); ScMatrixImpl(SCSIZE nC, SCSIZE nR, double fInitVal); - ScMatrixImpl( size_t nC, size_t nR, const std::vector<bool>& rInitVals ); + ScMatrixImpl( size_t nC, size_t nR, const std::vector<double>& rInitVals ); ~ScMatrixImpl(); @@ -295,7 +300,7 @@ ScMatrixImpl::ScMatrixImpl(SCSIZE nC, SCSIZE nR) : ScMatrixImpl::ScMatrixImpl(SCSIZE nC, SCSIZE nR, double fInitVal) : maMat(nR, nC, fInitVal), maMatFlag(nR, nC), pErrorInterpreter(NULL), mbCloneIfConst(true) {} -ScMatrixImpl::ScMatrixImpl( size_t nC, size_t nR, const std::vector<bool>& rInitVals ) : +ScMatrixImpl::ScMatrixImpl( size_t nC, size_t nR, const std::vector<double>& rInitVals ) : maMat(nR, nC, rInitVals.begin(), rInitVals.end()), maMatFlag(nR, nC), pErrorInterpreter(NULL), mbCloneIfConst(true) {} ScMatrixImpl::~ScMatrixImpl() @@ -1284,32 +1289,35 @@ public: } }; -inline bool evaluate( double fVal, ScQueryOp eOp ) +inline double evaluate( double fVal, ScQueryOp eOp ) { + if (!rtl::math::isFinite(fVal)) + return fVal; + switch (eOp) { case SC_EQUAL: - return fVal == 0.0; + return fVal == 0.0 ? 1.0 : 0.0; case SC_LESS: - return fVal < 0.0; + return fVal < 0.0 ? 1.0 : 0.0; case SC_GREATER: - return fVal > 0.0; + return fVal > 0.0 ? 1.0 : 0.0; break; case SC_LESS_EQUAL: - return fVal <= 0.0; + return fVal <= 0.0 ? 1.0 : 0.0; break; case SC_GREATER_EQUAL: - return fVal >= 0.0; + return fVal >= 0.0 ? 1.0 : 0.0; break; case SC_NOT_EQUAL: - return fVal != 0.0; + return fVal != 0.0 ? 1.0 : 0.0; break; default: ; } OSL_TRACE( "evaluate: unhandled comparison operator: %d", (int)eOp); - return false; + return CreateDoubleError( errUnknownState); } class CompareMatrixFunc : std::unary_function<MatrixImplType::element_block_type, void> @@ -1317,7 +1325,7 @@ class CompareMatrixFunc : std::unary_function<MatrixImplType::element_block_type sc::Compare& mrComp; size_t mnMatPos; sc::CompareOptions* mpOptions; - std::vector<bool> maResValues; + std::vector<double> maResValues; // double instead of bool to transport error values void compare() { @@ -1397,7 +1405,7 @@ public: } } - const std::vector<bool>& getValues() const + const std::vector<double>& getValues() const { return maResValues; } @@ -1411,7 +1419,7 @@ class CompareMatrixToNumericFunc : std::unary_function<MatrixImplType::element_b sc::Compare& mrComp; double mfRightValue; sc::CompareOptions* mpOptions; - std::vector<bool> maResValues; + std::vector<double> maResValues; // double instead of bool to transport error values void compare() { @@ -1489,7 +1497,7 @@ public: } } - const std::vector<bool>& getValues() const + const std::vector<double>& getValues() const { return maResValues; } @@ -1711,7 +1719,7 @@ ScMatrixRef ScMatrixImpl::CompareMatrix( maMat.walk(aFunc); // We assume the result matrix has the same dimension as this matrix. - const std::vector<bool>& rResVal = aFunc.getValues(); + const std::vector<double>& rResVal = aFunc.getValues(); if (nSize != rResVal.size()) ScMatrixRef(); @@ -1723,7 +1731,7 @@ ScMatrixRef ScMatrixImpl::CompareMatrix( maMat.walk(aFunc); // We assume the result matrix has the same dimension as this matrix. - const std::vector<bool>& rResVal = aFunc.getValues(); + const std::vector<double>& rResVal = aFunc.getValues(); if (nSize != rResVal.size()) ScMatrixRef(); @@ -1882,7 +1890,7 @@ ScMatrix::ScMatrix(SCSIZE nC, SCSIZE nR, double fInitVal) : SAL_WARN_IF( !nR, "sc", "ScMatrix with 0 rows!"); } -ScMatrix::ScMatrix( size_t nC, size_t nR, const std::vector<bool>& rInitVals ) : +ScMatrix::ScMatrix( size_t nC, size_t nR, const std::vector<double>& rInitVals ) : pImpl(new ScMatrixImpl(nC, nR, rInitVals)), nRefCnt(0) { SAL_WARN_IF( !nC, "sc", "ScMatrix with 0 columns!"); |