Kaydet (Commit) ae79b40f authored tarafından Kohei Yoshida's avatar Kohei Yoshida

Optimize SvtBroadcaster for insertion.

This helps file load performance at the slight overhead during editing.
That said, the overhead during editing is only in theory (not measured) and
shouldn't be that much even in theory.

Change-Id: If22ea34acb0cda311575ac3ed8ce1a8eb69ae33a
üst f076c62d
......@@ -21,7 +21,7 @@
#include <svl/svldllapi.h>
#include <boost/unordered_set.hpp>
#include <vector>
class SvtListener;
class SfxHint;
......@@ -31,11 +31,18 @@ class SVL_DLLPUBLIC SvtBroadcaster
public:
friend class SvtListener;
typedef boost::unordered_set<SvtListener*> ListenersType;
typedef std::vector<SvtListener*> ListenersType;
private:
const SvtBroadcaster& operator=(const SvtBroadcaster &); // verboten
/**
* Ensure that the container doesn't contain any duplicated listener
* entries. As a side effect, the listeners get sorted by pointer values
* after this call.
*/
void Normalize();
void Add( SvtListener* p );
void Remove( SvtListener* p );
......@@ -55,7 +62,8 @@ public:
private:
ListenersType maListeners;
bool mbDying;
bool mbDisposing:1;
bool mbNormalized:1;
};
......
......@@ -62,32 +62,49 @@ public:
}
void SvtBroadcaster::Normalize()
{
if (mbNormalized)
return;
std::sort(maListeners.begin(), maListeners.end());
ListenersType::iterator itUniqueEnd = std::unique(maListeners.begin(), maListeners.end());
maListeners.erase(itUniqueEnd, maListeners.end());
mbNormalized = true;
}
void SvtBroadcaster::Add( SvtListener* p )
{
maListeners.insert(p);
maListeners.push_back(p);
mbNormalized = false;
}
void SvtBroadcaster::Remove( SvtListener* p )
{
if (mbDying)
if (mbDisposing)
return;
maListeners.erase(p);
Normalize();
std::pair<ListenersType::iterator,ListenersType::iterator> r =
std::equal_range(maListeners.begin(), maListeners.end(), p);
if (r.first != r.second)
maListeners.erase(r.first, r.second);
if (maListeners.empty())
ListenersGone();
}
SvtBroadcaster::SvtBroadcaster() : mbDying(false) {}
SvtBroadcaster::SvtBroadcaster() : mbDisposing(false), mbNormalized(false) {}
SvtBroadcaster::SvtBroadcaster( const SvtBroadcaster &rBC ) :
maListeners(rBC.maListeners), mbDying(false)
maListeners(rBC.maListeners), mbDisposing(false), mbNormalized(rBC.mbNormalized)
{
std::for_each(maListeners.begin(), maListeners.end(), StartListeningHandler(*this));
}
SvtBroadcaster::~SvtBroadcaster()
{
mbDying = true;
mbDisposing = true;
Broadcast( SfxSimpleHint(SFX_HINT_DYING) );
// unregister all listeners.
......@@ -96,6 +113,7 @@ SvtBroadcaster::~SvtBroadcaster()
void SvtBroadcaster::Broadcast( const SfxHint &rHint )
{
Normalize();
std::for_each(maListeners.begin(), maListeners.end(), NotifyHandler(*this, rHint));
}
......
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