46 #ifndef Shards_TypeList_hpp
47 #define Shards_TypeList_hpp
68 template<
typename T1,
typename T2>
72 struct SameType<T,T> {
enum { value =
true }; };
76 struct TypeListEnd {};
85 template<
typename Value ,
class Tail = TypeListEnd >
struct TypeList {};
96 {
enum { value = 0 }; };
98 template<
typename Value ,
class Tail >
99 struct TypeListLength< TypeList< Value , Tail > >
100 {
enum { value = 1 + TypeListLength< Tail >::value }; };
108 template<
class ListType,
unsigned ordinal >
struct TypeListAt {};
110 template<
unsigned ordinal >
112 {
typedef TypeListEnd type ; };
114 template<
typename Value ,
class Tail >
115 struct TypeListAt< TypeList< Value , Tail > , 0 >
116 {
typedef Value type ; };
118 template<
typename Value ,
class Tail ,
unsigned ordinal >
119 struct TypeListAt< TypeList< Value , Tail > , ordinal >
120 {
typedef typename TypeListAt< Tail , ordinal - 1 >::type type ; };
129 template<
class ListType ,
typename TestValue ,
unsigned ordinal = 0 >
132 template<
typename TestValue ,
unsigned ordinal >
138 template<
typename Value ,
class Tail ,
typename TestValue ,
unsigned ordinal >
139 struct TypeListIndex< TypeList< Value , Tail > , TestValue , ordinal >
142 enum { match = SameType< Value , TestValue >::value };
143 enum { J = match && 0 < ordinal ? ordinal - 1 : ordinal };
144 enum { N = TypeListIndex< Tail , TestValue , J >::value };
146 enum { value = match && 0 == ordinal ? 0 : ( -1 == N ? -1 : N + 1 ) };
155 template<
class ListType ,
typename TestValue >
158 template<
typename TestValue >
160 {
enum { value = 0 }; };
162 template<
typename Value ,
class Tail ,
typename TestValue >
163 struct TypeListCount< TypeList< Value , Tail > , TestValue >
165 enum { value = TypeListCount< Tail , TestValue >::value +
166 ( SameType< Value , TestValue >::value ? 1 : 0 ) };
176 template<
typename TestValue >
178 {
enum { value =
false }; };
180 template<
typename Value ,
class Tail ,
typename TestValue >
181 struct TypeListMember< TypeList< Value , Tail > , TestValue >
183 enum { value = SameType< Value , TestValue >::value ||
184 TypeListMember< Tail , TestValue >::value };
196 {
enum { value =
true }; };
198 template<
typename Value ,
class Tail >
199 struct TypeListUnique< TypeList< Value , Tail > >
201 enum { value = ! TypeListMember< Tail , Value >::value &&
202 TypeListUnique< Tail >::value };
213 template<
class ListB >
215 {
enum { value =
true }; };
217 template<
typename Value ,
class Tail ,
class ListB >
218 struct TypeListDisjoint< TypeList< Value , Tail > , ListB >
220 enum { value = ! TypeListMember< ListB , Value >::value &&
221 TypeListDisjoint< Tail , ListB >::value };
233 {
typedef TypeListEnd type ; };
235 template<
typename Value ,
class Tail >
236 struct TypeListFirst< TypeList< Value , Tail > >
237 {
typedef Value type ; };
248 {
typedef TypeListEnd type ; };
250 template<
typename Value >
251 struct TypeListLast< TypeList< Value , TypeListEnd > >
252 {
typedef Value type ; };
254 template<
typename Value ,
class Tail >
255 struct TypeListLast< TypeList< Value , Tail > >
256 {
typedef typename TypeListLast< Tail >::type type ; };
267 {
typedef TypeListEnd type ; };
269 template<
typename T >
270 struct TypeListAppend< TypeListEnd , T >
271 {
typedef TypeList< T > type ; };
273 template<
typename Value ,
class Tail ,
typename T >
274 struct TypeListAppend< TypeList< Value , Tail > , T >
276 typedef TypeList< Value , typename TypeListAppend< Tail , T >::type > type ;
288 {
typedef TypeListEnd type ; };
290 template<
typename Value ,
class Tail >
291 struct TypeListJoin< TypeListEnd , TypeList< Value , Tail > >
292 {
typedef TypeList< Value , Tail > type ; };
294 template<
typename ValueA ,
class TailA ,
typename ValueB ,
class TailB >
295 struct TypeListJoin< TypeList< ValueA , TailA > ,
296 TypeList< ValueB , TailB > >
300 TypeListJoin< TailA , TypeList< ValueB , TailB > >::type Tail ;
302 typedef TypeList< ValueA , Tail > type ;
312 template<
typename Value ,
class Tail >
314 {
typedef Tail type ; };
316 template<
typename Value ,
class Tail ,
unsigned ordinal >
317 struct TypeListEraseAt< TypeList< Value , Tail > , ordinal >
319 typedef TypeList< Value ,
320 typename TypeListEraseAt<Tail,ordinal-1>::type > type ;
334 {
typedef TypeListEnd type ; };
336 template<
class Tail >
337 struct TypeListClean< TypeList< TypeListEnd , Tail > >
338 {
typedef TypeListEnd type ; };
340 template<
typename Value ,
class Tail >
341 struct TypeListClean< TypeList< Value , Tail > >
343 typedef TypeList< Value , typename TypeListClean< Tail >::type > type ;
351 template<
typename T00 = TypeListEnd ,
352 typename T01 = TypeListEnd ,
353 typename T02 = TypeListEnd ,
354 typename T03 = TypeListEnd ,
355 typename T04 = TypeListEnd ,
356 typename T05 = TypeListEnd ,
357 typename T06 = TypeListEnd ,
358 typename T07 = TypeListEnd ,
359 typename T08 = TypeListEnd ,
360 typename T09 = TypeListEnd ,
361 typename T10 = TypeListEnd ,
362 typename T11 = TypeListEnd ,
363 typename T12 = TypeListEnd ,
364 typename T13 = TypeListEnd ,
365 typename T14 = TypeListEnd ,
366 typename T15 = TypeListEnd ,
367 typename T16 = TypeListEnd ,
368 typename T17 = TypeListEnd ,
369 typename T18 = TypeListEnd ,
370 typename T19 = TypeListEnd ,
371 typename T20 = TypeListEnd ,
372 typename T21 = TypeListEnd ,
373 typename T22 = TypeListEnd ,
374 typename T23 = TypeListEnd ,
375 typename T24 = TypeListEnd ,
376 typename T25 = TypeListEnd ,
377 typename T26 = TypeListEnd ,
378 typename T27 = TypeListEnd ,
379 typename T28 = TypeListEnd ,
380 typename T29 = TypeListEnd ,
381 typename T30 = TypeListEnd ,
382 typename T31 = TypeListEnd ,
383 typename T32 = TypeListEnd ,
384 typename T33 = TypeListEnd ,
385 typename T34 = TypeListEnd ,
386 typename T35 = TypeListEnd ,
387 typename T36 = TypeListEnd ,
388 typename T37 = TypeListEnd ,
389 typename T38 = TypeListEnd ,
390 typename T39 = TypeListEnd ,
391 typename T40 = TypeListEnd ,
392 typename T41 = TypeListEnd ,
393 typename T42 = TypeListEnd ,
394 typename T43 = TypeListEnd ,
395 typename T44 = TypeListEnd ,
396 typename T45 = TypeListEnd ,
397 typename T46 = TypeListEnd ,
398 typename T47 = TypeListEnd ,
399 typename T48 = TypeListEnd ,
400 typename T49 = TypeListEnd ,
401 typename T50 = TypeListEnd ,
402 typename T51 = TypeListEnd ,
403 typename T52 = TypeListEnd ,
404 typename T53 = TypeListEnd ,
405 typename T54 = TypeListEnd ,
406 typename T55 = TypeListEnd ,
407 typename T56 = TypeListEnd ,
408 typename T57 = TypeListEnd ,
409 typename T58 = TypeListEnd ,
410 typename T59 = TypeListEnd ,
411 typename T60 = TypeListEnd ,
412 typename T61 = TypeListEnd ,
413 typename T62 = TypeListEnd ,
414 typename T63 = TypeListEnd >
417 #ifndef DOXYGEN_COMPILE
483 TypeListEnd > > > > > > > > > > > > > > > >
484 > > > > > > > > > > > > > > > >
485 > > > > > > > > > > > > > > > >
486 > > > > > > > > > > > > > > > > dirty_type ;
503 #endif // Shards_TypeList_hpp
Member typedef ... type ; is defined by appending T to the end of ListA .
Member enum { value = ... }; is the location within ListType of occurance I of type TestValue ...
Member typedef ... type ; is the first member of ListType .
TypeListClean< dirty_type >::type type
The constructed type list.
Member enum { value = ... }; is the length of the type list.
Member enum { value = ... }; is true if each member of ListType appears exactly once...
Member enum { value = ... }; is true if all members of ListA are not a member ListB ...
A link within a linked list of types.
Member enum { value = ... }; is true if TestValue is a member of ListType .
Member enum { value = ... }; is the number of occurances of TestValue within ListType ...
Member typedef ... type ; is defined by truncating ListType at the first occurance of TypeListEn...
Member typedef ... type ; is the last member of ListType .
Member typedef ... type ; is the type of the member of ListType at location ordinal if ordinal...
Member typedef ... type ; is defined by joining ListB to the end of ListA .
Member typedef ... type ; is a type list constructed from the template arguments.
Member enum { value = ... }; is true if T1 and T2 are the same type.
Member typedef ... type ; is defined by erasing member at ordinal from ListType ...