00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef SBUILD_PARSE_VALUE_H
00021 #define SBUILD_PARSE_VALUE_H
00022
00023 #include <string>
00024
00025 #include "sbuild-parse-error.h"
00026 #include "sbuild-log.h"
00027
00028 namespace sbuild
00029 {
00030
00035 class parse_value
00036 {
00037 public:
00039 typedef parse_error error;
00040
00045 parse_value (std::string const& value);
00046
00048 virtual ~parse_value ();
00049
00055 template <typename T>
00056 operator T (void)
00057 {
00058 T tmp;
00059
00060 if (parse(tmp) == false)
00061 {
00062 throw error(parse_error::BAD_VALUE, this->value);
00063 }
00064
00065 return tmp;
00066 }
00067
00068 private:
00074 bool
00075 parse (bool& parsed_value) const;
00076
00082 bool
00083 parse (std::string& parsed_value) const;
00084
00090 template <typename T>
00091 bool
00092 parse (T& parsed_value) const
00093 {
00094 std::istringstream is(this->value);
00095 is.imbue(std::locale("C"));
00096 T tmpval;
00097 if (is >> tmpval)
00098 {
00099 parsed_value = tmpval;
00100 log_debug(DEBUG_NOTICE) << "value=" << parsed_value << std::endl;
00101 return true;
00102 }
00103 log_debug(DEBUG_NOTICE) << "parse error" << std::endl;
00104 return false;
00105 }
00106
00107 std::string value;
00108 };
00109
00110 }
00111
00112 #endif
00113
00114
00115
00116
00117
00118