1 #ifndef _RHEOLEF_FIELD_EXPR_UTILITIES_H
2 #define _RHEOLEF_FIELD_EXPR_UTILITIES_H
30 #include "rheolef/promote.h"
31 #include "rheolef/point.h"
32 #include "rheolef/space_constant.h"
34 #include <type_traits>
45 template <
typename T1,
typename T2>
48 typename std::decay<T1>::type,
49 typename std::decay<T2>::type
62 :
public std::false_type
70 template<
typename B1,
typename B2>
72 :
public std::conditional<B1::value, B1, B2>::type
75 template<
typename B1,
typename B2,
typename B3,
typename... Bn>
77 :
public std::conditional<B1::value, B1, or_type<B2, B3, Bn...>>
::type
85 :
public std::true_type
93 template<
typename B1,
typename B2>
95 :
public std::conditional<B1::value, B2, B1>::type
98 template<
typename B1,
typename B2,
typename B3,
typename... Bn>
100 :
public std::conditional<B1::value, and_type<B2, B3, Bn...>, B1>
::type
105 :
public std::integral_constant<bool, !P::value>
114 template <
size_t... Is>
119 template <
size_t MIN,
size_t N,
size_t... Is>
123 template <
size_t MIN,
size_t... Is>
130 template <
size_t MIN,
size_t N,
size_t... Is>
136 template<
size_t MIN,
size_t MAX>
145 template <
typename T>
148 template <
typename C,
typename R,
typename... Args>
151 static const std::size_t arity =
sizeof...(Args);
152 template <std::
size_t I>
154 static_assert(I < arity,
"error: invalid parameter index.");
155 using type =
typename std::tuple_element<I, std::tuple<Args...> >
::type;
168 template<
class R,
class... Args>
171 template<
class R,
class... Args>
174 static constexpr std::size_t arity =
sizeof...(Args);
175 template <std::
size_t I>
177 static_assert(I < arity,
"error: invalid parameter index.");
178 using type =
typename std::tuple_element<I,std::tuple<Args...> >
::type;
201 template <
typename,
typename>
204 template <
typename F,
typename R,
typename ... Args>
206 {
using type = R (*)(Args...); };
212 template <
typename,
typename>
215 template <
typename C,
typename R,
typename ... Args>
217 {
using type = R (C::*)(Args...); };
219 template <
typename C,
typename R,
typename ... Args>
221 {
using type = R (C::*)(Args...)
const; };
223 template <
typename C,
typename R,
typename ... Args>
225 {
using type = R (C::*)(Args...)
volatile; };
228 template <
typename C,
typename S>
231 typedef char (&
no)[2];
236 template <
typename T, T>
struct check;
242 template <
typename>
static no deduce(...);
244 static bool constexpr
value =
sizeof(deduce<C>(0)) ==
sizeof(
yes);
248 template <
typename F,
typename S>
252 static bool constexpr
value = std::is_same<
258 template <
typename C,
typename S,
bool>
260 : std::integral_constant<
261 bool, is_functor_with_signature<C, S>::value
266 template <
typename F,
typename S>
268 : std::integral_constant<
269 bool, is_function_with_signature<F, S>::value
276 template <
typename Callable,
typename Signature>
280 std::is_class<Callable>::value
284 template <
typename Signature>
288 struct A {
void operator()(); };
291 int operator()(
int &,
void **)
const;
292 int operator()(
double);
296 int c(
int &,
void **);
298 #define _RHEOLEF_IS_CALLABLE_POSITIVE "should be recognized as callable"
299 #define _RHEOLEF_IS_CALLABLE_NEGATIVE "should not be recognized as callable"
307 #undef _RHEOLEF_IS_CALLABLE_POSITIVE
308 #undef _RHEOLEF_IS_CALLABLE_NEGATIVE
316 template <
typename C,
typename R,
typename ... Args>
320 template <
typename C,
typename R,
typename ... Args>
324 template <
typename C,
typename R,
typename ... Args>
332 typename
std::enable_if<
333 std::is_member_function_pointer<decltype(&F::operator())>::value
340 template <
typename F,
typename Sfinae =
void>
struct is_functor : std::false_type {};
342 typename
std::enable_if<
343 get_functor_result<F>::value
345 > : std::true_type {};
361 std::is_class<F>::value
362 && is_functor<F>::value
366 is_callable<F,typename get_functor_result<F>::type (const point&) const>::value
367 , std::true_type, std::false_type>
::type {};
372 typename
std::enable_if<
373 is_field_true_function<F>::value
374 || is_field_functor<F>::value
376 > : std::true_type {};
384 typename
std::enable_if<
385 is_field_true_function<F>::value
391 typename
std::enable_if<
392 is_field_functor<F>::value
399 #endif // _RHEOLEF_FIELD_EXPR_UTILITIES_H