Orocos Real-Time Toolkit  2.5.0
ReturnSignature.hpp
00001 /***************************************************************************
00002   tag: The SourceWorks  Tue Sep 7 00:55:18 CEST 2010  ReturnSignature.hpp
00003 
00004                         ReturnSignature.hpp -  description
00005                            -------------------
00006     begin                : Tue September 07 2010
00007     copyright            : (C) 2010 The SourceWorks
00008     email                : peter@thesourceworks.com
00009 
00010  ***************************************************************************
00011  *   This library is free software; you can redistribute it and/or         *
00012  *   modify it under the terms of the GNU General Public                   *
00013  *   License as published by the Free Software Foundation;                 *
00014  *   version 2 of the License.                                             *
00015  *                                                                         *
00016  *   As a special exception, you may use this file as part of a free       *
00017  *   software library without restriction.  Specifically, if other files   *
00018  *   instantiate templates or use macros or inline functions from this     *
00019  *   file, or you compile this file and link it with other files to        *
00020  *   produce an executable, this file does not by itself cause the         *
00021  *   resulting executable to be covered by the GNU General Public          *
00022  *   License.  This exception does not however invalidate any other        *
00023  *   reasons why the executable file might be covered by the GNU General   *
00024  *   Public License.                                                       *
00025  *                                                                         *
00026  *   This library is distributed in the hope that it will be useful,       *
00027  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00028  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU     *
00029  *   Lesser General Public License for more details.                       *
00030  *                                                                         *
00031  *   You should have received a copy of the GNU General Public             *
00032  *   License along with this library; if not, write to the Free Software   *
00033  *   Foundation, Inc., 59 Temple Place,                                    *
00034  *   Suite 330, Boston, MA  02111-1307  USA                                *
00035  *                                                                         *
00036  ***************************************************************************/
00037 
00038 
00039 #ifndef ORO_RETURN_SIGNATURE_HPP
00040 #define ORO_RETURN_SIGNATURE_HPP
00041 
00042 #include <boost/type_traits.hpp>
00043 #include "NA.hpp"
00044 #include "../rtt-fwd.hpp"
00045 
00046 namespace RTT
00047 {
00048     namespace internal
00049     {
00056         template<int, class Signature, class ToInvoke>
00057         struct ReturnSignature;
00058 
00059         template<class F, class ToInvoke>
00060         struct ReturnSignature<0,F,ToInvoke>
00061         {
00062             typedef typename boost::function_traits<F>::result_type result_type;
00063 
00064             ReturnSignature() : impl() {}
00065             ReturnSignature(ToInvoke implementation) : impl(implementation) {}
00066             ~ReturnSignature() {}
00067 
00068             result_type ret() {
00069                 if (impl)
00070                     return impl->ret();
00071                 return NA<result_type>::na();
00072             }
00073 
00074         protected:
00075             ToInvoke impl;
00076         };
00077 
00078         template<class F, class ToInvoke>
00079         struct ReturnSignature<1,F,ToInvoke>
00080         {
00081             typedef typename boost::function_traits<F>::result_type result_type;
00082             typedef typename boost::function_traits<F>::arg1_type arg1_type;
00083 
00084             ReturnSignature() : impl() {}
00085             ReturnSignature(ToInvoke implementation) : impl(implementation) {}
00086             ~ReturnSignature() {}
00087 
00088             result_type ret(arg1_type a1) {
00089                 if (impl)
00090                     return impl->ret( a1 );
00091                 return NA<result_type>::na();
00092             }
00093 
00094             result_type ret() {
00095                 if (impl)
00096                     return impl->ret();
00097                 return NA<result_type>::na();
00098             }
00099 
00100         protected:
00101             ToInvoke impl;
00102         };
00103 
00104         template<class F, class ToInvoke>
00105         struct ReturnSignature<2,F,ToInvoke>
00106         {
00107             typedef typename boost::function_traits<F>::result_type result_type;
00108             typedef typename boost::function_traits<F>::arg1_type arg1_type;
00109             typedef typename boost::function_traits<F>::arg2_type arg2_type;
00110 
00111             ReturnSignature() : impl() {}
00112             ReturnSignature(ToInvoke implementation) : impl(implementation) {}
00113             ~ReturnSignature() {}
00114 
00115             result_type ret(arg1_type a1, arg2_type a2) {
00116                 if (impl)
00117                     return impl->ret( a1,a2 );
00118                 return NA<result_type>::na();
00119             }
00120 
00121             result_type ret() {
00122                 if (impl)
00123                     return impl->ret();
00124                 return NA<result_type>::na();
00125             }
00126         protected:
00127             ToInvoke impl;
00128         };
00129 
00130         template<class F, class ToInvoke>
00131         struct ReturnSignature<3,F,ToInvoke>
00132         {
00133             typedef typename boost::function_traits<F>::result_type result_type;
00134             typedef typename boost::function_traits<F>::arg1_type arg1_type;
00135             typedef typename boost::function_traits<F>::arg2_type arg2_type;
00136             typedef typename boost::function_traits<F>::arg3_type arg3_type;
00137 
00138             ReturnSignature() : impl() {}
00139             ReturnSignature(ToInvoke implementation) : impl(implementation) {}
00140             ~ReturnSignature() { }
00141 
00142             result_type ret(arg1_type a1, arg2_type a2, arg3_type a3) {
00143                 if (impl)
00144                     return impl->ret( a1,a2,a3 );
00145                 return NA<result_type>::na();
00146             }
00147 
00148             result_type ret() {
00149                 if (impl)
00150                     return impl->ret();
00151                 return NA<result_type>::na();
00152             }
00153 
00154         protected:
00155             ToInvoke impl;
00156         };
00157 
00158         template<class F, class ToInvoke>
00159         struct ReturnSignature<4,F,ToInvoke>
00160         {
00161             typedef typename boost::function_traits<F>::result_type result_type;
00162             typedef typename boost::function_traits<F>::arg1_type arg1_type;
00163             typedef typename boost::function_traits<F>::arg2_type arg2_type;
00164             typedef typename boost::function_traits<F>::arg3_type arg3_type;
00165             typedef typename boost::function_traits<F>::arg4_type arg4_type;
00166 
00167             ReturnSignature() : impl() {}
00168             ReturnSignature(ToInvoke implementation) : impl(implementation) {}
00169             ~ReturnSignature() { }
00170 
00171             result_type ret(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4) {
00172                 if (impl)
00173                     return impl->ret( a1,a2,a3,a4 );
00174                 return NA<result_type>::na();
00175             }
00176 
00177             result_type ret() {
00178                 if (impl)
00179                     return impl->ret();
00180                 return NA<result_type>::na();
00181             }
00182         protected:
00183             ToInvoke impl;
00184         };
00185 
00186         template<class F, class ToInvoke>
00187         struct ReturnSignature<5,F,ToInvoke>
00188         {
00189             typedef typename boost::function_traits<F>::result_type result_type;
00190             typedef typename boost::function_traits<F>::arg1_type arg1_type;
00191             typedef typename boost::function_traits<F>::arg2_type arg2_type;
00192             typedef typename boost::function_traits<F>::arg3_type arg3_type;
00193             typedef typename boost::function_traits<F>::arg4_type arg4_type;
00194             typedef typename boost::function_traits<F>::arg5_type arg5_type;
00195 
00196             ReturnSignature() : impl() {}
00197             ReturnSignature(ToInvoke implementation) : impl(implementation) {}
00198             ~ReturnSignature() { }
00199 
00200             result_type ret(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4, arg5_type a5) {
00201                 if (impl)
00202                     return impl->ret( a1,a2,a3,a4,a5 );
00203                 return NA<result_type>::na();
00204             }
00205 
00206             result_type ret() {
00207                 if (impl)
00208                     return impl->ret();
00209                 return NA<result_type>::na();
00210             }
00211         protected:
00212             ToInvoke impl;
00213         };
00214 
00215         template<class F, class ToInvoke>
00216         struct ReturnSignature<6,F,ToInvoke>
00217         {
00218             typedef typename boost::function_traits<F>::result_type result_type;
00219             typedef typename boost::function_traits<F>::arg1_type arg1_type;
00220             typedef typename boost::function_traits<F>::arg2_type arg2_type;
00221             typedef typename boost::function_traits<F>::arg3_type arg3_type;
00222             typedef typename boost::function_traits<F>::arg4_type arg4_type;
00223             typedef typename boost::function_traits<F>::arg5_type arg5_type;
00224             typedef typename boost::function_traits<F>::arg6_type arg6_type;
00225 
00226             ReturnSignature() : impl() {}
00227             ReturnSignature(ToInvoke implementation) : impl(implementation) {}
00228             ~ReturnSignature() { }
00229 
00230             result_type ret(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4, arg5_type a5, arg6_type a6) {
00231                 if (impl)
00232                     return impl->ret( a1,a2,a3,a4,a5,a6 );
00233                 return NA<result_type>::na();
00234             }
00235 
00236             result_type ret() {
00237                 if (impl)
00238                     return impl->ret();
00239                 return NA<result_type>::na();
00240             }
00241         protected:
00242             ToInvoke impl;
00243         };
00244 
00245         template<class F, class ToInvoke>
00246         struct ReturnSignature<7,F,ToInvoke>
00247         {
00248             typedef typename boost::function_traits<F>::result_type result_type;
00249             typedef typename boost::function_traits<F>::arg1_type arg1_type;
00250             typedef typename boost::function_traits<F>::arg2_type arg2_type;
00251             typedef typename boost::function_traits<F>::arg3_type arg3_type;
00252             typedef typename boost::function_traits<F>::arg4_type arg4_type;
00253             typedef typename boost::function_traits<F>::arg5_type arg5_type;
00254             typedef typename boost::function_traits<F>::arg6_type arg6_type;
00255             typedef typename boost::function_traits<F>::arg7_type arg7_type;
00256 
00257             ReturnSignature() : impl() {}
00258             ReturnSignature(ToInvoke implementation) : impl(implementation) {}
00259             ~ReturnSignature() { }
00260 
00261             result_type ret(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4, arg5_type a5, arg6_type a6, arg7_type a7) {
00262                 if (impl)
00263                     return impl->ret( a1,a2,a3,a4,a5,a6,a7 );
00264                 return NA<result_type>::na();
00265             }
00266 
00267             result_type ret() {
00268                 if (impl)
00269                     return impl->ret();
00270                 return NA<result_type>::na();
00271             }
00272         protected:
00273             ToInvoke impl;
00274         };
00275 
00276     }
00277 }
00278 #endif