Kaydet (Commit) 50cf7cae authored tarafından Caolán McNamara's avatar Caolán McNamara

convert SfxListenerArr_Impl from SvPtrarr to std::vector

Change-Id: I7f46731d880da30dc2dda011b31818437c955f2d
üst df9b0d2e
...@@ -21,25 +21,22 @@ ...@@ -21,25 +21,22 @@
#include "svl/svldllapi.h" #include "svl/svldllapi.h"
#include <tools/rtti.hxx> #include <tools/rtti.hxx>
#include <svl/svarray.hxx> #include <vector>
class SfxListener; class SfxListener;
class SfxHint; class SfxHint;
#ifndef _SFX_BRDCST_CXX
typedef SvPtrarr SfxListenerArr_Impl;
#endif
//------------------------------------------------------------------------- //-------------------------------------------------------------------------
class SVL_DLLPUBLIC SfxBroadcaster class SVL_DLLPUBLIC SfxBroadcaster
{ {
friend class SfxListener; friend class SfxListener;
typedef std::vector<SfxListener*> SfxListenerArr_Impl;
SfxListenerArr_Impl aListeners; SfxListenerArr_Impl aListeners;
private: private:
sal_Bool AddListener( SfxListener& rListener ); void AddListener( SfxListener& rListener );
void RemoveListener( SfxListener& rListener ); void RemoveListener( SfxListener& rListener );
const SfxBroadcaster& operator=(const SfxBroadcaster &); // verboten const SfxBroadcaster& operator=(const SfxBroadcaster &); // verboten
...@@ -55,10 +52,18 @@ public: ...@@ -55,10 +52,18 @@ public:
virtual ~SfxBroadcaster(); virtual ~SfxBroadcaster();
void Broadcast( const SfxHint &rHint ); void Broadcast( const SfxHint &rHint );
sal_Bool HasListeners() const; bool HasListeners() const
sal_uInt16 GetListenerCount() const { return aListeners.Count(); } {
return !aListeners.empty();
}
size_t GetListenerCount() const
{
return aListeners.size();
}
SfxListener* GetListener( sal_uInt16 nNo ) const SfxListener* GetListener( sal_uInt16 nNo ) const
{ return (SfxListener*) aListeners[nNo]; } {
return aListeners[nNo];
}
}; };
#endif #endif
......
...@@ -25,10 +25,8 @@ ...@@ -25,10 +25,8 @@
#include <svl/smplhint.hxx> #include <svl/smplhint.hxx>
#include <svl/lstner.hxx> #include <svl/lstner.hxx>
SV_DECL_PTRARR( SfxListenerArr_Impl, SfxListener*, 0 )
#define _SFX_BRDCST_CXX
#include <svl/brdcst.hxx> #include <svl/brdcst.hxx>
#include <algorithm>
//==================================================================== //====================================================================
DBG_NAME(SfxBroadcaster) DBG_NAME(SfxBroadcaster)
...@@ -44,16 +42,11 @@ void SfxBroadcaster::Broadcast( const SfxHint &rHint ) ...@@ -44,16 +42,11 @@ void SfxBroadcaster::Broadcast( const SfxHint &rHint )
{ {
DBG_CHKTHIS(SfxBroadcaster, 0); DBG_CHKTHIS(SfxBroadcaster, 0);
// is anybody to notify? // notify all registered listeners exactly once
if ( aListeners.Count() /*! || aGlobListeners.Count() */ ) for (size_t n = 0; n < aListeners.size(); ++n)
{ {
// notify all registered listeners exactly once SfxListener* pListener = aListeners[n];
for ( sal_uInt16 n = 0; n < aListeners.Count(); ++n ) pListener->Notify( *this, rHint );
{
SfxListener* pListener = aListeners[n];
if ( pListener )
pListener->Notify( *this, rHint );
}
} }
} }
...@@ -66,11 +59,10 @@ SfxBroadcaster::~SfxBroadcaster() ...@@ -66,11 +59,10 @@ SfxBroadcaster::~SfxBroadcaster()
Broadcast( SfxSimpleHint(SFX_HINT_DYING) ); Broadcast( SfxSimpleHint(SFX_HINT_DYING) );
// remove all still registered listeners // 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]; SfxListener *pListener = aListeners[nPos];
if ( pListener ) pListener->RemoveBroadcaster_Impl(*this);
pListener->RemoveBroadcaster_Impl(*this);
} }
} }
...@@ -92,11 +84,10 @@ SfxBroadcaster::SfxBroadcaster( const SfxBroadcaster &rBC ) ...@@ -92,11 +84,10 @@ SfxBroadcaster::SfxBroadcaster( const SfxBroadcaster &rBC )
{ {
DBG_CTOR(SfxBroadcaster, 0); 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]; SfxListener *pListener = rBC.aListeners[n];
if ( pListener ) pListener->StartListening( *this );
pListener->StartListening( *this );
} }
} }
...@@ -104,25 +95,11 @@ SfxBroadcaster::SfxBroadcaster( const SfxBroadcaster &rBC ) ...@@ -104,25 +95,11 @@ SfxBroadcaster::SfxBroadcaster( const SfxBroadcaster &rBC )
// add a new SfxListener to the list // add a new SfxListener to the list
sal_Bool SfxBroadcaster::AddListener( SfxListener& rListener ) void SfxBroadcaster::AddListener( SfxListener& rListener )
{ {
DBG_CHKTHIS(SfxBroadcaster, 0); 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), aListeners.push_back(&rListener);
"AddListener failed" );
return sal_True;
} }
//-------------------------------------------------------------------- //--------------------------------------------------------------------
...@@ -140,12 +117,10 @@ void SfxBroadcaster::ListenersGone() ...@@ -140,12 +117,10 @@ void SfxBroadcaster::ListenersGone()
void SfxBroadcaster::Forward(SfxBroadcaster& rBC, const SfxHint& rHint) void SfxBroadcaster::Forward(SfxBroadcaster& rBC, const SfxHint& rHint)
{ {
const sal_uInt16 nCount = aListeners.Count(); for (size_t i = 0; i < aListeners.size(); ++i)
for ( sal_uInt16 i = 0; i < nCount; ++i )
{ {
SfxListener *pListener = aListeners[i]; SfxListener *pListener = aListeners[i];
if ( pListener ) pListener->Notify( rBC, rHint );
pListener->Notify( rBC, rHint );
} }
} }
...@@ -157,23 +132,13 @@ void SfxBroadcaster::RemoveListener( SfxListener& rListener ) ...@@ -157,23 +132,13 @@ void SfxBroadcaster::RemoveListener( SfxListener& rListener )
{ {
{DBG_CHKTHIS(SfxBroadcaster, 0);} {DBG_CHKTHIS(SfxBroadcaster, 0);}
const SfxListener *pListener = &rListener; 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 if ( !HasListeners() )
{ ListenersGone();
for ( sal_uInt16 n = 0; n < aListeners.Count(); ++n )
if ( aListeners.GetObject(n) != 0 )
return sal_True;
return sal_False;
} }
//--------------------------------------------------------------------
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -85,15 +85,13 @@ sal_Bool SfxListener::StartListening( SfxBroadcaster& rBroadcaster, sal_Bool bPr ...@@ -85,15 +85,13 @@ sal_Bool SfxListener::StartListening( SfxBroadcaster& rBroadcaster, sal_Bool bPr
if ( !bPreventDups || !IsListening( rBroadcaster ) ) if ( !bPreventDups || !IsListening( rBroadcaster ) )
{ {
if ( rBroadcaster.AddListener(*this) ) rBroadcaster.AddListener(*this);
{ aBCs.push_back( &rBroadcaster );
aBCs.push_back( &rBroadcaster );
DBG_ASSERT( IsListening(rBroadcaster), "StartListening failed" );
return sal_True;
}
DBG_ASSERT( IsListening(rBroadcaster), "StartListening failed" );
return sal_True;
} }
return sal_False; return sal_False;
} }
......
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