10#ifndef Shards_TypeList_hpp
11#define Shards_TypeList_hpp
32template<
typename T1,
typename T2>
36struct SameType<T,T> {
enum { value =
true }; };
49template<
typename Value ,
class Tail = TypeListEnd >
struct TypeList {};
60{
enum { value = 0 }; };
62template<
typename Value ,
class Tail >
64{
enum { value = 1 + TypeListLength< Tail >::value }; };
72template<
class ListType,
unsigned ordinal >
struct TypeListAt {};
74template<
unsigned ordinal >
76{
typedef TypeListEnd
type ; };
78template<
typename Value ,
class Tail >
79struct TypeListAt< TypeList< Value , Tail > , 0 >
80{
typedef Value type ; };
82template<
typename Value ,
class Tail ,
unsigned ordinal >
84{
typedef typename TypeListAt< Tail , ordinal - 1 >::type type ; };
93template<
class ListType ,
typename TestValue ,
unsigned ordinal = 0 >
96template<
typename TestValue ,
unsigned ordinal >
102template<
typename Value ,
class Tail ,
typename TestValue ,
unsigned ordinal >
106 enum { match = SameType< Value , TestValue >::value };
107 enum { J = match && 0 < ordinal ? ordinal - 1 : ordinal };
108 enum { N = TypeListIndex< Tail , TestValue , J >::value };
110 enum { value = match && 0 == ordinal ? 0 : ( -1 == N ? -1 : N + 1 ) };
119template<
class ListType ,
typename TestValue >
122template<
typename TestValue >
124{
enum { value = 0 }; };
126template<
typename Value ,
class Tail ,
typename TestValue >
129 enum { value = TypeListCount< Tail , TestValue >::value +
130 ( SameType< Value , TestValue >::value ? 1 : 0 ) };
140template<
typename TestValue >
142{
enum { value =
false }; };
144template<
typename Value ,
class Tail ,
typename TestValue >
147 enum { value = SameType< Value , TestValue >::value ||
148 TypeListMember< Tail , TestValue >::value };
160{
enum { value =
true }; };
162template<
typename Value ,
class Tail >
165 enum { value = ! TypeListMember< Tail , Value >::value &&
166 TypeListUnique< Tail >::value };
177template<
class ListB >
179{
enum { value =
true }; };
181template<
typename Value ,
class Tail ,
class ListB >
184 enum { value = ! TypeListMember< ListB , Value >::value &&
185 TypeListDisjoint< Tail , ListB >::value };
197{
typedef TypeListEnd
type ; };
199template<
typename Value ,
class Tail >
200struct TypeListFirst< TypeList< Value , Tail > >
201{
typedef Value type ; };
212{
typedef TypeListEnd
type ; };
214template<
typename Value >
215struct TypeListLast< TypeList< Value , TypeListEnd > >
216{
typedef Value type ; };
218template<
typename Value ,
class Tail >
220{
typedef typename TypeListLast< Tail >::type type ; };
231{
typedef TypeListEnd
type ; };
233template<
typename T >
234struct TypeListAppend< TypeListEnd , T >
235{
typedef TypeList< T > type ; };
237template<
typename Value ,
class Tail ,
typename T >
240 typedef TypeList< Value , typename TypeListAppend< Tail , T >::type > type ;
252{
typedef TypeListEnd
type ; };
254template<
typename Value ,
class Tail >
255struct TypeListJoin< TypeListEnd , TypeList< Value , Tail > >
256{
typedef TypeList< Value , Tail > type ; };
258template<
typename ValueA ,
class TailA ,
typename ValueB ,
class TailB >
264 TypeListJoin< TailA , TypeList< ValueB , TailB > >::type Tail ;
266 typedef TypeList< ValueA , Tail > type ;
276template<
typename Value ,
class Tail >
278{
typedef Tail
type ; };
280template<
typename Value ,
class Tail ,
unsigned ordinal >
281struct TypeListEraseAt< TypeList< Value , Tail > , ordinal >
283 typedef TypeList< Value ,
284 typename TypeListEraseAt<Tail,ordinal-1>::type > type ;
298{
typedef TypeListEnd
type ; };
300template<
class Tail >
301struct TypeListClean< TypeList< TypeListEnd , Tail > >
302{
typedef TypeListEnd type ; };
304template<
typename Value ,
class Tail >
307 typedef TypeList< Value , typename TypeListClean< Tail >::type > type ;
315template<
typename T00 = TypeListEnd ,
316 typename T01 = TypeListEnd ,
317 typename T02 = TypeListEnd ,
318 typename T03 = TypeListEnd ,
319 typename T04 = TypeListEnd ,
320 typename T05 = TypeListEnd ,
321 typename T06 = TypeListEnd ,
322 typename T07 = TypeListEnd ,
323 typename T08 = TypeListEnd ,
324 typename T09 = TypeListEnd ,
325 typename T10 = TypeListEnd ,
326 typename T11 = TypeListEnd ,
327 typename T12 = TypeListEnd ,
328 typename T13 = TypeListEnd ,
329 typename T14 = TypeListEnd ,
330 typename T15 = TypeListEnd ,
331 typename T16 = TypeListEnd ,
332 typename T17 = TypeListEnd ,
333 typename T18 = TypeListEnd ,
334 typename T19 = TypeListEnd ,
335 typename T20 = TypeListEnd ,
336 typename T21 = TypeListEnd ,
337 typename T22 = TypeListEnd ,
338 typename T23 = TypeListEnd ,
339 typename T24 = TypeListEnd ,
340 typename T25 = TypeListEnd ,
341 typename T26 = TypeListEnd ,
342 typename T27 = TypeListEnd ,
343 typename T28 = TypeListEnd ,
344 typename T29 = TypeListEnd ,
345 typename T30 = TypeListEnd ,
346 typename T31 = TypeListEnd ,
347 typename T32 = TypeListEnd ,
348 typename T33 = TypeListEnd ,
349 typename T34 = TypeListEnd ,
350 typename T35 = TypeListEnd ,
351 typename T36 = TypeListEnd ,
352 typename T37 = TypeListEnd ,
353 typename T38 = TypeListEnd ,
354 typename T39 = TypeListEnd ,
355 typename T40 = TypeListEnd ,
356 typename T41 = TypeListEnd ,
357 typename T42 = TypeListEnd ,
358 typename T43 = TypeListEnd ,
359 typename T44 = TypeListEnd ,
360 typename T45 = TypeListEnd ,
361 typename T46 = TypeListEnd ,
362 typename T47 = TypeListEnd ,
363 typename T48 = TypeListEnd ,
364 typename T49 = TypeListEnd ,
365 typename T50 = TypeListEnd ,
366 typename T51 = TypeListEnd ,
367 typename T52 = TypeListEnd ,
368 typename T53 = TypeListEnd ,
369 typename T54 = TypeListEnd ,
370 typename T55 = TypeListEnd ,
371 typename T56 = TypeListEnd ,
372 typename T57 = TypeListEnd ,
373 typename T58 = TypeListEnd ,
374 typename T59 = TypeListEnd ,
375 typename T60 = TypeListEnd ,
376 typename T61 = TypeListEnd ,
377 typename T62 = TypeListEnd ,
378 typename T63 = TypeListEnd >
381#ifndef DOXYGEN_COMPILE
447 TypeListEnd > > > > > > > > > > > > > > > >
448 > > > > > > > > > > > > > > > >
449 > > > > > > > > > > > > > > > >
450 > > > > > > > > > > > > > > > > dirty_type ;
Member typedef ... type ; is a type list constructed from the template arguments.
TypeListClean< dirty_type >::type type
The constructed type list.
Member enum { value = ... }; is true if T1 and T2 are the same type.
Member typedef ... type ; is defined by appending T to the end of ListA .
Member typedef ... type ; is the type of the member of ListType at location ordinal if ordinal...
Member typedef ... type ; is defined by truncating ListType at the first occurance of TypeListEn...
Member enum { value = ... }; is the number of occurances of TestValue within ListType .
Member enum { value = ... }; is true if all members of ListA are not a member ListB .
Member typedef ... type ; is defined by erasing member at ordinal from ListType .
Member typedef ... type ; is the first member of ListType .
Member enum { value = ... }; is the location within ListType of occurance I of type TestValue ...
Member typedef ... type ; is defined by joining ListB to the end of ListA .
Member typedef ... type ; is the last member of ListType .
Member enum { value = ... }; is the length of the type list.
Member enum { value = ... }; is true if TestValue is a member of ListType .
Member enum { value = ... }; is true if each member of ListType appears exactly once.
A link within a linked list of types.