22 #include <boost/exception/info.hpp>
23 #include <boost/program_options.hpp>
24 #include <boost/program_options/errors.hpp>
26 #include <netinet/in.h>
35 public boost::exception,
36 public boost::program_options::invalid_option_value
41 boost::program_options::invalid_option_value(option_value)
49 std::ostream& operator<<(std::ostream& os, const constrained_value<T>& v);
73 constrained_value<T>& operator=(
const constrained_value<T>& rhs)
75 return set_value(rhs);
78 constrained_value<T>& operator=(T rhs)
80 return set_value(rhs);
94 operator>>(std::istream& is,
95 constrained_value<T>& bound_val)
104 std::ostream& operator<<(std::ostream& os, const constrained_value<T>& v)
113 template<
class T, T min_val>
114 bool less_than_min(T val_to_check)
116 return val_to_check < min_val;
120 inline bool less_than_min<uint16_t, 0>(uint16_t)
126 inline bool less_than_min<uint32_t, 0>(uint32_t)
132 inline bool less_than_min<uint64_t, 0>(uint64_t)
137 template<
class T, T min_val>
138 bool greater_than_max(T val_to_check)
140 return val_to_check > min_val;
144 inline bool greater_than_max<uint16_t, UINT16_MAX>(uint16_t)
150 inline bool greater_than_max<uint32_t, UINT32_MAX>(uint32_t)
156 inline bool greater_than_max<uint64_t, UINT64_MAX>(uint64_t)
162 typedef boost::error_info<struct tag_invalid_max,uint64_t> invalid_max_info;
163 typedef boost::error_info<struct tag_invalid_min,int64_t> invalid_min_info;
164 typedef boost::error_info<struct tag_invalid_min,std::string> invalid_value;
168 T MINVAL,
unsigned int ALIGN= 1>
180 return set_value(rhs.get());
185 if (greater_than_max<T,MAXVAL>(rhs))
187 boost::throw_exception(
invalid_option_value(boost::lexical_cast<std::string>(rhs)) << invalid_max_info(static_cast<uint64_t>(MAXVAL)));
190 if (less_than_min<T,MINVAL>(rhs))
192 boost::throw_exception(
invalid_option_value(boost::lexical_cast<std::string>(rhs)) << invalid_min_info(static_cast<int64_t>(MINVAL)));
213 void validate(boost::any& v,
214 const std::vector<std::string>& values,
217 boost::program_options::validators::check_first_occurrence(v);
218 const std::string& s= boost::program_options::validators::get_single_string(values);
220 val= boost::lexical_cast<T>(s);
TODO: Rename this file - func.h is stupid.