diff options
author | Eike Rathke <erack@redhat.com> | 2012-02-10 17:26:44 +0100 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2012-02-10 17:27:27 +0100 |
commit | 43aa1115c88f1300c73337a3622c2c03faa699f7 (patch) | |
tree | df60e4e395da7cc4f74534a784bd3286821fe702 /sc | |
parent | d4a31e6ae28825a42cb8b1935fdfd777cda41e8f (diff) |
changes to "convert detdata.cxx in SC module to boost:ptr_vector"
* for includes from other modules use <> instead of "", i.e.
<boost/ptr_container/ptr_vector.hpp>
* use size_t instead of int for container positions and count
* no need for DeleteAndDestroy(), in fact delete p followed by
ptr_vector::erase() attempted to delete the instance twice and would crash
* adapted places that accessed DeleteAndDestroy() to operate on the vector
instead
* introduced GetDataVector() for that
* changed the DeleteOnTab() loop that used DeleteAndDestroy() to properly
iterate over the container instead
* changed UpdateReference() to a loop using iterator
* changed operator==() to use size_t instead of sal_uInt16
* note aside: mixing sal_uInt16 with a container's size isn't a good idea
* adapted places that access Count() and GetObject() to use size_t instead of
sal_uInt16
* made GetObject() const and return const ScDetOpData*
* changed indentation to 4 spaces per level
Diffstat (limited to 'sc')
-rw-r--r-- | sc/inc/detdata.hxx | 10 | ||||
-rw-r--r-- | sc/source/core/tool/detdata.cxx | 40 | ||||
-rw-r--r-- | sc/source/filter/xml/xmlexprt.cxx | 8 | ||||
-rw-r--r-- | sc/source/ui/docshell/docfunc.cxx | 6 | ||||
-rw-r--r-- | sc/source/ui/undo/undocell.cxx | 8 |
5 files changed, 29 insertions, 43 deletions
diff --git a/sc/inc/detdata.hxx b/sc/inc/detdata.hxx index 891c803d8b18..6ba78c706f34 100644 --- a/sc/inc/detdata.hxx +++ b/sc/inc/detdata.hxx @@ -30,8 +30,8 @@ #define SC_DETDATA_HXX #include <svl/svarray.hxx> +#include <boost/ptr_container/ptr_vector.hpp> #include "global.hxx" -#include "boost/ptr_container/ptr_vector.hpp" //------------------------------------------------------------------------ @@ -79,7 +79,7 @@ typedef boost::ptr_vector<ScDetOpData> ScDetOpDataVector; class ScDetOpList { sal_Bool bHasAddError; // updated in append - ScDetOpDataVector aDetOpDataVector; + ScDetOpDataVector aDetOpDataVector; public: ScDetOpList() : bHasAddError(false) {} @@ -93,11 +93,11 @@ public: sal_Bool operator==( const ScDetOpList& r ) const; // for ref-undo void Append( ScDetOpData* pData ); - ScDetOpData* GetObject(int i); - void DeleteAndDestroy(int i); + ScDetOpDataVector& GetDataVector() { return aDetOpDataVector; } + const ScDetOpData* GetObject( size_t nPos ) const; sal_Bool HasAddError() const { return bHasAddError; } - int Count() const { return aDetOpDataVector.size(); } + size_t Count() const { return aDetOpDataVector.size(); } }; diff --git a/sc/source/core/tool/detdata.cxx b/sc/source/core/tool/detdata.cxx index d23208c22cc3..5a0ed3ac6820 100644 --- a/sc/source/core/tool/detdata.cxx +++ b/sc/source/core/tool/detdata.cxx @@ -40,33 +40,30 @@ ScDetOpList::ScDetOpList(const ScDetOpList& rList) : bHasAddError( false ) { - sal_uInt16 nCount = rList.Count(); + size_t nCount = rList.Count(); - for (sal_uInt16 i=0; i<nCount; i++) + for (size_t i=0; i<nCount; i++) Append( new ScDetOpData(rList.aDetOpDataVector[i]) ); } void ScDetOpList::DeleteOnTab( SCTAB nTab ) { - sal_uInt16 nPos = 0; - while ( nPos < Count() ) + for (ScDetOpDataVector::iterator it = aDetOpDataVector.begin(); it != aDetOpDataVector.end(); /*noop*/ ) { // look for operations on the deleted sheet - - if ( GetObject(nPos)->GetPos().Tab() == nTab ) - DeleteAndDestroy(nPos); + if (it->GetPos().Tab() == nTab) + it = aDetOpDataVector.erase( it); else - ++nPos; + ++it; } } void ScDetOpList::UpdateReference( ScDocument* pDoc, UpdateRefMode eUpdateRefMode, const ScRange& rRange, SCsCOL nDx, SCsROW nDy, SCsTAB nDz ) { - sal_uInt16 nCount = Count(); - for (sal_uInt16 i=0; i<nCount; i++) + for (ScDetOpDataVector::iterator it = aDetOpDataVector.begin(); it != aDetOpDataVector.end(); ++it ) { - ScAddress aPos = GetObject(i)->GetPos(); + ScAddress aPos = it->GetPos(); SCCOL nCol1 = aPos.Col(); SCROW nRow1 = aPos.Row(); SCTAB nTab1 = aPos.Tab(); @@ -80,7 +77,7 @@ void ScDetOpList::UpdateReference( ScDocument* pDoc, UpdateRefMode eUpdateRefMod rRange.aEnd.Col(), rRange.aEnd.Row(), rRange.aEnd.Tab(), nDx, nDy, nDz, nCol1, nRow1, nTab1, nCol2, nRow2, nTab2 ); if ( eRes != UR_NOTHING ) - GetObject(i)->SetPos( ScAddress( nCol1, nRow1, nTab1 ) ); + it->SetPos( ScAddress( nCol1, nRow1, nTab1 ) ); } } @@ -97,29 +94,18 @@ sal_Bool ScDetOpList::operator==( const ScDetOpList& r ) const { // fuer Ref-Undo - sal_uInt16 nCount = Count(); + size_t nCount = Count(); sal_Bool bEqual = ( nCount == r.Count() ); - for (sal_uInt16 i=0; i<nCount && bEqual; i++) // Reihenfolge muss auch gleich sein + for (size_t i=0; i<nCount && bEqual; i++) // Reihenfolge muss auch gleich sein if ( !(aDetOpDataVector[i] == r.aDetOpDataVector[i]) ) // Eintraege unterschiedlich ? bEqual = false; return bEqual; } -ScDetOpData* ScDetOpList::GetObject(int i) +const ScDetOpData* ScDetOpList::GetObject( size_t nPos ) const { - return &aDetOpDataVector[i]; + return &aDetOpDataVector[nPos]; } -void ScDetOpList::DeleteAndDestroy(int i) -{ - const ScDetOpData* p = &aDetOpDataVector[i]; - if (p != NULL) - { - delete p; - aDetOpDataVector.erase(aDetOpDataVector.begin() + i); - } -} - - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/filter/xml/xmlexprt.cxx b/sc/source/filter/xml/xmlexprt.cxx index 8a8dde71172f..01689d251dc7 100644 --- a/sc/source/filter/xml/xmlexprt.cxx +++ b/sc/source/filter/xml/xmlexprt.cxx @@ -910,17 +910,17 @@ void ScXMLExport::GetDetectiveOpList( ScMyDetectiveOpContainer& rDetOp ) ScDetOpList* pOpList(pDoc->GetDetOpList()); if( pOpList ) { - sal_uInt32 nCount(pOpList->Count()); - for( sal_uInt32 nIndex = 0; nIndex < nCount; ++nIndex ) + size_t nCount = pOpList->Count(); + for (size_t nIndex = 0; nIndex < nCount; ++nIndex ) { - ScDetOpData* pDetData(pOpList->GetObject( static_cast<sal_uInt16>(nIndex) )); + const ScDetOpData* pDetData = pOpList->GetObject( nIndex); if( pDetData ) { const ScAddress& rDetPos = pDetData->GetPos(); SCTAB nTab = rDetPos.Tab(); if ( nTab < pDoc->GetTableCount() ) { - rDetOp.AddOperation( pDetData->GetOperation(), rDetPos, nIndex ); + rDetOp.AddOperation( pDetData->GetOperation(), rDetPos, static_cast<sal_uInt32>( nIndex) ); // cells with detective operations are written even if empty pSharedData->SetLastColumn( nTab, rDetPos.Col() ); diff --git a/sc/source/ui/docshell/docfunc.cxx b/sc/source/ui/docshell/docfunc.cxx index ffc4730ceb74..8b9d0688f275 100644 --- a/sc/source/ui/docshell/docfunc.cxx +++ b/sc/source/ui/docshell/docfunc.cxx @@ -490,10 +490,10 @@ sal_Bool ScDocFunc::DetectiveRefresh( sal_Bool bAutomatic ) // Wiederholen - sal_uInt16 nCount = pList->Count(); - for (sal_uInt16 i=0; i<nCount; i++) + size_t nCount = pList->Count(); + for (size_t i=0; i < nCount; ++i) { - ScDetOpData* pData = pList->GetObject(i); + const ScDetOpData* pData = pList->GetObject(i); if (pData) { ScAddress aPos = pData->GetPos(); diff --git a/sc/source/ui/undo/undocell.cxx b/sc/source/ui/undo/undocell.cxx index 321cf789bf68..114964220a19 100644 --- a/sc/source/ui/undo/undocell.cxx +++ b/sc/source/ui/undo/undocell.cxx @@ -1028,10 +1028,10 @@ void ScUndoDetective::Undo() ScDetOpList* pList = pDoc->GetDetOpList(); if (pList && pList->Count()) { - sal_uInt16 nPos = pList->Count() - 1; - ScDetOpData* pData = pList->GetObject(nPos); - if ( pData->GetOperation() == (ScDetOpType) nAction && pData->GetPos() == aPos ) - pList->DeleteAndDestroy( nPos ); + ScDetOpDataVector& rVec = pList->GetDataVector(); + ScDetOpDataVector::iterator it = rVec.begin() + rVec.size() - 1; + if ( it->GetOperation() == (ScDetOpType) nAction && it->GetPos() == aPos ) + rVec.erase( it); else { OSL_FAIL("Detektiv-Eintrag in der Liste nicht gefunden"); |