summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
Diffstat (limited to 'sc')
-rw-r--r--sc/inc/scmatrix.hxx2
-rw-r--r--sc/source/core/tool/scmatrix.cxx96
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!");