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
00033 namespace tool
00034 {
00035
00036 namespace opt
00037 {
00038
00039
00040
00041
00042
00043 namespace internals
00044 {
00045 struct pair;
00046 template <class> struct defaults_list;
00047 }
00048
00049 struct name;
00050
00051
00052
00053
00054
00055
00057 struct invalid_type: std::logic_error
00058 {
00059 invalid_type(const std::string& opt_type_name,
00060 const std::string& req_type_name);
00061 };
00062
00064 struct value: public boost::any
00065 {
00066 value();
00067
00068 template <class T>
00069 value(const T& v);
00070
00071 template <class T>
00072 T&
00073 get();
00074
00075 template <class T>
00076 const T&
00077 get() const;
00078
00079 value&
00080 operator [] (const name& n);
00081
00082 const value&
00083 operator [] (const name& n) const;
00084
00085 std::ostream&
00086 print(std::ostream& v) const;
00087 };
00088
00089 std::ostream&
00090 operator << (std::ostream& o, const value& v);
00091
00093 template <class T> T& get(value& v);
00094
00096 template <class T> const T& get(const value& v);
00097
00099 struct name: public std::string
00100 {
00101 name(const std::string& n);
00102 name(const char* n);
00103
00104 internals::pair
00105 operator -= (const value& v) const;
00106 };
00107
00109 namespace internals
00110 {
00111
00113 struct pair
00114 {
00115 pair(const name& n, const value& v);
00116
00117 defaults_list<pair>
00118 operator , (const pair& p) const;
00119
00120 template <class Map>
00121 void
00122 populate(Map& m) const;
00123
00124 private:
00125 const name& opt_name;
00126 const value& opt_value;
00127 };
00128
00130 template <class NextDefaultsList>
00131 struct defaults_list
00132 {
00133 defaults_list(const pair& p, const NextDefaultsList& next);
00134
00135 defaults_list< defaults_list<NextDefaultsList> >
00136 operator , (const pair& p) const;
00137
00138 template <class Map>
00139 void
00140 populate(Map& m) const;
00141
00142 private:
00143 const pair& this_pair;
00144 const NextDefaultsList& next_defaults;
00145 };
00146
00147 }
00148
00150 struct invalid_option: public std::invalid_argument
00151 {
00152 invalid_option(const name& n);
00153 };
00154
00160 struct list: public std::map<name, value>
00161 {
00162 list();
00163
00164 list(const internals::pair& defaults);
00165
00166 template <class D>
00167 list(const internals::defaults_list<D>& defaults);
00168
00169 value&
00170 operator [] (const name& n);
00171
00172 const value&
00173 operator [] (const name& n) const;
00174
00175 void
00176 add(const list& l);
00177
00178 void
00179 add(const name& n, const value& v);
00180
00181 list&
00182 add(const name& n, const list& l);
00183
00184 void
00185 populate(list& other) const;
00186
00187 std::ostream&
00188 print(std::ostream& o, unsigned depth = 0) const;
00189 };
00190
00191 std::ostream&
00192 operator << (std::ostream& o, const list& l);
00193
00194 }
00195
00196 }
00197
00198 # include "options.hxx"
00199
00200 #endif // TOOL_OPTIONS_HH_