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; }