RemoteMethod.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_REMOTE_METHOD_HPP
00040 #define ORO_REMOTE_METHOD_HPP
00041
00042 #include <boost/function.hpp>
00043 #include <string>
00044 #include "MethodBase.hpp"
00045 #include "MethodC.hpp"
00046 #include "DataSourceStorage.hpp"
00047 #include "Invoker.hpp"
00048
00049 namespace RTT
00050 {
00051 namespace detail
00052 {
00059 template<class MethodT>
00060 class RemoteMethodImpl
00061 : public MethodBase<MethodT>,
00062 protected detail::DataSourceStorage<MethodT>
00063 {
00064 protected:
00065 MethodC mmeth;
00066 public:
00067 typedef typename boost::function_traits<MethodT>::result_type result_type;
00068
00072 RemoteMethodImpl()
00073 : mmeth()
00074 {}
00075
00081 result_type invoke() {
00082 mmeth.execute();
00083 return this->detail::DataSourceStorage<MethodT>::getResult();
00084 }
00085
00086 template<class T1>
00087 result_type invoke( T1 a1 ) {
00088 this->store( a1 );
00089 mmeth.execute();
00090 return this->detail::DataSourceStorage<MethodT>::getResult();
00091 }
00092
00093 template<class T1, class T2>
00094 result_type invoke( T1 a1, T2 a2 ) {
00095 this->store( a1, a2 );
00096 mmeth.execute();
00097 return this->detail::DataSourceStorage<MethodT>::getResult();
00098 }
00099
00100 template<class T1, class T2, class T3>
00101 result_type invoke( T1 a1, T2 a2, T3 a3 ) {
00102 this->store( a1, a2, a3 );
00103 mmeth.execute();
00104 return this->detail::DataSourceStorage<MethodT>::getResult();
00105 }
00106
00107 template<class T1, class T2, class T3, class T4>
00108 result_type invoke( T1 a1, T2 a2, T3 a3, T4 a4 ) {
00109 this->store( a1, a2, a3, a4 );
00110 mmeth.execute();
00111 return this->detail::DataSourceStorage<MethodT>::getResult();
00112 }
00113 };
00114
00115
00122 template<class MethodT>
00123 class RemoteMethod
00124 : public Invoker<MethodT,RemoteMethodImpl<MethodT> >
00125 {
00126 public:
00127 typedef MethodT Signature;
00128
00135 RemoteMethod(MethodFactory* of, std::string name)
00136 {
00137
00138 this->mmeth = MethodC(of, name);
00139
00140 this->initArgs( this->mmeth );
00141 this->initRet( this->mmeth );
00142 }
00143
00144 virtual void readArguments() {}
00145
00146 virtual bool ready() const {
00147 return this->mmeth.ready();
00148 }
00149
00150 virtual bool execute() {
00151 return this->mmeth.execute();
00152 }
00153
00161 virtual ActionInterface* clone() const {
00162 return new RemoteMethod(*this);
00163 }
00164
00165 virtual MethodBase<MethodT>* cloneI() const {
00166 return new RemoteMethod(*this);
00167 }
00168 };
00169 }
00170 }
00171 #endif