sw/inc/IDocumentMarkAccess.hxx | 14 +++--- sw/source/core/doc/docbm.cxx | 74 ++++++++++++++++++------------------ sw/source/core/doc/docfld.cxx | 2 sw/source/core/inc/MarkManager.hxx | 16 +++---- sw/source/uibase/shells/textsh1.cxx | 6 +- 5 files changed, 56 insertions(+), 56 deletions(-)
New commits: commit 3bd2e9db408ebe31e6044ff9e4345692c7496c2d Author: Noel Grandin <noel.gran...@collabora.co.uk> AuthorDate: Mon Aug 5 10:22:06 2024 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Wed Aug 7 09:27:59 2024 +0200 simplify IMark hierarchy (9) use more type-safe container for Bookmark, which also avoids some dynamic_cast Change-Id: I0d2d94e1f6d4129a6e5edde797c042cab6230bac Reviewed-on: https://gerrit.libreoffice.org/c/core/+/171563 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 7ab4262371a0..590d243189d7 100644 --- a/sw/inc/IDocumentMarkAccess.hxx +++ b/sw/inc/IDocumentMarkAccess.hxx @@ -244,11 +244,11 @@ class IDocumentMarkAccess /** returns a STL-like random access iterator to the begin of the sequence the Bookmarks. */ - virtual const_iterator getBookmarksBegin() const =0; + virtual std::vector<sw::mark::Bookmark*>::const_iterator getBookmarksBegin() const =0; /** returns a STL-like random access iterator to the end of the sequence of Bookmarks. */ - virtual const_iterator getBookmarksEnd() const =0; + virtual std::vector<sw::mark::Bookmark*>::const_iterator getBookmarksEnd() const =0; /** returns the number of Bookmarks. */ @@ -262,17 +262,17 @@ class IDocumentMarkAccess @returns an iterator pointing to the bookmark, or getBookmarksEnd() if nothing was found. */ - virtual const_iterator findBookmark(const OUString& rMark) const =0; + virtual std::vector<sw::mark::Bookmark*>::const_iterator findBookmark(const OUString& rMark) const =0; /** Finds the first mark that is starting after. @returns an iterator pointing to the mark, or pointing to getBookmarksEnd() if nothing was found. */ - virtual const_iterator findFirstBookmarkStartsAfter(const SwPosition& rPos) const =0; + virtual std::vector<sw::mark::Bookmark*>::const_iterator findFirstBookmarkStartsAfter(const SwPosition& rPos) const =0; /// Get the innermost bookmark that contains rPos. - virtual sw::mark::MarkBase* getOneInnermostBookmarkFor(const SwPosition& rPos) const = 0; + virtual sw::mark::Bookmark* getOneInnermostBookmarkFor(const SwPosition& rPos) const = 0; // Fieldmarks /** returns a STL-like random access iterator to the begin of the sequence of fieldmarks. @@ -309,11 +309,11 @@ class IDocumentMarkAccess virtual sw::mark::MarkBase* getAnnotationMarkFor(const SwPosition& rPosition) const = 0; // handle and restore text ranges of annotations of tracked deletions // based on the helper bookmarks (which can survive I/O and hiding redlines) - virtual ::sw::mark::MarkBase* makeAnnotationBookmark(const SwPaM& rPaM, + virtual ::sw::mark::Bookmark* makeAnnotationBookmark(const SwPaM& rPaM, const OUString& rProposedName, MarkType eMark, ::sw::mark::InsertMode eMode, SwPosition const* pSepPos = nullptr) = 0; - virtual const_iterator findAnnotationBookmark( const OUString& rName ) 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. diff --git a/sw/source/core/doc/docbm.cxx b/sw/source/core/doc/docbm.cxx index 0ade34e048f8..63ca42ca0e3a 100644 --- a/sw/source/core/doc/docbm.cxx +++ b/sw/source/core/doc/docbm.cxx @@ -174,15 +174,14 @@ namespace rFoundPos = rOtherPosition; } + template<class MarkT> struct CompareIMarkStartsBefore { - bool operator()(SwPosition const& rPos, - const sw::mark::MarkBase* pMark) + bool operator()(SwPosition const& rPos, const MarkT* pMark) { return rPos < pMark->GetMarkStart(); } - bool operator()(const sw::mark::MarkBase* pMark, - SwPosition const& rPos) + bool operator()(const MarkT* pMark, SwPosition const& rPos) { return pMark->GetMarkStart() < rPos; } @@ -193,8 +192,7 @@ namespace template<class MarkT> struct CompareIMarkStartsAfter { - bool operator()(SwPosition const& rPos, - const MarkT* pMark) + bool operator()(SwPosition const& rPos, const MarkT* pMark) { return pMark->GetMarkStart() > rPos; } @@ -323,15 +321,16 @@ namespace return rMarks.end(); }; - MarkManager::container_t::const_iterator lcl_FindMarkAtPos( - MarkManager::container_t& rMarks, + template<class MarkT> + typename std::vector<MarkT*>::const_iterator lcl_FindMarkAtPos( + std::vector<MarkT*>& rMarks, const SwPosition& rPos, const IDocumentMarkAccess::MarkType eType) { for (auto ppCurrentMark = lower_bound( rMarks.begin(), rMarks.end(), rPos, - CompareIMarkStartsBefore()); + CompareIMarkStartsBefore<MarkT>()); ppCurrentMark != rMarks.end(); ++ppCurrentMark) { @@ -341,7 +340,7 @@ namespace break; if(IDocumentMarkAccess::GetType(**ppCurrentMark) == eType) { - return MarkManager::container_t::const_iterator(std::move(ppCurrentMark)); + return ppCurrentMark; } } // reached a mark starting on a later start pos or the end of the @@ -349,15 +348,16 @@ namespace return rMarks.end(); }; - MarkManager::container_t::const_iterator lcl_FindMarkByName( + template<class MarkT> + typename std::vector<MarkT*>::const_iterator lcl_FindMarkByName( const OUString& rName, - const MarkManager::container_t::const_iterator& ppMarksBegin, - const MarkManager::container_t::const_iterator& ppMarksEnd) + const typename std::vector<MarkT*>::const_iterator& ppMarksBegin, + const typename std::vector<MarkT*>::const_iterator& ppMarksEnd) { return find_if( ppMarksBegin, ppMarksEnd, - [&rName] (::sw::mark::MarkBase const*const pMark) { return pMark->GetName() == rName; } ); + [&rName] (MarkT const*const pMark) { return pMark->GetName() == rName; } ); } template<class MarkT> @@ -604,7 +604,7 @@ namespace sw::mark case IDocumentMarkAccess::MarkType::BOOKMARK: case IDocumentMarkAccess::MarkType::CROSSREF_NUMITEM_BOOKMARK: case IDocumentMarkAccess::MarkType::CROSSREF_HEADING_BOOKMARK: - lcl_InsertMarkSorted(m_vBookmarks, pMark.get()); + lcl_InsertMarkSorted(m_vBookmarks, static_cast<Bookmark*>(pMark.get())); break; case IDocumentMarkAccess::MarkType::TEXT_FIELDMARK: case IDocumentMarkAccess::MarkType::CHECKBOX_FIELDMARK: @@ -792,7 +792,7 @@ namespace sw::mark " - Mark is not in my doc."); if ( io_pMark->GetName() == rNewName ) return true; - if (lcl_FindMarkByName(rNewName, m_vAllMarks.begin(), m_vAllMarks.end()) != m_vAllMarks.end()) + if (lcl_FindMarkByName<MarkBase>(rNewName, m_vAllMarks.begin(), m_vAllMarks.end()) != m_vAllMarks.end()) return false; const OUString sOldName(io_pMark->GetName()); io_pMark->SetName(rNewName); @@ -1185,10 +1185,10 @@ namespace sw::mark { case IDocumentMarkAccess::MarkType::BOOKMARK: { - auto const ppBookmark = lcl_FindMark(m_vBookmarks, *ppMark); + auto const ppBookmark = lcl_FindMark(m_vBookmarks, static_cast<sw::mark::Bookmark*>(*ppMark)); if ( ppBookmark != m_vBookmarks.end() ) { - Bookmark* pBookmark = dynamic_cast<Bookmark*>(*ppBookmark); + Bookmark* pBookmark = *ppBookmark; if(pBookmark) pBookmark->sendLOKDeleteCallback(); @@ -1205,7 +1205,7 @@ namespace sw::mark case IDocumentMarkAccess::MarkType::CROSSREF_HEADING_BOOKMARK: case IDocumentMarkAccess::MarkType::CROSSREF_NUMITEM_BOOKMARK: { - auto const ppBookmark = lcl_FindMark(m_vBookmarks, *ppMark); + auto const ppBookmark = lcl_FindMark(m_vBookmarks, static_cast<Bookmark*>(*ppMark)); if ( ppBookmark != m_vBookmarks.end() ) { m_vBookmarks.erase(ppBookmark); @@ -1285,7 +1285,7 @@ namespace sw::mark m_vAllMarks.begin(), m_vAllMarks.end(), pMark->GetMarkStart(), - CompareIMarkStartsBefore()); + CompareIMarkStartsBefore<MarkBase>()); for ( ; it != endIt; ++it) if (*it == pMark) { @@ -1307,12 +1307,12 @@ namespace sw::mark IDocumentMarkAccess::const_iterator MarkManager::findMark(const OUString& rName) const { - return lcl_FindMarkByName(rName, m_vAllMarks.begin(), m_vAllMarks.end()); + return lcl_FindMarkByName<MarkBase>(rName, m_vAllMarks.begin(), m_vAllMarks.end()); } - IDocumentMarkAccess::const_iterator MarkManager::findBookmark(const OUString& rName) const + std::vector<sw::mark::Bookmark*>::const_iterator MarkManager::findBookmark(const OUString& rName) const { - return lcl_FindMarkByName(rName, m_vBookmarks.begin(), m_vBookmarks.end()); + return lcl_FindMarkByName<sw::mark::Bookmark>(rName, m_vBookmarks.begin(), m_vBookmarks.end()); } // find the first Mark that does not start before @@ -1322,7 +1322,7 @@ namespace sw::mark m_vAllMarks.begin(), m_vAllMarks.end(), rPos, - CompareIMarkStartsBefore()); + CompareIMarkStartsBefore<MarkBase>()); } IDocumentMarkAccess::const_iterator MarkManager::getAllMarksBegin() const @@ -1334,10 +1334,10 @@ namespace sw::mark sal_Int32 MarkManager::getAllMarksCount() const { return m_vAllMarks.size(); } - IDocumentMarkAccess::const_iterator MarkManager::getBookmarksBegin() const + std::vector<sw::mark::Bookmark*>::const_iterator MarkManager::getBookmarksBegin() const { return m_vBookmarks.begin(); } - IDocumentMarkAccess::const_iterator MarkManager::getBookmarksEnd() const + std::vector<sw::mark::Bookmark*>::const_iterator MarkManager::getBookmarksEnd() const { return m_vBookmarks.end(); } sal_Int32 MarkManager::getBookmarksCount() const @@ -1353,13 +1353,13 @@ namespace sw::mark // finds the first that is starting after - IDocumentMarkAccess::const_iterator MarkManager::findFirstBookmarkStartsAfter(const SwPosition& rPos) const + std::vector<sw::mark::Bookmark*>::const_iterator MarkManager::findFirstBookmarkStartsAfter(const SwPosition& rPos) const { return std::upper_bound( m_vBookmarks.begin(), m_vBookmarks.end(), rPos, - CompareIMarkStartsAfter<MarkBase>()); + CompareIMarkStartsAfter<sw::mark::Bookmark>()); } Fieldmark* MarkManager::getFieldmarkAt(const SwPosition& rPos) const @@ -1420,16 +1420,16 @@ namespace sw::mark return pMark; } - MarkBase* MarkManager::getOneInnermostBookmarkFor(const SwPosition& rPos) const + sw::mark::Bookmark* MarkManager::getOneInnermostBookmarkFor(const SwPosition& rPos) const { auto it = std::find_if(m_vBookmarks.begin(), m_vBookmarks.end(), - [&rPos](const sw::mark::MarkBase* pMark) + [&rPos](const sw::mark::Bookmark* pMark) { return pMark->IsCoveringPosition(rPos); }); if (it == m_vBookmarks.end()) { return nullptr; } - sw::mark::MarkBase* pBookmark = *it; + sw::mark::Bookmark* pBookmark = *it; // See if any bookmarks after the first hit are closer to rPos. ++it; @@ -1646,7 +1646,7 @@ namespace sw::mark IDocumentMarkAccess::const_iterator MarkManager::findAnnotationMark( const OUString& rName ) const { - return lcl_FindMarkByName( rName, m_vAnnotationMarks.begin(), m_vAnnotationMarks.end() ); + return lcl_FindMarkByName<MarkBase>( rName, m_vAnnotationMarks.begin(), m_vAnnotationMarks.end() ); } MarkBase* MarkManager::getAnnotationMarkFor(const SwPosition& rPos) const @@ -1671,18 +1671,18 @@ namespace sw::mark } // create helper bookmark for annotations on tracked deletions - ::sw::mark::MarkBase* MarkManager::makeAnnotationBookmark(const SwPaM& rPaM, + ::sw::mark::Bookmark* MarkManager::makeAnnotationBookmark(const SwPaM& rPaM, const OUString& rName, const IDocumentMarkAccess::MarkType eType, sw::mark::InsertMode const eMode, SwPosition const*const pSepPos) { OUString sAnnotationBookmarkName(rName + S_ANNOTATION_BOOKMARK); - return makeMark( rPaM, sAnnotationBookmarkName, eType, eMode, pSepPos); + return static_cast<sw::mark::Bookmark*>(makeMark( rPaM, sAnnotationBookmarkName, eType, eMode, pSepPos)); } // find helper bookmark of annotations on tracked deletions - IDocumentMarkAccess::const_iterator MarkManager::findAnnotationBookmark(const OUString& rName) const + std::vector<sw::mark::Bookmark*>::const_iterator MarkManager::findAnnotationBookmark(const OUString& rName) const { OUString sAnnotationBookmarkName(rName + S_ANNOTATION_BOOKMARK); return findBookmark(sAnnotationBookmarkName); @@ -1733,7 +1733,7 @@ namespace sw::mark return newName; } - if (lcl_FindMarkByName(rName, m_vAllMarks.begin(), m_vAllMarks.end()) == m_vAllMarks.end()) + if (lcl_FindMarkByName<MarkBase>(rName, m_vAllMarks.begin(), m_vAllMarks.end()) == m_vAllMarks.end()) { return rName; } @@ -1751,7 +1751,7 @@ namespace sw::mark { sTmp = aPrefix + OUString::number(nCnt); nCnt++; - if (lcl_FindMarkByName(sTmp, m_vAllMarks.begin(), m_vAllMarks.end()) == m_vAllMarks.end()) + if (lcl_FindMarkByName<MarkBase>(sTmp, m_vAllMarks.begin(), m_vAllMarks.end()) == m_vAllMarks.end()) { break; } diff --git a/sw/source/core/doc/docfld.cxx b/sw/source/core/doc/docfld.cxx index 4f7ca94994df..1507211b8010 100644 --- a/sw/source/core/doc/docfld.cxx +++ b/sw/source/core/doc/docfld.cxx @@ -922,7 +922,7 @@ void SwDocUpdateField::MakeFieldList_( SwDoc& rDoc, int eGetMode ) auto const& rIDMA(*rDoc.getIDocumentMarkAccess()); for (auto it = rIDMA.getBookmarksBegin(); it != rIDMA.getBookmarksEnd(); ++it) { - auto const pBookmark(dynamic_cast<::sw::mark::Bookmark const*>(*it)); + ::sw::mark::Bookmark const* const pBookmark(*it); assert(pBookmark); if (!pBookmark->GetHideCondition().isEmpty()) { diff --git a/sw/source/core/inc/MarkManager.hxx b/sw/source/core/inc/MarkManager.hxx index bcd4a8f3d0df..a737662bb85f 100644 --- a/sw/source/core/inc/MarkManager.hxx +++ b/sw/source/core/inc/MarkManager.hxx @@ -85,12 +85,12 @@ namespace sw::mark { // bookmarks virtual bool isBookmarkDeleted(SwPaM const& rPaM, bool isReplace) const override; - virtual const_iterator getBookmarksBegin() const override; - virtual const_iterator getBookmarksEnd() const override; + virtual std::vector<sw::mark::Bookmark*>::const_iterator getBookmarksBegin() const override; + virtual std::vector<sw::mark::Bookmark*>::const_iterator getBookmarksEnd() const override; virtual sal_Int32 getBookmarksCount() const override; - virtual const_iterator findBookmark(const OUString& rName) const override; - virtual const_iterator findFirstBookmarkStartsAfter(const SwPosition& rPos) const override; - virtual ::sw::mark::MarkBase* getOneInnermostBookmarkFor(const SwPosition& rPos) const override; + virtual std::vector<sw::mark::Bookmark*>::const_iterator findBookmark(const OUString& rName) const override; + virtual std::vector<sw::mark::Bookmark*>::const_iterator findFirstBookmarkStartsAfter(const SwPosition& rPos) const override; + virtual ::sw::mark::Bookmark* getOneInnermostBookmarkFor(const SwPosition& rPos) const override; // Fieldmarks virtual std::vector<Fieldmark*>::const_iterator getFieldmarksBegin() const override; @@ -126,11 +126,11 @@ namespace sw::mark { typedef std::vector<sw::mark::MarkBase*> container_t; // helper bookmark to store annotation range of redlines - virtual ::sw::mark::MarkBase* makeAnnotationBookmark(const SwPaM& rPaM, + virtual ::sw::mark::Bookmark* makeAnnotationBookmark(const SwPaM& rPaM, const OUString& rName, IDocumentMarkAccess::MarkType eMark, sw::mark::InsertMode eMode, SwPosition const* pSepPos = nullptr) override; - virtual const_iterator findAnnotationBookmark( const OUString& rName ) const override; + virtual std::vector<sw::mark::Bookmark*>::const_iterator findAnnotationBookmark( const OUString& rName ) const override; virtual void restoreAnnotationMarks(bool bDelete = true) override; private: @@ -148,7 +148,7 @@ namespace sw::mark { container_t m_vAllMarks; // additional container for bookmarks - container_t m_vBookmarks; + std::vector<sw::mark::Bookmark*> m_vBookmarks; // additional container for fieldmarks std::vector<sw::mark::Fieldmark*> m_vFieldmarks; diff --git a/sw/source/uibase/shells/textsh1.cxx b/sw/source/uibase/shells/textsh1.cxx index f559fdc17792..68e0483b0b89 100644 --- a/sw/source/uibase/shells/textsh1.cxx +++ b/sw/source/uibase/shells/textsh1.cxx @@ -556,7 +556,7 @@ void UpdateBookmarks(SfxRequest& rReq, SwWrtShell& rWrtSh) bool bSortMarks = false; for (auto it = rIDMA.getBookmarksBegin(); it != rIDMA.getBookmarksEnd(); ++it) { - auto pMark = dynamic_cast<sw::mark::Bookmark*>(*it); + sw::mark::Bookmark* pMark = *it; assert(pMark); if (!pMark->GetName().startsWith(aBookmarkNamePrefix)) { @@ -637,7 +637,7 @@ void UpdateBookmark(SfxRequest& rReq, SwWrtShell& rWrtSh) IDocumentMarkAccess& rIDMA = *rWrtSh.GetDoc()->getIDocumentMarkAccess(); SwPosition& rCursor = *rWrtSh.GetCursor()->GetPoint(); - auto pBookmark = dynamic_cast<sw::mark::Bookmark*>(rIDMA.getOneInnermostBookmarkFor(rCursor)); + sw::mark::Bookmark* pBookmark = rIDMA.getOneInnermostBookmarkFor(rCursor); if (!pBookmark || !pBookmark->GetName().startsWith(aBookmarkNamePrefix)) { return; @@ -721,7 +721,7 @@ void DeleteBookmarks(SfxRequest& rReq, SwWrtShell& rWrtSh) std::vector<sw::mark::MarkBase*> aRemovals; for (auto it = pMarkAccess->getBookmarksBegin(); it != pMarkAccess->getBookmarksEnd(); ++it) { - auto pBookmark = dynamic_cast<sw::mark::Bookmark*>(*it); + sw::mark::Bookmark* pBookmark = *it; assert(pBookmark); if (!aBookmarkNamePrefix.isEmpty())