Kaydet (Commit) 43195711 authored tarafından Tobias Lippert's avatar Tobias Lippert Kaydeden (comit) Noel Grandin

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/17437Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarNoel Grandin <noelgrandin@gmail.com>
üst 8eca4da7
...@@ -28,10 +28,10 @@ ...@@ -28,10 +28,10 @@
#include "externalrefmgr.hxx" #include "externalrefmgr.hxx"
#include <vector> #include <vector>
#include <list>
#include <boost/scoped_ptr.hpp> #include <boost/scoped_ptr.hpp>
#include <boost/ptr_container/ptr_map.hpp> #include <boost/ptr_container/ptr_map.hpp>
#include <unordered_map>
#include <unordered_set> #include <unordered_set>
class ScDocument; class ScDocument;
...@@ -128,13 +128,6 @@ public: ...@@ -128,13 +128,6 @@ public:
class ScChartListenerCollection class ScChartListenerCollection
{ {
public: public:
struct RangeListenerItem
{
ScRange maRange;
ScChartHiddenRangeListener* mpListener;
explicit RangeListenerItem(const ScRange& rRange, ScChartHiddenRangeListener* p);
};
typedef boost::ptr_map<OUString, ScChartListener> ListenersType; typedef boost::ptr_map<OUString, ScChartListener> ListenersType;
typedef std::unordered_set<OUString, OUStringHash> StringSetType; typedef std::unordered_set<OUString, OUStringHash> StringSetType;
private: private:
...@@ -145,7 +138,9 @@ private: ...@@ -145,7 +138,9 @@ private:
SC_CLCUPDATE_RUNNING, SC_CLCUPDATE_RUNNING,
SC_CLCUPDATE_MODIFIED SC_CLCUPDATE_MODIFIED
} meModifiedDuringUpdate; } meModifiedDuringUpdate;
::std::list<RangeListenerItem> maHiddenListeners;
std::unordered_multimap<ScChartHiddenRangeListener*, ScRange> maHiddenListeners;
StringSetType maNonOleObjectNames; StringSetType maNonOleObjectNames;
Idle aIdle; Idle aIdle;
......
...@@ -28,7 +28,6 @@ ...@@ -28,7 +28,6 @@
using namespace com::sun::star; using namespace com::sun::star;
using ::std::vector; using ::std::vector;
using ::std::list;
using ::std::unary_function; using ::std::unary_function;
using ::std::for_each; using ::std::for_each;
...@@ -403,12 +402,6 @@ ScChartHiddenRangeListener::~ScChartHiddenRangeListener() ...@@ -403,12 +402,6 @@ ScChartHiddenRangeListener::~ScChartHiddenRangeListener()
// empty d'tor // empty d'tor
} }
// ScChartListenerCollection
ScChartListenerCollection::RangeListenerItem::RangeListenerItem(const ScRange& rRange, ScChartHiddenRangeListener* p) :
maRange(rRange), mpListener(p)
{
}
ScChartListenerCollection::ScChartListenerCollection( ScDocument* pDocP ) : ScChartListenerCollection::ScChartListenerCollection( ScDocument* pDocP ) :
meModifiedDuringUpdate( SC_CLCUPDATE_NONE ), meModifiedDuringUpdate( SC_CLCUPDATE_NONE ),
pDoc( pDocP ) pDoc( pDocP )
...@@ -687,11 +680,12 @@ void ScChartListenerCollection::SetRangeDirty( const ScRange& rRange ) ...@@ -687,11 +680,12 @@ void ScChartListenerCollection::SetRangeDirty( const ScRange& rRange )
StartTimer(); StartTimer();
// New hidden range listener implementation // New hidden range listener implementation
for (list<RangeListenerItem>::iterator itr = maHiddenListeners.begin(), itrEnd = maHiddenListeners.end(); for (auto itr = maHiddenListeners.begin(); itr != maHiddenListeners.end(); ++itr)
itr != itrEnd; ++itr)
{ {
if (itr->maRange.Intersects(rRange)) if (itr->second.Intersects(rRange))
itr->mpListener->notify(); {
itr->first->notify();
}
} }
} }
...@@ -734,33 +728,13 @@ bool ScChartListenerCollection::operator!=( const ScChartListenerCollection& r ) ...@@ -734,33 +728,13 @@ bool ScChartListenerCollection::operator!=( const ScChartListenerCollection& r )
void ScChartListenerCollection::StartListeningHiddenRange( const ScRange& rRange, ScChartHiddenRangeListener* pListener ) void ScChartListenerCollection::StartListeningHiddenRange( const ScRange& rRange, ScChartHiddenRangeListener* pListener )
{ {
RangeListenerItem aItem(rRange, pListener); maHiddenListeners.insert(std::make_pair<>(pListener, rRange));
maHiddenListeners.push_back(aItem);
} }
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 ) 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: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment