sc/source/core/data/document.cxx | 45 +++++++++++++-------------------------- 1 file changed, 16 insertions(+), 29 deletions(-)
New commits: commit 80404237d604597b1b48720d0598e4db06d2df09 Author: Noel Grandin <noel.gran...@collabora.co.uk> AuthorDate: Tue Mar 26 15:16:07 2024 +0200 Commit: Caolán McNamara <caolan.mcnam...@collabora.com> CommitDate: Tue Mar 26 20:56:16 2024 +0100 cool#8570 speed up ScDocument::GetColDefault we can used an unordered_map here, we are sorting by pointer value. Also reduce the number of erase/insert Change-Id: Idb68f76e04248a0c808399bf9881afb5a8e01451 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165346 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> (cherry picked from commit 1fe764a4caa87de9136da77227b53bc87f4d9489) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165319 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Tested-by: Caolán McNamara <caolan.mcnam...@collabora.com> Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com> diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx index 04b2151f4261..fe3858baae14 100644 --- a/sc/source/core/data/document.cxx +++ b/sc/source/core/data/document.cxx @@ -95,6 +95,7 @@ #include <limits> #include <memory> #include <utility> +#include <unordered_map> #include <comphelper/lok.hxx> #include <comphelper/servicehelper.hxx> @@ -150,23 +151,13 @@ void collectUIInformation(std::map<OUString, OUString>&& aParameters, const OUSt struct ScDefaultAttr { - const ScPatternAttr* pAttr; - SCROW nFirst; - SCSIZE nCount; - explicit ScDefaultAttr(const ScPatternAttr* pPatAttr) : pAttr(pPatAttr), nFirst(0), nCount(0) {} -}; - -struct ScLessDefaultAttr -{ - bool operator() (const ScDefaultAttr& rValue1, const ScDefaultAttr& rValue2) const - { - return rValue1.pAttr < rValue2.pAttr; - } + SCROW nFirst { 0 }; + SCSIZE nCount { 0 }; }; } -typedef std::set<ScDefaultAttr, ScLessDefaultAttr> ScDefaultAttrSet; +typedef std::unordered_map<const ScPatternAttr*, ScDefaultAttr> ScDefaultAttrMap; void ScDocument::MakeTable( SCTAB nTab,bool _bNeedsNameCheck ) { @@ -4676,40 +4667,36 @@ void ScDocument::GetColDefault( SCTAB nTab, SCCOL nCol, SCROW nLastRow, SCROW& n if (nEndRow >= nLastRow) return; - ScDefaultAttrSet aSet; - ScDefaultAttrSet::iterator aItr = aSet.end(); + ScDefaultAttrMap aMap; while (pAttr) { - ScDefaultAttr aAttr(pAttr); - aItr = aSet.find(aAttr); - if (aItr == aSet.end()) + auto aItr = aMap.find(pAttr); + if (aItr == aMap.end()) { + ScDefaultAttr aAttr; aAttr.nCount = static_cast<SCSIZE>(nEndRow - nStartRow + 1); aAttr.nFirst = nStartRow; - aSet.insert(aAttr); + aMap.insert({ pAttr, aAttr}); } else { - aAttr.nCount = aItr->nCount + static_cast<SCSIZE>(nEndRow - nStartRow + 1); - aAttr.nFirst = aItr->nFirst; - aSet.erase(aItr); - aSet.insert(aAttr); + aItr->second.nCount += static_cast<SCSIZE>(nEndRow - nStartRow + 1); } pAttr = aDocAttrItr.GetNext(nColumn, nStartRow, nEndRow); } - ScDefaultAttrSet::iterator aDefaultItr = aSet.begin(); - aItr = aDefaultItr; + auto aDefaultItr = aMap.begin(); + auto aItr = aDefaultItr; ++aItr; - while (aItr != aSet.end()) + while (aItr != aMap.end()) { // for entries with equal count, use the one with the lowest start row, // don't use the random order of pointer comparisons - if ( aItr->nCount > aDefaultItr->nCount || - ( aItr->nCount == aDefaultItr->nCount && aItr->nFirst < aDefaultItr->nFirst ) ) + if ( aItr->second.nCount > aDefaultItr->second.nCount || + ( aItr->second.nCount == aDefaultItr->second.nCount && aItr->second.nFirst < aDefaultItr->second.nFirst ) ) aDefaultItr = aItr; ++aItr; } - nDefault = aDefaultItr->nFirst; + nDefault = aDefaultItr->second.nFirst; } void ScDocument::StripHidden( SCCOL& rX1, SCROW& rY1, SCCOL& rX2, SCROW& rY2, SCTAB nTab )