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