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;