diff options
author | Kohei Yoshida <kohei.yoshida@collabora.com> | 2014-12-03 23:19:39 -0500 |
---|---|---|
committer | Kohei Yoshida <kohei.yoshida@collabora.com> | 2014-12-04 00:47:57 -0500 |
commit | 4eb381147bd0c9c7a48f86de0e3ae1d4c3bbe12f (patch) | |
tree | 167bc0a2100a522a575842683fa244ee916ea6ce /svl/source | |
parent | a09a709594dd0f6e38f8c6bf28433bd391e8842d (diff) |
pIimplize SfxBroadcaster and SfxListener.
Change-Id: I0d1d73402f11cc61ea9e7629bea34e24c22f5beb
Diffstat (limited to 'svl/source')
-rw-r--r-- | svl/source/notify/SfxBroadcaster.cxx | 88 | ||||
-rw-r--r-- | svl/source/notify/lstner.cxx | 50 |
2 files changed, 89 insertions, 49 deletions
diff --git a/svl/source/notify/SfxBroadcaster.cxx b/svl/source/notify/SfxBroadcaster.cxx index f7ae2521d059..37527e442a26 100644 --- a/svl/source/notify/SfxBroadcaster.cxx +++ b/svl/source/notify/SfxBroadcaster.cxx @@ -17,29 +17,38 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ -#include <assert.h> +#include <svl/SfxBroadcaster.hxx> #include <svl/hint.hxx> #include <svl/smplhint.hxx> #include <svl/lstner.hxx> +#include <tools/debug.hxx> -#include <svl/SfxBroadcaster.hxx> #include <algorithm> -#include <tools/debug.hxx> +#include <cassert> +#include <vector> TYPEINIT0(SfxBroadcaster); +typedef std::vector<SfxListener*> SfxListenerArr_Impl; + +struct SfxBroadcaster::Impl +{ + /** Contains the positions of removed listeners. */ + std::vector<size_t> m_RemovedPositions; + SfxListenerArr_Impl m_Listeners; +}; + // broadcast immediately void SfxBroadcaster::Broadcast( const SfxHint &rHint ) { // notify all registered listeners exactly once - for (size_t n = 0; n < m_Listeners.size(); ++n) + for (size_t i = 0; i < mpImpl->m_Listeners.size(); ++i) { - SfxListener *const pListener = m_Listeners[n]; - if (pListener) { + SfxListener *const pListener = mpImpl->m_Listeners[i]; + if (pListener) pListener->Notify( *this, rHint ); - } } } @@ -50,19 +59,20 @@ SfxBroadcaster::~SfxBroadcaster() Broadcast( SfxSimpleHint(SFX_HINT_DYING) ); // remove all still registered listeners - for (size_t nPos = 0; nPos < m_Listeners.size(); ++nPos) + for (size_t i = 0; i < mpImpl->m_Listeners.size(); ++i) { - SfxListener *const pListener = m_Listeners[nPos]; - if (pListener) { + SfxListener *const pListener = mpImpl->m_Listeners[i]; + if (pListener) pListener->RemoveBroadcaster_Impl(*this); - } } + + delete mpImpl; } // simple ctor of class SfxBroadcaster -SfxBroadcaster::SfxBroadcaster() +SfxBroadcaster::SfxBroadcaster() : mpImpl(new Impl) { } @@ -70,14 +80,13 @@ SfxBroadcaster::SfxBroadcaster() // copy ctor of class SfxBroadcaster -SfxBroadcaster::SfxBroadcaster( const SfxBroadcaster &rBC ) +SfxBroadcaster::SfxBroadcaster( const SfxBroadcaster &rBC ) : mpImpl(new Impl) { - for (size_t n = 0; n < rBC.m_Listeners.size(); ++n) + for (size_t i = 0; i < rBC.mpImpl->m_Listeners.size(); ++i) { - SfxListener *const pListener = rBC.m_Listeners[n]; - if (pListener) { + SfxListener *const pListener = rBC.mpImpl->m_Listeners[i]; + if (pListener) pListener->StartListening( *this ); - } } } @@ -87,14 +96,16 @@ SfxBroadcaster::SfxBroadcaster( const SfxBroadcaster &rBC ) void SfxBroadcaster::AddListener( SfxListener& rListener ) { DBG_TESTSOLARMUTEX(); - if (m_RemovedPositions.empty()) { - m_Listeners.push_back(&rListener); + if (mpImpl->m_RemovedPositions.empty()) + { + mpImpl->m_Listeners.push_back(&rListener); } - else { - size_t targetPosition = m_RemovedPositions.back(); - m_RemovedPositions.pop_back(); - assert(m_Listeners[targetPosition] == NULL); - m_Listeners[targetPosition] = &rListener; + else + { + size_t targetPosition = mpImpl->m_RemovedPositions.back(); + mpImpl->m_RemovedPositions.pop_back(); + assert(mpImpl->m_Listeners[targetPosition] == NULL); + mpImpl->m_Listeners[targetPosition] = &rListener; } } @@ -110,12 +121,11 @@ void SfxBroadcaster::ListenersGone() void SfxBroadcaster::Forward(SfxBroadcaster& rBC, const SfxHint& rHint) { - for (size_t i = 0; i < m_Listeners.size(); ++i) + for (size_t i = 0; i < mpImpl->m_Listeners.size(); ++i) { - SfxListener *const pListener = m_Listeners[i]; - if (pListener) { + SfxListener *const pListener = mpImpl->m_Listeners[i]; + if (pListener) pListener->Notify( rBC, rHint ); - } } } @@ -126,13 +136,13 @@ void SfxBroadcaster::RemoveListener( SfxListener& rListener ) { DBG_TESTSOLARMUTEX(); SfxListenerArr_Impl::iterator aIter = std::find( - m_Listeners.begin(), m_Listeners.end(), &rListener); - assert(aIter != m_Listeners.end()); // "RemoveListener: Listener unknown" + mpImpl->m_Listeners.begin(), mpImpl->m_Listeners.end(), &rListener); + assert(aIter != mpImpl->m_Listeners.end()); // "RemoveListener: Listener unknown" // DO NOT erase the listener, set the pointer to 0 // because the current continuation may contain this->Broadcast *aIter = 0; - size_t positionOfRemovedElement = std::distance(m_Listeners.begin(), aIter); - m_RemovedPositions.push_back(positionOfRemovedElement); + size_t positionOfRemovedElement = std::distance(mpImpl->m_Listeners.begin(), aIter); + mpImpl->m_RemovedPositions.push_back(positionOfRemovedElement); if ( !HasListeners() ) ListenersGone(); @@ -145,8 +155,18 @@ bool SfxBroadcaster::HasListeners() const size_t SfxBroadcaster::GetListenerCount() const { - assert(m_Listeners.size() >= m_RemovedPositions.size()); - return m_Listeners.size() - m_RemovedPositions.size(); + assert(mpImpl->m_Listeners.size() >= mpImpl->m_RemovedPositions.size()); + return mpImpl->m_Listeners.size() - mpImpl->m_RemovedPositions.size(); +} + +size_t SfxBroadcaster::GetSizeOfVector() const +{ + return mpImpl->m_Listeners.size(); +} + +SfxListener* SfxBroadcaster::GetListener( size_t nNo ) const +{ + return mpImpl->m_Listeners[nNo]; } diff --git a/svl/source/notify/lstner.cxx b/svl/source/notify/lstner.cxx index bef588ad1d27..4c3dc073f3ab 100644 --- a/svl/source/notify/lstner.cxx +++ b/svl/source/notify/lstner.cxx @@ -24,21 +24,29 @@ #include <algorithm> #include <cassert> +#include <deque> TYPEINIT0(SfxListener); +typedef std::deque<SfxBroadcaster*> SfxBroadcasterArr_Impl; + +struct SfxListener::Impl +{ + SfxBroadcasterArr_Impl maBCs; +}; + // simple ctor of class SfxListener -SfxListener::SfxListener() +SfxListener::SfxListener() : mpImpl(new Impl) { } // copy ctor of class SfxListener -SfxListener::SfxListener( const SfxListener &rListener ) +SfxListener::SfxListener( const SfxListener &rListener ) : mpImpl(new Impl) { - for ( sal_uInt16 n = 0; n < rListener.aBCs.size(); ++n ) - StartListening( *rListener.aBCs[n] ); + for ( sal_uInt16 n = 0; n < rListener.mpImpl->maBCs.size(); ++n ) + StartListening( *rListener.mpImpl->maBCs[n] ); } // unregisters the SfxListener from its SfxBroadcasters @@ -46,11 +54,13 @@ SfxListener::SfxListener( const SfxListener &rListener ) SfxListener::~SfxListener() { // unregister at all remaining broadcasters - for ( sal_uInt16 nPos = 0; nPos < aBCs.size(); ++nPos ) + for ( sal_uInt16 nPos = 0; nPos < mpImpl->maBCs.size(); ++nPos ) { - SfxBroadcaster *pBC = aBCs[nPos]; + SfxBroadcaster *pBC = mpImpl->maBCs[nPos]; pBC->RemoveListener(*this); } + + delete mpImpl; } @@ -58,7 +68,7 @@ SfxListener::~SfxListener() void SfxListener::RemoveBroadcaster_Impl( SfxBroadcaster& rBroadcaster ) { - aBCs.erase( std::find( aBCs.begin(), aBCs.end(), &rBroadcaster ) ); + mpImpl->maBCs.erase( std::find( mpImpl->maBCs.begin(), mpImpl->maBCs.end(), &rBroadcaster ) ); } @@ -69,7 +79,7 @@ void SfxListener::StartListening( SfxBroadcaster& rBroadcaster, bool bPreventDup if ( !bPreventDups || !IsListening( rBroadcaster ) ) { rBroadcaster.AddListener(*this); - aBCs.push_back( &rBroadcaster ); + mpImpl->maBCs.push_back( &rBroadcaster ); assert(IsListening(rBroadcaster) && "StartListening failed"); } @@ -82,13 +92,13 @@ void SfxListener::EndListening( SfxBroadcaster& rBroadcaster, bool bAllDups ) { do { - SfxBroadcasterArr_Impl::iterator it = std::find( aBCs.begin(), aBCs.end(), &rBroadcaster ); - if ( it == aBCs.end() ) + SfxBroadcasterArr_Impl::iterator it = std::find( mpImpl->maBCs.begin(), mpImpl->maBCs.end(), &rBroadcaster ); + if ( it == mpImpl->maBCs.end() ) { break; } rBroadcaster.RemoveListener(*this); - aBCs.erase( it ); + mpImpl->maBCs.erase( it ); } while ( bAllDups ); } @@ -99,18 +109,28 @@ void SfxListener::EndListening( SfxBroadcaster& rBroadcaster, bool bAllDups ) void SfxListener::EndListeningAll() { // Attention: when optimizing this: Respect sideffects of RemoveListener! - while ( !aBCs.empty() ) + while ( !mpImpl->maBCs.empty() ) { - SfxBroadcaster *pBC = aBCs.front(); + SfxBroadcaster *pBC = mpImpl->maBCs.front(); pBC->RemoveListener(*this); - aBCs.pop_front(); + mpImpl->maBCs.pop_front(); } } bool SfxListener::IsListening( SfxBroadcaster& rBroadcaster ) const { - return aBCs.end() != std::find( aBCs.begin(), aBCs.end(), &rBroadcaster ); + return mpImpl->maBCs.end() != std::find( mpImpl->maBCs.begin(), mpImpl->maBCs.end(), &rBroadcaster ); +} + +sal_uInt16 SfxListener::GetBroadcasterCount() const +{ + return mpImpl->maBCs.size(); +} + +SfxBroadcaster* SfxListener::GetBroadcasterJOE( sal_uInt16 nNo ) const +{ + return mpImpl->maBCs[nNo]; } |