diff options
author | Tobias Lippert <drtl@fastmail.fm> | 2015-08-02 14:51:23 +0200 |
---|---|---|
committer | Noel Grandin <noelgrandin@gmail.com> | 2015-08-04 06:43:02 +0000 |
commit | 431957118d7bbf96bf78e142df9decbcaff6475b (patch) | |
tree | c49163a8c1f041a4381d0ee034622bceaf9fefbd | |
parent | 8eca4da70506e1e6c2e4b600262cced93aba8c96 (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.hxx | 13 | ||||
-rw-r--r-- | sc/source/core/tool/chartlis.cxx | 42 |
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: */ |