sw/inc/IDocumentMarkAccess.hxx         |    7 +------
 sw/source/core/doc/docbm.cxx           |   24 ++++++++++++++----------
 sw/source/core/inc/MarkManager.hxx     |    2 +-
 sw/source/core/unocore/unoportenum.cxx |   13 +++++--------
 4 files changed, 21 insertions(+), 25 deletions(-)

New commits:
commit 9d1f0f58c6e4e343736c8fae3dbcb70de64a7c9f
Author:     Noel Grandin <noel.gran...@collabora.co.uk>
AuthorDate: Sat Aug 10 09:55:51 2024 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Mon Aug 12 13:18:40 2024 +0200

    speedup lcl_FillAnnotationStartArray
    
    we can binary search for the start position
    
    Change-Id: Id87d33a191b0a0dcda90aeb149a9e7da4dfd5d18
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/171712
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>
    Tested-by: Jenkins

diff --git a/sw/inc/IDocumentMarkAccess.hxx b/sw/inc/IDocumentMarkAccess.hxx
index 1f838c9730e0..bfec4c53bfcd 100644
--- a/sw/inc/IDocumentMarkAccess.hxx
+++ b/sw/inc/IDocumentMarkAccess.hxx
@@ -327,14 +327,9 @@ class IDocumentMarkAccess
             an iterator pointing to the mark, or pointing to 
getAnnotationMarksEnd() if nothing was found.
         */
         virtual std::vector<sw::mark::AnnotationMark*>::const_iterator 
findFirstAnnotationMarkNotStartsBefore(const SwPosition& rPos) const =0;
+        virtual std::vector<sw::mark::AnnotationMark*>::const_iterator 
findFirstAnnotationMarkNotStartsBefore(const SwNode& rPos) const =0;
         virtual std::vector<sw::mark::Bookmark*>::const_iterator 
findAnnotationBookmark( const OUString& rName ) const = 0;
         virtual void restoreAnnotationMarks(bool bDelete = true) = 0;
-        /** Finds the first mark that is starting after.
-
-            @returns
-            an iterator pointing to the mark, or pointing to 
getAnnotationMarksEnd() if nothing was found.
-        */
-        virtual std::vector<sw::mark::AnnotationMark*>::const_iterator 
findFirstAnnotationStartsAfter(const SwPosition& rPos) const =0;
 
         /** Returns the MarkType used to create the mark
         */
diff --git a/sw/source/core/doc/docbm.cxx b/sw/source/core/doc/docbm.cxx
index 40cde87499fa..1c5a278b97ca 100644
--- a/sw/source/core/doc/docbm.cxx
+++ b/sw/source/core/doc/docbm.cxx
@@ -211,6 +211,10 @@ namespace
         {
             return pMark->GetMarkStart() < rPos;
         }
+        bool operator()(const  MarkT* pMark, SwNode const& rPos)
+        {
+            return pMark->GetMarkStart().GetNode() < rPos;
+        }
     };
 
     // Apple llvm-g++ 4.2.1 with _GLIBCXX_DEBUG won't eat boost::bind for this
@@ -1686,16 +1690,6 @@ namespace sw::mark
         return *pAnnotationMark;
     }
 
-    // finds the first that is starting after
-    std::vector<sw::mark::AnnotationMark*>::const_iterator 
MarkManager::findFirstAnnotationStartsAfter(const SwPosition& rPos) const
-    {
-        return std::upper_bound(
-            m_vAnnotationMarks.begin(),
-            m_vAnnotationMarks.end(),
-            rPos,
-            CompareIMarkStartsAfter<AnnotationMark>());
-    }
-
     // create helper bookmark for annotations on tracked deletions
     ::sw::mark::Bookmark* MarkManager::makeAnnotationBookmark(const SwPaM& 
rPaM,
         const OUString& rName,
@@ -1716,6 +1710,16 @@ namespace sw::mark
                 CompareIMarkStartsBefore<AnnotationMark>());
     }
 
+    // find the first AnnotationMark that does not start before
+    std::vector<sw::mark::AnnotationMark*>::const_iterator 
MarkManager::findFirstAnnotationMarkNotStartsBefore(const SwNode& rPos) const
+    {
+        return std::lower_bound(
+                m_vAnnotationMarks.begin(),
+                m_vAnnotationMarks.end(),
+                rPos,
+                CompareIMarkStartsBefore<AnnotationMark>());
+    }
+
     // find helper bookmark of annotations on tracked deletions
     std::vector<sw::mark::Bookmark*>::const_iterator 
MarkManager::findAnnotationBookmark(const OUString& rName) const
     {
diff --git a/sw/source/core/inc/MarkManager.hxx 
b/sw/source/core/inc/MarkManager.hxx
index 18886256ba98..b174a13fa54f 100644
--- a/sw/source/core/inc/MarkManager.hxx
+++ b/sw/source/core/inc/MarkManager.hxx
@@ -120,7 +120,6 @@ namespace sw::mark {
             virtual sal_Int32 getAnnotationMarksCount() const override;
             virtual std::vector<sw::mark::AnnotationMark*>::const_iterator 
findAnnotationMark( const OUString& rName ) const override;
             virtual sw::mark::AnnotationMark* getAnnotationMarkFor(const 
SwPosition& rPos) const override;
-            virtual std::vector<sw::mark::AnnotationMark*>::const_iterator 
findFirstAnnotationStartsAfter(const SwPosition& rPos) const override;
 
             virtual void assureSortedMarkContainers() const override;
             virtual void assureSortedMarkContainers(sal_Int32 
nMinIndexModified) const override;
@@ -133,6 +132,7 @@ namespace sw::mark {
                 sw::mark::InsertMode eMode,
                 SwPosition const* pSepPos = nullptr) override;
             virtual std::vector<sw::mark::AnnotationMark*>::const_iterator 
findFirstAnnotationMarkNotStartsBefore(const SwPosition& rPos) const override;
+            virtual std::vector<sw::mark::AnnotationMark*>::const_iterator 
findFirstAnnotationMarkNotStartsBefore(const SwNode& rPos) const override;
             virtual std::vector<sw::mark::Bookmark*>::const_iterator 
findAnnotationBookmark( const OUString& rName ) const override;
             virtual void restoreAnnotationMarks(bool bDelete = true) override;
 
diff --git a/sw/source/core/unocore/unoportenum.cxx 
b/sw/source/core/unocore/unoportenum.cxx
index 33a17b85eeb9..a2dc0ff1408b 100644
--- a/sw/source/core/unocore/unoportenum.cxx
+++ b/sw/source/core/unocore/unoportenum.cxx
@@ -264,22 +264,19 @@ namespace
             return;
         }
 
-        // no need to consider annotation marks starting after aEndOfPara
-        SwContentNode& rPtNd = 
*rUnoCursor.GetPoint()->GetNode().GetContentNode();
-        SwPosition aEndOfPara( rPtNd, rPtNd.Len() );
-        const auto pCandidatesEnd =
-            pMarkAccess->findFirstAnnotationStartsAfter(aEndOfPara);
-
         // search for all annotation marks that have its start position in 
this paragraph
         const SwNode& rOwnNode = rUnoCursor.GetPoint()->GetNode();
-        for( auto ppMark = pMarkAccess->getAnnotationMarksBegin();
+        const auto pCandidatesEnd = pMarkAccess->getAnnotationMarksEnd();
+        for( auto ppMark = 
pMarkAccess->findFirstAnnotationMarkNotStartsBefore(rOwnNode);
              ppMark != pCandidatesEnd;
              ++ppMark )
         {
             ::sw::mark::AnnotationMark* const pAnnotationMark = *ppMark;
             assert(pAnnotationMark);
-
             const SwPosition& rStartPos = pAnnotationMark->GetMarkStart();
+            // no need to consider annotation marks starting after
+            if (rStartPos.GetNode() > rOwnNode)
+                break;
             if (rStartPos.GetNode() != rOwnNode)
                 continue;
 

Reply via email to