sc/inc/externalrefmgr.hxx | 10 +++++++-- sc/source/ui/docshell/externalrefmgr.cxx | 32 +++++++++++++++++++++++++++---- 2 files changed, 36 insertions(+), 6 deletions(-)
New commits: commit 6267a995ea5a621f5f147e5866b6af9cdd205b9c Author: Luboš Luňák <l.lu...@collabora.com> AuthorDate: Wed Feb 16 11:05:38 2022 +0100 Commit: Luboš Luňák <l.lu...@collabora.com> CommitDate: Thu Feb 17 01:13:52 2022 +0100 remove MAXCOL/MAXROW from ScExternalRefCache The range is used just for filtering out, and since this is about references to other documents, I wasn't sure which document to use as the limits, so I did a copy that of the functions that returns all. Change-Id: I9711534004796496558848adef03d38ddb115441 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/129988 Tested-by: Jenkins Reviewed-by: Luboš Luňák <l.lu...@collabora.com> diff --git a/sc/inc/externalrefmgr.hxx b/sc/inc/externalrefmgr.hxx index 1064910ad975..20931043bfd1 100644 --- a/sc/inc/externalrefmgr.hxx +++ b/sc/inc/externalrefmgr.hxx @@ -144,11 +144,13 @@ public: void setReferenced( bool bReferenced ); bool isReferenced() const; /// Obtain a sorted vector of rows. - void getAllRows(::std::vector<SCROW>& rRows, SCROW nLow = 0, SCROW nHigh = MAXROW) const; + void getAllRows(::std::vector<SCROW>& rRows, SCROW nLow, SCROW nHigh) const; + void getAllRows(::std::vector<SCROW>& rRows) const; /// Returns the half-open range of used rows in this table. Returns [0,0) if table is empty. SC_DLLPUBLIC ::std::pair< SCROW, SCROW > getRowRange() const; /// Obtain a sorted vector of columns. - void getAllCols(SCROW nRow, ::std::vector<SCCOL>& rCols, SCCOL nLow = 0, SCCOL nHigh = MAXCOL) const; + void getAllCols(SCROW nRow, ::std::vector<SCCOL>& rCols, SCCOL nLow, SCCOL nHigh) const; + void getAllCols(SCROW nRow, ::std::vector<SCCOL>& rCols) const; /// Returns the half-open range of used columns in the specified row. Returns [0,0) if row is empty. SC_DLLPUBLIC ::std::pair< SCCOL, SCCOL > getColRange( SCROW nRow ) const; void getAllNumberFormats(::std::vector<sal_uInt32>& rNumFmts) const; @@ -168,6 +170,10 @@ public: private: bool isInCachedRanges(SCCOL nCol, SCROW nRow) const; TokenRef getEmptyOrNullToken(SCCOL nCol, SCROW nRow) const; + template< typename P > + void getAllRows(::std::vector<SCROW>& rRows, P predicate) const; + template< typename P > + void getAllCols(SCROW nRow, ::std::vector<SCCOL>& rCols, P predicate) const; private: /** Data cache */ diff --git a/sc/source/ui/docshell/externalrefmgr.cxx b/sc/source/ui/docshell/externalrefmgr.cxx index af4dc4b7d27b..2f2bf13bd2fc 100644 --- a/sc/source/ui/docshell/externalrefmgr.cxx +++ b/sc/source/ui/docshell/externalrefmgr.cxx @@ -330,12 +330,13 @@ bool ScExternalRefCache::Table::hasRow( SCROW nRow ) const return itrRow != maRows.end(); } -void ScExternalRefCache::Table::getAllRows(vector<SCROW>& rRows, SCROW nLow, SCROW nHigh) const +template< typename P > +void ScExternalRefCache::Table::getAllRows(vector<SCROW>& rRows, P predicate) const { vector<SCROW> aRows; aRows.reserve(maRows.size()); for (const auto& rEntry : maRows) - if (nLow <= rEntry.first && rEntry.first <= nHigh) + if (predicate(rEntry)) aRows.push_back(rEntry.first); // hash map is not ordered, so we need to explicitly sort it. @@ -343,6 +344,17 @@ void ScExternalRefCache::Table::getAllRows(vector<SCROW>& rRows, SCROW nLow, SCR rRows.swap(aRows); } +void ScExternalRefCache::Table::getAllRows(vector<SCROW>& rRows, SCROW nLow, SCROW nHigh) const +{ + getAllRows(rRows, + [nLow, nHigh](std::pair<SCROW, RowDataType> rEntry) { return (nLow <= rEntry.first && rEntry.first <= nHigh); }); +} + +void ScExternalRefCache::Table::getAllRows(vector<SCROW>& rRows) const +{ + getAllRows(rRows, [](std::pair<SCROW, RowDataType>) { return true; } ); +} + ::std::pair< SCROW, SCROW > ScExternalRefCache::Table::getRowRange() const { ::std::pair< SCROW, SCROW > aRange( 0, 0 ); @@ -357,7 +369,8 @@ void ScExternalRefCache::Table::getAllRows(vector<SCROW>& rRows, SCROW nLow, SCR return aRange; } -void ScExternalRefCache::Table::getAllCols(SCROW nRow, vector<SCCOL>& rCols, SCCOL nLow, SCCOL nHigh) const +template< typename P > +void ScExternalRefCache::Table::getAllCols(SCROW nRow, vector<SCCOL>& rCols, P predicate) const { RowsDataType::const_iterator itrRow = maRows.find(nRow); if (itrRow == maRows.end()) @@ -368,7 +381,7 @@ void ScExternalRefCache::Table::getAllCols(SCROW nRow, vector<SCCOL>& rCols, SCC vector<SCCOL> aCols; aCols.reserve(rRowData.size()); for (const auto& rCol : rRowData) - if (nLow <= rCol.first && rCol.first <= nHigh) + if (predicate(rCol)) aCols.push_back(rCol.first); // hash map is not ordered, so we need to explicitly sort it. @@ -376,6 +389,17 @@ void ScExternalRefCache::Table::getAllCols(SCROW nRow, vector<SCCOL>& rCols, SCC rCols.swap(aCols); } +void ScExternalRefCache::Table::getAllCols(SCROW nRow, vector<SCCOL>& rCols, SCCOL nLow, SCCOL nHigh) const +{ + getAllCols(nRow, rCols, + [nLow, nHigh](std::pair<SCCOL, Cell> rCol) { return nLow <= rCol.first && rCol.first <= nHigh; } ); +} + +void ScExternalRefCache::Table::getAllCols(SCROW nRow, vector<SCCOL>& rCols) const +{ + getAllCols(nRow, rCols, [](std::pair<SCCOL, Cell>) { return true; } ); +} + ::std::pair< SCCOL, SCCOL > ScExternalRefCache::Table::getColRange( SCROW nRow ) const { ::std::pair< SCCOL, SCCOL > aRange( 0, 0 );