diff options
author | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2016-03-20 22:27:42 +0100 |
---|---|---|
committer | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2016-03-22 12:29:29 +0000 |
commit | 056be3551279a2e0e4d766e898e93ab500401da6 (patch) | |
tree | 2068ac3670869f6156fa405753e385fa46447312 | |
parent | af06ced81c640ebbcac037cd610bc99694fb7c13 (diff) |
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 <ci@libreoffice.org>
Reviewed-by: Markus Mohrhard <markus.mohrhard@googlemail.com>
-rw-r--r-- | sc/source/core/tool/scmatrix.cxx | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/sc/source/core/tool/scmatrix.cxx b/sc/source/core/tool/scmatrix.cxx index 0f237e1686d1..1feb7d4fe484 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 { |