sc/source/core/tool/scmatrix.cxx | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-)
New commits: commit 056be3551279a2e0e4d766e898e93ab500401da6 Author: Markus Mohrhard <markus.mohrh...@googlemail.com> Date: Sun Mar 20 22:27:42 2016 +0100 use an empty block as empty cell flag, related tdf#88849 This should reduce the memory consumption for matrix objects quite a bit. Change-Id: I7a768f0c45777678000f4f8c25868107b22d62a7 Reviewed-on: https://gerrit.libreoffice.org/23383 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Markus Mohrhard <markus.mohrh...@googlemail.com> diff --git a/sc/source/core/tool/scmatrix.cxx b/sc/source/core/tool/scmatrix.cxx index 0f237e1..1feb7d4 100644 --- a/sc/source/core/tool/scmatrix.cxx +++ b/sc/source/core/tool/scmatrix.cxx @@ -201,7 +201,6 @@ _Comp CompareMatrixElemFunc<_Comp>::maComp; /* TODO: it would be good if mdds had get/set<sal_uInt8> additionally to * get/set<bool>, we're abusing double here. */ typedef double TMatFlag; -const TMatFlag SC_MATFLAG_EMPTYCELL = 0.0; const TMatFlag SC_MATFLAG_EMPTYRESULT = 1.0; const TMatFlag SC_MATFLAG_EMPTYPATH = 2.0; @@ -316,7 +315,7 @@ private: }; ScMatrixImpl::ScMatrixImpl(SCSIZE nC, SCSIZE nR) : - maMat(nR, nC), maMatFlag(nR, nC, SC_MATFLAG_EMPTYCELL), pErrorInterpreter(nullptr) {} + maMat(nR, nC), maMatFlag(nR, nC), pErrorInterpreter(nullptr) {} ScMatrixImpl::ScMatrixImpl(SCSIZE nC, SCSIZE nR, double fInitVal) : maMat(nR, nC, fInitVal), maMatFlag(nR, nC), pErrorInterpreter(nullptr) {} @@ -483,7 +482,7 @@ void ScMatrixImpl::PutEmpty(SCSIZE nC, SCSIZE nR) if (ValidColRow( nC, nR)) { maMat.set_empty(nR, nC); - maMatFlag.set(nR, nC, SC_MATFLAG_EMPTYCELL); + maMatFlag.set_empty(nR, nC); } else { @@ -611,7 +610,7 @@ svl::SharedString ScMatrixImpl::GetString( SvNumberFormatter& rFormatter, SCSIZE return maMat.get_string(aPos).getString(); case mdds::mtm::element_empty: { - if (maMatFlag.get<TMatFlag>(nR, nC) != SC_MATFLAG_EMPTYPATH) + if (maMatFlag.get_numeric(nR, nC) != SC_MATFLAG_EMPTYPATH) // not an empty path. return svl::SharedString::getEmptyString(); @@ -669,8 +668,18 @@ ScMatrixValue ScMatrixImpl::Get(SCSIZE nC, SCSIZE nR) const case mdds::mtm::element_empty: /* TODO: do we need to pass the differentiation of 'empty' and * 'empty result' to the outer world anywhere? */ - aVal.nType = maMatFlag.get<TMatFlag>(nR, nC) == SC_MATFLAG_EMPTYPATH ? SC_MATVAL_EMPTYPATH : - SC_MATVAL_EMPTY; + switch (maMatFlag.get_type(nR, nC)) + { + case mdds::mtm::element_empty: + aVal.nType = SC_MATVAL_EMPTY; + break; + case mdds::mtm::element_numeric: + aVal.nType = maMatFlag.get<TMatFlag>(nR, nC) + == SC_MATFLAG_EMPTYPATH ? SC_MATVAL_EMPTYPATH : SC_MATVAL_EMPTY; + break; + default: + assert(false); + } aVal.fVal = 0.0; default: ; @@ -710,7 +719,7 @@ bool ScMatrixImpl::IsEmpty( SCSIZE nC, SCSIZE nR ) const // but not an 'empty path' element. ValidColRowReplicated( nC, nR ); return maMat.get_type(nR, nC) == mdds::mtm::element_empty && - maMatFlag.get<TMatFlag>(nR, nC) != SC_MATFLAG_EMPTYPATH; + maMatFlag.get_numeric(nR, nC) != SC_MATFLAG_EMPTYPATH; } bool ScMatrixImpl::IsEmptyCell( SCSIZE nC, SCSIZE nR ) const @@ -719,7 +728,7 @@ bool ScMatrixImpl::IsEmptyCell( SCSIZE nC, SCSIZE nR ) const // 'empty' or 'empty result' or 'empty path' element. ValidColRowReplicated( nC, nR ); return maMat.get_type(nR, nC) == mdds::mtm::element_empty && - maMatFlag.get<TMatFlag>(nR, nC) == SC_MATFLAG_EMPTYCELL; + maMatFlag.get_type(nR, nC) == mdds::mtm::element_empty; } bool ScMatrixImpl::IsEmptyResult( SCSIZE nC, SCSIZE nR ) const @@ -728,7 +737,7 @@ bool ScMatrixImpl::IsEmptyResult( SCSIZE nC, SCSIZE nR ) const // 'empty' or 'empty cell' or 'empty path' element. ValidColRowReplicated( nC, nR ); return maMat.get_type(nR, nC) == mdds::mtm::element_empty && - maMatFlag.get<TMatFlag>(nR, nC) == SC_MATFLAG_EMPTYRESULT; + maMatFlag.get_numeric(nR, nC) == SC_MATFLAG_EMPTYRESULT; } bool ScMatrixImpl::IsEmptyPath( SCSIZE nC, SCSIZE nR ) const @@ -736,7 +745,7 @@ bool ScMatrixImpl::IsEmptyPath( SCSIZE nC, SCSIZE nR ) const // Flag must indicate an 'empty path' element. if (ValidColRowOrReplicated( nC, nR )) return maMat.get_type(nR, nC) == mdds::mtm::element_empty && - maMatFlag.get<TMatFlag>(nR, nC) == SC_MATFLAG_EMPTYPATH; + maMatFlag.get_numeric(nR, nC) == SC_MATFLAG_EMPTYPATH; else return true; } @@ -853,8 +862,7 @@ void ScMatrixImpl::PutEmptyVector( SCSIZE nCount, SCSIZE nC, SCSIZE nR ) { maMat.set_empty(nR, nC, nCount); // Flag to indicate that this is 'empty', not 'empty result' or 'empty path'. - std::vector<TMatFlag> aVals(nCount, SC_MATFLAG_EMPTYCELL); - maMatFlag.set(nR, nC, aVals.begin(), aVals.end()); + maMatFlag.set_empty(nR, nC, nCount); } else { _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits