00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef KROSS_API_PROXY_H
00021 #define KROSS_API_PROXY_H
00022
00023 #include "../main/krossconfig.h"
00024 #include "object.h"
00025 #include "list.h"
00026
00027 #include <qstring.h>
00028
00029 namespace Kross { namespace Api {
00030
00031
00032
00033
00034
00035 template< class OBJECT, typename TYPE >
00036 class ProxyValue
00037 {
00038 public:
00039
00040
00041
00042
00043
00044 typedef TYPE type;
00045
00046
00047
00048
00049
00050
00051 typedef OBJECT object;
00052 };
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064 template< class INSTANCE,
00065 typename METHOD,
00066 class RET = ProxyValue<Kross::Api::Object,void>,
00067 class ARG1 = ProxyValue<Kross::Api::Object,void>,
00068 class ARG2 = ProxyValue<Kross::Api::Object,void>,
00069 class ARG3 = ProxyValue<Kross::Api::Object,void>,
00070 class ARG4 = ProxyValue<Kross::Api::Object,void> >
00071 class ProxyFunction : public Function
00072 {
00073 private:
00074
00075 INSTANCE* m_instance;
00076
00077 const METHOD m_method;
00078
00079
00080
00081
00082 template<class PROXYFUNC, typename RETURNRYPE>
00083 struct ProxyFunctionCaller {
00084 inline static Object::Ptr exec(PROXYFUNC* self, typename ARG1::type arg1, typename ARG2::type arg2, typename ARG3::type arg3, typename ARG4::type arg4) {
00085 return new class RET::object( ( (self->m_instance)->*(self->m_method) )(arg1,arg2,arg3,arg4) );
00086 }
00087 };
00088
00089
00090
00091
00092
00093
00094 template<class PROXYFUNC>
00095 struct ProxyFunctionCaller<PROXYFUNC, void> {
00096 inline static Object::Ptr exec(PROXYFUNC* self, typename ARG1::type arg1, typename ARG2::type arg2, typename ARG3::type arg3, typename ARG4::type arg4) {
00097 ( (self->m_instance)->*(self->m_method) )(arg1,arg2,arg3,arg4);
00098 return 0;
00099 }
00100 };
00101
00102 public:
00103
00104
00105
00106
00107
00108
00109
00110
00111 ProxyFunction(INSTANCE* instance, const METHOD& method)
00112 : m_instance(instance), m_method(method) {}
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123 Object::Ptr call(List::Ptr args) {
00124 return ProxyFunctionCaller<ProxyFunction, typename RET::type>::exec(this,
00125 Kross::Api::Object::fromObject<typename ARG1::object>(args->item(0))->operator typename ARG1::type(),
00126 Kross::Api::Object::fromObject<typename ARG2::object>(args->item(1))->operator typename ARG2::type(),
00127 Kross::Api::Object::fromObject<typename ARG3::object>(args->item(2))->operator typename ARG3::type(),
00128 Kross::Api::Object::fromObject<typename ARG4::object>(args->item(3))->operator typename ARG4::type()
00129 );
00130 }
00131 };
00132
00133
00134
00135
00136 template<class INSTANCE, typename METHOD, class RET, class ARG1, class ARG2, class ARG3>
00137 class ProxyFunction<INSTANCE, METHOD, RET, ARG1, ARG2, ARG3 > : public Function
00138 {
00139 private:
00140 INSTANCE* m_instance;
00141 const METHOD m_method;
00142
00143 template<class PROXYFUNC, typename RETURNRYPE>
00144 struct ProxyFunctionCaller {
00145 inline static Object::Ptr exec(PROXYFUNC* self, typename ARG1::type arg1, typename ARG2::type arg2, typename ARG3::type arg3) {
00146 return new class RET::object( ( (self->m_instance)->*(self->m_method) )(arg1,arg2,arg3) );
00147 }
00148 };
00149
00150 template<class PROXYFUNC>
00151 struct ProxyFunctionCaller<PROXYFUNC, void> {
00152 inline static Object::Ptr exec(PROXYFUNC* self, typename ARG1::type arg1, typename ARG2::type arg2, typename ARG3::type arg3) {
00153 ( (self->m_instance)->*(self->m_method) )(arg1,arg2,arg3);
00154 return 0;
00155 }
00156 };
00157
00158 public:
00159 ProxyFunction(INSTANCE* instance, const METHOD& method)
00160 : m_instance(instance), m_method(method) {}
00161 Object::Ptr call(List::Ptr args) {
00162 return ProxyFunctionCaller<ProxyFunction, typename RET::type>::exec(this,
00163 Kross::Api::Object::fromObject<typename ARG1::object>(args->item(0))->operator typename ARG1::type(),
00164 Kross::Api::Object::fromObject<typename ARG2::object>(args->item(1))->operator typename ARG2::type(),
00165 Kross::Api::Object::fromObject<typename ARG3::object>(args->item(2))->operator typename ARG3::type()
00166 );
00167 }
00168 };
00169
00170
00171
00172
00173 template<class INSTANCE, typename METHOD, class RET, class ARG1, class ARG2>
00174 class ProxyFunction<INSTANCE, METHOD, RET, ARG1, ARG2 > : public Function
00175 {
00176 private:
00177 INSTANCE* m_instance;
00178 const METHOD m_method;
00179
00180 template<class PROXYFUNC, typename RETURNRYPE>
00181 struct ProxyFunctionCaller {
00182 inline static Object::Ptr exec(PROXYFUNC* self, typename ARG1::type arg1, typename ARG2::type arg2) {
00183 return new class RET::object( ( (self->m_instance)->*(self->m_method) )(arg1,arg2) );
00184 }
00185 };
00186
00187 template<class PROXYFUNC>
00188 struct ProxyFunctionCaller<PROXYFUNC, void> {
00189 inline static Object::Ptr exec(PROXYFUNC* self, typename ARG1::type arg1, typename ARG2::type arg2) {
00190 ( (self->m_instance)->*(self->m_method) )(arg1,arg2);
00191 return 0;
00192 }
00193 };
00194
00195 public:
00196 ProxyFunction(INSTANCE* instance, const METHOD& method)
00197 : m_instance(instance), m_method(method) {}
00198 Object::Ptr call(List::Ptr args) {
00199 return ProxyFunctionCaller<ProxyFunction, typename RET::type>::exec(this,
00200 Kross::Api::Object::fromObject<typename ARG1::object>(args->item(0))->operator typename ARG1::type(),
00201 Kross::Api::Object::fromObject<typename ARG2::object>(args->item(1))->operator typename ARG2::type()
00202 );
00203 }
00204 };
00205
00206
00207
00208
00209 template<class INSTANCE, typename METHOD, class RET, class ARG1>
00210 class ProxyFunction<INSTANCE, METHOD, RET, ARG1 > : public Function
00211 {
00212 private:
00213 INSTANCE* m_instance;
00214 const METHOD m_method;
00215
00216 template<class PROXYFUNC, typename RETURNRYPE>
00217 struct ProxyFunctionCaller {
00218 inline static Object::Ptr exec(PROXYFUNC* self, typename ARG1::type arg1) {
00219 return new class RET::object( ( (self->m_instance)->*(self->m_method) )(arg1) );
00220 }
00221 };
00222
00223 template<class PROXYFUNC>
00224 struct ProxyFunctionCaller<PROXYFUNC, void> {
00225 inline static Object::Ptr exec(PROXYFUNC* self, typename ARG1::type arg1) {
00226 ( (self->m_instance)->*(self->m_method) )(arg1);
00227 return 0;
00228 }
00229 };
00230
00231 public:
00232 ProxyFunction(INSTANCE* instance, const METHOD& method)
00233 : m_instance(instance), m_method(method) {}
00234 Object::Ptr call(List::Ptr args) {
00235 return ProxyFunctionCaller<ProxyFunction, typename RET::type>::exec(this,
00236 Kross::Api::Object::fromObject<typename ARG1::object>(args->item(0))->operator typename ARG1::type()
00237 );
00238 }
00239 };
00240
00241
00242
00243
00244 template<class INSTANCE, typename METHOD, class RET>
00245 class ProxyFunction<INSTANCE, METHOD, RET > : public Function
00246 {
00247 private:
00248 INSTANCE* m_instance;
00249 const METHOD m_method;
00250
00251 template<class PROXYFUNC, typename RETURNRYPE>
00252 struct ProxyFunctionCaller {
00253 inline static Object::Ptr exec(PROXYFUNC* self) {
00254 return new class RET::object( ( (self->m_instance)->*(self->m_method) )() );
00255 }
00256 };
00257
00258 template<class PROXYFUNC>
00259 struct ProxyFunctionCaller<PROXYFUNC, void> {
00260 inline static Object::Ptr exec(PROXYFUNC* self) {
00261 ( (self->m_instance)->*(self->m_method) )();
00262 return 0;
00263 }
00264 };
00265
00266 public:
00267 ProxyFunction(INSTANCE* instance, const METHOD& method)
00268 : m_instance(instance), m_method(method) {}
00269 Object::Ptr call(List::Ptr) {
00270 return ProxyFunctionCaller<ProxyFunction, typename RET::type>::exec(this);
00271 }
00272 };
00273
00274 }}
00275
00276 #endif
00277