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 @@
#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;
......
......@@ -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: */
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