Kaydet (Commit) 814c4e1c authored tarafından Kohei Yoshida's avatar Kohei Yoshida

std::unique must be followed by erase() to really remove duplicates.

It's even mentioned in Effective STL.
üst 1d540028
...@@ -88,6 +88,28 @@ ...@@ -88,6 +88,28 @@
using namespace com::sun::star; using namespace com::sun::star;
namespace {
void sortAndRemoveDuplicates(std::vector<TypedStrData>& rStrings, bool bCaseSens)
{
if (bCaseSens)
{
std::sort(rStrings.begin(), rStrings.end(), TypedStrData::LessCaseSensitive());
std::vector<TypedStrData>::iterator it =
std::unique(rStrings.begin(), rStrings.end(), TypedStrData::EqualCaseSensitive());
rStrings.erase(it, rStrings.end());
}
else
{
std::sort(rStrings.begin(), rStrings.end(), TypedStrData::LessCaseInsensitive());
std::vector<TypedStrData>::iterator it =
std::unique(rStrings.begin(), rStrings.end(), TypedStrData::EqualCaseInsensitive());
rStrings.erase(it, rStrings.end());
}
}
}
void ScDocument::GetAllTabRangeNames(ScRangeName::TabNameCopyMap& rNames) const void ScDocument::GetAllTabRangeNames(ScRangeName::TabNameCopyMap& rNames) const
{ {
ScRangeName::TabNameCopyMap aNames; ScRangeName::TabNameCopyMap aNames;
...@@ -1470,17 +1492,7 @@ bool ScDocument::GetFilterEntries( ...@@ -1470,17 +1492,7 @@ bool ScDocument::GetFilterEntries(
maTabs[nTab]->GetFilterEntries( nCol, nStartRow, nEndRow, rStrings, rHasDates ); maTabs[nTab]->GetFilterEntries( nCol, nStartRow, nEndRow, rStrings, rHasDates );
} }
if (aParam.bCaseSens) sortAndRemoveDuplicates(rStrings, aParam.bCaseSens);
{
std::sort(rStrings.begin(), rStrings.end(), TypedStrData::LessCaseSensitive());
std::unique(rStrings.begin(), rStrings.end(), TypedStrData::EqualCaseSensitive());
}
else
{
std::sort(rStrings.begin(), rStrings.end(), TypedStrData::LessCaseInsensitive());
std::unique(rStrings.begin(), rStrings.end(), TypedStrData::EqualCaseInsensitive());
}
return true; return true;
} }
} }
...@@ -1499,16 +1511,7 @@ bool ScDocument::GetFilterEntriesArea( ...@@ -1499,16 +1511,7 @@ bool ScDocument::GetFilterEntriesArea(
if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] ) if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] )
{ {
maTabs[nTab]->GetFilterEntries( nCol, nStartRow, nEndRow, rStrings, rHasDates ); maTabs[nTab]->GetFilterEntries( nCol, nStartRow, nEndRow, rStrings, rHasDates );
if (bCaseSens) sortAndRemoveDuplicates(rStrings, bCaseSens);
{
std::sort(rStrings.begin(), rStrings.end(), TypedStrData::LessCaseSensitive());
std::unique(rStrings.begin(), rStrings.end(), TypedStrData::EqualCaseSensitive());
}
else
{
std::sort(rStrings.begin(), rStrings.end(), TypedStrData::LessCaseInsensitive());
std::unique(rStrings.begin(), rStrings.end(), TypedStrData::EqualCaseInsensitive());
}
return true; return true;
} }
...@@ -1535,18 +1538,8 @@ bool ScDocument::GetDataEntries( ...@@ -1535,18 +1538,8 @@ bool ScDocument::GetDataEntries(
if( pData && pData->FillSelectionList( rStrings, ScAddress( nCol, nRow, nTab ) ) ) if( pData && pData->FillSelectionList( rStrings, ScAddress( nCol, nRow, nTab ) ) )
{ {
if (pData->GetListType() == ValidListType::SORTEDASCENDING) if (pData->GetListType() == ValidListType::SORTEDASCENDING)
{ sortAndRemoveDuplicates(rStrings, bCaseSens);
if (bCaseSens)
{
std::sort(rStrings.begin(), rStrings.end(), TypedStrData::LessCaseSensitive());
std::unique(rStrings.begin(), rStrings.end(), TypedStrData::EqualCaseSensitive());
}
else
{
std::sort(rStrings.begin(), rStrings.end(), TypedStrData::LessCaseInsensitive());
std::unique(rStrings.begin(), rStrings.end(), TypedStrData::EqualCaseInsensitive());
}
}
return true; return true;
} }
} }
...@@ -1561,16 +1554,7 @@ bool ScDocument::GetDataEntries( ...@@ -1561,16 +1554,7 @@ bool ScDocument::GetDataEntries(
std::set<TypedStrData> aStrings; std::set<TypedStrData> aStrings;
bool bRet = maTabs[nTab]->GetDataEntries(nCol, nRow, aStrings, bLimit); bool bRet = maTabs[nTab]->GetDataEntries(nCol, nRow, aStrings, bLimit);
rStrings.insert(rStrings.end(), aStrings.begin(), aStrings.end()); rStrings.insert(rStrings.end(), aStrings.begin(), aStrings.end());
if (bCaseSens) sortAndRemoveDuplicates(rStrings, bCaseSens);
{
std::sort(rStrings.begin(), rStrings.end(), TypedStrData::LessCaseSensitive());
std::unique(rStrings.begin(), rStrings.end(), TypedStrData::EqualCaseSensitive());
}
else
{
std::sort(rStrings.begin(), rStrings.end(), TypedStrData::LessCaseInsensitive());
std::unique(rStrings.begin(), rStrings.end(), TypedStrData::EqualCaseInsensitive());
}
return bRet; return bRet;
} }
......
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