2 //===----------------------------------------------------------------------===//
4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5 // See https://llvm.org/LICENSE.txt for license information.
6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
8 //===----------------------------------------------------------------------===//
10 #ifndef _LIBCPP___FUNCTIONAL_MEM_FN_H
11 #define _LIBCPP___FUNCTIONAL_MEM_FN_H
14 #include <__functional/binary_function.h>
15 #include <__functional/invoke.h>
16 #include <__functional/weak_result_type.h>
19 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
20 #pragma GCC system_header
23 _LIBCPP_BEGIN_NAMESPACE_STD
27 #if _LIBCPP_STD_VER <= 17 || !defined(_LIBCPP_ABI_NO_BINDER_BASES)
28 : public __weak_result_type
<_Tp
>
38 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
39 __mem_fn(type __f
) _NOEXCEPT
: __f_(__f
) {}
41 #ifndef _LIBCPP_CXX03_LANG
43 template <class... _ArgTypes
>
44 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
45 typename __invoke_return
<type
, _ArgTypes
...>::type
46 operator() (_ArgTypes
&&... __args
) const {
47 return _VSTD::__invoke(__f_
, _VSTD::forward
<_ArgTypes
>(__args
)...);
52 _LIBCPP_INLINE_VISIBILITY
53 typename __invoke_return0
<type
, _A0
>::type
54 operator() (_A0
& __a0
) const {
55 return _VSTD::__invoke(__f_
, __a0
);
59 _LIBCPP_INLINE_VISIBILITY
60 typename __invoke_return0
<type
, _A0
const>::type
61 operator() (_A0
const& __a0
) const {
62 return _VSTD::__invoke(__f_
, __a0
);
65 template <class _A0
, class _A1
>
66 _LIBCPP_INLINE_VISIBILITY
67 typename __invoke_return1
<type
, _A0
, _A1
>::type
68 operator() (_A0
& __a0
, _A1
& __a1
) const {
69 return _VSTD::__invoke(__f_
, __a0
, __a1
);
72 template <class _A0
, class _A1
>
73 _LIBCPP_INLINE_VISIBILITY
74 typename __invoke_return1
<type
, _A0
const, _A1
>::type
75 operator() (_A0
const& __a0
, _A1
& __a1
) const {
76 return _VSTD::__invoke(__f_
, __a0
, __a1
);
79 template <class _A0
, class _A1
>
80 _LIBCPP_INLINE_VISIBILITY
81 typename __invoke_return1
<type
, _A0
, _A1
const>::type
82 operator() (_A0
& __a0
, _A1
const& __a1
) const {
83 return _VSTD::__invoke(__f_
, __a0
, __a1
);
86 template <class _A0
, class _A1
>
87 _LIBCPP_INLINE_VISIBILITY
88 typename __invoke_return1
<type
, _A0
const, _A1
const>::type
89 operator() (_A0
const& __a0
, _A1
const& __a1
) const {
90 return _VSTD::__invoke(__f_
, __a0
, __a1
);
93 template <class _A0
, class _A1
, class _A2
>
94 _LIBCPP_INLINE_VISIBILITY
95 typename __invoke_return2
<type
, _A0
, _A1
, _A2
>::type
96 operator() (_A0
& __a0
, _A1
& __a1
, _A2
& __a2
) const {
97 return _VSTD::__invoke(__f_
, __a0
, __a1
, __a2
);
100 template <class _A0
, class _A1
, class _A2
>
101 _LIBCPP_INLINE_VISIBILITY
102 typename __invoke_return2
<type
, _A0
const, _A1
, _A2
>::type
103 operator() (_A0
const& __a0
, _A1
& __a1
, _A2
& __a2
) const {
104 return _VSTD::__invoke(__f_
, __a0
, __a1
, __a2
);
107 template <class _A0
, class _A1
, class _A2
>
108 _LIBCPP_INLINE_VISIBILITY
109 typename __invoke_return2
<type
, _A0
, _A1
const, _A2
>::type
110 operator() (_A0
& __a0
, _A1
const& __a1
, _A2
& __a2
) const {
111 return _VSTD::__invoke(__f_
, __a0
, __a1
, __a2
);
114 template <class _A0
, class _A1
, class _A2
>
115 _LIBCPP_INLINE_VISIBILITY
116 typename __invoke_return2
<type
, _A0
, _A1
, _A2
const>::type
117 operator() (_A0
& __a0
, _A1
& __a1
, _A2
const& __a2
) const {
118 return _VSTD::__invoke(__f_
, __a0
, __a1
, __a2
);
121 template <class _A0
, class _A1
, class _A2
>
122 _LIBCPP_INLINE_VISIBILITY
123 typename __invoke_return2
<type
, _A0
const, _A1
const, _A2
>::type
124 operator() (_A0
const& __a0
, _A1
const& __a1
, _A2
& __a2
) const {
125 return _VSTD::__invoke(__f_
, __a0
, __a1
, __a2
);
128 template <class _A0
, class _A1
, class _A2
>
129 _LIBCPP_INLINE_VISIBILITY
130 typename __invoke_return2
<type
, _A0
const, _A1
, _A2
const>::type
131 operator() (_A0
const& __a0
, _A1
& __a1
, _A2
const& __a2
) const {
132 return _VSTD::__invoke(__f_
, __a0
, __a1
, __a2
);
135 template <class _A0
, class _A1
, class _A2
>
136 _LIBCPP_INLINE_VISIBILITY
137 typename __invoke_return2
<type
, _A0
, _A1
const, _A2
const>::type
138 operator() (_A0
& __a0
, _A1
const& __a1
, _A2
const& __a2
) const {
139 return _VSTD::__invoke(__f_
, __a0
, __a1
, __a2
);
142 template <class _A0
, class _A1
, class _A2
>
143 _LIBCPP_INLINE_VISIBILITY
144 typename __invoke_return2
<type
, _A0
const, _A1
const, _A2
const>::type
145 operator() (_A0
const& __a0
, _A1
const& __a1
, _A2
const& __a2
) const {
146 return _VSTD::__invoke(__f_
, __a0
, __a1
, __a2
);
151 template<class _Rp
, class _Tp
>
152 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
154 mem_fn(_Rp
_Tp::* __pm
) _NOEXCEPT
156 return __mem_fn
<_Rp
_Tp::*>(__pm
);
159 _LIBCPP_END_NAMESPACE_STD
161 #endif // _LIBCPP___FUNCTIONAL_MEM_FN_H