Search:

SENF Extensible Network Framework

  • Home
  • Download
  • Wiki
  • BerliOS
  • ChangeLog
  • Browse SVN
  • Bug Tracker
  • Overview
  • Examples
  • HowTos
  • Glossary
  • PPI
  • Packets
  • Scheduler
  • Socket
  • Utils
  • Console
  • Daemon
  • Logger
  • Termlib
  • Main Page
  • Related Pages
  • Modules
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

ParsedCommand.cti

Go to the documentation of this file.
00001 // $Id: ParsedCommand.cti 1742 2010-11-04 14:51:56Z g0dil $
00002 //
00003 // Copyright (C) 2008
00004 // Fraunhofer (FOKUS)
00005 // Competence Center NETwork research (NET), St. Augustin, GERMANY
00006 //     Stefan Bund <g0dil@berlios.de>
00007 //
00008 // This program is free software; you can redistribute it and/or modify
00009 // it under the terms of the GNU General Public License as published by
00010 // the Free Software Foundation; either version 2 of the License, or
00011 // (at your option) any later version.
00012 //
00013 // This program is distributed in the hope that it will be useful,
00014 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00015 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016 // GNU General Public License for more details.
00017 //
00018 // You should have received a copy of the GNU General Public License
00019 // along with this program; if not, write to the
00020 // Free Software Foundation, Inc.,
00021 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
00022 
00026 #include "ParsedCommand.ih"
00027 
00028 // Custom includes
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 // senf::console::detail::ArgumentInfo<ParameterType>
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 // senf::console::ParsedCommandOverloadBase
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 // senf::console::ParsedCommandOverload<FunctionTraits,n>
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 // senf::console::ParsedCommandAttributor<Overload>
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 // senf::console::ParsedArgumentAttributorBase<Overload,Self>
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 // senf::console::ParsedArgumentAttributor<Overload,index,flag>
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 // senf::console::ParsedArgumentAttributor<Overload, index, false>
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 // namespace members
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 // Local Variables:
00481 // mode: c++
00482 // fill-column: 100
00483 // comment-column: 40
00484 // c-file-style: "senf"
00485 // indent-tabs-mode: nil
00486 // ispell-local-dictionary: "american"
00487 // compile-command: "scons -u test"
00488 // End:

Contact: senf-dev@lists.berlios.de | © 2006-2010 Fraunhofer Institute for Open Communication Systems, Network Research