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