Merge topic 'dev/ison-isoff-performance'

43a8c552 SystemTools: Use a set in Is{On,Off}
9270aa9a IsOff: Use the length for the string construction
This commit is contained in:
Brad King 2014-07-15 10:48:18 -04:00 committed by CMake Topic Stage
commit c005d95662
1 changed files with 36 additions and 6 deletions

View File

@ -384,14 +384,28 @@ bool cmSystemTools::IsOn(const char* val)
{
return false;
}
std::basic_string<char> v = val;
size_t len = strlen(val);
if (len > 4)
{
return false;
}
std::basic_string<char> v(val, len);
static std::set<std::string> onValues;
if(onValues.empty())
{
onValues.insert("ON");
onValues.insert("1");
onValues.insert("YES");
onValues.insert("TRUE");
onValues.insert("Y");
}
for(std::basic_string<char>::iterator c = v.begin();
c != v.end(); c++)
{
*c = static_cast<char>(toupper(*c));
}
return (v == "ON" || v == "1" || v == "YES" || v == "TRUE" || v == "Y");
return (onValues.count(v) > 0);
}
bool cmSystemTools::IsNOTFOUND(const char* val)
@ -406,19 +420,35 @@ bool cmSystemTools::IsNOTFOUND(const char* val)
bool cmSystemTools::IsOff(const char* val)
{
if (!val || strlen(val) == 0)
if (!val || !*val)
{
return true;
}
std::basic_string<char> v = val;
size_t len = strlen(val);
// Try and avoid toupper() for large strings.
if (len > 6)
{
return cmSystemTools::IsNOTFOUND(val);
}
static std::set<std::string> offValues;
if(offValues.empty())
{
offValues.insert("OFF");
offValues.insert("0");
offValues.insert("NO");
offValues.insert("FALSE");
offValues.insert("N");
offValues.insert("IGNORE");
}
// Try and avoid toupper().
std::basic_string<char> v(val, len);
for(std::basic_string<char>::iterator c = v.begin();
c != v.end(); c++)
{
*c = static_cast<char>(toupper(*c));
}
return (v == "OFF" || v == "0" || v == "NO" || v == "FALSE" ||
v == "N" || cmSystemTools::IsNOTFOUND(v.c_str()) || v == "IGNORE");
return (offValues.count(v) > 0);
}
//----------------------------------------------------------------------------