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