X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcore%2Fgetopt.h;h=56ab05123584ef83fcc51cd838802ef4a941c453;hb=79482ba7aea1b79c7a310c940cc0292532ef3bcb;hp=d45e888692ea9f96d2947180f19de75f6652eabb;hpb=c2eeec205dbf17f6ca38fda2671c6aaf2d1c505f;p=libs%2Fcore.git diff --git a/source/core/getopt.h b/source/core/getopt.h index d45e888..56ab051 100644 --- a/source/core/getopt.h +++ b/source/core/getopt.h @@ -1,18 +1,11 @@ -/* $Id$ - -This file is part of libmspcore -Copyright © 2006-2009, 2011 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ - #ifndef MSP_CORE_GETOPT_H_ #define MSP_CORE_GETOPT_H_ #include -#include #include #include #include +#include namespace Msp { @@ -72,6 +65,9 @@ private: template class Option: public OptBase { + private: + T &data; + public: Option(char s, const std::string &l, T &d, ArgType a): OptBase(s, l, a), data(d) { } @@ -79,21 +75,23 @@ private: virtual void store(const std::string &a) { - T tmp; - std::istringstream ss(a); - ss>>tmp; - if(ss.fail()) - throw usage_error("Invalid argument for --"+lng); - - data = tmp; + try + { + data = lexical_cast(a); + } + catch(const lexical_error &e) + { + throw usage_error("Invalid argument for --"+lng+" ("+e.what()+")"); + } } - private: - T &data; }; template class ListOption: public OptBase { + private: + T &data; + public: ListOption(char s, const std::string &l, T &d, ArgType a): OptBase(s, l, a), data(d) { if(arg_type!=REQUIRED_ARG) throw std::invalid_argument("ListOption arg_type!=REQUIRED"); } @@ -102,16 +100,15 @@ private: virtual void store(const std::string &a) { - typename T::value_type tmp; - std::istringstream ss(a); - ss>>tmp; - if(ss.fail()) - throw usage_error("Invalid argument for --"+lng); - - data.push_back(tmp); + try + { + data.push_back(lexical_cast(a)); + } + catch(const lexical_error &e) + { + throw usage_error("Invalid argument for --"+lng+" ("+e.what()+")"); + } } - private: - T &data; }; bool help;