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 @@
#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
......
......@@ -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: */
......@@ -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;
}
......
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