Kaydet (Commit) bb787e7b authored tarafından Noel Grandin's avatar Noel Grandin

modernize ScRangePairList::CreateNameSortedArray

we have this STL thingy now, pretty cool

Change-Id: Id96010dda59736bd0c143312424018b6ea5621f1
Reviewed-on: https://gerrit.libreoffice.org/51230Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarNoel Grandin <noel.grandin@collabora.co.uk>
üst c775efff
...@@ -139,7 +139,8 @@ public: ...@@ -139,7 +139,8 @@ public:
void DeleteOnTab( SCTAB nTab ); void DeleteOnTab( SCTAB nTab );
ScRangePair* Find( const ScAddress& ) const; ScRangePair* Find( const ScAddress& ) const;
ScRangePair* Find( const ScRange& ) 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(size_t nPos);
void Remove(const ScRangePair* pAdr); void Remove(const ScRangePair* pAdr);
......
...@@ -1323,82 +1323,81 @@ ScRangePairList* ScRangePairList::Clone() const ...@@ -1323,82 +1323,81 @@ ScRangePairList* ScRangePairList::Clone() const
return pNew; return pNew;
} }
struct ScRangePairNameSort class ScRangePairList_sortNameCompare
{ {
ScRangePair* pPair; public:
ScDocument* pDoc; ScRangePairList_sortNameCompare(ScDocument *pDoc) : mpDoc(pDoc) {}
};
extern "C" bool operator()( const ScRangePair *ps1, const ScRangePair* ps2 ) const
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)
{ {
return -1; const ScAddress& rStartPos1 = ps1->GetRange(0).aStart;
} const ScAddress& rStartPos2 = ps2->GetRange(0).aStart;
else if (nComp > 0) OUString aStr1, aStr2;
{ sal_Int32 nComp;
return 1; 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 // equal tabs
if ( rStartPos1.Col() < rStartPos2.Col() ) if ( rStartPos1.Col() < rStartPos2.Col() )
return -1; return true; // -1;
if ( rStartPos1.Col() > rStartPos2.Col() ) if ( rStartPos1.Col() > rStartPos2.Col() )
return 1; return false; // 1;
// equal cols // equal cols
if ( rStartPos1.Row() < rStartPos2.Row() ) if ( rStartPos1.Row() < rStartPos2.Row() )
return -1; return true; // -1;
if ( rStartPos1.Row() > rStartPos2.Row() ) if ( rStartPos1.Row() > rStartPos2.Row() )
return 1; return false; // 1;
// first corner equal, second corner // first corner equal, second corner
const ScAddress& rEndPos1 = ps1->pPair->GetRange(0).aEnd; const ScAddress& rEndPos1 = ps1->GetRange(0).aEnd;
const ScAddress& rEndPos2 = ps2->pPair->GetRange(0).aEnd; const ScAddress& rEndPos2 = ps2->GetRange(0).aEnd;
if ( rEndPos1.Tab() == rEndPos2.Tab() ) if ( rEndPos1.Tab() == rEndPos2.Tab() )
nComp = 0; nComp = 0;
else else
{ {
ps1->pDoc->GetName( rEndPos1.Tab(), aStr1 ); mpDoc->GetName( rEndPos1.Tab(), aStr1 );
ps2->pDoc->GetName( rEndPos2.Tab(), aStr2 ); mpDoc->GetName( rEndPos2.Tab(), aStr2 );
nComp = ScGlobal::GetCollator()->compareString( aStr1, aStr2 ); nComp = ScGlobal::GetCollator()->compareString( aStr1, aStr2 );
} }
if (nComp < 0) if (nComp < 0)
{ {
return -1; return true; // -1;
} }
else if (nComp > 0) else if (nComp > 0)
{ {
return 1; return false; // 1;
} }
// equal tabs // equal tabs
if ( rEndPos1.Col() < rEndPos2.Col() ) if ( rEndPos1.Col() < rEndPos2.Col() )
return -1; return true; // -1;
if ( rEndPos1.Col() > rEndPos2.Col() ) if ( rEndPos1.Col() > rEndPos2.Col() )
return 1; return false; // 1;
// equal cols // equal cols
if ( rEndPos1.Row() < rEndPos2.Row() ) if ( rEndPos1.Row() < rEndPos2.Row() )
return -1; return true; // -1;
if ( rEndPos1.Row() > rEndPos2.Row() ) if ( rEndPos1.Row() > rEndPos2.Row() )
return 1; return false; // 1;
return 0; return false;
} }
private:
ScDocument *mpDoc;
};
void ScRangePairList::Join( const ScRangePair& r, bool bIsInList ) void ScRangePairList::Join( const ScRangePair& r, bool bIsInList )
{ {
...@@ -1524,28 +1523,13 @@ Label_RangePair_Join: ...@@ -1524,28 +1523,13 @@ Label_RangePair_Join:
Append( r ); Append( r );
} }
ScRangePair** ScRangePairList::CreateNameSortedArray( size_t& nListCount, std::vector<ScRangePair*> ScRangePairList::CreateNameSortedArray( ScDocument* pDoc ) const
ScDocument* pDoc ) const
{ {
nListCount = maPairs.size(); std::vector<ScRangePair*> aSortedVec(maPairs);
OSL_ENSURE( nListCount * sizeof(ScRangePairNameSort) <= size_t(~0x1F),
"ScRangePairList::CreateNameSortedArray nListCount * sizeof(ScRangePairNameSort) > (size_t)~0x1F" ); std::sort( aSortedVec.begin(), aSortedVec.end(), ScRangePairList_sortNameCompare(pDoc) );
ScRangePairNameSort* pSortArray = reinterpret_cast<ScRangePairNameSort*>(
new sal_uInt8 [ nListCount * sizeof(ScRangePairNameSort) ]); return aSortedVec;
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;
} }
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -391,15 +391,16 @@ void ScColRowNameRangesDlg::UpdateNames() ...@@ -391,15 +391,16 @@ void ScColRowNameRangesDlg::UpdateNames()
pLbRange->SetEntryData( nPos, reinterpret_cast<void*>(nEntryDataDelim) ); pLbRange->SetEntryData( nPos, reinterpret_cast<void*>(nEntryDataDelim) );
if ( (nCount = xColNameRanges->size()) > 0 ) if ( (nCount = xColNameRanges->size()) > 0 )
{ {
std::unique_ptr<ScRangePair*[]> ppSortArray(xColNameRanges->CreateNameSortedArray( std::vector<ScRangePair*> aSortArray(xColNameRanges->CreateNameSortedArray(
nCount, pDoc )); pDoc ));
nCount = aSortArray.size();
for ( j=0; j < nCount; j++ ) 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); aString = aRange.Format(ScRefFlags::RANGE_ABS_3D, pDoc, aDetails);
//@008 get range parameters from document //@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 ); nCol2, nRow2, nTab2 );
SCCOL q=nCol1+3; SCCOL q=nCol1+3;
if(q>nCol2) q=nCol2; if(q>nCol2) q=nCol2;
...@@ -434,15 +435,16 @@ void ScColRowNameRangesDlg::UpdateNames() ...@@ -434,15 +435,16 @@ void ScColRowNameRangesDlg::UpdateNames()
pLbRange->SetEntryData( nPos, reinterpret_cast<void*>(nEntryDataDelim) ); pLbRange->SetEntryData( nPos, reinterpret_cast<void*>(nEntryDataDelim) );
if ( (nCount = xRowNameRanges->size()) > 0 ) if ( (nCount = xRowNameRanges->size()) > 0 )
{ {
std::unique_ptr<ScRangePair*[]> ppSortArray(xRowNameRanges->CreateNameSortedArray( std::vector<ScRangePair*> aSortArray(xRowNameRanges->CreateNameSortedArray(
nCount, pDoc )); pDoc ));
nCount = aSortArray.size();
for ( j=0; j < nCount; j++ ) 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); aString = aRange.Format(ScRefFlags::RANGE_ABS_3D, pDoc, aDetails);
//@008 Build string for rows below //@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 ); nCol2, nRow2, nTab2 );
SCROW q=nRow1+3; SCROW q=nRow1+3;
if(q>nRow2) q=nRow2; if(q>nRow2) q=nRow2;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment