15 #ifndef __numtypelist_h
16 #define __numtypelist_h
26 template<
class TList>
struct Print;
28 template<>
struct Print<NullType> { };
30 template<
class Head,
class Tail>
31 struct Print<Typelist<Head,Tail> > {
32 typedef typename Print<Tail>::Result Result;
42 template <
class NList>
struct Max;
44 struct Max< Typelist<Num,NullType> >
49 template <
class Num,
class Tail>
50 struct Max< Typelist<Num, Tail> >
55 typedef SInt<(temp > Num::value) ? temp : Num::value> Result;
65 template <
class NList>
struct Min;
67 struct Min< Typelist<Num,NullType> >
72 template <
class Num,
class Tail>
73 struct Min< Typelist<Num, Tail> >
89 template <
class NList,
class Num>
struct AddConst;
93 typedef NullType Result;
96 template <
class Head,
class Tail,
class Num>
97 struct AddConst<Typelist<Head,Tail>,Num>
99 typedef Typelist<SInt<Head::value + Num::value>,
113 template <
class NList,
unsigned int index,
class Num>
struct AddAt;
115 template <
class Head,
class Tail,
class Num>
116 struct AddAt<Typelist<Head, Tail>, 0, Num>
118 typedef Typelist<SInt<Head::value + Num::value>, Tail> Result;
121 template <
class Head,
class Tail,
unsigned int i,
class Num>
122 struct AddAt<Typelist<Head, Tail>, i, Num>
124 typedef Typelist<Head,
125 typename AddAt<Tail, i-1, Num>::Result>
138 template <
class NList1,
class NList2>
struct Add;
141 struct Add<NullType,NullType>
143 typedef NullType Result;
146 template <
class Head,
class Tail>
147 struct Add<NullType,Typelist<Head,Tail> >
149 typedef Typelist<Head,Tail> Result;
152 template <
class Head,
class Tail>
153 struct Add<Typelist<Head,Tail>,NullType>
155 typedef Typelist<Head,Tail> Result;
158 template <
class Head1,
class Tail1,
class Head2,
class Tail2>
159 struct Add<Typelist<Head1,Tail1>,Typelist<Head2,Tail2> >
161 typedef Typelist<SInt<Head1::value + Head2::value>,
162 typename Add<Tail1,Tail2>::Result> Result;
179 typedef NullType Result;
182 template <
class Head,
class Tail,
class Num>
183 struct SubConst<Typelist<Head,Tail>,Num>
185 typedef Typelist<
SInt<Head::value - Num::value>,
199 template <
class NList,
unsigned int index,
class Num>
struct SubAt;
201 template <
class Head,
class Tail,
class Num>
202 struct SubAt<Typelist<Head, Tail>, 0, Num>
204 typedef Typelist<
SInt<Head::value - Num::value>, Tail> Result;
207 template <
class Head,
class Tail,
unsigned int i,
class Num>
208 struct SubAt<Typelist<Head, Tail>, i, Num>
210 typedef Typelist<Head,
211 typename SubAt<Tail, i-1, Num>::Result> Result;
223 template <
class NList1,
class NList2>
struct Sub;
226 struct Sub<NullType,NullType>
228 typedef NullType Result;
231 template <
class Head,
class Tail>
232 struct Sub<NullType,Typelist<Head,Tail> >
234 typedef Typelist<Head,Tail> Result;
237 template <
class Head,
class Tail>
238 struct Sub<Typelist<Head,Tail>,NullType>
240 typedef Typelist<Head,Tail> Result;
243 template <
class Head1,
class Tail1,
class Head2,
class Tail2>
244 struct Sub<Typelist<Head1,Tail1>,Typelist<Head2,Tail2> >
246 typedef Typelist<
SInt<Head1::value-Head2::value>,
247 typename Sub<Tail1,Tail2>::Result> Result;
263 typedef NullType Result;
266 template <
class Head,
class Tail,
class Num>
267 struct MultConst<Typelist<Head,Tail>,Num>
269 typedef Typelist<SInt<Head::value * Num::value>,
283 template <
class NList,
unsigned int index,
class Num>
struct MultAt;
285 template <
class Head,
class Tail,
class Num>
286 struct MultAt<Typelist<Head, Tail>, 0, Num>
288 typedef Typelist<SInt<Head::value * Num::value>, Tail> Result;
291 template <
class Head,
class Tail,
unsigned int i,
class Num>
292 struct MultAt<Typelist<Head, Tail>, i, Num>
294 typedef Typelist<Head,
295 typename MultAt<Tail, i-1, Num>::Result>
308 template <
class NList1,
class NList2>
struct Mult;
310 struct Mult<NullType,NullType>
312 typedef NullType Result;
315 template <
class Head,
class Tail>
316 struct Mult<NullType,Typelist<Head,Tail> >
318 typedef NullType Result;
321 template <
class Head,
class Tail>
322 struct Mult<Typelist<Head,Tail>,NullType>
324 typedef Typelist<Head,Tail> Result;
327 template <
class Head1,
class Tail1,
class Head2,
class Tail2>
328 struct Mult<Typelist<Head1,Tail1>,Typelist<Head2,Tail2> >
330 typedef Typelist<SInt<Head1::value*Head2::value>,
331 typename Add<Tail1,Tail2>::Result> Result;
341 template <
class NList>
struct Sum;
342 template <>
struct Sum<NullType>
347 template <
class Num,
class Tail>
348 struct Sum< Typelist<Num, Tail> >
363 template <
class NList1,
class NList2>
struct Compare;
365 template <
class H1,
class T1,
class H2,
class T2>
366 struct Compare<Typelist<H1,T1>,Typelist<H2,T2> >
369 static const int value = (v==0) ?
370 ((H1::value-H2::value)>0 ? 1 :
371 (H1::value==H2::value) ? 0 : -1) : v;
374 template <
class H,
class T>
375 struct Compare<Typelist<H,T>,NullType>
377 static const int value = 1;
380 template <
class H,
class T>
381 struct Compare<NullType,Typelist<H,T> >
383 static const int value = -1;
386 template <
class H1,
class H2>
387 struct Compare<Typelist<H1,NullType>,Typelist<H2,NullType> >
389 static const int value = (H1::value-H2::value)>0 ? 1 :
390 (H1::value==H2::value) ? 0 : -1;
400 template <
class NList>
struct Sort;
401 template <>
struct Sort<NullType>
403 typedef NullType Result;
406 template <
class Head,
class Tail>
407 struct Sort<Typelist<Head,Tail> >
411 typedef typename TL::Replace<Tail,_Min,Head>::Result temp;
414 typedef Typelist<_Min,typename Sort<temp>::Result> Result;
418 template<
typename NList>
421 template<
int_t N,
typename Tail>
422 struct NZeros<Loki::Typelist<SInt<N>,Tail> > {
423 static const int_t value = NZeros<Tail>::value;
426 template<
typename Tail>
427 struct NZeros<Loki::Typelist<SInt<0>,Tail> > {
428 static const int_t value = NZeros<Tail>::value + 1;
432 struct NZeros<Loki::NullType> {
433 static const int_t value = 0;
437 template<
class NList>
438 struct CutTrailingZeros;
440 template<
class H,
class Tail>
441 struct CutTrailingZeros<Loki::Typelist<H,Tail> > {
442 typedef Loki::Typelist<H, typename CutTrailingZeros<Tail>::Result> Result;
446 struct CutTrailingZeros<Loki::Typelist<SInt<0>,Tail> > {
447 static const int Len = TL::Length<Tail>::value;
448 static const int NZ = NZeros<Tail>::value;
449 typedef typename Select<(Len == NZ), Loki::NullType,
450 Loki::Typelist<
SInt<0>,
typename CutTrailingZeros<Tail>::Result> >::Result Result;
454 struct CutTrailingZeros<Loki::NullType> {
455 typedef Loki::NullType Result;