diff options
author | Kohei Yoshida <kohei.yoshida@collabora.com> | 2013-11-14 09:49:15 -0500 |
---|---|---|
committer | Kohei Yoshida <kohei.yoshida@collabora.com> | 2013-11-14 23:53:51 -0500 |
commit | ae79b40f725ac28f8940bc9d97fd137088c20a22 (patch) | |
tree | 0ad551d0f576ba0c2e5bfb9622d32af9d3ee135a /svl | |
parent | f076c62d5cce5425d903b861827c83c16a040b86 (diff) |
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
Diffstat (limited to 'svl')
-rw-r--r-- | svl/source/notify/broadcast.cxx | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/svl/source/notify/broadcast.cxx b/svl/source/notify/broadcast.cxx index 7e59e36e2ec7..96d34a7f6ced 100644 --- a/svl/source/notify/broadcast.cxx +++ b/svl/source/notify/broadcast.cxx @@ -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)); } |