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_EXECUTION_DATASOURCE_GENERATOR_HPP
00040 #define ORO_EXECUTION_DATASOURCE_GENERATOR_HPP
00041
00042 #include "DataSources.hpp"
00043 #include <boost/utility/enable_if.hpp>
00044 #include <boost/ref.hpp>
00045
00046 namespace RTT
00047 {
00048 namespace internal
00049 {
00050 template<class T, class Enable = void >
00051 struct DSWrap {
00052 base::DataSourceBase::shared_ptr operator()(T t) { return new ConstantDataSource<T>( t );}
00053 };
00054
00055 template<class T>
00056 struct DSWrap<T, typename boost::enable_if< boost::is_base_of<base::DataSourceBase, typename boost::remove_pointer<T>::type > >::type > {
00057 base::DataSourceBase::shared_ptr operator()(T t) { return t; }
00058 };
00059
00060 template<class T>
00061 struct DSWrap<T, typename boost::enable_if< boost::is_reference<T> >::type > {
00062 base::DataSourceBase::shared_ptr operator()(T t) { return new ReferenceDataSource< typename boost::remove_reference<T>::type >( t ); }
00063 };
00064
00065 template<class T>
00066 struct DSWrap<T, typename boost::enable_if< boost::is_reference_wrapper<T> >::type > {
00067 typedef typename boost::unwrap_reference<T>::type RT;
00068 base::DataSourceBase::shared_ptr operator()(T t) { return new ReferenceDataSource< typename boost::remove_reference<RT>::type >( t ); }
00069 };
00070
00071 template<class T>
00072 struct DSWrap<boost::intrusive_ptr<T>, typename boost::enable_if< boost::is_base_of<base::DataSourceBase, typename boost::remove_pointer<T>::type > >::type >
00073 : public DSWrap<T> {
00074 };
00075
00076 using boost::ref;
00077
00093 struct GenerateDataSource
00094 {
00095 template<class A1>
00096 std::vector<base::DataSourceBase::shared_ptr> operator()(A1 a1)
00097 {
00098 std::vector<base::DataSourceBase::shared_ptr> res;
00099 res.push_back( DSWrap<A1>()(a1));
00100 return res;
00101 }
00102
00103 template<class A1, class A2>
00104 std::vector<base::DataSourceBase::shared_ptr> operator()(A1 a1, A2 a2 )
00105 {
00106 std::vector<base::DataSourceBase::shared_ptr> res = operator()(a1);
00107 res.push_back( DSWrap<A2>()(a2));
00108 return res;
00109 }
00110
00111 template<class A1, class A2, class A3>
00112 std::vector<base::DataSourceBase::shared_ptr> operator()(A1 a1, A2 a2, A3 a3 )
00113 {
00114 std::vector<base::DataSourceBase::shared_ptr> res = operator()(a1,a2);
00115 res.push_back( DSWrap<A3>()(a3));
00116 return res;
00117 }
00118
00119 template<class A1, class A2, class A3, class A4>
00120 std::vector<base::DataSourceBase::shared_ptr> operator()(A1 a1, A2 a2, A3 a3, A4 a4 )
00121 {
00122 std::vector<base::DataSourceBase::shared_ptr> res = operator()(a1,a2,a3);
00123 res.push_back( DSWrap<A4>()(a4));
00124 return res;
00125 }
00126
00127 template<class A1, class A2, class A3, class A4, class A5, class A6>
00128 std::vector<base::DataSourceBase::shared_ptr> operator()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6 )
00129 {
00130 std::vector<base::DataSourceBase::shared_ptr> res = operator()(a1,a2,a3,a4,a5);
00131 res.push_back( DSWrap<A6>()(a6));
00132 return res;
00133 }
00134
00135 template<class A1, class A2, class A3, class A4, class A5, class A6, class A7>
00136 std::vector<base::DataSourceBase::shared_ptr> operator()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7 )
00137 {
00138 std::vector<base::DataSourceBase::shared_ptr> res = operator()(a1,a2,a3,a4,a5,a6);
00139 res.push_back( DSWrap<A7>()(a7));
00140 return res;
00141 }
00142
00143 template<class A1, class A2, class A3, class A4, class A5>
00144 std::vector<base::DataSourceBase::shared_ptr> operator()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 )
00145 {
00146 std::vector<base::DataSourceBase::shared_ptr> res = operator()(a1,a2,a3,a4);
00147 res.push_back( DSWrap<A5>()(a5));
00148 return res;
00149 }
00150 };
00151 }}
00152
00153 #endif