MEL
Microthread & Execution library
Tuple.h
1 #pragma once
2 #include <mpl/typelist/TypeList.h>
3 #include <mpl/TypeTraits.h>
5 
6 #include <mpl/typelist/Sort.h>
8 
9 #define OPTIMIZE_TUPLE_SIZE 1
10 namespace mel
11 {
12  namespace mpl
13  {
26  namespace _private
27  {
28  template <class TListPos,class TListSorted,int size> class Tuple_Base;
29  template <class T,int n> class Component;
30  #define MAKE_COMPONENT( N ) \
31  template <class T> class Component<T,N> \
32  { \
33  typedef typename TypeTraits< T >::ParameterType TArgRef; \
34  protected: \
35  Component(){}\
36  Component( TArgRef arg):mArg( arg ){}; \
37  T mArg; \
38  };
39 
40  MAKE_COMPONENT(0)
41  MAKE_COMPONENT(1)
42  MAKE_COMPONENT(2)
43  MAKE_COMPONENT(3)
44  MAKE_COMPONENT(4)
45  MAKE_COMPONENT(5)
46  MAKE_COMPONENT(6)
47  MAKE_COMPONENT(7)
48  #if OPTIMIZE_TUPLE_SIZE == 1
49 
50  //TODO FORMA CHAPUCERA TEMPORAL
51  //helper class to sort by size
52  template <class T> struct PackCondition
53  {
54  enum {result = -(int)sizeof(T)};
55  };
56  #else
57  template <class T> struct PackCondition
58  {
59  enum {result = 0};
60  };
61  #endif
62 
63 
64  //TODO resolver el tema de tipo void
65  /*template <> class Component1<void>
66  {
67 
68  };*/
69  //one element tuple
70  template <class TTypes,class SortedTypes> class Tuple_Base<TTypes,SortedTypes,1> :
71  public Component<typename Element<typename SortedTypes::Sorted,0,true>::Result,0 >
72  {
73  protected:
74 
75  typedef typename Element<TTypes,0,true>::Result TArg;
76 
78  Tuple_Base(){}
80  };
81 
82  template <class TTypes,class SortedTypes> class Tuple_Base<TTypes,SortedTypes,2> :
83  public Component<typename Element<typename SortedTypes::Sorted,0,true>::Result,0 >,
84  public Component<typename Element<typename SortedTypes::Sorted,1,true>::Result,1 >
85  {
86  protected:
87 
88  typedef typename Element<TTypes,0,true>::Result TArg1;
89  typedef typename Element<TTypes,1,true>::Result TArg2;
90 
93  Tuple_Base(){}
96  };
97 
98  template <class TTypes,class SortedTypes> class Tuple_Base<TTypes,SortedTypes,3> :
99  public Component<typename Element<typename SortedTypes::Sorted,0,true>::Result,0 >,
100  public Component<typename Element<typename SortedTypes::Sorted,1,true>::Result,1 >,
101  public Component<typename Element<typename SortedTypes::Sorted,2,true>::Result,2 >
102  {
103  protected:
104 
105  typedef typename Element<TTypes,0,true>::Result TArg1;
106  typedef typename Element<TTypes,1,true>::Result TArg2;
107  typedef typename Element<TTypes,2,true>::Result TArg3;
108 
112 
113  Tuple_Base(){}
114  Tuple_Base( TArg1Ref arg1, TArg2Ref arg2,TArg3Ref arg3 ):
118  };
119 
120  template <class TTypes,class SortedTypes> class Tuple_Base<TTypes,SortedTypes,4> :
121  public Component<typename Element<typename SortedTypes::Sorted,0,true>::Result,0 >,
122  public Component<typename Element<typename SortedTypes::Sorted,1,true>::Result,1 >,
123  public Component<typename Element<typename SortedTypes::Sorted,2,true>::Result,2 >,
124  public Component<typename Element<typename SortedTypes::Sorted,3,true>::Result,3 >
125  {
126  protected:
127 
128  typedef typename Element<TTypes,0,true>::Result TArg1;
129  typedef typename Element<TTypes,1,true>::Result TArg2;
130  typedef typename Element<TTypes,2,true>::Result TArg3;
131  typedef typename Element<TTypes,3,true>::Result TArg4;
132 
137 
138  Tuple_Base(){}
139  Tuple_Base( TArg1Ref arg1, TArg2Ref arg2,TArg3Ref arg3,TArg4Ref arg4):
144  };
145  template <class TTypes,class SortedTypes> class Tuple_Base<TTypes,SortedTypes,5> :
146  public Component<typename Element<typename SortedTypes::Sorted,0,true>::Result,0 >,
147  public Component<typename Element<typename SortedTypes::Sorted,1,true>::Result,1 >,
148  public Component<typename Element<typename SortedTypes::Sorted,2,true>::Result,2 >,
149  public Component<typename Element<typename SortedTypes::Sorted,3,true>::Result,3 >,
150  public Component<typename Element<typename SortedTypes::Sorted,4,true>::Result,4 >
151  {
152  protected:
153 
154  typedef typename Element<TTypes,0,true>::Result TArg1;
155  typedef typename Element<TTypes,1,true>::Result TArg2;
156  typedef typename Element<TTypes,2,true>::Result TArg3;
157  typedef typename Element<TTypes,3,true>::Result TArg4;
158  typedef typename Element<TTypes,4,true>::Result TArg5;
159 
165 
166  Tuple_Base(){}
167  Tuple_Base( TArg1Ref arg1, TArg2Ref arg2,TArg3Ref arg3,TArg4Ref arg4,
168  TArg5Ref arg5):
174  };
175  template <class TTypes,class SortedTypes> class Tuple_Base<TTypes,SortedTypes,6> :
176  public Component<typename Element<typename SortedTypes::Sorted,0,true>::Result,0 >,
177  public Component<typename Element<typename SortedTypes::Sorted,1,true>::Result,1 >,
178  public Component<typename Element<typename SortedTypes::Sorted,2,true>::Result,2 >,
179  public Component<typename Element<typename SortedTypes::Sorted,3,true>::Result,3 >,
180  public Component<typename Element<typename SortedTypes::Sorted,4,true>::Result,4 >,
181  public Component<typename Element<typename SortedTypes::Sorted,5,true>::Result,5 >
182  {
183  protected:
184 
185  typedef typename Element<TTypes,0,true>::Result TArg1;
186  typedef typename Element<TTypes,1,true>::Result TArg2;
187  typedef typename Element<TTypes,2,true>::Result TArg3;
188  typedef typename Element<TTypes,3,true>::Result TArg4;
189  typedef typename Element<TTypes,4,true>::Result TArg5;
190  typedef typename Element<TTypes,5,true>::Result TArg6;
191 
198 
199  Tuple_Base(){}
200  Tuple_Base( TArg1Ref arg1, TArg2Ref arg2,TArg3Ref arg3,TArg4Ref arg4,
201  TArg5Ref arg5,TArg6Ref arg6):
208  };
209  template <class TTypes,class SortedTypes> class Tuple_Base<TTypes,SortedTypes,7> :
210  public Component<typename Element<typename SortedTypes::Sorted,0,true>::Result,0 >,
211  public Component<typename Element<typename SortedTypes::Sorted,1,true>::Result,1 >,
212  public Component<typename Element<typename SortedTypes::Sorted,2,true>::Result,2 >,
213  public Component<typename Element<typename SortedTypes::Sorted,3,true>::Result,3 >,
214  public Component<typename Element<typename SortedTypes::Sorted,4,true>::Result,4 >,
215  public Component<typename Element<typename SortedTypes::Sorted,5,true>::Result,5 >,
216  public Component<typename Element<typename SortedTypes::Sorted,6,true>::Result,6 >
217  {
218  protected:
219 
220  typedef typename Element<TTypes,0,true>::Result TArg1;
221  typedef typename Element<TTypes,1,true>::Result TArg2;
222  typedef typename Element<TTypes,2,true>::Result TArg3;
223  typedef typename Element<TTypes,3,true>::Result TArg4;
224  typedef typename Element<TTypes,4,true>::Result TArg5;
225  typedef typename Element<TTypes,5,true>::Result TArg6;
226  typedef typename Element<TTypes,6,true>::Result TArg7;
227 
235 
236  Tuple_Base(){}
237  Tuple_Base( TArg1Ref arg1, TArg2Ref arg2,TArg3Ref arg3,TArg4Ref arg4,
238  TArg5Ref arg5,TArg6Ref arg6,TArg7Ref arg7):
246  };
247 
248  } //End namespace private
249 
250 
251  template <class TTypes > class Tuple : public _private::Tuple_Base< TTypes,typename mel::mpl::typelist::Sort<TTypes,_private::PackCondition>::Result, Length<TTypes>::result >
252  {
253  enum{ totallength = Length<TTypes>::result};
256 
257  typedef typename Element<TTypes,0,true>::Result TArg1;
258  typedef typename Element<TTypes,1,true>::Result TArg2;
259  typedef typename Element<TTypes,2,true>::Result TArg3;
260  typedef typename Element<TTypes,3,true>::Result TArg4;
261  typedef typename Element<TTypes,4,true>::Result TArg5;
262  typedef typename Element<TTypes,5,true>::Result TArg6;
263  typedef typename Element<TTypes,6,true>::Result TArg7;
264 
265 
273 
274  public:
275  Tuple(){};
276  Tuple( TArg1Ref arg1 ):BaseClass( arg1 ){}
277  Tuple( TArg1Ref arg1,TArg2Ref arg2 ):BaseClass( arg1, arg2 ){}
278  Tuple( TArg1Ref arg1,TArg2Ref arg2, TArg3Ref arg3 ):BaseClass( arg1, arg2,arg3 ){}
279  Tuple( TArg1Ref arg1,TArg2Ref arg2, TArg3Ref arg3, TArg4Ref arg4 ):BaseClass( arg1, arg2,arg3,arg4 ){}
280  Tuple( TArg1Ref arg1,TArg2Ref arg2, TArg3Ref arg3, TArg4Ref arg4, TArg5Ref arg5):BaseClass( arg1, arg2,arg3,arg4,arg5 ){}
281  Tuple( TArg1Ref arg1,TArg2Ref arg2, TArg3Ref arg3, TArg4Ref arg4, TArg5Ref arg5,TArg6Ref arg6):BaseClass( arg1, arg2,arg3,arg4,arg5,arg6 ){}
282  Tuple( TArg1Ref arg1,TArg2Ref arg2, TArg3Ref arg3, TArg4Ref arg4, TArg5Ref arg5,TArg6Ref arg6,TArg7Ref arg7):BaseClass( arg1, arg2,arg3,arg4,arg5,arg6,arg7 ){}
283 
284  //component selection (0 base index)
285 
286  //TODO esto de la referencia no puede estar bien tan a la ligera. �QU� pasa con los atributos que ya son referencia?
287  template <int n> inline
288  typename Element<TTypes,n,true>::Result& get()
289  {
290  typedef typename Element<typename SortedTypes::Indexes,n,true>::Result CurrentElement;
291  return _private::Component<typename Element<TTypes,n,true>::Result,CurrentElement::value>::mArg;
292  }
293  //const version
294  template <int n> inline
295  const typename Element<TTypes,n,true>::Result& get() const
296  {
297  typedef typename Element<typename SortedTypes::Indexes,n,true>::Result CurrentElement;
298  return _private::Component<typename Element<TTypes,n,true>::Result,CurrentElement::value>::mArg;
299  }
300 
301  /*
302  NO ME CONVENCE EL SET YA QUE NO ES NECESARIO
303  template <int n> inline void set( typename TypeTraits< typename Element<TTypes,n,true>::Result>::ParameterType arg )
304  {
305  typedef typename Element<typename SortedTypes::Indexes,n,true>::Result CurrentElement;
306  Component<typename Element<TTypes,n,true>::Result,CurrentElement::value>::mArg = arg;
307  }
308  */
309 
310 
311 
312  };
313 
314  /*
315  NO USAR TODAVIA POR TEMAS DE REFERENCIAS EN PARAMETROS
316  template <class T1> Tuple< TYPELIST( T1 ) > makeTuple( T1 arg)
317  {
318  return Tuple< TYPELIST( T1 ) >( arg );
319  }
320  template <class T1,class T2> Tuple< TYPELIST( T1, T2 ) > makeTuple( T1 arg1, T2 arg2)
321  {
322  return Tuple< TYPELIST( T1,T2 ) >( arg1,arg2 );
323  }
324 
325  template <class T1,class T2,class T3> Tuple< TYPELIST( T1, T2,T3 ) > makeTuple( T1 arg1, T2 arg2,T3 arg3)
326  {
327  return Tuple< TYPELIST( T1,T2,T3 ) >( arg1,arg2,arg3 );
328  }
329  template <class T1,class T2,class T3,class T4> Tuple< TYPELIST( T1, T2,T3,T4 ) > makeTuple( T1 arg1, T2 arg2,T3 arg3,T4 arg4 )
330  {
331  return Tuple< TYPELIST( T1,T2,T3,T4 ) >( arg1,arg2,arg3,arg4 );
332  }
333  template <class T1,class T2,class T3,class T4,class T5> Tuple< TYPELIST( T1, T2,T3,T4,T5 ) > makeTuple( T1 arg1, T2 arg2,T3 arg3,T4 arg4,T5 arg5 )
334  {
335  return Tuple< TYPELIST( T1,T2,T3,T4,T5 ) >( arg1,arg2,arg3,arg4,arg5 );
336  }
337  template <class T1,class T2,class T3,class T4,class T5,class T6> Tuple< TYPELIST( T1, T2,T3,T4,T5,T6 ) > makeTuple( T1 arg1, T2 arg2,T3 arg3,T4 arg4,T5 arg5,T6 arg6 )
338  {
339  return Tuple< TYPELIST( T1,T2,T3,T4,T5,T6 ) >( arg1,arg2,arg3,arg4,arg5,arg6 );
340  }
341  */
342 
343  }
344 }
Typical Traits for types.
Definition: Tuple.h:29
Definition: Tuple.h:28
Definition: BasicTypes.h:7
Definition: Tuple.h:252
Definition: Callback_Impl.h:11
Definition: Tuple.h:53
Definition: Element.h:13
Definition: Length.h:11
Definition: Sort.h:68
Definition: Sort.h:21
Definition: TypeList.h:17