1 // -*- C++ -*- 2 //===----------------------------------------------------------------------===// 3 // 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 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef _LIBCPP___FUNCTIONAL_MEM_FN_H 11 #define _LIBCPP___FUNCTIONAL_MEM_FN_H 12 13 #include <__config> 14 #include <__functional/weak_result_type.h> 15 #include <__functional/binary_function.h> 16 #include <__functional/invoke.h> 17 #include <utility> 18 19 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 20 #pragma GCC system_header 21 #endif 22 23 _LIBCPP_BEGIN_NAMESPACE_STD 24 25 template <class _Tp> 26 class __mem_fn 27 #if _LIBCPP_STD_VER <= 17 || !defined(_LIBCPP_ABI_NO_BINDER_BASES) 28 : public __weak_result_type<_Tp> 29 #endif 30 { 31 public: 32 // types 33 typedef _Tp type; 34 private: 35 type __f_; 36 37 public: 38 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 39 __mem_fn(type __f) _NOEXCEPT : __f_(__f) {} 40 41 #ifndef _LIBCPP_CXX03_LANG 42 // invoke 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)...); 48 } 49 #else 50 51 template <class _A0> 52 _LIBCPP_INLINE_VISIBILITY 53 typename __invoke_return0<type, _A0>::type 54 operator() (_A0& __a0) const { 55 return _VSTD::__invoke(__f_, __a0); 56 } 57 58 template <class _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); 63 } 64 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); 70 } 71 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); 77 } 78 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); 84 } 85 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); 91 } 92 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); 98 } 99 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); 105 } 106 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); 112 } 113 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); 119 } 120 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); 126 } 127 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); 133 } 134 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); 140 } 141 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); 147 } 148 #endif 149 }; 150 151 template<class _Rp, class _Tp> 152 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 153 __mem_fn<_Rp _Tp::*> 154 mem_fn(_Rp _Tp::* __pm) _NOEXCEPT 155 { 156 return __mem_fn<_Rp _Tp::*>(__pm); 157 } 158 159 _LIBCPP_END_NAMESPACE_STD 160 161 #endif // _LIBCPP___FUNCTIONAL_MEM_FN_H 162