Update CommandLineParser class

This commit is contained in:
Kirill Kornyakov
2011-05-28 06:55:41 +00:00
parent 4b4053705d
commit fe279279e6
2 changed files with 104 additions and 159 deletions

View File

@@ -4171,126 +4171,85 @@ protected:
The class is used for reading command arguments.
Supports the following syntax:
//-k 10 1 2 --x 0.001 --size 640 480 --inputFile lena.jpg
//-k=10 --x 0.001 --inputFile lena.jpg
int k = parser.get<int>("--k | -k", -1);
vector<int> kValues=parser.getVec<int>("--k | -k");
double x = parser.get<double>("--x");
cv::Size size = parser.get<cv::Size>("--size");
string inputFile = parser.get<string>("--inputFile");
*/
class CV_EXPORTS CommandLineParser
{
public:
//! the default constructor
CommandLineParser(int argc, const char* argv[]);
public:
//! allows to check if parameter is given
bool has(const std::string& keys) const;
//! the default constructor
CommandLineParser(int argc, const char* argv[]);
//! get parameter
template<typename _Tp>
_Tp get(const std::string& name)
{
return fromStringsVec<_Tp>(getVec<std::string>(name));
}
//! allows to check if parameter is given
bool has(const std::string& keys) const;
//! get parameter with default value
template<typename _Tp>
_Tp get(const std::string& name, const _Tp& default_value)
{
if (!has(name))
return default_value;
return get<_Tp>(name);
}
//! get a vector of values for specified key
template<typename _Tp>
std::vector<_Tp> getVec(const std::string& keys);
protected:
std::map<std::string, std::vector<std::string> > data;
template<typename _Tp>
static _Tp fromStringSimple(const std::string& str)//the default conversion function
{
_Tp res;
std::stringstream s1(str);
s1 >> res;
return res;
}
template<typename _Tp>
static _Tp fromString(const std::string& str)
{
return fromStringSimple<_Tp>(str);
}
template<typename _Tp>
static _Tp fromStringNumber(const std::string& str)//the default conversion function for numbers
{
_Tp dummy_val=0; dummy_val+=1;
if (str.empty())
CV_Error(CV_StsParseError, "Empty string cannot be converted to a number");
const char* c_str=str.c_str();
if((!isdigit(c_str[0]))
&&
(
(c_str[0]!='-') || (strlen(c_str) <= 1) || ( !isdigit(c_str[1]) )
)
)
//! get parameter, if parameter is not given get default parameter
template<typename _Tp>
_Tp get(const std::string& name, const _Tp& default_value = _Tp())
{
CV_Error(CV_StsParseError, "The string '"+ str +"' cannot be converted to a number");
std::string str = getString(name);
if (!has(name))
return default_value;
return analizeValue<_Tp>(str);
}
return fromStringSimple<_Tp>(str);
}
protected:
std::map<std::string, std::vector<std::string> > data;
std::string getString(const std::string& name) const;
template<typename _Tp>
static _Tp fromStringsVec(const std::vector<std::string>& vec_str)
{
if (vec_str.empty())
CV_Error(CV_StsParseError, "Cannot convert from an empty vector");
return fromString<_Tp>(vec_str[0]);
}
};
template<typename _Tp>
_Tp analizeValue(const std::string& str);
template<> CV_EXPORTS
std::vector<std::string> CommandLineParser::getVec<std::string>(const std::string& keys);
template<typename _Tp>
static _Tp getData(const std::string& str)
{
_Tp res;
std::stringstream s1(str);
s1 >> res;
return res;
}
template<typename _Tp> inline
std::vector<_Tp> CommandLineParser::getVec(const std::string& keys)
{
if (!has(keys))
return std::vector<_Tp>();
template<typename _Tp>
static _Tp fromStringNumber(const std::string& str)//the default conversion function for numbers
{
std::vector<std::string> v=getVec<std::string>(keys);
if (str.empty())
CV_Error(CV_StsParseError, "Empty string cannot be converted to a number");
std::vector<_Tp> res;
for(size_t i=0; i < v.size(); i++)
{
_Tp val=fromString<_Tp>(v[i]);
res.push_back(val);
}
return res;
}
const char* c_str=str.c_str();
if((!isdigit(c_str[0]))
&&
(
(c_str[0]!='-') || (strlen(c_str) <= 1) || ( !isdigit(c_str[1]) )
)
)
template<> CV_EXPORTS
std::string CommandLineParser::fromString<std::string>(const std::string& str);
{
CV_Error(CV_StsParseError, "The string '"+ str +"' cannot be converted to a number");
}
template<> CV_EXPORTS
int CommandLineParser::fromString<int>(const std::string& str);
return getData<_Tp>(str);
}
template<> CV_EXPORTS
unsigned int CommandLineParser::fromString<unsigned int>(const std::string& str);
};
template<> CV_EXPORTS
double CommandLineParser::fromString<double>(const std::string& str);
template<> CV_EXPORTS
std::string CommandLineParser::analizeValue<std::string>(const std::string& str);
template<> CV_EXPORTS
cv::Size CommandLineParser::fromStringsVec<cv::Size>(const std::vector<std::string>& str);
template<> CV_EXPORTS
int CommandLineParser::analizeValue<int>(const std::string& str);
template<> CV_EXPORTS
unsigned CommandLineParser::analizeValue<unsigned int>(const std::string& str);
template<> CV_EXPORTS
float CommandLineParser::analizeValue<float>(const std::string& str);
template<> CV_EXPORTS
double CommandLineParser::analizeValue<double>(const std::string& str);
}