1 /* -*- c++ -*- */ 2 #ifndef TYPESELECTION_H 3 #define TYPESELECTION_H 4 5 #include "Real.h" 6 7 namespace ProtoMol { 8 9 /** 10 * Enables to select the right type of an int or float 11 * with a given sizeof, bails out if there is not adequate 12 * type. @n 13 * 14 * Usage:@n 15 * typedef TypeSelection::Int<4>::type int32;@n 16 * typedef TypeSelection::Float<4>::type float32;@n 17 */ 18 namespace TypeSelection { 19 20 template<bool cmp, class A, class B> struct SelectTypeHelper { 21 typedef B type; 22 }; 23 24 template<class A, class B> struct SelectTypeHelper<true,A,B> { 25 typedef A type; 26 }; 27 28 template<unsigned int size, class A, class B> struct SelectType { 29 typedef typename SelectTypeHelper<sizeof(A)==size,A,B>::type type; 30 }; 31 32 template<bool cmp, class A> struct SelectTypeCheckHelper {}; 33 34 template<class A> struct SelectTypeCheckHelper<true,A> { 35 typedef A type; 36 }; 37 38 template<class A, unsigned int size> struct SelectTypeCheck { 39 typedef typename SelectTypeCheckHelper<sizeof(A)==size,A>::type type; 40 }; 41 42 /** 43 * Select the right type among short, int or long according the given sizeof. 44 */ 45 template<unsigned int size> struct Int { 46 typedef typename SelectTypeCheck<typename SelectType<size, 47 typename SelectType<size,int,short>::type, 48 long>::type,size>::type type; 49 }; 50 51 /** 52 * Select the right type among float or double according the given sizeof. 53 */ 54 template<unsigned int size> struct Float { 55 typedef typename SelectTypeCheck<typename SelectType<size, 56 typename SelectType<size,float,double>::type, 57 Real>::type,size>::type type; 58 }; 59 60 } 61 62 } 63 #endif /* TYPESELECTION_H */ 64