Orocos Real-Time Toolkit
2.5.0
|
00001 /*************************************************************************** 00002 tag: FMTC do nov 2 13:05:58 CET 2006 Invoker.hpp 00003 00004 Invoker.hpp - description 00005 ------------------- 00006 begin : do november 02 2006 00007 copyright : (C) 2006 FMTC 00008 email : peter.soetens@fmtc.be 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_INVOKER_SIGNATURE_HPP 00040 #define ORO_INVOKER_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 { 00057 template<int, class Signature, class ToInvoke> 00058 struct InvokerSignature; 00059 00060 template<class F, class ToInvoke> 00061 struct InvokerSignature<0,F,ToInvoke> 00062 { 00063 typedef typename boost::function_traits<F>::result_type result_type; 00064 00065 InvokerSignature() : impl() {} 00066 InvokerSignature(ToInvoke implementation) : impl(implementation) {} 00067 ~InvokerSignature() {} 00068 00072 result_type operator()() 00073 { 00074 if (impl) 00075 return impl->call(); 00076 return NA<result_type>::na(); 00077 } 00078 00079 result_type call() { 00080 return operator()(); 00081 } 00082 00083 SendHandle<F> send() 00084 { 00085 if (impl) 00086 return impl->send(); 00087 return SendHandle<F>(); 00088 } 00089 00090 protected: 00091 ToInvoke impl; 00092 }; 00093 00094 template<class F, class ToInvoke> 00095 struct InvokerSignature<1,F,ToInvoke> 00096 { 00097 typedef typename boost::function_traits<F>::result_type result_type; 00098 typedef typename boost::function_traits<F>::arg1_type arg1_type; 00099 00100 InvokerSignature() : impl() {} 00101 InvokerSignature(ToInvoke implementation) : impl(implementation) {} 00102 ~InvokerSignature() {} 00103 00107 result_type operator()(arg1_type a1) 00108 { 00109 if (impl) 00110 return impl->call( a1 ); 00111 return NA<result_type>::na(); 00112 } 00113 result_type call(arg1_type a1) { 00114 return operator()(a1); 00115 } 00116 00117 SendHandle<F> send(arg1_type a1) 00118 { 00119 if (impl) 00120 return impl->send(a1); 00121 return SendHandle<F>(); 00122 } 00123 00124 protected: 00125 ToInvoke impl; 00126 }; 00127 00128 template<class F, class ToInvoke> 00129 struct InvokerSignature<2,F,ToInvoke> 00130 { 00131 typedef typename boost::function_traits<F>::result_type result_type; 00132 typedef typename boost::function_traits<F>::arg1_type arg1_type; 00133 typedef typename boost::function_traits<F>::arg2_type arg2_type; 00134 00135 InvokerSignature() : impl() {} 00136 InvokerSignature(ToInvoke implementation) : impl(implementation) {} 00137 ~InvokerSignature() {} 00138 00142 result_type operator()(arg1_type t1, arg2_type t2) 00143 { 00144 if (impl) 00145 return impl->call(t1, t2); 00146 return NA<result_type>::na(); 00147 } 00148 00149 result_type call(arg1_type a1, arg2_type a2) { 00150 return operator()(a1,a2); 00151 } 00152 00153 SendHandle<F> send(arg1_type a1, arg2_type a2) 00154 { 00155 if (impl) 00156 return impl->send(a1,a2); 00157 return SendHandle<F>(); 00158 } 00159 protected: 00160 ToInvoke impl; 00161 }; 00162 00163 template<class F, class ToInvoke> 00164 struct InvokerSignature<3,F,ToInvoke> 00165 { 00166 typedef typename boost::function_traits<F>::result_type result_type; 00167 typedef typename boost::function_traits<F>::arg1_type arg1_type; 00168 typedef typename boost::function_traits<F>::arg2_type arg2_type; 00169 typedef typename boost::function_traits<F>::arg3_type arg3_type; 00170 00171 InvokerSignature() : impl() {} 00172 InvokerSignature(ToInvoke implementation) : impl(implementation) {} 00173 ~InvokerSignature() { } 00174 00178 result_type operator()(arg1_type t1, arg2_type t2, arg3_type t3) 00179 { 00180 if (impl) 00181 return impl->call(t1, t2, t3); 00182 return NA<result_type>::na(); 00183 } 00184 00185 result_type call(arg1_type a1, arg2_type a2, arg3_type a3) { 00186 return operator()(a1,a2,a3); 00187 } 00188 00189 SendHandle<F> send(arg1_type a1, arg2_type a2, arg3_type a3) 00190 { 00191 if (impl) 00192 return impl->send(a1,a2,a3); 00193 return SendHandle<F>(); 00194 } 00195 protected: 00196 ToInvoke impl; 00197 }; 00198 00199 template<class F, class ToInvoke> 00200 struct InvokerSignature<4,F,ToInvoke> 00201 { 00202 typedef typename boost::function_traits<F>::result_type result_type; 00203 typedef typename boost::function_traits<F>::arg1_type arg1_type; 00204 typedef typename boost::function_traits<F>::arg2_type arg2_type; 00205 typedef typename boost::function_traits<F>::arg3_type arg3_type; 00206 typedef typename boost::function_traits<F>::arg4_type arg4_type; 00207 00208 InvokerSignature() : impl() {} 00209 InvokerSignature(ToInvoke implementation) : impl(implementation) {} 00210 ~InvokerSignature() { } 00211 00215 result_type operator()(arg1_type t1, arg2_type t2, arg3_type t3, arg4_type t4) 00216 { 00217 if (impl) 00218 return impl->call(t1, t2, t3, t4); 00219 return NA<result_type>::na(); 00220 } 00221 00222 result_type call(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4) { 00223 return operator()(a1,a2,a3,a4); 00224 } 00225 00226 SendHandle<F> send(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4) 00227 { 00228 if (impl) 00229 return impl->send(a1,a2,a3,a4); 00230 return SendHandle<F>(); 00231 } 00232 00233 protected: 00234 ToInvoke impl; 00235 }; 00236 00237 template<class F, class ToInvoke> 00238 struct InvokerSignature<5,F,ToInvoke> 00239 { 00240 typedef typename boost::function_traits<F>::result_type result_type; 00241 typedef typename boost::function_traits<F>::arg1_type arg1_type; 00242 typedef typename boost::function_traits<F>::arg2_type arg2_type; 00243 typedef typename boost::function_traits<F>::arg3_type arg3_type; 00244 typedef typename boost::function_traits<F>::arg4_type arg4_type; 00245 typedef typename boost::function_traits<F>::arg5_type arg5_type; 00246 00247 InvokerSignature() : impl() {} 00248 InvokerSignature(ToInvoke implementation) : impl(implementation) {} 00249 ~InvokerSignature() { } 00250 00254 result_type operator()(arg1_type t1, arg2_type t2, arg3_type t3, arg4_type t4, arg5_type t5) 00255 { 00256 if (impl) 00257 return impl->call(t1, t2, t3, t4, t5); 00258 return NA<result_type>::na(); 00259 } 00260 00261 result_type call(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4, arg5_type a5) { 00262 return operator()(a1,a2,a3,a4,a5); 00263 } 00264 00265 SendHandle<F> send(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4, arg5_type a5) 00266 { 00267 if (impl) 00268 return impl->send(a1,a2,a3,a4,a5); 00269 return SendHandle<F>(); 00270 } 00271 00272 protected: 00273 ToInvoke impl; 00274 }; 00275 00276 template<class F, class ToInvoke> 00277 struct InvokerSignature<6,F,ToInvoke> 00278 { 00279 typedef typename boost::function_traits<F>::result_type result_type; 00280 typedef typename boost::function_traits<F>::arg1_type arg1_type; 00281 typedef typename boost::function_traits<F>::arg2_type arg2_type; 00282 typedef typename boost::function_traits<F>::arg3_type arg3_type; 00283 typedef typename boost::function_traits<F>::arg4_type arg4_type; 00284 typedef typename boost::function_traits<F>::arg5_type arg5_type; 00285 typedef typename boost::function_traits<F>::arg6_type arg6_type; 00286 00287 InvokerSignature() : impl() {} 00288 InvokerSignature(ToInvoke implementation) : impl(implementation) {} 00289 ~InvokerSignature() { } 00290 00294 result_type operator()(arg1_type t1, arg2_type t2, arg3_type t3, arg4_type t4, arg5_type t5, arg6_type t6) 00295 { 00296 if (impl) 00297 return impl->call(t1, t2, t3, t4, t5, t6); 00298 return NA<result_type>::na(); 00299 } 00300 00301 result_type call(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4, arg5_type a5, arg6_type a6) { 00302 return operator()(a1,a2,a3,a4,a5,a6); 00303 } 00304 00305 SendHandle<F> send(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4, arg5_type a5, arg6_type a6) 00306 { 00307 if (impl) 00308 return impl->send(a1,a2,a3,a4,a5,a6); 00309 return SendHandle<F>(); 00310 } 00311 00312 protected: 00313 ToInvoke impl; 00314 }; 00315 00316 template<class F, class ToInvoke> 00317 struct InvokerSignature<7,F,ToInvoke> 00318 { 00319 typedef typename boost::function_traits<F>::result_type result_type; 00320 typedef typename boost::function_traits<F>::arg1_type arg1_type; 00321 typedef typename boost::function_traits<F>::arg2_type arg2_type; 00322 typedef typename boost::function_traits<F>::arg3_type arg3_type; 00323 typedef typename boost::function_traits<F>::arg4_type arg4_type; 00324 typedef typename boost::function_traits<F>::arg5_type arg5_type; 00325 typedef typename boost::function_traits<F>::arg6_type arg6_type; 00326 typedef typename boost::function_traits<F>::arg7_type arg7_type; 00327 00328 InvokerSignature() : impl() {} 00329 InvokerSignature(ToInvoke implementation) : impl(implementation) {} 00330 ~InvokerSignature() { } 00331 00335 result_type operator()(arg1_type t1, arg2_type t2, arg3_type t3, arg4_type t4, arg5_type t5, arg6_type t6, arg7_type t7) 00336 { 00337 if (impl) 00338 return impl->call(t1, t2, t3, t4, t5, t6, t7); 00339 return NA<result_type>::na(); 00340 } 00341 00342 result_type call(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4, arg5_type a5, arg6_type a6, arg7_type a7) { 00343 return operator()(a1,a2,a3,a4,a5,a6,a7); 00344 } 00345 00346 SendHandle<F> send(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4, arg5_type a5, arg6_type a6, arg7_type a7) 00347 { 00348 if (impl) 00349 return impl->send(a1,a2,a3,a4,a5,a6,a7); 00350 return SendHandle<F>(); 00351 } 00352 00353 protected: 00354 ToInvoke impl; 00355 }; 00356 00357 } 00358 } 00359 #endif