[Libreoffice-commits] core.git: Branch 'private/kohei/formula-opencl-work' - sc/source
Kohei Yoshida
kohei.yoshida at collabora.com
Mon Sep 9 12:31:36 PDT 2013
sc/source/core/data/column2.cxx | 6 +++-
sc/source/core/tool/formulagroup.cxx | 44 +++++++++++++++++++++++++++++++++--
2 files changed, 46 insertions(+), 4 deletions(-)
New commits:
commit 21567d48e49bb91f4dd2610f21630a68108218fc
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date: Mon Sep 9 15:32:25 2013 -0400
Do the same for range vector tokens.
Change-Id: Id80f76dbe575fc6b279dafbfc524a9230755ddc8
diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx
index 5f7f843..34ecbb2 100644
--- a/sc/source/core/data/column2.cxx
+++ b/sc/source/core/data/column2.cxx
@@ -2268,8 +2268,10 @@ formula::VectorRefArray ScColumn::FetchVectorRefArray( sc::FormulaGroupContext&
{
if (nLenRequested <= nLen)
{
- // Fill the whole length with zero.
- rCxt.maNumArrays.push_back(new sc::FormulaGroupContext::NumArrayType(nLenRequested, 0.0));
+ // Fill the whole length with NaN's.
+ double fNan;
+ rtl::math::setNan(&fNan);
+ rCxt.maNumArrays.push_back(new sc::FormulaGroupContext::NumArrayType(nLenRequested, fNan));
return formula::VectorRefArray(&rCxt.maNumArrays.back()[0]);
}
diff --git a/sc/source/core/tool/formulagroup.cxx b/sc/source/core/tool/formulagroup.cxx
index ca888dc..f6a1dff 100644
--- a/sc/source/core/tool/formulagroup.cxx
+++ b/sc/source/core/tool/formulagroup.cxx
@@ -29,6 +29,46 @@
namespace sc {
+namespace {
+
+/**
+ * Input double array consists of segments of NaN's and normal values.
+ * Insert only the normal values into the matrix while skipping the NaN's.
+ */
+void fillMatrix( ScMatrix& rMat, size_t nCol, const double* pNums, size_t nLen )
+{
+ const double* p = pNums;
+ const double* pEnd = p + nLen;
+ const double* pHead = NULL;
+ for (; p != pEnd; ++p)
+ {
+ if (!rtl::math::isNan(*p))
+ {
+ if (!pHead)
+ // Store the first non-NaN position.
+ pHead = p;
+
+ continue;
+ }
+
+ if (pHead)
+ {
+ // Flush this non-NaN segment to the matrix.
+ rMat.PutDouble(pHead, p - pHead, nCol, pHead - pNums);
+ pHead = NULL;
+ }
+ }
+
+ if (pHead)
+ {
+ // Flush last non-NaN segment to the matrix.
+ rMat.PutDouble(pHead, p - pHead, nCol, pHead - pNums);
+ pHead = NULL;
+ }
+}
+
+}
+
ScMatrixRef FormulaGroupInterpreterSoftware::inverseMatrix(const ScMatrix& /*rMat*/)
{
return ScMatrixRef();
@@ -97,7 +137,7 @@ bool FormulaGroupInterpreterSoftware::interpret(ScDocument& rDoc, const ScAddres
if (!p2->IsEndFixed())
nRowEnd += i;
size_t nRowSize = nRowEnd - nRowStart + 1;
- ScMatrixRef pMat(new ScMatrix(nColSize, nRowSize, 0.0));
+ ScMatrixRef pMat(new ScMatrix(nColSize, nRowSize));
for (size_t nCol = 0; nCol < nColSize; ++nCol)
{
const formula::VectorRefArray& rArray = rArrays[nCol];
@@ -105,7 +145,7 @@ bool FormulaGroupInterpreterSoftware::interpret(ScDocument& rDoc, const ScAddres
{
const double* pNums = rArray.mpNumericArray;
pNums += nRowStart;
- pMat->PutDouble(pNums, nRowSize, nCol, 0);
+ fillMatrix(*pMat, nCol, pNums, nRowSize);
}
else
{
More information about the Libreoffice-commits
mailing list