[Libreoffice-commits] .: 13 commits - o3tl/inc o3tl/qa sc/workben svl/Library_svl.mk svl/Package_inc.mk svl/inc svl/source svx/source sw/inc sw/source
Michael Stahl
mst at kemper.freedesktop.org
Tue Jul 31 11:33:24 PDT 2012
o3tl/inc/o3tl/sorted_vector.hxx | 86 ++++++++++-----
o3tl/qa/test-sorted_vector.cxx | 114 ++++++++++++++++++++
sc/workben/result.hxx | 1
svl/Library_svl.mk | 1
svl/Package_inc.mk | 1
svl/inc/svl/svarray.hxx | 202 -------------------------------------
svl/source/memtools/svarray.cxx | 97 -----------------
svx/source/inc/fmshimp.hxx | 1
sw/inc/docary.hxx | 5
sw/inc/flypos.hxx | 2
sw/inc/ndhints.hxx | 34 ++++--
sw/source/core/doc/docfld.cxx | 22 +---
sw/source/core/doc/docsort.cxx | 43 ++++---
sw/source/core/text/redlnitr.cxx | 12 +-
sw/source/core/text/redlnitr.hxx | 2
sw/source/core/txtnode/ndhints.cxx | 143 +++++++-------------------
sw/source/filter/html/htmlfly.hxx | 7 +
sw/source/ui/utlui/content.cxx | 4
18 files changed, 290 insertions(+), 487 deletions(-)
New commits:
commit 28a48f2aab4aa32ce8a7d46b8b5e6f26b732afd3
Author: Michael Stahl <mstahl at redhat.com>
Date: Tue Jul 31 20:18:22 2012 +0200
svarray.hxx: 'e's pining for the fjords...
Change-Id: I3eeb257092a76744482ebd2d0eccaa29ead8a644
diff --git a/svl/Library_svl.mk b/svl/Library_svl.mk
index 41f91b5..768f2db 100644
--- a/svl/Library_svl.mk
+++ b/svl/Library_svl.mk
@@ -105,7 +105,6 @@ $(eval $(call gb_Library_add_exception_objects,svl,\
svl/source/items/szitem \
svl/source/items/visitem \
svl/source/items/whiter \
- svl/source/memtools/svarray \
svl/source/misc/PasswordHelper \
svl/source/misc/adrparse \
svl/source/misc/documentlockfile \
diff --git a/svl/Package_inc.mk b/svl/Package_inc.mk
index 2cb3544..ae63792 100644
--- a/svl/Package_inc.mk
+++ b/svl/Package_inc.mk
@@ -98,7 +98,6 @@ $(eval $(call gb_Package_add_file,svl_inc,inc/svl/strmadpt.hxx,svl/strmadpt.hxx)
$(eval $(call gb_Package_add_file,svl_inc,inc/svl/style.hrc,svl/style.hrc))
$(eval $(call gb_Package_add_file,svl_inc,inc/svl/style.hxx,svl/style.hxx))
$(eval $(call gb_Package_add_file,svl_inc,inc/svl/stylepool.hxx,svl/stylepool.hxx))
-$(eval $(call gb_Package_add_file,svl_inc,inc/svl/svarray.hxx,svl/svarray.hxx))
$(eval $(call gb_Package_add_file,svl_inc,inc/svl/svdde.hxx,svl/svdde.hxx))
$(eval $(call gb_Package_add_file,svl_inc,inc/svl/svl.hrc,svl/svl.hrc))
$(eval $(call gb_Package_add_file,svl_inc,inc/svl/svldllapi.h,svl/svldllapi.h))
diff --git a/svl/inc/svl/svarray.hxx b/svl/inc/svl/svarray.hxx
deleted file mode 100644
index 23e702b..0000000
--- a/svl/inc/svl/svarray.hxx
+++ /dev/null
@@ -1,202 +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 .
- */
-
-#ifndef _SVARRAY_HXX
-#define _SVARRAY_HXX
-
-/***********************************************************************
-*
-* Hier folgt die Beschreibung fuer die exportierten Makros:
-*
-* SV_DECL_PTRARR_SORT(nm, AE, IS, GS)
-* SV_IMPL_OP_PTRARR_SORT( nm,AE )
-* defieniere/implementiere ein Sort-Array mit Pointern, das nach
-* Objecten sortiert ist. Basiert auf einem PTRARR.
-* Sortierung mit Hilfe der Object-operatoren "<" und "=="
-*
-***********************************************************************/
-
-#include "svl/svldllapi.h"
-
-#include <limits.h> // USHRT_MAX
-#include <osl/diagnose.h>
-#include <rtl/alloc.h>
-#include <tools/solar.h>
-
-typedef void* VoidPtr;
-class SVL_DLLPUBLIC SvPtrarr
-{
-protected:
- VoidPtr *pData;
- sal_uInt16 nFree;
- sal_uInt16 nA;
-
- void _resize(size_t n);
-
-public:
- SvPtrarr( sal_uInt16= 0 );
- ~SvPtrarr() { rtl_freeMemory( pData ); }
-
- VoidPtr& operator[](sal_uInt16 nP) const { return *(pData+nP); }
-
- void Insert( const SvPtrarr * pI, sal_uInt16 nP,
- sal_uInt16 nS = 0, sal_uInt16 nE = USHRT_MAX );
-
- VoidPtr& GetObject(sal_uInt16 nP) const { return (*this)[nP]; }
-
- void Insert( const VoidPtr& aE, sal_uInt16 nP );
- void Insert( const VoidPtr *pE, sal_uInt16 nL, sal_uInt16 nP );
- void Remove( sal_uInt16 nP, sal_uInt16 nL = 1 );
- sal_uInt16 Count() const { return nA; }
- const VoidPtr* GetData() const { return (const VoidPtr*)pData; }
- sal_uInt16 GetPos( const VoidPtr & aE ) const;
-};
-
-// SORTARR - Begin
-
-#define _SV_IMPL_SORTAR_ALG(nm, AE)\
-sal_Bool nm::Insert( const AE & aE )\
-{\
- sal_uInt16 nP;\
- sal_Bool bExist;\
- bExist = Seek_Entry( aE, &nP );\
- if( ! bExist )\
- nm##_SAR::Insert( aE, nP );\
- return !bExist;\
-}\
-\
-void nm::Remove( sal_uInt16 nP, sal_uInt16 nL )\
-{\
- if( nL )\
- nm##_SAR::Remove( nP, nL);\
-}
-
-#define SV_DECL_PTRARR_SORT(nm, AE, IS)\
-class nm##_SAR: public SvPtrarr \
-{\
-public:\
- nm##_SAR( sal_uInt16 nIni=IS )\
- : SvPtrarr(nIni) {}\
- void Insert( const nm##_SAR *pI, sal_uInt16 nP, \
- sal_uInt16 nS = 0, sal_uInt16 nE = USHRT_MAX ) {\
- SvPtrarr::Insert((const SvPtrarr*)pI, nP, nS, nE);\
- }\
- void Insert( const AE & aE, sal_uInt16 nP ) {\
- SvPtrarr::Insert( (const VoidPtr &)aE, nP );\
- }\
- void Insert( const AE *pE, sal_uInt16 nL, sal_uInt16 nP ) {\
- SvPtrarr::Insert( (const VoidPtr*)pE, nL, nP );\
- }\
- void Remove( sal_uInt16 nP, sal_uInt16 nL = 1) {\
- SvPtrarr::Remove(nP,nL);\
- }\
- const AE* GetData() const {\
- return (const AE*)SvPtrarr::GetData();\
- }\
- AE operator[]( sal_uInt16 nP )const { \
- return (AE)SvPtrarr::operator[](nP); }\
- AE GetObject(sal_uInt16 nP) const { \
- return (AE)SvPtrarr::GetObject(nP); }\
- \
- sal_uInt16 GetPos( const AE & aE ) const { \
- return SvPtrarr::GetPos((const VoidPtr &)aE);\
- }\
- void DeleteAndDestroy( sal_uInt16 nP, sal_uInt16 nL=1 );\
-private:\
- nm##_SAR( const nm##_SAR& );\
- nm##_SAR& operator=( const nm##_SAR& );\
-};\
-\
-class nm : private nm##_SAR \
-{\
-public:\
- nm(sal_uInt16 nSize = IS)\
- : nm##_SAR(nSize) {}\
- sal_Bool Insert( const AE& aE );\
- void Remove( sal_uInt16 nP, sal_uInt16 nL = 1 );\
- sal_uInt16 Count() const { return nm##_SAR::Count(); }\
- const AE* GetData() const { return (const AE*)pData; }\
- AE operator[](sal_uInt16 nP) const {\
- return nm##_SAR::operator[]( nP );\
- }\
- AE GetObject(sal_uInt16 nP) const {\
- return nm##_SAR::GetObject( nP );\
- }\
- sal_Bool Seek_Entry( const AE aE, sal_uInt16* pP = 0 ) const;\
- void DeleteAndDestroy( sal_uInt16 nP, sal_uInt16 nL=1 ); \
- sal_uInt16 GetPos( const AE& aE ) const { \
- return SvPtrarr::GetPos((const VoidPtr&)aE);\
- }\
-private:\
- nm( const nm& );\
- nm& operator=( const nm& );\
-};
-
-#define SV_IMPL_OP_PTRARR_SORT( nm,AE )\
-_SV_IMPL_SORTAR_ALG( nm,AE )\
-void nm::DeleteAndDestroy( sal_uInt16 nP, sal_uInt16 nL ) { \
- if( nL ) {\
- OSL_ENSURE( nP < nA && nP + nL <= nA, "ERR_VAR_DEL" );\
- for( sal_uInt16 n=nP; n < nP + nL; n++ ) \
- delete *((AE*)pData+n); \
- SvPtrarr::Remove( nP, nL ); \
- } \
-} \
-sal_Bool nm::Seek_Entry( const AE aE, sal_uInt16* pP ) const\
-{\
- register sal_uInt16 nO = nm##_SAR::Count(),\
- nM, \
- nU = 0;\
- if( nO > 0 )\
- {\
- nO--;\
- while( nU <= nO )\
- {\
- nM = nU + ( nO - nU ) / 2;\
- if( *(*((AE*)pData + nM)) == *(aE) )\
- {\
- if( pP ) *pP = nM;\
- return sal_True;\
- }\
- else if( *(*((AE*)pData + nM)) < *(aE) )\
- nU = nM + 1;\
- else if( nM == 0 )\
- {\
- if( pP ) *pP = nU;\
- return sal_False;\
- }\
- else\
- nO = nM - 1;\
- }\
- }\
- if( pP ) *pP = nU;\
- return sal_False;\
-}
-
-
-
-#if defined(ICC) || defined(GCC) || (defined(WNT) && _MSC_VER >= 1400)
-#define C40_INSERT( c, p, n ) Insert( (c const *&) p, n )
-#else
-#define C40_INSERT( c, p, n ) Insert( p, n )
-#endif
-
-#endif //_SVARRAY_HXX
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/svl/source/memtools/svarray.cxx b/svl/source/memtools/svarray.cxx
deleted file mode 100644
index 6f1f1cb..0000000
--- a/svl/source/memtools/svarray.cxx
+++ /dev/null
@@ -1,97 +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 <svl/svarray.hxx>
-#include <string.h> // memmove()
-
-SvPtrarr::SvPtrarr( sal_uInt16 nInit )
- : pData (0),
- nFree (nInit),
- nA (0)
-{
- if( nInit )
- {
- pData = (VoidPtr*)(rtl_allocateMemory(sizeof(VoidPtr) * nInit));
- OSL_ENSURE( pData, "CTOR, allocate");
- }
-}
-
-void SvPtrarr::_resize (size_t n)
-{
- sal_uInt16 nL = ((n < USHRT_MAX) ? sal_uInt16(n) : USHRT_MAX);
- VoidPtr* pE = (VoidPtr*)(rtl_reallocateMemory (pData, sizeof(VoidPtr) * nL));
- if ((pE != 0) || (nL == 0))
- {
- pData = pE;
- nFree = nL - nA;
- }
-}
-
-void SvPtrarr::Insert( const VoidPtr& aE, sal_uInt16 nP )
-{
- OSL_ENSURE(nP <= nA && nA < USHRT_MAX, "Ins 1");
- if (nFree < 1)
- _resize (nA + ((nA > 1) ? nA : 1));
- if( pData && nP < nA )
- memmove( pData+nP+1, pData+nP, (nA-nP) * sizeof( VoidPtr ));
- *(pData+nP) = (VoidPtr&)aE;
- ++nA; --nFree;
-}
-
-void SvPtrarr::Insert( const VoidPtr* pE, sal_uInt16 nL, sal_uInt16 nP )
-{
- OSL_ENSURE(nP<=nA && ((long)nA+nL)<USHRT_MAX,"Ins n");
- if (nFree < nL)
- _resize (nA + ((nA > nL) ? nA : nL));
- if( pData && nP < nA )
- memmove( pData+nP+nL, pData+nP, (nA-nP) * sizeof( VoidPtr ));
- if( pE )
- memcpy( pData+nP, pE, nL * sizeof( VoidPtr ));
- nA = nA + nL; nFree = nFree - nL;
-}
-
-void SvPtrarr::Insert( const SvPtrarr * pI, sal_uInt16 nP,
- sal_uInt16 nS, sal_uInt16 nE )
-{
- if( USHRT_MAX == nE )
- nE = pI->nA;
- if( nS < nE )
- Insert( (const VoidPtr*)pI->pData+nS, (sal_uInt16)nE-nS, nP );
-}
-
-void SvPtrarr::Remove( sal_uInt16 nP, sal_uInt16 nL )
-{
- if( !nL )
- return;
- OSL_ENSURE( nP < nA && nP + nL <= nA,"Del");
- if( pData && nP+1 < nA )
- memmove( pData+nP, pData+nP+nL, (nA-nP-nL) * sizeof( VoidPtr ));
- nA = nA - nL; nFree = nFree + nL;
- if (nFree > nA)
- _resize (nA);
-}
-
-sal_uInt16 SvPtrarr::GetPos( const VoidPtr& aElement ) const
-{
- sal_uInt16 n;
- for( n=0; n < nA && *(GetData()+n) != aElement; ) n++;
- return ( n >= nA ? USHRT_MAX : n );
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit dd5bea1d8200a566d59029fbf0c15ddd1e25098e
Author: Michael Stahl <mstahl at redhat.com>
Date: Tue Jul 31 20:06:03 2012 +0200
remove commented out SV_DECL_OBJARR
Change-Id: Ie89a34c9dd8c71f25102cfb6f304c32fed99b4a8
diff --git a/sc/workben/result.hxx b/sc/workben/result.hxx
index bb1fd86..f29b7e7 100644
--- a/sc/workben/result.hxx
+++ b/sc/workben/result.hxx
@@ -29,7 +29,6 @@
#ifndef SC_RESULT_HXX
#define SC_RESULT_HXX
-#include <svl/svarray.hxx>
#include <vcl/timer.hxx>
#include <tools/string.hxx>
#include <boost/ptr_container/ptr_vector.hpp>
diff --git a/svx/source/inc/fmshimp.hxx b/svx/source/inc/fmshimp.hxx
index 94a0839..8b2a90e 100644
--- a/svx/source/inc/fmshimp.hxx
+++ b/svx/source/inc/fmshimp.hxx
@@ -75,7 +75,6 @@
#include <boost/ptr_container/ptr_vector.hpp>
typedef std::vector<SdrObject*> SdrObjArray;
-// SV_DECL_OBJARR(FmFormArray, ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm>, 32, 16);
DECLARE_STL_VECTOR( ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm > ,FmFormArray);
// catch database exceptions if they occur
commit 4cbb646ddb9e075f3ac47214aae020a96b84267e
Author: Michael Stahl <mstahl at redhat.com>
Date: Tue Jul 31 19:55:46 2012 +0200
convert SwSortElements to boost::ptr_multiset
Change-Id: Ia52f23a4bdad60a89c70e47089a82ef5dbd8dfda
diff --git a/sw/source/core/doc/docsort.cxx b/sw/source/core/doc/docsort.cxx
index 88d791a..0f23d50 100644
--- a/sw/source/core/doc/docsort.cxx
+++ b/sw/source/core/doc/docsort.cxx
@@ -26,10 +26,10 @@
*
************************************************************************/
+#include <boost/ptr_container/ptr_set.hpp>
#include <hintids.hxx>
#include <rtl/math.hxx>
-#include <svl/svarray.hxx>
#include <unotools/collatorwrapper.hxx>
#include <unotools/localedatawrapper.hxx>
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
@@ -71,9 +71,8 @@ LocaleDataWrapper* SwSortElement::pLclData = 0;
// List of all sorted elements
typedef SwSortElement* SwSortElementPtr;
-SV_DECL_PTRARR_SORT(SwSortElements, SwSortElementPtr, 0)
-
-SV_IMPL_OP_PTRARR_SORT( SwSortElements, SwSortElementPtr );
+typedef ::boost::ptr_multiset<SwSortTxtElement> SwSortTxtElements;
+typedef ::boost::ptr_multiset<SwSortBoxElement> SwSortBoxElements;
/*--------------------------------------------------------------------
Description: Construct a SortElement for the Sort
@@ -404,12 +403,12 @@ sal_Bool SwDoc::SortText(const SwPaM& rPaM, const SwSortOptions& rOpt)
SwNodeIndex aStart(pStart->nNode);
SwSortElement::Init( this, rOpt );
- SwSortElements aSortArr;
+ SwSortTxtElements aSortSet;
while( aStart <= pEnd->nNode )
{
// Iterate over a selected Area
SwSortTxtElement* pSE = new SwSortTxtElement( aStart );
- aSortArr.Insert(pSE);
+ aSortSet.insert(pSE);
aStart++;
}
@@ -425,11 +424,12 @@ sal_Bool SwDoc::SortText(const SwPaM& rPaM, const SwSortOptions& rOpt)
GetIDocumentUndoRedo().DoUndo(false);
- for ( sal_uInt16 n = 0; n < aSortArr.Count(); ++n )
+ size_t n = 0;
+ for (SwSortTxtElements::const_iterator it = aSortSet.begin();
+ it != aSortSet.end(); ++it, ++n)
{
- SwSortTxtElement* pBox = (SwSortTxtElement*)aSortArr[n];
aStart = nBeg + n;
- aRg.aStart = pBox->aPos.GetIndex();
+ aRg.aStart = it->aPos.GetIndex();
aRg.aEnd = aRg.aStart.GetIndex() + 1;
// Move Nodes
@@ -438,10 +438,12 @@ sal_Bool SwDoc::SortText(const SwPaM& rPaM, const SwSortOptions& rOpt)
// Insert Move in Undo
if(pUndoSort)
- pUndoSort->Insert(pBox->nOrg, nBeg + n);
+ {
+ pUndoSort->Insert(it->nOrg, nBeg + n);
+ }
}
// Delete all elements from the SortArray
- aSortArr.DeleteAndDestroy(0, aSortArr.Count());
+ aSortSet.clear();
SwSortElement::Finit();
if( pRedlPam )
@@ -585,7 +587,7 @@ sal_Bool SwDoc::SortTbl(const SwSelBoxes& rBoxes, const SwSortOptions& rOpt)
// Sort SortList by Key
SwSortElement::Init( this, rOpt, &aFlatBox );
- SwSortElements aSortList;
+ SwSortBoxElements aSortList;
// When sorting, do not include the first row if the HeaderLine is repeated
sal_uInt16 i;
@@ -593,18 +595,23 @@ sal_Bool SwDoc::SortTbl(const SwSelBoxes& rBoxes, const SwSortOptions& rOpt)
for( i = nStart; i < nCount; ++i)
{
SwSortBoxElement* pEle = new SwSortBoxElement( i );
- aSortList.Insert(pEle);
+ aSortList.insert(pEle);
}
// Move after Sorting
SwMovedBoxes aMovedList;
- for(i=0; i < aSortList.Count(); ++i)
+ i = 0;
+ for (SwSortBoxElements::const_iterator it = aSortList.begin();
+ it != aSortList.end(); ++i, ++it)
{
- SwSortBoxElement* pBox = (SwSortBoxElement*)aSortList[i];
if(rOpt.eDirection == SRT_ROWS)
- MoveRow(this, aFlatBox, pBox->nRow, i + nStart, aMovedList, pUndoSort);
+ {
+ MoveRow(this, aFlatBox, it->nRow, i+nStart, aMovedList, pUndoSort);
+ }
else
- MoveCol(this, aFlatBox, pBox->nRow, i + nStart, aMovedList, pUndoSort);
+ {
+ MoveCol(this, aFlatBox, it->nRow, i+nStart, aMovedList, pUndoSort);
+ }
}
// Restore table frames:
@@ -617,7 +624,7 @@ sal_Bool SwDoc::SortTbl(const SwSelBoxes& rBoxes, const SwSortOptions& rOpt)
UpdateCharts( pTblNd->GetTable().GetFrmFmt()->GetName() );
// Delete all Elements in the SortArray
- aSortList.DeleteAndDestroy( 0, aSortList.Count() );
+ aSortList.clear();
SwSortElement::Finit();
SetModified();
commit 3bf99d6c62e14880ecfaea298eaa2a40918ce333
Author: Michael Stahl <mstahl at redhat.com>
Date: Tue Jul 31 19:21:43 2012 +0200
SwHTMLPosFlyFrms: fix STL conversion:
It appears that the operator== for SwPosFlyFrm always returns false,
so cf0e08c6b8d739b8b17dc533efc3e12505b2d5a9 changed the semantics;
use std::mulitset to fix it.
Change-Id: Ib7a8ebe56e146d21c265e60ad68c6b4a319dfe98
diff --git a/sw/inc/flypos.hxx b/sw/inc/flypos.hxx
index e979ab8..b172054 100644
--- a/sw/inc/flypos.hxx
+++ b/sw/inc/flypos.hxx
@@ -55,7 +55,7 @@ public:
sal_uInt32 GetOrdNum() const { return nOrdNum; }
};
-class SW_DLLPUBLIC SwPosFlyFrms : public std::set<SwPosFlyFrm*> {};
+class SwPosFlyFrms : public std::multiset<SwPosFlyFrm*> {};
#endif // _FLYPOS_HXX
commit 3a1d91045b339c00267771acd60ed5d53a90c409
Author: Michael Stahl <mstahl at redhat.com>
Date: Tue Jul 31 19:13:45 2012 +0200
SwContentArr: fix STL conversion:
It appears that the operator== for SwContent always returns false,
so 81181891c93faee024799991317ac2c451f4c0c4 changed the semantics;
use o3tl::find_partialorder_ptrequals to fix it.
Change-Id: Ib4f040f03a9eaeec9a2973f5a93a22a387232017
diff --git a/sw/source/ui/utlui/content.cxx b/sw/source/ui/utlui/content.cxx
index 8e6ea32..f150239 100644
--- a/sw/source/ui/utlui/content.cxx
+++ b/sw/source/ui/utlui/content.cxx
@@ -105,7 +105,9 @@ using namespace ::com::sun::star::container;
#define NAVI_BOOKMARK_DELIM (sal_Unicode)1
class SwContentArr
- : public o3tl::sorted_vector<SwContent*, o3tl::less_ptr_to<SwContent> >
+ : public o3tl::sorted_vector<SwContent*, o3tl::less_ptr_to<SwContent>,
+ o3tl::find_partialorder_ptrequals<SwContent*,
+ o3tl::less_ptr_to<SwContent> > >
{
public:
~SwContentArr() { DeleteAndDestroyAll(); }
commit 24a8ad1591e11e2905318d31106a5568f92cac2b
Author: Michael Stahl <mstahl at redhat.com>
Date: Tue Jul 31 19:01:29 2012 +0200
SwHTMLPosFlyFrms: fix STL conversion:
It appears that the operator== for SwHTMLPosFlyFrm always returns false,
so fbabbcefd8f8575c7b08c7a7ac7fe0b665038214 changed the semantics;
use o3tl::find_partialorder_ptrequals to fix it.
Change-Id: I43797d62eb95a6c5012dd486fab98a0a8b88b768
diff --git a/sw/source/filter/html/htmlfly.hxx b/sw/source/filter/html/htmlfly.hxx
index 81f3ced..19b14e0 100644
--- a/sw/source/filter/html/htmlfly.hxx
+++ b/sw/source/filter/html/htmlfly.hxx
@@ -127,7 +127,12 @@ public:
sal_uInt8 GetOutCntnr() const { return nOutputMode & HTML_CNTNR_MASK; }
};
-class SwHTMLPosFlyFrms : public o3tl::sorted_vector<SwHTMLPosFlyFrm*, o3tl::less_ptr_to<SwHTMLPosFlyFrm> > {};
+class SwHTMLPosFlyFrms
+ : public o3tl::sorted_vector<SwHTMLPosFlyFrm*,
+ o3tl::less_ptr_to<SwHTMLPosFlyFrm>,
+ o3tl::find_partialorder_ptrequals<SwHTMLPosFlyFrm*,
+ o3tl::less_ptr_to<SwHTMLPosFlyFrm> > >
+{};
#endif
commit 64b2207025388b6a87462f912584228a10301628
Author: Michael Stahl <mstahl at redhat.com>
Date: Tue Jul 31 18:53:04 2012 +0200
_SwRedlineTbl: fix STL conversion:
It appears that the operator== for SwRedline does pointer equality
check, so ddd84d08c9bb6e00fbd9a73bd52a28688a8c1ba7 changed the
semantics; use o3tl::find_partialorder_ptrequals to fix it.
Change-Id: I8d4a13da9543ef8a7f6e38c05eef3a2c9918e421
diff --git a/sw/inc/docary.hxx b/sw/inc/docary.hxx
index 8270a74..7c9f928 100644
--- a/sw/inc/docary.hxx
+++ b/sw/inc/docary.hxx
@@ -143,7 +143,10 @@ struct CompareSwRedlineTbl
{
bool operator()(SwRedline* const &lhs, SwRedline* const &rhs) const;
};
-class _SwRedlineTbl : public o3tl::sorted_vector<SwRedline*, CompareSwRedlineTbl> {
+class _SwRedlineTbl
+ : public o3tl::sorted_vector<SwRedline*, CompareSwRedlineTbl,
+ o3tl::find_partialorder_ptrequals<SwRedline*, CompareSwRedlineTbl> >
+{
public:
~_SwRedlineTbl();
};
commit 2815396a1813cb3956c5aba066de49a7f34bc657
Author: Michael Stahl <mstahl at redhat.com>
Date: Tue Jul 31 17:25:44 2012 +0200
_SetGetExpFlds: this looks simpler with upper_bound
Change-Id: I37dd291aaa229493141fbb8b426488e8e4427185
diff --git a/sw/source/core/doc/docfld.cxx b/sw/source/core/doc/docfld.cxx
index 6f1fdf6..aa5156e 100644
--- a/sw/source/core/doc/docfld.cxx
+++ b/sw/source/core/doc/docfld.cxx
@@ -1106,12 +1106,10 @@ void SwDoc::FldsToCalc( SwCalc& rCalc, const _SetGetExpFld& rToThisFld )
if( !pUpdtFlds->GetSortLst()->empty() )
{
- _SetGetExpFlds::const_iterator itLast = pUpdtFlds->GetSortLst()->lower_bound( (_SetGetExpFld*)&rToThisFld );
- if (pUpdtFlds->GetSortLst()->end() != itLast && **itLast == rToThisFld)
- {
- ++itLast;
- }
-
+ _SetGetExpFlds::const_iterator const itLast = std::upper_bound(
+ pUpdtFlds->GetSortLst()->begin(),
+ pUpdtFlds->GetSortLst()->end(),
+ const_cast<_SetGetExpFld*>(&rToThisFld));
for( _SetGetExpFlds::const_iterator it = pUpdtFlds->GetSortLst()->begin(); it != itLast; ++it )
lcl_CalcFld( *this, rCalc, **it, pMgr );
}
@@ -1154,14 +1152,10 @@ void SwDoc::FldsToExpand( SwHash**& ppHashTbl, sal_uInt16& rTblSize,
ppHashTbl = new SwHash*[ rTblSize ];
memset( ppHashTbl, 0, sizeof( _HashStr* ) * rTblSize );
- _SetGetExpFlds::const_iterator itLast;
- {
- itLast = pUpdtFlds->GetSortLst()->lower_bound( (_SetGetExpFld*)&rToThisFld );
- if (pUpdtFlds->GetSortLst()->end() != itLast && **itLast == rToThisFld)
- {
- ++itLast;
- }
- }
+ _SetGetExpFlds::const_iterator const itLast = std::upper_bound(
+ pUpdtFlds->GetSortLst()->begin(),
+ pUpdtFlds->GetSortLst()->end(),
+ const_cast<_SetGetExpFld*>(&rToThisFld));
for( _SetGetExpFlds::const_iterator it = pUpdtFlds->GetSortLst()->begin(); it != itLast; ++it )
{
commit b60285e916e1c4102ef990f9aacb85307973d55e
Author: Michael Stahl <mstahl at redhat.com>
Date: Tue Jul 31 16:34:50 2012 +0200
SwpHintsArray: deploy some asserts
Change-Id: I16f416cb63221860ff743ce2e2291af99cd19de2
diff --git a/sw/source/core/txtnode/ndhints.cxx b/sw/source/core/txtnode/ndhints.cxx
index 88ea48f..29efd9f 100644
--- a/sw/source/core/txtnode/ndhints.cxx
+++ b/sw/source/core/txtnode/ndhints.cxx
@@ -130,14 +130,10 @@ bool CompareSwpHtEnd::operator()(SwTxtAttr* const lhs, SwTxtAttr* const rhs) con
void SwpHintsArray::Insert( const SwTxtAttr *pHt )
{
Resort();
-#if OSL_DEBUG_LEVEL > 0
- OSL_ENSURE(
- m_HintStarts.find(const_cast<SwTxtAttr*>(pHt)) == m_HintStarts.end(),
- "Insert: hint already in HtStart");
- OSL_ENSURE(
- m_HintEnds.find(const_cast<SwTxtAttr*>(pHt)) == m_HintEnds.end(),
- "Insert: hint already in HtEnd");
-#endif
+ assert(m_HintStarts.find(const_cast<SwTxtAttr*>(pHt))
+ == m_HintStarts.end()); // "Insert: hint already in HtStart"
+ assert(m_HintEnds.find(const_cast<SwTxtAttr*>(pHt))
+ == m_HintEnds.end()); // "Insert: hint already in HtEnd"
m_HintStarts.insert( const_cast<SwTxtAttr*>(pHt) );
m_HintEnds .insert( const_cast<SwTxtAttr*>(pHt) );
}
commit 43377e09d86dfcf800270a4c469ea5bd373392c6
Author: Michael Stahl <mstahl at redhat.com>
Date: Tue Jul 31 15:52:38 2012 +0200
fix some problems in previous STL conversion:
- use o3tl::find_partialorder_ptrequals to allow multiple hints on same
position
- GetPos must not dereference its argument
- unused IsEquals
Change-Id: I274203be96ff90d1e9a46bab17fd00355514a4fa
diff --git a/sw/inc/ndhints.hxx b/sw/inc/ndhints.hxx
index 75df3f7..154c957 100644
--- a/sw/inc/ndhints.hxx
+++ b/sw/inc/ndhints.hxx
@@ -75,13 +75,15 @@ struct CompareSwpHtStart
{
bool operator()(SwTxtAttr* const lhs, SwTxtAttr* const rhs) const;
};
-class SwpHtStart : public o3tl::sorted_vector<SwTxtAttr*, CompareSwpHtStart> {};
+class SwpHtStart : public o3tl::sorted_vector<SwTxtAttr*, CompareSwpHtStart,
+ o3tl::find_partialorder_ptrequals<SwTxtAttr*, CompareSwpHtStart> > {};
struct CompareSwpHtEnd
{
bool operator()(SwTxtAttr* const lhs, SwTxtAttr* const rhs) const;
};
-class SwpHtEnd : public o3tl::sorted_vector<SwTxtAttr*, CompareSwpHtEnd> {};
+class SwpHtEnd : public o3tl::sorted_vector<SwTxtAttr*, CompareSwpHtEnd,
+ o3tl::find_partialorder_ptrequals<SwTxtAttr*, CompareSwpHtEnd> > {};
// Class SwpHintsArr
@@ -212,7 +214,8 @@ SvStream &operator<<(SvStream &aS, const SwpHints &rHints); //$ ostream
inline sal_uInt16 SwpHintsArray::GetStartOf( const SwTxtAttr *pHt ) const
{
- SwpHtStart::const_iterator it = m_HintStarts.find( (SwTxtAttr*)pHt );
+ SwpHtStart::const_iterator const it =
+ m_HintStarts.find(const_cast<SwTxtAttr*>(pHt));
if ( it == m_HintStarts.end() )
{
return USHRT_MAX;
diff --git a/sw/source/core/txtnode/ndhints.cxx b/sw/source/core/txtnode/ndhints.cxx
index f3b8c9d..88ea48f 100644
--- a/sw/source/core/txtnode/ndhints.cxx
+++ b/sw/source/core/txtnode/ndhints.cxx
@@ -39,15 +39,6 @@
inline void DumpHints(const SwpHtStart &, const SwpHtEnd &) { }
/*************************************************************************
- * inline IsEqual()
- *************************************************************************/
-
-static bool IsEqual( const SwTxtAttr &rHt1, const SwTxtAttr &rHt2 )
-{
- return &rHt1 == &rHt2;
-}
-
-/*************************************************************************
* IsLessStart()
*************************************************************************/
@@ -140,13 +131,15 @@ void SwpHintsArray::Insert( const SwTxtAttr *pHt )
{
Resort();
#if OSL_DEBUG_LEVEL > 0
- OSL_ENSURE(m_HintStarts.find( (SwTxtAttr*)pHt ) == m_HintStarts.end(),
+ OSL_ENSURE(
+ m_HintStarts.find(const_cast<SwTxtAttr*>(pHt)) == m_HintStarts.end(),
"Insert: hint already in HtStart");
- OSL_ENSURE(m_HintEnds.find( (SwTxtAttr*)pHt ) == m_HintEnds.end(),
+ OSL_ENSURE(
+ m_HintEnds.find(const_cast<SwTxtAttr*>(pHt)) == m_HintEnds.end(),
"Insert: hint already in HtEnd");
#endif
- m_HintStarts.insert( (SwTxtAttr*)pHt );
- m_HintEnds.insert( (SwTxtAttr*)pHt );
+ m_HintStarts.insert( const_cast<SwTxtAttr*>(pHt) );
+ m_HintEnds .insert( const_cast<SwTxtAttr*>(pHt) );
}
void SwpHintsArray::DeleteAtPos( const sal_uInt16 nPos )
@@ -157,15 +150,23 @@ void SwpHintsArray::DeleteAtPos( const sal_uInt16 nPos )
Resort();
- m_HintEnds.erase( pHt );
+ bool const done = m_HintEnds.erase(pHt);
+ assert(done);
}
sal_uInt16 SwpHintsArray::GetPos( const SwTxtAttr *pHt ) const
{
- SwpHtStart::const_iterator it = m_HintStarts.find( (SwTxtAttr*)pHt );
- if( it == m_HintStarts.end() )
- return USHRT_MAX;
- return it - m_HintStarts.begin();
+ // DO NOT use find() here!
+ // if called from SwTxtNode::InsertItem, pHt has already been deleted,
+ // so it cannot be dereferenced
+ for (size_t i = 0; i < m_HintStarts.size(); ++i)
+ {
+ if (m_HintStarts[i] == pHt)
+ {
+ return i;
+ }
+ }
+ return USHRT_MAX;
}
#ifdef DBG_UTIL
@@ -234,13 +235,13 @@ bool SwpHintsArray::Check() const
// --- Ueberkreuzungen ---
// 5) gleiche Pointer in beiden Arrays
- if( m_HintStarts.find( (SwTxtAttr*)pHt ) == m_HintStarts.end() )
+ if (m_HintStarts.find(const_cast<SwTxtAttr*>(pHt)) == m_HintStarts.end())
nIdx = STRING_LEN;
CHECK_ERR( STRING_LEN != nIdx, "HintsCheck: no GetStartOf" );
// 6) gleiche Pointer in beiden Arrays
- if( m_HintEnds.find( (SwTxtAttr*)pHt ) == m_HintEnds.end() )
+ if (m_HintEnds.find(const_cast<SwTxtAttr*>(pHt)) == m_HintEnds.end())
nIdx = STRING_LEN;
CHECK_ERR( STRING_LEN != nIdx, "HintsCheck: no GetEndOf" );
commit 4623c603bde7678004fe6019f9d9e4b816a3d6c6
Author: Noel Grandin <noel at peralex.com>
Date: Mon Jul 30 23:00:44 2012 +0200
sw: convert SwpHtStart SwpHtEnd to sorted_vector
Change-Id: I74696094ef066687582bd961d61a4877673016fd
diff --git a/sw/inc/ndhints.hxx b/sw/inc/ndhints.hxx
index 6f0d896..75df3f7 100644
--- a/sw/inc/ndhints.hxx
+++ b/sw/inc/ndhints.hxx
@@ -29,8 +29,8 @@
#define _NDHINTS_HXX
-#include <svl/svarray.hxx>
#include <tools/mempool.hxx>
+#include <o3tl/sorted_vector.hxx>
#include "swtypes.hxx"
@@ -71,9 +71,17 @@ MakeRedlineTxtAttr( SwDoc & rDoc, SfxPoolItem& rAttr );
// Class SwpHtStart/End
+struct CompareSwpHtStart
+{
+ bool operator()(SwTxtAttr* const lhs, SwTxtAttr* const rhs) const;
+};
+class SwpHtStart : public o3tl::sorted_vector<SwTxtAttr*, CompareSwpHtStart> {};
-SV_DECL_PTRARR_SORT(SwpHtStart,SwTxtAttr*,1)
-SV_DECL_PTRARR_SORT(SwpHtEnd,SwTxtAttr*,1)
+struct CompareSwpHtEnd
+{
+ bool operator()(SwTxtAttr* const lhs, SwTxtAttr* const rhs) const;
+};
+class SwpHtEnd : public o3tl::sorted_vector<SwTxtAttr*, CompareSwpHtEnd> {};
// Class SwpHintsArr
@@ -102,18 +110,17 @@ public:
inline SwTxtAttr * GetEnd ( const sal_uInt16 nPos )
{ return m_HintEnds [nPos]; }
- inline sal_uInt16 GetEndCount() const { return m_HintEnds .Count(); }
- inline sal_uInt16 GetStartCount() const { return m_HintStarts.Count(); }
+ inline sal_uInt16 GetEndCount() const { return m_HintEnds .size(); }
+ inline sal_uInt16 GetStartCount() const { return m_HintStarts.size(); }
inline sal_uInt16 GetStartOf( const SwTxtAttr *pHt ) const;
- inline sal_uInt16 GetPos( const SwTxtAttr *pHt ) const
- { return m_HintStarts.GetPos( pHt ); }
+ sal_uInt16 GetPos( const SwTxtAttr *pHt ) const;
inline SwTxtAttr * GetTextHint( const sal_uInt16 nIdx )
{ return GetStart(nIdx); }
inline const SwTxtAttr * operator[]( const sal_uInt16 nIdx ) const
{ return m_HintStarts[nIdx]; }
- inline sal_uInt16 Count() const { return m_HintStarts.Count(); }
+ inline sal_uInt16 Count() const { return m_HintStarts.size(); }
#ifdef DBG_UTIL
bool Check() const;
@@ -205,12 +212,12 @@ SvStream &operator<<(SvStream &aS, const SwpHints &rHints); //$ ostream
inline sal_uInt16 SwpHintsArray::GetStartOf( const SwTxtAttr *pHt ) const
{
- sal_uInt16 nPos;
- if ( !m_HintStarts.Seek_Entry( pHt, &nPos ) )
+ SwpHtStart::const_iterator it = m_HintStarts.find( (SwTxtAttr*)pHt );
+ if ( it == m_HintStarts.end() )
{
- nPos = USHRT_MAX;
+ return USHRT_MAX;
}
- return nPos;
+ return it - m_HintStarts.begin();
}
inline SwTxtAttr *SwpHintsArray::Cut( const sal_uInt16 nPosInStart )
diff --git a/sw/source/core/txtnode/ndhints.cxx b/sw/source/core/txtnode/ndhints.cxx
index 02c0cfd..f3b8c9d 100644
--- a/sw/source/core/txtnode/ndhints.cxx
+++ b/sw/source/core/txtnode/ndhints.cxx
@@ -36,9 +36,6 @@
#endif
-_SV_IMPL_SORTAR_ALG( SwpHtStart, SwTxtAttr* )
-_SV_IMPL_SORTAR_ALG( SwpHtEnd, SwTxtAttr* )
-
inline void DumpHints(const SwpHtStart &, const SwpHtEnd &) { }
/*************************************************************************
@@ -125,76 +122,14 @@ static sal_Bool lcl_IsLessEnd( const SwTxtAttr &rHt1, const SwTxtAttr &rHt2 )
return ( nHt1 < nHt2 );
}
-/*************************************************************************
- * SwpHtStart::Seek_Entry()
- *************************************************************************/
-
-sal_Bool SwpHtStart::Seek_Entry( const SwTxtAttr *pElement, sal_uInt16 *pPos ) const
+bool CompareSwpHtStart::operator()(SwTxtAttr* const lhs, SwTxtAttr* const rhs) const
{
- sal_uInt16 nOben = Count(), nMitte, nUnten = 0;
- if( nOben > 0 )
- {
- nOben--;
- while( nUnten <= nOben )
- {
- nMitte = nUnten + ( nOben - nUnten ) / 2;
- const SwTxtAttr *pMitte = (*this)[nMitte];
- if( IsEqual( *pMitte, *pElement ) )
- {
- *pPos = nMitte;
- return sal_True;
- }
- else
- if( lcl_IsLessStart( *pMitte, *pElement ) )
- nUnten = nMitte + 1;
- else
- if( nMitte == 0 )
- {
- *pPos = nUnten;
- return sal_False;
- }
- else
- nOben = nMitte - 1;
- }
- }
- *pPos = nUnten;
- return sal_False;
+ return lcl_IsLessStart( *lhs, *rhs );
}
-/*************************************************************************
- * SwpHtEnd::Seek_Entry()
- *************************************************************************/
-
-sal_Bool SwpHtEnd::Seek_Entry( const SwTxtAttr *pElement, sal_uInt16 *pPos ) const
+bool CompareSwpHtEnd::operator()(SwTxtAttr* const lhs, SwTxtAttr* const rhs) const
{
- sal_uInt16 nOben = Count(), nMitte, nUnten = 0;
- if( nOben > 0 )
- {
- nOben--;
- while( nUnten <= nOben )
- {
- nMitte = nUnten + ( nOben - nUnten ) / 2;
- const SwTxtAttr *pMitte = (*this)[nMitte];
- if( IsEqual( *pMitte, *pElement ) )
- {
- *pPos = nMitte;
- return sal_True;
- }
- else
- if( lcl_IsLessEnd( *pMitte, *pElement ) )
- nUnten = nMitte + 1;
- else
- if( nMitte == 0 )
- {
- *pPos = nUnten;
- return sal_False;
- }
- else
- nOben = nMitte - 1;
- }
- }
- *pPos = nUnten;
- return sal_False;
+ return lcl_IsLessEnd( *lhs, *rhs );
}
/*************************************************************************
@@ -205,27 +140,32 @@ void SwpHintsArray::Insert( const SwTxtAttr *pHt )
{
Resort();
#if OSL_DEBUG_LEVEL > 0
- sal_uInt16 nPos;
- OSL_ENSURE(!m_HintStarts.Seek_Entry( pHt, &nPos ),
+ OSL_ENSURE(m_HintStarts.find( (SwTxtAttr*)pHt ) == m_HintStarts.end(),
"Insert: hint already in HtStart");
- OSL_ENSURE(!m_HintEnds.Seek_Entry( pHt, &nPos ),
+ OSL_ENSURE(m_HintEnds.find( (SwTxtAttr*)pHt ) == m_HintEnds.end(),
"Insert: hint already in HtEnd");
#endif
- m_HintStarts.Insert( pHt );
- m_HintEnds.Insert( pHt );
+ m_HintStarts.insert( (SwTxtAttr*)pHt );
+ m_HintEnds.insert( (SwTxtAttr*)pHt );
}
void SwpHintsArray::DeleteAtPos( const sal_uInt16 nPos )
{
// optimization: nPos is the position in the Starts array
- const SwTxtAttr *pHt = m_HintStarts[ nPos ];
- m_HintStarts.Remove( nPos );
+ SwTxtAttr *pHt = m_HintStarts[ nPos ];
+ m_HintStarts.erase( m_HintStarts.begin() + nPos );
Resort();
- sal_uInt16 nEndPos;
- m_HintEnds.Seek_Entry( pHt, &nEndPos );
- m_HintEnds.Remove( nEndPos );
+ m_HintEnds.erase( pHt );
+}
+
+sal_uInt16 SwpHintsArray::GetPos( const SwTxtAttr *pHt ) const
+{
+ SwpHtStart::const_iterator it = m_HintStarts.find( (SwTxtAttr*)pHt );
+ if( it == m_HintStarts.end() )
+ return USHRT_MAX;
+ return it - m_HintStarts.begin();
}
#ifdef DBG_UTIL
@@ -246,7 +186,7 @@ void SwpHintsArray::DeleteAtPos( const sal_uInt16 nPos )
bool SwpHintsArray::Check() const
{
// 1) gleiche Anzahl in beiden Arrays
- CHECK_ERR( m_HintStarts.Count() == m_HintEnds.Count(),
+ CHECK_ERR( m_HintStarts.size() == m_HintEnds.size(),
"HintsCheck: wrong sizes" );
xub_StrLen nLastStart = 0;
xub_StrLen nLastEnd = 0;
@@ -294,13 +234,13 @@ bool SwpHintsArray::Check() const
// --- Ueberkreuzungen ---
// 5) gleiche Pointer in beiden Arrays
- if( !m_HintStarts.Seek_Entry( pHt, &nIdx ) )
+ if( m_HintStarts.find( (SwTxtAttr*)pHt ) == m_HintStarts.end() )
nIdx = STRING_LEN;
CHECK_ERR( STRING_LEN != nIdx, "HintsCheck: no GetStartOf" );
// 6) gleiche Pointer in beiden Arrays
- if( !m_HintEnds.Seek_Entry( pHt, &nIdx ) )
+ if( m_HintEnds.find( (SwTxtAttr*)pHt ) == m_HintEnds.end() )
nIdx = STRING_LEN;
CHECK_ERR( STRING_LEN != nIdx, "HintsCheck: no GetEndOf" );
@@ -386,13 +326,13 @@ bool SwpHintsArray::Resort()
const SwTxtAttr *pLast = 0;
sal_uInt16 i;
- for ( i = 0; i < m_HintStarts.Count(); ++i )
+ for ( i = 0; i < m_HintStarts.size(); ++i )
{
- const SwTxtAttr *pHt = m_HintStarts[i];
+ SwTxtAttr *pHt = m_HintStarts[i];
if( pLast && !lcl_IsLessStart( *pLast, *pHt ) )
{
- m_HintStarts.Remove( i );
- m_HintStarts.Insert( pHt );
+ m_HintStarts.erase( m_HintStarts.begin() + i );
+ m_HintStarts.insert( pHt );
pHt = m_HintStarts[i];
if ( pHt != pLast )
--i;
@@ -402,13 +342,13 @@ bool SwpHintsArray::Resort()
}
pLast = 0;
- for ( i = 0; i < m_HintEnds.Count(); ++i )
+ for ( i = 0; i < m_HintEnds.size(); ++i )
{
- const SwTxtAttr *pHt = m_HintEnds[i];
+ SwTxtAttr *pHt = m_HintEnds[i];
if( pLast && !lcl_IsLessEnd( *pLast, *pHt ) )
{
- m_HintEnds.Remove( i );
- m_HintEnds.Insert( pHt );
+ m_HintEnds.erase( m_HintEnds.begin() + i );
+ m_HintEnds.insert( pHt );
pHt = m_HintEnds[i]; // normalerweise == pLast
// Wenn die Unordnung etwas groesser ist (24200),
// muessen wir Position i erneut vergleichen.
commit 7ee95c521007e28ea827e8196062abb74f5c519a
Author: Michael Stahl <mstahl at redhat.com>
Date: Tue Jul 31 15:41:57 2012 +0200
sorted_vector: add an additional template parameter:
The Find parameter allows to implement sorted_vector that uses the
obvious std::less-like semantics, and also allows for a different
semantics where the array is sorted like std::less but duplicate values
(according to std::less) are allowed except if they're actually the same
object (pointer equality).
Change-Id: Id54871c336ddbc2d0a2272bcc81c56914943b449
diff --git a/o3tl/inc/o3tl/sorted_vector.hxx b/o3tl/inc/o3tl/sorted_vector.hxx
index 0fe46cf..4d442dd 100644
--- a/o3tl/inc/o3tl/sorted_vector.hxx
+++ b/o3tl/inc/o3tl/sorted_vector.hxx
@@ -17,12 +17,18 @@
namespace o3tl
{
+// forward declared because it's default tempate arg for sorted_vector
+template<class Value, class Compare>
+struct find_unique;
+
/** Represents a sorted vector of values.
@tpl Value class of item to be stored in container
@tpl Compare comparison method
+ @tpl Find look up index of a Value in the array
*/
-template <class Value, class Compare = std::less<Value> >
+template<class Value, class Compare = std::less<Value>,
+ class Find = find_unique<Value, Compare> >
class sorted_vector
: private std::vector<Value>
{
@@ -41,21 +47,22 @@ public:
std::pair<const_iterator,bool> insert( const Value& x )
{
- iterator it = lower_bound_nonconst( x );
- if (it == base_t::end() || less_than(x, *it))
+ std::pair<const_iterator, bool> const ret(Find()(begin(), end(), x));
+ if (!ret.second)
{
- it = base_t::insert( it, x );
- return std::make_pair( it, true );
+ const_iterator const it = base_t::insert(
+ begin_nonconst() + (ret.first - begin()), x);
+ return std::make_pair(it, true);
}
- return std::make_pair( it, false );
+ return std::make_pair(ret.first, false);
}
size_type erase( const Value& x )
{
- iterator it = lower_bound_nonconst( x );
- if (it != base_t::end() && !less_than(x, *it))
+ std::pair<const_iterator, bool> const ret(Find()(begin(), end(), x));
+ if (ret.second)
{
- base_t::erase(it);
+ base_t::erase(begin_nonconst() + (ret.first - begin()));
return 1;
}
return 0;
@@ -122,15 +129,11 @@ public:
*/
const_iterator find( const Value& x ) const
{
- const_iterator it = lower_bound( x );
- if (it == base_t::end() || less_than(x, *it))
- {
- return base_t::end();
- }
- return it;
+ std::pair<const_iterator, bool> const ret(Find()(begin(), end(), x));
+ return (ret.second) ? ret.first : end();
}
- void insert( sorted_vector<Value,Compare> &rOther )
+ void insert( sorted_vector<Value,Compare,Find> &rOther )
{
// optimisation for the rather common case that we are overwriting this with the contents
// of another sorted vector
@@ -153,16 +156,6 @@ public:
}
private:
- /** just makes the code easier to read */
- bool less_than(const Value& lhs, const Value& rhs) const
- {
- return Compare().operator()(lhs, rhs);
- }
-
- iterator lower_bound_nonconst( const Value& x )
- {
- return std::lower_bound( base_t::begin(), base_t::end(), x, Compare() );
- }
typename base_t::iterator begin_nonconst() { return base_t::begin(); }
typename base_t::iterator end_nonconst() { return base_t::end(); }
@@ -181,6 +174,47 @@ template <class T> struct less_ptr_to : public std::binary_function <T*,T*,bool>
}
};
+/** the elements are totally ordered by Compare,
+ for no 2 elements !Compare(a,b) && !Compare(b,a) is true
+ */
+template<class Value, class Compare>
+struct find_unique
+{
+ typedef typename sorted_vector<Value, Compare, find_unique>
+ ::const_iterator const_iterator;
+ std::pair<const_iterator, bool> operator()(
+ const_iterator first, const_iterator last,
+ Value const& v)
+ {
+ const_iterator const it = std::lower_bound(first, last, v, Compare());
+ return std::make_pair(it, (it != last && !Compare()(v, *it)));
+ }
+};
+
+/** the elments are partially ordered by Compare,
+ 2 elements are allowed if they are not the same element (pointer equal)
+ */
+template<class Value, class Compare>
+struct find_partialorder_ptrequals
+{
+ typedef typename sorted_vector<Value, Compare, find_partialorder_ptrequals>
+ ::const_iterator const_iterator;
+ std::pair<const_iterator, bool> operator()(
+ const_iterator first, const_iterator last,
+ Value const& v)
+ {
+ std::pair<const_iterator, const_iterator> const its =
+ std::equal_range(first, last, v, Compare());
+ for (const_iterator it = its.first; it != its.second; ++it)
+ {
+ if (v == *it)
+ {
+ return std::make_pair(it, true);
+ }
+ }
+ return std::make_pair(its.first, false);
+ }
+};
} // namespace o3tl
#endif
diff --git a/o3tl/qa/test-sorted_vector.cxx b/o3tl/qa/test-sorted_vector.cxx
index 5641ad2..1b321c9 100644
--- a/o3tl/qa/test-sorted_vector.cxx
+++ b/o3tl/qa/test-sorted_vector.cxx
@@ -133,6 +133,118 @@ public:
CPPUNIT_ASSERT( aVec.lower_bound(p4) == aVec.end() );
}
+ void testBasics_FindPtr()
+ {
+ o3tl::sorted_vector<SwContent*, o3tl::less_ptr_to<SwContent>,
+ o3tl::find_partialorder_ptrequals<SwContent*,
+ o3tl::less_ptr_to<SwContent> > > aVec;
+ SwContent *p1 = new SwContent(1);
+ SwContent *p2 = new SwContent(2);
+ SwContent *p2_2 = new SwContent(2);
+ SwContent *p2_3 = new SwContent(2);
+ SwContent *p2_4 = new SwContent(2);
+ SwContent *p3 = new SwContent(3);
+ SwContent *p4 = new SwContent(4);
+
+ CPPUNIT_ASSERT( aVec.insert(p3).second );
+ CPPUNIT_ASSERT( aVec.insert(p1).second );
+ CPPUNIT_ASSERT( !aVec.insert(p3).second );
+
+ CPPUNIT_ASSERT( aVec.size() == 2 );
+
+ CPPUNIT_ASSERT( aVec[0] == p1 );
+ CPPUNIT_ASSERT( aVec[1] == p3 );
+
+ CPPUNIT_ASSERT( aVec.insert(p2_2).second );
+ CPPUNIT_ASSERT( aVec.insert(p2_3).second );
+ CPPUNIT_ASSERT( !aVec.insert(p2_2).second );
+ CPPUNIT_ASSERT( aVec.insert(p2_4).second );
+ CPPUNIT_ASSERT( aVec.size() == 5 );
+
+ CPPUNIT_ASSERT( *aVec.begin() == p1 );
+ CPPUNIT_ASSERT( *(aVec.end()-1) == p3 );
+
+ CPPUNIT_ASSERT( aVec.front() == p1 );
+ CPPUNIT_ASSERT( aVec.back() == p3 );
+
+ CPPUNIT_ASSERT( aVec.find(p1) != aVec.end() );
+ CPPUNIT_ASSERT( aVec.find(p1) - aVec.begin() == 0 );
+ CPPUNIT_ASSERT( aVec.find(p3) != aVec.end() );
+ CPPUNIT_ASSERT( aVec.find(p3) - aVec.begin() == 4 );
+ CPPUNIT_ASSERT( aVec.find(p2) == aVec.end() );
+ CPPUNIT_ASSERT( aVec.find(p4) == aVec.end() );
+ CPPUNIT_ASSERT( aVec.find(p2_2) != aVec.end() );
+ CPPUNIT_ASSERT( aVec.find(p2_2) - aVec.begin() >= 1 );
+ CPPUNIT_ASSERT( aVec.find(p2_2) - aVec.begin() < 4 );
+ CPPUNIT_ASSERT( aVec.find(p2_3) != aVec.end() );
+ CPPUNIT_ASSERT( aVec.find(p2_3) - aVec.begin() >= 1 );
+ CPPUNIT_ASSERT( aVec.find(p2_3) - aVec.begin() < 4 );
+ CPPUNIT_ASSERT( aVec.find(p2_4) != aVec.end() );
+ CPPUNIT_ASSERT( aVec.find(p2_4) - aVec.begin() >= 1 );
+ CPPUNIT_ASSERT( aVec.find(p2_4) - aVec.begin() < 4 );
+
+ CPPUNIT_ASSERT( aVec.erase(p1) == 1 );
+ CPPUNIT_ASSERT( aVec.size() == 4 );
+ CPPUNIT_ASSERT( aVec.erase(p2) == 0 );
+ CPPUNIT_ASSERT( aVec.erase(p2_3) == 1 );
+ CPPUNIT_ASSERT( aVec.size() == 3 );
+
+ aVec.DeleteAndDestroyAll();
+ }
+
+ void testErase_FindPtr()
+ {
+ o3tl::sorted_vector<SwContent*, o3tl::less_ptr_to<SwContent>,
+ o3tl::find_partialorder_ptrequals<SwContent*,
+ o3tl::less_ptr_to<SwContent> > > aVec;
+ SwContent *p1 = new SwContent(1);
+ SwContent *p1_2 = new SwContent(1);
+ SwContent *p1_3 = new SwContent(1);
+ SwContent *p2 = new SwContent(2);
+ SwContent *p3 = new SwContent(3);
+ SwContent *p4 = new SwContent(4);
+
+ aVec.insert(p1);
+ aVec.insert(p2);
+ aVec.insert(p3);
+
+ CPPUNIT_ASSERT( aVec.erase(p1) == 1 );
+ CPPUNIT_ASSERT( aVec.size() == 2 );
+
+ aVec.erase(1);
+ CPPUNIT_ASSERT( aVec.size() == 1 );
+
+ CPPUNIT_ASSERT( aVec.erase(p4) == 0 );
+
+ aVec.clear();
+ CPPUNIT_ASSERT( aVec.size() == 0 );
+
+ aVec.insert(p1);
+ aVec.insert(p2);
+ aVec.insert(p3);
+ aVec.insert(p1_2);
+ CPPUNIT_ASSERT( aVec.size() == 4 );
+ aVec.insert(p1_3);
+ CPPUNIT_ASSERT( aVec.size() == 5 );
+ CPPUNIT_ASSERT( aVec.erase(p1) == 1 );
+ CPPUNIT_ASSERT( aVec.find(p1) == aVec.end() );
+ CPPUNIT_ASSERT( aVec.find(p1_2) != aVec.end() );
+ CPPUNIT_ASSERT( aVec.find(p1_3) != aVec.end() );
+ CPPUNIT_ASSERT( aVec.erase(p1_3) == 1 );
+ CPPUNIT_ASSERT( aVec.find(p1) == aVec.end() );
+ CPPUNIT_ASSERT( aVec.find(p1_2) != aVec.end() );
+ CPPUNIT_ASSERT( aVec.find(p1_3) == aVec.end() );
+ CPPUNIT_ASSERT( aVec.erase(p1_3) == 0 );
+ CPPUNIT_ASSERT( aVec.find(p1) == aVec.end() );
+ CPPUNIT_ASSERT( aVec.find(p1_2) != aVec.end() );
+ CPPUNIT_ASSERT( aVec.find(p1_3) == aVec.end() );
+
+ aVec.DeleteAndDestroyAll();
+ CPPUNIT_ASSERT( aVec.size() == 0 );
+ }
+
+
+
// Change the following lines only, if you add, remove or rename
// member functions of the current class,
// because these macros are need by auto register mechanism.
@@ -142,6 +254,8 @@ public:
CPPUNIT_TEST(testErase);
CPPUNIT_TEST(testInsertRange);
CPPUNIT_TEST(testLowerBound);
+ CPPUNIT_TEST(testBasics_FindPtr);
+ CPPUNIT_TEST(testErase_FindPtr);
CPPUNIT_TEST_SUITE_END();
};
commit 51bbbc6a58d0d9cfd39a2d95ce60871a619bea64
Author: Michael Stahl <mstahl at redhat.com>
Date: Mon Jul 30 22:14:52 2012 +0200
SwRedlineItr: convert to STL
Change-Id: Idf3031a0a39d9154ba2894684ea51125553776b3
diff --git a/sw/source/core/text/redlnitr.cxx b/sw/source/core/text/redlnitr.cxx
index 0e63f76..05f0cc9 100644
--- a/sw/source/core/text/redlnitr.cxx
+++ b/sw/source/core/text/redlnitr.cxx
@@ -275,7 +275,7 @@ short SwRedlineItr::_Seek( SwFont& rFnt, xub_StrLen nNew, xub_StrLen nOld )
const_cast<SwDoc&>(rDoc),
*const_cast<SfxPoolItem*>(pItem) );
pAttr->SetPriorityAttr( sal_True );
- aHints.C40_INSERT( SwTxtAttr, pAttr, aHints.Count());
+ m_Hints.push_back(pAttr);
rAttrHandler.PushAndChg( *pAttr, rFnt );
if( RES_CHRATR_COLOR == nWhich )
rFnt.SetNoCol( sal_True );
@@ -338,10 +338,10 @@ void SwRedlineItr::_Clear( SwFont* pFnt )
{
OSL_ENSURE( bOn, "SwRedlineItr::Clear: Off?" );
bOn = sal_False;
- while( aHints.Count() )
+ while (!m_Hints.empty())
{
- SwTxtAttr *pPos = aHints[ 0 ];
- aHints.Remove(0);
+ SwTxtAttr *pPos = m_Hints.front();
+ m_Hints.pop_front();
if( pFnt )
rAttrHandler.PopAndChg( *pPos, *pFnt );
else
@@ -377,9 +377,9 @@ sal_Bool SwRedlineItr::_ChkSpecialUnderline() const
// Wenn die Unterstreichung oder das Escapement vom Redling kommt,
// wenden wir immer das SpecialUnderlining, d.h. die Unterstreichung
// unter der Grundlinie an.
- for( MSHORT i = 0; i < aHints.Count(); ++i )
+ for (MSHORT i = 0; i < m_Hints.size(); ++i)
{
- MSHORT nWhich = aHints[i]->Which();
+ MSHORT nWhich = m_Hints[i]->Which();
if( RES_CHRATR_UNDERLINE == nWhich ||
RES_CHRATR_ESCAPEMENT == nWhich )
return sal_True;
diff --git a/sw/source/core/text/redlnitr.hxx b/sw/source/core/text/redlnitr.hxx
index 8cbc117..42f1c24 100644
--- a/sw/source/core/text/redlnitr.hxx
+++ b/sw/source/core/text/redlnitr.hxx
@@ -66,7 +66,7 @@ public:
class SwRedlineItr
{
- SwpHtStart_SAR aHints;
+ std::deque<SwTxtAttr *> m_Hints;
const SwDoc& rDoc;
const SwTxtNode& rNd;
SwAttrHandler& rAttrHandler;
More information about the Libreoffice-commits
mailing list