summaryrefslogtreecommitdiffstats
path: root/libcxx/include/__functional_base
diff options
context:
space:
mode:
authorHoward Hinnant <hhinnant@apple.com>2011-05-20 22:02:53 +0000
committerHoward Hinnant <hhinnant@apple.com>2011-05-20 22:02:53 +0000
commit6282a4a1d37ab8a530fcbb729d7c446246ae32fe (patch)
tree0df15f74231491c5e40bb4daab1701537ab61d27 /libcxx/include/__functional_base
parent8aded86edb9aeb0e361ff763e68ce8f065913f98 (diff)
downloadbcm5719-llvm-6282a4a1d37ab8a530fcbb729d7c446246ae32fe.tar.gz
bcm5719-llvm-6282a4a1d37ab8a530fcbb729d7c446246ae32fe.zip
This is a simplified (and superior) implementation of __invoke, __invokable and __invoke_of. It is superior in that __invoke now handles reference qualified member functions whereas the previous implementation did not. And it simply has less infrastructure in its implementation. I'm still learning how to program in C++11 (and probably will be for a long time). This change does not impact the behavior we're seeing in http://llvm.org/bugs/show_bug.cgi?id=9975
llvm-svn: 131761
Diffstat (limited to 'libcxx/include/__functional_base')
-rw-r--r--libcxx/include/__functional_base176
1 files changed, 31 insertions, 145 deletions
diff --git a/libcxx/include/__functional_base b/libcxx/include/__functional_base
index 518c9b7afe6..caf0093eb81 100644
--- a/libcxx/include/__functional_base
+++ b/libcxx/include/__functional_base
@@ -281,169 +281,55 @@ struct __weak_result_type<_R (_C::*)(_A1, _A2, _A3...) const volatile>
// __invoke
-// first bullet
+// bullets 1 and 2
-template <class _R, class _T, class _T1, class ..._Param, class ..._Arg>
+template <class _F, class _A0, class ..._Args>
inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- sizeof...(_Param) == sizeof...(_Arg) &&
- is_base_of<_T, typename remove_reference<_T1>::type>::value,
- _R
->::type
-__invoke(_R (_T::*__f)(_Param...), _T1&& __t1, _Arg&& ...__arg)
-{
- return (_STD::forward<_T>(__t1).*__f)(_STD::forward<_Arg>(__arg)...);
-}
-
-template <class _R, class _T, class _T1, class ..._Param, class ..._Arg>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- sizeof...(_Param) == sizeof...(_Arg) &&
- is_base_of<_T, typename remove_reference<_T1>::type>::value,
- _R
->::type
-__invoke(_R (_T::*__f)(_Param...) const, _T1&& __t1, _Arg&& ...__arg)
-{
- return (_STD::forward<const _T>(__t1).*__f)(_STD::forward<_Arg>(__arg)...);
-}
-
-template <class _R, class _T, class _T1, class ..._Param, class ..._Arg>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- sizeof...(_Param) == sizeof...(_Arg) &&
- is_base_of<_T, typename remove_reference<_T1>::type>::value,
- _R
->::type
-__invoke(_R (_T::*__f)(_Param...) volatile, _T1&& __t1, _Arg&& ...__arg)
-{
- return (_STD::forward<volatile _T>(__t1).*__f)(_STD::forward<_Arg>(__arg)...);
-}
-
-template <class _R, class _T, class _T1, class ..._Param, class ..._Arg>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- sizeof...(_Param) == sizeof...(_Arg) &&
- is_base_of<_T, typename remove_reference<_T1>::type>::value,
- _R
->::type
-__invoke(_R (_T::*__f)(_Param...) const volatile, _T1&& __t1, _Arg&& ...__arg)
-{
- return (_STD::forward<const volatile _T>(__t1).*__f)(_STD::forward<_Arg>(__arg)...);
-}
-
-// second bullet
-
-template <class _R, class _T, class _T1, class ..._Param, class ..._Arg>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- sizeof...(_Param) == sizeof...(_Arg) &&
- !is_base_of<_T, typename remove_reference<_T1>::type>::value,
- _R
->::type
-__invoke(_R (_T::*__f)(_Param...), _T1&& __t1, _Arg&& ...__arg)
-{
- return ((*_STD::forward<_T1>(__t1)).*__f)(_STD::forward<_Arg>(__arg)...);
-}
-
-template <class _R, class _T, class _T1, class ..._Param, class ..._Arg>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- sizeof...(_Param) == sizeof...(_Arg) &&
- !is_base_of<_T, typename remove_reference<_T1>::type>::value,
- _R
->::type
-__invoke(_R (_T::*__f)(_Param...) const, _T1&& __t1, _Arg&& ...__arg)
-{
- return ((*_STD::forward<_T1>(__t1)).*__f)(_STD::forward<_Arg>(__arg)...);
-}
-
-template <class _R, class _T, class _T1, class ..._Param, class ..._Arg>
-inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- sizeof...(_Param) == sizeof...(_Arg) &&
- !is_base_of<_T, typename remove_reference<_T1>::type>::value,
- _R
->::type
-__invoke(_R (_T::*__f)(_Param...) volatile, _T1&& __t1, _Arg&& ...__arg)
-{
- return ((*_STD::forward<_T1>(__t1)).*__f)(_STD::forward<_Arg>(__arg)...);
+auto
+__invoke(_F&& __f, _A0&& __a0, _Args&& ...__args)
+ -> decltype((_STD::forward<_A0>(__a0).*__f)(_STD::forward<_Args>(__args)...))
+{
+ return (_STD::forward<_A0>(__a0).*__f)(_STD::forward<_Args>(__args)...);
}
-template <class _R, class _T, class _T1, class ..._Param, class ..._Arg>
+template <class _F, class _A0, class ..._Args>
inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- sizeof...(_Param) == sizeof...(_Arg) &&
- !is_base_of<_T, typename remove_reference<_T1>::type>::value,
- _R
->::type
-__invoke(_R (_T::*__f)(_Param...) const volatile, _T1&& __t1, _Arg&& ...__arg)
-{
- return ((*_STD::forward<_T1>(__t1)).*__f)(_STD::forward<_Arg>(__arg)...);
+auto
+__invoke(_F&& __f, _A0&& __a0, _Args&& ...__args)
+ -> decltype(((*_STD::forward<_A0>(__a0)).*__f)(_STD::forward<_Args>(__args)...))
+{
+ return ((*_STD::forward<_A0>(__a0)).*__f)(_STD::forward<_Args>(__args)...);
}
-// third bullet
+// bullets 3 and 4
-template <class _R, class _T, class _T1>
+template <class _F, class _A0>
inline _LIBCPP_INLINE_VISIBILITY
-typename enable_if
-<
- is_base_of<_T, typename remove_reference<_T1>::type>::value,
- typename __apply_cv<_T1, _R>::type&&
->::type
-__invoke(_R _T::* __f, _T1&& __t1)
-{
- return _STD::forward<_T1>(__t1).*__f;
-}
-
-// forth bullet
-
-template <class _T1, class _R, bool>
-struct __4th_helper
+auto
+__invoke(_F&& __f, _A0&& __a0)
+ -> decltype(_STD::forward<_A0>(__a0).*__f)
{
-};
-
-template <class _T1, class _R>
-struct __4th_helper<_T1, _R, true>
-{
- typedef typename __apply_cv<decltype(*_STD::declval<_T1>()), _R>::type type;
-};
-
-template <class _R, class _T, class _T1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename __4th_helper<_T1, _R,
- !is_base_of<_T,
- typename remove_reference<_T1>::type
- >::value
- >::type&&
-__invoke(_R _T::* __f, _T1&& __t1)
-{
- return (*_STD::forward<_T1>(__t1)).*__f;
+ return _STD::forward<_A0>(__a0).*__f;
}
-// fifth bullet
-
-template <class _R, class ..._Param, class ..._Args>
+template <class _F, class _A0>
inline _LIBCPP_INLINE_VISIBILITY
-_R
-__invoke(_R (*__f)(_Param...), _Args&& ...__args)
+auto
+__invoke(_F&& __f, _A0&& __a0)
+ -> decltype((*_STD::forward<_A0>(__a0)).*__f)
{
- return __f(_STD::forward<_Args>(__args)...);
+ return (*_STD::forward<_A0>(__a0)).*__f;
}
-template <class _F, class ..._T>
+// bullet 5
+
+template <class _F, class ..._Args>
inline _LIBCPP_INLINE_VISIBILITY
-typename __invoke_of<_F, _T...>::type
-__invoke(_F&& __f, _T&& ...__t)
+auto
+__invoke(_F&& __f, _Args&& ...__args)
+ -> decltype(_STD::forward<_F>(__f)(_STD::forward<_Args>(__args)...))
{
- return _STD::forward<_F>(__f)(_STD::forward<_T>(__t)...);
+ return _STD::forward<_F>(__f)(_STD::forward<_Args>(__args)...);
}
template <class _Tp, class ..._Args>
OpenPOWER on IntegriCloud