[Libreoffice-commits] core.git: 4 commits - sw/inc sw/qa sw/source

Bjoern Michaelsen bjoern.michaelsen at canonical.com
Fri Mar 20 11:08:16 PDT 2015


 sw/inc/calbck.hxx                |   57 ++++++++++++++++----------------
 sw/qa/core/uwriter.cxx           |   69 ++++++++++++++++++++++++++++++---------
 sw/source/core/fields/expfld.cxx |    2 -
 3 files changed, 84 insertions(+), 44 deletions(-)

New commits:
commit 317c8e5c80308e829c4bc29958e03931cd8db3ef
Author: Bjoern Michaelsen <bjoern.michaelsen at canonical.com>
Date:   Fri Mar 20 15:22:44 2015 +0100

    use static_cast<> and typeid, its faster
    
    Change-Id: I80f66686a09dfe629b9aa9f9cb7babe1c5a6edac

diff --git a/sw/inc/calbck.hxx b/sw/inc/calbck.hxx
index 4ff6cc7..6ad3116 100644
--- a/sw/inc/calbck.hxx
+++ b/sw/inc/calbck.hxx
@@ -120,13 +120,13 @@ public:
     virtual void Modify( const SfxPoolItem* pOldValue, const SfxPoolItem* pNewValue )
         { CheckRegistration( pOldValue, pNewValue ); }
     // when overriding this, you MUST call SwClient::SwClientModify() in the override!
-    virtual void SwClientNotify( const SwModify&, const SfxHint& rHint)
-        SAL_OVERRIDE
+    virtual void SwClientNotify( const SwModify&, const SfxHint& rHint) SAL_OVERRIDE
     {
-        // assuming the compiler to realize that a dynamic_cast to a final class is just a pointer compare ...
-        auto pLegacyHint(dynamic_cast<const sw::LegacyModifyHint*>(&rHint));
-        if(pLegacyHint)
+        if(typeid(rHint) == typeid(sw::LegacyModifyHint))
+        {
+            auto pLegacyHint(static_cast<const sw::LegacyModifyHint*>(&rHint));
             Modify(pLegacyHint->m_pOld, pLegacyHint->m_pNew);
+        }
     };
 
     // in case an SwModify object is destroyed that itself is registered in another SwModify,
commit f18d1141936eafc15d428ceb823fe28584b0e2d5
Author: Bjoern Michaelsen <bjoern.michaelsen at canonical.com>
Date:   Fri Mar 20 13:21:58 2015 +0100

    more testcode
    
    Change-Id: I6bce3350385adfa02c0501d98762e16d66f0b490

diff --git a/sw/qa/core/uwriter.cxx b/sw/qa/core/uwriter.cxx
index c3fcad4..5818d9b 100644
--- a/sw/qa/core/uwriter.cxx
+++ b/sw/qa/core/uwriter.cxx
@@ -1390,6 +1390,7 @@ void SwDocTest::testIntrusiveRing()
 
 namespace
 {
+    struct TestHint SAL_FINAL : SfxHint {};
     struct TestModify : SwModify
     {
         TYPEINFO_OVERRIDE();
@@ -1399,9 +1400,17 @@ namespace
     {
         TYPEINFO_OVERRIDE();
         int m_nModifyCount;
-        TestClient() : m_nModifyCount(0) {};
+        int m_nNotifyCount;
+        TestClient() : m_nModifyCount(0), m_nNotifyCount(0) {};
         virtual void Modify( const SfxPoolItem*, const SfxPoolItem*) SAL_OVERRIDE
         { ++m_nModifyCount; }
+        virtual void SwClientNotify(const SwModify& rModify, const SfxHint& rHint)
+        {
+            if(typeid(TestHint) == typeid(rHint))
+                ++m_nNotifyCount;
+            else
+                SwClient::SwClientNotify(rModify, rHint);
+        }
     };
     TYPEINIT1( TestClient, SwClient );
     // sad copypasta as tools/rtti.hxxs little brain cant cope with templates
@@ -1420,16 +1429,35 @@ void SwDocTest::testClientModify()
     (void) OtherTestClient(); // avoid loplugin:unreffun
     TestModify aMod;
     TestClient aClient1, aClient2;
+    OtherTestClient aOtherClient1;
+    // test client registration
+    CPPUNIT_ASSERT_EQUAL(aClient1.GetRegisteredIn(),static_cast<SwModify*>(nullptr));
+    CPPUNIT_ASSERT_EQUAL(aClient2.GetRegisteredIn(),static_cast<SwModify*>(nullptr));
     aMod.Add(&aClient1);
     aMod.Add(&aClient2);
     CPPUNIT_ASSERT_EQUAL(aClient1.GetRegisteredIn(),static_cast<SwModify*>(&aMod));
     CPPUNIT_ASSERT_EQUAL(aClient2.GetRegisteredIn(),static_cast<SwModify*>(&aMod));
+    // test broadcast
     aMod.ModifyBroadcast(nullptr, nullptr);
     CPPUNIT_ASSERT_EQUAL(aClient1.m_nModifyCount,1);
     CPPUNIT_ASSERT_EQUAL(aClient2.m_nModifyCount,1);
+    CPPUNIT_ASSERT_EQUAL(aClient1.m_nNotifyCount,0);
+    CPPUNIT_ASSERT_EQUAL(aClient2.m_nNotifyCount,0);
     aMod.ModifyBroadcast(nullptr, nullptr);
     CPPUNIT_ASSERT_EQUAL(aClient1.m_nModifyCount,2);
     CPPUNIT_ASSERT_EQUAL(aClient2.m_nModifyCount,2);
+    CPPUNIT_ASSERT_EQUAL(aClient1.m_nNotifyCount,0);
+    CPPUNIT_ASSERT_EQUAL(aClient2.m_nNotifyCount,0);
+    // test notify
+    {
+        TestHint aHint;
+        aMod.CallSwClientNotify(aHint);
+        CPPUNIT_ASSERT_EQUAL(aClient1.m_nModifyCount,2);
+        CPPUNIT_ASSERT_EQUAL(aClient2.m_nModifyCount,2);
+        CPPUNIT_ASSERT_EQUAL(aClient1.m_nNotifyCount,1);
+        CPPUNIT_ASSERT_EQUAL(aClient2.m_nNotifyCount,1);
+    }
+    // test typed iteration
     CPPUNIT_ASSERT(!aClient1.IsA(TYPE(OtherTestClient)));
     {
         SwIterator<OtherTestClient,SwModify> aIter(aMod);
@@ -1446,8 +1474,24 @@ void SwDocTest::testClientModify()
         }
         CPPUNIT_ASSERT_EQUAL(nCount,2);
     }
+    aMod.Add(&aOtherClient1);
+    CPPUNIT_ASSERT_EQUAL(aOtherClient1.m_nModifyCount,0);
+    {
+        int nCount = 0;
+        SwIterator<TestClient,SwModify> aIter(aMod);
+        for(TestClient* pClient = aIter.First(); pClient ; pClient = aIter.Next())
+        {
+            CPPUNIT_ASSERT_EQUAL(pClient->m_nModifyCount,2);
+            ++nCount;
+        }
+        CPPUNIT_ASSERT_EQUAL(nCount,2);
+    }
+    CPPUNIT_ASSERT_EQUAL(aOtherClient1.m_nModifyCount,0);
+    aMod.Remove(&aOtherClient1);
     CPPUNIT_ASSERT_EQUAL(aClient1.GetRegisteredIn(),static_cast<SwModify*>(&aMod));
     CPPUNIT_ASSERT_EQUAL(aClient2.GetRegisteredIn(),static_cast<SwModify*>(&aMod));
+    CPPUNIT_ASSERT_EQUAL(aOtherClient1.GetRegisteredIn(),static_cast<SwModify*>(nullptr));
+    // test client self-deregistration during iteration
     {
         int nCount = 0;
         SwIterator<TestClient,SwModify> aIter(aMod);
@@ -1472,6 +1516,8 @@ void SwDocTest::testClientModify()
     aMod.ModifyBroadcast(nullptr, nullptr);
     CPPUNIT_ASSERT_EQUAL(aClient1.m_nModifyCount,2);
     CPPUNIT_ASSERT_EQUAL(aClient2.m_nModifyCount,2);
+    CPPUNIT_ASSERT_EQUAL(aClient1.m_nNotifyCount,1);
+    CPPUNIT_ASSERT_EQUAL(aClient2.m_nNotifyCount,1);
 }
 
 void SwDocTest::setUp()
commit c5036a67632a2b3a5dae7e8e4cfc6820484ac660
Author: Bjoern Michaelsen <bjoern.michaelsen at canonical.com>
Date:   Fri Mar 20 12:30:12 2015 +0100

    copy a full OtherTestClient implementation
    
    Change-Id: I3d72385ae643bec9623fd2e8f406504a20b4142c

diff --git a/sw/qa/core/uwriter.cxx b/sw/qa/core/uwriter.cxx
index 31e0ee8..c3fcad4 100644
--- a/sw/qa/core/uwriter.cxx
+++ b/sw/qa/core/uwriter.cxx
@@ -1400,26 +1400,19 @@ namespace
         TYPEINFO_OVERRIDE();
         int m_nModifyCount;
         TestClient() : m_nModifyCount(0) {};
-        virtual void Modify( const SfxPoolItem*, const SfxPoolItem*)
-            SAL_OVERRIDE
-        {
-            ShowReg();
-            ++m_nModifyCount;
-        }
-
-        void ShowReg()
-        {
-            if(GetRegisteredIn())
-            {
-                std::cout << "TestClient " << this << " registered  in " << GetRegisteredIn() << std::endl;
-            }
-            else
-                std::cout << "TestClient " << this << " not registered " << std::endl;
-        }
+        virtual void Modify( const SfxPoolItem*, const SfxPoolItem*) SAL_OVERRIDE
+        { ++m_nModifyCount; }
     };
     TYPEINIT1( TestClient, SwClient );
+    // sad copypasta as tools/rtti.hxxs little brain cant cope with templates
     struct OtherTestClient : SwClient
-        { TYPEINFO_OVERRIDE(); };
+    {
+        TYPEINFO_OVERRIDE();
+        int m_nModifyCount;
+        OtherTestClient() : m_nModifyCount(0) {};
+        virtual void Modify( const SfxPoolItem*, const SfxPoolItem*) SAL_OVERRIDE
+        { ++m_nModifyCount; }
+    };
     TYPEINIT1( OtherTestClient, SwClient );
 }
 void SwDocTest::testClientModify()
commit 0bf4e6e21101a66bb63778ab49006ee90c16ea94
Author: Bjoern Michaelsen <bjoern.michaelsen at canonical.com>
Date:   Fri Mar 20 03:08:22 2015 +0100

    make ClientIteratorBase only know about WriterListener
    
    Change-Id: Ice6fb793e3f27abfbf000b4a290fd4f3309e1770

diff --git a/sw/inc/calbck.hxx b/sw/inc/calbck.hxx
index 2af23b7..4ff6cc7 100644
--- a/sw/inc/calbck.hxx
+++ b/sw/inc/calbck.hxx
@@ -98,6 +98,7 @@ class SW_DLLPUBLIC SwClient : ::sw::WriterListener
     // avoids making the details of the linked list and the callback method public
     friend class SwModify;
     friend class sw::ClientIteratorBase;
+    template<typename E, typename S> friend class SwIterator;
 
     SwModify *pRegisteredIn;        ///< event source
 
@@ -192,7 +193,7 @@ public:
 
     void Add(SwClient *pDepend);
     SwClient* Remove(SwClient *pDepend);
-    const SwClient* GetDepends() const  { return static_cast<SwClient*>(pRoot); }
+    const sw::WriterListener* GetDepends() const  { return pRoot; }
 
     // get information about attribute
     virtual bool GetInfo( SfxPoolItem& ) const SAL_OVERRIDE;
@@ -250,11 +251,11 @@ namespace sw
         protected:
             const SwModify& m_rRoot;
             // the current object in an iteration
-            SwClient* m_pCurrent;
+            WriterListener* m_pCurrent;
             // in case the current object is already removed, the next object in the list
             // is marked down to become the current object in the next step
             // this is necessary because iteration requires access to members of the current object
-            SwClient* m_pPosition;
+            WriterListener* m_pPosition;
             static SW_DLLPUBLIC ClientIteratorBase* our_pClientIters;
 
             ClientIteratorBase( const SwModify& rModify )
@@ -262,15 +263,15 @@ namespace sw
             {
                 MoveTo(our_pClientIters);
                 our_pClientIters = this;
-                m_pCurrent = m_pPosition = const_cast<SwClient*>(m_rRoot.GetDepends());
+                m_pCurrent = m_pPosition = const_cast<WriterListener*>(m_rRoot.GetDepends());
             }
-            SwClient* GetLeftOfPos() { return static_cast<SwClient*>(m_pPosition->m_pLeft); }
-            SwClient* GetRightOfPos() { return static_cast<SwClient*>(m_pPosition->m_pRight); }
-            SwClient* GoStart()
+            WriterListener* GetLeftOfPos() { return m_pPosition->m_pLeft; }
+            WriterListener* GetRightOfPos() { return m_pPosition->m_pRight; }
+            WriterListener* GoStart()
             {
-                if((m_pPosition = const_cast<SwClient*>(m_rRoot.GetDepends())))
+                if((m_pPosition = const_cast<WriterListener*>(m_rRoot.GetDepends())))
                     while( m_pPosition->m_pLeft )
-                        m_pPosition = static_cast<SwClient*>(m_pPosition->m_pLeft);
+                        m_pPosition = m_pPosition->m_pLeft;
                 return m_pCurrent = m_pPosition;
             }
             ~ClientIteratorBase() SAL_OVERRIDE
@@ -285,7 +286,7 @@ namespace sw
             // SwModify::Add() asserts this
             bool IsChanged() const { return m_pPosition != m_pCurrent; }
             // ensures the iterator to point at a current client
-            SwClient* Sync() { return m_pCurrent = m_pPosition; }
+            WriterListener* Sync() { return m_pCurrent = m_pPosition; }
     };
 }
 
@@ -306,29 +307,29 @@ public:
     TElementType* Last()
     {
         if(!m_pPosition)
-            m_pPosition = const_cast<SwClient*>(m_rRoot.GetDepends());
+            m_pPosition = const_cast<sw::WriterListener*>(m_rRoot.GetDepends());
         if(!m_pPosition)
-            return PTR_CAST(TElementType,Sync());
+            return PTR_CAST(TElementType,static_cast<SwClient*>(Sync()));
         while(GetRightOfPos())
             m_pPosition = GetRightOfPos();
-        if(m_pPosition->IsA(TYPE(TElementType)))
-            return PTR_CAST(TElementType,Sync());
+        if(static_cast<SwClient*>(m_pPosition)->IsA(TYPE(TElementType)))
+            return PTR_CAST(TElementType,static_cast<SwClient*>(Sync()));
         return Previous();
     }
     TElementType* Next()
     {
         if(!IsChanged())
             m_pPosition = GetRightOfPos();
-        while(m_pPosition && !m_pPosition->IsA( TYPE(TElementType) ) )
+        while(m_pPosition && !static_cast<SwClient*>(m_pPosition)->IsA( TYPE(TElementType) ) )
             m_pPosition = GetRightOfPos();
-        return PTR_CAST(TElementType,Sync());
+        return PTR_CAST(TElementType,static_cast<SwClient*>(Sync()));
     }
     TElementType* Previous()
     {
         m_pPosition = GetLeftOfPos();
-        while(m_pPosition && !m_pPosition->IsA( TYPE(TElementType) ) )
+        while(m_pPosition && !static_cast<SwClient*>(m_pPosition)->IsA( TYPE(TElementType) ) )
             m_pPosition = GetLeftOfPos();
-        return PTR_CAST(TElementType,Sync());
+        return PTR_CAST(TElementType,static_cast<SwClient*>(Sync()));
     }
     using sw::ClientIteratorBase::IsChanged;
 };
@@ -339,27 +340,27 @@ template< typename TSource > class SwIterator<SwClient, TSource> SAL_FINAL : pri
 public:
     SwIterator( const TSource& rSrc ) : sw::ClientIteratorBase(rSrc) {}
     SwClient* First()
-        { return GoStart(); }
+        { return static_cast<SwClient*>(GoStart()); }
     SwClient* Last()
     {
         if(!m_pPosition)
-            m_pPosition = const_cast<SwClient*>(m_rRoot.GetDepends());
+            m_pPosition = const_cast<sw::WriterListener*>(m_rRoot.GetDepends());
         if(!m_pPosition)
             return m_pCurrent = nullptr;
         while(GetRightOfPos())
             m_pPosition = GetRightOfPos();
-        return Sync();
+        return static_cast<SwClient*>(Sync());
     }
     SwClient* Next()
     {
         if(!IsChanged())
             m_pPosition = GetRightOfPos();
-        return Sync();
+        return static_cast<SwClient*>(Sync());
     }
     SwClient* Previous()
     {
         m_pPosition = GetLeftOfPos();
-        return Sync();
+        return static_cast<SwClient*>(Sync());
     }
     using sw::ClientIteratorBase::IsChanged;
 };
diff --git a/sw/source/core/fields/expfld.cxx b/sw/source/core/fields/expfld.cxx
index 24ba569..80b9ace 100644
--- a/sw/source/core/fields/expfld.cxx
+++ b/sw/source/core/fields/expfld.cxx
@@ -528,7 +528,7 @@ sal_uLong SwSetExpFieldType::GetSeqFormat()
     if( !GetDepends() )
         return SVX_NUM_ARABIC;
 
-    const SwField *pFld = static_cast<const SwFmtFld*>(GetDepends())->GetField();
+    const SwField *pFld = SwIterator<SwFmtFld,SwSetExpFieldType>(*this).First()->GetField();
     return pFld->GetFormat();
 }
 


More information about the Libreoffice-commits mailing list