46#ifndef Shards_TypeList_hpp
47#define Shards_TypeList_hpp
68template<
typename T1,
typename T2>
72struct SameType<T,T> {
enum { value =
true }; };
85template<
typename Value ,
class Tail = TypeListEnd >
struct TypeList {};
96{
enum { value = 0 }; };
98template<
typename Value ,
class Tail >
99struct TypeListLength< TypeList< Value , Tail > >
100{
enum { value = 1 + TypeListLength< Tail >::value }; };
108template<
class ListType,
unsigned ordinal >
struct TypeListAt {};
110template<
unsigned ordinal >
112{
typedef TypeListEnd type ; };
114template<
typename Value ,
class Tail >
115struct TypeListAt< TypeList< Value , Tail > , 0 >
116{
typedef Value type ; };
118template<
typename Value ,
class Tail ,
unsigned ordinal >
119struct TypeListAt< TypeList< Value , Tail > , ordinal >
120{
typedef typename TypeListAt< Tail , ordinal - 1 >::type type ; };
129template<
class ListType ,
typename TestValue ,
unsigned ordinal = 0 >
132template<
typename TestValue ,
unsigned ordinal >
138template<
typename Value ,
class Tail ,
typename TestValue ,
unsigned ordinal >
139struct 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 ) };
155template<
class ListType ,
typename TestValue >
158template<
typename TestValue >
160{
enum { value = 0 }; };
162template<
typename Value ,
class Tail ,
typename TestValue >
163struct TypeListCount< TypeList< Value , Tail > , TestValue >
165 enum { value = TypeListCount< Tail , TestValue >::value +
166 ( SameType< Value , TestValue >::value ? 1 : 0 ) };
176template<
typename TestValue >
178{
enum { value =
false }; };
180template<
typename Value ,
class Tail ,
typename TestValue >
181struct TypeListMember< TypeList< Value , Tail > , TestValue >
183 enum { value = SameType< Value , TestValue >::value ||
184 TypeListMember< Tail , TestValue >::value };
196{
enum { value =
true }; };
198template<
typename Value ,
class Tail >
199struct TypeListUnique< TypeList< Value , Tail > >
201 enum { value = ! TypeListMember< Tail , Value >::value &&
202 TypeListUnique< Tail >::value };
213template<
class ListB >
215{
enum { value =
true }; };
217template<
typename Value ,
class Tail ,
class ListB >
218struct TypeListDisjoint< TypeList< Value , Tail > , ListB >
220 enum { value = ! TypeListMember< ListB , Value >::value &&
221 TypeListDisjoint< Tail , ListB >::value };
233{
typedef TypeListEnd type ; };
235template<
typename Value ,
class Tail >
236struct TypeListFirst< TypeList< Value , Tail > >
237{
typedef Value type ; };
248{
typedef TypeListEnd type ; };
250template<
typename Value >
251struct TypeListLast< TypeList< Value , TypeListEnd > >
252{
typedef Value type ; };
254template<
typename Value ,
class Tail >
255struct TypeListLast< TypeList< Value , Tail > >
256{
typedef typename TypeListLast< Tail >::type type ; };
267{
typedef TypeListEnd type ; };
269template<
typename T >
270struct TypeListAppend< TypeListEnd , T >
271{
typedef TypeList< T > type ; };
273template<
typename Value ,
class Tail ,
typename T >
274struct TypeListAppend< TypeList< Value , Tail > , T >
276 typedef TypeList< Value , typename TypeListAppend< Tail , T >::type > type ;
288{
typedef TypeListEnd type ; };
290template<
typename Value ,
class Tail >
291struct TypeListJoin< TypeListEnd , TypeList< Value , Tail > >
292{
typedef TypeList< Value , Tail > type ; };
294template<
typename ValueA ,
class TailA ,
typename ValueB ,
class TailB >
295struct TypeListJoin< TypeList< ValueA , TailA > ,
296 TypeList< ValueB , TailB > >
300 TypeListJoin< TailA , TypeList< ValueB , TailB > >::type Tail ;
302 typedef TypeList< ValueA , Tail > type ;
312template<
typename Value ,
class Tail >
314{
typedef Tail type ; };
316template<
typename Value ,
class Tail ,
unsigned ordinal >
317struct TypeListEraseAt< TypeList< Value , Tail > , ordinal >
319 typedef TypeList< Value ,
320 typename TypeListEraseAt<Tail,ordinal-1>::type > type ;
334{
typedef TypeListEnd type ; };
336template<
class Tail >
337struct TypeListClean< TypeList< TypeListEnd , Tail > >
338{
typedef TypeListEnd type ; };
340template<
typename Value ,
class Tail >
341struct TypeListClean< TypeList< Value , Tail > >
343 typedef TypeList< Value , typename TypeListClean< Tail >::type > type ;
351template<
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 ;
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.