[lld][WebAssembly] Reinstate mistakenly disabled test. NFC
[llvm-project.git] / libcxx / include / __functional / mem_fn.h
blob0ec84233439cf1a0b0f90cb29c87d5f3b4f0d61f
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 //===----------------------------------------------------------------------===//
10 #ifndef _LIBCPP___FUNCTIONAL_MEM_FN_H
11 #define _LIBCPP___FUNCTIONAL_MEM_FN_H
13 #include <__config>
14 #include <__functional/binary_function.h>
15 #include <__functional/invoke.h>
16 #include <__functional/weak_result_type.h>
17 #include <utility>
19 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
20 #pragma GCC system_header
21 #endif
23 _LIBCPP_BEGIN_NAMESPACE_STD
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
31 public:
32 // types
33 typedef _Tp type;
34 private:
35 type __f_;
37 public:
38 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
39 __mem_fn(type __f) _NOEXCEPT : __f_(__f) {}
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)...);
49 #else
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);
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);
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);
148 #endif
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
156 return __mem_fn<_Rp _Tp::*>(__pm);
159 _LIBCPP_END_NAMESPACE_STD
161 #endif // _LIBCPP___FUNCTIONAL_MEM_FN_H