32 #ifndef VSMC_INTERNAL_TRAITS_HPP
33 #define VSMC_INTERNAL_TRAITS_HPP
40 #define VSMC_DEFINE_TYPE_DISPATCH_TRAIT(Outer, Inner, Default) \
41 template <typename T> struct Outer##Trait; \
43 namespace internal { \
45 template <typename T> \
46 struct Has##Outer##Impl \
50 struct char2 {char c1; char c2;}; \
51 template <typename U> static char test (typename U::Inner *); \
52 template <typename U> static char2 test (...); \
56 static VSMC_CONSTEXPR const bool value = \
57 sizeof(test<T>(VSMC_NULLPTR)) == sizeof(char); \
60 template <typename T> struct Has##Outer : \
61 public cxx11::integral_constant<bool, Has##Outer##Impl<T>::value> {}; \
63 template <typename T, bool> struct Outer##Dispatch; \
65 template <typename T> struct Outer##Dispatch<T, false> \
66 {typedef Default type;}; \
68 template <typename T> struct Outer##Dispatch<T, true> \
69 {typedef typename T::Inner type;}; \
73 template <typename T> struct Outer##Trait \
75 static VSMC_CONSTEXPR const bool value = internal::Has##Outer<T>::value; \
76 typedef typename internal::Outer##Dispatch<T, value>::type type; \
79 #define VSMC_DEFINE_TYPE_TEMPLATE_DISPATCH_TRAIT(Outer, Inner, Default) \
80 template <typename T> struct Outer##Trait; \
82 namespace internal { \
84 template <typename T> \
85 struct Has##Outer##Impl \
89 struct char2 {char c1; char c2;}; \
90 template <typename U> static char test (typename U::template Inner<T> *);\
91 template <typename U> static char2 test (...); \
95 static VSMC_CONSTEXPR const bool value = \
96 sizeof(test<T>(VSMC_NULLPTR)) == sizeof(char); \
99 template <typename T> struct Has##Outer : \
100 public cxx11::integral_constant<bool, Has##Outer##Impl<T>::value> {}; \
102 template <typename T, bool> struct Outer##Dispatch; \
104 template <typename T> struct Outer##Dispatch<T, false> \
105 {typedef Default<T> type;}; \
107 template <typename T> struct Outer##Dispatch<T, true> \
108 {typedef typename T::template Inner<T> type;}; \
112 template <typename T> struct Outer##Trait \
114 static VSMC_CONSTEXPR const bool value = internal::Has##Outer<T>::value; \
115 typedef typename internal::Outer##Dispatch<T, value>::type type; \
118 #define VSMC_DEFINE_METHOD_CHECKER(name, RT, Args) \
119 template <typename U> \
120 struct has_##name##_impl_ \
124 struct char2 {char c1; char c2;}; \
125 template <typename V, RT (V::*) Args> struct sfinae_; \
126 template <typename V, RT (V::*) Args const> struct sfinae_const_; \
127 template <typename V, RT (*) Args> struct sfinae_static_; \
128 template <typename V> static char test (sfinae_<V, &V::name> *); \
129 template <typename V> static char test (sfinae_const_<V, &V::name> *); \
130 template <typename V> static char test (sfinae_static_<V, &V::name> *); \
131 template <typename V> static char2 test (...); \
135 static VSMC_CONSTEXPR const bool value = \
136 sizeof(test<U>(VSMC_NULLPTR)) == sizeof(char); \
139 template <typename U> struct has_##name##_ : \
140 public cxx11::integral_constant<bool, has_##name##_impl_<U>::value> {};
164 #if defined(_OPENMP) && _OPENMP >= 200805 // OpenMP 3.0
168 {
typedef typename std::ptrdiff_t
type;};
213 template <std::
size_t Dim>
223 std::size_t
dim ()
const {
return dim_;}
238 #endif // VSMC_INTERNAL_TRAITS_HPP
void resize_dim(std::size_t dim)
#define VSMC_CONSTEXPR
constexpr
#define VSMC_DEFINE_TYPE_TEMPLATE_DISPATCH_TRAIT(Outer, Inner, Default)
static constexpr std::size_t dim()
#define VSMC_DEFINE_TYPE_DISPATCH_TRAIT(Outer, Inner, Default)
Used to specify a dimension template parameter is dynamic.
Dimension trait for StateMatrix and StateCL (fixed dimension)
A const variant to SingleParticle.
A thin wrapper over a complete Particle.