namespace cv
{
+namespace {
+static const char* noneValue = "<none>";
+
+static String cat_string(const String& str)
+{
+ int left = 0, right = (int)str.length();
+ while( left <= right && str[left] == ' ' )
+ left++;
+ while( right > left && str[right-1] == ' ' )
+ right--;
+ return left >= right ? String("") : str.substr(left, right-left);
+}
+}
+
struct CommandLineParserParams
{
public:
std::vector<String> split_range_string(const String& str, char fs, char ss) const;
std::vector<String> split_string(const String& str, char symbol = ' ', bool create_empty_item = false) const;
- String cat_string(const String& str) const;
void apply_params(const String& key, const String& value);
void apply_params(int i, String value);
{
String v = impl->data[i].def_value;
if (space_delete)
- v = impl->cat_string(v);
+ v = cat_string(v);
// the key was neither specified nor has it a default value
- if(v.empty() && type != Param::STRING) {
+ if((v.empty() && type != Param::STRING) || v == noneValue) {
impl->error = true;
impl->error_message = impl->error_message + "Missing parameter: '" + name + "'\n";
return;
if (impl->data[i].number == index)
{
String v = impl->data[i].def_value;
- if (space_delete == true) v = impl->cat_string(v);
+ if (space_delete == true) v = cat_string(v);
// the key was neither specified nor has it a default value
- if(v.empty() && type != Param::STRING) {
+ if((v.empty() && type != Param::STRING) || v == noneValue) {
impl->error = true;
impl->error_message = impl->error_message + format("Missing parameter #%d\n", index);
return;
CommandLineParserParams p;
p.keys = impl->split_string(l[0]);
p.def_value = l[1];
- p.help_message = impl->cat_string(l[2]);
+ p.help_message = cat_string(l[2]);
p.number = -1;
if (p.keys.size() <= 0)
{
std::sort (data.begin(), data.end(), cmp_params);
}
-String CommandLineParser::Impl::cat_string(const String& str) const
-{
- int left = 0, right = (int)str.length();
- while( left <= right && str[left] == ' ' )
- left++;
- while( right > left && str[right-1] == ' ' )
- right--;
- return left >= right ? String("") : str.substr(left, right-left);
-}
-
String CommandLineParser::getPathToApplication() const
{
return impl->path_to_app;
{
if (name == impl->data[i].keys[j])
{
- return !impl->cat_string(impl->data[i].def_value).empty();
+ const String v = cat_string(impl->data[i].def_value);
+ return !v.empty() && v != noneValue;
}
}
}
printf(", ");
}
}
- String dv = impl->cat_string(impl->data[i].def_value);
+ String dv = cat_string(impl->data[i].def_value);
if (dv.compare("") != 0)
{
printf(" (value:%s)", dv.c_str());
printf("%s", k.c_str());
- String dv = impl->cat_string(impl->data[i].def_value);
+ String dv = cat_string(impl->data[i].def_value);
if (dv.compare("") != 0)
{
printf(" (value:%s)", dv.c_str());
EXPECT_EQ("default1", parser.get<String>("@arg1"));
EXPECT_EQ("default1", parser.get<String>(0));
- parser.get<String>("@arg2");
- parser.get<String>(1);
- EXPECT_TRUE(parser.check());
+ EXPECT_EQ("", parser.get<String>("@arg2"));
+ EXPECT_EQ("", parser.get<String>(1));
}
TEST(CommandLineParser, testPositional_default)
EXPECT_EQ("test2", parser.get<String>(1));
}
+TEST(CommandLineParser, testEmptyStringValue)
+{
+ static const char * const keys3 =
+ "{ @pos0 | | empty default value }"
+ "{ @pos1 | <none> | forbid empty default value }";
+
+ const char* argv[] = {"<bin>"};
+ const int argc = 1;
+ cv::CommandLineParser parser(argc, argv, keys3);
+ // EXPECT_TRUE(parser.has("@pos0"));
+ EXPECT_EQ("", parser.get<String>("@pos0"));
+ EXPECT_TRUE(parser.check());
+
+ EXPECT_FALSE(parser.has("@pos1"));
+ parser.get<String>(1);
+ EXPECT_FALSE(parser.check());
+}
+
} // namespace