sw/inc/edimp.hxx | 2 sw/inc/ring.hxx | 70 ++++++++++++++++++++++++++++++---- sw/qa/core/uwriter.cxx | 20 ++++++--- sw/source/core/crsr/viscrs.cxx | 6 +- sw/source/core/doc/doccorr.cxx | 6 +- sw/source/core/frmedt/fecopy.cxx | 2 sw/source/uibase/docvw/SidebarWin.cxx | 6 +- 7 files changed, 87 insertions(+), 25 deletions(-)
New commits: commit 2dd7cc5b925d0b4c62553eeba9f6524ce7b6217b Author: Bjoern Michaelsen <[email protected]> Date: Tue Dec 2 11:14:24 2014 +0100 simplify Change-Id: I8cd66f270526880f6ad7fb083aaa65c87079dfc1 diff --git a/sw/qa/core/uwriter.cxx b/sw/qa/core/uwriter.cxx index 8fd104c..55a9390 100644 --- a/sw/qa/core/uwriter.cxx +++ b/sw/qa/core/uwriter.cxx @@ -1317,7 +1317,7 @@ void SwDocTest::testIntrusiveRing() CPPUNIT_ASSERT_EQUAL((*ppRing)->GetNext(), *ppNext); CPPUNIT_ASSERT_EQUAL((*ppNext)->GetPrev(), *ppRing); } - BOOST_FOREACH(TestRing& r, std::make_pair(aRing1.beginRing(), aRing1.endRing())) + BOOST_FOREACH(TestRing& r, aRing1.rangeRing()) { TestRing* pRing = &r; CPPUNIT_ASSERT(pRing); commit 55a509616614cc4e50acbb9f257f7334db6667f9 Author: Bjoern Michaelsen <[email protected]> Date: Tue Dec 2 11:11:55 2014 +0100 test constness Change-Id: I74523d0264f2fe78353c8f61d98295c65cd23ee1 diff --git a/sw/qa/core/uwriter.cxx b/sw/qa/core/uwriter.cxx index f667542..8fd104c 100644 --- a/sw/qa/core/uwriter.cxx +++ b/sw/qa/core/uwriter.cxx @@ -1323,6 +1323,12 @@ void SwDocTest::testIntrusiveRing() CPPUNIT_ASSERT(pRing); //pRing->debug(); } + const TestRing* pConstRing = &aRing1; + BOOST_FOREACH(const TestRing& r, pConstRing->rangeRing()) // this should fail without r being const + { + const TestRing* pRing = &r; + CPPUNIT_ASSERT(pRing); + } } void SwDocTest::setUp() commit 2277558d01c168feec10c6340f919e7847ab2dbe Author: Bjoern Michaelsen <[email protected]> Date: Tue Dec 2 11:04:15 2014 +0100 rename numberOf() to STL-like size() Change-Id: I82332e91ed152e42b55ae921b3b61c5144253c39 diff --git a/sw/inc/ring.hxx b/sw/inc/ring.hxx index e587ad3..d58733f 100644 --- a/sw/inc/ring.hxx +++ b/sw/inc/ring.hxx @@ -124,7 +124,7 @@ namespace sw { return std::make_pair(beginRing(), endRing()); } /** @return the number of elements in the container */ - sal_uInt32 numberOf() const + size_t size() const { return algo::count(static_cast< const T* >(this)); } }; diff --git a/sw/qa/core/uwriter.cxx b/sw/qa/core/uwriter.cxx index 45e0cf6..f667542 100644 --- a/sw/qa/core/uwriter.cxx +++ b/sw/qa/core/uwriter.cxx @@ -1296,18 +1296,18 @@ void SwDocTest::testIntrusiveRing() vRings.push_back(&aRing3); vRings.push_back(&aRing4); vRings.push_back(&aRing5); - CPPUNIT_ASSERT_EQUAL(aRing1.numberOf(), static_cast<sal_uInt32>(1)); + CPPUNIT_ASSERT_EQUAL(aRing1.size(), static_cast<size_t>(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)); + CPPUNIT_ASSERT_EQUAL(aRing1.size(), static_cast<size_t>(3)); + CPPUNIT_ASSERT_EQUAL(aRing2.size(), static_cast<size_t>(3)); + CPPUNIT_ASSERT_EQUAL(aRing3.size(), static_cast<size_t>(3)); aRing5.MoveTo(&aRing4); - CPPUNIT_ASSERT_EQUAL(aRing4.numberOf(), static_cast<sal_uInt32>(2)); + CPPUNIT_ASSERT_EQUAL(aRing4.size(), static_cast<size_t>(2)); aRing4.MoveRingTo(&aRing1); BOOST_FOREACH(TestRing* pRing, vRings) { - CPPUNIT_ASSERT_EQUAL(pRing->numberOf(), static_cast<sal_uInt32>(5)); + CPPUNIT_ASSERT_EQUAL(pRing->size(), static_cast<size_t>(5)); } for(std::vector<TestRing*>::iterator ppRing = vRings.begin(); ppRing != vRings.end(); ++ppRing) { diff --git a/sw/source/core/crsr/viscrs.cxx b/sw/source/core/crsr/viscrs.cxx index b305c19..8c1b5d1 100644 --- a/sw/source/core/crsr/viscrs.cxx +++ b/sw/source/core/crsr/viscrs.cxx @@ -369,10 +369,10 @@ void SwSelPaintRects::HighlightInputFld() pCrsrForInputTxtFld->GetMark()->nContent.Assign( pTxtNode, *(pCurTxtInputFldAtCrsr->End()) ); pCrsrForInputTxtFld->FillRects(); - - for (size_t a(0); a < pCrsrForInputTxtFld->size(); ++a) + SwRects* pRects = static_cast<SwRects*>(pCrsrForInputTxtFld.get()); + for (size_t a(0); a < pRects->size(); ++a) { - const SwRect aNextRect((*pCrsrForInputTxtFld)[a]); + const SwRect aNextRect((*pRects)[a]); const Rectangle aPntRect(aNextRect.SVRect()); aInputFldRanges.push_back(basegfx::B2DRange( diff --git a/sw/source/core/frmedt/fecopy.cxx b/sw/source/core/frmedt/fecopy.cxx index e69cfe9..95a5033 100644 --- a/sw/source/core/frmedt/fecopy.cxx +++ b/sw/source/core/frmedt/fecopy.cxx @@ -719,7 +719,7 @@ bool SwFEShell::Paste( SwDoc* pClpDoc, bool bIncludingPageFrames ) SwNodeIndex aClpIdx( aIdx ); SwPaM* pStartCursor = GetCrsr(); SwPaM* pCurrCrsr = pStartCursor; - sal_uInt32 nCursorCount = pStartCursor->numberOf(); + sal_uInt32 nCursorCount = pStartCursor->size(); // If the target selection is a multi-selection, often the last and first // cursor of the ring points to identical document positions. Then // we should avoid double insertion of text portions... diff --git a/sw/source/uibase/docvw/SidebarWin.cxx b/sw/source/uibase/docvw/SidebarWin.cxx index 84d9974..e6f4a91 100644 --- a/sw/source/uibase/docvw/SidebarWin.cxx +++ b/sw/source/uibase/docvw/SidebarWin.cxx @@ -677,10 +677,10 @@ void SwSidebarWin::SetPosAndSize() ::boost::scoped_ptr<SwShellCrsr> pTmpCrsrForAnnotationTextRange( pTmpCrsr ); pTmpCrsrForAnnotationTextRange->FillRects(); - - for( sal_uInt16 a(0); a < pTmpCrsrForAnnotationTextRange->size(); ++a ) + SwRects* pRects(pTmpCrsrForAnnotationTextRange.get()); + for( size_t a(0); a < pRects->size(); ++a ) { - const SwRect aNextRect((*pTmpCrsrForAnnotationTextRange)[a]); + const SwRect aNextRect((*pRects)[a]); const Rectangle aPntRect(aNextRect.SVRect()); aAnnotationTextRanges.push_back(basegfx::B2DRange( commit 98f0516f158fbcacdc50e4e3f9e25f9ee6651d09 Author: Bjoern Michaelsen <[email protected]> Date: Tue Dec 2 10:13:57 2014 +0100 ring docs Change-Id: Ie26b98bb2e2946f326de6ff58677e33539db70b6 diff --git a/sw/inc/ring.hxx b/sw/inc/ring.hxx index 33bc069..e587ad3 100644 --- a/sw/inc/ring.hxx +++ b/sw/inc/ring.hxx @@ -30,9 +30,14 @@ namespace sw class Ring_node_traits; template <class T> class RingIterator; + /** + * An intrusive container class double linking the contained nodes + * @example sw/qa/core/uwriter.cxx + */ template <class T> class Ring { + /** internal implementation class -- not for external use */ struct Ring_node_traits { typedef T node; @@ -46,33 +51,79 @@ namespace sw friend struct 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* pPrev; protected: + /** + * Creates a new item in a ring container all by itself. + * Note: Ring instances can newer be outside a container. At most, they + * are alone in one. + */ Ring() { algo::init_header(static_cast< T* >(this)); } - Ring( T* ); + /** + * Creates a new item and add it to an existing ring container. + * Note: the newly created item will be inserted just before item pRing. + * @param pRing ring container to add the created item to + */ + Ring( T* pRing ); public: typedef RingIterator<T> iterator; typedef RingIterator<const T> const_iterator; virtual ~Ring() { algo::unlink(static_cast< T* >(this)); }; + /** + * Removes this item from its current ring container and adds it to + * another ring container. If the item was not alone in the original + * ring container, the other items in the ring will stay in the old + * ring container. + * Note: the newly created item will be inserted just before item pDestRing. + * @param pDestRing the container to add this item to + */ void MoveTo( T* pDestRing ); + /** + * Merges two ring containers. All item from both ring containers will + * be in the same ring container in the end. + * Note: The items of this ring container will be inserted just before + * item pDestRing + * @param pDestRing the container to merge this container with + */ void MoveRingTo( T* pDestRing ); - 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 ...) + /** @return the next item in the ring container */ + T* GetNext() const + { return pNext; } + /** @return the previous item in the ring container */ + T* GetPrev() const + { return pPrev; } + /** + * iterator access + * @code + * for(Ring<SwPaM>::iterator ppRing = pPaM->beginRing(); ppRing != pPaM->endRing(); ++ppRing) + * do_stuff(*ppRing); + * @endcode + * @TODO: unfortunately we cant name these STL-conforming, as some derived classes + * also derive from other STL containers. This should be fixed though. + * That should allow this to be used directly with C++11s for( : ) + * iteration statement. + */ iterator beginRing(); iterator endRing(); const_iterator beginRing() const; const_iterator endRing() const; + /** + * simplified iteration with BOOST_FOREACH (example for Ring<SwPaM>): + * @code + * BOOST_FOREACH(SwPaM& rPaM, pPaM->rangeRing()) + * do_stuff(rPaM); + * @endcode + */ std::pair<iterator, iterator> rangeRing() { return std::make_pair(beginRing(), endRing()); } std::pair<const_iterator, const_iterator> rangeRing() const { return std::make_pair(beginRing(), endRing()); } + /** @return the number of elements in the container */ sal_uInt32 numberOf() const { return algo::count(static_cast< const T* >(this)); } }; commit 1bea427d55ecf4a1914a6c404fc0f06a7bb044bd Author: Bjoern Michaelsen <[email protected]> Date: Tue Dec 2 09:36:37 2014 +0100 add rangeRing() for easier iteration Change-Id: I0ef002c0c32c1435cbc62f954f98dc11c3f69945 diff --git a/sw/inc/edimp.hxx b/sw/inc/edimp.hxx index 9f22e64..f3f985a 100644 --- a/sw/inc/edimp.hxx +++ b/sw/inc/edimp.hxx @@ -31,7 +31,7 @@ class SwNodeIndex; #define PCURCRSR (static_cast<SwPaM *>(&__r)) #define FOREACHPAM_START(pCURSH) \ - BOOST_FOREACH(SwPaM& __r, std::make_pair((pCURSH)->beginRing(), (pCURSH)->endRing())) \ + BOOST_FOREACH(SwPaM& __r, (pCURSH)->rangeRing()) \ { #define FOREACHPAM_END() } diff --git a/sw/inc/ring.hxx b/sw/inc/ring.hxx index e364be8..33bc069 100644 --- a/sw/inc/ring.hxx +++ b/sw/inc/ring.hxx @@ -21,6 +21,7 @@ #include <swdllapi.h> #include <swtypes.hxx> +#include <utility> #include <boost/iterator/iterator_facade.hpp> #include <boost/intrusive/circular_list_algorithms.hpp> @@ -67,6 +68,10 @@ namespace sw iterator endRing(); const_iterator beginRing() const; const_iterator endRing() const; + std::pair<iterator, iterator> rangeRing() + { return std::make_pair(beginRing(), endRing()); } + std::pair<const_iterator, const_iterator> rangeRing() const + { return std::make_pair(beginRing(), endRing()); } sal_uInt32 numberOf() const { return algo::count(static_cast< const T* >(this)); } diff --git a/sw/source/core/doc/doccorr.cxx b/sw/source/core/doc/doccorr.cxx index 67f6c95..5dc2ca0 100644 --- a/sw/source/core/doc/doccorr.cxx +++ b/sw/source/core/doc/doccorr.cxx @@ -99,7 +99,7 @@ void PaMCorrAbs( const SwPaM& rRange, if( pShell ) { - BOOST_FOREACH(const SwViewShell& rShell, std::make_pair(pShell->beginRing(), pShell->endRing())) + BOOST_FOREACH(const SwViewShell& rShell, pShell->rangeRing()) { if(!rShell.IsA( TYPE( SwCrsrShell ))) continue; @@ -249,7 +249,7 @@ void PaMCorrRel( const SwNodeIndex &rOldNode, SwCrsrShell const* pShell = pDoc->GetEditShell(); if( pShell ) { - BOOST_FOREACH(const SwViewShell& rShell, std::make_pair(pShell->beginRing(), pShell->endRing())) + BOOST_FOREACH(const SwViewShell& rShell, pShell->rangeRing()) { if(!rShell.IsA( TYPE( SwCrsrShell ))) continue; @@ -262,7 +262,7 @@ void PaMCorrRel( const SwNodeIndex &rOldNode, ((_pStkCrsr = static_cast<SwPaM *>(_pStkCrsr->GetNext())) != pCrsrShell->GetStkCrsr()) ); SwPaM* pStartPaM = pCrsrShell->_GetCrsr(); - BOOST_FOREACH(SwPaM& rPaM, std::make_pair(pStartPaM->beginRing(), pStartPaM->endRing())) + BOOST_FOREACH(SwPaM& rPaM, pStartPaM->rangeRing()) { lcl_PaMCorrRel1( &rPaM, pOldNode, aNewPos, nCntIdx); } _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
