24 #ifndef __MetaProgramming__ 25 #define __MetaProgramming__ 31 #define HAS_PARTIAL_SPECIALIZATION 0 33 #define HAS_PARTIAL_SPECIALIZATION 1 41 template <
class First,
class Second>
48 template <
class First,
class Second>
54 template <
bool condition>
64 template <
bool condition,
class IfType,
class ElseType>
68 typedef typename Picker::template Result<IfType, ElseType>::RET RET;
81 template <
bool condition>
83 typedef typename IF<condition, META_TRUE, META_FALSE>::RET RET;
89 template <
bool PREDICATE,
typename ERR_MESG>
92 typedef typename K2Meta::IF<PREDICATE, ValidCode, ERR_MESG>::RET RET;
95 template <
bool PREDICATE,
typename ERR_MESG>
98 typename ASSERT_SELECTOR<PREDICATE, ERR_MESG>::RET checker;
108 #if HAS_PARTIAL_SPECIALIZATION 109 template <
typename T>
114 template <
typename T>
119 template <
typename T>
125 struct IsPtrConverter {
126 IsPtrConverter(
const volatile void*
const) {}
129 char IsPtr(IsPtrConverter);
132 template <
typename T>
135 enum { RET = (
sizeof(IsPtr(t)) == 1) };
141 template <
class T,
class IfType,
class ElseType>
149 #if HAS_PARTIAL_SPECIALIZATION 150 template <
typename T,
typename U>
struct IS_SAME_TYPE {
enum {RET =
false};};
156 template <
typename T>
157 char IsSameType(T, T);
159 template <
typename T,
typename U>
163 enum {RET = (
sizeof(IsSameType(t, u)) == 1)};
170 #include <boost/type_traits.hpp> 173 template <
typename From,
typename To>
174 struct IS_CONVERTIBLE {
175 static char IsConvertible(To);
176 static int IsConvertible(...);
178 static const int RET =
sizeof(IsConvertible(t)) == 1;
182 template <
typename From,
typename To>
183 const int IS_CONVERTIBLE<From, To>::RET =
sizeof(IsConvertible(t)) == 1;
186 template <
typename T>
struct IS_ENUM
195 typedef typename ::boost::add_reference<T>::type r_type;
196 enum { NOT_ARITH = !(::boost::is_arithmetic<T>::value) };
197 enum { NOT_REF = !(::boost::is_reference<T>::value)};
198 enum { INT_CONVERT = (K2Meta::IS_CONVERTIBLE<r_type, ::boost::detail::int_convertible>::RET)};
201 enum { RET = NOT_ARITH && NOT_REF && INT_CONVERT};
207 #endif //__MetaProgramming__