sc/source/core/data/column3.cxx | 2 ++ sc/source/core/data/columnspanset.cxx | 21 ++++++++++++++------- 2 files changed, 16 insertions(+), 7 deletions(-)
New commits: commit be99b23809687ca1143c8fe8d4ec3cfe6703c363 Author: Luboš Luňák <[email protected]> AuthorDate: Sat Mar 5 15:25:19 2022 +0100 Commit: Luboš Luňák <[email protected]> CommitDate: Sat Mar 5 17:25:00 2022 +0100 don't bother scanning nonexistent data (tdf#141182) There's no point scanning for non-empty cells after the last data cell, and this avoids processing mdds structures (such as repeated creating of flat_segment_tree). Change-Id: Ibec324aa2de457e8439c38a561f55ced9f478899 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/131059 Tested-by: Jenkins Reviewed-by: Luboš Luňák <[email protected]> diff --git a/sc/source/core/data/column3.cxx b/sc/source/core/data/column3.cxx index 618e56e46626..31903287cd48 100644 --- a/sc/source/core/data/column3.cxx +++ b/sc/source/core/data/column3.cxx @@ -92,6 +92,8 @@ void ScColumn::BroadcastCells( const std::vector<SCROW>& rRows, SfxHintId nHint void ScColumn::BroadcastRows( SCROW nStartRow, SCROW nEndRow, SfxHintId nHint ) { + if( nStartRow > GetLastDataPos()) + return; sc::SingleColumnSpanSet aSpanSet(GetDoc().GetSheetLimits()); aSpanSet.scan(*this, nStartRow, nEndRow); std::vector<SCROW> aRows; diff --git a/sc/source/core/data/columnspanset.cxx b/sc/source/core/data/columnspanset.cxx index 7a4d90f65652..eb09ea26be98 100644 --- a/sc/source/core/data/columnspanset.cxx +++ b/sc/source/core/data/columnspanset.cxx @@ -25,12 +25,12 @@ namespace sc { namespace { -class ColumnScanner +class ColumnNonEmptyRangesScanner { ColumnSpanSet::ColumnSpansType& mrRanges; bool mbVal; public: - ColumnScanner(ColumnSpanSet::ColumnSpansType& rRanges, bool bVal) : + ColumnNonEmptyRangesScanner(ColumnSpanSet::ColumnSpansType& rRanges, bool bVal) : mrRanges(rRanges), mbVal(bVal) {} void operator() (const sc::CellStoreType::value_type& node, size_t nOffset, size_t nDataSize) @@ -137,7 +137,10 @@ void ColumnSpanSet::scan( const CellStoreType& rSrcCells = pTab->aCol[nCol].maCells; - ColumnScanner aScanner(rCol.maSpans, bVal); + if( nRow1 > pTab->aCol[nCol].GetLastDataPos()) + continue; + + ColumnNonEmptyRangesScanner aScanner(rCol.maSpans, bVal); ParseBlock(rSrcCells.begin(), rSrcCells, aScanner, nRow1, nRow2); } } @@ -219,11 +222,11 @@ void ColumnSpanSet::executeColumnAction(ScDocument& rDoc, ColumnAction& ac) cons namespace { -class Scanner +class NonEmptyRangesScanner { SingleColumnSpanSet::ColumnSpansType& mrRanges; public: - explicit Scanner(SingleColumnSpanSet::ColumnSpansType& rRanges) : mrRanges(rRanges) {} + explicit NonEmptyRangesScanner(SingleColumnSpanSet::ColumnSpansType& rRanges) : mrRanges(rRanges) {} void operator() (const sc::CellStoreType::value_type& node, size_t nOffset, size_t nDataSize) { @@ -258,16 +261,20 @@ void SingleColumnSpanSet::scan(const ScColumn& rColumn) void SingleColumnSpanSet::scan(const ScColumn& rColumn, SCROW nStart, SCROW nEnd) { + if( nStart > rColumn.GetLastDataPos()) + return; const CellStoreType& rCells = rColumn.maCells; - Scanner aScanner(maSpans); + NonEmptyRangesScanner aScanner(maSpans); sc::ParseBlock(rCells.begin(), rCells, aScanner, nStart, nEnd); } void SingleColumnSpanSet::scan( ColumnBlockConstPosition& rBlockPos, const ScColumn& rColumn, SCROW nStart, SCROW nEnd) { + if( nStart > rColumn.GetLastDataPos()) + return; const CellStoreType& rCells = rColumn.maCells; - Scanner aScanner(maSpans); + NonEmptyRangesScanner aScanner(maSpans); rBlockPos.miCellPos = sc::ParseBlock(rBlockPos.miCellPos, rCells, aScanner, nStart, nEnd); }
