Go to the documentation of this file.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_TASK_DATASOURCE_STORAGE_HPP
00040 #define ORO_TASK_DATASOURCE_STORAGE_HPP
00041
00042 #include <boost/function.hpp>
00043 #include <boost/bind.hpp>
00044 #include <boost/mem_fn.hpp>
00045 #include <boost/function_types/function_type.hpp>
00046 #include <boost/function_types/function_arity.hpp>
00047 #include "DataSources.hpp"
00048 #include "BindStorage.hpp"
00049
00050 namespace RTT
00051 {
00052 namespace internal
00053 {
00060 template<class T>
00061 struct DSRStore {
00062 T arg;
00063 DSRStore() : arg() {}
00064
00065 T& result() { return arg; }
00066 operator T&() { return arg; }
00067 };
00068
00069 template<class T>
00070 struct DSRStore<T&>
00071 {
00072 typedef typename boost::remove_const<T>::type result_type;
00073 result_type arg;
00074 DSRStore() : arg() {}
00075 result_type& result() { return arg; }
00076 operator result_type&() { return arg; }
00077 };
00078
00079 template<>
00080 struct DSRStore<void> {
00081 DSRStore() {}
00082 void result() { return; }
00083 };
00084
00085 template<>
00086 struct is_arg_return<DSRStore<void> > : public mpl::false_
00087 {};
00088
00089 template<class T>
00090 struct is_arg_return<DSRStore<T> > : public mpl::true_
00091 {};
00092
00093
00096 template<class R>
00097 struct DataSourceResultStorage
00098 {
00099 typedef typename remove_cr<R>::type ds_type;
00100 DSRStore<R> retn;
00101 typename ReferenceDataSource<ds_type>::shared_ptr result;
00102
00103 DataSourceResultStorage()
00104 : result( new ReferenceDataSource<ds_type>(retn.result()) )
00105 {
00106 }
00107
00108 template<class ContainerT>
00109 void initRet(ContainerT& cc) {
00110 cc.ret(base::DataSourceBase::shared_ptr(result));
00111 }
00112
00113 R getResult() {
00114 return retn.result();
00115 }
00116 };
00117
00118 template<>
00119 struct DataSourceResultStorage<void>
00120 {
00121 typedef void result_type;
00122 DSRStore<void> retn;
00123 DataSourceResultStorage()
00124 {
00125 }
00126
00127 template<class ContainerT>
00128 void initRet(ContainerT& ) {}
00129
00130 void getResult() {}
00131 };
00132
00135 template<class R>
00136 struct DataSourceResultStorage<R const&>
00137 {
00138 typedef R const& result_type;
00139 typedef R ds_type;
00140 DSRStore<result_type> retn;
00141 typename ReferenceDataSource<ds_type>::shared_ptr result;
00142
00143 DataSourceResultStorage()
00144 : result( new ReferenceDataSource<ds_type>( retn.result() ) )
00145 {
00146 }
00147
00148 template<class ContainerT>
00149 void initRet(ContainerT& cc) {
00150 cc.ret(base::DataSourceBase::shared_ptr(result));
00151 }
00152
00153 result_type getResult() {
00154 return result->rvalue();
00155 }
00156 };
00157
00164 template<class A>
00165 struct DataSourceArgStorage
00166 {
00167 typedef typename remove_cr<A>::type ds_type;
00168 typedef AStore<A&> Store;
00169 typename ValueDataSource<ds_type>::shared_ptr value;
00170 AStore<A&> arg;
00171 DataSourceArgStorage()
00172 : value( new ValueDataSource<ds_type>() )
00173 {}
00174
00175
00176
00177
00178
00179
00180
00181 void newarg(A a) { arg( value->set() ); value->set(a); }
00182 };
00183
00185 template<class A>
00186 struct DataSourceArgStorage<A &>
00187 {
00188 typedef AStore<A&> Store;
00189 AStore<A&> arg;
00190 typedef typename remove_cr<A>::type ds_type;
00191 typename LateReferenceDataSource<ds_type>::shared_ptr value;
00192 DataSourceArgStorage()
00193 : value( new LateReferenceDataSource<ds_type>() )
00194 {}
00195 void newarg(A& a) { arg(a); value->setPointer(&arg.get()); }
00196 };
00197
00199 template<class A>
00200 struct DataSourceArgStorage<A const&>
00201 {
00202 typedef AStore<A const&> Store;
00203 AStore<A const&> arg;
00204
00205 typename LateConstReferenceDataSource<A>::shared_ptr value;
00206 DataSourceArgStorage()
00207 : value( new LateConstReferenceDataSource<A>() )
00208 {}
00209 void newarg(A const& a) { arg(a); value->setPointer(&arg.get());}
00210 };
00211
00212 template<int, class T>
00213 struct DataSourceStorageImpl;
00214
00218 template<class DataType>
00219 struct DataSourceStorageImpl<0, DataType>
00220 : public DataSourceResultStorage<typename boost::function_traits<DataType>::result_type>
00221 {
00222 typedef typename boost::function_traits<DataType>::result_type result_type;
00223 DataSourceStorageImpl() {}
00224 DataSourceStorageImpl(const DataSourceStorageImpl& orig) {}
00225 template<class ContainerT>
00226 void initArgs(ContainerT& ) {}
00227 };
00228
00232 template<class DataType>
00233 struct DataSourceStorageImpl<1, DataType>
00234 : public DataSourceResultStorage<typename boost::function_traits<DataType>::result_type>
00235 {
00236 typedef typename boost::function_traits<DataType>::result_type result_type;
00237 typedef typename boost::function_traits<DataType>::arg1_type arg1_type;
00238 DataSourceArgStorage<arg1_type> ma1;
00239 typedef typename DataSourceArgStorage<arg1_type>::Store AStore1;
00240
00241 DataSourceStorageImpl() {}
00242 DataSourceStorageImpl(const DataSourceStorageImpl& orig) {}
00243
00244 template<class ContainerT>
00245 void initArgs(ContainerT& cc) {
00246 cc.arg( base::DataSourceBase::shared_ptr(ma1.value.get()) );
00247 }
00248
00249 void store(arg1_type a1) {
00250 ma1.newarg(a1);
00251 }
00252 };
00253
00254 template<class DataType>
00255 struct DataSourceStorageImpl<2, DataType>
00256 : public DataSourceResultStorage<typename boost::function_traits<DataType>::result_type>
00257 {
00258 typedef typename boost::function_traits<DataType>::result_type result_type;
00259 typedef typename boost::function_traits<DataType>::arg1_type arg1_type;
00260 typedef typename boost::function_traits<DataType>::arg2_type arg2_type;
00261 DataSourceArgStorage<arg1_type> ma1;
00262 DataSourceArgStorage<arg2_type> ma2;
00263 typedef typename DataSourceArgStorage<arg1_type>::Store AStore1;
00264 typedef typename DataSourceArgStorage<arg2_type>::Store AStore2;
00265
00266 DataSourceStorageImpl() {}
00267 DataSourceStorageImpl(const DataSourceStorageImpl& orig) {}
00268
00269 template<class ContainerT>
00270 void initArgs(ContainerT& cc) {
00271 cc.arg( base::DataSourceBase::shared_ptr(ma1.value) );
00272 cc.arg( base::DataSourceBase::shared_ptr(ma2.value) );
00273 }
00274 void store(arg1_type a1, arg2_type a2) {
00275 ma1.newarg(a1);
00276 ma2.newarg(a2);
00277 }
00278 };
00279
00280 template<class DataType>
00281 struct DataSourceStorageImpl<3, DataType>
00282 : public DataSourceResultStorage<typename boost::function_traits<DataType>::result_type>
00283 {
00284 typedef typename boost::function_traits<DataType>::result_type result_type;
00285 typedef typename boost::function_traits<DataType>::arg1_type arg1_type;
00286 typedef typename boost::function_traits<DataType>::arg2_type arg2_type;
00287 typedef typename boost::function_traits<DataType>::arg3_type arg3_type;
00288 DataSourceArgStorage<arg1_type> ma1;
00289 DataSourceArgStorage<arg2_type> ma2;
00290 DataSourceArgStorage<arg3_type> ma3;
00291 typedef typename DataSourceArgStorage<arg1_type>::Store AStore1;
00292 typedef typename DataSourceArgStorage<arg2_type>::Store AStore2;
00293 typedef typename DataSourceArgStorage<arg3_type>::Store AStore3;
00294
00295 DataSourceStorageImpl() {}
00296 DataSourceStorageImpl(const DataSourceStorageImpl& orig) {}
00297
00298 template<class ContainerT>
00299 void initArgs(ContainerT& cc) {
00300 cc.arg( base::DataSourceBase::shared_ptr(ma1.value) );
00301 cc.arg( base::DataSourceBase::shared_ptr(ma2.value) );
00302 cc.arg( base::DataSourceBase::shared_ptr(ma3.value) );
00303 }
00304 void store(arg1_type a1, arg2_type a2, arg3_type a3) {
00305 ma1.newarg(a1);
00306 ma2.newarg(a2);
00307 ma3.newarg(a3);
00308 }
00309 };
00310
00311 template<class DataType>
00312 struct DataSourceStorageImpl<4, DataType>
00313 : public DataSourceResultStorage<typename boost::function_traits<DataType>::result_type>
00314 {
00315 typedef typename boost::function_traits<DataType>::result_type result_type;
00316 typedef typename boost::function_traits<DataType>::arg1_type arg1_type;
00317 typedef typename boost::function_traits<DataType>::arg2_type arg2_type;
00318 typedef typename boost::function_traits<DataType>::arg3_type arg3_type;
00319 typedef typename boost::function_traits<DataType>::arg4_type arg4_type;
00320 DataSourceArgStorage<arg1_type> ma1;
00321 DataSourceArgStorage<arg2_type> ma2;
00322 DataSourceArgStorage<arg3_type> ma3;
00323 DataSourceArgStorage<arg4_type> ma4;
00324 typedef typename DataSourceArgStorage<arg1_type>::Store AStore1;
00325 typedef typename DataSourceArgStorage<arg2_type>::Store AStore2;
00326 typedef typename DataSourceArgStorage<arg3_type>::Store AStore3;
00327 typedef typename DataSourceArgStorage<arg4_type>::Store AStore4;
00328
00329 DataSourceStorageImpl() {}
00330 DataSourceStorageImpl(const DataSourceStorageImpl& orig) {}
00331
00332 template<class ContainerT>
00333 void initArgs(ContainerT& cc) {
00334 cc.arg( base::DataSourceBase::shared_ptr(ma1.value) );
00335 cc.arg( base::DataSourceBase::shared_ptr(ma2.value) );
00336 cc.arg( base::DataSourceBase::shared_ptr(ma3.value) );
00337 cc.arg( base::DataSourceBase::shared_ptr(ma4.value) );
00338 }
00339 void store(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4) {
00340 ma1.newarg(a1);
00341 ma2.newarg(a2);
00342 ma3.newarg(a3);
00343 ma4.newarg(a4);
00344 }
00345 };
00346
00347 template<class DataType>
00348 struct DataSourceStorageImpl<5, DataType>
00349 : public DataSourceResultStorage<typename boost::function_traits<DataType>::result_type>
00350 {
00351 typedef typename boost::function_traits<DataType>::result_type result_type;
00352 typedef typename boost::function_traits<DataType>::arg1_type arg1_type;
00353 typedef typename boost::function_traits<DataType>::arg2_type arg2_type;
00354 typedef typename boost::function_traits<DataType>::arg3_type arg3_type;
00355 typedef typename boost::function_traits<DataType>::arg4_type arg4_type;
00356 typedef typename boost::function_traits<DataType>::arg5_type arg5_type;
00357 DataSourceArgStorage<arg1_type> ma1;
00358 DataSourceArgStorage<arg2_type> ma2;
00359 DataSourceArgStorage<arg3_type> ma3;
00360 DataSourceArgStorage<arg4_type> ma4;
00361 DataSourceArgStorage<arg5_type> ma5;
00362 typedef typename DataSourceArgStorage<arg1_type>::Store AStore1;
00363 typedef typename DataSourceArgStorage<arg2_type>::Store AStore2;
00364 typedef typename DataSourceArgStorage<arg3_type>::Store AStore3;
00365 typedef typename DataSourceArgStorage<arg4_type>::Store AStore4;
00366 typedef typename DataSourceArgStorage<arg5_type>::Store AStore5;
00367
00368 DataSourceStorageImpl() {}
00369 DataSourceStorageImpl(const DataSourceStorageImpl& orig) {}
00370
00371 template<class ContainerT>
00372 void initArgs(ContainerT& cc) {
00373 cc.arg( base::DataSourceBase::shared_ptr(ma1.value) );
00374 cc.arg( base::DataSourceBase::shared_ptr(ma2.value) );
00375 cc.arg( base::DataSourceBase::shared_ptr(ma3.value) );
00376 cc.arg( base::DataSourceBase::shared_ptr(ma4.value) );
00377 cc.arg( base::DataSourceBase::shared_ptr(ma5.value) );
00378 }
00379 void store(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4, arg5_type a5) {
00380 ma1.newarg(a1);
00381 ma2.newarg(a2);
00382 ma3.newarg(a3);
00383 ma4.newarg(a4);
00384 ma5.newarg(a5);
00385 }
00386 };
00387
00388 template<class DataType>
00389 struct DataSourceStorageImpl<6, DataType>
00390 : public DataSourceResultStorage<typename boost::function_traits<DataType>::result_type>
00391 {
00392 typedef typename boost::function_traits<DataType>::result_type result_type;
00393 typedef typename boost::function_traits<DataType>::arg1_type arg1_type;
00394 typedef typename boost::function_traits<DataType>::arg2_type arg2_type;
00395 typedef typename boost::function_traits<DataType>::arg3_type arg3_type;
00396 typedef typename boost::function_traits<DataType>::arg4_type arg4_type;
00397 typedef typename boost::function_traits<DataType>::arg5_type arg5_type;
00398 typedef typename boost::function_traits<DataType>::arg6_type arg6_type;
00399 DataSourceArgStorage<arg1_type> ma1;
00400 DataSourceArgStorage<arg2_type> ma2;
00401 DataSourceArgStorage<arg3_type> ma3;
00402 DataSourceArgStorage<arg4_type> ma4;
00403 DataSourceArgStorage<arg5_type> ma5;
00404 DataSourceArgStorage<arg6_type> ma6;
00405 typedef typename DataSourceArgStorage<arg1_type>::Store AStore1;
00406 typedef typename DataSourceArgStorage<arg2_type>::Store AStore2;
00407 typedef typename DataSourceArgStorage<arg3_type>::Store AStore3;
00408 typedef typename DataSourceArgStorage<arg4_type>::Store AStore4;
00409 typedef typename DataSourceArgStorage<arg5_type>::Store AStore5;
00410 typedef typename DataSourceArgStorage<arg6_type>::Store AStore6;
00411
00412 DataSourceStorageImpl() {}
00413 DataSourceStorageImpl(const DataSourceStorageImpl& orig) {}
00414
00415 template<class ContainerT>
00416 void initArgs(ContainerT& cc) {
00417 cc.arg( base::DataSourceBase::shared_ptr(ma1.value) );
00418 cc.arg( base::DataSourceBase::shared_ptr(ma2.value) );
00419 cc.arg( base::DataSourceBase::shared_ptr(ma3.value) );
00420 cc.arg( base::DataSourceBase::shared_ptr(ma4.value) );
00421 cc.arg( base::DataSourceBase::shared_ptr(ma5.value) );
00422 cc.arg( base::DataSourceBase::shared_ptr(ma6.value) );
00423 }
00424 void store(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4, arg5_type a5, arg6_type a6) {
00425 ma1.newarg(a1);
00426 ma2.newarg(a2);
00427 ma3.newarg(a3);
00428 ma4.newarg(a4);
00429 ma5.newarg(a5);
00430 ma6.newarg(a6);
00431 }
00432 };
00433
00434 template<class DataType>
00435 struct DataSourceStorageImpl<7, DataType>
00436 : public DataSourceResultStorage<typename boost::function_traits<DataType>::result_type>
00437 {
00438 typedef typename boost::function_traits<DataType>::result_type result_type;
00439 typedef typename boost::function_traits<DataType>::arg1_type arg1_type;
00440 typedef typename boost::function_traits<DataType>::arg2_type arg2_type;
00441 typedef typename boost::function_traits<DataType>::arg3_type arg3_type;
00442 typedef typename boost::function_traits<DataType>::arg4_type arg4_type;
00443 typedef typename boost::function_traits<DataType>::arg5_type arg5_type;
00444 typedef typename boost::function_traits<DataType>::arg6_type arg6_type;
00445 typedef typename boost::function_traits<DataType>::arg7_type arg7_type;
00446 DataSourceArgStorage<arg1_type> ma1;
00447 DataSourceArgStorage<arg2_type> ma2;
00448 DataSourceArgStorage<arg3_type> ma3;
00449 DataSourceArgStorage<arg4_type> ma4;
00450 DataSourceArgStorage<arg5_type> ma5;
00451 DataSourceArgStorage<arg6_type> ma6;
00452 DataSourceArgStorage<arg7_type> ma7;
00453 typedef typename DataSourceArgStorage<arg1_type>::Store AStore1;
00454 typedef typename DataSourceArgStorage<arg2_type>::Store AStore2;
00455 typedef typename DataSourceArgStorage<arg3_type>::Store AStore3;
00456 typedef typename DataSourceArgStorage<arg4_type>::Store AStore4;
00457 typedef typename DataSourceArgStorage<arg5_type>::Store AStore5;
00458 typedef typename DataSourceArgStorage<arg6_type>::Store AStore6;
00459 typedef typename DataSourceArgStorage<arg7_type>::Store AStore7;
00460
00461 DataSourceStorageImpl() {}
00462 DataSourceStorageImpl(const DataSourceStorageImpl& orig) {}
00463
00464 template<class ContainerT>
00465 void initArgs(ContainerT& cc) {
00466 cc.arg( base::DataSourceBase::shared_ptr(ma1.value) );
00467 cc.arg( base::DataSourceBase::shared_ptr(ma2.value) );
00468 cc.arg( base::DataSourceBase::shared_ptr(ma3.value) );
00469 cc.arg( base::DataSourceBase::shared_ptr(ma4.value) );
00470 cc.arg( base::DataSourceBase::shared_ptr(ma5.value) );
00471 cc.arg( base::DataSourceBase::shared_ptr(ma6.value) );
00472 cc.arg( base::DataSourceBase::shared_ptr(ma7.value) );
00473 }
00474 void store(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4, arg5_type a5, arg6_type a6, arg7_type a7) {
00475 ma1.newarg(a1);
00476 ma2.newarg(a2);
00477 ma3.newarg(a3);
00478 ma4.newarg(a4);
00479 ma5.newarg(a5);
00480 ma6.newarg(a6);
00481 ma7.newarg(a7);
00482 }
00483 };
00484
00491 template<class DataType>
00492 struct DataSourceStorage
00493 : public DataSourceStorageImpl<boost::function_traits<DataType>::arity, DataType>
00494 {
00495 };
00496 }
00497 }
00498 #endif