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_