29 #ifndef VC_TRAITS_IS_FUNCTOR_ARGUMENT_IMMUTABLE_H_
30 #define VC_TRAITS_IS_FUNCTOR_ARGUMENT_IMMUTABLE_H_
32 namespace Vc_VERSIONED_NAMESPACE
36 namespace is_functor_argument_immutable_impl
38 template <
typename F,
typename A> std::false_type test(
void (F::*)(A &));
39 template <
typename F,
typename A> std::false_type test(
void (F::*)(A &)
const);
40 template <
typename F,
typename A> std:: true_type test(
void (F::*)(
const A &));
41 template <
typename F,
typename A> std:: true_type test(
void (F::*)(
const A &)
const);
42 template <
typename F,
typename A> std:: true_type test(
void (F::*)(
const A &&));
43 template <
typename F,
typename A> std:: true_type test(
void (F::*)(
const A &&)
const);
44 template <
typename F,
typename A> std:: true_type test(
void (F::*)(
const A));
45 template <
typename F,
typename A> std:: true_type test(
void (F::*)(
const A)
const);
46 template <
typename F,
typename A> std:: true_type test(
void (F::*)(A));
47 template <
typename F,
typename A> std:: true_type test(
void (F::*)(A)
const);
51 template <
typename F,
typename A> std::false_type test(
void (F::*)(A &&));
52 template <
typename F,
typename A> std::false_type test(
void (F::*)(A &&)
const);
59 typename F,
typename A
67 typename = decltype(std::declval<F &>()(std::declval<dummy &>()))
70 typename MemberPtr = decltype(&F::template
operator()<A>)>
71 decltype(is_functor_argument_immutable_impl::test(std::declval<MemberPtr>())) test2(
int);
75 template <typename F, typename A>
77 is_functor_argument_immutable_impl::test(
std::declval<decltype(&F::operator())>()))
80 template <typename A>
std::false_type test3(
void (*)(A &));
81 template <typename A>
std:: true_type test3(
void (*)(const A &));
82 template <typename A>
std:: true_type test3(
void (*)(const A));
83 template <typename A>
std:: true_type test3(
void (*)(A));
84 template <typename A>
std:: true_type test3(
void (*)(A &&));
88 template <typename F, typename A,
bool =
std::is_function<F>::value>
89 struct is_functor_argument_immutable;
90 template <typename F, typename A>
91 struct is_functor_argument_immutable<F, A, false>
92 : public decltype(is_functor_argument_immutable_impl::test2<
93 typename
std::remove_reference<F>::type, A>(
int())) {
95 template <
typename F,
typename A>
96 struct is_functor_argument_immutable<F, A, true>
97 :
public decltype(is_functor_argument_immutable_impl::test3(std::declval<F>())) {
103 #endif // VC_TRAITS_IS_FUNCTOR_ARGUMENT_IMMUTABLE_H_