Remove almost everything in <__functional_base_03>
This patch removes a large amount of duplicate code found in both <__functional_base> and <__functional_base_03>. The only code that remains in <__functional_base_03> is the C++03 implementation of __invoke and __invoke_return. git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@242951 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
9962ddfa24
commit
5b3a4593da
@ -127,11 +127,6 @@ addressof(__unsafe_unretained _Tp& __x) _NOEXCEPT
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef _LIBCPP_HAS_NO_VARIADICS
|
|
||||||
|
|
||||||
#include <__functional_base_03>
|
|
||||||
|
|
||||||
#else // _LIBCPP_HAS_NO_VARIADICS
|
|
||||||
|
|
||||||
// __weak_result_type
|
// __weak_result_type
|
||||||
|
|
||||||
@ -314,6 +309,8 @@ struct __weak_result_type<_Rp (_Cp::*)(_A1) const volatile>
|
|||||||
{
|
{
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
||||||
// 3 or more arguments
|
// 3 or more arguments
|
||||||
|
|
||||||
template <class _Rp, class _A1, class _A2, class _A3, class ..._A4>
|
template <class _Rp, class _A1, class _A2, class _A3, class ..._A4>
|
||||||
@ -358,8 +355,12 @@ struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...) const volatile>
|
|||||||
typedef _Rp result_type;
|
typedef _Rp result_type;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#endif // _LIBCPP_HAS_NO_VARIADICS
|
||||||
|
|
||||||
// __invoke
|
// __invoke
|
||||||
|
|
||||||
|
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
||||||
|
|
||||||
// bullets 1 and 2
|
// bullets 1 and 2
|
||||||
|
|
||||||
template <class _Fp, class _A0, class ..._Args,
|
template <class _Fp, class _A0, class ..._Args,
|
||||||
@ -414,31 +415,79 @@ __invoke(_Fp&& __f, _Args&& ...__args)
|
|||||||
{
|
{
|
||||||
return _VSTD::forward<_Fp>(__f)(_VSTD::forward<_Args>(__args)...);
|
return _VSTD::forward<_Fp>(__f)(_VSTD::forward<_Args>(__args)...);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp, class ..._Args>
|
template <class _Tp, class ..._Args>
|
||||||
struct __invoke_return
|
struct __invoke_return
|
||||||
{
|
{
|
||||||
typedef decltype(__invoke(_VSTD::declval<_Tp>(), _VSTD::declval<_Args>()...)) type;
|
typedef decltype(__invoke(_VSTD::declval<_Tp>(), _VSTD::declval<_Args>()...)) type;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#else // _LIBCPP_HAS_NO_VARIADICS
|
||||||
|
|
||||||
|
#include <__functional_base_03>
|
||||||
|
|
||||||
|
#endif // _LIBCPP_HAS_NO_VARIADICS
|
||||||
|
|
||||||
|
|
||||||
template <class _Ret>
|
template <class _Ret>
|
||||||
struct __invoke_void_return_wrapper
|
struct __invoke_void_return_wrapper
|
||||||
{
|
{
|
||||||
|
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
||||||
template <class ..._Args>
|
template <class ..._Args>
|
||||||
static _Ret __call(_Args&&... __args)
|
static _Ret __call(_Args&&... __args) {
|
||||||
{
|
|
||||||
return __invoke(_VSTD::forward<_Args>(__args)...);
|
return __invoke(_VSTD::forward<_Args>(__args)...);
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
template <class _Fn>
|
||||||
|
static _Ret __call(_Fn __f) {
|
||||||
|
return __invoke(__f);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class _Fn, class _A0>
|
||||||
|
static _Ret __call(_Fn __f, _A0& __a0) {
|
||||||
|
return __invoke(__f, __a0);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class _Fn, class _A0, class _A1>
|
||||||
|
static _Ret __call(_Fn __f, _A0& __a0, _A1& __a1) {
|
||||||
|
return __invoke(__f, __a0, __a1);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class _Fn, class _A0, class _A1, class _A2>
|
||||||
|
static _Ret __call(_Fn __f, _A0& __a0, _A1& __a1, _A2& __a2){
|
||||||
|
return __invoke(__f, __a0, __a1, __a2);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
struct __invoke_void_return_wrapper<void>
|
struct __invoke_void_return_wrapper<void>
|
||||||
{
|
{
|
||||||
|
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
||||||
template <class ..._Args>
|
template <class ..._Args>
|
||||||
static void __call(_Args&&... __args)
|
static void __call(_Args&&... __args) {
|
||||||
{
|
|
||||||
__invoke(_VSTD::forward<_Args>(__args)...);
|
__invoke(_VSTD::forward<_Args>(__args)...);
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
template <class _Fn>
|
||||||
|
static void __call(_Fn __f) {
|
||||||
|
__invoke(__f);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class _Fn, class _A0>
|
||||||
|
static void __call(_Fn __f, _A0& __a0) {
|
||||||
|
__invoke(__f, __a0);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class _Fn, class _A0, class _A1>
|
||||||
|
static void __call(_Fn __f, _A0& __a0, _A1& __a1) {
|
||||||
|
__invoke(__f, __a0, __a1);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class _Fn, class _A0, class _A1, class _A2>
|
||||||
|
static void __call(_Fn __f, _A0& __a0, _A1& __a1, _A2& __a2) {
|
||||||
|
__invoke(__f, __a0, __a1, __a2);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class _Tp>
|
template <class _Tp>
|
||||||
@ -463,6 +512,7 @@ public:
|
|||||||
_LIBCPP_INLINE_VISIBILITY operator type& () const _NOEXCEPT {return *__f_;}
|
_LIBCPP_INLINE_VISIBILITY operator type& () const _NOEXCEPT {return *__f_;}
|
||||||
_LIBCPP_INLINE_VISIBILITY type& get() const _NOEXCEPT {return *__f_;}
|
_LIBCPP_INLINE_VISIBILITY type& get() const _NOEXCEPT {return *__f_;}
|
||||||
|
|
||||||
|
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
||||||
// invoke
|
// invoke
|
||||||
template <class... _ArgTypes>
|
template <class... _ArgTypes>
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
@ -471,6 +521,39 @@ public:
|
|||||||
{
|
{
|
||||||
return __invoke(get(), _VSTD::forward<_ArgTypes>(__args)...);
|
return __invoke(get(), _VSTD::forward<_ArgTypes>(__args)...);
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
typename __invoke_return<type>::type
|
||||||
|
operator() () const
|
||||||
|
{
|
||||||
|
return __invoke(get());
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class _A0>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
typename __invoke_return0<type&, _A0>::type
|
||||||
|
operator() (_A0& __a0) const
|
||||||
|
{
|
||||||
|
return __invoke<type&, _A0>(get(), __a0);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class _A0, class _A1>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
typename __invoke_return1<type&, _A0, _A1>::type
|
||||||
|
operator() (_A0& __a0, _A1& __a1) const
|
||||||
|
{
|
||||||
|
return __invoke<type&, _A0, _A1>(get(), __a0, __a1);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class _A0, class _A1, class _A2>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
typename __invoke_return2<type&, _A0, _A1, _A2>::type
|
||||||
|
operator() (_A0& __a0, _A1& __a1, _A2& __a2) const
|
||||||
|
{
|
||||||
|
return __invoke<type&, _A0, _A1, _A2>(get(), __a0, __a1, __a2);
|
||||||
|
}
|
||||||
|
#endif // _LIBCPP_HAS_NO_VARIADICS
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class _Tp> struct __is_reference_wrapper_impl : public false_type {};
|
template <class _Tp> struct __is_reference_wrapper_impl : public false_type {};
|
||||||
@ -510,6 +593,7 @@ cref(reference_wrapper<_Tp> __t) _NOEXCEPT
|
|||||||
return cref(__t.get());
|
return cref(__t.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
#ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS
|
#ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS
|
||||||
|
|
||||||
|
@ -13,228 +13,7 @@
|
|||||||
|
|
||||||
// manual variadic expansion for <functional>
|
// manual variadic expansion for <functional>
|
||||||
|
|
||||||
// __weak_result_type
|
|
||||||
|
|
||||||
template <class _Tp>
|
|
||||||
struct __derives_from_unary_function
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
struct __two {char __lx; char __lxx;};
|
|
||||||
static __two __test(...);
|
|
||||||
template <class _Ap, class _Rp>
|
|
||||||
static unary_function<_Ap, _Rp>
|
|
||||||
__test(const volatile unary_function<_Ap, _Rp>*);
|
|
||||||
public:
|
|
||||||
static const bool value = !is_same<decltype(__test((_Tp*)0)), __two>::value;
|
|
||||||
typedef decltype(__test((_Tp*)0)) type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class _Tp>
|
|
||||||
struct __derives_from_binary_function
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
struct __two {char __lx; char __lxx;};
|
|
||||||
static __two __test(...);
|
|
||||||
template <class _A1, class _A2, class _Rp>
|
|
||||||
static binary_function<_A1, _A2, _Rp>
|
|
||||||
__test(const volatile binary_function<_A1, _A2, _Rp>*);
|
|
||||||
public:
|
|
||||||
static const bool value = !is_same<decltype(__test((_Tp*)0)), __two>::value;
|
|
||||||
typedef decltype(__test((_Tp*)0)) type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class _Tp, bool = __derives_from_unary_function<_Tp>::value>
|
|
||||||
struct __maybe_derive_from_unary_function // bool is true
|
|
||||||
: public __derives_from_unary_function<_Tp>::type
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class _Tp>
|
|
||||||
struct __maybe_derive_from_unary_function<_Tp, false>
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class _Tp, bool = __derives_from_binary_function<_Tp>::value>
|
|
||||||
struct __maybe_derive_from_binary_function // bool is true
|
|
||||||
: public __derives_from_binary_function<_Tp>::type
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class _Tp>
|
|
||||||
struct __maybe_derive_from_binary_function<_Tp, false>
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class _Tp, bool = __has_result_type<_Tp>::value>
|
|
||||||
struct __weak_result_type_imp // bool is true
|
|
||||||
: public __maybe_derive_from_unary_function<_Tp>,
|
|
||||||
public __maybe_derive_from_binary_function<_Tp>
|
|
||||||
{
|
|
||||||
typedef typename _Tp::result_type result_type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class _Tp>
|
|
||||||
struct __weak_result_type_imp<_Tp, false>
|
|
||||||
: public __maybe_derive_from_unary_function<_Tp>,
|
|
||||||
public __maybe_derive_from_binary_function<_Tp>
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class _Tp>
|
|
||||||
struct __weak_result_type
|
|
||||||
: public __weak_result_type_imp<typename remove_reference<_Tp>::type>
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
// 0 argument case
|
|
||||||
|
|
||||||
template <class _Rp>
|
|
||||||
struct __weak_result_type<_Rp ()>
|
|
||||||
{
|
|
||||||
typedef _Rp result_type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class _Rp>
|
|
||||||
struct __weak_result_type<_Rp (&)()>
|
|
||||||
{
|
|
||||||
typedef _Rp result_type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class _Rp>
|
|
||||||
struct __weak_result_type<_Rp (*)()>
|
|
||||||
{
|
|
||||||
typedef _Rp result_type;
|
|
||||||
};
|
|
||||||
|
|
||||||
// 1 argument case
|
|
||||||
|
|
||||||
template <class _Rp, class _A1>
|
|
||||||
struct __weak_result_type<_Rp (_A1)>
|
|
||||||
: public unary_function<_A1, _Rp>
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class _Rp, class _A1>
|
|
||||||
struct __weak_result_type<_Rp (&)(_A1)>
|
|
||||||
: public unary_function<_A1, _Rp>
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class _Rp, class _A1>
|
|
||||||
struct __weak_result_type<_Rp (*)(_A1)>
|
|
||||||
: public unary_function<_A1, _Rp>
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class _Rp, class _Cp>
|
|
||||||
struct __weak_result_type<_Rp (_Cp::*)()>
|
|
||||||
: public unary_function<_Cp*, _Rp>
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class _Rp, class _Cp>
|
|
||||||
struct __weak_result_type<_Rp (_Cp::*)() const>
|
|
||||||
: public unary_function<const _Cp*, _Rp>
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class _Rp, class _Cp>
|
|
||||||
struct __weak_result_type<_Rp (_Cp::*)() volatile>
|
|
||||||
: public unary_function<volatile _Cp*, _Rp>
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class _Rp, class _Cp>
|
|
||||||
struct __weak_result_type<_Rp (_Cp::*)() const volatile>
|
|
||||||
: public unary_function<const volatile _Cp*, _Rp>
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
// 2 argument case
|
|
||||||
|
|
||||||
template <class _Rp, class _A1, class _A2>
|
|
||||||
struct __weak_result_type<_Rp (_A1, _A2)>
|
|
||||||
: public binary_function<_A1, _A2, _Rp>
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class _Rp, class _A1, class _A2>
|
|
||||||
struct __weak_result_type<_Rp (*)(_A1, _A2)>
|
|
||||||
: public binary_function<_A1, _A2, _Rp>
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class _Rp, class _A1, class _A2>
|
|
||||||
struct __weak_result_type<_Rp (&)(_A1, _A2)>
|
|
||||||
: public binary_function<_A1, _A2, _Rp>
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class _Rp, class _Cp, class _A1>
|
|
||||||
struct __weak_result_type<_Rp (_Cp::*)(_A1)>
|
|
||||||
: public binary_function<_Cp*, _A1, _Rp>
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class _Rp, class _Cp, class _A1>
|
|
||||||
struct __weak_result_type<_Rp (_Cp::*)(_A1) const>
|
|
||||||
: public binary_function<const _Cp*, _A1, _Rp>
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class _Rp, class _Cp, class _A1>
|
|
||||||
struct __weak_result_type<_Rp (_Cp::*)(_A1) volatile>
|
|
||||||
: public binary_function<volatile _Cp*, _A1, _Rp>
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class _Rp, class _Cp, class _A1>
|
|
||||||
struct __weak_result_type<_Rp (_Cp::*)(_A1) const volatile>
|
|
||||||
: public binary_function<const volatile _Cp*, _A1, _Rp>
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
// 3 or more arguments
|
|
||||||
|
|
||||||
template <class _Rp, class _A1, class _A2, class _A3>
|
|
||||||
struct __weak_result_type<_Rp (_A1, _A2, _A3)>
|
|
||||||
{
|
|
||||||
typedef _Rp result_type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class _Rp, class _A1, class _A2, class _A3>
|
|
||||||
struct __weak_result_type<_Rp (&)(_A1, _A2, _A3)>
|
|
||||||
{
|
|
||||||
typedef _Rp result_type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class _Rp, class _A1, class _A2, class _A3>
|
|
||||||
struct __weak_result_type<_Rp (*)(_A1, _A2, _A3)>
|
|
||||||
{
|
|
||||||
typedef _Rp result_type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class _Rp, class _Cp, class _A1, class _A2>
|
|
||||||
struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2)>
|
|
||||||
{
|
|
||||||
typedef _Rp result_type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class _Rp, class _Cp, class _A1, class _A2>
|
|
||||||
struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2) const>
|
|
||||||
{
|
|
||||||
typedef _Rp result_type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class _Rp, class _Cp, class _A1, class _A2>
|
|
||||||
struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2) volatile>
|
|
||||||
{
|
|
||||||
typedef _Rp result_type;
|
|
||||||
};
|
|
||||||
|
|
||||||
// __invoke
|
// __invoke
|
||||||
|
|
||||||
|
|
||||||
// first bullet
|
// first bullet
|
||||||
|
|
||||||
template <class _Rp, class _Tp, class _T1>
|
template <class _Rp, class _Tp, class _T1>
|
||||||
@ -759,150 +538,4 @@ struct __invoke_return2
|
|||||||
_VSTD::declval<_A2>())) type;
|
_VSTD::declval<_A2>())) type;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class _Ret>
|
|
||||||
struct __invoke_void_return_wrapper
|
|
||||||
{
|
|
||||||
template <class _Fn>
|
|
||||||
static _Ret __call(_Fn __f)
|
|
||||||
{
|
|
||||||
return __invoke(__f);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Fn, class _A0>
|
|
||||||
static _Ret __call(_Fn __f, _A0& __a0)
|
|
||||||
{
|
|
||||||
return __invoke(__f, __a0);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Fn, class _A0, class _A1>
|
|
||||||
static _Ret __call(_Fn __f, _A0& __a0, _A1& __a1)
|
|
||||||
{
|
|
||||||
return __invoke(__f, __a0, __a1);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Fn, class _A0, class _A1, class _A2>
|
|
||||||
static _Ret __call(_Fn __f, _A0& __a0, _A1& __a1, _A2& __a2)
|
|
||||||
{
|
|
||||||
return __invoke(__f, __a0, __a1, __a2);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct __invoke_void_return_wrapper<void>
|
|
||||||
{
|
|
||||||
template <class _Fn>
|
|
||||||
static void __call(_Fn __f)
|
|
||||||
{
|
|
||||||
__invoke(__f);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Fn, class _A0>
|
|
||||||
static void __call(_Fn __f, _A0& __a0)
|
|
||||||
{
|
|
||||||
__invoke(__f, __a0);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Fn, class _A0, class _A1>
|
|
||||||
static void __call(_Fn __f, _A0& __a0, _A1& __a1)
|
|
||||||
{
|
|
||||||
__invoke(__f, __a0, __a1);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Fn, class _A0, class _A1, class _A2>
|
|
||||||
static void __call(_Fn __f, _A0& __a0, _A1& __a1, _A2& __a2)
|
|
||||||
{
|
|
||||||
__invoke(__f, __a0, __a1, __a2);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class _Tp>
|
|
||||||
class _LIBCPP_TYPE_VIS_ONLY reference_wrapper
|
|
||||||
: public __weak_result_type<_Tp>
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
// types
|
|
||||||
typedef _Tp type;
|
|
||||||
private:
|
|
||||||
type* __f_;
|
|
||||||
|
|
||||||
public:
|
|
||||||
// construct/copy/destroy
|
|
||||||
_LIBCPP_INLINE_VISIBILITY reference_wrapper(type& __f) : __f_(&__f) {}
|
|
||||||
|
|
||||||
// access
|
|
||||||
_LIBCPP_INLINE_VISIBILITY operator type& () const {return *__f_;}
|
|
||||||
_LIBCPP_INLINE_VISIBILITY type& get() const {return *__f_;}
|
|
||||||
|
|
||||||
// invoke
|
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
typename __invoke_return<type&>::type
|
|
||||||
operator() () const
|
|
||||||
{
|
|
||||||
return __invoke(get());
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _A0>
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
typename __invoke_return0<type&, _A0>::type
|
|
||||||
operator() (_A0& __a0) const
|
|
||||||
{
|
|
||||||
return __invoke<type&, _A0>(get(), __a0);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _A0, class _A1>
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
typename __invoke_return1<type&, _A0, _A1>::type
|
|
||||||
operator() (_A0& __a0, _A1& __a1) const
|
|
||||||
{
|
|
||||||
return __invoke<type&, _A0, _A1>(get(), __a0, __a1);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _A0, class _A1, class _A2>
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
typename __invoke_return2<type&, _A0, _A1, _A2>::type
|
|
||||||
operator() (_A0& __a0, _A1& __a1, _A2& __a2) const
|
|
||||||
{
|
|
||||||
return __invoke<type&, _A0, _A1, _A2>(get(), __a0, __a1, __a2);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
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
|
|
||||||
reference_wrapper<_Tp>
|
|
||||||
ref(_Tp& __t)
|
|
||||||
{
|
|
||||||
return reference_wrapper<_Tp>(__t);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Tp>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
reference_wrapper<_Tp>
|
|
||||||
ref(reference_wrapper<_Tp> __t)
|
|
||||||
{
|
|
||||||
return ref(__t.get());
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Tp>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
reference_wrapper<const _Tp>
|
|
||||||
cref(const _Tp& __t)
|
|
||||||
{
|
|
||||||
return reference_wrapper<const _Tp>(__t);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Tp>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
reference_wrapper<const _Tp>
|
|
||||||
cref(reference_wrapper<_Tp> __t)
|
|
||||||
{
|
|
||||||
return cref(__t.get());
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // _LIBCPP_FUNCTIONAL_BASE_03
|
#endif // _LIBCPP_FUNCTIONAL_BASE_03
|
||||||
|
Loading…
Reference in New Issue
Block a user