summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Lippert <drtl@fastmail.fm>2015-08-02 14:51:23 +0200
committerNoel Grandin <noelgrandin@gmail.com>2015-08-04 06:43:02 +0000
commit431957118d7bbf96bf78e142df9decbcaff6475b (patch)
treec49163a8c1f041a4381d0ee034622bceaf9fefbd
parent8eca4da70506e1e6c2e4b600262cced93aba8c96 (diff)
fdo#68016 Speed up ScChartListenerCollection::EndListeningHiddenRange
The listeners were stored in a std::list which is not efficient for the lookup required in EndListeningHiddenRange() The list was replaced by an std::unodered_map which allows faster look-up. Change-Id: Iec7a33b18aa91e7d2917dc8feb98bf9b20ce804e Reviewed-on: https://gerrit.libreoffice.org/17437 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Noel Grandin <noelgrandin@gmail.com>
-rw-r--r--sc/inc/chartlis.hxx13
-rw-r--r--sc/source/core/tool/chartlis.cxx42
2 files changed, 12 insertions, 43 deletions
diff --git a/sc/inc/chartlis.hxx b/sc/inc/chartlis.hxx
index 98d3850ffd2e..0f74e869852c 100644
--- a/sc/inc/chartlis.hxx
+++ b/sc/inc/chartlis.hxx
@@ -28,10 +28,10 @@
#include "externalrefmgr.hxx"
#include <vector>
-#include <list>
#include <boost/scoped_ptr.hpp>
#include <boost/ptr_container/ptr_map.hpp>
+#include <unordered_map>
#include <unordered_set>
class ScDocument;
@@ -128,13 +128,6 @@ public:
class ScChartListenerCollection
{
public:
- struct RangeListenerItem
- {
- ScRange maRange;
- ScChartHiddenRangeListener* mpListener;
- explicit RangeListenerItem(const ScRange& rRange, ScChartHiddenRangeListener* p);
- };
-
typedef boost::ptr_map<OUString, ScChartListener> ListenersType;
typedef std::unordered_set<OUString, OUStringHash> StringSetType;
private:
@@ -145,7 +138,9 @@ private:
SC_CLCUPDATE_RUNNING,
SC_CLCUPDATE_MODIFIED
} meModifiedDuringUpdate;
- ::std::list<RangeListenerItem> maHiddenListeners;
+
+ std::unordered_multimap<ScChartHiddenRangeListener*, ScRange> maHiddenListeners;
+
StringSetType maNonOleObjectNames;
Idle aIdle;
diff --git a/sc/source/core/tool/chartlis.cxx b/sc/source/core/tool/chartlis.cxx
index dc03b248b508..a7ddf3a58e72 100644
--- a/sc/source/core/tool/chartlis.cxx
+++ b/sc/source/core/tool/chartlis.cxx
@@ -28,7 +28,6 @@
using namespace com::sun::star;
using ::std::vector;
-using ::std::list;
using ::std::unary_function;
using ::std::for_each;
@@ -403,12 +402,6 @@ ScChartHiddenRangeListener::~ScChartHiddenRangeListener()
// empty d'tor
}
-// ScChartListenerCollection
-ScChartListenerCollection::RangeListenerItem::RangeListenerItem(const ScRange& rRange, ScChartHiddenRangeListener* p) :
- maRange(rRange), mpListener(p)
-{
-}
-
ScChartListenerCollection::ScChartListenerCollection( ScDocument* pDocP ) :
meModifiedDuringUpdate( SC_CLCUPDATE_NONE ),
pDoc( pDocP )
@@ -687,11 +680,12 @@ void ScChartListenerCollection::SetRangeDirty( const ScRange& rRange )
StartTimer();
// New hidden range listener implementation
- for (list<RangeListenerItem>::iterator itr = maHiddenListeners.begin(), itrEnd = maHiddenListeners.end();
- itr != itrEnd; ++itr)
+ for (auto itr = maHiddenListeners.begin(); itr != maHiddenListeners.end(); ++itr)
{
- if (itr->maRange.Intersects(rRange))
- itr->mpListener->notify();
+ if (itr->second.Intersects(rRange))
+ {
+ itr->first->notify();
+ }
}
}
@@ -734,33 +728,13 @@ bool ScChartListenerCollection::operator!=( const ScChartListenerCollection& r )
void ScChartListenerCollection::StartListeningHiddenRange( const ScRange& rRange, ScChartHiddenRangeListener* pListener )
{
- RangeListenerItem aItem(rRange, pListener);
- maHiddenListeners.push_back(aItem);
+ maHiddenListeners.insert(std::make_pair<>(pListener, rRange));
}
-namespace {
-
-struct MatchListener : public ::std::unary_function<
- ScChartListenerCollection::RangeListenerItem, bool>
-{
- MatchListener(const ScChartHiddenRangeListener* pMatch) :
- mpMatch(pMatch)
- {
- }
-
- bool operator() (const ScChartListenerCollection::RangeListenerItem& rItem) const
- {
- return mpMatch == rItem.mpListener;
- }
-
-private:
- const ScChartHiddenRangeListener* mpMatch;
-};
-
-}
void ScChartListenerCollection::EndListeningHiddenRange( ScChartHiddenRangeListener* pListener )
{
- maHiddenListeners.remove_if(MatchListener(pListener));
+ auto range = maHiddenListeners.equal_range(pListener);
+ maHiddenListeners.erase(range.first, range.second);
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */