File indexing completed on 2025-12-16 10:33:15
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028 #ifndef VC_TRAITS_IS_FUNCTOR_ARGUMENT_IMMUTABLE_H_
0029 #define VC_TRAITS_IS_FUNCTOR_ARGUMENT_IMMUTABLE_H_
0030
0031 namespace Vc_VERSIONED_NAMESPACE
0032 {
0033 namespace Traits
0034 {
0035 namespace is_functor_argument_immutable_impl
0036 {
0037 template <typename F, typename A> std::true_type test(void (F::*)(A));
0038 template <typename F, typename A> std::true_type test(void (F::*)(A) const);
0039 template <typename F, typename A> std::is_const<A> test(void (F::*)(A &));
0040 template <typename F, typename A> std::is_const<A> test(void (F::*)(A &) const);
0041 template <typename F, typename A> std::is_const<A> test(void (F::*)(A &&));
0042 template <typename F, typename A> std::is_const<A> test(void (F::*)(A &&) const);
0043
0044 struct dummy {};
0045
0046
0047
0048 template <
0049 typename F, typename A,
0050 #ifdef Vc_MSVC
0051
0052
0053 #define Vc_TEMPLATE_
0054 #else
0055 #define Vc_TEMPLATE_ template
0056 #endif
0057 typename MemberPtr = decltype(&F::Vc_TEMPLATE_ operator()<A>)>
0058 decltype(is_functor_argument_immutable_impl::test(std::declval<MemberPtr>())) test2(int);
0059 #undef Vc_TEMPLATE_
0060
0061
0062
0063 template <typename F, typename A>
0064 decltype(
0065 is_functor_argument_immutable_impl::test(std::declval<decltype(&F::operator())>()))
0066 test2(float);
0067
0068 template <typename A> std::true_type test3(void(*)(A));
0069 template <typename A> std::is_const<A> test3(void(*)(A &));
0070 template <typename A> std::is_const<A> test3(void(*)(A &&));
0071
0072 }
0073
0074 template <typename F, typename A, bool = std::is_function<F>::value>
0075 struct is_functor_argument_immutable;
0076 template <typename F, typename A>
0077 struct is_functor_argument_immutable<F, A, false>
0078 : decltype(is_functor_argument_immutable_impl::test2<
0079 typename std::remove_reference<F>::type, A>(int())) {
0080 };
0081 template <typename F, typename A>
0082 struct is_functor_argument_immutable<F, A, true>
0083 : decltype(is_functor_argument_immutable_impl::test3(std::declval<F>())) {
0084 };
0085
0086 }
0087 }
0088
0089 #endif
0090
0091