00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef VISU_TypeList_HeaderFile
00029 #define VISU_TypeList_HeaderFile
00030
00031
00032
00033 namespace VISU
00034 {
00035
00036 namespace TL
00037 {
00038
00039 struct TNullType {};
00040
00041
00042
00043 template < class T, class U >
00044 struct TList
00045 {
00046 typedef T THead;
00047 typedef U TTail;
00048 };
00049
00050 template < int v >
00051 struct TInt2Type
00052 {
00053 enum { value = v };
00054 };
00055
00056
00057
00058 template < class TypeList, unsigned int index >
00059 struct TTypeAt;
00060
00061 template < class THead, class TTail >
00062 struct TTypeAt< TList< THead, TTail >, 0 >
00063 {
00064 typedef THead TResult;
00065 };
00066
00067
00068 template < class THead, class TTail, unsigned int index >
00069 struct TTypeAt< TList< THead, TTail >, index >
00070 {
00071 typedef typename TTypeAt< TTail, index - 1 >::TResult TResult;
00072 };
00073
00074
00075
00076 template < class TypeList, class T >
00077 struct TIndexOf;
00078
00079 template < class T >
00080 struct TIndexOf< TNullType, T >
00081 {
00082 enum { value = -1 };
00083 };
00084
00085 template < class T, class TTail >
00086 struct TIndexOf< TList< T, TTail >, T >
00087 {
00088 enum { value = 0 };
00089 };
00090
00091 template < class THead, class TTail, class T >
00092 struct TIndexOf< TList< THead, TTail >, T >
00093 {
00094 private:
00095 enum { temp = TIndexOf< TTail, T >::value };
00096 public:
00097 enum { value = temp == -1? -1 : 1 + temp };
00098 };
00099
00100
00101
00102 template
00103 <
00104 class T01 = TNullType, class T02 = TNullType, class T03 = TNullType, class T04 = TNullType, class T05 = TNullType,
00105 class T06 = TNullType, class T07 = TNullType, class T08 = TNullType, class T09 = TNullType, class T10 = TNullType,
00106 class T11 = TNullType, class T12 = TNullType, class T13 = TNullType, class T14 = TNullType, class T15 = TNullType,
00107 class T16 = TNullType, class T17 = TNullType, class T18 = TNullType, class T19 = TNullType, class T20 = TNullType,
00108 class T21 = TNullType, class T22 = TNullType, class T23 = TNullType, class T24 = TNullType, class T25 = TNullType,
00109 class T26 = TNullType, class T27 = TNullType, class T28 = TNullType, class T29 = TNullType, class T30 = TNullType,
00110 class T31 = TNullType, class T32 = TNullType, class T33 = TNullType, class T34 = TNullType, class T35 = TNullType,
00111 class T36 = TNullType, class T37 = TNullType, class T38 = TNullType, class T39 = TNullType, class T40 = TNullType
00112 >
00113 struct TSequence
00114 {
00115 private:
00116 typedef typename TSequence< T02, T03, T04, T05, T06, T07, T08, T09, T10,
00117 T11, T12, T13, T14, T15, T16, T17, T18, T19, T20,
00118 T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
00119 T31, T32, T33, T34, T35, T36, T37, T38, T39, T40
00120 >::TResult
00121 TailResult;
00122 public:
00123 typedef TList< T01, TailResult > TResult;
00124 };
00125
00126
00127
00128 template<>
00129 struct TSequence<>
00130 {
00131 typedef TNullType TResult;
00132 };
00133
00134
00135
00136 }
00137
00138
00139
00140 }
00141
00142 #endif