28 #ifndef VC_TRAITS_IS_FUNCTOR_ARGUMENT_IMMUTABLE_H_
29 #define VC_TRAITS_IS_FUNCTOR_ARGUMENT_IMMUTABLE_H_
31 namespace Vc_VERSIONED_NAMESPACE
35 namespace is_functor_argument_immutable_impl
37 template <
typename F,
typename A> std::true_type test(
void (F::*)(A));
38 template <
typename F,
typename A> std::true_type test(
void (F::*)(A)
const);
39 template <
typename F,
typename A> std::is_const<A> test(
void (F::*)(A &));
40 template <
typename F,
typename A> std::is_const<A> test(
void (F::*)(A &)
const);
41 template <
typename F,
typename A> std::is_const<A> test(
void (F::*)(A &&));
42 template <
typename F,
typename A> std::is_const<A> test(
void (F::*)(A &&)
const);
49 typename F,
typename A,
55 #define Vc_TEMPLATE_ template
57 typename MemberPtr = decltype(&F::Vc_TEMPLATE_
operator()<A>)>
58 decltype(is_functor_argument_immutable_impl::test(std::declval<MemberPtr>())) test2(
int);
63 template <
typename F,
typename A>
65 is_functor_argument_immutable_impl::test(std::declval<decltype(&F::operator())>()))
68 template <typename A> std::true_type test3(
void(*)(A));
69 template <typename A> std::is_const<A> test3(
void(*)(A &));
70 template <typename A> std::is_const<A> test3(
void(*)(A &&));
74 template <typename F, typename A,
bool = std::is_function<F>::value>
75 struct is_functor_argument_immutable;
76 template <typename F, typename A>
77 struct is_functor_argument_immutable<F, A, false>
78 : decltype(is_functor_argument_immutable_impl::test2<
79 typename std::remove_reference<F>::type, A>(
int())) {
81 template <
typename F,
typename A>
82 struct is_functor_argument_immutable<F, A, true>
83 : decltype(is_functor_argument_immutable_impl::test3(std::declval<F>())) {
89 #endif // VC_TRAITS_IS_FUNCTOR_ARGUMENT_IMMUTABLE_H_