00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #ifndef ORO_INVOKER_HPP
00040 #define ORO_INVOKER_HPP
00041
00042 #include <boost/function.hpp>
00043 #include <boost/function_types/function_type.hpp>
00044 #include <boost/type_traits.hpp>
00045 #include "InvokerBase.hpp"
00046 #include "Return.hpp"
00047
00048 namespace RTT
00049 {
00050 namespace internal
00051 {
00052 template<int, class F, class BaseImpl>
00053 struct InvokerImpl;
00054
00060 template<class F, class BaseImpl>
00061 struct Invoker
00062 : public InvokerImpl<boost::function_traits<F>::arity, F, BaseImpl>
00063 {};
00064
00065 template<class F, class BaseImpl>
00066 struct InvokerImpl<0,F,BaseImpl>
00067 : public Return<F,BaseImpl>
00068 {
00069 typedef typename boost::function_traits<F>::result_type result_type;
00073 result_type call()
00074 {
00075 return BaseImpl::template call_impl<int>();
00076 }
00077
00078 SendHandle<F> send()
00079 {
00080 return BaseImpl::send_impl();
00081 }
00082
00083 };
00084
00085 template<class F, class BaseImpl>
00086 struct InvokerImpl<1,F,BaseImpl>
00087 : public Return<F,BaseImpl>
00088 {
00089 typedef typename boost::function_traits<F>::result_type result_type;
00090 typedef typename boost::function_traits<F>::arg1_type arg1_type;
00094 result_type call(arg1_type a1)
00095 {
00096 return BaseImpl::template call_impl<arg1_type>( a1 );
00097 }
00098 result_type ret(arg1_type a1)
00099 {
00100 return BaseImpl::template ret_impl<arg1_type>( a1 );
00101 }
00102 result_type ret()
00103 {
00104 return BaseImpl::ret_impl();
00105 }
00106 SendHandle<F> send(arg1_type a1)
00107 {
00108 return BaseImpl::template send_impl<arg1_type>( a1 );
00109 }
00110 };
00111
00112 template<class F, class BaseImpl>
00113 struct InvokerImpl<2,F,BaseImpl>
00114 : public Return<F,BaseImpl>
00115 {
00116 typedef typename boost::function_traits<F>::result_type result_type;
00117 typedef typename boost::function_traits<F>::arg1_type arg1_type;
00118 typedef typename boost::function_traits<F>::arg2_type arg2_type;
00119
00123 result_type call(arg1_type t1, arg2_type t2)
00124 {
00125 return BaseImpl::template call_impl<arg1_type, arg2_type>(t1, t2);
00126 }
00127
00128 result_type ret(arg1_type t1, arg2_type t2)
00129 {
00130 return BaseImpl::template ret_impl<arg1_type, arg2_type>(t1, t2);
00131 }
00132
00133 result_type ret()
00134 {
00135 return BaseImpl::ret_impl();
00136 }
00137
00138 SendHandle<F> send(arg1_type t1, arg2_type t2)
00139 {
00140 return BaseImpl::template send_impl<arg1_type, arg2_type>(t1, t2);
00141 }
00142 };
00143
00144 template<class F, class BaseImpl>
00145 struct InvokerImpl<3,F,BaseImpl>
00146 : public Return<F,BaseImpl>
00147 {
00148 typedef typename boost::function_traits<F>::result_type result_type;
00149 typedef typename boost::function_traits<F>::arg1_type arg1_type;
00150 typedef typename boost::function_traits<F>::arg2_type arg2_type;
00151 typedef typename boost::function_traits<F>::arg3_type arg3_type;
00152
00156 result_type call(arg1_type t1, arg2_type t2, arg3_type t3)
00157 {
00158 return BaseImpl::template call_impl<arg1_type, arg2_type, arg3_type>(t1, t2, t3);
00159 }
00160
00161 result_type ret(arg1_type t1, arg2_type t2, arg3_type t3)
00162 {
00163 return BaseImpl::template ret_impl<arg1_type, arg2_type, arg3_type>(t1, t2, t3);
00164 }
00165
00166 result_type ret()
00167 {
00168 return BaseImpl::ret_impl();
00169 }
00170
00171 SendHandle<F> send(arg1_type t1, arg2_type t2, arg3_type t3)
00172 {
00173 return BaseImpl::template send_impl<arg1_type, arg2_type, arg3_type>(t1, t2, t3);
00174 }
00175
00176 };
00177
00178 template<class F, class BaseImpl>
00179 struct InvokerImpl<4,F,BaseImpl>
00180 : public Return<F,BaseImpl>
00181 {
00182 typedef typename boost::function_traits<F>::result_type result_type;
00183 typedef typename boost::function_traits<F>::arg1_type arg1_type;
00184 typedef typename boost::function_traits<F>::arg2_type arg2_type;
00185 typedef typename boost::function_traits<F>::arg3_type arg3_type;
00186 typedef typename boost::function_traits<F>::arg4_type arg4_type;
00187
00191 result_type call(arg1_type t1, arg2_type t2, arg3_type t3, arg4_type t4)
00192 {
00193 return BaseImpl::template call_impl<arg1_type, arg2_type, arg3_type, arg4_type>(t1, t2, t3, t4);
00194 }
00195
00196 result_type ret(arg1_type t1, arg2_type t2, arg3_type t3, arg4_type t4)
00197 {
00198 return BaseImpl::template ret_impl<arg1_type, arg2_type, arg3_type, arg4_type>(t1, t2, t3, t4);
00199 }
00200
00201 result_type ret()
00202 {
00203 return BaseImpl::ret_impl();
00204 }
00205
00206 SendHandle<F> send(arg1_type t1, arg2_type t2, arg3_type t3, arg4_type t4)
00207 {
00208 return BaseImpl::template send_impl<arg1_type, arg2_type, arg3_type, arg4_type>(t1, t2, t3, t4);
00209 }
00210
00211 };
00212
00213 template<class F, class BaseImpl>
00214 struct InvokerImpl<5,F,BaseImpl>
00215 : public Return<F,BaseImpl>
00216 {
00217 typedef typename boost::function_traits<F>::result_type result_type;
00218 typedef typename boost::function_traits<F>::arg1_type arg1_type;
00219 typedef typename boost::function_traits<F>::arg2_type arg2_type;
00220 typedef typename boost::function_traits<F>::arg3_type arg3_type;
00221 typedef typename boost::function_traits<F>::arg4_type arg4_type;
00222 typedef typename boost::function_traits<F>::arg5_type arg5_type;
00223
00227 result_type call(arg1_type t1, arg2_type t2, arg3_type t3, arg4_type t4, arg5_type t5)
00228 {
00229 return BaseImpl::template call_impl<arg1_type, arg2_type, arg3_type, arg4_type, arg5_type>(t1, t2, t3, t4, t5);
00230 }
00231
00232 result_type ret(arg1_type t1, arg2_type t2, arg3_type t3, arg4_type t4, arg5_type t5)
00233 {
00234 return BaseImpl::template ret_impl<arg1_type, arg2_type, arg3_type, arg4_type, arg5_type>(t1, t2, t3, t4, t5);
00235 }
00236
00237 result_type ret()
00238 {
00239 return BaseImpl::ret_impl();
00240 }
00241
00242 SendHandle<F> send(arg1_type t1, arg2_type t2, arg3_type t3, arg4_type t4, arg5_type t5)
00243 {
00244 return BaseImpl::template send_impl<arg1_type, arg2_type, arg3_type, arg4_type, arg5_type>(t1, t2, t3, t4, t5);
00245 }
00246
00247 };
00248
00249 template<class F, class BaseImpl>
00250 struct InvokerImpl<6,F,BaseImpl>
00251 : public Return<F,BaseImpl>
00252 {
00253 typedef typename boost::function_traits<F>::result_type result_type;
00254 typedef typename boost::function_traits<F>::arg1_type arg1_type;
00255 typedef typename boost::function_traits<F>::arg2_type arg2_type;
00256 typedef typename boost::function_traits<F>::arg3_type arg3_type;
00257 typedef typename boost::function_traits<F>::arg4_type arg4_type;
00258 typedef typename boost::function_traits<F>::arg5_type arg5_type;
00259 typedef typename boost::function_traits<F>::arg6_type arg6_type;
00260
00264 result_type call(arg1_type t1, arg2_type t2, arg3_type t3, arg4_type t4, arg5_type t5, arg6_type t6)
00265 {
00266 return BaseImpl::template call_impl<arg1_type, arg2_type, arg3_type, arg4_type, arg5_type, arg6_type>(t1, t2, t3, t4, t5, t6);
00267 }
00268
00269 result_type ret(arg1_type t1, arg2_type t2, arg3_type t3, arg4_type t4, arg5_type t5, arg6_type t6)
00270 {
00271 return BaseImpl::template ret_impl<arg1_type, arg2_type, arg3_type, arg4_type, arg5_type, arg6_type>(t1, t2, t3, t4, t5, t6);
00272 }
00273
00274 result_type ret()
00275 {
00276 return BaseImpl::ret_impl();
00277 }
00278
00279 SendHandle<F> send(arg1_type t1, arg2_type t2, arg3_type t3, arg4_type t4, arg5_type t5, arg6_type t6)
00280 {
00281 return BaseImpl::template send_impl<arg1_type, arg2_type, arg3_type, arg4_type, arg5_type, arg6_type>(t1, t2, t3, t4, t5, t6);
00282 }
00283
00284 };
00285
00286 template<class F, class BaseImpl>
00287 struct InvokerImpl<7,F,BaseImpl>
00288 : public Return<F,BaseImpl>
00289 {
00290 typedef typename boost::function_traits<F>::result_type result_type;
00291 typedef typename boost::function_traits<F>::arg1_type arg1_type;
00292 typedef typename boost::function_traits<F>::arg2_type arg2_type;
00293 typedef typename boost::function_traits<F>::arg3_type arg3_type;
00294 typedef typename boost::function_traits<F>::arg4_type arg4_type;
00295 typedef typename boost::function_traits<F>::arg5_type arg5_type;
00296 typedef typename boost::function_traits<F>::arg6_type arg6_type;
00297 typedef typename boost::function_traits<F>::arg7_type arg7_type;
00298
00302 result_type call(arg1_type t1, arg2_type t2, arg3_type t3, arg4_type t4, arg5_type t5, arg6_type t6, arg7_type t7)
00303 {
00304 return BaseImpl::template call_impl<arg1_type, arg2_type, arg3_type, arg4_type, arg5_type, arg6_type, arg7_type>(t1, t2, t3, t4, t5, t6, t7);
00305 }
00306
00307 result_type ret(arg1_type t1, arg2_type t2, arg3_type t3, arg4_type t4, arg5_type t5, arg6_type t6, arg7_type t7)
00308 {
00309 return BaseImpl::template ret_impl<arg1_type, arg2_type, arg3_type, arg4_type, arg5_type, arg6_type, arg7_type>(t1, t2, t3, t4, t5, t6, t7);
00310 }
00311
00312 result_type ret()
00313 {
00314 return BaseImpl::ret_impl();
00315 }
00316
00317 SendHandle<F> send(arg1_type t1, arg2_type t2, arg3_type t3, arg4_type t4, arg5_type t5, arg6_type t6, arg7_type t7)
00318 {
00319 return BaseImpl::template send_impl<arg1_type, arg2_type, arg3_type, arg4_type, arg5_type, arg6_type, arg7_type>(t1, t2, t3, t4, t5, t6, t7);
00320 }
00321
00322 };
00323
00324 }
00325 }
00326 #endif