diff options
| author | Eric Fiselier <eric@efcs.ca> | 2016-04-18 06:17:30 +0000 |
|---|---|---|
| committer | Eric Fiselier <eric@efcs.ca> | 2016-04-18 06:17:30 +0000 |
| commit | 2152fd7682e3725449fc6483141dc55fc80dad16 (patch) | |
| tree | ffc09c3c81b33127dc7ea73eccf76d9b8272de4a /libcxx/include/__functional_base | |
| parent | 76a7ca0f67379705773c4d1da89e546667ff25f2 (diff) | |
| download | bcm5719-llvm-2152fd7682e3725449fc6483141dc55fc80dad16.tar.gz bcm5719-llvm-2152fd7682e3725449fc6483141dc55fc80dad16.zip | |
Implement LWG issue 2219 - support reference_wrapper in INVOKE
llvm-svn: 266590
Diffstat (limited to 'libcxx/include/__functional_base')
| -rw-r--r-- | libcxx/include/__functional_base | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/libcxx/include/__functional_base b/libcxx/include/__functional_base index 52c535aa3ea..3274842dc93 100644 --- a/libcxx/include/__functional_base +++ b/libcxx/include/__functional_base @@ -322,6 +322,17 @@ __invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args) return (_VSTD::forward<_A0>(__a0).*__f)(_VSTD::forward<_Args>(__args)...); } + +template <class _Fp, class _A0, class ..._Args, + class> +inline _LIBCPP_INLINE_VISIBILITY +auto +__invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args) + -> decltype((__a0.get().*__f)(_VSTD::forward<_Args>(__args)...)) +{ + return (__a0.get().*__f)(_VSTD::forward<_Args>(__args)...); +} + template <class _Fp, class _A0, class ..._Args, class> inline _LIBCPP_INLINE_VISIBILITY @@ -344,6 +355,17 @@ __invoke(_Fp&& __f, _A0&& __a0) return _VSTD::forward<_A0>(__a0).*__f; } + +template <class _Fp, class _A0, + class> +inline _LIBCPP_INLINE_VISIBILITY +auto +__invoke(_Fp&& __f, _A0&& __a0) + -> decltype(__a0.get().*__f) +{ + return __a0.get().*__f; +} + template <class _Fp, class _A0, class> inline _LIBCPP_INLINE_VISIBILITY @@ -577,10 +599,6 @@ public: #endif // _LIBCPP_HAS_NO_VARIADICS }; -template <class _Tp> struct __is_reference_wrapper_impl : public false_type {}; -template <class _Tp> struct __is_reference_wrapper_impl<reference_wrapper<_Tp> > : public true_type {}; -template <class _Tp> struct __is_reference_wrapper - : public __is_reference_wrapper_impl<typename remove_cv<_Tp>::type> {}; template <class _Tp> inline _LIBCPP_INLINE_VISIBILITY |

