ooo-build r12608 - in trunk: . patches/test
- From: kyoshida svn gnome org
- To: svn-commits-list gnome org
- Subject: ooo-build r12608 - in trunk: . patches/test
- Date: Tue, 20 May 2008 15:49:28 +0000 (UTC)
Author: kyoshida
Date: Tue May 20 15:49:27 2008
New Revision: 12608
URL: http://svn.gnome.org/viewvc/ooo-build?rev=12608&view=rev
Log:
2008-05-20 Kohei Yoshida <kyoshida novell com>
* patches/test/sfx-broadcaster-hashset-svtools.diff: pimpl up the
broadcaster and listener classes since they are exported to other
modules.
Modified:
trunk/ChangeLog
trunk/patches/test/sfx-broadcaster-hashset-svtools.diff
Modified: trunk/patches/test/sfx-broadcaster-hashset-svtools.diff
==============================================================================
--- trunk/patches/test/sfx-broadcaster-hashset-svtools.diff (original)
+++ trunk/patches/test/sfx-broadcaster-hashset-svtools.diff Tue May 20 15:49:27 2008
@@ -1,8 +1,8 @@
diff --git a/svtools/inc/svtools/brdcst.hxx b/svtools/inc/svtools/brdcst.hxx
-index 6734f63..8d02b30 100644
+index 6734f63..105f69d 100644
--- svtools/inc/svtools/brdcst.hxx
+++ svtools/inc/svtools/brdcst.hxx
-@@ -31,35 +31,34 @@
+@@ -31,35 +31,25 @@
#define _SFXBRDCST_HXX
#include "svtools/svldllapi.h"
@@ -10,7 +10,7 @@
#include <tools/rtti.hxx>
-#include <svtools/svarray.hxx>
+
-+#include <hash_set>
++#include <memory>
class SfxListener;
class SfxHint;
@@ -23,21 +23,14 @@
- Forward( rBC, rHint )
-
-//-------------------------------------------------------------------------
-+struct SfxListenerHash
-+{
-+ size_t operator()(SfxListener* p) const
-+ {
-+ return reinterpret_cast<size_t>(p);
-+ }
-+};
++struct SfxBroadcasterImpl;
class SVL_DLLPUBLIC SfxBroadcaster
{
- friend class SfxListener;
-
+-friend class SfxListener;
+-
- SfxListenerArr_Impl aListeners;
-+ typedef ::std::hash_set<SfxListener*, SfxListenerHash> ListenerArray;
-+ ListenerArray maListeners;
++ ::std::auto_ptr<SfxBroadcasterImpl> mpImpl;
private:
- BOOL AddListener( SfxListener& rListener );
@@ -51,7 +44,7 @@
virtual void ListenersGone();
public:
-@@ -73,10 +72,11 @@ public:
+@@ -73,10 +63,11 @@ public:
void BroadcastDelayed( const SfxHint& rHint );
void BroadcastInIdle( const SfxHint& rHint );
@@ -67,10 +60,10 @@
#endif
diff --git a/svtools/inc/svtools/lstner.hxx b/svtools/inc/svtools/lstner.hxx
-index e60c028..805a472 100644
+index e60c028..47cdbc5 100644
--- svtools/inc/svtools/lstner.hxx
+++ svtools/inc/svtools/lstner.hxx
-@@ -31,24 +31,26 @@
+@@ -31,24 +31,19 @@
#define _SFXLSTNER_HXX
#include "svtools/svldllapi.h"
@@ -78,7 +71,7 @@
#include <tools/rtti.hxx>
-#include <svtools/svarray.hxx>
+
-+#include <hash_set>
++#include <memory>
class SfxBroadcaster;
class SfxHint;
@@ -91,23 +84,16 @@
- Notify( rBC, rHint )
-
-//-------------------------------------------------------------------------
-+struct SfxBroadcasterHash
-+{
-+ size_t operator()(SfxBroadcaster* p) const
-+ {
-+ return reinterpret_cast<size_t>(p);
-+ }
-+};
++struct SfxListenerImpl;
class SVL_DLLPUBLIC SfxListener
{
- SfxBroadcasterArr_Impl aBCs;
-+ typedef ::std::hash_multiset<SfxBroadcaster*, SfxBroadcasterHash> BroadcasterArray;
-+ BroadcasterArray maBCs;
++ ::std::auto_ptr<SfxListenerImpl> mpImpl;
private:
const SfxListener& operator=(const SfxListener &); // n.i., ist verboten
-@@ -62,14 +64,12 @@ public:
+@@ -62,14 +57,12 @@ public:
BOOL StartListening( SfxBroadcaster& rBroadcaster, BOOL bPreventDups = FALSE );
BOOL EndListening( SfxBroadcaster& rBroadcaster, BOOL bAllDups = FALSE );
@@ -139,10 +125,10 @@
//////////////////////// SfxStyleSheetPool ///////////////////////////////
diff --git a/svtools/source/notify/brdcst.cxx b/svtools/source/notify/brdcst.cxx
-index 4e7f5c5..c6dd206 100644
+index 4e7f5c5..c0f3291 100644
--- svtools/source/notify/brdcst.cxx
+++ svtools/source/notify/brdcst.cxx
-@@ -39,17 +39,86 @@
+@@ -39,17 +39,111 @@
#include <svtools/smplhint.hxx>
#include <svtools/lstner.hxx>
@@ -152,6 +138,7 @@
#include <svtools/brdcst.hxx>
+#include <algorithm>
++#include <hash_set>
+
+using ::std::find;
+using ::std::unary_function;
@@ -162,6 +149,30 @@
//====================================================================
++struct SfxListenerHash
++{
++ size_t operator()(SfxListener* p) const
++ {
++ return reinterpret_cast<size_t>(p);
++ }
++};
++
++typedef ::std::hash_set<SfxListener*, SfxListenerHash> ListenerArray;
++
++struct SfxBroadcasterImpl
++{
++ ListenerArray maListeners;
++
++ SfxBroadcasterImpl() {}
++
++ explicit SfxBroadcasterImpl(const SfxBroadcasterImpl& r) :
++ maListeners(r.maListeners)
++ {
++ }
++};
++
++// ----------------------------------------------------------------------------
++
+class NotifyListenerFunc : public unary_function<SfxListener*, void>
+{
+public:
@@ -232,12 +243,12 @@
//====================================================================
// broadcast immediately
-@@ -59,25 +128,11 @@ void SfxBroadcaster::Broadcast( const SfxHint &rHint )
+@@ -59,25 +153,28 @@ void SfxBroadcaster::Broadcast( const SfxHint &rHint )
DBG_CHKTHIS(SfxBroadcaster, 0);
// is anybody to notify?
- if ( aListeners.Count() /*! || aGlobListeners.Count() */ )
-+ if ( !maListeners.empty() /*! || aGlobListeners.Count() */ )
++ if ( !mpImpl->maListeners.empty() /*! || aGlobListeners.Count() */ )
{
- #if 0
- // determine the type only once, because of its expensiveness
@@ -256,12 +267,29 @@
- pListener->Notify( *this, rHint );
- #endif
- }
++#if 1
++ ListenerArray::iterator itrEnd = mpImpl->maListeners.end();
++ for (ListenerArray::iterator itr = mpImpl->maListeners.begin(); itr != itrEnd; ++itr)
++ {
++ SfxListener* pLis = *itr;
++ unsigned int nFoo = reinterpret_cast<unsigned int>(pLis);
++ fprintf(stdout, "SfxBroadcaster::Broadcast: notifying listener = %p (%d)\n", pLis, nFoo);fflush(stdout);
++ if (pLis && nFoo > 20)
++ {
++ fprintf(stdout, "SfxBroadcaster::Broadcast: notifying\n");
++ pLis->Notify(*this, rHint);
++ }
++ else
++ fprintf(stdout, "SfxBroadcaster::Broadcast: not\n");
++ }
++#else
+ NotifyListenerFunc f(rHint, *this);
-+ for_each(maListeners.begin(), maListeners.end(), f);
++ for_each(mpImpl->maListeners.begin(), mpImpl->maListeners.end(), f);
++#endif
}
}
-@@ -111,12 +166,8 @@ SfxBroadcaster::~SfxBroadcaster()
+@@ -111,19 +208,16 @@ SfxBroadcaster::~SfxBroadcaster()
Broadcast( SfxSimpleHint(SFX_HINT_DYING) );
// remove all still registered listeners
@@ -272,11 +300,26 @@
- pListener->RemoveBroadcaster_Impl(*this);
- }
+ UnregisterListenerFunc f(*this);
-+ for_each(maListeners.begin(), maListeners.end(), f);
++ for_each(mpImpl->maListeners.begin(), mpImpl->maListeners.end(), f);
}
//--------------------------------------------------------------------
-@@ -137,12 +188,8 @@ SfxBroadcaster::SfxBroadcaster( const SfxBroadcaster &rBC )
+
+ // simple ctor of class SfxBroadcaster
+
+-SfxBroadcaster::SfxBroadcaster()
++SfxBroadcaster::SfxBroadcaster() :
++ mpImpl(new SfxBroadcasterImpl)
+ {
+ DBG_CTOR(SfxBroadcaster, 0);
+ }
+@@ -133,16 +227,13 @@ SfxBroadcaster::SfxBroadcaster()
+ // copy ctor of class SfxBroadcaster
+
+
+-SfxBroadcaster::SfxBroadcaster( const SfxBroadcaster &rBC )
++SfxBroadcaster::SfxBroadcaster( const SfxBroadcaster &rBC ) :
++ mpImpl(new SfxBroadcasterImpl(*rBC.mpImpl))
{
DBG_CTOR(SfxBroadcaster, 0);
@@ -287,11 +330,11 @@
- pListener->StartListening( *this );
- }
+ RegisterListenerFunc f(*this);
-+ for_each(rBC.maListeners.begin(), rBC.maListeners.end(), f);
++ for_each(rBC.mpImpl->maListeners.begin(), rBC.mpImpl->maListeners.end(), f);
}
//--------------------------------------------------------------------
-@@ -152,21 +199,8 @@ SfxBroadcaster::SfxBroadcaster( const SfxBroadcaster &rBC )
+@@ -152,21 +243,9 @@ SfxBroadcaster::SfxBroadcaster( const SfxBroadcaster &rBC )
BOOL SfxBroadcaster::AddListener( SfxListener& rListener )
{
DBG_CHKTHIS(SfxBroadcaster, 0);
@@ -311,11 +354,12 @@
- DBG_ASSERT( USHRT_MAX != aListeners.GetPos(pListener),
- "AddListener failed" );
+ SfxListener *pListener = &rListener;
-+ maListeners.insert(pListener);
++ fprintf(stdout, "SfxBroadcaster::AddListener: adding listener %p\n", pListener);
++ mpImpl->maListeners.insert(pListener);
return TRUE;
}
-@@ -182,17 +216,10 @@ void SfxBroadcaster::ListenersGone()
+@@ -182,17 +261,10 @@ void SfxBroadcaster::ListenersGone()
//--------------------------------------------------------------------
// forward a notification to all registered listeners
@@ -332,11 +376,11 @@
- pListener->SFX_NOTIFY( rBC, rBCType, rHint, rHintType);
- }
+ NotifyListenerFunc f(rHint, rBC);
-+ for_each(maListeners.begin(), maListeners.end(), f);
++ for_each(mpImpl->maListeners.begin(), mpImpl->maListeners.end(), f);
}
//--------------------------------------------------------------------
-@@ -202,10 +229,14 @@ void SfxBroadcaster::SFX_FORWARD(SfxBroadcaster& rBC, const TypeId& rBCType,
+@@ -202,10 +274,23 @@ void SfxBroadcaster::SFX_FORWARD(SfxBroadcaster& rBC, const TypeId& rBCType,
void SfxBroadcaster::RemoveListener( SfxListener& rListener )
{
{DBG_CHKTHIS(SfxBroadcaster, 0);}
@@ -345,17 +389,26 @@
- DBG_ASSERT( nPos != USHRT_MAX, "RemoveListener: Listener unknown" );
- aListeners.GetData()[nPos] = 0;
+ SfxListener *pListener = &rListener;
-+ ListenerArray::iterator itr = find(maListeners.begin(), maListeners.end(), pListener);
-+ if (itr == maListeners.end())
++ fprintf(stdout, "SfxBroadcaster::RemoveListener: removing listener %p\n", pListener);
++ ListenerArray::iterator itr = find(mpImpl->maListeners.begin(), mpImpl->maListeners.end(), pListener);
++ if (itr == mpImpl->maListeners.end())
++ {
++ fprintf(stdout, "SfxBroadcaster::RemoveListener: listener not found!\n");
+ // listener not found!
+ return;
++ }
+
-+ maListeners.erase(itr);
++ fprintf(stdout, "SfxBroadcaster::RemoveListener: # listeners before removal: %d\n", mpImpl->maListeners.size());
++ mpImpl->maListeners.erase(itr);
++
++ fprintf(stdout, "SfxBroadcaster::RemoveListener: # listeners after removal: %d\n", mpImpl->maListeners.size());
++ for (itr = mpImpl->maListeners.begin(); itr != mpImpl->maListeners.end(); ++itr)
++ fprintf(stdout, "SfxBroadcaster::RemoveListener: - listener %p\n", *itr);
+
if ( !HasListeners() )
ListenersGone();
}
-@@ -214,10 +245,22 @@ void SfxBroadcaster::RemoveListener( SfxListener& rListener )
+@@ -214,10 +299,22 @@ void SfxBroadcaster::RemoveListener( SfxListener& rListener )
BOOL SfxBroadcaster::HasListeners() const
{
@@ -363,7 +416,7 @@
- if ( aListeners.GetObject(n) != 0 )
- return TRUE;
- return FALSE;
-+ return !maListeners.empty();
++ return !mpImpl->maListeners.empty();
}
-//--------------------------------------------------------------------
@@ -371,23 +424,23 @@
+
+size_t SfxBroadcaster::GetListenerCount() const
+{
-+ return maListeners.size();
++ return mpImpl->maListeners.size();
+}
+
+SfxListener* SfxBroadcaster::GetListener( size_t nNo ) const
+{
-+ if (nNo >= maListeners.size())
++ if (nNo >= mpImpl->maListeners.size())
+ return NULL;
+
-+ ListenerArray::const_iterator itr = maListeners.begin();
++ ListenerArray::const_iterator itr = mpImpl->maListeners.begin();
+ ::std::advance(itr, nNo);
+ return *itr;
+}
diff --git a/svtools/source/notify/lstner.cxx b/svtools/source/notify/lstner.cxx
-index 25246c0..e4897d8 100644
+index 25246c0..660dcb1 100644
--- svtools/source/notify/lstner.cxx
+++ svtools/source/notify/lstner.cxx
-@@ -39,16 +39,56 @@
+@@ -39,20 +39,88 @@
#include <svtools/hint.hxx>
#include <svtools/brdcst.hxx>
@@ -395,6 +448,7 @@
-SV_DECL_PTRARR( SfxBroadcasterArr_Impl, SfxBroadcaster*, 0, 2 )
+#include <algorithm>
++#include <hash_set>
-#define _SFX_LSTNER_CXX
-#include <svtools/lstner.hxx>
@@ -406,6 +460,32 @@
DBG_NAME(SfxListener)
TYPEINIT0(SfxListener);
++// ----------------------------------------------------------------------------
++
++struct SfxBroadcasterHash
++{
++ size_t operator()(SfxBroadcaster* p) const
++ {
++ return reinterpret_cast<size_t>(p);
++ }
++};
++
++typedef ::std::hash_multiset<SfxBroadcaster*, SfxBroadcasterHash> BroadcasterArray;
++
++struct SfxListenerImpl
++{
++ BroadcasterArray maBCs;
++
++ SfxListenerImpl() {}
++
++ SfxListenerImpl(const SfxListenerImpl& r) :
++ maBCs(r.maBCs)
++ {
++ }
++};
++
++// ----------------------------------------------------------------------------
++
+class StartListeningToBC : public unary_function<SfxBroadcaster*, void>
+{
+public:
@@ -447,21 +527,32 @@
//====================================================================
// simple ctor of class SfxListener
-@@ -63,10 +103,10 @@ SfxListener::SfxListener()
- SfxListener::SfxListener( const SfxListener &rListener )
+-SfxListener::SfxListener()
++SfxListener::SfxListener() :
++ mpImpl(new SfxListenerImpl)
+ {
+ DBG_CTOR(SfxListener, 0);
+ }
+@@ -60,13 +128,14 @@ SfxListener::SfxListener()
+
+ // copy ctor of class SfxListener
+
+-SfxListener::SfxListener( const SfxListener &rListener )
++SfxListener::SfxListener( const SfxListener &rListener ) :
++ mpImpl(new SfxListenerImpl(*rListener.mpImpl))
{
DBG_CTOR(SfxListener, 0);
-
- for ( USHORT n = 0; n < rListener.aBCs.Count(); ++n )
- StartListening( *rListener.aBCs[n] );
+ StartListeningToBC f(*this);
-+ for_each(rListener.maBCs.begin(), rListener.maBCs.end(), f);
++ for_each(rListener.mpImpl->maBCs.begin(), rListener.mpImpl->maBCs.end(), f);
}
+
//--------------------------------------------------------------------
// unregisteres the SfxListener from its SfxBroadcasters
-@@ -76,11 +116,8 @@ SfxListener::~SfxListener()
+@@ -76,11 +145,8 @@ SfxListener::~SfxListener()
DBG_DTOR(SfxListener, 0);
// unregister at all remainding broadcasters
@@ -471,49 +562,49 @@
- pBC->RemoveListener(*this);
- }
+ RemoveListenerFromBC f(*this);
-+ for_each(maBCs.begin(), maBCs.end(), f);
++ for_each(mpImpl->maBCs.begin(), mpImpl->maBCs.end(), f);
}
//--------------------------------------------------------------------
-@@ -91,8 +128,10 @@ void SfxListener::RemoveBroadcaster_Impl( SfxBroadcaster& rBC )
+@@ -91,8 +157,10 @@ void SfxListener::RemoveBroadcaster_Impl( SfxBroadcaster& rBC )
{
DBG_CHKTHIS(SfxListener, 0);
- const SfxBroadcaster *pBC = &rBC;
- aBCs.Remove( aBCs.GetPos(pBC), 1 );
+ SfxBroadcaster *pBC = &rBC;
-+ BroadcasterArray::iterator itr = ::std::find(maBCs.begin(), maBCs.end(), pBC);
-+ if (itr != maBCs.end())
-+ maBCs.erase(itr);
++ BroadcasterArray::iterator itr = ::std::find(mpImpl->maBCs.begin(), mpImpl->maBCs.end(), pBC);
++ if (itr != mpImpl->maBCs.end())
++ mpImpl->maBCs.erase(itr);
}
//--------------------------------------------------------------------
-@@ -107,8 +146,9 @@ BOOL SfxListener::StartListening( SfxBroadcaster& rBroadcaster, BOOL bPreventDup
+@@ -107,8 +175,9 @@ BOOL SfxListener::StartListening( SfxBroadcaster& rBroadcaster, BOOL bPreventDup
{
if ( rBroadcaster.AddListener(*this) )
{
- const SfxBroadcaster *pBC = &rBroadcaster;
- aBCs.Insert( pBC, aBCs.Count() );
+ SfxBroadcaster *pBC = &rBroadcaster;
-+ maBCs.insert(pBC);
++ mpImpl->maBCs.insert(pBC);
+// maBCs.push_back(pBC);
DBG_ASSERT( IsListening(rBroadcaster), "StartListening failed" );
return TRUE;
-@@ -132,8 +172,10 @@ BOOL SfxListener::EndListening( SfxBroadcaster& rBroadcaster, BOOL bAllDups )
+@@ -132,8 +201,10 @@ BOOL SfxListener::EndListening( SfxBroadcaster& rBroadcaster, BOOL bAllDups )
do
{
rBroadcaster.RemoveListener(*this);
- const SfxBroadcaster *pBC = &rBroadcaster;
- aBCs.Remove( aBCs.GetPos(pBC), 1 );
+ SfxBroadcaster *pBC = &rBroadcaster;
-+ BroadcasterArray::iterator itr = ::std::find(maBCs.begin(), maBCs.end(), pBC);
-+ if (itr != maBCs.end())
-+ maBCs.erase(itr);
++ BroadcasterArray::iterator itr = ::std::find(mpImpl->maBCs.begin(), mpImpl->maBCs.end(), pBC);
++ if (itr != mpImpl->maBCs.end())
++ mpImpl->maBCs.erase(itr);
}
while ( bAllDups && IsListening( rBroadcaster ) );
return TRUE;
-@@ -143,13 +185,18 @@ BOOL SfxListener::EndListening( SfxBroadcaster& rBroadcaster, BOOL bAllDups )
+@@ -143,13 +214,18 @@ BOOL SfxListener::EndListening( SfxBroadcaster& rBroadcaster, BOOL bAllDups )
// unregisteres at a specific SfxBroadcaster by index
@@ -525,18 +616,18 @@
- SfxBroadcaster *pBC = aBCs.GetObject(nNo);
- pBC->RemoveListener(*this);
- aBCs.Remove( nNo, 1 );
-+ if (nNo >= maBCs.size())
++ if (nNo >= mpImpl->maBCs.size())
+ return;
+
-+ BroadcasterArray::iterator itr = maBCs.begin();
++ BroadcasterArray::iterator itr = mpImpl->maBCs.begin();
+ advance(itr, nNo);
+ SfxBroadcaster* pBC = *itr;
+ pBC->RemoveListener(*this);
-+ maBCs.erase(itr);
++ mpImpl->maBCs.erase(itr);
}
//--------------------------------------------------------------------
-@@ -160,21 +207,33 @@ void SfxListener::EndListeningAll()
+@@ -160,21 +236,33 @@ void SfxListener::EndListeningAll()
{
DBG_CHKTHIS(SfxListener, 0);
@@ -548,8 +639,8 @@
- aBCs.Remove( 0, 1 );
- }
+ RemoveListenerFromBC f(*this);
-+ for_each(maBCs.begin(), maBCs.end(), f);
-+ maBCs.clear();
++ for_each(mpImpl->maBCs.begin(), mpImpl->maBCs.end(), f);
++ mpImpl->maBCs.clear();
}
//--------------------------------------------------------------------
@@ -559,27 +650,27 @@
- const SfxBroadcaster *pBC = &rBroadcaster;
- return USHRT_MAX != aBCs.GetPos( pBC );
+ SfxBroadcaster *pBC = &rBroadcaster;
-+ BroadcasterArray::const_iterator itr = find(maBCs.begin(), maBCs.end(), pBC);
-+ return itr != maBCs.end();
++ BroadcasterArray::const_iterator itr = find(mpImpl->maBCs.begin(), mpImpl->maBCs.end(), pBC);
++ return itr != mpImpl->maBCs.end();
+}
+
+size_t SfxListener::GetBroadcasterCount() const
+{
-+ return maBCs.size();
++ return mpImpl->maBCs.size();
+}
+
+SfxBroadcaster* SfxListener::GetBroadcasterJOE( size_t nNo ) const
+{
-+ if (nNo >= maBCs.size())
++ if (nNo >= mpImpl->maBCs.size())
+ return NULL;
+
-+ BroadcasterArray::const_iterator itr = maBCs.begin();
++ BroadcasterArray::const_iterator itr = mpImpl->maBCs.begin();
+ advance(itr, nNo);
+ return *itr;
}
//--------------------------------------------------------------------
-@@ -182,17 +241,16 @@ BOOL SfxListener::IsListening( SfxBroadcaster& rBroadcaster ) const
+@@ -182,17 +270,16 @@ BOOL SfxListener::IsListening( SfxBroadcaster& rBroadcaster ) const
// base implementation of notification handler
#ifdef DBG_UTIL
@@ -597,8 +688,8 @@
- DBG_ASSERT( USHRT_MAX != aBCs.GetPos(pBC),
+#ifdef DBG_UTIL
+ SfxBroadcaster *pBC = &rBC;
-+ BroadcasterArray::const_iterator itr = find(maBCs.begin(), maBCs.end(), pBC);
-+ DBG_ASSERT( itr != maBCs.end(),
++ BroadcasterArray::const_iterator itr = find(mpImpl->maBCs.begin(), mpImpl->maBCs.end(), pBC);
++ DBG_ASSERT( itr != mpImpl->maBCs.end(),
"notification from unregistered broadcaster" );
- #endif
+#endif
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]