00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00026 #include "ParsedCommand.ih"
00027
00028
00029 #include <senf/Utils/membind.hh>
00030 #include <boost/format.hpp>
00031 #include <senf/Utils/parameter.hh>
00032
00033 #define prefix_ inline
00034
00035
00036
00037
00038
00039 template <class ParameterType>
00040 prefix_ typename senf::console::detail::ArgumentInfo<ParameterType>::ptr
00041 senf::console::detail::ArgumentInfo<ParameterType>::create()
00042 {
00043 return ptr(new ArgumentInfo());
00044 }
00045
00046 template <class ParameterType>
00047 prefix_ senf::console::detail::ArgumentInfo<ParameterType>::ArgumentInfo()
00048 : ArgumentInfoBase ( ArgumentTraits<ParameterType>::description(),
00049 ArgumentTraits<ParameterType>::singleToken ),
00050 defaultValue ()
00051 {}
00052
00053 template <class ParameterType>
00054 prefix_ std::string senf::console::detail::ArgumentInfo<ParameterType>::defaultValueStr()
00055 const
00056 {
00057 return hasDefault ? ArgumentTraits<ParameterType>::str(defaultValue) : "";
00058 }
00059
00060
00061
00062
00063 template <class Type>
00064 prefix_ void senf::console::ParsedCommandOverloadBase::addParameter()
00065 {
00066 parameters_.push_back(detail::ArgumentInfo<Type>::create());
00067 }
00068
00069
00070
00071
00072 #define BOOST_PP_ITERATION_PARAMS_1 (4, (0, SENF_CONSOLE_MAX_COMMAND_ARITY, \
00073 SENF_ABSOLUTE_INCLUDE_PATH(Utils/Console/ParsedCommand.mpp), \
00074 2))
00075 #include BOOST_PP_ITERATE()
00076
00077
00078
00079
00080 template <class Overload>
00081 prefix_ Overload & senf::console::ParsedCommandAttributor<Overload>::overload()
00082 const
00083 {
00084 return static_cast<Overload &>(ParsedCommandAttributorBase::overload());
00085 }
00086
00087 template <class Overload>
00088 prefix_ senf::console::ParsedCommandAttributor<Overload>::
00089 ParsedCommandAttributor(typename Overload::ptr overload, unsigned index)
00090 : ParsedCommandAttributorBase (overload, index)
00091 {}
00092
00093 template <class Overload>
00094 prefix_ senf::console::ParsedCommandAttributor<Overload>::
00095 ParsedCommandAttributor(ParsedCommandAttributorBase const & other, unsigned index)
00096 : ParsedCommandAttributorBase (other, index)
00097 {}
00098
00099
00100
00101
00102 template <class Overload, class Self, class ReturnType>
00103 prefix_ Self
00104 senf::console::ParsedArgumentAttributorBase<Overload,Self,ReturnType>::doc(std::string const & doc)
00105 {
00106 this->ParsedCommandAttributorBase::nodeDoc(doc);
00107 return static_cast<Self const &>(*this);
00108 }
00109
00110 template <class Overload, class Self, class ReturnType>
00111 prefix_ Self senf::console::ParsedArgumentAttributorBase<Overload,Self,ReturnType>::
00112 shortdoc(std::string const & doc)
00113 {
00114 this->ParsedCommandAttributorBase::shortDoc(doc);
00115 return static_cast<Self const &>(*this);
00116 }
00117
00118 template <class Overload, class Self, class ReturnType>
00119 prefix_ Self senf::console::ParsedArgumentAttributorBase<Overload,Self,ReturnType>::
00120 overloadDoc(std::string const & doc)
00121 {
00122 this->ParsedCommandAttributorBase::overloadDoc(doc);
00123 return static_cast<Self const &>(*this);
00124 }
00125
00126 template <class Overload, class Self, class ReturnType>
00127 prefix_ Self senf::console::ParsedArgumentAttributorBase<Overload,Self,ReturnType>::
00128 formatter(typename Overload::Formatter f)
00129 {
00130 this->overload().formatter(f);
00131 return static_cast<Self const &>(*this);
00132 }
00133
00134 template <class Overload, class Self, class ReturnType>
00135 prefix_
00136 senf::console::ParsedArgumentAttributorBase<Overload,Self,ReturnType>::
00137 ParsedArgumentAttributorBase(typename Overload::ptr overload, unsigned index)
00138 : ParsedCommandAttributor<Overload> (overload, index)
00139 {}
00140
00141 template <class Overload, class Self, class ReturnType>
00142 prefix_
00143 senf::console::ParsedArgumentAttributorBase<Overload,Self,ReturnType>::
00144 ParsedArgumentAttributorBase(ParsedCommandAttributorBase const & other, unsigned index)
00145 : ParsedCommandAttributor<Overload> (other, index)
00146 {}
00147
00148 template <class Overload, class Self>
00149 prefix_ Self
00150 senf::console::ParsedArgumentAttributorBase<Overload,Self,void>::doc(std::string const & doc)
00151 {
00152 this->ParsedCommandAttributorBase::nodeDoc(doc);
00153 return static_cast<Self const &>(*this);
00154 }
00155
00156 template <class Overload, class Self>
00157 prefix_ Self senf::console::ParsedArgumentAttributorBase<Overload, Self, void>::
00158 shortdoc(std::string const & doc)
00159 {
00160 this->ParsedCommandAttributorBase::shortDoc(doc);
00161 return static_cast<Self const &>(*this);
00162 }
00163
00164 template <class Overload, class Self>
00165 prefix_ Self senf::console::ParsedArgumentAttributorBase<Overload,Self,void>::
00166 overloadDoc(std::string const & doc)
00167 {
00168 this->ParsedCommandAttributorBase::overloadDoc(doc);
00169 return static_cast<Self const &>(*this);
00170 }
00171
00172 template <class Overload, class Self>
00173 prefix_
00174 senf::console::ParsedArgumentAttributorBase<Overload, Self, void>::
00175 ParsedArgumentAttributorBase(typename Overload::ptr overload, unsigned index)
00176 : ParsedCommandAttributor<Overload> (overload, index)
00177 {}
00178
00179 template <class Overload, class Self>
00180 prefix_
00181 senf::console::ParsedArgumentAttributorBase<Overload, Self, void>::
00182 ParsedArgumentAttributorBase(ParsedCommandAttributorBase const & other, unsigned index)
00183 : ParsedCommandAttributor<Overload> (other, index)
00184 {}
00185
00186
00187
00188
00189 template <class Overload, unsigned index, bool flag>
00190 prefix_ typename senf::console::ParsedArgumentAttributor<Overload,index,flag>::next_type
00191 senf::console::ParsedArgumentAttributor<Overload,index,flag>::arg()
00192 const
00193 {
00194 return next();
00195 }
00196
00197 template <class Overload, unsigned index, bool flag>
00198 template <class ArgumentPack>
00199 prefix_ typename senf::console::ParsedArgumentAttributor<Overload,index,flag>::next_type
00200 senf::console::ParsedArgumentAttributor<Overload,index,flag>::
00201 argInfo(ArgumentPack const & args)
00202 {
00203 # define ProcessArg(tag) \
00204 argInfo( kw:: tag, args, senf::has_parameter< ArgumentPack, kw::type:: tag >() )
00205
00206 ProcessArg(name);
00207 ProcessArg(description);
00208 ProcessArg(default_value);
00209 ProcessArg(type_name);
00210 ProcessArg(default_doc);
00211 ProcessArg(parser);
00212
00213 return next();
00214
00215 # undef ProcessArg
00216 }
00217
00218 template <class Overload, unsigned index, bool flag>
00219 template <class Kw, class ArgumentPack>
00220 prefix_ void senf::console::ParsedArgumentAttributor<Overload,index,flag>::
00221 argInfo(Kw const &, ArgumentPack const &, boost::mpl::false_)
00222 {}
00223
00224 template <class Overload, unsigned index, bool flag>
00225 template <class ArgumentPack>
00226 prefix_ void senf::console::ParsedArgumentAttributor<Overload,index,flag>::
00227 argInfo(boost::parameter::keyword<kw::type::name> const &, ArgumentPack const & args,
00228 boost::mpl::true_)
00229 {
00230 this->argName(args[kw::name]);
00231 }
00232
00233 template <class Overload, unsigned index, bool flag>
00234 template <class ArgumentPack>
00235 prefix_ void senf::console::ParsedArgumentAttributor<Overload,index,flag>::
00236 argInfo(boost::parameter::keyword<kw::type::description> const &, ArgumentPack const & args,
00237 boost::mpl::true_)
00238 {
00239 this->argDoc(args[kw::description]);
00240 }
00241
00242 template <class Overload, unsigned index, bool flag>
00243 template <class ArgumentPack>
00244 prefix_ void senf::console::ParsedArgumentAttributor<Overload,index,flag>::
00245 argInfo(boost::parameter::keyword<kw::type::default_value> const &, ArgumentPack const & args,
00246 boost::mpl::true_)
00247 {
00248 this->defaultValue(args[kw::default_value]);
00249 }
00250
00251 template <class Overload, unsigned index, bool flag>
00252 template <class ArgumentPack>
00253 prefix_ void senf::console::ParsedArgumentAttributor<Overload,index,flag>::
00254 argInfo(boost::parameter::keyword<kw::type::type_name> const &, ArgumentPack const & args,
00255 boost::mpl::true_)
00256 {
00257 this->typeName(args[kw::type_name]);
00258 }
00259
00260 template <class Overload, unsigned index, bool flag>
00261 template <class ArgumentPack>
00262 prefix_ void senf::console::ParsedArgumentAttributor<Overload,index,flag>::
00263 argInfo(boost::parameter::keyword<kw::type::default_doc> const &, ArgumentPack const & args,
00264 boost::mpl::true_)
00265 {
00266 BOOST_STATIC_ASSERT(( senf::has_parameter<ArgumentPack, kw::type::default_value>::value ));
00267 this->defaultDoc(args[kw::default_doc]);
00268 }
00269
00270 template <class Overload, unsigned index, bool flag>
00271 template <class ArgumentPack>
00272 prefix_ void senf::console::ParsedArgumentAttributor<Overload,index,flag>::
00273 argInfo(boost::parameter::keyword<kw::type::parser> const &, ArgumentPack const & args,
00274 boost::mpl::true_)
00275 {
00276 this->parser(args[kw::parser]);
00277 }
00278
00279 template <class Overload, unsigned index, bool flag>
00280 prefix_ senf::console::ParsedArgumentAttributor<Overload,index,flag>::
00281 ParsedArgumentAttributor(typename Overload::ptr overload)
00282 : ParsedArgumentAttributorBase<Overload, ParsedArgumentAttributor> (overload, index)
00283 {}
00284
00285 template <class Overload, unsigned index, bool flag>
00286 prefix_ senf::console::ParsedArgumentAttributor<Overload,index,flag>::
00287 ParsedArgumentAttributor(ParsedCommandAttributorBase const & other)
00288 : ParsedArgumentAttributorBase<Overload, ParsedArgumentAttributor> (other, index)
00289 {}
00290
00291 template <class Overload, unsigned index, bool flag>
00292 prefix_ typename senf::console::ParsedArgumentAttributor<Overload,index,flag>::next_type
00293 senf::console::ParsedArgumentAttributor<Overload,index,flag>::next()
00294 const
00295 {
00296 return ParsedArgumentAttributor<Overload, index+1>(*this);
00297 }
00298
00299 template <class Overload, unsigned index, bool flag>
00300 prefix_ void senf::console::ParsedArgumentAttributor<Overload,index,flag>::
00301 defaultValue(value_type const & value)
00302 {
00303 this->overload().arg<index>().defaultValue = value;
00304 this->overload().arg(index).hasDefault = true;
00305 }
00306
00307 template <class Overload, unsigned index, bool flag>
00308 template <class Fn>
00309 prefix_ void senf::console::ParsedArgumentAttributor<Overload,index,flag>::parser(Fn fn)
00310 {
00311 this->overload().arg<index>().parser = fn;
00312 }
00313
00314
00315
00316
00317 template <class Overload, unsigned index>
00318 prefix_
00319 senf::console::ParsedArgumentAttributor<Overload, index, false>::
00320 ParsedArgumentAttributor(typename Overload::ptr overload)
00321 : ParsedArgumentAttributorBase<
00322 Overload, ParsedArgumentAttributor<Overload, index, false> > (overload, index)
00323 {}
00324
00325 template <class Overload, unsigned index>
00326 prefix_
00327 senf::console::ParsedArgumentAttributor<Overload, index, false>::
00328 ParsedArgumentAttributor(ParsedCommandAttributorBase const & other)
00329 : ParsedArgumentAttributorBase<Overload, ParsedArgumentAttributor> (other, index)
00330 {}
00331
00332
00333
00334
00335 namespace senf {
00336 namespace console {
00337 namespace detail {
00338
00339 #ifndef DOXYGEN
00340
00341 struct ParsedCommandAddNodeAccess
00342 {
00343 template <class Attributor, class NodePtr>
00344 static Attributor attributor(NodePtr ptr)
00345 { return Attributor(ptr); }
00346 };
00347
00348 template <class Signature, class Fn>
00349 typename senf::console::detail::ParsedCommandTraits<Signature>::Attributor
00350 addOverloadedCommandNode(Fn fn)
00351 {
00352 typedef senf::console::detail::ParsedCommandTraits<Signature> CmdTraits;
00353 typedef senf::console::ParsedCommandOverload<typename CmdTraits::traits> Overload;
00354 typedef senf::console::ParsedArgumentAttributor<Overload> Attributor;
00355
00356 return detail::ParsedCommandAddNodeAccess::attributor<Attributor>(
00357 CreateParsedCommandOverload<CmdTraits>::create(fn));
00358 }
00359
00360 #endif
00361
00362 }}}
00363
00364
00365
00366 template <class Signature>
00367 prefix_ senf::console::SimpleOverloadAttributor
00368 senf::console::factory::
00369 Command(boost::function<Signature> fn,
00370 typename boost::enable_if_c<detail::ParsedCommandTraits<Signature>::is_simple>::type *)
00371 {
00372 return SimpleOverloadAttributor(fn);
00373 }
00374
00375 template <class Function>
00376 prefix_ senf::console::SimpleOverloadAttributor
00377 senf::console::factory::
00378 Command(Function fn,
00379 typename boost::enable_if_c<detail::ParsedCommandTraits<Function>::is_simple>::type *)
00380 {
00381 return SimpleOverloadAttributor(fn);
00382 }
00383
00384 template <class Owner, class Member>
00385 prefix_ senf::console::SimpleOverloadAttributor
00386 senf::console::factory::
00387 Command(Member memfn, Owner * owner,
00388 typename boost::enable_if<boost::is_member_function_pointer<Member> >::type *,
00389 typename boost::enable_if_c<detail::ParsedCommandTraits<Member>::is_simple>::type *)
00390 {
00391 return SimpleOverloadAttributor(senf::membind(memfn,owner));
00392 }
00393
00394 template <class Owner, class Member>
00395 prefix_ senf::console::SimpleOverloadAttributor
00396 senf::console::factory::
00397 Command(Member memfn, Owner const * owner,
00398 typename boost::enable_if<boost::is_member_function_pointer<Member> >::type *,
00399 typename boost::enable_if_c<detail::ParsedCommandTraits<Member>::is_simple>::type *)
00400 {
00401 return SimpleOverloadAttributor(senf::membind(memfn,owner));
00402 }
00403
00404 template <class CastTo, class Signature>
00405 prefix_ typename senf::console::detail::ParsedCommandTraits<CastTo>::Attributor
00406 senf::console::factory::
00407 Command(boost::function<Signature> fn)
00408 {
00409 return detail::addOverloadedCommandNode<CastTo>(fn);
00410 }
00411
00412 template <class CastTo, class Function>
00413 prefix_ typename senf::console::detail::ParsedCommandTraits<CastTo>::Attributor
00414 senf::console::factory::
00415 Command(Function fn,
00416 typename boost::enable_if_c<detail::ParsedCommandTraits<Function>::is_callable>::type *,
00417 typename boost::disable_if<boost::is_member_function_pointer<Function> >::type *)
00418 {
00419 return detail::addOverloadedCommandNode<CastTo>(fn);
00420 }
00421
00422 template <class Signature>
00423 prefix_ typename senf::console::detail::ParsedCommandTraits<Signature>::Attributor
00424 senf::console::factory::
00425 Command(boost::function<Signature> fn)
00426 {
00427 return detail::addOverloadedCommandNode<Signature>(fn);
00428 }
00429
00430 template <class Function>
00431 prefix_ typename senf::console::detail::ParsedCommandTraits<Function>::Attributor
00432 senf::console::factory::
00433 Command(Function fn,
00434 typename boost::enable_if_c<detail::ParsedCommandTraits<Function>::is_callable>::type *,
00435 typename boost::disable_if<boost::is_member_function_pointer<Function> >::type *)
00436 {
00437 return detail::addOverloadedCommandNode<Function>(fn);
00438 }
00439
00440 template <class Owner, class Member>
00441 prefix_ typename senf::console::detail::ParsedCommandTraits<Member>::Attributor
00442 senf::console::factory::
00443 Command(Member memfn, Owner * owner,
00444 typename boost::enable_if<boost::is_member_function_pointer<Member> >::type *)
00445 {
00446 return detail::addOverloadedCommandNode<Member>(senf::membind(memfn,owner));
00447 }
00448
00449 template <class Owner, class Member>
00450 prefix_ typename senf::console::detail::ParsedCommandTraits<Member>::Attributor
00451 senf::console::factory::
00452 Command(Member memfn, Owner const * owner,
00453 typename boost::enable_if<boost::is_member_function_pointer<Member> >::type *)
00454 {
00455 return detail::addOverloadedCommandNode<Member>(senf::membind(memfn,owner));
00456 }
00457
00458 template <class CastTo, class Owner, class Member>
00459 prefix_ typename senf::console::detail::ParsedCommandTraits<CastTo>::Attributor
00460 senf::console::factory::
00461 Command(Member memfn, Owner * owner,
00462 typename boost::enable_if<boost::is_member_function_pointer<Member> >::type *)
00463 {
00464 return detail::addOverloadedCommandNode<CastTo>(senf::membind(memfn,owner));
00465 }
00466
00467 template <class CastTo, class Owner, class Member>
00468 prefix_ typename senf::console::detail::ParsedCommandTraits<CastTo>::Attributor
00469 senf::console::factory::
00470 Command(Member memfn, Owner const * owner,
00471 typename boost::enable_if<boost::is_member_function_pointer<Member> >::type *)
00472 {
00473 return detail::addOverloadedCommandNode<CastTo>(senf::membind(memfn,owner));
00474 }
00475
00476
00477 #undef prefix_
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488