00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef PARAMS_HPP
00025 #define PARAMS_HPP
00026
00027 #include <boost/variant.hpp>
00028 #include <boost/optional.hpp>
00029 #include <boost/none.hpp>
00030 #include <boost/lexical_cast.hpp>
00031 #include <string>
00032 #include <map>
00033
00034 namespace mapnik
00035 {
00036 typedef boost::variant<int,double,std::string> value_holder;
00037 typedef std::pair<const std::string, value_holder> parameter;
00038 typedef std::map<const std::string, value_holder> param_map;
00039
00040 template <typename T>
00041 struct value_extractor_visitor : public boost::static_visitor<>
00042 {
00043 value_extractor_visitor(boost::optional<T> & var)
00044 :var_(var) {}
00045
00046 void operator () (T val) const
00047 {
00048 var_ = val;
00049 }
00050
00051 template <typename T1>
00052 void operator () (T1 val) const
00053 {
00054 try
00055 {
00056 var_ = boost::lexical_cast<T>(val);
00057 }
00058 catch (boost::bad_lexical_cast & ) {}
00059 }
00060
00061 boost::optional<T> & var_;
00062 };
00063
00064
00065 class parameters : public param_map
00066 {
00067 template <typename T>
00068 struct converter
00069 {
00070 typedef boost::optional<T> return_type;
00071 static return_type extract(parameters const& params,
00072 std::string const& name,
00073 boost::optional<T> const& default_value)
00074 {
00075 boost::optional<T> result(default_value);
00076 parameters::const_iterator itr = params.find(name);
00077 if (itr != params.end())
00078 {
00079 boost::apply_visitor(value_extractor_visitor<T>(result),itr->second);
00080 }
00081 return result;
00082 }
00083 };
00084
00085 public:
00086
00087 parameters() {}
00088
00089 template <typename T>
00090 boost::optional<T> get(std::string const& key) const
00091 {
00092 return converter<T>::extract(*this,key, boost::none);
00093 }
00094
00095 template <typename T>
00096 boost::optional<T> get(std::string const& key, T const& default_value) const
00097 {
00098 return converter<T>::extract(*this,key,boost::optional<T>(default_value));
00099 }
00100 };
00101 }
00102
00103 #endif //PARAMS_HPP