[Libreoffice-commits] core.git: sc/inc sc/source

Tobias Lippert drtl at fastmail.fm
Mon Aug 3 23:43:23 PDT 2015


 sc/inc/chartlis.hxx              |   13 +++---------
 sc/source/core/tool/chartlis.cxx |   42 +++++++--------------------------------
 2 files changed, 12 insertions(+), 43 deletions(-)

New commits:
commit 431957118d7bbf96bf78e142df9decbcaff6475b
Author: Tobias Lippert <drtl at fastmail.fm>
Date:   Sun Aug 2 14:51:23 2015 +0200

    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 at libreoffice.org>
    Reviewed-by: Noel Grandin <noelgrandin at gmail.com>

diff --git a/sc/inc/chartlis.hxx b/sc/inc/chartlis.hxx
index 98d3850..0f74e86 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 dc03b24..a7ddf3a 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: */


More information about the Libreoffice-commits mailing list