@@ -415,6 +415,198 @@ makeCommandVerbose(E &entity,
415415inline std::string docCommandVerbose (const std::string &doc) {
416416 return std::string (" \n " ) + doc + " \n\n No input.\n Return a string.\n\n " ;
417417}
418+ /* ************************/
419+ /* Template return types */
420+ /* ************************/
421+
422+ template <class E , class ReturnType >
423+ struct CommandReturnType0 : public Command {
424+ CommandReturnType0 (E &entity, boost::function<ReturnType(void )> function,
425+ const std::string &docString)
426+ : Command(entity, EMPTY_ARG, docString), fptr(function) {}
427+
428+ protected:
429+ virtual Value doExecute () {
430+ assert (getParameterValues ().size () == 0 );
431+ Value res;
432+ res = fptr ();
433+ return res;
434+ }
435+
436+ private:
437+ boost::function<ReturnType(void )> fptr;
438+ };
439+
440+ template <class E , class ReturnType >
441+ CommandReturnType0<E, ReturnType> *
442+ makeCommandReturnType0 (E &entity, boost::function<ReturnType(void )> function,
443+ const std::string &docString) {
444+ return new CommandReturnType0<E, ReturnType>(entity, function, docString);
445+ }
446+
447+ template <class E , class ReturnType >
448+ CommandReturnType0<E, ReturnType> *
449+ makeCommandReturnType0 (E &entity, boost::function<ReturnType(E *)> function,
450+ const std::string &docString) {
451+ return new CommandReturnType0<E, ReturnType>(
452+ entity, boost::bind (function, &entity), docString);
453+ }
454+
455+ template <class E , class ReturnType >
456+ CommandReturnType0<E, ReturnType> *
457+ makeCommandReturnType0 (E &entity, ReturnType (E::*function)(void ),
458+ const std::string &docString) {
459+ return new CommandReturnType0<E, ReturnType>(
460+ entity, boost::bind (function, &entity), docString);
461+ }
462+
463+ template <typename ReturnType>
464+ inline std::string docCommandReturnType0 (const std::string &doc,
465+ const std::string &return_type) {
466+ return std::string (" \n " ) + doc + " \n\n No input.\n " +
467+ typeid (ReturnType).name () + " return.\n\n " ;
468+ }
469+
470+ } // namespace command
471+ } // namespace dynamicgraph
472+
473+ /* --- FUNCTION 1 ARGS ------------------------------------------------------ */
474+ namespace dynamicgraph {
475+ namespace command {
476+
477+ template <class E , typename ReturnType, typename T>
478+ struct CommandReturnType1 : public Command {
479+ typedef boost::function<ReturnType(const T &)> function_t ;
480+ typedef boost::function<ReturnType(E *, const T &)> memberFunction_t;
481+ typedef void (E::*memberFunction_ptr_t)(const T &);
482+
483+ CommandReturnType1 (E &entity, function_t function,
484+ const std::string &docString)
485+ : Command(entity, boost::assign::list_of(ValueHelper<T>::TypeID),
486+ docString),
487+ fptr (function) {}
488+
489+ protected:
490+ virtual Value doExecute () {
491+ assert (getParameterValues ().size () == 1 );
492+ T val = getParameterValues ()[0 ].value ();
493+ Value res (fptr (val));
494+ return res; // void
495+ }
496+
497+ private:
498+ function_t fptr;
499+ };
500+
501+ template <class E , typename ReturnType, typename T>
502+ CommandReturnType1<E, ReturnType, T> *
503+ makeCommandReturnType1 (E &entity,
504+ boost::function<ReturnType(const T &)> function,
505+ const std::string &docString) {
506+ return new CommandReturnType1<E, ReturnType, T>(entity, function, docString);
507+ }
508+
509+ template <class E , typename ReturnType, typename T>
510+ CommandReturnType1<E, ReturnType, T> *makeCommandReturnType1 (
511+ E &entity,
512+ // The following syntaxt don't compile when not specializing the template
513+ // arg... why ???
514+ // typename CommandReturnType1<E,T>::memberFunction_t function ,
515+ boost::function<ReturnType(E *, const T &)> function,
516+ const std::string &docString) {
517+ return new CommandReturnType1<E, ReturnType, T>(
518+ entity, boost::bind (function, &entity, _1), docString);
519+ }
520+
521+ template <class E , typename ReturnType, typename T>
522+ CommandReturnType1<E, ReturnType, T> *
523+ makeCommandReturnType1 (E &entity, ReturnType (E::*function)(const T &),
524+ const std::string &docString) {
525+ return new CommandReturnType1<E, ReturnType, T>(
526+ entity, boost::bind (function, &entity, _1), docString);
527+ return NULL ;
528+ }
529+
530+ template <typename ReturnType>
531+ inline std::string docCommandReturnType1 (const std::string &doc,
532+ const std::string &type) {
533+ return std::string (" \n " ) + doc + " \n\n Input:\n - A " + type + " .\n " +
534+ typeid (ReturnType).name () + " return.\n\n " ;
535+ }
536+
537+ } // namespace command
538+ } // namespace dynamicgraph
539+
540+ /* ********** FUNCTION 2 Arguments ************************/
541+ namespace dynamicgraph {
542+ namespace command {
543+
544+ template <class E , typename ReturnType, typename T1, typename T2>
545+ struct CommandReturnType2 : public Command {
546+ typedef boost::function<ReturnType(const T1 &, const T2 &)> function_t ;
547+ typedef boost::function<ReturnType(E *, const T1 &, const T2 &)>
548+ memberFunction_t;
549+ typedef void (E::*memberFunction_ptr_t)(const T1 &, const T2 &);
550+
551+ CommandReturnType2 (E &entity, function_t function,
552+ const std::string &docString)
553+ : Command(entity,
554+ boost::assign::list_of (ValueHelper<T1>::TypeID)(
555+ ValueHelper<T2>::TypeID),
556+ docString),
557+ fptr(function) {}
558+
559+ protected:
560+ virtual Value doExecute () {
561+ assert (getParameterValues ().size () == 2 );
562+ T1 val1 = getParameterValues ()[0 ].value ();
563+ T2 val2 = getParameterValues ()[1 ].value ();
564+ fptr (val1, val2);
565+ return Value (); // void
566+ }
567+
568+ private:
569+ function_t fptr;
570+ };
571+
572+ template <class E , typename ReturnType, typename T1, typename T2>
573+ CommandReturnType2<E, ReturnType, T1, T2> *makeCommandReturnType2 (
574+ E &entity, boost::function<ReturnType(const T1 &, const T2 &)> function,
575+ const std::string &docString) {
576+ return new CommandReturnType2<E, ReturnType, T1, T2>(entity, function,
577+ docString);
578+ }
579+
580+ template <class E , typename ReturnType, typename T1, typename T2>
581+ CommandReturnType2<E, ReturnType, T1, T2> *makeCommandReturnType2 (
582+ E &entity,
583+ // The following syntaxt don't compile when not specializing the template
584+ // arg... why ???
585+ // typename CommandReturnType2<E,T1,T2>::memberFunction_t function ,
586+ boost::function<ReturnType(E *, const T1 &, const T2 &)> function,
587+ const std::string &docString) {
588+ return new CommandReturnType2<E, ReturnType, T1, T2>(
589+ entity, boost::bind (function, &entity, _1, _2), docString);
590+ }
591+
592+ template <class E , typename ReturnType, typename T1, typename T2>
593+ CommandReturnType2<E, ReturnType, T1, T2> *
594+ makeCommandReturnType2 (E &entity,
595+ ReturnType (E::*function)(const T1 &, const T2 &),
596+ const std::string &docString) {
597+ return new CommandReturnType2<E, ReturnType, T1, T2>(
598+ entity, boost::bind (function, &entity, _1, _2), docString);
599+ return NULL ;
600+ }
601+
602+ template <typename ReturnType>
603+ inline std::string docCommandReturnType2 (const std::string &doc,
604+ const std::string &type1,
605+ const std::string &type2) {
606+ return (std::string (" \n " ) + doc + " \n\n " + " Input:\n - A " + type1 + " .\n " +
607+ " Input:\n - A " + type2 + " .\n " +
608+ " ReturnType:\n - Returns:" + typeid (ReturnType).name () + +" .\n\n " );
609+ }
418610
419611} // namespace command
420612} // namespace dynamicgraph
0 commit comments