MEL
Microthread & Execution library
TypeTraits.h
Go to the documentation of this file.
1 #pragma once
7 #include <mpl/BasicTypes.h>
9 
10 #include <mpl/_If.h>
11 using mel::mpl::_if;
12 #include <mpl/CommonTypes.h>
13 #include <type_traits> //TODO tratar de no meterlo porque pa eso ya este archivo sobrar�a en gran parte
14 
15 namespace mel
16 {
17  namespace mpl
18  {
19  template <class U>
21  {
22  enum{ result = false };
23  typedef NullType PointeeType; //tipo del contenido
24  };
25  template <class U>
26  struct PointerTraits<U*>
27  {
28  enum{ result = true };
29  typedef U PointeeType; //tipo del contenido
30  };
31  template <class U>
32  struct PointerTraits<U*&>
33  {
34  enum { result = true };
35  typedef U PointeeType; //tipo del contenido
36  };
37  template <class U>
39  {
40  enum{ result = false };
41  };
42  template <class U,class V>
43  struct PointerToMemberTraits< U V::*>
44  {
45  enum{ result = true };
46  };
47  //traits to know if T is c function. Done without much time, sure should be better done
48  template <class U>
50  {
51  enum{result=false};
52  };
53  template <class U>
54  struct FunctionPointerTraits< U(void) >
55  {
56  enum { result = true };
57  };
58  template <class U, class Arg1>
59  struct FunctionPointerTraits< U(Arg1) >
60  {
61  enum { result = true };
62  };
63  template <class U, class Arg1, class Arg2>
64  struct FunctionPointerTraits< U(Arg1, Arg2) >
65  {
66  enum { result = true };
67  };
68  template <class U, class Arg1, class Arg2,class Arg3>
69  struct FunctionPointerTraits< U(Arg1, Arg2,Arg3) >
70  {
71  enum { result = true };
72  };
73  template <class U, class Arg1, class Arg2, class Arg3,class Arg4>
74  struct FunctionPointerTraits< U(Arg1, Arg2, Arg3, Arg4) >
75  {
76  enum { result = true };
77  };
78  template <class U, class Arg1, class Arg2, class Arg3, class Arg4,class Arg5>
79  struct FunctionPointerTraits< U(Arg1, Arg2, Arg3, Arg4, Arg5) >
80  {
81  enum { result = true };
82  };
83  template <class U, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6>
84  struct FunctionPointerTraits< U(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6) >
85  {
86  enum { result = true };
87  };
88  template <class U, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6,class Arg7>
89  struct FunctionPointerTraits< U(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7) >
90  {
91  enum { result = true };
92  };
93  template <class U, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Arg7,class Arg8>
94  struct FunctionPointerTraits< U(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7,Arg8) >
95  {
96  enum { result = true };
97  };
98  template <class U> struct ReferenceTraits
99  {
100  enum { result = false };
101  typedef const U& ReferenceType;
102  };
103  template <class U> struct ReferenceTraits<U&>
104  {
105  enum { result = true };
106  typedef U& ReferenceType;
107  };
108  template <> struct ReferenceTraits<void>
109  {
110  enum { result = false };
111  typedef void ReferenceType;
112  };
113 
114  template <class U>
115  struct UnConst
116  {
117  typedef U Result;
118  enum {isConst = false};
119  };
120  template <class U>
121  struct UnConst<const U>
122  {
123  typedef U Result;
124  enum {isConst = true};
125  };
126  template <class U>
127  struct UnConst<const U&>
128  {
129  typedef U& Result;
130  enum {isConst = true};
131  };
132  //desreferencia el tipo
133  template <class U> struct UnRef
134  {
135  typedef U Result;
136  };
137  template <class U> struct UnRef<U&>
138  {
139  typedef U Result;
140  };
141  template <class U>
142  struct IsConst
143  {
144  enum { result = false};
145  };
146  template <class U>
147  struct IsConst<U const>
148  {
149  enum { result = true};
150  };
151 
152  template <class U>
153  struct IntTraits
154  {
155  enum { result = false };
156  };
157  template <>
158  struct IntTraits<int>
159  {
160  enum { result = true };
161  };
162  template <class U>
163  struct UIntTraits
164  {
165  enum { result = false };
166  };
167  template <>
168  struct UIntTraits<unsigned int>
169  {
170  enum { result = true };
171  };
172  template <class U>
173  struct BoolTraits
174  {
175  enum { result = false };
176  };
177  template <>
178  struct BoolTraits<bool>
179  {
180  enum { result = true };
181  };
182  template <class U>
183  struct CharTraits
184  {
185  enum { result = false };
186  };
187  template <>
188  struct CharTraits<char>
189  {
190  enum { result = true };
191  };
192  template <class U>
193  struct UCharTraits
194  {
195  enum { result = false };
196  };
197  template <>
198  struct UCharTraits<unsigned char>
199  {
200  enum { result = true };
201  };
202  template <class U>
203  struct FloatTraits
204  {
205  enum { result = false };
206  };
207  template <>
208  struct FloatTraits<float>
209  {
210  enum { result = true };
211  };
212  template <class U>
214  {
215  enum { result = false };
216  };
217  template <>
218  struct DoubleTraits<double>
219  {
220  enum { result = true };
221  };
222 
223  template <class U>
224  struct VoidTraits
225  {
226  enum { result = false };
227  };
228  template <>
229  struct VoidTraits< void >
230  {
231  enum { result = true };
232  };
233 
234  template<class U>
236  {
237  typedef U Result;
238  };
239  template <class U>
240  struct VolatileTraits<U volatile>
241  {
242  typedef U Result;
243  };
244 
245  //COMPRUEBA SI LA CLASE TIENE DEFINIDO EL operator==
246  //TODAVIA MUY TEMPORAL HASTA TENER METODO GENERALIZADO
248  /* template <class T> struct ComparableTraits
249  {
250  template <class U, bool (U::*)(const U&) const> struct AUXSTRUCT{};
251  typedef char Small;
252  class Big{ char dummy[2];};
253  template <class U> static Small check( AUXSTRUCT< U,&U::operator== >* );
254  template <class U> static Big check( ... );
255 
256  enum{ Result = ( TypeTraits<T>::isIntegral ||
257  TypeTraits<T>::isPointerToMember ||
258  TypeTraits<T>::isFloating || TypeTraits<T>::isPointer
259  || sizeof( check<T>(0)) == sizeof(Small) ) };
260 
261  };
262  */
263  //sigue habiendo el problema en XCode del == deleted
264  //template<class T1, class T2> Small operator==(const T1&, const T2&); //define default operator==
265  Small operator==(const AnyType&, const AnyType&); //define default operator==
266  // template<class T> Small operator==(const T&, const T&); //define default operator==
267  template <class U>
269  {
270  static const U& x;
271  static Small comparablecheck( const Small& );
272  static Big comparablecheck( ... );
273  enum { result = (sizeof(comparablecheck(x == x)) == sizeof(Big)) };
274  };
275  /* template <class U>
276  struct ComparableTraits<U *>
277  {
278  enum { result = true };
279  };*/
280 
281  /* template <class U> struct ComparableTraits<U,false>
282  {
283  enum { result = false };
284  //enum { result = (sizeof(comparablecheck( x.operator==(x))) == sizeof(Big)) };
285  };*/
286  template <class T>
287  struct ClassTraits
288  {
289  template <typename U> static Small isClass( int U::* );
290  template <typename U> static Big isClass( ... );
291  enum{ result = (sizeof( isClass<T>(0) ) == sizeof(Small) )};
292  };
293 
294  template <class T>
296  {
297 
298  public:
299  enum{ isPointer = PointerTraits<T>::result };
300  enum { isPointerToMember = PointerToMemberTraits<T>::result };
301  enum { isInt = IntTraits<T>::result };
302  enum { isUInt = UIntTraits<T>::result };
303  enum { isBool = BoolTraits<T>::result };
304  enum { isChar = CharTraits<T>::result };
305  enum { isUChar = UCharTraits<T>::result };
306  enum { isIntegral = isInt || isUInt };
307  enum { isByte = isChar || isUChar || isBool };
308  enum { isFloat = FloatTraits<T>::result };
309  enum { isDouble = DoubleTraits<T>::result };
310  enum { isFloating = isFloat ||isDouble };
311 
312  enum { isArith = isIntegral || isFloating };
313  enum { isVoid = VoidTraits<T>::result };
314  enum { isFundamental = isArith ||isVoid };
315  enum { isClass = ClassTraits<T>::result };
316  //enum { isConst = UnConst<T>::isConst };
317  enum { isConst = IsConst<T>::result };
318  enum { isReference = ReferenceTraits<T>::result };
319  enum {isFunction = FunctionPointerTraits<T>::result};
321  typedef typename UnConst<T>::Result NoConst;
322 
323  //quiero una forma de que me de la referencia sin que me ponga el const
324  //typedef typename _if< isByte || isPointer || isArith || isPointerToMember || isReference ||isPointer,T,typename ReferenceTraits<T>::ReferenceType >::Result ParameterType; //mejor parametro para pasar a funciones. Recordad que pone el const en las referencias
325  //metodo no totalmente preciso pero valido casi siempre
326  typedef typename _if< (isClass && sizeof(typename std::decay<T>::type)<= sizeof(int))||!isClass,T,typename ReferenceTraits<T>::ReferenceType >::Result ParameterType; //mejor parametro para pasar a funciones. Recordad que pone el const en las referencias
327  // typedef typename _if< (isClass && sizeof(T)<= sizeof(int))||!isClass,T,T& >::Result ReturnType; //para retorno de funciones. CREO QUE NO LO TENGO BIEN;LO HICE A PRISA
328  //TODO no v�lido para T == void
329  // cuidado si tenemos un struct vacio da sizeof = 1, pero llamar� a constructor de copia(si hay...)typedef typename _if< sizeof(T) <= sizeof(int),T,typename ReferenceTraits<T>::ReferenceType >::Result ParameterType;
330 
331  typedef typename UnRef<T>::Result UnReferenced;
332 
333  };
334  }
335  //::mpl::Small operator==(const mel::mpl::AnyType&, const mel::mpl::AnyType&); //define default operator==
336 }
Common useful types used in mpl.
Definition: CommonTypes.h:11
Definition: BasicTypes.h:7
Definition: CommonTypes.h:10
Definition: TypeTraits.h:296
Small operator==(const AnyType &, const AnyType &)
Definition: Callback_Impl.h:11
Definition: _If.h:16
Definition: CommonTypes.h:13
Definition: TypeTraits.h:174
Definition: TypeTraits.h:184
Definition: TypeTraits.h:288
Definition: TypeTraits.h:269
Definition: TypeTraits.h:214
Definition: TypeTraits.h:204
Definition: TypeTraits.h:50
Definition: TypeTraits.h:154
Definition: TypeTraits.h:143
Definition: TypeTraits.h:39
Definition: TypeTraits.h:21
Definition: TypeTraits.h:99
Definition: TypeTraits.h:194
Definition: TypeTraits.h:164
Definition: TypeTraits.h:116
Definition: TypeTraits.h:134
Definition: TypeTraits.h:225
Definition: TypeTraits.h:236