sc/inc/columnspanset.hxx | 56 ++++++++++++++++++++++++------ sc/source/core/data/columnspanset.cxx | 45 ------------------------ sc/source/core/data/document.cxx | 6 +-- sc/source/core/data/table3.cxx | 12 +++--- sc/source/core/tool/grouparealistener.cxx | 6 +-- sc/source/core/tool/interpr6.cxx | 12 +++--- sc/source/ui/docshell/externalrefmgr.cxx | 6 +-- sc/source/ui/undo/undobase.cxx | 6 +-- 8 files changed, 70 insertions(+), 79 deletions(-)
New commits: commit 4af1f150cd39f325bb2e86337e6389c36084a6ba Author: Tor Lillqvist <t...@collabora.com> Date: Fri Oct 2 17:04:54 2015 +0300 Replace derivation from ColumnAction with template Will see if it gives a performance improvement. Change-Id: Ib45c2879cf3e974e05c83e2323be57557da58ffd diff --git a/sc/inc/columnspanset.hxx b/sc/inc/columnspanset.hxx index 797b425..7e5123c 100644 --- a/sc/inc/columnspanset.hxx +++ b/sc/inc/columnspanset.hxx @@ -11,12 +11,13 @@ #define INCLUDED_SC_INC_COLUMNSPANSET_HXX #include "address.hxx" +#include "document.hxx" +#include "table.hxx" #include <vector> #include <mdds/flat_segment_tree.hpp> #include <boost/noncopyable.hpp> -class ScDocument; class ScColumn; class ScMarkData; class ScRange; @@ -78,14 +79,6 @@ public: virtual void execute(const ScAddress& rPos, SCROW nLength, bool bVal) = 0; }; - class ColumnAction - { - public: - virtual ~ColumnAction() = 0; - virtual void startColumn(ScColumn* pCol) = 0; - virtual void execute(SCROW nRow1, SCROW nRow2, bool bVal) = 0; - }; - ColumnSpanSet(bool bInit); ~ColumnSpanSet(); @@ -102,7 +95,50 @@ public: void scan(const ScDocument& rDoc, SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, bool bVal); void executeAction(Action& ac) const; - void executeColumnAction(ScDocument& rDoc, ColumnAction& ac) const; + + template<typename ColumnAction> + void executeColumnAction(ScDocument& rDoc, ColumnAction& ac) const + { + for (size_t nTab = 0; nTab < maDoc.size(); ++nTab) + { + if (!maDoc[nTab]) + continue; + + const TableType& rTab = *maDoc[nTab]; + for (size_t nCol = 0; nCol < rTab.size(); ++nCol) + { + if (!rTab[nCol]) + continue; + + ScTable* pTab = rDoc.FetchTable(nTab); + if (!pTab) + continue; + + if (!ValidCol(nCol)) + { + // End the loop. + nCol = rTab.size(); + continue; + } + + ScColumn& rColumn = pTab->aCol[nCol]; + ac.startColumn(&rColumn); + ColumnType& rCol = *rTab[nCol]; + ColumnSpansType::const_iterator it = rCol.maSpans.begin(), itEnd = rCol.maSpans.end(); + SCROW nRow1, nRow2; + nRow1 = it->first; + bool bVal = it->second; + for (++it; it != itEnd; ++it) + { + nRow2 = it->first-1; + ac.execute(nRow1, nRow2, bVal); + + nRow1 = nRow2+1; // for the next iteration. + bVal = it->second; + } + } + } + } void swap( ColumnSpanSet& r ); }; diff --git a/sc/source/core/data/columnspanset.cxx b/sc/source/core/data/columnspanset.cxx index 25f6b5b..a444c54 100644 --- a/sc/source/core/data/columnspanset.cxx +++ b/sc/source/core/data/columnspanset.cxx @@ -54,8 +54,6 @@ ColumnSpanSet::ColumnType::ColumnType(SCROW nStart, SCROW nEnd, bool bInit) : ColumnSpanSet::Action::~Action() {} void ColumnSpanSet::Action::startColumn(SCTAB /*nTab*/, SCCOL /*nCol*/) {} -ColumnSpanSet::ColumnAction::~ColumnAction() {} - ColumnSpanSet::ColumnSpanSet(bool bInit) : mbInit(bInit) {} ColumnSpanSet::~ColumnSpanSet() @@ -184,49 +182,6 @@ void ColumnSpanSet::executeAction(Action& ac) const } } -void ColumnSpanSet::executeColumnAction(ScDocument& rDoc, ColumnAction& ac) const -{ - for (size_t nTab = 0; nTab < maDoc.size(); ++nTab) - { - if (!maDoc[nTab]) - continue; - - const TableType& rTab = *maDoc[nTab]; - for (size_t nCol = 0; nCol < rTab.size(); ++nCol) - { - if (!rTab[nCol]) - continue; - - ScTable* pTab = rDoc.FetchTable(nTab); - if (!pTab) - continue; - - if (!ValidCol(nCol)) - { - // End the loop. - nCol = rTab.size(); - continue; - } - - ScColumn& rColumn = pTab->aCol[nCol]; - ac.startColumn(&rColumn); - ColumnType& rCol = *rTab[nCol]; - ColumnSpansType::const_iterator it = rCol.maSpans.begin(), itEnd = rCol.maSpans.end(); - SCROW nRow1, nRow2; - nRow1 = it->first; - bool bVal = it->second; - for (++it; it != itEnd; ++it) - { - nRow2 = it->first-1; - ac.execute(nRow1, nRow2, bVal); - - nRow1 = nRow2+1; // for the next iteration. - bVal = it->second; - } - } - } -} - void ColumnSpanSet::swap( ColumnSpanSet& r ) { maDoc.swap(r.maDoc); diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx index 153b77f..ddb8f3d 100644 --- a/sc/source/core/data/document.cxx +++ b/sc/source/core/data/document.cxx @@ -2644,7 +2644,7 @@ void ScDocument::CopyNonFilteredFromClip( namespace { -class BroadcastAction : public sc::ColumnSpanSet::ColumnAction +class BroadcastAction { ScDocument& mrDoc; ScColumn* mpCol; @@ -2652,12 +2652,12 @@ class BroadcastAction : public sc::ColumnSpanSet::ColumnAction public: BroadcastAction( ScDocument& rDoc ) : mrDoc(rDoc), mpCol(NULL) {} - virtual void startColumn( ScColumn* pCol ) SAL_OVERRIDE + void startColumn( ScColumn* pCol ) { mpCol = pCol; } - virtual void execute( SCROW nRow1, SCROW nRow2, bool bVal ) SAL_OVERRIDE + void execute( SCROW nRow1, SCROW nRow2, bool bVal ) { if (!bVal) return; diff --git a/sc/source/core/data/table3.cxx b/sc/source/core/data/table3.cxx index 1c5a551..99c01fe 100644 --- a/sc/source/core/data/table3.cxx +++ b/sc/source/core/data/table3.cxx @@ -844,7 +844,7 @@ void expandRowRange( ScRange& rRange, SCROW nTop, SCROW nBottom ) rRange.aEnd.SetRow(nBottom); } -class FormulaCellCollectAction : public sc::ColumnSpanSet::ColumnAction +class FormulaCellCollectAction { std::vector<ScFormulaCell*>& mrCells; ScColumn* mpCol; @@ -853,12 +853,12 @@ public: FormulaCellCollectAction( std::vector<ScFormulaCell*>& rCells ) : mrCells(rCells), mpCol(NULL) {} - virtual void startColumn( ScColumn* pCol ) SAL_OVERRIDE + void startColumn( ScColumn* pCol ) { mpCol = pCol; } - virtual void execute( SCROW nRow1, SCROW nRow2, bool bVal ) SAL_OVERRIDE + void execute( SCROW nRow1, SCROW nRow2, bool bVal ) { assert(mpCol); @@ -869,7 +869,7 @@ public: } }; -class ListenerStartAction : public sc::ColumnSpanSet::ColumnAction +class ListenerStartAction { ScColumn* mpCol; @@ -884,12 +884,12 @@ public: maStartCxt(rDoc, mpPosSet), maEndCxt(rDoc, mpPosSet) {} - virtual void startColumn( ScColumn* pCol ) SAL_OVERRIDE + void startColumn( ScColumn* pCol ) { mpCol = pCol; } - virtual void execute( SCROW nRow1, SCROW nRow2, bool bVal ) SAL_OVERRIDE + void execute( SCROW nRow1, SCROW nRow2, bool bVal ) { assert(mpCol); diff --git a/sc/source/core/tool/grouparealistener.cxx b/sc/source/core/tool/grouparealistener.cxx index ac9ea7f..50f64806 100644 --- a/sc/source/core/tool/grouparealistener.cxx +++ b/sc/source/core/tool/grouparealistener.cxx @@ -34,7 +34,7 @@ public: } }; -class CollectCellAction : public sc::ColumnSpanSet::ColumnAction +class CollectCellAction { const FormulaGroupAreaListener& mrAreaListener; ScAddress maPos; @@ -44,13 +44,13 @@ public: CollectCellAction( const FormulaGroupAreaListener& rAreaListener ) : mrAreaListener(rAreaListener) {} - virtual void startColumn( ScColumn* pCol ) SAL_OVERRIDE + void startColumn( ScColumn* pCol ) { maPos.SetTab(pCol->GetTab()); maPos.SetCol(pCol->GetCol()); } - virtual void execute( SCROW nRow1, SCROW nRow2, bool bVal ) SAL_OVERRIDE + void execute( SCROW nRow1, SCROW nRow2, bool bVal ) { if (!bVal) return; diff --git a/sc/source/core/tool/interpr6.cxx b/sc/source/core/tool/interpr6.cxx index b3daedd..250f71d 100644 --- a/sc/source/core/tool/interpr6.cxx +++ b/sc/source/core/tool/interpr6.cxx @@ -278,7 +278,7 @@ public: size_t getCount() const { return mnCount; } }; -class FuncCount : public sc::ColumnSpanSet::ColumnAction +class FuncCount { sc::ColumnBlockConstPosition maPos; ScColumn* mpCol; @@ -288,13 +288,13 @@ class FuncCount : public sc::ColumnSpanSet::ColumnAction public: FuncCount() : mpCol(0), mnCount(0), mnNumFmt(0) {} - virtual void startColumn(ScColumn* pCol) SAL_OVERRIDE + void startColumn(ScColumn* pCol) { mpCol = pCol; mpCol->InitBlockPosition(maPos); } - virtual void execute(SCROW nRow1, SCROW nRow2, bool bVal) SAL_OVERRIDE + void execute(SCROW nRow1, SCROW nRow2, bool bVal) { if (!bVal) return; @@ -309,7 +309,7 @@ public: sal_uInt32 getNumberFormat() const { return mnNumFmt; } }; -class FuncSum : public sc::ColumnSpanSet::ColumnAction +class FuncSum { sc::ColumnBlockConstPosition maPos; ScColumn* mpCol; @@ -320,13 +320,13 @@ class FuncSum : public sc::ColumnSpanSet::ColumnAction public: FuncSum() : mpCol(0), mfSum(0.0), mnError(0), mnNumFmt(0) {} - virtual void startColumn(ScColumn* pCol) SAL_OVERRIDE + void startColumn(ScColumn* pCol) { mpCol = pCol; mpCol->InitBlockPosition(maPos); } - virtual void execute(SCROW nRow1, SCROW nRow2, bool bVal) SAL_OVERRIDE + void execute(SCROW nRow1, SCROW nRow2, bool bVal) { if (!bVal) return; diff --git a/sc/source/ui/docshell/externalrefmgr.cxx b/sc/source/ui/docshell/externalrefmgr.cxx index 36a3882..fdd911f 100644 --- a/sc/source/ui/docshell/externalrefmgr.cxx +++ b/sc/source/ui/docshell/externalrefmgr.cxx @@ -2669,7 +2669,7 @@ void ScExternalRefManager::clearCache(sal_uInt16 nFileId) namespace { -class RefCacheFiller : public sc::ColumnSpanSet::ColumnAction +class RefCacheFiller { svl::SharedStringPool& mrStrPool; @@ -2683,7 +2683,7 @@ public: RefCacheFiller( svl::SharedStringPool& rStrPool, ScExternalRefCache& rRefCache, sal_uInt16 nFileId ) : mrStrPool(rStrPool), mrRefCache(rRefCache), mnFileId(nFileId), mpCurCol(NULL) {} - virtual void startColumn( ScColumn* pCol ) SAL_OVERRIDE + void startColumn( ScColumn* pCol ) { mpCurCol = pCol; if (!mpCurCol) @@ -2693,7 +2693,7 @@ public: mpRefTab = mrRefCache.getCacheTable(mnFileId, mpCurCol->GetTab()); } - virtual void execute( SCROW nRow1, SCROW nRow2, bool bVal ) SAL_OVERRIDE + void execute( SCROW nRow1, SCROW nRow2, bool bVal ) { if (!mpCurCol || !bVal) return; diff --git a/sc/source/ui/undo/undobase.cxx b/sc/source/ui/undo/undobase.cxx index a383eed..0af2b33 100644 --- a/sc/source/ui/undo/undobase.cxx +++ b/sc/source/ui/undo/undobase.cxx @@ -152,7 +152,7 @@ void ScSimpleUndo::BroadcastChanges( const ScRange& rRange ) namespace { -class SpanBroadcaster : public sc::ColumnSpanSet::ColumnAction +class SpanBroadcaster { ScDocument& mrDoc; SCTAB mnCurTab; @@ -161,13 +161,13 @@ class SpanBroadcaster : public sc::ColumnSpanSet::ColumnAction public: SpanBroadcaster( ScDocument& rDoc ) : mrDoc(rDoc), mnCurTab(-1), mnCurCol(-1) {} - virtual void startColumn( ScColumn* pCol ) SAL_OVERRIDE + void startColumn( ScColumn* pCol ) { mnCurTab = pCol->GetTab(); mnCurCol = pCol->GetCol(); } - virtual void execute( SCROW nRow1, SCROW nRow2, bool bVal ) SAL_OVERRIDE + void execute( SCROW nRow1, SCROW nRow2, bool bVal ) { if (!bVal) return; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits