[Libreoffice-commits] core.git: include/svl sd/source svl/qa svl/source svx/source sw/source

Tobias Lippert drtl at fastmail.fm
Mon Jul 21 23:26:38 PDT 2014


 include/svl/SfxBroadcaster.hxx             |   19 +++++++++++++---
 sd/source/core/stlpool.cxx                 |    2 -
 sd/source/core/stlsheet.cxx                |    2 -
 svl/qa/unit/notify/test_SfxBroadcaster.cxx |    2 -
 svl/source/notify/SfxBroadcaster.cxx       |   33 +++++++++++++++--------------
 svx/source/svdraw/svdmark.cxx              |    2 -
 svx/source/svdraw/svdviter.cxx             |    2 -
 sw/source/core/unocore/unostyle.cxx        |    2 -
 8 files changed, 39 insertions(+), 25 deletions(-)

New commits:
commit 798379313dca8de97e431ef2fe68129aaa1dcf04
Author: Tobias Lippert <drtl at fastmail.fm>
Date:   Fri Jul 18 15:36:30 2014 +0200

    fdo#76754 Speed up registration of new listeners to SfxBroadcaster
    
    Also change behavior for the GetListenerCount() method which now
    returns the count of listeners.
    
    The previous behavior is available in method GetSizeOfVector().
    
    Change-Id: I5b03fa55a309f4ff5aea5e8830c137786fc07e89
    Reviewed-on: https://gerrit.libreoffice.org/10344
    Reviewed-by: Noel Grandin <noelgrandin at gmail.com>
    Tested-by: Noel Grandin <noelgrandin at gmail.com>

diff --git a/include/svl/SfxBroadcaster.hxx b/include/svl/SfxBroadcaster.hxx
index 5c135b5..a29a5c0 100644
--- a/include/svl/SfxBroadcaster.hxx
+++ b/include/svl/SfxBroadcaster.hxx
@@ -31,6 +31,8 @@ class SVL_DLLPUBLIC SfxBroadcaster
 {
     typedef std::vector<SfxListener*> SfxListenerArr_Impl;
 
+    /** Contains the positions of removed listeners. */
+    std::vector<size_t>     m_RemovedPositions;
     SfxListenerArr_Impl     m_Listeners;
 
 private:
@@ -51,12 +53,21 @@ public:
 
     void                    Broadcast( const SfxHint &rHint );
     bool                    HasListeners() const;
-    size_t                  GetListenerCount() const
-    {
+
+    /** Get the number of listeners which are registered at this broadcaster */
+    size_t                  GetListenerCount() const;
+
+    /** Get the size of the internally stored vector.
+     * Use it to iterate over all listeners.
+     */
+    size_t                  GetSizeOfVector() const {
         return m_Listeners.size();
     }
-    SfxListener*            GetListener( size_t nNo ) const
-    {
+
+    /** Get a listener by its position in the internally stored vector.
+     * Note that this method may return NULL
+     */
+    SfxListener*            GetListener( size_t nNo ) const {
         return m_Listeners[nNo];
     }
 
diff --git a/sd/source/core/stlpool.cxx b/sd/source/core/stlpool.cxx
index bee0b1e..cb11f73 100644
--- a/sd/source/core/stlpool.cxx
+++ b/sd/source/core/stlpool.cxx
@@ -1440,7 +1440,7 @@ SdStyleSheetVector SdStyleSheetPool::CreateChildList( SdStyleSheet* pSheet )
 {
     SdStyleSheetVector aResult;
 
-    const size_t nListenerCount = pSheet->GetListenerCount();
+    const size_t nListenerCount = pSheet->GetSizeOfVector();
     for (size_t n = 0; n < nListenerCount; ++n)
     {
         SdStyleSheet* pChild = dynamic_cast< SdStyleSheet* >( pSheet->GetListener(n) );
diff --git a/sd/source/core/stlsheet.cxx b/sd/source/core/stlsheet.cxx
index 5492599..4246e31 100644
--- a/sd/source/core/stlsheet.cxx
+++ b/sd/source/core/stlsheet.cxx
@@ -325,7 +325,7 @@ bool SdStyleSheet::IsUsed() const
 {
     bool bResult = false;
 
-    const size_t nListenerCount = GetListenerCount();
+    const size_t nListenerCount = GetSizeOfVector();
     for (size_t n = 0; n < nListenerCount; ++n)
     {
         SfxListener* pListener = GetListener(n);
diff --git a/svl/qa/unit/notify/test_SfxBroadcaster.cxx b/svl/qa/unit/notify/test_SfxBroadcaster.cxx
index 8139ed1..6096029 100644
--- a/svl/qa/unit/notify/test_SfxBroadcaster.cxx
+++ b/svl/qa/unit/notify/test_SfxBroadcaster.cxx
@@ -26,7 +26,7 @@ class SfxBroadcasterTest : public CppUnit::TestFixture
     // Adds code needed to register the test suite
     CPPUNIT_TEST_SUITE(SfxBroadcasterTest);
     CPPUNIT_TEST(AddingListenersIncreasesCount);
-    //CPPUNIT_TEST(RemovingListenersDecreasesCount);
+    CPPUNIT_TEST(RemovingListenersDecreasesCount);
     CPPUNIT_TEST(HintsAreNotForwardedToRemovedListeners);
 
     CPPUNIT_TEST_SUITE_END();
diff --git a/svl/source/notify/SfxBroadcaster.cxx b/svl/source/notify/SfxBroadcaster.cxx
index 2fe7903..3aa493d 100644
--- a/svl/source/notify/SfxBroadcaster.cxx
+++ b/svl/source/notify/SfxBroadcaster.cxx
@@ -88,15 +88,15 @@ SfxBroadcaster::SfxBroadcaster( const SfxBroadcaster &rBC )
 
 void SfxBroadcaster::AddListener( SfxListener& rListener )
 {
-    for (size_t i = 0; i < m_Listeners.size(); ++i)
-    {
-        if (!m_Listeners[i]) // removed by RemoveListener?
-        {
-            m_Listeners[i] = &rListener;
-            return;
-        }
+    if (m_RemovedPositions.empty()) {
+        m_Listeners.push_back(&rListener);
+    }
+    else {
+        size_t targetPosition = m_RemovedPositions.back();
+        m_RemovedPositions.pop_back();
+        assert(m_Listeners[targetPosition] == NULL);
+        m_Listeners[targetPosition] = &rListener;
     }
-    m_Listeners.push_back(&rListener);
 }
 
 
@@ -131,6 +131,8 @@ void SfxBroadcaster::RemoveListener( SfxListener& rListener )
     // DO NOT erase the listener, set the pointer to 0
     // because the current continuation may contain this->Broadcast
     *aIter = 0;
+    size_t positionOfRemovedElement = std::distance(m_Listeners.begin(), aIter);
+    m_RemovedPositions.push_back(positionOfRemovedElement);
 
     if ( !HasListeners() )
         ListenersGone();
@@ -138,13 +140,14 @@ void SfxBroadcaster::RemoveListener( SfxListener& rListener )
 
 bool SfxBroadcaster::HasListeners() const
 {
-    for (size_t i = 0; i < m_Listeners.size(); ++i)
-    {
-        if (m_Listeners[i]) {
-            return true;
-        }
-    }
-    return false;
+    return (GetListenerCount() != 0);
+}
+
+size_t SfxBroadcaster::GetListenerCount() const
+{
+    assert(m_Listeners.size() >= m_RemovedPositions.size());
+    return m_Listeners.size() - m_RemovedPositions.size();
 }
 
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/svx/source/svdraw/svdmark.cxx b/svx/source/svdraw/svdmark.cxx
index 212fdee..2908b83 100644
--- a/svx/source/svdraw/svdmark.cxx
+++ b/svx/source/svdraw/svdmark.cxx
@@ -873,7 +873,7 @@ namespace sdr
 
                         if(pBC)
                         {
-                            const size_t nLstAnz(pBC->GetListenerCount());
+                            const size_t nLstAnz(pBC->GetSizeOfVector());
 
                             for(size_t nl=0; nl < nLstAnz; ++nl)
                             {
diff --git a/svx/source/svdraw/svdviter.cxx b/svx/source/svdraw/svdviter.cxx
index 12db065..f7bc700 100644
--- a/svx/source/svdraw/svdviter.cxx
+++ b/svx/source/svdraw/svdviter.cxx
@@ -140,7 +140,7 @@ SdrView* SdrViewIter::ImpFindView()
 {
     if(mpModel)
     {
-        const size_t nLsAnz(mpModel->GetListenerCount());
+        const size_t nLsAnz(mpModel->GetSizeOfVector());
 
         while(mnListenerNum < nLsAnz)
         {
diff --git a/sw/source/core/unocore/unostyle.cxx b/sw/source/core/unocore/unostyle.cxx
index c3ec4a4..a58cf4c 100644
--- a/sw/source/core/unocore/unostyle.cxx
+++ b/sw/source/core/unocore/unostyle.cxx
@@ -987,7 +987,7 @@ void SwXStyleFamily::Notify( SfxBroadcaster& rBC, const SfxHint& rHint )
 
 SwXStyle*   SwXStyleFamily::_FindStyle(const OUString& rStyleName)const
 {
-    const size_t nLCount = pBasePool->GetListenerCount();
+    const size_t nLCount = pBasePool->GetSizeOfVector();
     for( size_t i = 0; i < nLCount; ++i)
     {
         SfxListener* pListener = pBasePool->GetListener( i );


More information about the Libreoffice-commits mailing list