00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef TOOL_OPTIONS_HH_
00023 # define TOOL_OPTIONS_HH_
00024
00025 # include <stdexcept>
00026 # include <string>
00027 # include <map>
00028 # include <ostream>
00029
00030 # include <boost/any.hpp>
00031
00032 namespace wpl
00033 {
00034
00035 namespace opt
00036 {
00037
00038
00039
00040
00041
00042 namespace internals
00043 {
00044 struct pair;
00045 template <class> struct defaults_list;
00046 }
00047
00048 struct name;
00049
00050
00051
00052
00053
00054
00056 struct invalid_type: std::logic_error
00057 {
00058 invalid_type(const std::string& opt_type_name,
00059 const std::string& req_type_name);
00060 };
00061
00063 struct value: public boost::any
00064 {
00065 value();
00066
00067 template <class T>
00068 value(const T& v);
00069
00070 template <class T>
00071 T&
00072 get();
00073
00074 template <class T>
00075 const T&
00076 get() const;
00077
00078 value&
00079 operator [] (const name& n);
00080
00081 const value&
00082 operator [] (const name& n) const;
00083
00084 std::ostream&
00085 print(std::ostream& v) const;
00086 };
00087
00088 std::ostream&
00089 operator << (std::ostream& o, const value& v);
00090
00092 template <class T> T& get(value& v);
00093
00095 template <class T> const T& get(const value& v);
00096
00098 struct name: public std::string
00099 {
00100 name(const std::string& n);
00101 name(const char* n);
00102
00103 internals::pair
00104 operator -= (const value& v) const;
00105 };
00106
00108 namespace internals
00109 {
00110
00112 struct pair
00113 {
00114 pair(const name& n, const value& v);
00115
00116 defaults_list<pair>
00117 operator , (const pair& p) const;
00118
00119 template <class Map>
00120 void
00121 populate(Map& m) const;
00122
00123 private:
00124 const name& opt_name;
00125 const value& opt_value;
00126 };
00127
00129 template <class NextDefaultsList>
00130 struct defaults_list
00131 {
00132 defaults_list(const pair& p, const NextDefaultsList& next);
00133
00134 defaults_list< defaults_list<NextDefaultsList> >
00135 operator , (const pair& p) const;
00136
00137 template <class Map>
00138 void
00139 populate(Map& m) const;
00140
00141 private:
00142 const pair& this_pair;
00143 const NextDefaultsList& next_defaults;
00144 };
00145
00146 }
00147
00149 struct invalid_option: public std::invalid_argument
00150 {
00151 invalid_option(const name& n);
00152 };
00153
00193 struct list: public std::map<name, value>
00194 {
00195 typedef std::map<name, value> super_type;
00196
00198 list();
00199
00201 list(const internals::pair& defaults);
00202
00204 template <class D>
00205 list(const internals::defaults_list<D>& defaults);
00206
00208 value&
00209 operator [] (const name& n);
00210
00212 const value&
00213 operator [] (const name& n) const;
00214
00216 void
00217 add(const list& l);
00218
00220 void
00221 add(const name& n, const value& v);
00222
00230 list&
00231 add(const name& n, const list& l);
00232
00234 void
00235 populate(list& other) const;
00236
00238 std::ostream&
00239 print(std::ostream& o, unsigned depth = 0) const;
00240 };
00241
00242 std::ostream&
00243 operator << (std::ostream& o, const list& l);
00244
00245 }
00246
00247 }
00248
00249 # include "options.hxx"
00250
00251 #endif // TOOL_OPTIONS_HH_