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 | |
parent | a09a709594dd0f6e38f8c6bf28433bd391e8842d (diff) |
pIimplize SfxBroadcaster and SfxListener.
Change-Id: I0d1d73402f11cc61ea9e7629bea34e24c22f5beb
-rw-r--r-- | include/svl/SfxBroadcaster.hxx | 16 | ||||
-rw-r--r-- | include/svl/lstner.hxx | 14 | ||||
-rw-r--r-- | svl/source/notify/SfxBroadcaster.cxx | 88 | ||||
-rw-r--r-- | svl/source/notify/lstner.cxx | 50 | ||||
-rw-r--r-- | sw/inc/unotxdoc.hxx | 2 |
5 files changed, 99 insertions, 71 deletions
diff --git a/include/svl/SfxBroadcaster.hxx b/include/svl/SfxBroadcaster.hxx index a29a5c008798..56a335730041 100644 --- a/include/svl/SfxBroadcaster.hxx +++ b/include/svl/SfxBroadcaster.hxx @@ -21,7 +21,6 @@ #include <svl/svldllapi.h> #include <tools/rtti.hxx> -#include <vector> class SfxListener; class SfxHint; @@ -29,11 +28,8 @@ class SfxBroadcasterTest; class SVL_DLLPUBLIC SfxBroadcaster { - typedef std::vector<SfxListener*> SfxListenerArr_Impl; - - /** Contains the positions of removed listeners. */ - std::vector<size_t> m_RemovedPositions; - SfxListenerArr_Impl m_Listeners; + struct Impl; + Impl* mpImpl; private: void AddListener( SfxListener& rListener ); @@ -60,16 +56,12 @@ public: /** Get the size of the internally stored vector. * Use it to iterate over all listeners. */ - size_t GetSizeOfVector() const { - return m_Listeners.size(); - } + size_t GetSizeOfVector() const; /** Get a listener by its position in the internally stored vector. * Note that this method may return NULL */ - SfxListener* GetListener( size_t nNo ) const { - return m_Listeners[nNo]; - } + SfxListener* GetListener( size_t nNo ) const; friend class SfxListener; friend class ::SfxBroadcasterTest; diff --git a/include/svl/lstner.hxx b/include/svl/lstner.hxx index 0bdf6e23dc9e..8792c01ff041 100644 --- a/include/svl/lstner.hxx +++ b/include/svl/lstner.hxx @@ -21,21 +21,17 @@ #include <svl/svldllapi.h> #include <tools/rtti.hxx> -#include <deque> class SfxBroadcaster; class SfxHint; -typedef std::deque<SfxBroadcaster*> SfxBroadcasterArr_Impl; - #define SFX_NOTIFY( rBC, rBCT, rHint, rHintT ) \ Notify( rBC, rHint ) - - class SVL_DLLPUBLIC SfxListener { - SfxBroadcasterArr_Impl aBCs; + struct Impl; + Impl* mpImpl; private: const SfxListener& operator=(const SfxListener &); // n.i., ist verboten @@ -52,10 +48,8 @@ public: void EndListeningAll(); bool IsListening( SfxBroadcaster& rBroadcaster ) const; - sal_uInt16 GetBroadcasterCount() const - { return aBCs.size(); } - SfxBroadcaster* GetBroadcasterJOE( sal_uInt16 nNo ) const - { return aBCs[nNo]; } + sal_uInt16 GetBroadcasterCount() const; + SfxBroadcaster* GetBroadcasterJOE( sal_uInt16 nNo ) const; virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ); 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]; } diff --git a/sw/inc/unotxdoc.hxx b/sw/inc/unotxdoc.hxx index a48a8f34bab5..de1507be5ea6 100644 --- a/sw/inc/unotxdoc.hxx +++ b/sw/inc/unotxdoc.hxx @@ -72,6 +72,8 @@ #include <unobaseclass.hxx> #include <viewopt.hxx> +#include <deque> + #define __IFC32 Ifc1, Ifc2, Ifc3, Ifc4, Ifc5, Ifc6, Ifc7, Ifc8, Ifc9, Ifc10, Ifc11, Ifc12, Ifc13, Ifc14, Ifc15, Ifc16, \ Ifc17, Ifc18, Ifc19, Ifc20, Ifc21, Ifc22, Ifc23, Ifc24, Ifc25, Ifc26, Ifc27, Ifc28, Ifc29, Ifc30, Ifc31, Ifc32 |