Commit 05b16367 authored by Alexander Alekhin's avatar Alexander Alekhin

Merge pull request #5329 from paroj:cliparser

parents 00512086 31da8335
...@@ -619,6 +619,10 @@ For example: ...@@ -619,6 +619,10 @@ For example:
} }
@endcode @endcode
Note that there are no default values for `help` and `timestamp` so we can check their presence using the `has()` method.
Arguments with default values are considered to be always present. Use the `get()` method in these cases to check their
actual value instead.
### Usage ### Usage
For the described keys: For the described keys:
...@@ -630,7 +634,7 @@ For the described keys: ...@@ -630,7 +634,7 @@ For the described keys:
# Bad call # Bad call
$ ./app -fps=aaa $ ./app -fps=aaa
ERRORS: ERRORS:
Exception: can not convert: [aaa] to [double] Parameter 'fps': can not convert: [aaa] to [double]
@endcode @endcode
*/ */
class CV_EXPORTS CommandLineParser class CV_EXPORTS CommandLineParser
......
...@@ -97,23 +97,28 @@ void CommandLineParser::getByName(const String& name, bool space_delete, int typ ...@@ -97,23 +97,28 @@ void CommandLineParser::getByName(const String& name, bool space_delete, int typ
{ {
for (size_t j = 0; j < impl->data[i].keys.size(); j++) for (size_t j = 0; j < impl->data[i].keys.size(); j++)
{ {
if (name.compare(impl->data[i].keys[j]) == 0) if (name == impl->data[i].keys[j])
{ {
String v = impl->data[i].def_value; String v = impl->data[i].def_value;
if (space_delete) if (space_delete)
v = impl->cat_string(v); v = impl->cat_string(v);
// it is an error if we just got the default value here
if(v.empty())
break;
from_str(v, type, dst); from_str(v, type, dst);
return; return;
} }
} }
} }
impl->error = true; impl->error = true;
impl->error_message = impl->error_message + "Unknown parameter " + name + "\n"; impl->error_message = impl->error_message + "Missing parameter: '" + name + "'\n";
} }
catch (std::exception& e) catch (Exception& e)
{ {
impl->error = true; impl->error = true;
impl->error_message = impl->error_message + "Exception: " + String(e.what()) + "\n"; impl->error_message = impl->error_message + "Parameter '"+ name + "': " + e.err + "\n";
} }
} }
...@@ -128,17 +133,22 @@ void CommandLineParser::getByIndex(int index, bool space_delete, int type, void* ...@@ -128,17 +133,22 @@ void CommandLineParser::getByIndex(int index, bool space_delete, int type, void*
{ {
String v = impl->data[i].def_value; String v = impl->data[i].def_value;
if (space_delete == true) v = impl->cat_string(v); if (space_delete == true) v = impl->cat_string(v);
// it is an error if we just got the default value here
if(v.empty())
break;
from_str(v, type, dst); from_str(v, type, dst);
return; return;
} }
} }
impl->error = true; impl->error = true;
impl->error_message = impl->error_message + "Unknown parameter #" + format("%d", index) + "\n"; impl->error_message = impl->error_message + "Missing parameter #" + format("%d", index) + "\n";
} }
catch(std::exception & e) catch(Exception& e)
{ {
impl->error = true; impl->error = true;
impl->error_message = impl->error_message + "Exception: " + String(e.what()) + "\n"; impl->error_message = impl->error_message + format("Parameter #%d: ", index) + e.err + "\n";
} }
} }
...@@ -324,9 +334,9 @@ bool CommandLineParser::has(const String& name) const ...@@ -324,9 +334,9 @@ bool CommandLineParser::has(const String& name) const
{ {
for (size_t j = 0; j < impl->data[i].keys.size(); j++) for (size_t j = 0; j < impl->data[i].keys.size(); j++)
{ {
if (name.compare(impl->data[i].keys[j]) == 0 && String("true").compare(impl->data[i].def_value) == 0) if (name == impl->data[i].keys[j])
{ {
return true; return !impl->cat_string(impl->data[i].def_value).empty();
} }
} }
} }
......
...@@ -783,7 +783,7 @@ void TestBase::Init(const std::vector<std::string> & availableImpls, ...@@ -783,7 +783,7 @@ void TestBase::Init(const std::vector<std::string> & availableImpls,
; ;
cv::CommandLineParser args(argc, argv, command_line_keys); cv::CommandLineParser args(argc, argv, command_line_keys);
if (args.has("help")) if (args.get<bool>("help"))
{ {
args.printMessage(); args.printMessage();
return; return;
...@@ -791,7 +791,7 @@ void TestBase::Init(const std::vector<std::string> & availableImpls, ...@@ -791,7 +791,7 @@ void TestBase::Init(const std::vector<std::string> & availableImpls,
::testing::AddGlobalTestEnvironment(new PerfEnvironment); ::testing::AddGlobalTestEnvironment(new PerfEnvironment);
param_impl = args.has("perf_run_cpu") ? "plain" : args.get<std::string>("perf_impl"); param_impl = args.get<bool>("perf_run_cpu") ? "plain" : args.get<std::string>("perf_impl");
std::string perf_strategy = args.get<std::string>("perf_strategy"); std::string perf_strategy = args.get<std::string>("perf_strategy");
if (perf_strategy == "default") if (perf_strategy == "default")
{ {
...@@ -816,24 +816,24 @@ void TestBase::Init(const std::vector<std::string> & availableImpls, ...@@ -816,24 +816,24 @@ void TestBase::Init(const std::vector<std::string> & availableImpls,
param_seed = args.get<unsigned int>("perf_seed"); param_seed = args.get<unsigned int>("perf_seed");
param_time_limit = std::max(0., args.get<double>("perf_time_limit")); param_time_limit = std::max(0., args.get<double>("perf_time_limit"));
param_force_samples = args.get<unsigned int>("perf_force_samples"); param_force_samples = args.get<unsigned int>("perf_force_samples");
param_write_sanity = args.has("perf_write_sanity"); param_write_sanity = args.get<bool>("perf_write_sanity");
param_verify_sanity = args.has("perf_verify_sanity"); param_verify_sanity = args.get<bool>("perf_verify_sanity");
#ifndef WINRT #ifndef WINRT
test_ipp_check = !args.has("perf_ipp_check") ? getenv("OPENCV_IPP_CHECK") != NULL : true; test_ipp_check = !args.get<bool>("perf_ipp_check") ? getenv("OPENCV_IPP_CHECK") != NULL : true;
#else #else
test_ipp_check = false; test_ipp_check = false;
#endif #endif
param_threads = args.get<int>("perf_threads"); param_threads = args.get<int>("perf_threads");
#ifdef CV_COLLECT_IMPL_DATA #ifdef CV_COLLECT_IMPL_DATA
param_collect_impl = args.has("perf_collect_impl"); param_collect_impl = args.get<bool>("perf_collect_impl");
#endif #endif
#ifdef ANDROID #ifdef ANDROID
param_affinity_mask = args.get<int>("perf_affinity_mask"); param_affinity_mask = args.get<int>("perf_affinity_mask");
log_power_checkpoints = args.has("perf_log_power_checkpoints"); log_power_checkpoints = args.has("perf_log_power_checkpoints");
#endif #endif
bool param_list_impls = args.has("perf_list_impls"); bool param_list_impls = args.get<bool>("perf_list_impls");
if (param_list_impls) if (param_list_impls)
{ {
...@@ -861,7 +861,7 @@ void TestBase::Init(const std::vector<std::string> & availableImpls, ...@@ -861,7 +861,7 @@ void TestBase::Init(const std::vector<std::string> & availableImpls,
#ifdef HAVE_CUDA #ifdef HAVE_CUDA
bool printOnly = args.has("perf_cuda_info_only"); bool printOnly = args.get<bool>("perf_cuda_info_only");
if (printOnly) if (printOnly)
exit(0); exit(0);
......
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