00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00026 #include "Variables.ih"
00027
00028
00029
00030 #define prefix_ inline
00031
00032
00033
00034
00035
00036 template <class Variable>
00037 prefix_ senf::console::detail::QueryVariable<Variable>::QueryVariable(Variable const & var)
00038 : var_ (var)
00039 {}
00040
00041 template <class Variable>
00042 prefix_ typename senf::console::detail::QueryVariable<Variable>::Traits::Overload::ptr
00043 senf::console::detail::QueryVariable<Variable>::create(Variable const & var)
00044 {
00045 return CreateOverload::create(Function(QueryVariable(var)));
00046 }
00047
00048 template <class Variable>
00049 prefix_ Variable const & senf::console::detail::QueryVariable<Variable>::operator()()
00050 const
00051 {
00052 return var_;
00053 }
00054
00055
00056
00057
00058 template <class Variable>
00059 prefix_ senf::console::detail::SetVariable<Variable>::SetVariable(Variable & var,
00060 OnChangeHandler handler)
00061 : var_ (var), handler_ (handler)
00062 {}
00063
00064 template <class Variable>
00065 prefix_ typename senf::console::detail::SetVariable<Variable>::Traits::Overload::ptr
00066 senf::console::detail::SetVariable<Variable>::create(Variable & var)
00067 {
00068 typename Traits::Overload::ptr overload (CreateOverload::create(Function(SetVariable(var))));
00069 overload->arg(0).name = "new_value";
00070 return overload;
00071 }
00072
00073 template <class Variable>
00074 prefix_ void senf::console::detail::SetVariable<Variable>::operator()(Variable const & value)
00075 const
00076 {
00077 if (handler_) {
00078 Variable old (var_);
00079 var_ = value;
00080 handler_(old);
00081 }
00082 else
00083 var_ = value;
00084 }
00085
00086
00087
00088
00089 template <class Variable>
00090 prefix_ senf::console::factory::ConstVariableFactory<Variable>
00091 senf::console::factory::ConstVariableFactory<Variable>::doc(std::string const & doc)
00092 {
00093 doc_ = doc;
00094 return *this;
00095 }
00096
00097 template <class Variable>
00098 prefix_ senf::console::factory::ConstVariableFactory<Variable>
00099 senf::console::factory::ConstVariableFactory<Variable>::shortdoc(std::string const & doc)
00100 {
00101 shortdoc_ = doc;
00102 return *this;
00103 }
00104
00105 template <class Variable>
00106 prefix_ senf::console::factory::ConstVariableFactory<Variable>
00107 senf::console::factory::ConstVariableFactory<Variable>::formatter(Formatter formatter)
00108 {
00109 queryOverload_->formatter(formatter);
00110 return *this;
00111 }
00112
00113 template <class Variable>
00114 prefix_ senf::console::OverloadedCommandNode &
00115 senf::console::factory::ConstVariableFactory<Variable>::create(DirectoryNode & dir,
00116 std::string const & name)
00117 const
00118 {
00119 OverloadedCommandNode & node (OverloadedCommandNode::insertOverload(dir, name, queryOverload_));
00120 if (doc_) node.doc(*doc_);
00121 if (shortdoc_) node.shortdoc(*shortdoc_);
00122 return node;
00123 }
00124
00125 template <class Variable>
00126 prefix_ senf::console::factory::ConstVariableFactory<Variable>::
00127 ConstVariableFactory(Variable const & var)
00128 : queryOverload_ (detail::QueryVariable<Variable>::create(var))
00129 {}
00130
00131
00132
00133
00134 template <class Variable>
00135 prefix_ typename senf::console::factory::VariableFactory<Variable>
00136 senf::console::factory::VariableFactory<Variable>::parser(Parser parser)
00137 {
00138 setOverload_->template arg<0>().parser = parser;
00139 return *this;
00140 }
00141
00142 template <class Variable>
00143 prefix_ typename senf::console::factory::VariableFactory<Variable>
00144 senf::console::factory::VariableFactory<Variable>::typeName(std::string const & name)
00145 {
00146 setOverload_->arg(0).type = name;
00147 return *this;
00148 }
00149
00150 template <class Variable>
00151 prefix_ typename senf::console::factory::VariableFactory<Variable>
00152 senf::console::factory::VariableFactory<Variable>::onChange(OnChangeHandler handler)
00153 {
00154 setOverload_->function(
00155 boost::bind(detail::SetVariable<Variable>(var_, handler),_2));
00156 return *this;
00157 }
00158
00159 template <class Variable>
00160 prefix_ typename senf::console::factory::VariableFactory<Variable>
00161 senf::console::factory::VariableFactory<Variable>::doc(std::string const & doc)
00162 {
00163 ConstVariableFactory<Variable>::doc(doc);
00164 return *this;
00165 }
00166
00167 template <class Variable>
00168 prefix_ typename senf::console::factory::VariableFactory<Variable>
00169 senf::console::factory::VariableFactory<Variable>::shortdoc(std::string const & doc)
00170 {
00171 ConstVariableFactory<Variable>::shortdoc(doc);
00172 return *this;
00173 }
00174
00175 template <class Variable>
00176 prefix_ typename senf::console::factory::VariableFactory<Variable>
00177 senf::console::factory::VariableFactory<Variable>::formatter(Formatter formatter)
00178 {
00179 ConstVariableFactory<Variable>::formatter(formatter);
00180 return *this;
00181 }
00182
00183 template <class Variable>
00184 prefix_ senf::console::OverloadedCommandNode &
00185 senf::console::factory::VariableFactory<Variable>::create(DirectoryNode & dir,
00186 std::string const & name)
00187 const
00188 {
00189 OverloadedCommandNode & node (ConstVariableFactory<Variable>::create(dir,name));
00190 node.add(setOverload_);
00191 return node;
00192 }
00193
00194 template <class Variable>
00195 prefix_ senf::console::factory::VariableFactory<Variable>::VariableFactory(Variable & var)
00196 : ConstVariableFactory<Variable> (var),
00197 setOverload_ (detail::SetVariable<Variable>::create(var)),
00198 var_ (var)
00199 {}
00200
00201
00202
00203 template <class Var>
00204 prefix_ senf::console::factory::VariableFactory<Var>
00205 senf::console::factory::Variable(Var & var)
00206 {
00207 return VariableFactory<Var>(var);
00208 }
00209
00210 template <class Var>
00211 prefix_ senf::console::factory::VariableFactory<Var>
00212 senf::console::factory::Variable(boost::reference_wrapper<Var> var)
00213 {
00214 return VariableFactory<Var>(var);
00215 }
00216
00217 template <class Var>
00218 prefix_ senf::console::factory::ConstVariableFactory<Var>
00219 senf::console::factory::Variable(Var const & var)
00220 {
00221 return ConstVariableFactory<Var>(var);
00222 }
00223
00224 template <class Var>
00225 prefix_ senf::console::factory::ConstVariableFactory<Var>
00226 senf::console::factory::Variable(boost::reference_wrapper<Var const> var)
00227 {
00228 return ConstVariableFactory<Var>(var);
00229 }
00230
00231
00232 #undef prefix_
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243