sw/Library_sw.mk | 1 sw/inc/edimp.hxx | 21 +---- sw/inc/pam.hxx | 3 sw/inc/ring.hxx | 139 ++++++++++++++++++++++++++++++++++---- sw/inc/viewsh.hxx | 3 sw/qa/core/uwriter.cxx | 54 ++++++++++++++ sw/source/core/access/accpara.cxx | 2 sw/source/core/bastyp/ring.cxx | 88 ------------------------ sw/source/core/crsr/crsrsh.cxx | 2 sw/source/core/crsr/findattr.cxx | 11 +-- sw/source/core/crsr/findtxt.cxx | 9 +- sw/source/core/crsr/unocrsr.cxx | 2 sw/source/core/doc/doccomp.cxx | 9 +- sw/source/core/doc/doccorr.cxx | 71 +++++++------------ sw/source/core/doc/docnew.cxx | 2 sw/source/core/edit/acorrect.cxx | 10 +- sw/source/core/edit/autofmt.cxx | 5 - 17 files changed, 245 insertions(+), 187 deletions(-)
New commits: commit 2d28ed7b0ef302b9f6923ad02822882357b6d1aa Author: Bjoern Michaelsen <bjoern.michael...@canonical.com> Date: Mon Dec 1 20:50:33 2014 +0100 kill FOREACHPAM_START_CONST it was used for iterations with non-const operations only anyway Change-Id: I63b0c1b3a58ff940820f469e586369cb2a255df7 diff --git a/sw/inc/edimp.hxx b/sw/inc/edimp.hxx index 5d2e813..9f22e64 100644 --- a/sw/inc/edimp.hxx +++ b/sw/inc/edimp.hxx @@ -31,15 +31,10 @@ class SwNodeIndex; #define PCURCRSR (static_cast<SwPaM *>(&__r)) #define FOREACHPAM_START(pCURSH) \ - BOOST_FOREACH(SwPaM& __r, std::make_pair(static_cast< SwPaM* >(pCURSH)->beginRing(), static_cast< SwPaM* >(pCURSH)->endRing())) \ - { - -#define FOREACHPAM_START_CONST(pCURSH) \ - BOOST_FOREACH(SwPaM& __r, std::make_pair(pCURSH->beginRing(), pCURSH->endRing())) \ + BOOST_FOREACH(SwPaM& __r, std::make_pair((pCURSH)->beginRing(), (pCURSH)->endRing())) \ { #define FOREACHPAM_END() } -#define FOREACHPAM_END_CONST() } struct SwPamRange { diff --git a/sw/source/core/doc/doccorr.cxx b/sw/source/core/doc/doccorr.cxx index 2698a9a..67f6c95 100644 --- a/sw/source/core/doc/doccorr.cxx +++ b/sw/source/core/doc/doccorr.cxx @@ -261,9 +261,11 @@ void PaMCorrRel( const SwNodeIndex &rOldNode, } while ( (_pStkCrsr != 0 ) && ((_pStkCrsr = static_cast<SwPaM *>(_pStkCrsr->GetNext())) != pCrsrShell->GetStkCrsr()) ); - FOREACHPAM_START_CONST( pCrsrShell->_GetCrsr() ) - lcl_PaMCorrRel1( PCURCRSR, pOldNode, aNewPos, nCntIdx); - FOREACHPAM_END() + SwPaM* pStartPaM = pCrsrShell->_GetCrsr(); + BOOST_FOREACH(SwPaM& rPaM, std::make_pair(pStartPaM->beginRing(), pStartPaM->endRing())) + { + lcl_PaMCorrRel1( &rPaM, pOldNode, aNewPos, nCntIdx); + } if( pCrsrShell->IsTableMode() ) lcl_PaMCorrRel1( pCrsrShell->GetTblCrs(), pOldNode, aNewPos, nCntIdx ); commit d57baa3d5d197c6620078104cca57fd8104012f6 Author: Bjoern Michaelsen <bjoern.michael...@canonical.com> Date: Mon Dec 1 20:37:40 2014 +0100 const iterators Change-Id: I129b51c2e736e04287141c0eae8c212c179a3475 diff --git a/sw/inc/edimp.hxx b/sw/inc/edimp.hxx index a6dbcaf..5d2e813 100644 --- a/sw/inc/edimp.hxx +++ b/sw/inc/edimp.hxx @@ -34,7 +34,9 @@ class SwNodeIndex; BOOST_FOREACH(SwPaM& __r, std::make_pair(static_cast< SwPaM* >(pCURSH)->beginRing(), static_cast< SwPaM* >(pCURSH)->endRing())) \ { -#define FOREACHPAM_START_CONST(pCURSH) FOREACHPAM_START(pCURSH) +#define FOREACHPAM_START_CONST(pCURSH) \ + BOOST_FOREACH(SwPaM& __r, std::make_pair(pCURSH->beginRing(), pCURSH->endRing())) \ + { #define FOREACHPAM_END() } #define FOREACHPAM_END_CONST() } diff --git a/sw/inc/ring.hxx b/sw/inc/ring.hxx index d5eb30b..b4d4043 100644 --- a/sw/inc/ring.hxx +++ b/sw/inc/ring.hxx @@ -53,7 +53,7 @@ namespace sw Ring( T* ); public: typedef RingIterator<T> iterator; - typedef RingIterator<T> const_iterator; + typedef RingIterator<const T> const_iterator; virtual ~Ring() { algo::unlink(static_cast< T* >(this)); }; void MoveTo( T* pDestRing ); @@ -65,6 +65,8 @@ namespace sw // also derive from other STL containers (which is bad anyway, but ...) iterator beginRing(); iterator endRing(); + const_iterator beginRing() const; + const_iterator endRing() const; sal_uInt32 numberOf() const { return algo::count(static_cast< const T* >(this)); } @@ -142,6 +144,13 @@ namespace sw inline typename Ring<T>::iterator Ring<T>::endRing() { return Ring<T>::iterator(static_cast< T* >(this), false); }; + template <class T> + inline typename Ring<T>::const_iterator Ring<T>::beginRing() const + { return Ring<T>::const_iterator(static_cast< const T* >(this)); }; + + template <class T> + inline typename Ring<T>::const_iterator Ring<T>::endRing() const + { return Ring<T>::const_iterator(static_cast< const T* >(this), false); }; } #endif diff --git a/sw/source/core/doc/doccorr.cxx b/sw/source/core/doc/doccorr.cxx index 6f9d1a2..2698a9a 100644 --- a/sw/source/core/doc/doccorr.cxx +++ b/sw/source/core/doc/doccorr.cxx @@ -33,29 +33,6 @@ #include <hints.hxx> #include <edimp.hxx> -/* - * Macros to iterate over all CrsrShells - */ - -#define PCURSH_CONST static_cast<const SwCrsrShell*>(_pStartShell) - -#define FOREACHSHELL_START( pEShell ) \ - {\ - SwViewShell const *_pStartShell = pEShell; \ - do { \ - if( _pStartShell->IsA( TYPE( SwCrsrShell )) ) \ - { - -#define FOREACHSHELL_END( pEShell ) \ - } \ - } while((_pStartShell = static_cast<SwViewShell const*>(_pStartShell->GetNext()))!= pEShell ); \ - } - -#define FOREACHSHELL_END_CONST( pEShell ) \ - } \ - } while((_pStartShell = static_cast<SwViewShell const*>(_pStartShell->GetNext()))!= pEShell ); \ - } - namespace { /// find the relevant section in which the SwUnoCrsr may wander. @@ -122,22 +99,25 @@ void PaMCorrAbs( const SwPaM& rRange, if( pShell ) { - FOREACHSHELL_START( pShell ) - SwPaM *_pStkCrsr = PCURSH_CONST->GetStkCrsr(); + BOOST_FOREACH(const SwViewShell& rShell, std::make_pair(pShell->beginRing(), pShell->endRing())) + { + if(!rShell.IsA( TYPE( SwCrsrShell ))) + continue; + const SwCrsrShell* pCrsrShell = static_cast<const SwCrsrShell*>(&rShell); + SwPaM *_pStkCrsr = pCrsrShell->GetStkCrsr(); if( _pStkCrsr ) do { lcl_PaMCorrAbs( *_pStkCrsr, aStart, aEnd, aNewPos ); } while ( (_pStkCrsr != 0 ) && - ((_pStkCrsr = static_cast<SwPaM *>(_pStkCrsr->GetNext())) != PCURSH_CONST->GetStkCrsr()) ); - - FOREACHPAM_START_CONST( const_cast< SwShellCrsr* >(PCURSH_CONST->_GetCrsr()) ) - lcl_PaMCorrAbs( const_cast<SwPaM &>(*PCURCRSR), aStart, aEnd, aNewPos ); - FOREACHPAM_END_CONST() + ((_pStkCrsr = static_cast<SwPaM *>(_pStkCrsr->GetNext())) != pCrsrShell->GetStkCrsr()) ); - if( PCURSH_CONST->IsTableMode() ) - lcl_PaMCorrAbs( const_cast<SwPaM &>(*PCURSH_CONST->GetTblCrs()), aStart, aEnd, aNewPos ); + FOREACHPAM_START( const_cast<SwShellCrsr*>(pCrsrShell->_GetCrsr()) ) + lcl_PaMCorrAbs( *PCURCRSR, aStart, aEnd, aNewPos ); + FOREACHPAM_END() - FOREACHSHELL_END_CONST( pShell ) + if( pCrsrShell->IsTableMode() ) + lcl_PaMCorrAbs( const_cast<SwPaM &>(*pCrsrShell->GetTblCrs()), aStart, aEnd, aNewPos ); + } } { SwUnoCrsrTbl& rTbl = const_cast<SwUnoCrsrTbl&>(pDoc->GetUnoCrsrTbl()); @@ -269,22 +249,25 @@ void PaMCorrRel( const SwNodeIndex &rOldNode, SwCrsrShell const* pShell = pDoc->GetEditShell(); if( pShell ) { - FOREACHSHELL_START( pShell ) - SwPaM *_pStkCrsr = PCURSH_CONST->GetStkCrsr(); + BOOST_FOREACH(const SwViewShell& rShell, std::make_pair(pShell->beginRing(), pShell->endRing())) + { + if(!rShell.IsA( TYPE( SwCrsrShell ))) + continue; + SwCrsrShell* pCrsrShell = const_cast<SwCrsrShell*>(static_cast<const SwCrsrShell*>(&rShell)); + SwPaM *_pStkCrsr = pCrsrShell->GetStkCrsr(); if( _pStkCrsr ) do { lcl_PaMCorrRel1( _pStkCrsr, pOldNode, aNewPos, nCntIdx ); } while ( (_pStkCrsr != 0 ) && - ((_pStkCrsr = static_cast<SwPaM *>(_pStkCrsr->GetNext())) != PCURSH_CONST->GetStkCrsr()) ); + ((_pStkCrsr = static_cast<SwPaM *>(_pStkCrsr->GetNext())) != pCrsrShell->GetStkCrsr()) ); - FOREACHPAM_START_CONST( const_cast< SwShellCrsr* >(PCURSH_CONST->_GetCrsr()) ) - lcl_PaMCorrRel1( const_cast<SwPaM *>(PCURCRSR), pOldNode, aNewPos, nCntIdx); + FOREACHPAM_START_CONST( pCrsrShell->_GetCrsr() ) + lcl_PaMCorrRel1( PCURCRSR, pOldNode, aNewPos, nCntIdx); FOREACHPAM_END() - if( PCURSH_CONST->IsTableMode() ) - lcl_PaMCorrRel1( const_cast<SwPaM *>(PCURSH_CONST->GetTblCrs()), pOldNode, aNewPos, nCntIdx ); - - FOREACHSHELL_END( pShell ) + if( pCrsrShell->IsTableMode() ) + lcl_PaMCorrRel1( pCrsrShell->GetTblCrs(), pOldNode, aNewPos, nCntIdx ); + } } { SwUnoCrsrTbl& rTbl = (SwUnoCrsrTbl&)pDoc->GetUnoCrsrTbl(); commit 7902e30aab21968648d53356d9d3533bbac17172 Author: Bjoern Michaelsen <bjoern.michael...@canonical.com> Date: Mon Dec 1 19:53:31 2014 +0100 move Ring to sw::Ring Change-Id: I3109185f747b821ee94aae5c58f86768ca30713a diff --git a/sw/inc/pam.hxx b/sw/inc/pam.hxx index 7594210..9e696d8 100644 --- a/sw/inc/pam.hxx +++ b/sw/inc/pam.hxx @@ -155,7 +155,7 @@ void _InitPam(); class SwPaM; /// PaM is Point and Mark: a selection of the document model. -class SW_DLLPUBLIC SwPaM : public Ring<SwPaM> +class SW_DLLPUBLIC SwPaM : public sw::Ring<SwPaM> { SwPosition m_Bound1; SwPosition m_Bound2; diff --git a/sw/inc/ring.hxx b/sw/inc/ring.hxx index cef2eef..d5eb30b 100644 --- a/sw/inc/ring.hxx +++ b/sw/inc/ring.hxx @@ -24,122 +24,125 @@ #include <boost/iterator/iterator_facade.hpp> #include <boost/intrusive/circular_list_algorithms.hpp> -class Ring_node_traits; -template <class T> class RingIterator; - -template <class T> -class SW_DLLPUBLIC Ring +namespace sw { - struct Ring_node_traits - { - typedef T node; - typedef T* node_ptr; - typedef const T* const_node_ptr; - static node_ptr get_next(const_node_ptr n) { return n->GetNext(); }; - static void set_next(node_ptr n, node_ptr next) { n->pNext = next; }; - static node_ptr get_previous(const_node_ptr n) { return n->GetPrev(); }; - static void set_previous(node_ptr n, node_ptr previous) { n->pPrev = previous; }; - }; - friend class Ring_node_traits; - typedef boost::intrusive::circular_list_algorithms<Ring_node_traits> algo; - T* pNext; - T* pPrev; ///< In order to speed up inserting and deleting. + class Ring_node_traits; + template <class T> class RingIterator; -protected: - Ring() - { algo::init_header(static_cast< T* >(this)); } - Ring( T* ); -public: - typedef RingIterator<T> iterator; - typedef RingIterator<T> const_iterator; - virtual ~Ring() - { algo::unlink(static_cast< T* >(this)); }; - void MoveTo( T* pDestRing ); - void MoveRingTo( T* pDestRing ); + template <class T> + class SW_DLLPUBLIC Ring + { + struct Ring_node_traits + { + typedef T node; + typedef T* node_ptr; + typedef const T* const_node_ptr; + static node_ptr get_next(const_node_ptr n) { return n->GetNext(); }; + static void set_next(node_ptr n, node_ptr next) { n->pNext = next; }; + static node_ptr get_previous(const_node_ptr n) { return n->GetPrev(); }; + static void set_previous(node_ptr n, node_ptr previous) { n->pPrev = previous; }; + }; + friend class Ring_node_traits; + typedef boost::intrusive::circular_list_algorithms<Ring_node_traits> algo; + T* pNext; + T* pPrev; ///< In order to speed up inserting and deleting. - T* GetNext() const { return pNext; } - T* GetPrev() const { return pPrev; } - // unfortunately we cant name these STL-conforming, as some derived classes - // also derive from other STL containers (which is bad anyway, but ...) - iterator beginRing(); - iterator endRing(); + protected: + Ring() + { algo::init_header(static_cast< T* >(this)); } + Ring( T* ); + public: + typedef RingIterator<T> iterator; + typedef RingIterator<T> const_iterator; + virtual ~Ring() + { algo::unlink(static_cast< T* >(this)); }; + void MoveTo( T* pDestRing ); + void MoveRingTo( T* pDestRing ); - sal_uInt32 numberOf() const - { return algo::count(static_cast< const T* >(this)); } -}; + T* GetNext() const { return pNext; } + T* GetPrev() const { return pPrev; } + // unfortunately we cant name these STL-conforming, as some derived classes + // also derive from other STL containers (which is bad anyway, but ...) + iterator beginRing(); + iterator endRing(); -template <class T> -inline Ring<T>::Ring( T* pObj ) -{ - T* pThis = static_cast< T* >(this); - if( !pObj ) - algo::init_header(pThis); - else - algo::link_before(pObj, pThis); -} + sal_uInt32 numberOf() const + { return algo::count(static_cast< const T* >(this)); } + }; -template <class T> -inline void Ring<T>::MoveTo(T* pDestRing) -{ - T* pThis = static_cast< T* >(this); - // insert into "new" - if( pDestRing ) + template <class T> + inline Ring<T>::Ring( T* pObj ) { - if(algo::unique(pThis)) - algo::link_before(pDestRing, pThis); + T* pThis = static_cast< T* >(this); + if( !pObj ) + algo::init_header(pThis); else - algo::transfer(pDestRing, pThis); + algo::link_before(pObj, pThis); } - else - algo::unlink(pThis); -} - -template <class T> -inline void Ring<T>::MoveRingTo(T* pDestRing) -{ - std::swap(*(&pPrev->pNext), *(&pDestRing->pPrev->pNext)); - std::swap(*(&pPrev), *(&pDestRing->pPrev)); -} -template <class T> -class RingIterator : public boost::iterator_facade< - RingIterator<T> - , T - , boost::forward_traversal_tag - > -{ - public: - RingIterator() - : m_pCurrent(nullptr) - , m_pStart(nullptr) - {} - explicit RingIterator(T* pRing, bool bStart = true) - : m_pCurrent(nullptr) - , m_pStart(pRing) + template <class T> + inline void Ring<T>::MoveTo(T* pDestRing) + { + T* pThis = static_cast< T* >(this); + // insert into "new" + if( pDestRing ) { - if(!bStart) - m_pCurrent = m_pStart; + if(algo::unique(pThis)) + algo::link_before(pDestRing, pThis); + else + algo::transfer(pDestRing, pThis); } - private: - friend class boost::iterator_core_access; - void increment() - { m_pCurrent = m_pCurrent ? m_pCurrent->GetNext() : m_pStart->GetNext(); } - bool equal(RingIterator const& other) const - { return m_pCurrent == other.m_pCurrent && m_pStart == m_pStart; } - T& dereference() const - { return m_pCurrent ? *m_pCurrent : * m_pStart; } - T* m_pCurrent; - T* m_pStart; -}; + else + algo::unlink(pThis); + } -template <class T> -inline typename Ring<T>::iterator Ring<T>::beginRing() - { return Ring<T>::iterator(static_cast< T* >(this)); }; + template <class T> + inline void Ring<T>::MoveRingTo(T* pDestRing) + { + std::swap(*(&pPrev->pNext), *(&pDestRing->pPrev->pNext)); + std::swap(*(&pPrev), *(&pDestRing->pPrev)); + } + + template <class T> + class RingIterator : public boost::iterator_facade< + RingIterator<T> + , T + , boost::forward_traversal_tag + > + { + public: + RingIterator() + : m_pCurrent(nullptr) + , m_pStart(nullptr) + {} + explicit RingIterator(T* pRing, bool bStart = true) + : m_pCurrent(nullptr) + , m_pStart(pRing) + { + if(!bStart) + m_pCurrent = m_pStart; + } + private: + friend class boost::iterator_core_access; + void increment() + { m_pCurrent = m_pCurrent ? m_pCurrent->GetNext() : m_pStart->GetNext(); } + bool equal(RingIterator const& other) const + { return m_pCurrent == other.m_pCurrent && m_pStart == m_pStart; } + T& dereference() const + { return m_pCurrent ? *m_pCurrent : * m_pStart; } + T* m_pCurrent; + T* m_pStart; + }; + + template <class T> + inline typename Ring<T>::iterator Ring<T>::beginRing() + { return Ring<T>::iterator(static_cast< T* >(this)); }; -template <class T> -inline typename Ring<T>::iterator Ring<T>::endRing() - { return Ring<T>::iterator(static_cast< T* >(this), false); }; + template <class T> + inline typename Ring<T>::iterator Ring<T>::endRing() + { return Ring<T>::iterator(static_cast< T* >(this), false); }; +} #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/inc/viewsh.hxx b/sw/inc/viewsh.hxx index d5608ce..6896e9e 100644 --- a/sw/inc/viewsh.hxx +++ b/sw/inc/viewsh.hxx @@ -95,7 +95,7 @@ enum FrameControlType typedef boost::shared_ptr<SwRootFrm> SwRootFrmPtr; class SwViewShell; -class SW_DLLPUBLIC SwViewShell : public Ring<SwViewShell> +class SW_DLLPUBLIC SwViewShell : public sw::Ring<SwViewShell> { friend void SetOutDev( SwViewShell *pSh, OutputDevice *pOut ); friend void SetOutDevAndWin( SwViewShell *pSh, OutputDevice *pOut, diff --git a/sw/qa/core/uwriter.cxx b/sw/qa/core/uwriter.cxx index 36e8e9a..d2cfaed 100644 --- a/sw/qa/core/uwriter.cxx +++ b/sw/qa/core/uwriter.cxx @@ -1275,9 +1275,9 @@ void SwDocTest::testMarkMove() namespace { - struct TestRing : public Ring<TestRing> + struct TestRing : public sw::Ring<TestRing> { - TestRing() : Ring<TestRing>() {}; + TestRing() : sw::Ring<TestRing>() {}; void debug() { SAL_DEBUG("TestRing at: " << this << " prev: " << GetPrev() << " next: " << GetNext()); diff --git a/sw/source/core/doc/doccomp.cxx b/sw/source/core/doc/doccomp.cxx index 380caef..729323b 100644 --- a/sw/source/core/doc/doccomp.cxx +++ b/sw/source/core/doc/doccomp.cxx @@ -1828,7 +1828,7 @@ long SwDoc::CompareDoc( const SwDoc& rDoc ) } class _SaveMergeRedlines; -class _SaveMergeRedlines : public Ring<_SaveMergeRedlines> +class _SaveMergeRedlines : public sw::Ring<_SaveMergeRedlines> { const SwRangeRedline* pSrcRedl; SwRangeRedline* pDestRedl; commit 6172730c6465c02a925ed07fbce7add390c437fc Author: Bjoern Michaelsen <bjoern.michael...@canonical.com> Date: Mon Dec 1 19:53:02 2014 +0100 no need to use Ring here anymore Change-Id: I868ba712561b10eec91bf254c3fb1cadd5fdb282 diff --git a/sw/source/core/crsr/findattr.cxx b/sw/source/core/crsr/findattr.cxx index 6a70795..ff341f8 100644 --- a/sw/source/core/crsr/findattr.cxx +++ b/sw/source/core/crsr/findattr.cxx @@ -1144,10 +1144,10 @@ int SwFindParaAttr::Find( SwPaM* pCrsr, SwMoveFn fnMove, const SwPaM* pRegion, const sal_Int32 nSttCnt = rSttCntIdx.GetIndex(); // add to shell-cursor-ring so that the regions will be moved enventually - Ring<SwPaM>* pPrevRing(nullptr); + SwPaM* pPrevRing(nullptr); if( bRegExp ) { - pPrevRing = pRegion->GetPrev(); + pPrevRing = const_cast< SwPaM* >(pRegion)->GetPrev(); const_cast< SwPaM* >(pRegion)->MoveRingTo( &rCursor ); } commit 66fc18538b544d62bc51f2fc485cf997433ff990 Author: Bjoern Michaelsen <bjoern.michael...@canonical.com> Date: Mon Dec 1 19:01:26 2014 +0100 use new typesafer implementation Change-Id: I2228b2d421987c71e9738e32d138eccab02ea1db diff --git a/sw/inc/edimp.hxx b/sw/inc/edimp.hxx index b3240b9..a6dbcaf 100644 --- a/sw/inc/edimp.hxx +++ b/sw/inc/edimp.hxx @@ -31,12 +31,10 @@ class SwNodeIndex; #define PCURCRSR (static_cast<SwPaM *>(&__r)) #define FOREACHPAM_START(pCURSH) \ - BOOST_FOREACH(Ring& __r, std::make_pair(static_cast<Ring*>(pCURSH)->beginRing(), static_cast<Ring*>(pCURSH)->endRing())) \ + BOOST_FOREACH(SwPaM& __r, std::make_pair(static_cast< SwPaM* >(pCURSH)->beginRing(), static_cast< SwPaM* >(pCURSH)->endRing())) \ { -#define FOREACHPAM_START_CONST(pCURSH) \ - BOOST_FOREACH(Ring& __r, std::make_pair(const_cast<Ring*>(static_cast<const Ring*>(pCURSH))->beginRing(), const_cast<Ring*>(static_cast<const Ring*>(pCURSH))->endRing())) \ - { +#define FOREACHPAM_START_CONST(pCURSH) FOREACHPAM_START(pCURSH) #define FOREACHPAM_END() } #define FOREACHPAM_END_CONST() } diff --git a/sw/inc/pam.hxx b/sw/inc/pam.hxx index 8614453..7594210 100644 --- a/sw/inc/pam.hxx +++ b/sw/inc/pam.hxx @@ -153,8 +153,9 @@ extern SwGoInDoc fnGoCntntCellsSkipHidden; void _InitPam(); +class SwPaM; /// PaM is Point and Mark: a selection of the document model. -class SW_DLLPUBLIC SwPaM : public Ring +class SW_DLLPUBLIC SwPaM : public Ring<SwPaM> { SwPosition m_Bound1; SwPosition m_Bound2; diff --git a/sw/inc/ring.hxx b/sw/inc/ring.hxx index 90e3465..cef2eef 100644 --- a/sw/inc/ring.hxx +++ b/sw/inc/ring.hxx @@ -25,15 +25,16 @@ #include <boost/intrusive/circular_list_algorithms.hpp> class Ring_node_traits; -class RingIterator; +template <class T> class RingIterator; +template <class T> class SW_DLLPUBLIC Ring { struct Ring_node_traits { - typedef Ring node; - typedef Ring* node_ptr; - typedef const Ring* const_node_ptr; + typedef T node; + typedef T* node_ptr; + typedef const T* const_node_ptr; static node_ptr get_next(const_node_ptr n) { return n->GetNext(); }; static void set_next(node_ptr n, node_ptr next) { n->pNext = next; }; static node_ptr get_previous(const_node_ptr n) { return n->GetPrev(); }; @@ -41,64 +42,69 @@ class SW_DLLPUBLIC Ring }; friend class Ring_node_traits; typedef boost::intrusive::circular_list_algorithms<Ring_node_traits> algo; - Ring* pNext; - Ring* pPrev; ///< In order to speed up inserting and deleting. + T* pNext; + T* pPrev; ///< In order to speed up inserting and deleting. protected: Ring() - { algo::init_header(this); } - Ring( Ring * ); + { algo::init_header(static_cast< T* >(this)); } + Ring( T* ); public: - typedef RingIterator iterator; - typedef RingIterator const_iterator; + typedef RingIterator<T> iterator; + typedef RingIterator<T> const_iterator; virtual ~Ring() - { algo::unlink(this); }; - void MoveTo( Ring *pDestRing ); - void MoveRingTo( Ring *pDestRing ); + { algo::unlink(static_cast< T* >(this)); }; + void MoveTo( T* pDestRing ); + void MoveRingTo( T* pDestRing ); - Ring* GetNext() const { return pNext; } - Ring* GetPrev() const { return pPrev; } + T* GetNext() const { return pNext; } + T* GetPrev() const { return pPrev; } // unfortunately we cant name these STL-conforming, as some derived classes // also derive from other STL containers (which is bad anyway, but ...) iterator beginRing(); iterator endRing(); sal_uInt32 numberOf() const - { return algo::count(this); } + { return algo::count(static_cast< const T* >(this)); } }; -inline Ring::Ring( Ring *pObj ) +template <class T> +inline Ring<T>::Ring( T* pObj ) { + T* pThis = static_cast< T* >(this); if( !pObj ) - algo::init_header(this); + algo::init_header(pThis); else - algo::link_before(pObj, this); + algo::link_before(pObj, pThis); } -inline void Ring::MoveTo(Ring *pDestRing) +template <class T> +inline void Ring<T>::MoveTo(T* pDestRing) { + T* pThis = static_cast< T* >(this); // insert into "new" if( pDestRing ) { - if(algo::unique(this)) - algo::link_before(pDestRing, this); + if(algo::unique(pThis)) + algo::link_before(pDestRing, pThis); else - algo::transfer(pDestRing, this); + algo::transfer(pDestRing, pThis); } else - algo::unlink(this); - + algo::unlink(pThis); } -inline void Ring::MoveRingTo(Ring *pDestRing) +template <class T> +inline void Ring<T>::MoveRingTo(T* pDestRing) { std::swap(*(&pPrev->pNext), *(&pDestRing->pPrev->pNext)); std::swap(*(&pPrev), *(&pDestRing->pPrev)); } +template <class T> class RingIterator : public boost::iterator_facade< - RingIterator - , Ring + RingIterator<T> + , T , boost::forward_traversal_tag > { @@ -107,7 +113,7 @@ class RingIterator : public boost::iterator_facade< : m_pCurrent(nullptr) , m_pStart(nullptr) {} - explicit RingIterator(Ring* pRing, bool bStart = true) + explicit RingIterator(T* pRing, bool bStart = true) : m_pCurrent(nullptr) , m_pStart(pRing) { @@ -120,17 +126,19 @@ class RingIterator : public boost::iterator_facade< { m_pCurrent = m_pCurrent ? m_pCurrent->GetNext() : m_pStart->GetNext(); } bool equal(RingIterator const& other) const { return m_pCurrent == other.m_pCurrent && m_pStart == m_pStart; } - Ring& dereference() const + T& dereference() const { return m_pCurrent ? *m_pCurrent : * m_pStart; } - Ring* m_pCurrent; - Ring* m_pStart; + T* m_pCurrent; + T* m_pStart; }; -inline Ring::iterator Ring::beginRing() - { return Ring::iterator(this); }; +template <class T> +inline typename Ring<T>::iterator Ring<T>::beginRing() + { return Ring<T>::iterator(static_cast< T* >(this)); }; -inline Ring::iterator Ring::endRing() - { return Ring::iterator(this, false); }; +template <class T> +inline typename Ring<T>::iterator Ring<T>::endRing() + { return Ring<T>::iterator(static_cast< T* >(this), false); }; #endif diff --git a/sw/inc/viewsh.hxx b/sw/inc/viewsh.hxx index 7eab337..d5608ce 100644 --- a/sw/inc/viewsh.hxx +++ b/sw/inc/viewsh.hxx @@ -94,7 +94,8 @@ enum FrameControlType #define VSHELLFLAG_SHARELAYOUT ((long)0x2) typedef boost::shared_ptr<SwRootFrm> SwRootFrmPtr; -class SW_DLLPUBLIC SwViewShell : public Ring +class SwViewShell; +class SW_DLLPUBLIC SwViewShell : public Ring<SwViewShell> { friend void SetOutDev( SwViewShell *pSh, OutputDevice *pOut ); friend void SetOutDevAndWin( SwViewShell *pSh, OutputDevice *pOut, diff --git a/sw/qa/core/uwriter.cxx b/sw/qa/core/uwriter.cxx index d8da67b..36e8e9a 100644 --- a/sw/qa/core/uwriter.cxx +++ b/sw/qa/core/uwriter.cxx @@ -1275,9 +1275,9 @@ void SwDocTest::testMarkMove() namespace { - struct TestRing : public Ring + struct TestRing : public Ring<TestRing> { - TestRing() : Ring() {}; + TestRing() : Ring<TestRing>() {}; void debug() { SAL_DEBUG("TestRing at: " << this << " prev: " << GetPrev() << " next: " << GetNext()); @@ -1312,12 +1312,12 @@ void SwDocTest::testIntrusiveRing() std::vector<TestRing*>::iterator ppNext = ppRing+1; if(ppNext==vRings.end()) ppNext = vRings.begin(); - CPPUNIT_ASSERT_EQUAL((*ppRing)->GetNext(), static_cast<Ring*>(*ppNext)); - CPPUNIT_ASSERT_EQUAL((*ppNext)->GetPrev(), static_cast<Ring*>(*ppRing)); + CPPUNIT_ASSERT_EQUAL((*ppRing)->GetNext(), *ppNext); + CPPUNIT_ASSERT_EQUAL((*ppNext)->GetPrev(), *ppRing); } - BOOST_FOREACH(Ring& r, std::make_pair(aRing1.beginRing(), aRing1.endRing())) + BOOST_FOREACH(TestRing& r, std::make_pair(aRing1.beginRing(), aRing1.endRing())) { - TestRing* pRing = dynamic_cast<TestRing*>(&r); + TestRing* pRing = &r; CPPUNIT_ASSERT(pRing); //pRing->debug(); } diff --git a/sw/source/core/access/accpara.cxx b/sw/source/core/access/accpara.cxx index 5978f87..b26e61c 100644 --- a/sw/source/core/access/accpara.cxx +++ b/sw/source/core/access/accpara.cxx @@ -3441,7 +3441,7 @@ sal_Bool SAL_CALL SwAccessibleParagraph::removeSelection( sal_Int32 selectionInd { if( nSelected == 0 ) { - pCrsr->MoveTo((Ring*)0); + pCrsr->MoveTo(nullptr); delete pCrsr; bRet = true; } diff --git a/sw/source/core/crsr/crsrsh.cxx b/sw/source/core/crsr/crsrsh.cxx index 5f6fd0e..33b21d1 100644 --- a/sw/source/core/crsr/crsrsh.cxx +++ b/sw/source/core/crsr/crsrsh.cxx @@ -2406,7 +2406,7 @@ bool SwCrsrShell::IsOverReadOnlyPos( const Point& rPt ) const */ sal_uInt16 SwCrsrShell::GetCrsrCnt( bool bAll ) const { - Ring* pTmp = GetCrsr()->GetNext(); + SwPaM* pTmp = GetCrsr()->GetNext(); sal_uInt16 n = (bAll || ( m_pCurCrsr->HasMark() && *m_pCurCrsr->GetPoint() != *m_pCurCrsr->GetMark())) ? 1 : 0; while( pTmp != m_pCurCrsr ) diff --git a/sw/source/core/crsr/findattr.cxx b/sw/source/core/crsr/findattr.cxx index f7a3165..6a70795 100644 --- a/sw/source/core/crsr/findattr.cxx +++ b/sw/source/core/crsr/findattr.cxx @@ -1144,11 +1144,11 @@ int SwFindParaAttr::Find( SwPaM* pCrsr, SwMoveFn fnMove, const SwPaM* pRegion, const sal_Int32 nSttCnt = rSttCntIdx.GetIndex(); // add to shell-cursor-ring so that the regions will be moved enventually - Ring *pPrevRing = 0; + Ring<SwPaM>* pPrevRing(nullptr); if( bRegExp ) { pPrevRing = pRegion->GetPrev(); - const_cast<Ring*>(static_cast<const Ring*>(pRegion))->MoveRingTo( &rCursor ); + const_cast< SwPaM* >(pRegion)->MoveRingTo( &rCursor ); } boost::scoped_ptr<OUString> pRepl( (bRegExp) ? @@ -1161,11 +1161,12 @@ int SwFindParaAttr::Find( SwPaM* pCrsr, SwMoveFn fnMove, const SwPaM* pRegion, if( bRegExp ) { // and remove region again - Ring *p, *pNext = (Ring*)pRegion; + SwPaM* p; + SwPaM* pNext = const_cast<SwPaM*>(pRegion); do { p = pNext; pNext = p->GetNext(); - p->MoveTo( (Ring*)pRegion ); + p->MoveTo( const_cast<SwPaM*>(pRegion) ); } while( p != pPrevRing ); } rSttCntIdx = nSttCnt; diff --git a/sw/source/core/crsr/findtxt.cxx b/sw/source/core/crsr/findtxt.cxx index d9536ec..66143b3 100644 --- a/sw/source/core/crsr/findtxt.cxx +++ b/sw/source/core/crsr/findtxt.cxx @@ -575,11 +575,11 @@ int SwFindParaText::Find( SwPaM* pCrsr, SwMoveFn fnMove, SwIndex& rSttCntIdx = pCrsr->Start()->nContent; const sal_Int32 nSttCnt = rSttCntIdx.GetIndex(); // add to shell-cursor-ring so that the regions will be moved enventually - Ring *pPrev(0); + SwPaM* pPrev(nullptr); if( bRegExp ) { pPrev = pRegion->GetPrev(); - const_cast<Ring*>(static_cast<const Ring*>(pRegion))->MoveRingTo( &rCursor ); + const_cast<SwPaM*>(pRegion)->MoveRingTo( &rCursor ); } boost::scoped_ptr<OUString> pRepl( (bRegExp) @@ -592,11 +592,12 @@ int SwFindParaText::Find( SwPaM* pCrsr, SwMoveFn fnMove, if( bRegExp ) { // and remove region again - Ring *p, *pNext = (Ring*)pRegion; + SwPaM* p; + SwPaM* pNext(const_cast<SwPaM*>(pRegion)); do { p = pNext; pNext = p->GetNext(); - p->MoveTo( (Ring*)pRegion ); + p->MoveTo( const_cast<SwPaM*>(pRegion) ); } while( p != pPrev ); } pCrsr->Start()->nContent = nSttCnt; diff --git a/sw/source/core/crsr/unocrsr.cxx b/sw/source/core/crsr/unocrsr.cxx index 49785a0..69b7821 100644 --- a/sw/source/core/crsr/unocrsr.cxx +++ b/sw/source/core/crsr/unocrsr.cxx @@ -50,7 +50,7 @@ SwUnoCrsr::~SwUnoCrsr() while( GetNext() != this ) { Ring* pNxt = GetNext(); - pNxt->MoveTo( 0 ); // remove from chain + pNxt->MoveTo(nullptr); // remove from chain delete pNxt; // and delete } } diff --git a/sw/source/core/doc/doccomp.cxx b/sw/source/core/doc/doccomp.cxx index d6fdf69..380caef 100644 --- a/sw/source/core/doc/doccomp.cxx +++ b/sw/source/core/doc/doccomp.cxx @@ -1827,19 +1827,20 @@ long SwDoc::CompareDoc( const SwDoc& rDoc ) return nRet; } -class _SaveMergeRedlines : public Ring +class _SaveMergeRedlines; +class _SaveMergeRedlines : public Ring<_SaveMergeRedlines> { const SwRangeRedline* pSrcRedl; SwRangeRedline* pDestRedl; public: _SaveMergeRedlines( const SwNode& rDstNd, - const SwRangeRedline& rSrcRedl, Ring* pRing ); + const SwRangeRedline& rSrcRedl, _SaveMergeRedlines* pRing ); sal_uInt16 InsertRedline(); }; _SaveMergeRedlines::_SaveMergeRedlines( const SwNode& rDstNd, - const SwRangeRedline& rSrcRedl, Ring* pRing ) - : Ring( pRing ), pSrcRedl( &rSrcRedl ) + const SwRangeRedline& rSrcRedl, _SaveMergeRedlines* pRing ) + : Ring<_SaveMergeRedlines>( pRing ), pSrcRedl( &rSrcRedl ) { SwPosition aPos( rDstNd ); diff --git a/sw/source/core/doc/doccorr.cxx b/sw/source/core/doc/doccorr.cxx index 981b7da..6f9d1a2 100644 --- a/sw/source/core/doc/doccorr.cxx +++ b/sw/source/core/doc/doccorr.cxx @@ -130,7 +130,7 @@ void PaMCorrAbs( const SwPaM& rRange, } while ( (_pStkCrsr != 0 ) && ((_pStkCrsr = static_cast<SwPaM *>(_pStkCrsr->GetNext())) != PCURSH_CONST->GetStkCrsr()) ); - FOREACHPAM_START_CONST( PCURSH_CONST->_GetCrsr() ) + FOREACHPAM_START_CONST( const_cast< SwShellCrsr* >(PCURSH_CONST->_GetCrsr()) ) lcl_PaMCorrAbs( const_cast<SwPaM &>(*PCURCRSR), aStart, aEnd, aNewPos ); FOREACHPAM_END_CONST() @@ -277,7 +277,7 @@ void PaMCorrRel( const SwNodeIndex &rOldNode, } while ( (_pStkCrsr != 0 ) && ((_pStkCrsr = static_cast<SwPaM *>(_pStkCrsr->GetNext())) != PCURSH_CONST->GetStkCrsr()) ); - FOREACHPAM_START_CONST( PCURSH_CONST->_GetCrsr() ) + FOREACHPAM_START_CONST( const_cast< SwShellCrsr* >(PCURSH_CONST->_GetCrsr()) ) lcl_PaMCorrRel1( const_cast<SwPaM *>(PCURCRSR), pOldNode, aNewPos, nCntIdx); FOREACHPAM_END() diff --git a/sw/source/core/doc/docnew.cxx b/sw/source/core/doc/docnew.cxx index c6d353b..ced0f2b 100644 --- a/sw/source/core/doc/docnew.cxx +++ b/sw/source/core/doc/docnew.cxx @@ -486,7 +486,7 @@ SwDoc::~SwDoc() if( mpExtInputRing ) { - Ring* pTmp = mpExtInputRing; + SwPaM* pTmp = mpExtInputRing; mpExtInputRing = 0; while( pTmp->GetNext() != pTmp ) delete pTmp->GetNext(); diff --git a/sw/source/core/edit/acorrect.cxx b/sw/source/core/edit/acorrect.cxx index 6c738e1..440510e 100644 --- a/sw/source/core/edit/acorrect.cxx +++ b/sw/source/core/edit/acorrect.cxx @@ -41,9 +41,10 @@ class _PaMIntoCrsrShellRing { SwCrsrShell& rSh; SwPaM &rDelPam, &rCrsr; - Ring *pPrevDelPam, *pPrevCrsr; + SwPaM* pPrevDelPam; + SwPaM* pPrevCrsr; - void RemoveFromRing( SwPaM& rPam, Ring* pPrev ); + void RemoveFromRing( SwPaM& rPam, SwPaM* pPrev ); public: _PaMIntoCrsrShellRing( SwCrsrShell& rSh, SwPaM& rCrsr, SwPaM& rPam ); ~_PaMIntoCrsrShellRing(); @@ -69,9 +70,10 @@ _PaMIntoCrsrShellRing::~_PaMIntoCrsrShellRing() RemoveFromRing( rCrsr, pPrevCrsr ); } -void _PaMIntoCrsrShellRing::RemoveFromRing( SwPaM& rPam, Ring* pPrev ) +void _PaMIntoCrsrShellRing::RemoveFromRing( SwPaM& rPam, SwPaM* pPrev ) { - Ring *p, *pNext = (Ring*)&rPam; + SwPaM* p; + SwPaM* pNext = &rPam; do { p = pNext; pNext = p->GetNext(); diff --git a/sw/source/core/edit/autofmt.cxx b/sw/source/core/edit/autofmt.cxx index 6b0fada..b639009 100644 --- a/sw/source/core/edit/autofmt.cxx +++ b/sw/source/core/edit/autofmt.cxx @@ -1087,13 +1087,14 @@ void SwAutoFormat::DeleteSel( SwPaM& rDelPam ) SwPaM* pShCrsr = m_pEditShell->_GetCrsr(); SwPaM aTmp( *m_pCurTxtNd, 0, pShCrsr ); - Ring *pPrev = rDelPam.GetPrev(); + SwPaM* pPrev = rDelPam.GetPrev(); rDelPam.MoveRingTo( pShCrsr ); m_pEditShell->DeleteSel( rDelPam ); // and remove Pam again: - Ring *p, *pNext = (Ring*)&rDelPam; + SwPaM* p; + SwPaM* pNext = &rDelPam; do { p = pNext; pNext = p->GetNext(); commit ef5051b59270b324968cb91304fb25f622b80329 Author: Bjoern Michaelsen <bjoern.michael...@canonical.com> Date: Mon Dec 1 16:40:54 2014 +0100 make ring header only Change-Id: If8a52d12cb145120be4477ee79f8cdc55329c36c diff --git a/sw/Library_sw.mk b/sw/Library_sw.mk index d51615b..c475315 100644 --- a/sw/Library_sw.mk +++ b/sw/Library_sw.mk @@ -129,7 +129,6 @@ $(eval $(call gb_Library_add_exception_objects,sw,\ sw/source/core/bastyp/checkit \ sw/source/core/bastyp/index \ sw/source/core/bastyp/init \ - sw/source/core/bastyp/ring \ sw/source/core/bastyp/swcache \ sw/source/core/bastyp/swrect \ sw/source/core/bastyp/swregion \ diff --git a/sw/inc/ring.hxx b/sw/inc/ring.hxx index 4dc0330..90e3465 100644 --- a/sw/inc/ring.hxx +++ b/sw/inc/ring.hxx @@ -22,23 +22,37 @@ #include <swdllapi.h> #include <swtypes.hxx> #include <boost/iterator/iterator_facade.hpp> +#include <boost/intrusive/circular_list_algorithms.hpp> class Ring_node_traits; class RingIterator; class SW_DLLPUBLIC Ring { + struct Ring_node_traits + { + typedef Ring node; + typedef Ring* node_ptr; + typedef const Ring* const_node_ptr; + static node_ptr get_next(const_node_ptr n) { return n->GetNext(); }; + static void set_next(node_ptr n, node_ptr next) { n->pNext = next; }; + static node_ptr get_previous(const_node_ptr n) { return n->GetPrev(); }; + static void set_previous(node_ptr n, node_ptr previous) { n->pPrev = previous; }; + }; friend class Ring_node_traits; + typedef boost::intrusive::circular_list_algorithms<Ring_node_traits> algo; Ring* pNext; Ring* pPrev; ///< In order to speed up inserting and deleting. protected: - Ring(); + Ring() + { algo::init_header(this); } Ring( Ring * ); public: typedef RingIterator iterator; typedef RingIterator const_iterator; - virtual ~Ring(); + virtual ~Ring() + { algo::unlink(this); }; void MoveTo( Ring *pDestRing ); void MoveRingTo( Ring *pDestRing ); @@ -49,9 +63,39 @@ public: iterator beginRing(); iterator endRing(); - sal_uInt32 numberOf() const; + sal_uInt32 numberOf() const + { return algo::count(this); } }; +inline Ring::Ring( Ring *pObj ) +{ + if( !pObj ) + algo::init_header(this); + else + algo::link_before(pObj, this); +} + +inline void Ring::MoveTo(Ring *pDestRing) +{ + // insert into "new" + if( pDestRing ) + { + if(algo::unique(this)) + algo::link_before(pDestRing, this); + else + algo::transfer(pDestRing, this); + } + else + algo::unlink(this); + +} + +inline void Ring::MoveRingTo(Ring *pDestRing) +{ + std::swap(*(&pPrev->pNext), *(&pDestRing->pPrev->pNext)); + std::swap(*(&pPrev), *(&pDestRing->pPrev)); +} + class RingIterator : public boost::iterator_facade< RingIterator , Ring @@ -88,8 +132,6 @@ inline Ring::iterator Ring::beginRing() inline Ring::iterator Ring::endRing() { return Ring::iterator(this, false); }; - - #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/core/bastyp/ring.cxx b/sw/source/core/bastyp/ring.cxx deleted file mode 100644 index b7ce9c0..0000000 --- a/sw/source/core/bastyp/ring.cxx +++ /dev/null @@ -1,80 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * This file incorporates work covered by the following license notice: - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed - * with this work for additional information regarding copyright - * ownership. The ASF licenses this file to you under the Apache - * License, Version 2.0 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of - * the License at http://www.apache.org/licenses/LICENSE-2.0 . - */ - -#include "ring.hxx" -#include <boost/intrusive/circular_list_algorithms.hpp> - -struct Ring_node_traits -{ - typedef Ring node; - typedef Ring* node_ptr; - typedef const Ring* const_node_ptr; - static node_ptr get_next(const_node_ptr n) { return n->GetNext(); }; - static void set_next(node_ptr n, node_ptr next) { n->pNext = next; }; - static node_ptr get_previous(const_node_ptr n) { return n->GetPrev(); }; - static void set_previous(node_ptr n, node_ptr previous) { n->pPrev = previous; }; -}; -typedef boost::intrusive::circular_list_algorithms<Ring_node_traits> algo; - - -Ring::Ring() -{ - algo::init_header(this); -} - -Ring::Ring( Ring *pObj ) -{ - if( !pObj ) - algo::init_header(this); - else - algo::link_before(pObj, this); -} - -Ring::~Ring() -{ - algo::unlink(this); -} - -void Ring::MoveTo(Ring *pDestRing) -{ - // insert into "new" - if( pDestRing ) - { - if(algo::unique(this)) - algo::link_before(pDestRing, this); - else - algo::transfer(pDestRing, this); - } - else - algo::unlink(this); - -} - -void Ring::MoveRingTo(Ring *pDestRing) -{ - std::swap(*(&pPrev->pNext), *(&pDestRing->pPrev->pNext)); - std::swap(*(&pPrev), *(&pDestRing->pPrev)); -} - -sal_uInt32 Ring::numberOf() const -{ - return algo::count(this); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ commit 02e2e6df7f089b121bc3599c8e267ffa7f9e46fb Author: Bjoern Michaelsen <bjoern.michael...@canonical.com> Date: Mon Dec 1 12:04:31 2014 +0100 use macro in macro Change-Id: Iadc70ec4ddfced07eeb761302c9d8485263c114b diff --git a/sw/inc/edimp.hxx b/sw/inc/edimp.hxx index 29aea41..b3240b9 100644 --- a/sw/inc/edimp.hxx +++ b/sw/inc/edimp.hxx @@ -22,30 +22,24 @@ #include <tools/solar.h> #include <o3tl/sorted_vector.hxx> +#include <boost/foreach.hpp> class SwPaM; class SwNodeIndex; // Macros to iterate over all ranges. -#define PCURCRSR (_pStartCrsr) +#define PCURCRSR (static_cast<SwPaM *>(&__r)) #define FOREACHPAM_START(pCURSH) \ - {\ - SwPaM *_pStartCrsr = (pCURSH), *__pStartCrsr = _pStartCrsr; \ - do { - -#define FOREACHPAM_END() \ - } while( (_pStartCrsr=static_cast<SwPaM *>(_pStartCrsr->GetNext())) != __pStartCrsr ); \ - } + BOOST_FOREACH(Ring& __r, std::make_pair(static_cast<Ring*>(pCURSH)->beginRing(), static_cast<Ring*>(pCURSH)->endRing())) \ + { #define FOREACHPAM_START_CONST(pCURSH) \ - {\ - const SwPaM *_pStartCrsr = (pCURSH), *__pStartCrsr = _pStartCrsr; \ - do { + BOOST_FOREACH(Ring& __r, std::make_pair(const_cast<Ring*>(static_cast<const Ring*>(pCURSH))->beginRing(), const_cast<Ring*>(static_cast<const Ring*>(pCURSH))->endRing())) \ + { -#define FOREACHPAM_END_CONST() \ - } while( (_pStartCrsr=static_cast<const SwPaM *>(_pStartCrsr->GetNext())) != __pStartCrsr ); \ - } +#define FOREACHPAM_END() } +#define FOREACHPAM_END_CONST() } struct SwPamRange { commit 4f9ed32cb81d9664683c55025d1c6b3e2e524125 Author: Bjoern Michaelsen <bjoern.michael...@canonical.com> Date: Mon Dec 1 11:08:38 2014 +0100 some test tweaking Change-Id: I45f60a0c37471a24219c95cf916b9cbfe0fc4c43 diff --git a/sw/qa/core/uwriter.cxx b/sw/qa/core/uwriter.cxx index 21a3d4d..d8da67b 100644 --- a/sw/qa/core/uwriter.cxx +++ b/sw/qa/core/uwriter.cxx @@ -1288,6 +1288,12 @@ namespace void SwDocTest::testIntrusiveRing() { TestRing aRing1, aRing2, aRing3, aRing4, aRing5; + std::vector<TestRing*> vRings; + vRings.push_back(&aRing1); + vRings.push_back(&aRing2); + vRings.push_back(&aRing3); + vRings.push_back(&aRing4); + vRings.push_back(&aRing5); CPPUNIT_ASSERT_EQUAL(aRing1.numberOf(), static_cast<sal_uInt32>(1)); aRing2.MoveTo(&aRing1); aRing3.MoveTo(&aRing1); @@ -1297,24 +1303,23 @@ void SwDocTest::testIntrusiveRing() aRing5.MoveTo(&aRing4); CPPUNIT_ASSERT_EQUAL(aRing4.numberOf(), static_cast<sal_uInt32>(2)); aRing4.MoveRingTo(&aRing1); - CPPUNIT_ASSERT_EQUAL(aRing1.numberOf(), static_cast<sal_uInt32>(5)); - CPPUNIT_ASSERT_EQUAL(aRing4.numberOf(), static_cast<sal_uInt32>(5)); - CPPUNIT_ASSERT_EQUAL(aRing1.GetNext(), static_cast<Ring*>(&aRing2)); - CPPUNIT_ASSERT_EQUAL(aRing2.GetNext(), static_cast<Ring*>(&aRing3)); - CPPUNIT_ASSERT_EQUAL(aRing3.GetNext(), static_cast<Ring*>(&aRing4)); - CPPUNIT_ASSERT_EQUAL(aRing4.GetNext(), static_cast<Ring*>(&aRing5)); - CPPUNIT_ASSERT_EQUAL(aRing5.GetNext(), static_cast<Ring*>(&aRing1)); - CPPUNIT_ASSERT_EQUAL(aRing2.GetPrev(), static_cast<Ring*>(&aRing1)); - CPPUNIT_ASSERT_EQUAL(aRing3.GetPrev(), static_cast<Ring*>(&aRing2)); - CPPUNIT_ASSERT_EQUAL(aRing4.GetPrev(), static_cast<Ring*>(&aRing3)); - CPPUNIT_ASSERT_EQUAL(aRing5.GetPrev(), static_cast<Ring*>(&aRing4)); - CPPUNIT_ASSERT_EQUAL(aRing1.GetPrev(), static_cast<Ring*>(&aRing5)); - //std::pair<Ring::iterator, Ring::iterator> foo(); + BOOST_FOREACH(TestRing* pRing, vRings) + { + CPPUNIT_ASSERT_EQUAL(pRing->numberOf(), static_cast<sal_uInt32>(5)); + } + for(std::vector<TestRing*>::iterator ppRing = vRings.begin(); ppRing != vRings.end(); ++ppRing) + { + std::vector<TestRing*>::iterator ppNext = ppRing+1; + if(ppNext==vRings.end()) + ppNext = vRings.begin(); + CPPUNIT_ASSERT_EQUAL((*ppRing)->GetNext(), static_cast<Ring*>(*ppNext)); + CPPUNIT_ASSERT_EQUAL((*ppNext)->GetPrev(), static_cast<Ring*>(*ppRing)); + } BOOST_FOREACH(Ring& r, std::make_pair(aRing1.beginRing(), aRing1.endRing())) - //for(Ring::iterator it = aRing1.beginRing(); it != aRing1.endRing(); ++it) { TestRing* pRing = dynamic_cast<TestRing*>(&r); - pRing->debug(); + CPPUNIT_ASSERT(pRing); + //pRing->debug(); } } commit 57a2acc3c2a8b31c36eb285870b19f00683c9293 Author: Bjoern Michaelsen <bjoern.michael...@canonical.com> Date: Mon Dec 1 10:38:25 2014 +0100 test FOREACH Change-Id: Iaa63f0fb1be5efe0659f56bf15bfa13c48f3ab81 diff --git a/sw/qa/core/uwriter.cxx b/sw/qa/core/uwriter.cxx index b0751c7..21a3d4d 100644 --- a/sw/qa/core/uwriter.cxx +++ b/sw/qa/core/uwriter.cxx @@ -1310,10 +1310,10 @@ void SwDocTest::testIntrusiveRing() CPPUNIT_ASSERT_EQUAL(aRing5.GetPrev(), static_cast<Ring*>(&aRing4)); CPPUNIT_ASSERT_EQUAL(aRing1.GetPrev(), static_cast<Ring*>(&aRing5)); //std::pair<Ring::iterator, Ring::iterator> foo(); - //BOOST_FOREACH(Ring& r, foo) - for(Ring::iterator it = aRing1.beginRing(); it != aRing1.endRing(); ++it) + BOOST_FOREACH(Ring& r, std::make_pair(aRing1.beginRing(), aRing1.endRing())) + //for(Ring::iterator it = aRing1.beginRing(); it != aRing1.endRing(); ++it) { - TestRing* pRing = dynamic_cast<TestRing*>(&(*it)); + TestRing* pRing = dynamic_cast<TestRing*>(&r); pRing->debug(); } } commit 0e6221e51f8572552021873aa4d6624365607ede Author: Bjoern Michaelsen <bjoern.michael...@canonical.com> Date: Mon Dec 1 03:36:23 2014 +0100 some more iteration Change-Id: I5ca9b79b2992b8499beec04ebe86d82ae14b0ee2 diff --git a/sw/inc/ring.hxx b/sw/inc/ring.hxx index cec5284..4dc0330 100644 --- a/sw/inc/ring.hxx +++ b/sw/inc/ring.hxx @@ -29,8 +29,6 @@ class RingIterator; class SW_DLLPUBLIC Ring { friend class Ring_node_traits; - typedef RingIterator iterator; - typedef RingIterator const_iterator; Ring* pNext; Ring* pPrev; ///< In order to speed up inserting and deleting. @@ -38,12 +36,18 @@ protected: Ring(); Ring( Ring * ); public: + typedef RingIterator iterator; + typedef RingIterator const_iterator; virtual ~Ring(); void MoveTo( Ring *pDestRing ); void MoveRingTo( Ring *pDestRing ); Ring* GetNext() const { return pNext; } Ring* GetPrev() const { return pPrev; } + // unfortunately we cant name these STL-conforming, as some derived classes + // also derive from other STL containers (which is bad anyway, but ...) + iterator beginRing(); + iterator endRing(); sal_uInt32 numberOf() const; }; @@ -78,6 +82,14 @@ class RingIterator : public boost::iterator_facade< Ring* m_pStart; }; +inline Ring::iterator Ring::beginRing() + { return Ring::iterator(this); }; + +inline Ring::iterator Ring::endRing() + { return Ring::iterator(this, false); }; + + + #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/core/uwriter.cxx b/sw/qa/core/uwriter.cxx index 0a38d79..b0751c7 100644 --- a/sw/qa/core/uwriter.cxx +++ b/sw/qa/core/uwriter.cxx @@ -10,6 +10,7 @@ #include <sal/config.h> #include <test/bootstrapfixture.hxx> +#include <boost/foreach.hpp> #include <rtl/strbuf.hxx> #include <osl/file.hxx> @@ -1308,6 +1309,13 @@ void SwDocTest::testIntrusiveRing() CPPUNIT_ASSERT_EQUAL(aRing4.GetPrev(), static_cast<Ring*>(&aRing3)); CPPUNIT_ASSERT_EQUAL(aRing5.GetPrev(), static_cast<Ring*>(&aRing4)); CPPUNIT_ASSERT_EQUAL(aRing1.GetPrev(), static_cast<Ring*>(&aRing5)); + //std::pair<Ring::iterator, Ring::iterator> foo(); + //BOOST_FOREACH(Ring& r, foo) + for(Ring::iterator it = aRing1.beginRing(); it != aRing1.endRing(); ++it) + { + TestRing* pRing = dynamic_cast<TestRing*>(&(*it)); + pRing->debug(); + } } void SwDocTest::setUp() commit 4a5928ee4ca55d22a0fa122886ecc7d6a55e9247 Author: Bjoern Michaelsen <bjoern.michael...@canonical.com> Date: Mon Dec 1 02:27:14 2014 +0100 more testing and initial iterators diff --git a/sw/inc/ring.hxx b/sw/inc/ring.hxx index 8b65d72..cec5284 100644 --- a/sw/inc/ring.hxx +++ b/sw/inc/ring.hxx @@ -21,12 +21,16 @@ #include <swdllapi.h> #include <swtypes.hxx> +#include <boost/iterator/iterator_facade.hpp> class Ring_node_traits; +class RingIterator; class SW_DLLPUBLIC Ring { friend class Ring_node_traits; + typedef RingIterator iterator; + typedef RingIterator const_iterator; Ring* pNext; Ring* pPrev; ///< In order to speed up inserting and deleting. @@ -44,6 +48,36 @@ public: sal_uInt32 numberOf() const; }; +class RingIterator : public boost::iterator_facade< + RingIterator + , Ring + , boost::forward_traversal_tag + > +{ + public: + RingIterator() + : m_pCurrent(nullptr) + , m_pStart(nullptr) + {} + explicit RingIterator(Ring* pRing, bool bStart = true) + : m_pCurrent(nullptr) + , m_pStart(pRing) + { + if(!bStart) + m_pCurrent = m_pStart; + } + private: + friend class boost::iterator_core_access; + void increment() + { m_pCurrent = m_pCurrent ? m_pCurrent->GetNext() : m_pStart->GetNext(); } + bool equal(RingIterator const& other) const + { return m_pCurrent == other.m_pCurrent && m_pStart == m_pStart; } + Ring& dereference() const + { return m_pCurrent ? *m_pCurrent : * m_pStart; } + Ring* m_pCurrent; + Ring* m_pStart; +}; + #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/core/uwriter.cxx b/sw/qa/core/uwriter.cxx index cb6b1b7..0a38d79 100644 --- a/sw/qa/core/uwriter.cxx +++ b/sw/qa/core/uwriter.cxx @@ -57,6 +57,7 @@ #include "modeltoviewhelper.hxx" #include "scriptinfo.hxx" #include "IMark.hxx" +#include "ring.hxx" typedef tools::SvRef<SwDocShell> SwDocShellRef; @@ -100,7 +101,7 @@ public: void testGraphicAnchorDeletion(); void testTransliterate(); void testMarkMove(); - void testInstrusiveList(); + void testIntrusiveRing(); CPPUNIT_TEST_SUITE(SwDocTest); CPPUNIT_TEST(testTransliterate); @@ -128,7 +129,7 @@ public: CPPUNIT_TEST(testUserPerceivedCharCount); CPPUNIT_TEST(testGraphicAnchorDeletion); CPPUNIT_TEST(testMarkMove); - CPPUNIT_TEST(testInstrusiveList); + CPPUNIT_TEST(testIntrusiveRing); CPPUNIT_TEST_SUITE_END(); private: @@ -1271,8 +1272,42 @@ void SwDocTest::testMarkMove() pBM3->GetMarkEnd().nNode.GetIndex()); } -void SwDocTest::testInstrusiveList() +namespace { + struct TestRing : public Ring + { + TestRing() : Ring() {}; + void debug() + { + SAL_DEBUG("TestRing at: " << this << " prev: " << GetPrev() << " next: " << GetNext()); + } + }; +} + +void SwDocTest::testIntrusiveRing() +{ + TestRing aRing1, aRing2, aRing3, aRing4, aRing5; + CPPUNIT_ASSERT_EQUAL(aRing1.numberOf(), static_cast<sal_uInt32>(1)); + aRing2.MoveTo(&aRing1); + aRing3.MoveTo(&aRing1); + CPPUNIT_ASSERT_EQUAL(aRing1.numberOf(), static_cast<sal_uInt32>(3)); + CPPUNIT_ASSERT_EQUAL(aRing2.numberOf(), static_cast<sal_uInt32>(3)); + CPPUNIT_ASSERT_EQUAL(aRing3.numberOf(), static_cast<sal_uInt32>(3)); + aRing5.MoveTo(&aRing4); + CPPUNIT_ASSERT_EQUAL(aRing4.numberOf(), static_cast<sal_uInt32>(2)); + aRing4.MoveRingTo(&aRing1); + CPPUNIT_ASSERT_EQUAL(aRing1.numberOf(), static_cast<sal_uInt32>(5)); + CPPUNIT_ASSERT_EQUAL(aRing4.numberOf(), static_cast<sal_uInt32>(5)); + CPPUNIT_ASSERT_EQUAL(aRing1.GetNext(), static_cast<Ring*>(&aRing2)); + CPPUNIT_ASSERT_EQUAL(aRing2.GetNext(), static_cast<Ring*>(&aRing3)); + CPPUNIT_ASSERT_EQUAL(aRing3.GetNext(), static_cast<Ring*>(&aRing4)); + CPPUNIT_ASSERT_EQUAL(aRing4.GetNext(), static_cast<Ring*>(&aRing5)); + CPPUNIT_ASSERT_EQUAL(aRing5.GetNext(), static_cast<Ring*>(&aRing1)); + CPPUNIT_ASSERT_EQUAL(aRing2.GetPrev(), static_cast<Ring*>(&aRing1)); + CPPUNIT_ASSERT_EQUAL(aRing3.GetPrev(), static_cast<Ring*>(&aRing2)); + CPPUNIT_ASSERT_EQUAL(aRing4.GetPrev(), static_cast<Ring*>(&aRing3)); + CPPUNIT_ASSERT_EQUAL(aRing5.GetPrev(), static_cast<Ring*>(&aRing4)); + CPPUNIT_ASSERT_EQUAL(aRing1.GetPrev(), static_cast<Ring*>(&aRing5)); } void SwDocTest::setUp() diff --git a/sw/source/core/bastyp/ring.cxx b/sw/source/core/bastyp/ring.cxx index 5db41f5..b7ce9c0 100644 --- a/sw/source/core/bastyp/ring.cxx +++ b/sw/source/core/bastyp/ring.cxx @@ -55,7 +55,12 @@ void Ring::MoveTo(Ring *pDestRing) { // insert into "new" if( pDestRing ) - algo::transfer(pDestRing, this); + { + if(algo::unique(this)) + algo::link_before(pDestRing, this); + else + algo::transfer(pDestRing, this); + } else algo::unlink(this); @@ -63,7 +68,8 @@ void Ring::MoveTo(Ring *pDestRing) void Ring::MoveRingTo(Ring *pDestRing) { - algo::transfer(pDestRing, this, this); + std::swap(*(&pPrev->pNext), *(&pDestRing->pPrev->pNext)); + std::swap(*(&pPrev), *(&pDestRing->pPrev)); } sal_uInt32 Ring::numberOf() const commit efddd4b6e0e80bdbdb74ea43654d258dedb7d13d Author: Bjoern Michaelsen <bjoern.michael...@canonical.com> Date: Sun Nov 30 17:31:46 2014 +0100 private pointer Change-Id: I2c5b2a5d99236f3d3887bba994acd1cf77ae83ba diff --git a/sw/inc/ring.hxx b/sw/inc/ring.hxx index 9695a8f..8b65d72 100644 --- a/sw/inc/ring.hxx +++ b/sw/inc/ring.hxx @@ -22,15 +22,18 @@ #include <swdllapi.h> #include <swtypes.hxx> +class Ring_node_traits; + class SW_DLLPUBLIC Ring { + friend class Ring_node_traits; + Ring* pNext; + Ring* pPrev; ///< In order to speed up inserting and deleting. protected: Ring(); Ring( Ring * ); public: - Ring* pNext; - Ring* pPrev; ///< In order to speed up inserting and deleting. virtual ~Ring(); void MoveTo( Ring *pDestRing ); void MoveRingTo( Ring *pDestRing ); diff --git a/sw/source/core/bastyp/ring.cxx b/sw/source/core/bastyp/ring.cxx index 25bac99..5db41f5 100644 --- a/sw/source/core/bastyp/ring.cxx +++ b/sw/source/core/bastyp/ring.cxx @@ -20,20 +20,17 @@ #include "ring.hxx" #include <boost/intrusive/circular_list_algorithms.hpp> -namespace +struct Ring_node_traits { - struct Ring_node_traits - { - typedef Ring node; - typedef Ring* node_ptr; - typedef const Ring* const_node_ptr; - static node_ptr get_next(const_node_ptr n) { return n->GetNext(); }; - static void set_next(node_ptr n, node_ptr next) { n->pNext = next; }; - static node_ptr get_previous(const_node_ptr n) { return n->GetPrev(); }; - static void set_previous(node_ptr n, node_ptr previous) { n->pPrev = previous; }; - }; - typedef boost::intrusive::circular_list_algorithms<Ring_node_traits> algo; -} + typedef Ring node; + typedef Ring* node_ptr; + typedef const Ring* const_node_ptr; + static node_ptr get_next(const_node_ptr n) { return n->GetNext(); }; + static void set_next(node_ptr n, node_ptr next) { n->pNext = next; }; + static node_ptr get_previous(const_node_ptr n) { return n->GetPrev(); }; + static void set_previous(node_ptr n, node_ptr previous) { n->pPrev = previous; }; +}; +typedef boost::intrusive::circular_list_algorithms<Ring_node_traits> algo; Ring::Ring() commit 2353618ff955cf5504ab7a69eaf2b7e5593b666b Author: Bjoern Michaelsen <bjoern.michael...@canonical.com> Date: Sun Nov 30 17:04:22 2014 +0100 use boost Change-Id: Ic5ded259912eb4d6b367ea294dc3a372fcd44195 diff --git a/sw/inc/editsh.hxx b/sw/inc/editsh.hxx index f74b797..b59cc50 100644 --- a/sw/inc/editsh.hxx +++ b/sw/inc/editsh.hxx @@ -39,7 +39,6 @@ #include <vector> #include <set> #include <swundo.hxx> -#include <ring.hxx> #include <svtools/embedhlp.hxx> #include <boost/ptr_container/ptr_vector.hpp> @@ -139,12 +138,9 @@ typedef boost::ptr_vector<SwGetINetAttr> SwGetINetAttrs; #define CNT_HasGrf(USH) ((USH)&CNT_GRF) #define CNT_HasOLE(USH) ((USH)&CNT_OLE) -typedef boost::intrusive::member_hook<Ring, boost::intrusive::list_member_hook<>, &Ring::m_aHook> MemberHookOption; -typedef boost::intrusive::list<Ring, MemberHookOption> RingList; class SW_DLLPUBLIC SwEditShell: public SwCrsrShell { static SvxSwAutoFmtFlags* pAutoFmtFlags; - RingList m_aList; /// For the private methods DelRange and those of AutoCorrect. friend class SwAutoFormat; diff --git a/sw/inc/pam.hxx b/sw/inc/pam.hxx index b5a7357..8614453 100644 --- a/sw/inc/pam.hxx +++ b/sw/inc/pam.hxx @@ -154,7 +154,7 @@ extern SwGoInDoc fnGoCntntCellsSkipHidden; void _InitPam(); /// PaM is Point and Mark: a selection of the document model. -class SW_DLLPUBLIC SwPaM : public Ring +class SW_DLLPUBLIC SwPaM : public Ring { SwPosition m_Bound1; SwPosition m_Bound2; diff --git a/sw/inc/ring.hxx b/sw/inc/ring.hxx index 25697c9..9695a8f 100644 --- a/sw/inc/ring.hxx +++ b/sw/inc/ring.hxx @@ -21,17 +21,16 @@ #include <swdllapi.h> #include <swtypes.hxx> -#include <boost/intrusive/list.hpp> class SW_DLLPUBLIC Ring { - Ring *pNext; - Ring* pPrev; ///< In order to speed up inserting and deleting. protected: - Ring() { pNext = this; pPrev = this; } + Ring(); Ring( Ring * ); public: + Ring* pNext; + Ring* pPrev; ///< In order to speed up inserting and deleting. virtual ~Ring(); void MoveTo( Ring *pDestRing ); void MoveRingTo( Ring *pDestRing ); @@ -40,7 +39,6 @@ public: Ring* GetPrev() const { return pPrev; } sal_uInt32 numberOf() const; - boost::intrusive::list_member_hook<> m_aHook; }; #endif diff --git a/sw/source/core/bastyp/ring.cxx b/sw/source/core/bastyp/ring.cxx index a25c086..25bac99 100644 --- a/sw/source/core/bastyp/ring.cxx +++ b/sw/source/core/bastyp/ring.cxx @@ -18,71 +18,60 @@ */ #include "ring.hxx" +#include <boost/intrusive/circular_list_algorithms.hpp> + +namespace +{ + struct Ring_node_traits + { + typedef Ring node; + typedef Ring* node_ptr; + typedef const Ring* const_node_ptr; + static node_ptr get_next(const_node_ptr n) { return n->GetNext(); }; + static void set_next(node_ptr n, node_ptr next) { n->pNext = next; }; + static node_ptr get_previous(const_node_ptr n) { return n->GetPrev(); }; + static void set_previous(node_ptr n, node_ptr previous) { n->pPrev = previous; }; + }; + typedef boost::intrusive::circular_list_algorithms<Ring_node_traits> algo; +} + + +Ring::Ring() +{ + algo::init_header(this); +} Ring::Ring( Ring *pObj ) { if( !pObj ) - { - pNext = this, pPrev = this; - } + algo::init_header(this); else - { - pNext = pObj; - pPrev = pObj->pPrev; - pObj->pPrev = this; - pPrev->pNext = this; - } + algo::link_before(pObj, this); } Ring::~Ring() { - pNext->pPrev = pPrev; - pPrev->pNext = pNext; + algo::unlink(this); } void Ring::MoveTo(Ring *pDestRing) { - // delete from "old" - pNext->pPrev = pPrev; - pPrev->pNext = pNext; - // insert into "new" if( pDestRing ) - { - pNext = pDestRing; - pPrev = pDestRing->pPrev; - pDestRing->pPrev = this; - pPrev->pNext = this; - } + algo::transfer(pDestRing, this); else - { - pNext = pPrev = this; - } + algo::unlink(this); } void Ring::MoveRingTo(Ring *pDestRing) { - // insert the whole ring into DestRing - Ring* pMyPrev = pPrev; - Ring* pDestPrev = pDestRing->pPrev; - - pMyPrev->pNext = pDestRing; - pDestPrev->pNext = this; - pDestRing->pPrev = pMyPrev; - pPrev = pDestPrev; + algo::transfer(pDestRing, this, this); } sal_uInt32 Ring::numberOf() const { - sal_uInt32 nRet = 1; - const Ring* pNxt = pNext; - while( pNxt != this ) - { - ++nRet; - pNxt = pNxt->GetNext(); - } - return nRet; + return algo::count(this); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ commit 9e4e7b2f454a5a3ccd619e9789461d474c2dacc7 Author: Bjoern Michaelsen <bjoern.michael...@canonical.com> Date: Sun Nov 30 01:27:26 2014 +0100 test intrusive diff --git a/sw/inc/editsh.hxx b/sw/inc/editsh.hxx index b59cc50..f74b797 100644 --- a/sw/inc/editsh.hxx +++ b/sw/inc/editsh.hxx @@ -39,6 +39,7 @@ #include <vector> #include <set> #include <swundo.hxx> +#include <ring.hxx> #include <svtools/embedhlp.hxx> #include <boost/ptr_container/ptr_vector.hpp> @@ -138,9 +139,12 @@ typedef boost::ptr_vector<SwGetINetAttr> SwGetINetAttrs; #define CNT_HasGrf(USH) ((USH)&CNT_GRF) #define CNT_HasOLE(USH) ((USH)&CNT_OLE) +typedef boost::intrusive::member_hook<Ring, boost::intrusive::list_member_hook<>, &Ring::m_aHook> MemberHookOption; +typedef boost::intrusive::list<Ring, MemberHookOption> RingList; class SW_DLLPUBLIC SwEditShell: public SwCrsrShell { static SvxSwAutoFmtFlags* pAutoFmtFlags; + RingList m_aList; /// For the private methods DelRange and those of AutoCorrect. friend class SwAutoFormat; diff --git a/sw/inc/pam.hxx b/sw/inc/pam.hxx index 8614453..b5a7357 100644 --- a/sw/inc/pam.hxx +++ b/sw/inc/pam.hxx @@ -154,7 +154,7 @@ extern SwGoInDoc fnGoCntntCellsSkipHidden; void _InitPam(); /// PaM is Point and Mark: a selection of the document model. -class SW_DLLPUBLIC SwPaM : public Ring +class SW_DLLPUBLIC SwPaM : public Ring { SwPosition m_Bound1; SwPosition m_Bound2; diff --git a/sw/inc/ring.hxx b/sw/inc/ring.hxx index 5d8e7de..25697c9 100644 --- a/sw/inc/ring.hxx +++ b/sw/inc/ring.hxx @@ -21,6 +21,7 @@ #include <swdllapi.h> #include <swtypes.hxx> +#include <boost/intrusive/list.hpp> class SW_DLLPUBLIC Ring { @@ -39,6 +40,7 @@ public: Ring* GetPrev() const { return pPrev; } sal_uInt32 numberOf() const; + boost::intrusive::list_member_hook<> m_aHook; }; #endif diff --git a/sw/qa/core/uwriter.cxx b/sw/qa/core/uwriter.cxx index 71409b8..cb6b1b7 100644 --- a/sw/qa/core/uwriter.cxx +++ b/sw/qa/core/uwriter.cxx @@ -100,6 +100,7 @@ public: void testGraphicAnchorDeletion(); void testTransliterate(); void testMarkMove(); + void testInstrusiveList(); CPPUNIT_TEST_SUITE(SwDocTest); CPPUNIT_TEST(testTransliterate); @@ -127,6 +128,7 @@ public: CPPUNIT_TEST(testUserPerceivedCharCount); CPPUNIT_TEST(testGraphicAnchorDeletion); CPPUNIT_TEST(testMarkMove); + CPPUNIT_TEST(testInstrusiveList); CPPUNIT_TEST_SUITE_END(); private: @@ -1269,6 +1271,10 @@ void SwDocTest::testMarkMove() pBM3->GetMarkEnd().nNode.GetIndex()); } +void SwDocTest::testInstrusiveList() +{ +} + void SwDocTest::setUp() { BootstrapFixture::setUp(); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits