00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00030 #ifndef __CLAW_META_HPP__
00031 #define __CLAW_META_HPP__
00032
00033 namespace claw
00034 {
00035 namespace meta
00036 {
00047 template<typename T, typename U>
00048 struct same_type
00049 {
00050 enum
00051 {
00052 result = false
00053 };
00054 };
00055
00056 template<typename T>
00057 struct same_type<T,T>
00058 {
00059 enum
00060 {
00061 result = true
00062 };
00063 };
00064
00068 struct no_type {};
00069
00087 template<typename Head, typename Queue>
00088 struct type_list
00089 {
00090 typedef Head head_type;
00091 typedef Queue queue_type;
00092 };
00093
00106 template<typename T, typename List>
00107 struct type_list_find
00108 {
00109 enum
00110 {
00111 result = same_type<T, typename List::head_type>::result
00112 || type_list_find<T, typename List::queue_type>::result
00113 };
00114 };
00115
00116 template<typename T>
00117 struct type_list_find<T, no_type>
00118 {
00119 enum
00120 {
00121 result = same_type<T, no_type>::result
00122 };
00123 };
00124
00131 template<typename List>
00132 struct type_list_is_a_set
00133 {
00134 enum
00135 {
00136 result = !type_list_find<typename List::head_type,
00137 typename List::queue_type>::result
00138 && type_list_is_a_set<typename List::queue_type>::result
00139 };
00140 };
00141
00142 template<>
00143 struct type_list_is_a_set<no_type>
00144 {
00145 enum
00146 {
00147 result = true
00148 };
00149 };
00150
00163 template<bool Cond, typename ThenPart, typename ElsePart>
00164 struct if_then_else
00165 {
00166
00167 };
00168
00169 template<typename ThenPart, typename ElsePart>
00170 struct if_then_else<true, ThenPart, ElsePart>
00171 {
00172 typedef ThenPart result;
00173 };
00174
00175 template<typename ThenPart, typename ElsePart>
00176 struct if_then_else<false, ThenPart, ElsePart>
00177 {
00178 typedef ElsePart result;
00179 };
00180
00181 }
00182 }
00183
00184 #endif // __CLAW_META_HPP__