summaryrefslogtreecommitdiff
path: root/svl
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2012-07-28 16:57:19 +0100
committerCaolán McNamara <caolanm@redhat.com>2012-07-28 17:17:52 +0100
commit50cf7caee5bc6d8e066580d13c72b40926fcb69a (patch)
tree2962f8419b99f794e0ec1cbd1e7c7ddc04796f40 /svl
parentdf9b0d2e930eb1f60e429301e5386f742a1676ff (diff)
convert SfxListenerArr_Impl from SvPtrarr to std::vector
Change-Id: I7f46731d880da30dc2dda011b31818437c955f2d
Diffstat (limited to 'svl')
-rw-r--r--svl/inc/svl/brdcst.hxx25
-rw-r--r--svl/source/notify/brdcst.cxx71
-rw-r--r--svl/source/notify/lstner.cxx12
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;
}