MEL
Microthread & Execution library
LinkArgs.h
1 #pragma once
2 #include <mpl/Int2Type.h>
3 #include <mpl/typelist/TypeList.h>
4 #include <mpl/typelist/Length.h>
6 using mel::mpl::nullType;
7 #include <mpl/TypeTraits.h>
9 #include <mpl/Conversion.h>
12 #include <mpl/equal.h>
13 #include <mpl/typelist/Element.h>
14 //#include <mpl/isSame.h>
15 //#include <mpl/StaticAssert.h>
16 /*
17 void fTest(int&,char,XNode* )
18 {
19 }
20 XNode* createXNode()
21 {
22 return NULL;
23 }
24 
25 int a;
26 linkFunctor< void,TYPELIST(XNode*,int&) >( fTest,mpl::_v2,'a',mpl::_v1 )( mel::mpl::functorWrapper<XNode*>(createXNode),mpl::createRef(a));
27 */
28 namespace mel
29 {
30  namespace mpl
31  {
34 
35  template <class F,class R> struct FunctorWrapper
36  {
37  FunctorWrapper( F& obj):mObj(obj){}
38 
39  inline operator R() const
40  {
41  return mObj();
42  }
43  bool operator == (const FunctorWrapper<F,R>& F2 ) const
44  {
45  return mObj == F2.mObj;
46  }
47 
48  private:
49  mutable F mObj;
50  };
52  template <class R,class F> FunctorWrapper<F,R> functorWrapper( F f )
53  {
54  return FunctorWrapper<F,R>( f );
55  }
56 
57 
58  /*
59  PENDIENTE:
60  - comprobar que no haya mas fixed que variables
61  - no tengo todavia claro que cosas permitir y no:llamar a la funcion con mas argumentos de los que admite,etc
62  */
63  struct VariablePosBase{};
64  template <int n> struct VariablePos : VariablePosBase
65  {
66  enum {value = n};
67  };
68 
69  const static VariablePos<1> _v1 = VariablePos<1>();
70  const static VariablePos<2> _v2 = VariablePos<2>();
71  const static VariablePos<3> _v3 = VariablePos<3>();
72  const static VariablePos<4> _v4 = VariablePos<4>();
73  const static VariablePos<5> _v5 = VariablePos<5>();
74  const static VariablePos<6> _v6 = VariablePos<6>();
75 
76  template <class T>
77  class Fixed1
78  {
79  public:
80  inline bool operator == ( const Fixed1& ob2 ) const
81  {
82  return mel::mpl::equal<true>(f1,ob2.f1); //TODO atencion que todav�a no vale
83  }
84  T f1;
85  protected:
86  //typedef typename TypeTraits< typename TypeTraits<T>::ParameterType>::NoConst TArg1;
87  typedef typename TypeTraits<T>::ParameterType TArg1;
88  Fixed1( TArg1 arg ):f1( arg ){}
89  };
90 
91  template <> class Fixed1<NullType>
92  {
93  public:
94  template <class T> Fixed1( const T& ){}
95  };
96 
97  template <class T>
98  class Fixed2
99  {
100  public:
101  inline bool operator == ( const Fixed2& ob2 ) const
102  {
103  return mel::mpl::equal<true>(f2,ob2.f2);
104  }
105  T f2;
106  protected:
107  //typedef typename TypeTraits< typename TypeTraits<T>::ParameterType>::NoConst TArg2;
108  typedef typename TypeTraits<T>::ParameterType TArg2;
109  Fixed2( TArg2 arg ):f2( arg ){}
110 
111 
112  };
113  template <> class Fixed2<NullType>{
114  public:
115  template <class T> Fixed2( const T& ){}
116  };
117  template <class T>
118  class Fixed3
119  {
120  public:
121  inline bool operator == ( const Fixed3& ob2 ) const
122  {
123  return mel::mpl::equal<true>(f3,ob2.f3); //TODO atencion que todav�a no vale
124  }
125  T f3;
126  protected:
127  //typedef typename TypeTraits< typename TypeTraits<T>::ParameterType>::NoConst TArg3;
128  typedef typename TypeTraits<T>::ParameterType TArg3;
129  Fixed3( TArg3 arg ):f3( arg ){}
130 
131 
132  };
133  template <> class Fixed3<NullType>{
134  public:
135  template <class T> Fixed3( const T& ){}
136  };
137 
138  template <class T>
139  class Fixed4
140  {
141  public:
142  inline bool operator == ( const Fixed4& ob2 ) const
143  {
144  return mel::mpl::equal<true>(f4,ob2.f4); //TODO atencion que todav�a no vale
145  }
146  T f4;
147  protected:
148  //typedef typename TypeTraits< typename TypeTraits<T>::ParameterType>::NoConst TArg4;
149  typedef typename TypeTraits<T>::ParameterType TArg4;
150  Fixed4( TArg4 arg ):f4( arg ){}
151 
152 
153 
154  };
155  template <> class Fixed4<NullType>{
156  public:
157  template <class T> Fixed4( const T& ){}
158  };
159 
160  template <class T>
161  class Fixed5
162  {
163  public:
164  inline bool operator == ( const Fixed5& ob2 ) const
165  {
166  return mel::mpl::equal<true>(f5,ob2.f5); //TODO atencion que todav�a no vale
167  }
168  T f5;
169  protected:
170  typedef typename TypeTraits<T>::ParameterType TArg5;
171  Fixed5( TArg5 arg ):f5( arg ){}
172 
173 
174 
175  };
176  template <> class Fixed5<NullType>{
177  public:
178  template <class T> Fixed5( const T& ){}
179  };
180 
181  template <class T>
182  class Fixed6
183  {
184  public:
185  inline bool operator == ( const Fixed6& ob2 ) const
186  {
187  return mel::mpl::equal<true>(f6,ob2.f6); //TODO atencion que todav�a no vale
188  }
189  T f6;
190  protected:
191  typedef typename TypeTraits<T>::ParameterType TArg6;
192  Fixed6( TArg6 arg ):f6( arg ){}
193 
194 
195 
196  };
197  template <> class Fixed6<NullType>{
198  public:
199  template <class T> Fixed6( const T& ){}
200  };
201 
202  template <class TListPos,int size> class Linker_Base;
203 
204  template <class TListPos> class Linker_Base< TListPos,1> :
205  public Fixed1<
206  typename _if< Conversion<typename Element< TListPos, 0,true>::Result,VariablePosBase>::exists,
207  NullType,
208  typename Element< TListPos, 0,true>::Result >::Result
209  >
210  {
211  protected:
212 
214  typedef typename TypeTraits< typename Element< TListPos, 0,true>::Result >::ParameterType TArg1Ref;
215 
216  Linker_Base( TArg1Ref arg1 ):Fixed1<TArg1>( arg1 ){}
217 
218  bool operator == ( const Linker_Base<TListPos,1>& ob2 ) const
219  {
220  return mel::mpl::equal<true>( *((Fixed1<TArg1>*)this),ob2 );
221  }
222 
223  };
224  template <class TListPos> class Linker_Base< TListPos,2> :
225  public Fixed1<
226  typename _if< Conversion<typename Element< TListPos, 0,true>::Result,VariablePosBase>::exists,
227  NullType,
228  typename Element< TListPos, 0,true>::Result >::Result
229  >,
230  public Fixed2<
231  typename _if< Conversion<typename Element< TListPos, 1,true>::Result,VariablePosBase>::exists,
232  NullType,
233  typename Element< TListPos, 1,true>::Result >::Result
234  >
235  {
236  protected:
239 
240  typedef typename TypeTraits<typename Element< TListPos, 0,true>::Result>::ParameterType TArg1Ref;
241  typedef typename TypeTraits<typename Element< TListPos, 1,true>::Result>::ParameterType TArg2Ref;
242 
243 
244  Linker_Base( TArg1Ref arg1,
245  TArg2Ref arg2 ):Fixed1<TArg1>( arg1 ),Fixed2<TArg2>( arg2 ){}
246 
247  bool operator == ( const Linker_Base<TListPos,2>& ob2 ) const
248  {
249  return mel::mpl::equal<true>( *((Fixed1<TArg1>*)this),ob2 ) &&
250  mpl::equal<true>( *((Fixed2<TArg2>*)this),ob2 );
251  }
252 
253  };
254  template <class TListPos> class Linker_Base< TListPos,3> :
255  public Fixed1<
256  typename _if< Conversion<typename Element< TListPos, 0,true>::Result,VariablePosBase>::exists,
257  NullType,
258  typename Element< TListPos, 0,true>::Result >::Result
259  >,
260  public Fixed2<
261  typename _if< Conversion<typename Element< TListPos, 1,true>::Result,VariablePosBase>::exists,
262  NullType,
263  typename Element< TListPos, 1,true>::Result >::Result
264  >,
265  public Fixed3<
266  typename _if< Conversion<typename Element< TListPos, 2,true>::Result,VariablePosBase>::exists,
267  NullType,
268  typename Element< TListPos, 2,true>::Result >::Result
269  >
270 
271  {
272  protected:
276 
277  typedef typename TypeTraits<typename Element< TListPos, 0,true>::Result>::ParameterType TArg1Ref;
278  typedef typename TypeTraits<typename Element< TListPos, 1,true>::Result>::ParameterType TArg2Ref;
279  typedef typename TypeTraits<typename Element< TListPos, 2,true>::Result>::ParameterType TArg3Ref;
280 
281 
282  Linker_Base( TArg1Ref arg1,
283  TArg2Ref arg2,
284  TArg3Ref arg3 ):Fixed1<TArg1>( arg1 ),Fixed2<TArg2>( arg2 ),Fixed3<TArg3>( arg3 ){}
285 
286  bool operator == ( const Linker_Base<TListPos,3>& ob2 ) const
287  {
288  return mel::mpl::equal<true>( *((Fixed1<TArg1>*)this),ob2 ) &&
289  mpl::equal<true>( *((Fixed2<TArg2>*)this),ob2 ) &&
290  mpl::equal<true>( *((Fixed3<TArg3>*)this),ob2 );
291  }
292 
293  };
294 
295  template <class TListPos> class Linker_Base< TListPos,4> :
296  public Fixed1<
297  typename _if< Conversion<typename Element< TListPos, 0,true>::Result,VariablePosBase>::exists,
298  NullType,
299  typename Element< TListPos, 0,true>::Result >::Result
300  >,
301  public Fixed2<
302  typename _if< Conversion<typename Element< TListPos, 1,true>::Result,VariablePosBase>::exists,
303  NullType,
304  typename Element< TListPos, 1,true>::Result >::Result
305  >,
306  public Fixed3<
307  typename _if< Conversion<typename Element< TListPos, 2,true>::Result,VariablePosBase>::exists,
308  NullType,
309  typename Element< TListPos, 2,true>::Result >::Result
310  >,
311  public Fixed4<
312  typename _if< Conversion<typename Element< TListPos, 3,true>::Result,VariablePosBase>::exists,
313  NullType,
314  typename Element< TListPos, 3,true>::Result >::Result
315  >
316 
317 
318  {
319  protected:
324 
325  // typedef typename TypeTraits< typename TypeTraits<typename Element< TListPos, 0,true>::Result>::ParameterType>::NoConst TArg1Ref;
326  // typedef typename TypeTraits< typename TypeTraits<typename Element< TListPos, 1,true>::Result>::ParameterType>::NoConst TArg2Ref;
327  // typedef typename TypeTraits< typename TypeTraits<typename Element< TListPos, 2,true>::Result>::ParameterType>::NoConst TArg3Ref;
328  // typedef typename TypeTraits< typename TypeTraits<typename Element< TListPos, 3,true>::Result>::ParameterType>::NoConst TArg4Ref;
329  typedef typename TypeTraits<typename Element< TListPos, 0,true>::Result>::ParameterType TArg1Ref;
330  typedef typename TypeTraits<typename Element< TListPos, 1,true>::Result>::ParameterType TArg2Ref;
331  typedef typename TypeTraits<typename Element< TListPos, 2,true>::Result>::ParameterType TArg3Ref;
332  typedef typename TypeTraits<typename Element< TListPos, 3,true>::Result>::ParameterType TArg4Ref;
333 
334 
335  Linker_Base( TArg1Ref arg1,
336  TArg2Ref arg2,
337  TArg3Ref arg3,TArg4Ref arg4 ):Fixed1<TArg1>( arg1 ),Fixed2<TArg2>( arg2 ),Fixed3<TArg3>( arg3 ),Fixed4<TArg4>( arg4 ){}
338  bool operator == ( const Linker_Base<TListPos,4>& ob2 ) const
339  {
340  return mel::mpl::equal<true>( *((Fixed1<TArg1>*)this),ob2 ) &&
341  mpl::equal<true>( *((Fixed2<TArg2>*)this),ob2 ) &&
342  mpl::equal<true>( *((Fixed3<TArg3>*)this),ob2 ) &&
343  mpl::equal<true>( *((Fixed4<TArg4>*)this),ob2 );
344  }
345  };
346 
347  template <class TListPos> class Linker_Base< TListPos,5> :
348  public Fixed1<
349  typename _if< Conversion<typename Element< TListPos, 0,true>::Result,VariablePosBase>::exists,
350  NullType,
351  typename Element< TListPos, 0,true>::Result >::Result
352  >,
353  public Fixed2<
354  typename _if< Conversion<typename Element< TListPos, 1,true>::Result,VariablePosBase>::exists,
355  NullType,
356  typename Element< TListPos, 1,true>::Result >::Result
357  >,
358  public Fixed3<
359  typename _if< Conversion<typename Element< TListPos, 2,true>::Result,VariablePosBase>::exists,
360  NullType,
361  typename Element< TListPos, 2,true>::Result >::Result
362  >,
363  public Fixed4<
364  typename _if< Conversion<typename Element< TListPos, 3,true>::Result,VariablePosBase>::exists,
365  NullType,
366  typename Element< TListPos, 3,true>::Result >::Result
367  >,
368  public Fixed5<
369  typename _if< Conversion<typename Element< TListPos, 4,true>::Result,VariablePosBase>::exists,
370  NullType,
371  typename Element< TListPos, 4,true>::Result >::Result
372  >
373 
374 
375  {
376  protected:
382 
383  /*
384  typedef typename TypeTraits< typename TypeTraits<typename Element< TListPos, 0,true>::Result>::ParameterType>::NoConst TArg1Ref;
385  typedef typename TypeTraits< typename TypeTraits<typename Element< TListPos, 1,true>::Result>::ParameterType>::NoConst TArg2Ref;
386  typedef typename TypeTraits< typename TypeTraits<typename Element< TListPos, 2,true>::Result>::ParameterType>::NoConst TArg3Ref;
387  typedef typename TypeTraits< typename TypeTraits<typename Element< TListPos, 3,true>::Result>::ParameterType>::NoConst TArg4Ref;
388  typedef typename TypeTraits< typename TypeTraits<typename Element< TListPos, 4,true>::Result>::ParameterType>::NoConst TArg5Ref;
389  */
390  typedef typename TypeTraits<typename Element< TListPos, 0,true>::Result>::ParameterType TArg1Ref;
391  typedef typename TypeTraits<typename Element< TListPos, 1,true>::Result>::ParameterType TArg2Ref;
392  typedef typename TypeTraits<typename Element< TListPos, 2,true>::Result>::ParameterType TArg3Ref;
393  typedef typename TypeTraits<typename Element< TListPos, 3,true>::Result>::ParameterType TArg4Ref;
394  typedef typename TypeTraits<typename Element< TListPos, 4,true>::Result>::ParameterType TArg5Ref;
395  Linker_Base( TArg1Ref arg1,
396  TArg2Ref arg2,
397  TArg3Ref arg3,TArg4Ref arg4,TArg5Ref arg5 ):Fixed1<TArg1>( arg1 ),Fixed2<TArg2>( arg2 ),Fixed3<TArg3>( arg3 ),Fixed4<TArg4>( arg4 ),Fixed5<TArg5>( arg5 ){}
398 
399  bool operator == ( const Linker_Base<TListPos,5>& ob2 ) const
400  {
401  return mel::mpl::equal<true>( *((Fixed1<TArg1>*)this),ob2 ) &&
402  mpl::equal<true>( *((Fixed2<TArg2>*)this),ob2 ) &&
403  mpl::equal<true>( *((Fixed3<TArg3>*)this),ob2 ) &&
404  mpl::equal<true>( *((Fixed4<TArg4>*)this),ob2 ) &&
405  mpl::equal<true>( *((Fixed5<TArg5>*)this),ob2 );
406  }
407 
408  };
409 
410 
411  template <class TListPos> class Linker_Base< TListPos,6> :
412  public Fixed1<
413  typename _if< Conversion<typename Element< TListPos, 0,true>::Result,VariablePosBase>::exists,
414  NullType,
415  typename Element< TListPos, 0,true>::Result >::Result
416  >,
417  public Fixed2<
418  typename _if< Conversion<typename Element< TListPos, 1,true>::Result,VariablePosBase>::exists,
419  NullType,
420  typename Element< TListPos, 1,true>::Result >::Result
421  >,
422  public Fixed3<
423  typename _if< Conversion<typename Element< TListPos, 2,true>::Result,VariablePosBase>::exists,
424  NullType,
425  typename Element< TListPos, 2,true>::Result >::Result
426  >,
427  public Fixed4<
428  typename _if< Conversion<typename Element< TListPos, 3,true>::Result,VariablePosBase>::exists,
429  NullType,
430  typename Element< TListPos, 3,true>::Result >::Result
431  >,
432  public Fixed5<
433  typename _if< Conversion<typename Element< TListPos, 4,true>::Result,VariablePosBase>::exists,
434  NullType,
435  typename Element< TListPos, 4,true>::Result >::Result
436  >,
437  public Fixed6<
438  typename _if< Conversion<typename Element< TListPos, 5,true>::Result,VariablePosBase>::exists,
439  NullType,
440  typename Element< TListPos, 5,true>::Result >::Result
441  >
442 
443 
444  {
445  protected:
452 
453  //typedef typename TypeTraits< typename TypeTraits<typename Element< TListPos, 0,true>::Result>::ParameterType>::NoConst TArg1Ref;
454  //typedef typename TypeTraits< typename TypeTraits<typename Element< TListPos, 1,true>::Result>::ParameterType>::NoConst TArg2Ref;
455  //typedef typename TypeTraits< typename TypeTraits<typename Element< TListPos, 2,true>::Result>::ParameterType>::NoConst TArg3Ref;
456  //typedef typename TypeTraits< typename TypeTraits<typename Element< TListPos, 3,true>::Result>::ParameterType>::NoConst TArg4Ref;
457  //typedef typename TypeTraits< typename TypeTraits<typename Element< TListPos, 4,true>::Result>::ParameterType>::NoConst TArg5Ref;
458  //typedef typename TypeTraits< typename TypeTraits<typename Element< TListPos, 5,true>::Result>::ParameterType>::NoConst TArg6Ref;
459 
460  typedef typename TypeTraits<typename Element< TListPos, 0,true>::Result>::ParameterType TArg1Ref;
461  typedef typename TypeTraits<typename Element< TListPos, 1,true>::Result>::ParameterType TArg2Ref;
462  typedef typename TypeTraits<typename Element< TListPos, 2,true>::Result>::ParameterType TArg3Ref;
463  typedef typename TypeTraits<typename Element< TListPos, 3,true>::Result>::ParameterType TArg4Ref;
464  typedef typename TypeTraits<typename Element< TListPos, 4,true>::Result>::ParameterType TArg5Ref;
465  typedef typename TypeTraits<typename Element< TListPos, 5,true>::Result>::ParameterType TArg6Ref;
466  Linker_Base( TArg1Ref arg1,
467  TArg2Ref arg2,
468  TArg3Ref arg3,TArg4Ref arg4,TArg5Ref arg5,TArg6Ref arg6):Fixed1<TArg1>( arg1 ),
469  Fixed2<TArg2>( arg2 ),Fixed3<TArg3>( arg3 ),Fixed4<TArg4>( arg4 ),
470  Fixed5<TArg5>( arg5 ),Fixed6<TArg6>( arg6 ){}
471 
472  bool operator == ( const Linker_Base<TListPos,6>& ob2 ) const
473  {
474  return mel::mpl::equal<true>( *((Fixed1<TArg1>*)this),ob2 ) &&
475  mpl::equal<true>( *((Fixed2<TArg2>*)this),ob2 ) &&
476  mpl::equal<true>( *((Fixed3<TArg3>*)this),ob2 ) &&
477  mpl::equal<true>( *((Fixed4<TArg4>*)this),ob2 ) &&
478  mpl::equal<true>( *((Fixed5<TArg5>*)this),ob2 ) &&
479  mpl::equal<true>( *((Fixed6<TArg6>*)this),ob2 );
480  }
481 
482  };
483  template <class F,class TRet,
484  class TListVariable, class TListPos> class Linker : public Linker_Base<TListPos,Length< TListPos >::result>
485  {
486  private:
487 
489  //typedef Fixed1< typename BaseClass::TArg1 > TFixed1;
490 
491 
492  typedef typename TypeTraits< typename Element< TListVariable, 0,true>::Result>::ParameterType TV1;
493  typedef typename TypeTraits< typename Element< TListVariable, 1,true>::Result>::ParameterType TV2;
494  typedef typename TypeTraits< typename Element< TListVariable, 2,true>::Result>::ParameterType TV3;
495  typedef typename TypeTraits< typename Element< TListVariable, 3,true>::Result>::ParameterType TV4;
496  typedef typename TypeTraits< typename Element< TListVariable, 4,true>::Result>::ParameterType TV5;
497  typedef typename TypeTraits< typename Element< TListVariable, 5,true>::Result>::ParameterType TV6;
498 
499  typedef typename Element< TListPos, 0,true>::Result TP1;
500  typedef typename Element< TListPos, 1,true>::Result TP2;
501  typedef typename Element< TListPos, 2,true>::Result TP3;
502  typedef typename Element< TListPos, 3,true>::Result TP4;
503  typedef typename Element< TListPos, 4,true>::Result TP5;
504  typedef typename Element< TListPos, 5,true>::Result TP6;
505 
506 
507 
508  //typedef typename TypeTraits< typename TypeTraits<TP1>::ParameterType>::NoConst TP1Ref;
509  /*typedef typename TypeTraits< typename TypeTraits<TP2>::ParameterType>::NoConst TP2Ref;
510  typedef typename TypeTraits< typename TypeTraits<TP3>::ParameterType>::NoConst TP3Ref;
511  typedef typename TypeTraits< typename TypeTraits<TP4>::ParameterType>::NoConst TP4Ref;
512  typedef typename TypeTraits< typename TypeTraits<TP5>::ParameterType>::NoConst TP5Ref;
513  typedef typename TypeTraits< typename TypeTraits<TP6>::ParameterType>::NoConst TP6Ref;*/
514 
515  typedef typename TypeTraits<TP1>::ParameterType TP1Ref;
516  typedef typename TypeTraits<TP2>::ParameterType TP2Ref;
517  typedef typename TypeTraits<TP3>::ParameterType TP3Ref;
518  typedef typename TypeTraits<TP4>::ParameterType TP4Ref;
519  typedef typename TypeTraits<TP5>::ParameterType TP5Ref;
520  typedef typename TypeTraits<TP6>::ParameterType TP6Ref;
521 
522  enum {totallength = Length< TListPos >::result};
523 
524 
525 
526  public:
527  Linker( const F& functor ): mFunctor( functor )
528  {
529  }
530  Linker( const F& functor,TP1Ref arg1 ): BaseClass( arg1 ),mFunctor( functor )
531  {
532  }
533  Linker( const F& functor,TP1Ref arg1,TP2Ref arg2 ): BaseClass( arg1,arg2 ),mFunctor( functor )
534  {
535  }
536  Linker( const F& functor,TP1Ref arg1,TP2Ref arg2,TP3Ref arg3 ): BaseClass( arg1,arg2,arg3 ),mFunctor( functor )
537  {
538  }
539  Linker( const F& functor,TP1Ref arg1,TP2Ref arg2,TP3Ref arg3,TP4Ref arg4 ): BaseClass( arg1,arg2,arg3,arg4 ),mFunctor( functor )
540  {
541  }
542  Linker( const F& functor,TP1Ref arg1,TP2Ref arg2,TP3Ref arg3,TP4Ref arg4,TP5Ref arg5 ): BaseClass( arg1,arg2,arg3,arg4,arg5 ),mFunctor( functor )
543  {
544  }
545  Linker( const F& functor,TP1Ref arg1,TP2Ref arg2,TP3Ref arg3,TP4Ref arg4,TP5Ref arg5,TP6Ref arg6): BaseClass( arg1,arg2,arg3,arg4,arg5,arg6 ),mFunctor( functor )
546  {
547  }
548 
549  template <class F2>
550  bool operator == ( const F2& ob2 ) const
551  {
552  return _equality( Int2Type< Conversion<F2, Linker<F,TRet,TListVariable,TListPos> >::exists >(),ob2 );
553  }
554 
555 
556  TRet operator()( )
557  {
558  return callfunction( Int2Type<totallength>() );
559  }
560 
561  TRet operator()( TV1 arg1)
562  {
563  return callfunction( Int2Type<totallength>(),arg1 );
564  }
565  TRet operator()( TV1 arg1, TV2 arg2 )
566  {
567  return callfunction( Int2Type<totallength>(),arg1,arg2 );
568  }
569  TRet operator()( TV1 arg1,TV2 arg2,TV3 arg3 )
570  {
571  return callfunction( Int2Type<totallength>(),arg1,arg2,arg3 );
572  }
573  TRet operator()( TV1 arg1,TV2 arg2,TV3 arg3,TV4 arg4 )
574  {
575  return callfunction( Int2Type<totallength>(),arg1,arg2,arg3,arg4 );
576  }
577  TRet operator()( TV1 arg1,TV2 arg2,TV3 arg3,TV4 arg4,TV5 arg5 )
578  {
579  return callfunction( Int2Type<totallength>(),arg1,arg2,arg3,arg4,arg5 );
580  }
581  TRet operator()( TV1 arg1,TV2 arg2,TV3 arg3,TV4 arg4,TV5 arg5,TV6 arg6 )
582  {
583  return callfunction( Int2Type<totallength>(),arg1,arg2,arg3,arg4,arg5,arg6 );
584  }
585 
586 
587 
594 
595 
596 
597  private:
598  F mFunctor;
599 
600  template <class TListaArgs,class T> struct GetArg;
601  template < class TListaArgs > struct GetArgBase
602  {
603 
604  typedef typename TypeTraits< typename Element< TListaArgs,0,false>::Result >::ParameterType Arg1Ref;
605  typedef typename TypeTraits< typename Element< TListaArgs,1,false>::Result >::ParameterType Arg2Ref;
606  typedef typename TypeTraits< typename Element< TListaArgs,2,false>::Result >::ParameterType Arg3Ref;
607  typedef typename TypeTraits< typename Element< TListaArgs,3,false>::Result >::ParameterType Arg4Ref;
608  typedef typename TypeTraits< typename Element< TListaArgs,4,false>::Result >::ParameterType Arg5Ref;
609  typedef typename TypeTraits< typename Element< TListaArgs,5,false>::Result >::ParameterType Arg6Ref;
610 
611  };
612  template <class TListaArgs> struct GetArg< TListaArgs,Int2Type<1> > : public GetArgBase<TListaArgs>
613  {
616  BaseClass& fixed )
617  {
618  return fixed.f1;
619  }
620  };
621  template <class TListaArgs> struct GetArg< TListaArgs,Int2Type<2> >: public GetArgBase<TListaArgs>
622  {
625  BaseClass& fixed)
626  {
627  return fixed.f2;
628  }
629  };
630  template <class TListaArgs> struct GetArg< TListaArgs,Int2Type<3> >: public GetArgBase<TListaArgs>
631  {
634  BaseClass& fixed)
635  {
636  return fixed.f3;
637  }
638  };
639  template <class TListaArgs> struct GetArg< TListaArgs,Int2Type<4> >: public GetArgBase<TListaArgs>
640  {
643  BaseClass& fixed)
644  {
645  return fixed.f4;
646  }
647  };
648  template <class TListaArgs> struct GetArg< TListaArgs,Int2Type<5> >: public GetArgBase<TListaArgs>
649  {
652  BaseClass& fixed)
653  {
654  return fixed.f5;
655  }
656  };
657  template <class TListaArgs> struct GetArg< TListaArgs,Int2Type<6> >: public GetArgBase<TListaArgs>
658  {
661  BaseClass& fixed)
662  {
663  return fixed.f6;
664  }
665  };
666  template <class TListaArgs> struct GetArg< TListaArgs,VariablePos<1> > :public GetArgBase<TListaArgs>
667  {
670  BaseClass&)
671  {
672 
673  return arg1;
674  }
675  };
676  template <class TListaArgs> struct GetArg< TListaArgs,VariablePos<2> > :public GetArgBase<TListaArgs>
677  {
678  static inline TV2 get( typename GetArgBase<TListaArgs>::Arg1Ref, typename GetArgBase<TListaArgs>::Arg2Ref arg2,typename GetArgBase<TListaArgs>::Arg3Ref ,
680  BaseClass&)
681  {
682  return arg2;
683  }
684  };
685  template <class TListaArgs> struct GetArg< TListaArgs,VariablePos<3> >: public GetArgBase<TListaArgs>
686  {
689  BaseClass&)
690  {
691  return arg3;
692  }
693  };
694  template <class TListaArgs> struct GetArg< TListaArgs,VariablePos<4> >: public GetArgBase<TListaArgs>
695  {
698  BaseClass&)
699  {
700  return arg4;
701  }
702  };
703  template <class TListaArgs> struct GetArg< TListaArgs,VariablePos<5> >: public GetArgBase<TListaArgs>
704  {
707  BaseClass&)
708  {
709  return arg5;
710  }
711  };
712  template <class TListaArgs> struct GetArg< TListaArgs,VariablePos<6> >: public GetArgBase<TListaArgs>
713  {
716  BaseClass&)
717  {
718  return arg6;
719  }
720  };
721 
722  //one arg
723  inline TRet callfunction( Int2Type<1> )
724  {
725  //return mFunctor( mFixed.f1 ); //si no hay parametros de entrada a la fuerza es uno fijo
726  //return mFunctor(TFixed1::f1);
727  return mFunctor(this->f1);
728 
729  }
730  inline TRet callfunction( Int2Type<1>,TV1 arg1)
731  {
732  return mFunctor( arg1 );
733  }
734  //total length == 2
735  inline TRet callfunction( Int2Type<2> )
736  {
737  return mFunctor(this->f1,this->f2);
738  }
739 
740  inline TRet callfunction( Int2Type<2>,TV1 arg1)
741  {
742 
743  return mFunctor( GetArg< TYPELIST(TV1,NullType,NullType,NullType,NullType,NullType),FirstType>::get(arg1,nullType,nullType,nullType,nullType,nullType,*this),
744  GetArg< TYPELIST(TV1,NullType,NullType,NullType,NullType,NullType),SecondType>::get(arg1,nullType,nullType,nullType,nullType,nullType,*this));
745 
746  }
747 
748  inline TRet callfunction( Int2Type<2>,TV1 arg1,TV2 arg2)
749  {
750  //MPL_STATIC_ASSERT( (isSame<FirstType,VariablePos<1> >::result), CACA );
751  return mFunctor( GetArg< TYPELIST(TV1,TV2,NullType,NullType,NullType,NullType),FirstType>::get(arg1,arg2,nullType,nullType,nullType,nullType,*this),
752  GetArg< TYPELIST(TV1,TV2,NullType,NullType,NullType,NullType),SecondType>::get(arg1,arg2,nullType,nullType,nullType,nullType,*this));
753 
754  }
755  //total length == 3
756  inline TRet callfunction( Int2Type<3> )
757  {
758  return mFunctor(this->f1,this->f2,this->f3);
759  }
760 
761  inline TRet callfunction( Int2Type<3>,TV1 arg1)
762  {
763 
764  return mFunctor( GetArg< TYPELIST(TV1,NullType,NullType,NullType,NullType,NullType),FirstType>::get(arg1,nullType,nullType,nullType,nullType,nullType,*this),
765  GetArg< TYPELIST(TV1,NullType,NullType,NullType,NullType,NullType),SecondType>::get(arg1,nullType,nullType,nullType,nullType,nullType,*this),
766  GetArg< TYPELIST(TV1,NullType,NullType,NullType,NullType,NullType),ThirdType>::get(arg1,nullType,nullType,nullType,nullType,nullType,*this));
767 
768 
769  }
770  inline TRet callfunction( Int2Type<3>,TV1 arg1,TV2 arg2)
771  {
772 
773  return mFunctor( GetArg< TYPELIST(TV1,TV2,NullType,NullType,NullType,NullType),FirstType>::get(arg1,arg2,nullType,nullType,nullType,nullType,*this),
774  GetArg< TYPELIST(TV1,TV2,NullType,NullType,NullType,NullType),SecondType>::get(arg1,arg2,nullType,nullType,nullType,nullType,*this),
775  GetArg< TYPELIST(TV1,TV2,NullType,NullType,NullType,NullType),ThirdType>::get(arg1,arg2,nullType,nullType,nullType,nullType,*this));
776 
777  }
778  inline TRet callfunction( Int2Type<3>,TV1 arg1,TV2 arg2,TV3 arg3)
779  {
780  return mFunctor( GetArg< TYPELIST(TV1,TV2,TV3,NullType,NullType,NullType),FirstType>::get(arg1,arg2,arg3,nullType,nullType,nullType,*this),
781  GetArg< TYPELIST(TV1,TV2,TV3,NullType,NullType,NullType),SecondType>::get(arg1,arg2,arg3,nullType,nullType,nullType,*this),
782  GetArg< TYPELIST(TV1,TV2,TV3,NullType,NullType,NullType),ThirdType>::get(arg1,arg2,arg3,nullType,nullType,nullType,*this));
783  }
784  //total length == 4
785  inline TRet callfunction( Int2Type<4> )
786  {
787  return mFunctor(this->f1,this->f2,this->f3,this->f4);
788  }
789 
790  inline TRet callfunction( Int2Type<4>,TV1 arg1 )
791  {
792  return mFunctor( GetArg< TYPELIST(TV1,NullType,NullType,NullType,NullType,NullType),FirstType>::get(arg1,nullType,nullType,nullType,nullType,nullType,*this),
793  GetArg< TYPELIST(TV1,NullType,NullType,NullType,NullType,NullType),SecondType>::get(arg1,nullType,nullType,nullType,nullType,nullType,*this),
794  GetArg< TYPELIST(TV1,NullType,NullType,NullType,NullType,NullType),ThirdType>::get(arg1,nullType,nullType,nullType,nullType,nullType,*this),
795  GetArg< TYPELIST(TV1,NullType,NullType,NullType,NullType,NullType),FourthType>::get(arg1,nullType,nullType,nullType,nullType,nullType,*this)
796  );
797  }
798  inline TRet callfunction( Int2Type<4>,TV1 arg1,TV2 arg2 )
799  {
800  return mFunctor( GetArg< TYPELIST(TV1,TV2,NullType,NullType,NullType,NullType),FirstType>::get(arg1,arg2,nullType,nullType,nullType,nullType,*this),
801  GetArg< TYPELIST(TV1,TV2,NullType,NullType,NullType,NullType),SecondType>::get(arg1,arg2,nullType,nullType,nullType,nullType,*this),
802  GetArg< TYPELIST(TV1,TV2,NullType,NullType,NullType,NullType),ThirdType>::get(arg1,arg2,nullType,nullType,nullType,nullType,*this),
803  GetArg< TYPELIST(TV1,TV2,NullType,NullType,NullType,NullType),FourthType>::get(arg1,arg2,nullType,nullType,nullType,nullType,*this)
804  );
805  }
806  inline TRet callfunction( Int2Type<4>,TV1 arg1,TV2 arg2,TV3 arg3 )
807  {
808  return mFunctor( GetArg< TYPELIST(TV1,TV2,TV3,NullType,NullType,NullType),FirstType>::get(arg1,arg2,arg3,nullType,nullType,nullType,*this),
809  GetArg< TYPELIST(TV1,TV2,TV3,NullType,NullType,NullType),SecondType>::get(arg1,arg2,arg3,nullType,nullType,nullType,*this),
810  GetArg< TYPELIST(TV1,TV2,TV3,NullType,NullType,NullType),ThirdType>::get(arg1,arg2,arg3,nullType,nullType,nullType,*this),
811  GetArg< TYPELIST(TV1,TV2,TV3,NullType,NullType,NullType),FourthType>::get(arg1,arg2,arg3,nullType,nullType,nullType,*this)
812  );
813  }
814  inline TRet callfunction( Int2Type<4>,TV1 arg1,TV2 arg2,TV3 arg3,TV4 arg4 )
815  {
816  return mFunctor( GetArg< TYPELIST(TV1,TV2,TV3,TV4,NullType,NullType),FirstType>::get(arg1,arg2,arg3,arg4,nullType,nullType,*this),
817  GetArg< TYPELIST(TV1,TV2,TV3,TV4,NullType,NullType),SecondType>::get(arg1,arg2,arg3,arg4,nullType,nullType,*this),
818  GetArg< TYPELIST(TV1,TV2,TV3,TV4,NullType,NullType),ThirdType>::get(arg1,arg2,arg3,arg4,nullType,nullType,*this),
819  GetArg< TYPELIST(TV1,TV2,TV3,TV4,NullType,NullType),FourthType>::get(arg1,arg2,arg3,arg4,nullType,nullType,*this)
820  );
821  }
822  //total length == 5
823  inline TRet callfunction( Int2Type<5> )
824  {
825  return mFunctor(this->f1,this->f2,this->f3,this->f4,this->f5);
826  }
827 
828  inline TRet callfunction( Int2Type<5>,TV1 arg1 )
829  {
830  return mFunctor( GetArg< TYPELIST(TV1,NullType,NullType,NullType,NullType,NullType),FirstType>::get(arg1,nullType,nullType,nullType,nullType,nullType,*this),
831  GetArg< TYPELIST(TV1,NullType,NullType,NullType,NullType,NullType),SecondType>::get(arg1,nullType,nullType,nullType,nullType,nullType,*this),
832  GetArg< TYPELIST(TV1,NullType,NullType,NullType,NullType,NullType),ThirdType>::get(arg1,nullType,nullType,nullType,nullType,nullType,*this),
833  GetArg< TYPELIST(TV1,NullType,NullType,NullType,NullType,NullType),FourthType>::get(arg1,nullType,nullType,nullType,nullType,nullType,*this),
834  GetArg< TYPELIST(TV1,NullType,NullType,NullType,NullType,NullType),FifthType>::get(arg1,nullType,nullType,nullType,nullType,nullType,*this)
835  );
836  }
837  inline TRet callfunction( Int2Type<5>,TV1 arg1,TV2 arg2 )
838  {
839  return mFunctor( GetArg< TYPELIST(TV1,TV2,NullType,NullType,NullType,NullType),FirstType>::get(arg1,arg2,nullType,nullType,nullType,nullType,*this),
840  GetArg< TYPELIST(TV1,TV2,NullType,NullType,NullType,NullType),SecondType>::get(arg1,arg2,nullType,nullType,nullType,nullType,*this),
841  GetArg< TYPELIST(TV1,TV2,NullType,NullType,NullType,NullType),ThirdType>::get(arg1,arg2,nullType,nullType,nullType,nullType,*this),
842  GetArg< TYPELIST(TV1,TV2,NullType,NullType,NullType,NullType),FourthType>::get(arg1,arg2,nullType,nullType,nullType,nullType,*this),
843  GetArg< TYPELIST(TV1,TV2,NullType,NullType,NullType,NullType),FifthType>::get(arg1,arg2,nullType,nullType,nullType,nullType,*this)
844  );
845  }
846  inline TRet callfunction( Int2Type<5>,TV1 arg1,TV2 arg2, TV3 arg3 )
847  {
848  return mFunctor( GetArg< TYPELIST(TV1,TV2,TV3,NullType,NullType,NullType),FirstType>::get(arg1,arg2,arg3,nullType,nullType,nullType,*this),
849  GetArg< TYPELIST(TV1,TV2,TV3,NullType,NullType,NullType),SecondType>::get(arg1,arg2,arg3,nullType,nullType,nullType,*this),
850  GetArg< TYPELIST(TV1,TV2,TV3,NullType,NullType,NullType),ThirdType>::get(arg1,arg2,arg3,nullType,nullType,nullType,*this),
851  GetArg< TYPELIST(TV1,TV2,TV3,NullType,NullType,NullType),FourthType>::get(arg1,arg2,arg3,nullType,nullType,nullType,*this),
852  GetArg< TYPELIST(TV1,TV2,TV3,NullType,NullType,NullType),FifthType>::get(arg1,arg2,arg3,nullType,nullType,nullType,*this)
853  );
854  }
855  inline TRet callfunction( Int2Type<5>,TV1 arg1,TV2 arg2, TV3 arg3,TV4 arg4 )
856  {
857  return mFunctor( GetArg< TYPELIST(TV1,TV2,TV3,TV4,NullType,NullType),FirstType>::get(arg1,arg2,arg3,arg4,nullType,nullType,*this),
858  GetArg< TYPELIST(TV1,TV2,TV3,TV4,NullType,NullType),SecondType>::get(arg1,arg2,arg3,arg4,nullType,nullType,*this),
859  GetArg< TYPELIST(TV1,TV2,TV3,TV4,NullType,NullType),ThirdType>::get(arg1,arg2,arg3,arg4,nullType,nullType,*this),
860  GetArg< TYPELIST(TV1,TV2,TV3,TV4,NullType,NullType),FourthType>::get(arg1,arg2,arg3,arg4,nullType,nullType,*this),
861  GetArg< TYPELIST(TV1,TV2,TV3,TV4,NullType,NullType),FifthType>::get(arg1,arg2,arg3,arg4,nullType,nullType,*this)
862  );
863  }
864  inline TRet callfunction( Int2Type<5>,TV1 arg1,TV2 arg2, TV3 arg3,TV4 arg4,TV5 arg5 )
865  {
866  return mFunctor( GetArg< TYPELIST(TV1,TV2,TV3,TV4,TV5,NullType),FirstType>::get(arg1,arg2,arg3,arg4,arg5,nullType,*this),
867  GetArg< TYPELIST(TV1,TV2,TV3,TV4,TV5,NullType),SecondType>::get(arg1,arg2,arg3,arg4,arg5,nullType,*this),
868  GetArg< TYPELIST(TV1,TV2,TV3,TV4,TV5,NullType),ThirdType>::get(arg1,arg2,arg3,arg4,arg5,nullType,*this),
869  GetArg< TYPELIST(TV1,TV2,TV3,TV4,TV5,NullType),FourthType>::get(arg1,arg2,arg3,arg4,arg5,nullType,*this),
870  GetArg< TYPELIST(TV1,TV2,TV3,TV4,TV5,NullType),FifthType>::get(arg1,arg2,arg3,arg4,arg5,nullType,*this)
871  );
872  }
873 
874  //total length == 6
875  inline TRet callfunction( Int2Type<6> )
876  {
877  return mFunctor(this->f1,this->f2,this->f3,this->f4,this->f5,this->f6);
878  }
879 
880  inline TRet callfunction( Int2Type<6>,TV1 arg1 )
881  {
882  return mFunctor( GetArg< TYPELIST(TV1,NullType,NullType,NullType,NullType,NullType),FirstType>::get(arg1,nullType,nullType,nullType,nullType,nullType,*this),
883  GetArg< TYPELIST(TV1,NullType,NullType,NullType,NullType,NullType),SecondType>::get(arg1,nullType,nullType,nullType,nullType,nullType,*this),
884  GetArg< TYPELIST(TV1,NullType,NullType,NullType,NullType,NullType),ThirdType>::get(arg1,nullType,nullType,nullType,nullType,nullType,*this),
885  GetArg< TYPELIST(TV1,NullType,NullType,NullType,NullType,NullType),FourthType>::get(arg1,nullType,nullType,nullType,nullType,nullType,*this),
886  GetArg< TYPELIST(TV1,NullType,NullType,NullType,NullType,NullType),FifthType>::get(arg1,nullType,nullType,nullType,nullType,nullType,*this),
887  GetArg< TYPELIST(TV1,NullType,NullType,NullType,NullType,NullType),SixthType>::get(arg1,nullType,nullType,nullType,nullType,nullType,*this)
888  );
889  }
890 
891  inline TRet callfunction( Int2Type<6>,TV1 arg1,TV2 arg2 )
892  {
893  return mFunctor( GetArg< TYPELIST(TV1,TV2,NullType,NullType,NullType,NullType),FirstType>::get(arg1,arg2,nullType,nullType,nullType,nullType,*this),
894  GetArg< TYPELIST(TV1,TV2,NullType,NullType,NullType,NullType),SecondType>::get(arg1,arg2,nullType,nullType,nullType,nullType,*this),
895  GetArg< TYPELIST(TV1,TV2,NullType,NullType,NullType,NullType),ThirdType>::get(arg1,arg2,nullType,nullType,nullType,nullType,*this),
896  GetArg< TYPELIST(TV1,TV2,NullType,NullType,NullType,NullType),FourthType>::get(arg1,arg2,nullType,nullType,nullType,nullType,*this),
897  GetArg< TYPELIST(TV1,TV2,NullType,NullType,NullType,NullType),FifthType>::get(arg1,arg2,nullType,nullType,nullType,nullType,*this),
898  GetArg< TYPELIST(TV1,TV2,NullType,NullType,NullType,NullType),SixthType>::get(arg1,arg2,nullType,nullType,nullType,nullType,*this)
899  );
900  }
901  inline TRet callfunction( Int2Type<6>,TV1 arg1,TV2 arg2, TV3 arg3 )
902  {
903  return mFunctor( GetArg< TYPELIST(TV1,TV2,TV3,NullType,NullType,NullType),FirstType>::get(arg1,arg2,arg3,nullType,nullType,nullType,*this),
904  GetArg< TYPELIST(TV1,TV2,TV3,NullType,NullType,NullType),SecondType>::get(arg1,arg2,arg3,nullType,nullType,nullType,*this),
905  GetArg< TYPELIST(TV1,TV2,TV3,NullType,NullType,NullType),ThirdType>::get(arg1,arg2,arg3,nullType,nullType,nullType,*this),
906  GetArg< TYPELIST(TV1,TV2,TV3,NullType,NullType,NullType),FourthType>::get(arg1,arg2,arg3,nullType,nullType,nullType,*this),
907  GetArg< TYPELIST(TV1,TV2,TV3,NullType,NullType,NullType),FifthType>::get(arg1,arg2,arg3,nullType,nullType,nullType,*this),
908  GetArg< TYPELIST(TV1,TV2,TV3,NullType,NullType,NullType),SixthType>::get(arg1,arg2,arg3,nullType,nullType,nullType,*this)
909  );
910  }
911  inline TRet callfunction( Int2Type<6>,TV1 arg1,TV2 arg2, TV3 arg3,TV4 arg4 )
912  {
913  return mFunctor( GetArg< TYPELIST(TV1,TV2,TV3,TV4,NullType,NullType),FirstType>::get(arg1,arg2,arg3,arg4,nullType,nullType,*this),
914  GetArg< TYPELIST(TV1,TV2,TV3,TV4,NullType,NullType),SecondType>::get(arg1,arg2,arg3,arg4,nullType,nullType,*this),
915  GetArg< TYPELIST(TV1,TV2,TV3,TV4,NullType,NullType),ThirdType>::get(arg1,arg2,arg3,arg4,nullType,nullType,*this),
916  GetArg< TYPELIST(TV1,TV2,TV3,TV4,NullType,NullType),FourthType>::get(arg1,arg2,arg3,arg4,nullType,nullType,*this),
917  GetArg< TYPELIST(TV1,TV2,TV3,TV4,NullType,NullType),FifthType>::get(arg1,arg2,arg3,arg4,nullType,nullType,*this),
918  GetArg< TYPELIST(TV1,TV2,TV3,TV4,NullType,NullType),SixthType>::get(arg1,arg2,arg3,arg4,nullType,nullType,*this)
919  );
920  }
921 
922  inline TRet callfunction( Int2Type<6>,TV1 arg1,TV2 arg2, TV3 arg3,TV4 arg4,TV5 arg5 )
923  {
924  return mFunctor( GetArg< TYPELIST(TV1,TV2,TV3,TV4,TV5,NullType),FirstType>::get(arg1,arg2,arg3,arg4,arg5,nullType,*this),
925  GetArg< TYPELIST(TV1,TV2,TV3,TV4,TV5,NullType),SecondType>::get(arg1,arg2,arg3,arg4,arg5,nullType,*this),
926  GetArg< TYPELIST(TV1,TV2,TV3,TV4,TV5,NullType),ThirdType>::get(arg1,arg2,arg3,arg4,arg5,nullType,*this),
927  GetArg< TYPELIST(TV1,TV2,TV3,TV4,TV5,NullType),FourthType>::get(arg1,arg2,arg3,arg4,arg5,nullType,*this),
928  GetArg< TYPELIST(TV1,TV2,TV3,TV4,TV5,NullType),FifthType>::get(arg1,arg2,arg3,arg4,arg5,nullType,*this),
929  GetArg< TYPELIST(TV1,TV2,TV3,TV4,TV5,NullType),SixthType>::get(arg1,arg2,arg3,arg4,arg5,nullType,*this)
930  );
931  }
932  inline TRet callfunction( Int2Type<6>,TV1 arg1,TV2 arg2, TV3 arg3,TV4 arg4,TV5 arg5,TV4 arg6 )
933  {
934  return mFunctor( GetArg< TYPELIST(TV1,TV2,TV3,TV4,TV5,TV6),FirstType>::get(arg1,arg2,arg3,arg4,arg5,arg6,*this),
935  GetArg< TYPELIST(TV1,TV2,TV3,TV4,TV5,TV6),SecondType>::get(arg1,arg2,arg3,arg4,arg5,arg6,*this),
936  GetArg< TYPELIST(TV1,TV2,TV3,TV4,TV5,TV6),ThirdType>::get(arg1,arg2,arg3,arg4,arg5,arg6,*this),
937  GetArg< TYPELIST(TV1,TV2,TV3,TV4,TV5,TV6),FourthType>::get(arg1,arg2,arg3,arg4,arg5,arg6,*this),
938  GetArg< TYPELIST(TV1,TV2,TV3,TV4,TV5,TV6),FifthType>::get(arg1,arg2,arg3,arg4,arg5,arg6,*this),
939  GetArg< TYPELIST(TV1,TV2,TV3,TV4,TV5,TV6),SixthType>::get(arg1,arg2,arg3,arg4,arg5,arg6,*this)
940  );
941  }
942 
943 
944  template <class U>
945  bool _equality( Int2Type<false>,const U&) const
946  {
947  return false;
948  }
949  bool _equality( Int2Type<true >,const Linker<F,TRet,TListVariable,TListPos>& ob2) const
950  {
951  const Linker_Base<TListPos,totallength>& obAux = ob2;
952  return mel::mpl::equal<true>( mFunctor, ob2.mFunctor )
953  &&
955 
956  //Linker_Base<TListPos,totallength>::operator ==( (const Linker_Base<TListPos,totallength>&)ob2 );
957  }
958 
959 
960  };
961 
962  template <class TRet,class TVariableList,class Arg1, class T>
963  Linker< T,TRet,TVariableList,TYPELIST(Arg1)> linkFunctor( T functor,Arg1 arg1)
964  {
965  return Linker< T,TRet,TVariableList,TYPELIST(Arg1) >( functor,arg1 );
966 
967  }
968  template <class TRet,class TVariableList,class Arg1, class Arg2,class T>
969  Linker< T,TRet,TVariableList,TYPELIST(Arg1,Arg2)> linkFunctor( T functor,Arg1 arg1, Arg2 arg2)
970  {
971  return Linker< T,TRet,TVariableList,TYPELIST(Arg1,Arg2) >( functor,arg1,arg2 );
972  }
973 
974  template <class TRet,class TVariableList,class Arg1,class Arg2,class Arg3,class T>
975  Linker< T,TRet,TVariableList,TYPELIST(Arg1,Arg2,Arg3)> linkFunctor( T functor,Arg1 arg1,Arg2 arg2,Arg3 arg3)
976  {
977  return Linker< T,TRet,TVariableList,TYPELIST(Arg1,Arg2,Arg3) >( functor,arg1,arg2,arg3 );
978 
979  }
980  template <class TRet,class TVariableList,class Arg1,class Arg2,class Arg3,class Arg4,class T>
981  Linker< T,TRet,TVariableList,TYPELIST(Arg1,Arg2,Arg3,Arg4)> linkFunctor( T functor,Arg1 arg1,Arg2 arg2,Arg3 arg3,Arg4 arg4)
982  {
983  return Linker< T,TRet,TVariableList,TYPELIST(Arg1,Arg2,Arg3,Arg4) >( functor,arg1,arg2,arg3,arg4 );
984 
985  }
986  template <class TRet,class TVariableList,class Arg1,class Arg2,class Arg3,class Arg4,class Arg5,class T>
987  Linker< T,TRet,TVariableList,TYPELIST(Arg1,Arg2,Arg3,Arg4,Arg5)> linkFunctor( T functor,Arg1 arg1,Arg2 arg2,Arg3 arg3,Arg4 arg4,Arg5 arg5)
988  {
989  return Linker< T,TRet,TVariableList,TYPELIST(Arg1,Arg2,Arg3,Arg4,Arg5) >( functor,arg1,arg2,arg3,arg4,arg5 );
990 
991  }
992  template <class TRet,class TVariableList,class Arg1,class Arg2,class Arg3,class Arg4,class Arg5,class Arg6,class T>
993  Linker< T,TRet,TVariableList,TYPELIST(Arg1,Arg2,Arg3,Arg4,Arg5,Arg6)> linkFunctor( T functor,Arg1 arg1,Arg2 arg2,Arg3 arg3,Arg4 arg4,Arg5 arg5, Arg6 arg6)
994  {
995 
996  return Linker< T,TRet,TVariableList,TYPELIST(Arg1,Arg2,Arg3,Arg4,Arg5,Arg6) >( functor,arg1,arg2,arg3,arg4,arg5,arg6 );
997 
998  }
999 
1000  /*problema TVariableList solo representa la parte no-fija,es decir, en lo que queda la funcion,
1001  y por tanto no equivale al V1,V2,..
1002  */
1003  //TODO la idea es despu�s que donde en TListVariable haya un NullType se ignore
1004  /* template <class TRet,class Arg1, class Arg2>
1005  Linker< TRet (*)(typename _if< Conversion<Arg1,VariablePosBase>::exists,NullType,Arg1>::Result
1006  ,typename _if< Conversion<Arg2,VariablePosBase>::exists,NullType,Arg2>::Result)
1007  ,TRet,TYPELIST( (typename _if< Conversion<Arg1,VariablePosBase>::exists,NullType,Arg1>::Result)
1008  ,(typename _if< Conversion<Arg2,VariablePosBase>::exists,NullType,Arg2>::Result)
1009  ),
1010  TYPELIST(Arg1,Arg2)> link( TRet (*f)(typename _if< Conversion<Arg1,VariablePosBase>::exists,NullType,Arg1>::Result,
1011  typename _if< Conversion<Arg2,VariablePosBase>::exists,NullType,Arg2>::Result),Arg1 arg1, Arg2 arg2)
1012  {
1013  // return Linker< TRet (*)(V1,V2),TRet,TYPELIST(V1,V2),TYPELIST(Arg1,Arg2) >( f,arg1,arg2 );
1014  }
1015  */
1016  /* template <class TRet,class Arg1, class Arg2>
1017  Linker< TRet (*)(_if< Conversion<Arg1,VariablePosBase>::exists,NullType,Arg1>::Result
1018  ,_if< Conversion<Arg2,VariablePosBase>::exists,NullType,Arg2>::Result),TRet,TYPELIST(V1,V2),TYPELIST(Arg1,Arg2)> link( TRet (*f)(V1,V2),Arg1 arg1, Arg2 arg2)
1019  {
1020  return Linker< TRet (*)(V1,V2),TRet,TYPELIST(V1,V2),TYPELIST(Arg1,Arg2) >( f,arg1,arg2 );
1021  }
1022  */
1023 
1024 
1025 
1026  }
1027 
1028 }
Typical Traits for types.
Definition: LinkArgs.h:78
Definition: LinkArgs.h:99
Definition: LinkArgs.h:119
Definition: LinkArgs.h:140
Definition: LinkArgs.h:162
Definition: LinkArgs.h:183
Definition: LinkArgs.h:210
Definition: LinkArgs.h:235
Definition: LinkArgs.h:271
Definition: LinkArgs.h:318
Definition: LinkArgs.h:375
Definition: LinkArgs.h:444
Definition: LinkArgs.h:202
Definition: LinkArgs.h:485
Definition: BasicTypes.h:7
Definition: TypeTraits.h:296
Small operator==(const AnyType &, const AnyType &)
FunctorWrapper< F, R > functorWrapper(F f)
helper function for argument deduction
Definition: LinkArgs.h:52
Definition: Callback_Impl.h:11
Definition: _If.h:16
Definition: Conversion.h:14
Definition: BasicTypes.h:9
Definition: LinkArgs.h:36
Definition: Int2Type.h:12
Definition: LinkArgs.h:63
Definition: LinkArgs.h:65
Definition: Element.h:13
Definition: Length.h:11
Definition: TypeList.h:17