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())

Reply via email to