sw/source/core/doc/docbm.cxx |   36 ++++++++++++++++++++++++++++++------
 1 file changed, 30 insertions(+), 6 deletions(-)

New commits:
commit 1cb43ae6b3737367fdc7d9465bb084604da59778
Author:     Noel Grandin <noel.gran...@collabora.co.uk>
AuthorDate: Mon Aug 5 14:01:09 2024 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Mon Aug 26 17:54:24 2024 +0200

    reduce use of dynamic_cast in marks
    
    which is hit quite hard during import of documents with lots of marks,
    mostly because of the resorting that occurs in
    ContentIdxStoreImpl::Restore
    
    Change-Id: I1e5e3d8cfc0e65f9bf74449df8e048cd061022ec
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/171522
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>
    Tested-by: Jenkins
    (cherry picked from commit 900af9c53788d5d274900f796e3aee14926abf2d)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/171529
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>

diff --git a/sw/source/core/doc/docbm.cxx b/sw/source/core/doc/docbm.cxx
index 755317b27c44..5ce1a6307d27 100644
--- a/sw/source/core/doc/docbm.cxx
+++ b/sw/source/core/doc/docbm.cxx
@@ -183,6 +183,8 @@ bool IDocumentMarkAccess::iterator::operator>=(iterator 
const& rOther) const
     return *m_pIter >= *rOther.m_pIter;
 }
 
+static bool IsAnnotationMark(const sw::mark::MarkBase& rBkmk);
+static bool IsCrossRefBookmark(const sw::mark::MarkBase& rBkmk);
 
 namespace
 {
@@ -231,13 +233,13 @@ namespace
         {   // consistency with SwPosition::operator<
             return pSecondNode != nullptr;
         }
-        auto *const pCRFirst (dynamic_cast<::sw::mark::CrossRefBookmark 
const*>(pFirst));
-        auto *const pCRSecond(dynamic_cast<::sw::mark::CrossRefBookmark 
const*>(pSecond));
-        if ((pCRFirst == nullptr) == (pCRSecond == nullptr))
+        bool const bCRFirst (IsCrossRefBookmark(*pFirst));
+        bool const bCRSecond(IsCrossRefBookmark(*pSecond));
+        if (bCRFirst == bCRSecond)
         {
             return false; // equal
         }
-        return pCRFirst != nullptr; // cross-ref sorts *before*
+        return bCRFirst; // cross-ref sorts *before*
     }
 
     bool lcl_MarkOrderingByEnd(const ::sw::mark::MarkBase *const pFirst,
@@ -385,7 +387,7 @@ namespace
         const bool bChangedOPos,
         MarkBase* io_pMark )
     {
-        if ( IDocumentMarkAccess::GetType(*io_pMark) == 
IDocumentMarkAccess::MarkType::ANNOTATIONMARK )
+        if ( IsAnnotationMark(*io_pMark) )
         {
             // annotation marks are allowed to span a table cell range.
             // but trigger sorting to be save
@@ -506,6 +508,28 @@ namespace
     };
 }
 
+static bool IsNavigatorReminder(const MarkBase& rBkmk)
+{
+    const std::type_info* const pMarkTypeInfo = &typeid(rBkmk);
+    // not using dynamic_cast<> here for performance
+    return (*pMarkTypeInfo == typeid(NavigatorReminder));
+}
+
+static bool IsCrossRefBookmark(const sw::mark::MarkBase& rBkmk)
+{
+    // not using dynamic_cast<> here for performance
+    const std::type_info* const pMarkTypeInfo = &typeid(rBkmk);
+    return (*pMarkTypeInfo == typeid(CrossRefHeadingBookmark))
+        || (*pMarkTypeInfo == typeid(CrossRefNumItemBookmark));
+}
+
+static bool IsAnnotationMark(const sw::mark::MarkBase& rBkmk)
+{
+    // not using dynamic_cast<> here for performance
+    const std::type_info* const pMarkTypeInfo = &typeid(rBkmk);
+    return (*pMarkTypeInfo == typeid(AnnotationMark));
+}
+
 IDocumentMarkAccess::MarkType IDocumentMarkAccess::GetType(const IMark& rBkmk)
 {
     const std::type_info* const pMarkTypeInfo = &typeid(rBkmk);
@@ -1017,7 +1041,7 @@ namespace sw::mark
         assert(pMark);
         // navigator marks should not be moved
         // TODO: Check if this might make them invalid
-        if (IDocumentMarkAccess::GetType(*pMark) == 
IDocumentMarkAccess::MarkType::NAVIGATOR_REMINDER)
+        if (IsNavigatorReminder(*pMark))
         {
             return false;
         }

Reply via email to