ENH: change LIST(CONTAINS ...) TO LIST(FIND ...), which returns the index

and which is more useful, because then you can also access the item behind
the one you were looking, useful for writing macros with optional keywords
with parameters

Alex
This commit is contained in:
Alexander Neundorf 2007-08-15 10:26:50 -04:00
parent 58b0e31784
commit 2f23ecdb8a
3 changed files with 21 additions and 14 deletions

View File

@ -42,9 +42,9 @@ bool cmListCommand::InitialPass(std::vector<std::string> const& args)
{ {
return this->HandleAppendCommand(args); return this->HandleAppendCommand(args);
} }
if(subCommand == "CONTAINS") if(subCommand == "FIND")
{ {
return this->HandleContainsCommand(args); return this->HandleFindCommand(args);
} }
if(subCommand == "INSERT") if(subCommand == "INSERT")
{ {
@ -204,11 +204,11 @@ bool cmListCommand::HandleAppendCommand(std::vector<std::string> const& args)
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool cmListCommand::HandleContainsCommand(std::vector<std::string> const& args) bool cmListCommand::HandleFindCommand(std::vector<std::string> const& args)
{ {
if(args.size() != 4) if(args.size() != 4)
{ {
this->SetError("sub-command CONTAINS requires three arguments."); this->SetError("sub-command FIND requires three arguments.");
return false; return false;
} }
@ -218,21 +218,25 @@ bool cmListCommand::HandleContainsCommand(std::vector<std::string> const& args)
std::vector<std::string> varArgsExpanded; std::vector<std::string> varArgsExpanded;
if ( !this->GetList(varArgsExpanded, listName.c_str()) ) if ( !this->GetList(varArgsExpanded, listName.c_str()) )
{ {
this->Makefile->AddDefinition(variableName.c_str(), "FALSE"); this->Makefile->AddDefinition(variableName.c_str(), "-1");
return true; return true;
} }
std::vector<std::string>::iterator it; std::vector<std::string>::iterator it;
unsigned int index = 0;
for ( it = varArgsExpanded.begin(); it != varArgsExpanded.end(); ++ it ) for ( it = varArgsExpanded.begin(); it != varArgsExpanded.end(); ++ it )
{ {
if ( *it == args[2] ) if ( *it == args[2] )
{ {
this->Makefile->AddDefinition(variableName.c_str(), "TRUE"); char indexString[32];
sprintf(indexString, "%d", index);
this->Makefile->AddDefinition(variableName.c_str(), indexString);
return true; return true;
} }
index++;
} }
this->Makefile->AddDefinition(variableName.c_str(), "FALSE"); this->Makefile->AddDefinition(variableName.c_str(), "-1");
return true; return true;
} }

View File

@ -68,7 +68,7 @@ public:
" LIST(GET <list> <element index> [<element index> ...] " " LIST(GET <list> <element index> [<element index> ...] "
"<output variable>)\n" "<output variable>)\n"
" LIST(APPEND <list> <element> [<element> ...])\n" " LIST(APPEND <list> <element> [<element> ...])\n"
" LIST(CONTAINS <list> <value> <output variable>)\n" " LIST(FIND <list> <value> <output variable>)\n"
" LIST(INSERT <list> <element_index> <element> [<element> ...])\n" " LIST(INSERT <list> <element_index> <element> [<element> ...])\n"
" LIST(REMOVE_ITEM <list> <value> [<value> ...])\n" " LIST(REMOVE_ITEM <list> <value> [<value> ...])\n"
" LIST(REMOVE_AT <list> <index> [<index> ...])\n" " LIST(REMOVE_AT <list> <index> [<index> ...])\n"
@ -77,7 +77,8 @@ public:
"LENGTH will return a given list's length.\n" "LENGTH will return a given list's length.\n"
"GET will return list of elements specified by indices from the list.\n" "GET will return list of elements specified by indices from the list.\n"
"APPEND will append elements to the list.\n" "APPEND will append elements to the list.\n"
"CONTAINS will return TRUE if the element specified is in the list.\n" "FIND will return the index of the element specified in the list or -1 "
"if it wasn't found.\n"
"INSERT will insert elements to the list to the specified location.\n" "INSERT will insert elements to the list to the specified location.\n"
"When specifying an index, negative value corresponds to index from the" "When specifying an index, negative value corresponds to index from the"
" end of the list.\n" " end of the list.\n"
@ -94,7 +95,7 @@ protected:
bool HandleLengthCommand(std::vector<std::string> const& args); bool HandleLengthCommand(std::vector<std::string> const& args);
bool HandleGetCommand(std::vector<std::string> const& args); bool HandleGetCommand(std::vector<std::string> const& args);
bool HandleAppendCommand(std::vector<std::string> const& args); bool HandleAppendCommand(std::vector<std::string> const& args);
bool HandleContainsCommand(std::vector<std::string> const& args); bool HandleFindCommand(std::vector<std::string> const& args);
bool HandleInsertCommand(std::vector<std::string> const& args); bool HandleInsertCommand(std::vector<std::string> const& args);
bool HandleRemoveAtCommand(std::vector<std::string> const& args); bool HandleRemoveAtCommand(std::vector<std::string> const& args);
bool HandleRemoveItemCommand(std::vector<std::string> const& args); bool HandleRemoveItemCommand(std::vector<std::string> const& args);

View File

@ -67,11 +67,13 @@ SET(result andy bill bob brad ken peter)
LIST(REMOVE_AT result 2 -1) LIST(REMOVE_AT result 2 -1)
TEST("REMOVE_AT result 2 -1" "andy;bill;brad;ken") TEST("REMOVE_AT result 2 -1" "andy;bill;brad;ken")
LIST(CONTAINS mylist ken result) # ken is at index 2, nobody is not in the list so -1 should be returned
TEST("CONTAINS mylist ken result" "TRUE") SET(mylist andy bill ken brad)
LIST(FIND mylist ken result)
TEST("FIND mylist ken result" "2")
LIST(CONTAINS mylist nobody result) LIST(FIND mylist nobody result)
TEST("CONTAINS mylist nobody result" "FALSE") TEST("FIND mylist nobody result" "-1")
SET(result ken bill andy brad) SET(result ken bill andy brad)
LIST(SORT result) LIST(SORT result)