4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
6 // The contents of this file are subject to the Fraunhofer FOKUS Public License
7 // Version 1.0 (the "License"); you may not use this file except in compliance
8 // with the License. You may obtain a copy of the License at
9 // http://senf.berlios.de/license.html
11 // The Fraunhofer FOKUS Public License Version 1.0 is based on,
12 // but modifies the Mozilla Public License Version 1.1.
13 // See the full license text for the amendments.
15 // Software distributed under the License is distributed on an "AS IS" basis,
16 // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
17 // for the specific language governing rights and limitations under the License.
19 // The Original Code is Fraunhofer FOKUS code.
21 // The Initial Developer of the Original Code is Fraunhofer-Gesellschaft e.V.
22 // (registered association), Hansastraße 27 c, 80686 Munich, Germany.
23 // All Rights Reserved.
26 // Stefan Bund <g0dil@berlios.de>
29 \brief ParsedCommand inline template implementation */
31 #include "ParsedCommand.ih"
34 #include <senf/Utils/membind.hh>
35 #include <boost/format.hpp>
36 #include <senf/Utils/parameter.hh>
38 #define prefix_ inline
39 //-/////////////////////////////////////////////////////////////////////////////////////////////////
41 //-/////////////////////////////////////////////////////////////////////////////////////////////////
42 // senf::console::detail::ArgumentInfo<ParameterType>
44 template <class ParameterType>
45 prefix_ typename senf::console::detail::ArgumentInfo<ParameterType>::ptr
46 senf::console::detail::ArgumentInfo<ParameterType>::create()
48 return ptr(new ArgumentInfo());
51 template <class ParameterType>
52 prefix_ senf::console::detail::ArgumentInfo<ParameterType>::ArgumentInfo()
53 : ArgumentInfoBase ( ArgumentTraits<ParameterType>::description(),
54 ArgumentTraits<ParameterType>::singleToken ),
58 template <class ParameterType>
59 prefix_ std::string senf::console::detail::ArgumentInfo<ParameterType>::defaultValueStr()
62 return hasDefault ? ArgumentTraits<ParameterType>::str(defaultValue) : "";
65 //-/////////////////////////////////////////////////////////////////////////////////////////////////
66 // senf::console::ParsedCommandOverloadBase
69 prefix_ void senf::console::ParsedCommandOverloadBase::addParameter()
71 parameters_.push_back(detail::ArgumentInfo<Type>::create());
74 //-/////////////////////////////////////////////////////////////////////////////////////////////////
75 // senf::console::ParsedCommandOverload<FunctionTraits,n>
77 #define BOOST_PP_ITERATION_PARAMS_1 (4, (0, SENF_CONSOLE_MAX_COMMAND_ARITY, \
78 SENF_ABSOLUTE_INCLUDE_PATH(Utils/Console/ParsedCommand.mpp), \
80 #include BOOST_PP_ITERATE()
82 //-/////////////////////////////////////////////////////////////////////////////////////////////////
83 // senf::console::ParsedCommandAttributor<Overload>
85 template <class Overload>
86 prefix_ Overload & senf::console::ParsedCommandAttributor<Overload>::overload()
89 return static_cast<Overload &>(ParsedCommandAttributorBase::overload());
92 template <class Overload>
93 prefix_ senf::console::ParsedCommandAttributor<Overload>::
94 ParsedCommandAttributor(typename Overload::ptr overload, unsigned index)
95 : ParsedCommandAttributorBase (overload, index)
98 template <class Overload>
99 prefix_ senf::console::ParsedCommandAttributor<Overload>::
100 ParsedCommandAttributor(ParsedCommandAttributorBase const & other, unsigned index)
101 : ParsedCommandAttributorBase (other, index)
104 //-/////////////////////////////////////////////////////////////////////////////////////////////////
105 // senf::console::ParsedArgumentAttributorBase<Overload,Self>
107 template <class Overload, class Self, class ReturnType>
109 senf::console::ParsedArgumentAttributorBase<Overload,Self,ReturnType>::doc(std::string const & doc)
111 this->ParsedCommandAttributorBase::nodeDoc(doc);
112 return static_cast<Self const &>(*this);
115 template <class Overload, class Self, class ReturnType>
116 prefix_ Self senf::console::ParsedArgumentAttributorBase<Overload,Self,ReturnType>::
117 shortdoc(std::string const & doc)
119 this->ParsedCommandAttributorBase::shortDoc(doc);
120 return static_cast<Self const &>(*this);
123 template <class Overload, class Self, class ReturnType>
124 prefix_ Self senf::console::ParsedArgumentAttributorBase<Overload,Self,ReturnType>::
125 overloadDoc(std::string const & doc)
127 this->ParsedCommandAttributorBase::overloadDoc(doc);
128 return static_cast<Self const &>(*this);
131 template <class Overload, class Self, class ReturnType>
132 prefix_ Self senf::console::ParsedArgumentAttributorBase<Overload,Self,ReturnType>::
133 formatter(typename Overload::Formatter f)
135 this->overload().formatter(f);
136 return static_cast<Self const &>(*this);
139 template <class Overload, class Self, class ReturnType>
141 senf::console::ParsedArgumentAttributorBase<Overload,Self,ReturnType>::
142 ParsedArgumentAttributorBase(typename Overload::ptr overload, unsigned index)
143 : ParsedCommandAttributor<Overload> (overload, index)
146 template <class Overload, class Self, class ReturnType>
148 senf::console::ParsedArgumentAttributorBase<Overload,Self,ReturnType>::
149 ParsedArgumentAttributorBase(ParsedCommandAttributorBase const & other, unsigned index)
150 : ParsedCommandAttributor<Overload> (other, index)
153 template <class Overload, class Self>
155 senf::console::ParsedArgumentAttributorBase<Overload,Self,void>::doc(std::string const & doc)
157 this->ParsedCommandAttributorBase::nodeDoc(doc);
158 return static_cast<Self const &>(*this);
161 template <class Overload, class Self>
162 prefix_ Self senf::console::ParsedArgumentAttributorBase<Overload, Self, void>::
163 shortdoc(std::string const & doc)
165 this->ParsedCommandAttributorBase::shortDoc(doc);
166 return static_cast<Self const &>(*this);
169 template <class Overload, class Self>
170 prefix_ Self senf::console::ParsedArgumentAttributorBase<Overload,Self,void>::
171 overloadDoc(std::string const & doc)
173 this->ParsedCommandAttributorBase::overloadDoc(doc);
174 return static_cast<Self const &>(*this);
177 template <class Overload, class Self>
179 senf::console::ParsedArgumentAttributorBase<Overload, Self, void>::
180 ParsedArgumentAttributorBase(typename Overload::ptr overload, unsigned index)
181 : ParsedCommandAttributor<Overload> (overload, index)
184 template <class Overload, class Self>
186 senf::console::ParsedArgumentAttributorBase<Overload, Self, void>::
187 ParsedArgumentAttributorBase(ParsedCommandAttributorBase const & other, unsigned index)
188 : ParsedCommandAttributor<Overload> (other, index)
191 //-/////////////////////////////////////////////////////////////////////////////////////////////////
192 // senf::console::ParsedArgumentAttributor<Overload,index,flag>
194 template <class Overload, unsigned index, bool flag>
195 prefix_ typename senf::console::ParsedArgumentAttributor<Overload,index,flag>::next_type
196 senf::console::ParsedArgumentAttributor<Overload,index,flag>::arg()
202 template <class Overload, unsigned index, bool flag>
203 template <class ArgumentPack>
204 prefix_ typename senf::console::ParsedArgumentAttributor<Overload,index,flag>::next_type
205 senf::console::ParsedArgumentAttributor<Overload,index,flag>::
206 argInfo(ArgumentPack const & args)
208 # define ProcessArg(tag) \
209 argInfo( kw:: tag, args, senf::has_parameter< ArgumentPack, kw::type:: tag >() )
212 ProcessArg(description);
213 ProcessArg(default_value);
214 ProcessArg(type_name);
215 ProcessArg(default_doc);
223 template <class Overload, unsigned index, bool flag>
224 template <class Kw, class ArgumentPack>
225 prefix_ void senf::console::ParsedArgumentAttributor<Overload,index,flag>::
226 argInfo(Kw const &, ArgumentPack const &, boost::mpl::false_)
229 template <class Overload, unsigned index, bool flag>
230 template <class ArgumentPack>
231 prefix_ void senf::console::ParsedArgumentAttributor<Overload,index,flag>::
232 argInfo(boost::parameter::keyword<kw::type::name> const &, ArgumentPack const & args,
235 this->argName(args[kw::name]);
238 template <class Overload, unsigned index, bool flag>
239 template <class ArgumentPack>
240 prefix_ void senf::console::ParsedArgumentAttributor<Overload,index,flag>::
241 argInfo(boost::parameter::keyword<kw::type::description> const &, ArgumentPack const & args,
244 this->argDoc(args[kw::description]);
247 template <class Overload, unsigned index, bool flag>
248 template <class ArgumentPack>
249 prefix_ void senf::console::ParsedArgumentAttributor<Overload,index,flag>::
250 argInfo(boost::parameter::keyword<kw::type::default_value> const &, ArgumentPack const & args,
253 this->defaultValue(args[kw::default_value]);
256 template <class Overload, unsigned index, bool flag>
257 template <class ArgumentPack>
258 prefix_ void senf::console::ParsedArgumentAttributor<Overload,index,flag>::
259 argInfo(boost::parameter::keyword<kw::type::type_name> const &, ArgumentPack const & args,
262 this->typeName(args[kw::type_name]);
265 template <class Overload, unsigned index, bool flag>
266 template <class ArgumentPack>
267 prefix_ void senf::console::ParsedArgumentAttributor<Overload,index,flag>::
268 argInfo(boost::parameter::keyword<kw::type::default_doc> const &, ArgumentPack const & args,
271 BOOST_STATIC_ASSERT(( senf::has_parameter<ArgumentPack, kw::type::default_value>::value ));
272 this->defaultDoc(args[kw::default_doc]);
275 template <class Overload, unsigned index, bool flag>
276 template <class ArgumentPack>
277 prefix_ void senf::console::ParsedArgumentAttributor<Overload,index,flag>::
278 argInfo(boost::parameter::keyword<kw::type::parser> const &, ArgumentPack const & args,
281 this->parser(args[kw::parser]);
284 template <class Overload, unsigned index, bool flag>
285 prefix_ senf::console::ParsedArgumentAttributor<Overload,index,flag>::
286 ParsedArgumentAttributor(typename Overload::ptr overload)
287 : ParsedArgumentAttributorBase<Overload, ParsedArgumentAttributor> (overload, index)
290 template <class Overload, unsigned index, bool flag>
291 prefix_ senf::console::ParsedArgumentAttributor<Overload,index,flag>::
292 ParsedArgumentAttributor(ParsedCommandAttributorBase const & other)
293 : ParsedArgumentAttributorBase<Overload, ParsedArgumentAttributor> (other, index)
296 template <class Overload, unsigned index, bool flag>
297 prefix_ typename senf::console::ParsedArgumentAttributor<Overload,index,flag>::next_type
298 senf::console::ParsedArgumentAttributor<Overload,index,flag>::next()
301 return ParsedArgumentAttributor<Overload, index+1>(*this);
304 template <class Overload, unsigned index, bool flag>
305 prefix_ void senf::console::ParsedArgumentAttributor<Overload,index,flag>::
306 defaultValue(value_type const & value)
308 this->overload().arg<index>().defaultValue = value;
309 this->overload().arg(index).hasDefault = true;
312 template <class Overload, unsigned index, bool flag>
314 prefix_ void senf::console::ParsedArgumentAttributor<Overload,index,flag>::parser(Fn fn)
316 this->overload().arg<index>().parser = fn;
319 //-/////////////////////////////////////////////////////////////////////////////////////////////////
320 // senf::console::ParsedArgumentAttributor<Overload, index, false>
322 template <class Overload, unsigned index>
324 senf::console::ParsedArgumentAttributor<Overload, index, false>::
325 ParsedArgumentAttributor(typename Overload::ptr overload)
326 : ParsedArgumentAttributorBase<
327 Overload, ParsedArgumentAttributor<Overload, index, false> > (overload, index)
330 template <class Overload, unsigned index>
332 senf::console::ParsedArgumentAttributor<Overload, index, false>::
333 ParsedArgumentAttributor(ParsedCommandAttributorBase const & other)
334 : ParsedArgumentAttributorBase<Overload, ParsedArgumentAttributor> (other, index)
337 //-/////////////////////////////////////////////////////////////////////////////////////////////////
346 struct ParsedCommandAddNodeAccess
348 template <class Attributor, class NodePtr>
349 static Attributor attributor(NodePtr ptr)
350 { return Attributor(ptr); }
353 template <class Signature, class Fn>
354 typename senf::console::detail::ParsedCommandTraits<Signature>::Attributor
355 addOverloadedCommandNode(Fn fn)
357 typedef senf::console::detail::ParsedCommandTraits<Signature> CmdTraits;
358 typedef senf::console::ParsedCommandOverload<typename CmdTraits::traits> Overload;
359 typedef senf::console::ParsedArgumentAttributor<Overload> Attributor;
361 return detail::ParsedCommandAddNodeAccess::attributor<Attributor>(
362 CreateParsedCommandOverload<CmdTraits>::create(fn));
369 //-/////////////////////////////////////////////////////////////////////////////////////////////////
371 template <class Signature>
372 prefix_ senf::console::SimpleOverloadAttributor
373 senf::console::factory::
374 Command(boost::function<Signature> fn,
375 typename boost::enable_if_c<detail::ParsedCommandTraits<Signature>::is_simple>::type *)
377 return SimpleOverloadAttributor(fn);
380 template <class Function>
381 prefix_ senf::console::SimpleOverloadAttributor
382 senf::console::factory::
384 typename boost::enable_if_c<detail::ParsedCommandTraits<Function>::is_simple>::type *)
386 return SimpleOverloadAttributor(fn);
389 template <class Owner, class Member>
390 prefix_ senf::console::SimpleOverloadAttributor
391 senf::console::factory::
392 Command(Member memfn, Owner * owner,
393 typename boost::enable_if<boost::is_member_function_pointer<Member> >::type *,
394 typename boost::enable_if_c<detail::ParsedCommandTraits<Member>::is_simple>::type *)
396 return SimpleOverloadAttributor(senf::membind(memfn,owner));
399 template <class Owner, class Member>
400 prefix_ senf::console::SimpleOverloadAttributor
401 senf::console::factory::
402 Command(Member memfn, Owner const * owner,
403 typename boost::enable_if<boost::is_member_function_pointer<Member> >::type *,
404 typename boost::enable_if_c<detail::ParsedCommandTraits<Member>::is_simple>::type *)
406 return SimpleOverloadAttributor(senf::membind(memfn,owner));
409 template <class CastTo, class Signature>
410 prefix_ typename senf::console::detail::ParsedCommandTraits<CastTo>::Attributor
411 senf::console::factory::
412 Command(boost::function<Signature> fn)
414 return detail::addOverloadedCommandNode<CastTo>(fn);
417 template <class CastTo, class Function>
418 prefix_ typename senf::console::detail::ParsedCommandTraits<CastTo>::Attributor
419 senf::console::factory::
421 typename boost::enable_if_c<detail::ParsedCommandTraits<Function>::is_callable>::type *,
422 typename boost::disable_if<boost::is_member_function_pointer<Function> >::type *)
424 return detail::addOverloadedCommandNode<CastTo>(fn);
427 template <class Signature>
428 prefix_ typename senf::console::detail::ParsedCommandTraits<Signature>::Attributor
429 senf::console::factory::
430 Command(boost::function<Signature> fn)
432 return detail::addOverloadedCommandNode<Signature>(fn);
435 template <class Function>
436 prefix_ typename senf::console::detail::ParsedCommandTraits<Function>::Attributor
437 senf::console::factory::
439 typename boost::enable_if_c<detail::ParsedCommandTraits<Function>::is_callable>::type *,
440 typename boost::disable_if<boost::is_member_function_pointer<Function> >::type *)
442 return detail::addOverloadedCommandNode<Function>(fn);
445 template <class Owner, class Member>
446 prefix_ typename senf::console::detail::ParsedCommandTraits<Member>::Attributor
447 senf::console::factory::
448 Command(Member memfn, Owner * owner,
449 typename boost::enable_if<boost::is_member_function_pointer<Member> >::type *)
451 return detail::addOverloadedCommandNode<Member>(senf::membind(memfn,owner));
454 template <class Owner, class Member>
455 prefix_ typename senf::console::detail::ParsedCommandTraits<Member>::Attributor
456 senf::console::factory::
457 Command(Member memfn, Owner const * owner,
458 typename boost::enable_if<boost::is_member_function_pointer<Member> >::type *)
460 return detail::addOverloadedCommandNode<Member>(senf::membind(memfn,owner));
463 template <class CastTo, class Owner, class Member>
464 prefix_ typename senf::console::detail::ParsedCommandTraits<CastTo>::Attributor
465 senf::console::factory::
466 Command(Member memfn, Owner * owner,
467 typename boost::enable_if<boost::is_member_function_pointer<Member> >::type *)
469 return detail::addOverloadedCommandNode<CastTo>(senf::membind(memfn,owner));
472 template <class CastTo, class Owner, class Member>
473 prefix_ typename senf::console::detail::ParsedCommandTraits<CastTo>::Attributor
474 senf::console::factory::
475 Command(Member memfn, Owner const * owner,
476 typename boost::enable_if<boost::is_member_function_pointer<Member> >::type *)
478 return detail::addOverloadedCommandNode<CastTo>(senf::membind(memfn,owner));
481 //-/////////////////////////////////////////////////////////////////////////////////////////////////
488 // comment-column: 40
489 // c-file-style: "senf"
490 // indent-tabs-mode: nil
491 // ispell-local-dictionary: "american"
492 // compile-command: "scons -u test"