[Libreoffice-commits] core.git: sc/inc sc/source
Markus Mohrhard
markus.mohrhard at googlemail.com
Wed Mar 23 19:07:40 UTC 2016
sc/inc/scmatrix.hxx | 9 ++
sc/source/core/tool/interpr5.cxx | 18 -----
sc/source/core/tool/scmatrix.cxx | 118 +++++++++++++++++++++++++++++++++++++++
3 files changed, 128 insertions(+), 17 deletions(-)
New commits:
commit 5c8991813dc303c7ffc8fef7d8d8f0779657fde6
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date: Tue Mar 22 12:30:18 2016 +0100
better use mdds in matrix concat, tdf#88849
Change-Id: I6155b86d0afbefafdf982962ffd0216334834379
Reviewed-on: https://gerrit.libreoffice.org/23425
Tested-by: Jenkins <ci at libreoffice.org>
Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>
diff --git a/sc/inc/scmatrix.hxx b/sc/inc/scmatrix.hxx
index d82cfa4..c8d4bcc 100644
--- a/sc/inc/scmatrix.hxx
+++ b/sc/inc/scmatrix.hxx
@@ -406,6 +406,9 @@ public:
virtual void ExecuteOperation(const std::pair<size_t, size_t>& rStartPos, const std::pair<size_t, size_t>& rEndPos,
DoubleOpFunction aDoubleFunc, BoolOpFunction aBoolFunc, StringOpFunction aStringFunc) const = 0;
+ virtual void MatConcat(SCSIZE nMaxCol, SCSIZE nMaxRow, const ScMatrixRef& xMat1, const ScMatrixRef& xMat2,
+ SvNumberFormatter& rFormatter) = 0;
+
#if DEBUG_MATRIX
virtual void Dump() const = 0;
#endif
@@ -615,6 +618,9 @@ public:
DoubleOpFunction aDoubleFunc, BoolOpFunction aBoolFunc, StringOpFunction aStringFunc) const override;
ScFullMatrix& operator+= ( const ScFullMatrix& r );
+ virtual void MatConcat(SCSIZE nMaxCol, SCSIZE nMaxRow, const ScMatrixRef& xMat1, const ScMatrixRef& xMat2,
+ SvNumberFormatter& rFormatter) override;
+
#if DEBUG_MATRIX
virtual void Dump() const override;
#endif
@@ -826,6 +832,9 @@ public:
ScVectorRefMatrix& operator+=(const ScVectorRefMatrix& r);
+ virtual void MatConcat(SCSIZE nMaxCol, SCSIZE nMaxRow, const ScMatrixRef& xMat1, const ScMatrixRef& xMat2,
+ SvNumberFormatter& rFormatter) override;
+
#if DEBUG_MATRIX
virtual void Dump() const override
{
diff --git a/sc/source/core/tool/interpr5.cxx b/sc/source/core/tool/interpr5.cxx
index 22a8375..f7da2e7 100644
--- a/sc/source/core/tool/interpr5.cxx
+++ b/sc/source/core/tool/interpr5.cxx
@@ -1170,23 +1170,7 @@ ScMatrixRef ScInterpreter::MatConcat(const ScMatrixRef& pMat1, const ScMatrixRef
ScMatrixRef xResMat = GetNewMat(nMinC, nMinR);
if (xResMat)
{
- for (SCSIZE i = 0; i < nMinC; i++)
- {
- for (SCSIZE j = 0; j < nMinR; j++)
- {
- sal_uInt16 nErr = pMat1->GetErrorIfNotString( i, j);
- if (!nErr)
- nErr = pMat2->GetErrorIfNotString( i, j);
- if (nErr)
- xResMat->PutError( nErr, i, j);
- else
- {
- OUString aTmp = pMat1->GetString(*pFormatter, i, j).getString();
- aTmp += pMat2->GetString(*pFormatter, i, j).getString();
- xResMat->PutString(mrStrPool.intern(aTmp), i, j);
- }
- }
- }
+ xResMat->MatConcat(nMinC, nMinR, pMat1, pMat2, *pFormatter);
}
return xResMat;
}
diff --git a/sc/source/core/tool/scmatrix.cxx b/sc/source/core/tool/scmatrix.cxx
index 1feb7d4..29905f3 100644
--- a/sc/source/core/tool/scmatrix.cxx
+++ b/sc/source/core/tool/scmatrix.cxx
@@ -306,6 +306,9 @@ public:
template<typename T>
std::vector<ScMatrix::IterateResult> ApplyCollectOperation(bool bTextAsZero, const std::vector<std::unique_ptr<T>>& aOp);
+ void MatConcat(SCSIZE nMaxCol, SCSIZE nMaxRow, const ScMatrixRef& xMat1, const ScMatrixRef& xMat2,
+ SvNumberFormatter& rFormatter);
+
#if DEBUG_MATRIX
void Dump() const;
#endif
@@ -2370,6 +2373,108 @@ void ScMatrixImpl::CalcPosition(SCSIZE nIndex, SCSIZE& rC, SCSIZE& rR) const
rR = nIndex - rC*nRowSize;
}
+void ScMatrixImpl::MatConcat(SCSIZE nMaxCol, SCSIZE nMaxRow, const ScMatrixRef& xMat1, const ScMatrixRef& xMat2,
+ SvNumberFormatter& rFormatter)
+{
+ SCSIZE nC1, nC2;
+ SCSIZE nR1, nR2;
+ xMat1->GetDimensions(nC1, nR1);
+ xMat2->GetDimensions(nC2, nR2);
+
+ sal_uLong nKey = rFormatter.GetStandardFormat( css::util::NumberFormat::NUMBER,
+ ScGlobal::eLnge);
+
+ std::vector<OUString> aString(nMaxCol * nMaxRow);
+ std::vector<bool> aValid(nMaxCol * nMaxRow, true);
+ std::vector<sal_uInt16> nErrors(nMaxCol * nMaxRow, 0);
+
+ size_t nRowOffset = 0;
+ size_t nColOffset = 0;
+ std::function<void(size_t, size_t, double)> aDoubleFunc =
+ [&](size_t nRow, size_t nCol, double nVal)
+ {
+ sal_uInt16 nErr = GetDoubleErrorValue(nVal);
+ if (nErr)
+ {
+ aValid[nMaxCol * (nRow + nRowOffset) + nCol + nColOffset] = false;
+ nErrors[nMaxCol * (nRow + nRowOffset) + nCol + nColOffset] = nErr;
+ return;
+ }
+ OUString aStr;
+ rFormatter.GetInputLineString( nVal, nKey, aStr);
+ aString[nMaxCol * (nRow + nRowOffset) + nCol + nColOffset] = aString[nMaxCol * (nRow + nRowOffset) + nCol + nColOffset] + aStr;
+ };
+
+ std::function<void(size_t, size_t, bool)> aBoolFunc =
+ [&](size_t nRow, size_t nCol, double nVal)
+ {
+ OUString aStr;
+ rFormatter.GetInputLineString( nVal, nKey, aStr);
+ aString[nMaxCol * (nRow + nRowOffset) + nCol + nColOffset] = aString[nMaxCol * (nRow + nRowOffset) + nCol + nColOffset] + aStr;
+ };
+
+ std::function<void(size_t, size_t, svl::SharedString)> aStringFunc =
+ [&](size_t nRow, size_t nCol, svl::SharedString aStr)
+ {
+ aString[(nRow + nRowOffset) * nMaxCol + nCol + nColOffset] = aString[(nRow + nRowOffset) * nMaxCol + nCol + nColOffset] + aStr.getString();
+ };
+
+ if (nC1 == 1 || nR1 == 1)
+ {
+ size_t nRowRep = nR1 == 1 ? nMaxRow : 1;
+ size_t nColRep = nC1 == 1 ? nMaxCol : 1;
+
+ for (size_t i = 0; i < nRowRep; ++i)
+ {
+ nRowOffset = i;
+ for (size_t j = 0; j < nColRep; ++j)
+ {
+ nColOffset = j;
+ xMat1->ExecuteOperation(std::pair<size_t, size_t>(0, 0), std::pair<size_t, size_t>(std::min(nR1, nMaxRow) - 1, std::min(nC1, nMaxCol) - 1), aDoubleFunc, aBoolFunc, aStringFunc);
+ }
+ }
+ }
+ else
+ xMat1->ExecuteOperation(std::pair<size_t, size_t>(0, 0), std::pair<size_t, size_t>(nMaxRow - 1, nMaxCol - 1), aDoubleFunc, aBoolFunc, aStringFunc);
+
+ nRowOffset = 0;
+ nColOffset = 0;
+ if (nC2 == 1 || nR2 == 1)
+ {
+ size_t nRowRep = nR2 == 1 ? nMaxRow : 1;
+ size_t nColRep = nC2 == 1 ? nMaxCol : 1;
+
+ for (size_t i = 0; i < nRowRep; ++i)
+ {
+ nRowOffset = i;
+ for (size_t j = 0; j < nColRep; ++j)
+ {
+ nColOffset = j;
+ xMat2->ExecuteOperation(std::pair<size_t, size_t>(0, 0), std::pair<size_t, size_t>(std::min(nR2, nMaxRow) - 1, std::min(nC2, nMaxCol) - 1), aDoubleFunc, aBoolFunc, aStringFunc);
+ }
+ }
+ }
+ else
+ xMat2->ExecuteOperation(std::pair<size_t, size_t>(0, 0), std::pair<size_t, size_t>(nMaxRow - 1, nMaxCol - 1), aDoubleFunc, aBoolFunc, aStringFunc);
+
+ MatrixImplType::position_type pos = maMat.position(0, 0);
+ for (SCSIZE i = 0; i < nMaxCol; ++i)
+ {
+ for (SCSIZE j = 0; j < nMaxRow; ++j)
+ {
+ if (aValid[nMaxCol * j + i])
+ {
+ pos = maMat.set(pos, aString[nMaxCol * j + i]);
+ }
+ else
+ {
+ pos = maMat.set(pos, CreateDoubleError(nErrors[nMaxCol * j + i]));
+ }
+ pos = maMat.next_position(pos);
+ }
+ }
+}
+
void ScMatrix::IncRef() const
{
++nRefCnt;
@@ -3751,4 +3856,17 @@ void ScVectorRefMatrix::ExecuteOperation(const std::pair<size_t, size_t>& rStart
mpFullMatrix->ExecuteOperation(rStartPos, rEndPos, aDoubleFunc, aBoolFunc, aStringFunc);
}
+void ScFullMatrix::MatConcat(SCSIZE nMaxCol, SCSIZE nMaxRow,
+ const ScMatrixRef& xMat1, const ScMatrixRef& xMat2, SvNumberFormatter& rFormatter)
+{
+ pImpl->MatConcat(nMaxCol, nMaxRow, xMat1, xMat2, rFormatter);
+}
+
+void ScVectorRefMatrix::MatConcat(SCSIZE nMaxCol, SCSIZE nMaxRow,
+ const ScMatrixRef& xMat1, const ScMatrixRef& xMat2, SvNumberFormatter& rFormatter)
+{
+ ensureFullMatrix();
+ mpFullMatrix->MatConcat(nMaxCol, nMaxRow, xMat1, xMat2, rFormatter);
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
More information about the Libreoffice-commits
mailing list