Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/tutorial6/src/external/cpptcl/details/methods.h @ 11815

Last change on this file since 11815 was 11071, checked in by landauf, 9 years ago

merged branch cpp11_v3 back to trunk

  • Property svn:eol-style set to native
File size: 15.6 KB
Line 
1//
2// Copyright (C) 2004-2006, Maciej Sobczak
3//
4// Permission to copy, use, modify, sell and distribute this software
5// is granted provided this copyright notice appears in all copies.
6// This software is provided "as is" without express or implied
7// warranty, and with no claim as to its suitability for any purpose.
8//
9
10// Note: this file is not supposed to be a stand-alone header
11
12
13template <class C, typename R>
14class method0 : public object_cmd_base
15{
16     typedef R (C::*mem_type)();
17     typedef R (C::*cmem_type)() const;
18     
19public:
20     method0(mem_type f) : f_(f), cmem_(false) {}
21     method0(cmem_type f) : cf_(f), cmem_(true) {}
22     
23     virtual void invoke(void *pv, Tcl_Interp *interp,
24          int, Tcl_Obj * CONST [], policies const &)
25     {
26          C *p = static_cast<C*>(pv);
27          if (cmem_)
28          {
29               dispatch<R>::do_dispatch(interp, std::bind(cf_, p));
30          }
31          else
32          {
33               dispatch<R>::do_dispatch(interp, std::bind(f_, p));
34          }
35     }
36
37private:
38     mem_type f_;
39     cmem_type cf_;
40     bool cmem_;
41};
42
43template <class C, typename R, typename T1>
44class method1 : public object_cmd_base
45{
46     typedef R (C::*mem_type)(T1);
47     typedef R (C::*cmem_type)(T1) const;
48     
49public:
50     method1(mem_type f) : f_(f), cmem_(false) {}
51     method1(cmem_type f) : cf_(f), cmem_(true) {}
52     
53     virtual void invoke(void *pv, Tcl_Interp *interp,
54          int objc, Tcl_Obj * CONST objv[], policies const &)
55     {
56          check_params_no(objc, 3);
57         
58          C *p = static_cast<C*>(pv);
59          if (cmem_)
60          {
61               dispatch<R>::template do_dispatch<T1>(
62                    interp, std::bind(cf_, p, arg::_1),
63                    tcl_cast<T1>::from(interp, objv[2]));
64          }
65          else
66          {
67               dispatch<R>::template do_dispatch<T1>(
68                    interp, std::bind(f_, p, arg::_1),
69                    tcl_cast<T1>::from(interp, objv[2]));
70          }
71     }
72
73private:
74     mem_type f_;
75     cmem_type cf_;
76     bool cmem_;
77};
78
79template <class C, typename R, typename T1, typename T2>
80class method2 : public object_cmd_base
81{
82     typedef R (C::*mem_type)(T1, T2);
83     typedef R (C::*cmem_type)(T1, T2) const;
84     
85public:
86     method2(mem_type f) : f_(f), cmem_(false) {}
87     method2(cmem_type f) : cf_(f), cmem_(true) {}
88     
89     virtual void invoke(void *pv, Tcl_Interp *interp,
90          int objc, Tcl_Obj * CONST objv[], policies const &)
91     {
92          check_params_no(objc, 4);
93         
94          C *p = static_cast<C*>(pv);
95          if (cmem_)
96          {
97               dispatch<R>::template do_dispatch<T1, T2>(
98                    interp, std::bind(cf_, p, arg::_1, arg::_2),
99                    tcl_cast<T1>::from(interp, objv[2]),
100                    tcl_cast<T2>::from(interp, objv[3]));
101          }
102          else
103          {
104               dispatch<R>::template do_dispatch<T1, T2>(
105                    interp, std::bind(f_, p, arg::_1, arg::_2),
106                    tcl_cast<T1>::from(interp, objv[2]),
107                    tcl_cast<T2>::from(interp, objv[3]));
108          }
109     }
110
111private:
112     mem_type f_;
113     cmem_type cf_;
114     bool cmem_;
115};
116
117template <class C, typename R, typename T1, typename T2, typename T3>
118class method3 : public object_cmd_base
119{
120     typedef R (C::*mem_type)(T1, T2, T3);
121     typedef R (C::*cmem_type)(T1, T2, T3) const;
122     
123public:
124     method3(mem_type f) : f_(f), cmem_(false) {}
125     method3(cmem_type f) : cf_(f), cmem_(true) {}
126     
127     virtual void invoke(void *pv, Tcl_Interp *interp,
128          int objc, Tcl_Obj * CONST objv[], policies const &)
129     {
130          check_params_no(objc, 5);
131         
132          C *p = static_cast<C*>(pv);
133          if (cmem_)
134          {
135               dispatch<R>::template do_dispatch<T1, T2, T3>(
136                    interp, std::bind(cf_, p, arg::_1, arg::_2, arg::_3),
137                    tcl_cast<T1>::from(interp, objv[2]),
138                    tcl_cast<T2>::from(interp, objv[3]),
139                    tcl_cast<T3>::from(interp, objv[4]));
140          }
141          else
142          {
143               dispatch<R>::template do_dispatch<T1, T2, T3>(
144                    interp, std::bind(f_, p, arg::_1, arg::_2, arg::_3),
145                    tcl_cast<T1>::from(interp, objv[2]),
146                    tcl_cast<T2>::from(interp, objv[3]),
147                    tcl_cast<T3>::from(interp, objv[4]));
148          }
149     }
150
151private:
152     mem_type f_;
153     cmem_type cf_;
154     bool cmem_;
155};
156
157template <class C, typename R, typename T1, typename T2, typename T3,
158     typename T4>
159class method4 : public object_cmd_base
160{
161     typedef R (C::*mem_type)(T1, T2, T3, T4);
162     typedef R (C::*cmem_type)(T1, T2, T3, T4) const;
163     
164public:
165     method4(mem_type f) : f_(f), cmem_(false) {}
166     method4(cmem_type f) : cf_(f), cmem_(true) {}
167     
168     virtual void invoke(void *pv, Tcl_Interp *interp,
169          int objc, Tcl_Obj * CONST objv[], policies const &)
170     {
171          check_params_no(objc, 6);
172         
173          C *p = static_cast<C*>(pv);
174          if (cmem_)
175          {
176               dispatch<R>::template do_dispatch<T1, T2, T3, T4>(
177                    interp, std::bind(cf_, p, arg::_1, arg::_2, arg::_3, arg::_4),
178                    tcl_cast<T1>::from(interp, objv[2]),
179                    tcl_cast<T2>::from(interp, objv[3]),
180                    tcl_cast<T3>::from(interp, objv[4]),
181                    tcl_cast<T4>::from(interp, objv[5]));
182          }
183          else
184          {
185               dispatch<R>::template do_dispatch<T1, T2, T3, T4>(
186                    interp, std::bind(f_, p, arg::_1, arg::_2, arg::_3, arg::_4),
187                    tcl_cast<T1>::from(interp, objv[2]),
188                    tcl_cast<T2>::from(interp, objv[3]),
189                    tcl_cast<T3>::from(interp, objv[4]),
190                    tcl_cast<T4>::from(interp, objv[5]));
191          }
192     }
193
194private:
195     mem_type f_;
196     cmem_type cf_;
197     bool cmem_;
198};
199
200template <class C, typename R, typename T1, typename T2, typename T3,
201     typename T4, typename T5>
202class method5 : public object_cmd_base
203{
204     typedef R (C::*mem_type)(T1, T2, T3, T4, T5);
205     typedef R (C::*cmem_type)(T1, T2, T3, T4, T5) const;
206     
207public:
208     method5(mem_type f) : f_(f), cmem_(false) {}
209     method5(cmem_type f) : cf_(f), cmem_(true) {}
210     
211     virtual void invoke(void *pv, Tcl_Interp *interp,
212          int objc, Tcl_Obj * CONST objv[], policies const &)
213     {
214          check_params_no(objc, 7);
215         
216          C *p = static_cast<C*>(pv);
217          if (cmem_)
218          {
219               dispatch<R>::template do_dispatch<T1, T2, T3, T4, T5>(
220                    interp, std::bind(cf_, p, arg::_1, arg::_2, arg::_3, arg::_4, arg::_5),
221                    tcl_cast<T1>::from(interp, objv[2]),
222                    tcl_cast<T2>::from(interp, objv[3]),
223                    tcl_cast<T3>::from(interp, objv[4]),
224                    tcl_cast<T4>::from(interp, objv[5]),
225                    tcl_cast<T5>::from(interp, objv[6]));
226          }
227          else
228          {
229               dispatch<R>::template do_dispatch<T1, T2, T3, T4, T5>(
230                    interp, std::bind(f_, p, arg::_1, arg::_2, arg::_3, arg::_4, arg::_5),
231                    tcl_cast<T1>::from(interp, objv[2]),
232                    tcl_cast<T2>::from(interp, objv[3]),
233                    tcl_cast<T3>::from(interp, objv[4]),
234                    tcl_cast<T4>::from(interp, objv[5]),
235                    tcl_cast<T5>::from(interp, objv[6]));
236          }
237     }
238
239private:
240     mem_type f_;
241     cmem_type cf_;
242     bool cmem_;
243};
244
245template <class C, typename R, typename T1, typename T2, typename T3,
246     typename T4, typename T5, typename T6>
247class method6 : public object_cmd_base
248{
249     typedef R (C::*mem_type)(T1, T2, T3, T4, T5, T6);
250     typedef R (C::*cmem_type)(T1, T2, T3, T4, T5, T6) const;
251     
252public:
253     method6(mem_type f) : f_(f), cmem_(false) {}
254     method6(cmem_type f) : cf_(f), cmem_(true) {}
255     
256     virtual void invoke(void *pv, Tcl_Interp *interp,
257          int objc, Tcl_Obj * CONST objv[], policies const &)
258     {
259          check_params_no(objc, 8);
260         
261          C *p = static_cast<C*>(pv);
262          if (cmem_)
263          {
264               dispatch<R>::template do_dispatch<T1, T2, T3, T4, T5, T6>(
265                    interp, std::bind(cf_, p, arg::_1, arg::_2, arg::_3, arg::_4, arg::_5, arg::_6),
266                    tcl_cast<T1>::from(interp, objv[2]),
267                    tcl_cast<T2>::from(interp, objv[3]),
268                    tcl_cast<T3>::from(interp, objv[4]),
269                    tcl_cast<T4>::from(interp, objv[5]),
270                    tcl_cast<T5>::from(interp, objv[6]),
271                    tcl_cast<T6>::from(interp, objv[7]));
272          }
273          else
274          {
275               dispatch<R>::template do_dispatch<T1, T2, T3, T4, T5, T6>(
276                    interp, std::bind(f_, p, arg::_1, arg::_2, arg::_3, arg::_4, arg::_5, arg::_6),
277                    tcl_cast<T1>::from(interp, objv[2]),
278                    tcl_cast<T2>::from(interp, objv[3]),
279                    tcl_cast<T3>::from(interp, objv[4]),
280                    tcl_cast<T4>::from(interp, objv[5]),
281                    tcl_cast<T5>::from(interp, objv[6]),
282                    tcl_cast<T6>::from(interp, objv[7]));
283          }
284     }
285
286private:
287     mem_type f_;
288     cmem_type cf_;
289     bool cmem_;
290};
291
292template <class C, typename R, typename T1, typename T2, typename T3,
293     typename T4, typename T5, typename T6, typename T7>
294class method7 : public object_cmd_base
295{
296     typedef R (C::*mem_type)(T1, T2, T3, T4, T5, T6, T7);
297     typedef R (C::*cmem_type)(T1, T2, T3, T4, T5, T6, T7) const;
298     
299public:
300     method7(mem_type f) : f_(f), cmem_(false) {}
301     method7(cmem_type f) : cf_(f), cmem_(true) {}
302     
303     virtual void invoke(void *pv, Tcl_Interp *interp,
304          int objc, Tcl_Obj * CONST objv[], policies const &)
305     {
306          check_params_no(objc, 9);
307         
308          C *p = static_cast<C*>(pv);
309          if (cmem_)
310          {
311               dispatch<R>::template do_dispatch<T1, T2, T3, T4, T5, T6, T7>(
312                    interp, std::bind(cf_, p, arg::_1, arg::_2, arg::_3, arg::_4, arg::_5, arg::_6, arg::_7),
313                    tcl_cast<T1>::from(interp, objv[2]),
314                    tcl_cast<T2>::from(interp, objv[3]),
315                    tcl_cast<T3>::from(interp, objv[4]),
316                    tcl_cast<T4>::from(interp, objv[5]),
317                    tcl_cast<T5>::from(interp, objv[6]),
318                    tcl_cast<T6>::from(interp, objv[7]),
319                    tcl_cast<T7>::from(interp, objv[8]));
320          }
321          else
322          {
323               dispatch<R>::template do_dispatch<T1, T2, T3, T4, T5, T6, T7>(
324                    interp, std::bind(f_, p, arg::_1, arg::_2, arg::_3, arg::_4, arg::_5, arg::_6, arg::_7),
325                    tcl_cast<T1>::from(interp, objv[2]),
326                    tcl_cast<T2>::from(interp, objv[3]),
327                    tcl_cast<T3>::from(interp, objv[4]),
328                    tcl_cast<T4>::from(interp, objv[5]),
329                    tcl_cast<T5>::from(interp, objv[6]),
330                    tcl_cast<T6>::from(interp, objv[7]),
331                    tcl_cast<T7>::from(interp, objv[8]));
332          }
333     }
334
335private:
336     mem_type f_;
337     cmem_type cf_;
338     bool cmem_;
339};
340
341template <class C, typename R, typename T1, typename T2, typename T3,
342     typename T4, typename T5, typename T6, typename T7, typename T8>
343class method8 : public object_cmd_base
344{
345     typedef R (C::*mem_type)(T1, T2, T3, T4, T5, T6, T7, T8);
346     typedef R (C::*cmem_type)(T1, T2, T3, T4, T5, T6, T7, T8) const;
347     
348public:
349     method8(mem_type f) : f_(f), cmem_(false) {}
350     method8(cmem_type f) : cf_(f), cmem_(true) {}
351     
352     virtual void invoke(void *pv, Tcl_Interp *interp,
353          int objc, Tcl_Obj * CONST objv[], policies const &)
354     {
355          check_params_no(objc, 10);
356         
357          C *p = static_cast<C*>(pv);
358          if (cmem_)
359          {
360               dispatch<R>::template do_dispatch<
361                    T1, T2, T3, T4, T5, T6, T7, T8>(
362                    interp, std::bind(cf_, p,
363                         arg::_1, arg::_2, arg::_3, arg::_4, arg::_5, arg::_6, arg::_7, arg::_8),
364                    tcl_cast<T1>::from(interp, objv[2]),
365                    tcl_cast<T2>::from(interp, objv[3]),
366                    tcl_cast<T3>::from(interp, objv[4]),
367                    tcl_cast<T4>::from(interp, objv[5]),
368                    tcl_cast<T5>::from(interp, objv[6]),
369                    tcl_cast<T6>::from(interp, objv[7]),
370                    tcl_cast<T7>::from(interp, objv[8]),
371                    tcl_cast<T8>::from(interp, objv[9]));
372          }
373          else
374          {
375               dispatch<R>::template do_dispatch<
376                    T1, T2, T3, T4, T5, T6, T7, T8>(
377                    interp, std::bind(f_, p,
378                         arg::_1, arg::_2, arg::_3, arg::_4, arg::_5, arg::_6, arg::_7, arg::_8),
379                    tcl_cast<T1>::from(interp, objv[2]),
380                    tcl_cast<T2>::from(interp, objv[3]),
381                    tcl_cast<T3>::from(interp, objv[4]),
382                    tcl_cast<T4>::from(interp, objv[5]),
383                    tcl_cast<T5>::from(interp, objv[6]),
384                    tcl_cast<T6>::from(interp, objv[7]),
385                    tcl_cast<T7>::from(interp, objv[8]),
386                    tcl_cast<T8>::from(interp, objv[9]));
387          }
388     }
389
390private:
391     mem_type f_;
392     cmem_type cf_;
393     bool cmem_;
394};
395
396template <class C, typename R, typename T1, typename T2, typename T3,
397     typename T4, typename T5, typename T6, typename T7, typename T8,
398     typename T9>
399class method9 : public object_cmd_base
400{
401     typedef R (C::*mem_type)(T1, T2, T3, T4, T5, T6, T7, T8, T9);
402     typedef R (C::*cmem_type)(T1, T2, T3, T4, T5, T6, T7, T8, T9) const;
403     
404public:
405     method9(mem_type f) : f_(f), cmem_(false) {}
406     method9(cmem_type f) : cf_(f), cmem_(true) {}
407     
408     virtual void invoke(void *pv, Tcl_Interp *interp,
409          int objc, Tcl_Obj * CONST objv[], policies const &)
410     {
411          check_params_no(objc, 11);
412         
413          C *p = static_cast<C*>(pv);
414          if (cmem_)
415          {
416               dispatch<R>::template do_dispatch<
417                    T1, T2, T3, T4, T5, T6, T7, T8, T9>(
418                    interp, std::bind(cf_, p,
419                         arg::_1, arg::_2, arg::_3, arg::_4, arg::_5, arg::_6, arg::_7, arg::_8, arg::_9),
420                    tcl_cast<T1>::from(interp, objv[2]),
421                    tcl_cast<T2>::from(interp, objv[3]),
422                    tcl_cast<T3>::from(interp, objv[4]),
423                    tcl_cast<T4>::from(interp, objv[5]),
424                    tcl_cast<T5>::from(interp, objv[6]),
425                    tcl_cast<T6>::from(interp, objv[7]),
426                    tcl_cast<T7>::from(interp, objv[8]),
427                    tcl_cast<T8>::from(interp, objv[9]),
428                    tcl_cast<T9>::from(interp, objv[10]));
429          }
430          else
431          {
432               dispatch<R>::template do_dispatch<
433                    T1, T2, T3, T4, T5, T6, T7, T8, T9>(
434                    interp, std::bind(f_, p,
435                         arg::_1, arg::_2, arg::_3, arg::_4, arg::_5, arg::_6, arg::_7, arg::_8, arg::_9),
436                    tcl_cast<T1>::from(interp, objv[2]),
437                    tcl_cast<T2>::from(interp, objv[3]),
438                    tcl_cast<T3>::from(interp, objv[4]),
439                    tcl_cast<T4>::from(interp, objv[5]),
440                    tcl_cast<T5>::from(interp, objv[6]),
441                    tcl_cast<T6>::from(interp, objv[7]),
442                    tcl_cast<T7>::from(interp, objv[8]),
443                    tcl_cast<T8>::from(interp, objv[9]),
444                    tcl_cast<T9>::from(interp, objv[10]));
445          }
446     }
447
448private:
449     mem_type f_;
450     cmem_type cf_;
451     bool cmem_;
452};
Note: See TracBrowser for help on using the repository browser.