diff options
author | Noel Grandin <noel.grandin@collabora.co.uk> | 2018-03-13 17:35:21 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2018-03-14 07:18:41 +0100 |
commit | bb787e7b45efb5e25b4b6d57a42efa916510b5f5 (patch) | |
tree | ca6309e90850d28c810fbf92efc4711a56916e18 | |
parent | c775efffa7ddcee607bd7622a19a627545a6bc67 (diff) |
modernize ScRangePairList::CreateNameSortedArray
we have this STL thingy now, pretty cool
Change-Id: Id96010dda59736bd0c143312424018b6ea5621f1
Reviewed-on: https://gerrit.libreoffice.org/51230
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
-rw-r--r-- | sc/inc/rangelst.hxx | 3 | ||||
-rw-r--r-- | sc/source/core/tool/rangelst.cxx | 168 | ||||
-rw-r--r-- | sc/source/ui/miscdlgs/crnrdlg.cxx | 18 |
3 files changed, 88 insertions, 101 deletions
diff --git a/sc/inc/rangelst.hxx b/sc/inc/rangelst.hxx index d78c7054499d..e137613df857 100644 --- a/sc/inc/rangelst.hxx +++ b/sc/inc/rangelst.hxx @@ -139,7 +139,8 @@ public: void DeleteOnTab( SCTAB nTab ); ScRangePair* Find( const ScAddress& ) const; ScRangePair* Find( const ScRange& ) const; - ScRangePair** CreateNameSortedArray( size_t& nCount, ScDocument* ) const; + std::vector<ScRangePair*> + CreateNameSortedArray( ScDocument* ) const; void Remove(size_t nPos); void Remove(const ScRangePair* pAdr); diff --git a/sc/source/core/tool/rangelst.cxx b/sc/source/core/tool/rangelst.cxx index 84c6764ab79a..62a083bcab96 100644 --- a/sc/source/core/tool/rangelst.cxx +++ b/sc/source/core/tool/rangelst.cxx @@ -1323,82 +1323,81 @@ ScRangePairList* ScRangePairList::Clone() const return pNew; } -struct ScRangePairNameSort +class ScRangePairList_sortNameCompare { - ScRangePair* pPair; - ScDocument* pDoc; -}; +public: + ScRangePairList_sortNameCompare(ScDocument *pDoc) : mpDoc(pDoc) {} -extern "C" -int ScRangePairList_QsortNameCompare( const void* p1, const void* p2 ) -{ - const ScRangePairNameSort* ps1 = static_cast<const ScRangePairNameSort*>(p1); - const ScRangePairNameSort* ps2 = static_cast<const ScRangePairNameSort*>(p2); - const ScAddress& rStartPos1 = ps1->pPair->GetRange(0).aStart; - const ScAddress& rStartPos2 = ps2->pPair->GetRange(0).aStart; - OUString aStr1, aStr2; - sal_Int32 nComp; - if ( rStartPos1.Tab() == rStartPos2.Tab() ) - nComp = 0; - else - { - ps1->pDoc->GetName( rStartPos1.Tab(), aStr1 ); - ps2->pDoc->GetName( rStartPos2.Tab(), aStr2 ); - nComp = ScGlobal::GetCollator()->compareString( aStr1, aStr2 ); - } - if (nComp < 0) + bool operator()( const ScRangePair *ps1, const ScRangePair* ps2 ) const { - return -1; - } - else if (nComp > 0) - { - return 1; - } + const ScAddress& rStartPos1 = ps1->GetRange(0).aStart; + const ScAddress& rStartPos2 = ps2->GetRange(0).aStart; + OUString aStr1, aStr2; + sal_Int32 nComp; + if ( rStartPos1.Tab() == rStartPos2.Tab() ) + nComp = 0; + else + { + mpDoc->GetName( rStartPos1.Tab(), aStr1 ); + mpDoc->GetName( rStartPos2.Tab(), aStr2 ); + nComp = ScGlobal::GetCollator()->compareString( aStr1, aStr2 ); + } + if (nComp < 0) + { + return true; // -1; + } + else if (nComp > 0) + { + return false; // 1; + } - // equal tabs - if ( rStartPos1.Col() < rStartPos2.Col() ) - return -1; - if ( rStartPos1.Col() > rStartPos2.Col() ) - return 1; - // equal cols - if ( rStartPos1.Row() < rStartPos2.Row() ) - return -1; - if ( rStartPos1.Row() > rStartPos2.Row() ) - return 1; - - // first corner equal, second corner - const ScAddress& rEndPos1 = ps1->pPair->GetRange(0).aEnd; - const ScAddress& rEndPos2 = ps2->pPair->GetRange(0).aEnd; - if ( rEndPos1.Tab() == rEndPos2.Tab() ) - nComp = 0; - else - { - ps1->pDoc->GetName( rEndPos1.Tab(), aStr1 ); - ps2->pDoc->GetName( rEndPos2.Tab(), aStr2 ); - nComp = ScGlobal::GetCollator()->compareString( aStr1, aStr2 ); - } - if (nComp < 0) - { - return -1; - } - else if (nComp > 0) - { - return 1; - } + // equal tabs + if ( rStartPos1.Col() < rStartPos2.Col() ) + return true; // -1; + if ( rStartPos1.Col() > rStartPos2.Col() ) + return false; // 1; + // equal cols + if ( rStartPos1.Row() < rStartPos2.Row() ) + return true; // -1; + if ( rStartPos1.Row() > rStartPos2.Row() ) + return false; // 1; + + // first corner equal, second corner + const ScAddress& rEndPos1 = ps1->GetRange(0).aEnd; + const ScAddress& rEndPos2 = ps2->GetRange(0).aEnd; + if ( rEndPos1.Tab() == rEndPos2.Tab() ) + nComp = 0; + else + { + mpDoc->GetName( rEndPos1.Tab(), aStr1 ); + mpDoc->GetName( rEndPos2.Tab(), aStr2 ); + nComp = ScGlobal::GetCollator()->compareString( aStr1, aStr2 ); + } + if (nComp < 0) + { + return true; // -1; + } + else if (nComp > 0) + { + return false; // 1; + } - // equal tabs - if ( rEndPos1.Col() < rEndPos2.Col() ) - return -1; - if ( rEndPos1.Col() > rEndPos2.Col() ) - return 1; - // equal cols - if ( rEndPos1.Row() < rEndPos2.Row() ) - return -1; - if ( rEndPos1.Row() > rEndPos2.Row() ) - return 1; - - return 0; -} + // equal tabs + if ( rEndPos1.Col() < rEndPos2.Col() ) + return true; // -1; + if ( rEndPos1.Col() > rEndPos2.Col() ) + return false; // 1; + // equal cols + if ( rEndPos1.Row() < rEndPos2.Row() ) + return true; // -1; + if ( rEndPos1.Row() > rEndPos2.Row() ) + return false; // 1; + + return false; + } +private: + ScDocument *mpDoc; +}; void ScRangePairList::Join( const ScRangePair& r, bool bIsInList ) { @@ -1524,28 +1523,13 @@ Label_RangePair_Join: Append( r ); } -ScRangePair** ScRangePairList::CreateNameSortedArray( size_t& nListCount, - ScDocument* pDoc ) const +std::vector<ScRangePair*> ScRangePairList::CreateNameSortedArray( ScDocument* pDoc ) const { - nListCount = maPairs.size(); - OSL_ENSURE( nListCount * sizeof(ScRangePairNameSort) <= size_t(~0x1F), - "ScRangePairList::CreateNameSortedArray nListCount * sizeof(ScRangePairNameSort) > (size_t)~0x1F" ); - ScRangePairNameSort* pSortArray = reinterpret_cast<ScRangePairNameSort*>( - new sal_uInt8 [ nListCount * sizeof(ScRangePairNameSort) ]); - sal_uLong j; - for ( j=0; j < nListCount; j++ ) - { - pSortArray[j].pPair = maPairs[ j ]; - pSortArray[j].pDoc = pDoc; - } - qsort( static_cast<void*>(pSortArray), nListCount, sizeof(ScRangePairNameSort), &ScRangePairList_QsortNameCompare ); - // move ScRangePair pointer up - ScRangePair** ppSortArray = reinterpret_cast<ScRangePair**>(pSortArray); - for ( j=0; j < nListCount; j++ ) - { - ppSortArray[j] = pSortArray[j].pPair; - } - return ppSortArray; + std::vector<ScRangePair*> aSortedVec(maPairs); + + std::sort( aSortedVec.begin(), aSortedVec.end(), ScRangePairList_sortNameCompare(pDoc) ); + + return aSortedVec; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/miscdlgs/crnrdlg.cxx b/sc/source/ui/miscdlgs/crnrdlg.cxx index 1c464898b75b..31df267e218f 100644 --- a/sc/source/ui/miscdlgs/crnrdlg.cxx +++ b/sc/source/ui/miscdlgs/crnrdlg.cxx @@ -391,15 +391,16 @@ void ScColRowNameRangesDlg::UpdateNames() pLbRange->SetEntryData( nPos, reinterpret_cast<void*>(nEntryDataDelim) ); if ( (nCount = xColNameRanges->size()) > 0 ) { - std::unique_ptr<ScRangePair*[]> ppSortArray(xColNameRanges->CreateNameSortedArray( - nCount, pDoc )); + std::vector<ScRangePair*> aSortArray(xColNameRanges->CreateNameSortedArray( + pDoc )); + nCount = aSortArray.size(); for ( j=0; j < nCount; j++ ) { - const ScRange aRange(ppSortArray[j]->GetRange(0)); + const ScRange aRange(aSortArray[j]->GetRange(0)); aString = aRange.Format(ScRefFlags::RANGE_ABS_3D, pDoc, aDetails); //@008 get range parameters from document - ppSortArray[j]->GetRange(0).GetVars( nCol1, nRow1, nTab1, + aSortArray[j]->GetRange(0).GetVars( nCol1, nRow1, nTab1, nCol2, nRow2, nTab2 ); SCCOL q=nCol1+3; if(q>nCol2) q=nCol2; @@ -434,15 +435,16 @@ void ScColRowNameRangesDlg::UpdateNames() pLbRange->SetEntryData( nPos, reinterpret_cast<void*>(nEntryDataDelim) ); if ( (nCount = xRowNameRanges->size()) > 0 ) { - std::unique_ptr<ScRangePair*[]> ppSortArray(xRowNameRanges->CreateNameSortedArray( - nCount, pDoc )); + std::vector<ScRangePair*> aSortArray(xRowNameRanges->CreateNameSortedArray( + pDoc )); + nCount = aSortArray.size(); for ( j=0; j < nCount; j++ ) { - const ScRange aRange(ppSortArray[j]->GetRange(0)); + const ScRange aRange(aSortArray[j]->GetRange(0)); aString = aRange.Format(ScRefFlags::RANGE_ABS_3D, pDoc, aDetails); //@008 Build string for rows below - ppSortArray[j]->GetRange(0).GetVars( nCol1, nRow1, nTab1, + aSortArray[j]->GetRange(0).GetVars( nCol1, nRow1, nTab1, nCol2, nRow2, nTab2 ); SCROW q=nRow1+3; if(q>nRow2) q=nRow2; |