diff options
author | Caolán McNamara <caolanm@redhat.com> | 2012-07-28 16:57:19 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2012-07-28 17:17:52 +0100 |
commit | 50cf7caee5bc6d8e066580d13c72b40926fcb69a (patch) | |
tree | 2962f8419b99f794e0ec1cbd1e7c7ddc04796f40 /svl | |
parent | df9b0d2e930eb1f60e429301e5386f742a1676ff (diff) |
convert SfxListenerArr_Impl from SvPtrarr to std::vector
Change-Id: I7f46731d880da30dc2dda011b31818437c955f2d
Diffstat (limited to 'svl')
-rw-r--r-- | svl/inc/svl/brdcst.hxx | 25 | ||||
-rw-r--r-- | svl/source/notify/brdcst.cxx | 71 | ||||
-rw-r--r-- | svl/source/notify/lstner.cxx | 12 |
3 files changed, 38 insertions, 70 deletions
diff --git a/svl/inc/svl/brdcst.hxx b/svl/inc/svl/brdcst.hxx index 007d4c07fa86..d434a833657f 100644 --- a/svl/inc/svl/brdcst.hxx +++ b/svl/inc/svl/brdcst.hxx @@ -21,25 +21,22 @@ #include "svl/svldllapi.h" #include <tools/rtti.hxx> -#include <svl/svarray.hxx> +#include <vector> class SfxListener; class SfxHint; -#ifndef _SFX_BRDCST_CXX -typedef SvPtrarr SfxListenerArr_Impl; -#endif - //------------------------------------------------------------------------- class SVL_DLLPUBLIC SfxBroadcaster { -friend class SfxListener; + friend class SfxListener; + typedef std::vector<SfxListener*> SfxListenerArr_Impl; SfxListenerArr_Impl aListeners; private: - sal_Bool AddListener( SfxListener& rListener ); + void AddListener( SfxListener& rListener ); void RemoveListener( SfxListener& rListener ); const SfxBroadcaster& operator=(const SfxBroadcaster &); // verboten @@ -55,10 +52,18 @@ public: virtual ~SfxBroadcaster(); void Broadcast( const SfxHint &rHint ); - sal_Bool HasListeners() const; - sal_uInt16 GetListenerCount() const { return aListeners.Count(); } + bool HasListeners() const + { + return !aListeners.empty(); + } + size_t GetListenerCount() const + { + return aListeners.size(); + } SfxListener* GetListener( sal_uInt16 nNo ) const - { return (SfxListener*) aListeners[nNo]; } + { + return aListeners[nNo]; + } }; #endif diff --git a/svl/source/notify/brdcst.cxx b/svl/source/notify/brdcst.cxx index 7cd424bbf886..62fc638c069b 100644 --- a/svl/source/notify/brdcst.cxx +++ b/svl/source/notify/brdcst.cxx @@ -25,10 +25,8 @@ #include <svl/smplhint.hxx> #include <svl/lstner.hxx> -SV_DECL_PTRARR( SfxListenerArr_Impl, SfxListener*, 0 ) - -#define _SFX_BRDCST_CXX #include <svl/brdcst.hxx> +#include <algorithm> //==================================================================== DBG_NAME(SfxBroadcaster) @@ -44,16 +42,11 @@ void SfxBroadcaster::Broadcast( const SfxHint &rHint ) { DBG_CHKTHIS(SfxBroadcaster, 0); - // is anybody to notify? - if ( aListeners.Count() /*! || aGlobListeners.Count() */ ) + // notify all registered listeners exactly once + for (size_t n = 0; n < aListeners.size(); ++n) { - // notify all registered listeners exactly once - for ( sal_uInt16 n = 0; n < aListeners.Count(); ++n ) - { - SfxListener* pListener = aListeners[n]; - if ( pListener ) - pListener->Notify( *this, rHint ); - } + SfxListener* pListener = aListeners[n]; + pListener->Notify( *this, rHint ); } } @@ -66,11 +59,10 @@ SfxBroadcaster::~SfxBroadcaster() Broadcast( SfxSimpleHint(SFX_HINT_DYING) ); // remove all still registered listeners - for ( sal_uInt16 nPos = 0; nPos < aListeners.Count(); ++nPos ) + for (size_t nPos = 0; nPos < aListeners.size(); ++nPos) { SfxListener *pListener = aListeners[nPos]; - if ( pListener ) - pListener->RemoveBroadcaster_Impl(*this); + pListener->RemoveBroadcaster_Impl(*this); } } @@ -92,11 +84,10 @@ SfxBroadcaster::SfxBroadcaster( const SfxBroadcaster &rBC ) { DBG_CTOR(SfxBroadcaster, 0); - for ( sal_uInt16 n = 0; n < rBC.aListeners.Count(); ++n ) + for (size_t n = 0; n < rBC.aListeners.size(); ++n) { SfxListener *pListener = rBC.aListeners[n]; - if ( pListener ) - pListener->StartListening( *this ); + pListener->StartListening( *this ); } } @@ -104,25 +95,11 @@ SfxBroadcaster::SfxBroadcaster( const SfxBroadcaster &rBC ) // add a new SfxListener to the list -sal_Bool SfxBroadcaster::AddListener( SfxListener& rListener ) +void SfxBroadcaster::AddListener( SfxListener& rListener ) { DBG_CHKTHIS(SfxBroadcaster, 0); - const SfxListener *pListener = &rListener; - const SfxListener *pNull = 0; - sal_uInt16 nFreePos = aListeners.GetPos( pNull ); - if ( nFreePos < aListeners.Count() ) - aListeners.GetData()[nFreePos] = pListener; - else if ( aListeners.Count() < (USHRT_MAX-1) ) - aListeners.Insert( pListener, aListeners.Count() ); - else - { - OSL_FAIL( "array overflow" ); - return sal_False; - } - DBG_ASSERT( USHRT_MAX != aListeners.GetPos(pListener), - "AddListener failed" ); - return sal_True; + aListeners.push_back(&rListener); } //-------------------------------------------------------------------- @@ -140,12 +117,10 @@ void SfxBroadcaster::ListenersGone() void SfxBroadcaster::Forward(SfxBroadcaster& rBC, const SfxHint& rHint) { - const sal_uInt16 nCount = aListeners.Count(); - for ( sal_uInt16 i = 0; i < nCount; ++i ) + for (size_t i = 0; i < aListeners.size(); ++i) { SfxListener *pListener = aListeners[i]; - if ( pListener ) - pListener->Notify( rBC, rHint ); + pListener->Notify( rBC, rHint ); } } @@ -157,23 +132,13 @@ void SfxBroadcaster::RemoveListener( SfxListener& rListener ) { {DBG_CHKTHIS(SfxBroadcaster, 0);} const SfxListener *pListener = &rListener; - sal_uInt16 nPos = aListeners.GetPos(pListener); - DBG_ASSERT( nPos != USHRT_MAX, "RemoveListener: Listener unknown" ); - aListeners.GetData()[nPos] = 0; - if ( !HasListeners() ) - ListenersGone(); -} -//-------------------------------------------------------------------- + SfxListenerArr_Impl::iterator aIter = std::remove(aListeners.begin(), aListeners.end(), pListener); + DBG_ASSERT( aIter != aListeners.end(), "RemoveListener: Listener unknown" ); + aListeners.erase(aIter, aListeners.end()); -sal_Bool SfxBroadcaster::HasListeners() const -{ - for ( sal_uInt16 n = 0; n < aListeners.Count(); ++n ) - if ( aListeners.GetObject(n) != 0 ) - return sal_True; - return sal_False; + if ( !HasListeners() ) + ListenersGone(); } -//-------------------------------------------------------------------- - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/svl/source/notify/lstner.cxx b/svl/source/notify/lstner.cxx index 5d3d6b868efa..0e645ec3f9aa 100644 --- a/svl/source/notify/lstner.cxx +++ b/svl/source/notify/lstner.cxx @@ -85,15 +85,13 @@ sal_Bool SfxListener::StartListening( SfxBroadcaster& rBroadcaster, sal_Bool bPr if ( !bPreventDups || !IsListening( rBroadcaster ) ) { - if ( rBroadcaster.AddListener(*this) ) - { - aBCs.push_back( &rBroadcaster ); - - DBG_ASSERT( IsListening(rBroadcaster), "StartListening failed" ); - return sal_True; - } + rBroadcaster.AddListener(*this); + aBCs.push_back( &rBroadcaster ); + DBG_ASSERT( IsListening(rBroadcaster), "StartListening failed" ); + return sal_True; } + return sal_False; } |