|
|
|
|
|
#ifndef DLIB_GET_OPTiON_Hh_ |
|
#define DLIB_GET_OPTiON_Hh_ |
|
|
|
#include "get_option_abstract.h" |
|
#include "../string.h" |
|
#include "../is_kind.h" |
|
|
|
namespace dlib |
|
{ |
|
|
|
|
|
|
|
class option_parse_error : public error |
|
{ |
|
public: |
|
option_parse_error(const std::string& option_string, const std::string& str): |
|
error(EOPTION_PARSE,"Error parsing argument for option '" + option_string + "', offending string is '" + str + "'.") {} |
|
}; |
|
|
|
|
|
|
|
template <typename config_reader_type, typename T> |
|
T impl_config_reader_get_option ( |
|
const config_reader_type& cr, |
|
const std::string& option_name, |
|
const std::string& full_option_name, |
|
T default_value |
|
) |
|
{ |
|
std::string::size_type pos = option_name.find_first_of("."); |
|
if (pos == std::string::npos) |
|
{ |
|
if (cr.is_key_defined(option_name)) |
|
{ |
|
try{ return string_cast<T>(cr[option_name]); } |
|
catch (string_cast_error&) { throw option_parse_error(full_option_name, cr[option_name]); } |
|
} |
|
} |
|
else |
|
{ |
|
std::string block_name = option_name.substr(0,pos); |
|
if (cr.is_block_defined(block_name)) |
|
{ |
|
return impl_config_reader_get_option(cr.block(block_name), |
|
option_name.substr(pos+1), |
|
full_option_name, |
|
default_value); |
|
} |
|
} |
|
|
|
return default_value; |
|
} |
|
|
|
|
|
|
|
template <typename cr_type, typename T> |
|
typename enable_if<is_config_reader<cr_type>,T>::type get_option ( |
|
const cr_type& cr, |
|
const std::string& option_name, |
|
T default_value |
|
) |
|
{ |
|
return impl_config_reader_get_option(cr, option_name, option_name, default_value); |
|
} |
|
|
|
|
|
|
|
template <typename parser_type, typename T> |
|
typename disable_if<is_config_reader<parser_type>,T>::type get_option ( |
|
const parser_type& parser, |
|
const std::string& option_name, |
|
T default_value |
|
) |
|
{ |
|
|
|
DLIB_ASSERT( parser.option_is_defined(option_name) == true && |
|
parser.option(option_name).number_of_arguments() == 1, |
|
"\t T get_option()" |
|
<< "\n\t option_name: " << option_name |
|
<< "\n\t parser.option_is_defined(option_name): " << parser.option_is_defined(option_name) |
|
<< "\n\t parser.option(option_name).number_of_arguments(): " << parser.option(option_name).number_of_arguments() |
|
); |
|
|
|
if (parser.option(option_name)) |
|
{ |
|
try |
|
{ |
|
default_value = string_cast<T>(parser.option(option_name).argument()); |
|
} |
|
catch (string_cast_error&) |
|
{ |
|
throw option_parse_error(option_name, parser.option(option_name).argument()); |
|
} |
|
} |
|
return default_value; |
|
} |
|
|
|
|
|
|
|
template <typename parser_type, typename cr_type, typename T> |
|
typename disable_if<is_config_reader<parser_type>,T>::type get_option ( |
|
const parser_type& parser, |
|
const cr_type& cr, |
|
const std::string& option_name, |
|
T default_value |
|
) |
|
{ |
|
|
|
DLIB_ASSERT( parser.option_is_defined(option_name) == true && |
|
parser.option(option_name).number_of_arguments() == 1, |
|
"\t T get_option()" |
|
<< "\n\t option_name: " << option_name |
|
<< "\n\t parser.option_is_defined(option_name): " << parser.option_is_defined(option_name) |
|
<< "\n\t parser.option(option_name).number_of_arguments(): " << parser.option(option_name).number_of_arguments() |
|
); |
|
|
|
if (parser.option(option_name)) |
|
return get_option(parser, option_name, default_value); |
|
else |
|
return get_option(cr, option_name, default_value); |
|
} |
|
|
|
|
|
|
|
template <typename parser_type, typename cr_type, typename T> |
|
typename disable_if<is_config_reader<parser_type>,T>::type get_option ( |
|
const cr_type& cr, |
|
const parser_type& parser, |
|
const std::string& option_name, |
|
T default_value |
|
) |
|
{ |
|
|
|
DLIB_ASSERT( parser.option_is_defined(option_name) == true && |
|
parser.option(option_name).number_of_arguments() == 1, |
|
"\t T get_option()" |
|
<< "\n\t option_name: " << option_name |
|
<< "\n\t parser.option_is_defined(option_name): " << parser.option_is_defined(option_name) |
|
<< "\n\t parser.option(option_name).number_of_arguments(): " << parser.option(option_name).number_of_arguments() |
|
); |
|
|
|
if (parser.option(option_name)) |
|
return get_option(parser, option_name, default_value); |
|
else |
|
return get_option(cr, option_name, default_value); |
|
} |
|
|
|
|
|
|
|
|
|
template <typename T> |
|
inline std::string get_option ( |
|
const T& cr, |
|
const std::string& option_name, |
|
const char* default_value |
|
) |
|
{ |
|
return get_option(cr, option_name, std::string(default_value)); |
|
} |
|
|
|
|
|
|
|
template <typename T, typename U> |
|
inline std::string get_option ( |
|
const T& parser, |
|
const U& cr, |
|
const std::string& option_name, |
|
const char* default_value |
|
) |
|
{ |
|
return get_option(parser, cr, option_name, std::string(default_value)); |
|
} |
|
|
|
|
|
|
|
} |
|
|
|
#endif |
|
|
|
|