00001
00053 #ifndef GALOIS_TYPETRAITS_H
00054 #define GALOIS_TYPETRAITS_H
00055
00056 #include "Galois/Runtime/ll/CompilerSpecific.h"
00057 #include <boost/mpl/has_xxx.hpp>
00058
00059 namespace Galois {
00060
00061 #define GALOIS_HAS_MEM_FUNC(func, name) \
00062 template<typename T, typename Sig> \
00063 struct has_##name { \
00064 typedef char yes[1]; \
00065 typedef char no[2]; \
00066 template<typename U, U> struct type_check; \
00067 template<typename W> static yes& test(type_check<Sig, &W::func>*); \
00068 template<typename > static no& test(...); \
00069 static const bool value = sizeof(test<T>(0)) == sizeof(yes); \
00070 }
00071
00072 #define GALOIS_HAS_MEM_FUNC_ANY(func, name) \
00073 template<typename T> \
00074 struct has_##name { \
00075 typedef char yes[1]; \
00076 typedef char no[2]; \
00077 template<typename U, U> struct type_check; \
00078 template<typename W> static yes& test(type_check<decltype(&W::func), &W::func>*); \
00079 template<typename > static no& test(...); \
00080 static const bool value = sizeof(test<T>(0)) == sizeof(yes); \
00081 }
00082
00083 #define GALOIS_HAS_MEM_TYPE(func, name) \
00084 template<typename T> \
00085 struct has_##name { \
00086 typedef char yes[1]; \
00087 typedef char no[2]; \
00088 template<typename W> static yes& test(typename W::func*); \
00089 template<typename > static no& test(...); \
00090 static const bool value = sizeof(test<T>(0)) == sizeof(yes); \
00091 }
00092
00093 GALOIS_HAS_MEM_FUNC(galoisDeterministicParallelBreak, tf_deterministic_parallel_break);
00112 template<typename T>
00113 struct has_deterministic_parallel_break : public has_tf_deterministic_parallel_break<T, bool(T::*)()> {};
00114
00115 GALOIS_HAS_MEM_FUNC_ANY(galoisDeterministicId, tf_deterministic_id);
00129 template<typename T>
00130 struct has_deterministic_id : public has_tf_deterministic_id<T> {};
00131
00132 GALOIS_HAS_MEM_TYPE(GaloisDeterministicLocalState, tf_deterministic_local_state);
00162 template<typename T>
00163 struct has_deterministic_local_state : public has_tf_deterministic_local_state<T> {};
00164
00169 BOOST_MPL_HAS_XXX_TRAIT_DEF(tt_needs_parallel_break)
00170 template<typename T>
00171 struct needs_parallel_break : public has_tt_needs_parallel_break<T> {};
00172
00176 BOOST_MPL_HAS_XXX_TRAIT_DEF(tt_does_not_need_push)
00177 template<typename T>
00178 struct does_not_need_push : public has_tt_does_not_need_push<T> {};
00179
00184 BOOST_MPL_HAS_XXX_TRAIT_DEF(tt_needs_per_iter_alloc)
00185 template<typename T>
00186 struct needs_per_iter_alloc : public has_tt_needs_per_iter_alloc<T> {};
00187
00191 BOOST_MPL_HAS_XXX_TRAIT_DEF(tt_does_not_need_stats)
00192 template<typename T>
00193 struct does_not_need_stats : public has_tt_does_not_need_stats<T> {};
00194
00198 BOOST_MPL_HAS_XXX_TRAIT_DEF(tt_does_not_need_aborts)
00199 template<typename T>
00200 struct does_not_need_aborts : public has_tt_does_not_need_aborts<T> {};
00201
00209 BOOST_MPL_HAS_XXX_TRAIT_DEF(tt_has_fixed_neighborhood)
00210 template <typename T>
00211 struct has_fixed_neighborhood: public has_tt_has_fixed_neighborhood<T> {};
00212
00217 BOOST_MPL_HAS_XXX_TRAIT_DEF(tt_has_known_trivial_constructor)
00218 template <typename T>
00219 struct has_known_trivial_constructor: public has_tt_has_known_trivial_constructor<T> { };
00220
00221 }
00222 #endif