Protium
Math and Design Features
 All Classes Namespaces Files Functions Variables Typedefs Enumerator Friends Macros Pages
Types.h
Go to the documentation of this file.
1 #ifndef Protium_Types_h
2 #define Protium_Types_h
3 
4 namespace Protium{
5 
6  namespace Design{
7 
9  struct NullType{};
11  class EmptyType {};
12 
14  inline bool operator==(const EmptyType&, const EmptyType&){return true;}
15 
17  inline bool operator<(const EmptyType&, const EmptyType&){return false;}
18 
20  inline bool operator>(const EmptyType&, const EmptyType&){return false;}
21 
23  template <int v>
24  struct IntType{
25  enum { value = v };
26  };
27 
29  template <typename T>
30  struct TypeType{
31  typedef T OType;
32  };
33 
35  template <typename T, typename U>
36  struct SameType
37  {
38  enum { value = false };
39  };
40 
42  template <typename T>
43  struct SameType<T,T>
44  {
45  enum { value = true };
46  };
47 
49 
52  template <class H, class T>
53  struct Typelist{
54  typedef H Head;
55  typedef T Tail;
56  };
57 
59  template <class TList, class T>
60  struct IndexOf;
61 
63  template <class T>
64  struct IndexOf<NullType, T>
65  {
66  enum { value = -1 };
67  };
68 
70  template <class T, class Tail>
71  struct IndexOf<Typelist<T, Tail>, T>
72  {
73  enum { value = 0 };
74  };
75 
77  template <class Head, class Tail, class T>
78  struct IndexOf<Typelist<Head, Tail>, T>
79  {
80  private:
81  enum { temp = IndexOf<Tail, T>::value };
82  public:
83  enum { value = (temp == -1 ? -1 : 1 + temp) };
84  };
85 
86 
88  template< class T1=NullType,
89  class T2=NullType,
90  class T3=NullType,
91  class T4=NullType,
92  class T5=NullType,
93  class T6=NullType,
94  class T7=NullType,
95  class T8=NullType,
96  class T9=NullType,
97  class T10=NullType,
98  class T11=NullType,
99  class T12=NullType,
100  class T13=NullType,
101  class T14=NullType,
102  class T15=NullType,
103  class T16=NullType,
104  class T17=NullType,
105  class T18=NullType,
106  class T19=NullType,
107  class T20=NullType
108  >
109  struct Sequence{
110  private:
111  typedef typename Sequence< T2,
112  T3,
113  T4,
114  T5,
115  T6,
116  T7,
117  T8,
118  T9,
119  T10,
120  T11,
121  T12,
122  T13,
123  T14,
124  T15,
125  T16,
126  T17,
127  T18,
128  T19,
130  public:
132  };
133 
135  template<>
136  struct Sequence<>{
137  typedef NullType Type;
138  };
139 
140 
141  }
142 }
143 
144 #endif //File Guardian
Typelist< T1, TailResult > Type
Definition: Types.h:131
Empty class. To be used as header or footer.
Definition: Types.h:11
Maps to types to a new type.
Definition: Types.h:36
Maps type to integer.
Definition: Types.h:24
Emmpty struct. To be used as header or footer.
Definition: Types.h:9
bool operator<(const EmptyType &, const EmptyType &)
Empty types are always equal.
Definition: Types.h:17
Empty Astract Index class. Never Use directly.
Definition: Types.h:60
bool operator==(const EmptyType &, const EmptyType &)
Empty types are always equal.
Definition: Types.h:14
Sequence of types.
Definition: Types.h:109
General list of types. Points to Head and Tail.
Definition: Types.h:53
bool operator>(const EmptyType &, const EmptyType &)
Empty types are always equal.
Definition: Types.h:20
Maps type to another type.
Definition: Types.h:30
Sequence< T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20 >::Type TailResult
Definition: Types.h:129