DataSourceGenerator.hpp
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 detail
00049 {
00050 template<class T, class Enable = void >
00051 struct DSWrap {
00052 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_and_derived<DataSourceBase,T> >::type > {
00057 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 DataSourceBase::shared_ptr operator()(T t) { return new ReferenceDataSource<T>( 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 DataSourceBase::shared_ptr operator()(T t) { return new ReferenceDataSource<RT>( t ); }
00069 };
00070 }
00071
00072 using boost::ref;
00073
00089 struct GenerateDataSource
00090 {
00091 template<class A1>
00092 std::vector<DataSourceBase::shared_ptr> operator()(A1 a1)
00093 {
00094 std::vector<DataSourceBase::shared_ptr> res;
00095 res.push_back( detail::DSWrap<A1>()(a1));
00096 return res;
00097 }
00098
00099 template<class A1, class A2>
00100 std::vector<DataSourceBase::shared_ptr> operator()(A1 a1, A2 a2 )
00101 {
00102 std::vector<DataSourceBase::shared_ptr> res = operator()(a1);
00103 res.push_back( detail::DSWrap<A2>()(a2));
00104 return res;
00105 }
00106
00107 template<class A1, class A2, class A3>
00108 std::vector<DataSourceBase::shared_ptr> operator()(A1 a1, A2 a2, A3 a3 )
00109 {
00110 std::vector<DataSourceBase::shared_ptr> res = operator()(a1,a2);
00111 res.push_back( detail::DSWrap<A3>()(a3));
00112 return res;
00113 }
00114
00115 template<class A1, class A2, class A3, class A4>
00116 std::vector<DataSourceBase::shared_ptr> operator()(A1 a1, A2 a2, A3 a3, A4 a4 )
00117 {
00118 std::vector<DataSourceBase::shared_ptr> res = operator()(a1,a2,a3);
00119 res.push_back( detail::DSWrap<A4>()(a4));
00120 return res;
00121 }
00122 };
00123 }
00124
00125 #endif