ENH: add REMOVE_DUPLICATES subcommand to LIST command (and test). Remove duplicates from a list (keep the ordering)

This commit is contained in:
Sebastien Barre
2008-03-12 17:02:10 -04:00
parent 2ad4f4bb9d
commit f64d3d0b77
3 changed files with 73 additions and 0 deletions

View File

@@ -59,6 +59,10 @@ bool cmListCommand
{
return this->HandleRemoveItemCommand(args);
}
if(subCommand == "REMOVE_DUPLICATES")
{
return this->HandleRemoveDuplicatesCommand(args);
}
if(subCommand == "SORT")
{
return this->HandleSortCommand(args);
@@ -392,6 +396,68 @@ bool cmListCommand
return true;
}
//----------------------------------------------------------------------------
bool cmListCommand
::HandleRemoveDuplicatesCommand(std::vector<std::string> const& args)
{
if(args.size() < 2)
{
this->SetError("sub-command REMOVE_DUPLICATES requires a list as an argument.");
return false;
}
const std::string& listName = args[1];
// expand the variable
std::vector<std::string> varArgsExpanded;
if ( !this->GetList(varArgsExpanded, listName.c_str()) )
{
this->SetError("sub-command REMOVE_DUPLICATES requires list to be present.");
return false;
}
std::string value;
#if 0
// Fast version, but does not keep the ordering
std::set<std::string> unique(varArgsExpanded.begin(), varArgsExpanded.end());
std::set<std::string>::iterator it;
for ( it = unique.begin(); it != unique.end(); ++ it )
{
if (value.size())
{
value += ";";
}
value += it->c_str();
}
#else
// Slower version, keep the ordering
std::set<std::string> unique;
std::vector<std::string>::iterator it;
for ( it = varArgsExpanded.begin(); it != varArgsExpanded.end(); ++ it )
{
if (unique.find(*it) != unique.end())
{
continue;
}
unique.insert(*it);
if (value.size())
{
value += ";";
}
value += it->c_str();
}
#endif
this->Makefile->AddDefinition(listName.c_str(), value.c_str());
return true;
}
//----------------------------------------------------------------------------
bool cmListCommand
::HandleSortCommand(std::vector<std::string> const& args)