xref: /freebsd-src/contrib/llvm-project/libcxx/include/__functional/mem_fun_ref.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1fe6060f1SDimitry Andric // -*- C++ -*-
2fe6060f1SDimitry Andric //===----------------------------------------------------------------------===//
3fe6060f1SDimitry Andric //
4fe6060f1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5fe6060f1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
6fe6060f1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7fe6060f1SDimitry Andric //
8fe6060f1SDimitry Andric //===----------------------------------------------------------------------===//
9fe6060f1SDimitry Andric 
10fe6060f1SDimitry Andric #ifndef _LIBCPP___FUNCTIONAL_MEM_FUN_REF_H
11fe6060f1SDimitry Andric #define _LIBCPP___FUNCTIONAL_MEM_FUN_REF_H
12fe6060f1SDimitry Andric 
13fe6060f1SDimitry Andric #include <__config>
14fe6060f1SDimitry Andric #include <__functional/binary_function.h>
1504eeddc0SDimitry Andric #include <__functional/unary_function.h>
16fe6060f1SDimitry Andric 
17fe6060f1SDimitry Andric #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
18fe6060f1SDimitry Andric #  pragma GCC system_header
19fe6060f1SDimitry Andric #endif
20fe6060f1SDimitry Andric 
21fe6060f1SDimitry Andric _LIBCPP_BEGIN_NAMESPACE_STD
22fe6060f1SDimitry Andric 
23fe6060f1SDimitry Andric #if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_BINDERS)
24fe6060f1SDimitry Andric 
25fe6060f1SDimitry Andric template <class _Sp, class _Tp>
26cb14a3feSDimitry Andric class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 mem_fun_t : public __unary_function<_Tp*, _Sp> {
27fe6060f1SDimitry Andric   _Sp (_Tp::*__p_)();
28cb14a3feSDimitry Andric 
29fe6060f1SDimitry Andric public:
30cb14a3feSDimitry Andric   _LIBCPP_HIDE_FROM_ABI explicit mem_fun_t(_Sp (_Tp::*__p)()) : __p_(__p) {}
31cb14a3feSDimitry Andric   _LIBCPP_HIDE_FROM_ABI _Sp operator()(_Tp* __p) const { return (__p->*__p_)(); }
32fe6060f1SDimitry Andric };
33fe6060f1SDimitry Andric 
34fe6060f1SDimitry Andric template <class _Sp, class _Tp, class _Ap>
35cb14a3feSDimitry Andric class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 mem_fun1_t : public __binary_function<_Tp*, _Ap, _Sp> {
36fe6060f1SDimitry Andric   _Sp (_Tp::*__p_)(_Ap);
37cb14a3feSDimitry Andric 
38fe6060f1SDimitry Andric public:
39cb14a3feSDimitry Andric   _LIBCPP_HIDE_FROM_ABI explicit mem_fun1_t(_Sp (_Tp::*__p)(_Ap)) : __p_(__p) {}
40cb14a3feSDimitry Andric   _LIBCPP_HIDE_FROM_ABI _Sp operator()(_Tp* __p, _Ap __x) const { return (__p->*__p_)(__x); }
41fe6060f1SDimitry Andric };
42fe6060f1SDimitry Andric 
43fe6060f1SDimitry Andric template <class _Sp, class _Tp>
44cb14a3feSDimitry Andric _LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_HIDE_FROM_ABI mem_fun_t<_Sp, _Tp> mem_fun(_Sp (_Tp::*__f)()) {
45cb14a3feSDimitry Andric   return mem_fun_t<_Sp, _Tp>(__f);
46cb14a3feSDimitry Andric }
47fe6060f1SDimitry Andric 
48fe6060f1SDimitry Andric template <class _Sp, class _Tp, class _Ap>
49cb14a3feSDimitry Andric _LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_HIDE_FROM_ABI mem_fun1_t<_Sp, _Tp, _Ap> mem_fun(_Sp (_Tp::*__f)(_Ap)) {
50cb14a3feSDimitry Andric   return mem_fun1_t<_Sp, _Tp, _Ap>(__f);
51cb14a3feSDimitry Andric }
52fe6060f1SDimitry Andric 
53fe6060f1SDimitry Andric template <class _Sp, class _Tp>
54cb14a3feSDimitry Andric class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 mem_fun_ref_t : public __unary_function<_Tp, _Sp> {
55fe6060f1SDimitry Andric   _Sp (_Tp::*__p_)();
56cb14a3feSDimitry Andric 
57fe6060f1SDimitry Andric public:
58cb14a3feSDimitry Andric   _LIBCPP_HIDE_FROM_ABI explicit mem_fun_ref_t(_Sp (_Tp::*__p)()) : __p_(__p) {}
59cb14a3feSDimitry Andric   _LIBCPP_HIDE_FROM_ABI _Sp operator()(_Tp& __p) const { return (__p.*__p_)(); }
60fe6060f1SDimitry Andric };
61fe6060f1SDimitry Andric 
62fe6060f1SDimitry Andric template <class _Sp, class _Tp, class _Ap>
63cb14a3feSDimitry Andric class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 mem_fun1_ref_t : public __binary_function<_Tp, _Ap, _Sp> {
64fe6060f1SDimitry Andric   _Sp (_Tp::*__p_)(_Ap);
65cb14a3feSDimitry Andric 
66fe6060f1SDimitry Andric public:
67cb14a3feSDimitry Andric   _LIBCPP_HIDE_FROM_ABI explicit mem_fun1_ref_t(_Sp (_Tp::*__p)(_Ap)) : __p_(__p) {}
68cb14a3feSDimitry Andric   _LIBCPP_HIDE_FROM_ABI _Sp operator()(_Tp& __p, _Ap __x) const { return (__p.*__p_)(__x); }
69fe6060f1SDimitry Andric };
70fe6060f1SDimitry Andric 
71fe6060f1SDimitry Andric template <class _Sp, class _Tp>
72cb14a3feSDimitry Andric _LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_HIDE_FROM_ABI mem_fun_ref_t<_Sp, _Tp> mem_fun_ref(_Sp (_Tp::*__f)()) {
73cb14a3feSDimitry Andric   return mem_fun_ref_t<_Sp, _Tp>(__f);
74cb14a3feSDimitry Andric }
75fe6060f1SDimitry Andric 
76fe6060f1SDimitry Andric template <class _Sp, class _Tp, class _Ap>
77cb14a3feSDimitry Andric _LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_HIDE_FROM_ABI mem_fun1_ref_t<_Sp, _Tp, _Ap>
78cb14a3feSDimitry Andric mem_fun_ref(_Sp (_Tp::*__f)(_Ap)) {
79cb14a3feSDimitry Andric   return mem_fun1_ref_t<_Sp, _Tp, _Ap>(__f);
80cb14a3feSDimitry Andric }
81fe6060f1SDimitry Andric 
82fe6060f1SDimitry Andric template <class _Sp, class _Tp>
83cb14a3feSDimitry Andric class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 const_mem_fun_t : public __unary_function<const _Tp*, _Sp> {
84fe6060f1SDimitry Andric   _Sp (_Tp::*__p_)() const;
85cb14a3feSDimitry Andric 
86fe6060f1SDimitry Andric public:
87cb14a3feSDimitry Andric   _LIBCPP_HIDE_FROM_ABI explicit const_mem_fun_t(_Sp (_Tp::*__p)() const) : __p_(__p) {}
88cb14a3feSDimitry Andric   _LIBCPP_HIDE_FROM_ABI _Sp operator()(const _Tp* __p) const { return (__p->*__p_)(); }
89fe6060f1SDimitry Andric };
90fe6060f1SDimitry Andric 
91fe6060f1SDimitry Andric template <class _Sp, class _Tp, class _Ap>
92*0fca6ea1SDimitry Andric class _LIBCPP_TEMPLATE_VIS
93*0fca6ea1SDimitry Andric _LIBCPP_DEPRECATED_IN_CXX11 const_mem_fun1_t : public __binary_function<const _Tp*, _Ap, _Sp> {
94fe6060f1SDimitry Andric   _Sp (_Tp::*__p_)(_Ap) const;
95cb14a3feSDimitry Andric 
96fe6060f1SDimitry Andric public:
97cb14a3feSDimitry Andric   _LIBCPP_HIDE_FROM_ABI explicit const_mem_fun1_t(_Sp (_Tp::*__p)(_Ap) const) : __p_(__p) {}
98cb14a3feSDimitry Andric   _LIBCPP_HIDE_FROM_ABI _Sp operator()(const _Tp* __p, _Ap __x) const { return (__p->*__p_)(__x); }
99fe6060f1SDimitry Andric };
100fe6060f1SDimitry Andric 
101fe6060f1SDimitry Andric template <class _Sp, class _Tp>
102cb14a3feSDimitry Andric _LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_HIDE_FROM_ABI const_mem_fun_t<_Sp, _Tp> mem_fun(_Sp (_Tp::*__f)() const) {
103cb14a3feSDimitry Andric   return const_mem_fun_t<_Sp, _Tp>(__f);
104cb14a3feSDimitry Andric }
105fe6060f1SDimitry Andric 
106fe6060f1SDimitry Andric template <class _Sp, class _Tp, class _Ap>
107cb14a3feSDimitry Andric _LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_HIDE_FROM_ABI const_mem_fun1_t<_Sp, _Tp, _Ap>
108cb14a3feSDimitry Andric mem_fun(_Sp (_Tp::*__f)(_Ap) const) {
109cb14a3feSDimitry Andric   return const_mem_fun1_t<_Sp, _Tp, _Ap>(__f);
110cb14a3feSDimitry Andric }
111fe6060f1SDimitry Andric 
112fe6060f1SDimitry Andric template <class _Sp, class _Tp>
113cb14a3feSDimitry Andric class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 const_mem_fun_ref_t : public __unary_function<_Tp, _Sp> {
114fe6060f1SDimitry Andric   _Sp (_Tp::*__p_)() const;
115cb14a3feSDimitry Andric 
116fe6060f1SDimitry Andric public:
117cb14a3feSDimitry Andric   _LIBCPP_HIDE_FROM_ABI explicit const_mem_fun_ref_t(_Sp (_Tp::*__p)() const) : __p_(__p) {}
118cb14a3feSDimitry Andric   _LIBCPP_HIDE_FROM_ABI _Sp operator()(const _Tp& __p) const { return (__p.*__p_)(); }
119fe6060f1SDimitry Andric };
120fe6060f1SDimitry Andric 
121fe6060f1SDimitry Andric template <class _Sp, class _Tp, class _Ap>
122cb14a3feSDimitry Andric class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 const_mem_fun1_ref_t : public __binary_function<_Tp, _Ap, _Sp> {
123fe6060f1SDimitry Andric   _Sp (_Tp::*__p_)(_Ap) const;
124cb14a3feSDimitry Andric 
125fe6060f1SDimitry Andric public:
126cb14a3feSDimitry Andric   _LIBCPP_HIDE_FROM_ABI explicit const_mem_fun1_ref_t(_Sp (_Tp::*__p)(_Ap) const) : __p_(__p) {}
127cb14a3feSDimitry Andric   _LIBCPP_HIDE_FROM_ABI _Sp operator()(const _Tp& __p, _Ap __x) const { return (__p.*__p_)(__x); }
128fe6060f1SDimitry Andric };
129fe6060f1SDimitry Andric 
130fe6060f1SDimitry Andric template <class _Sp, class _Tp>
131cb14a3feSDimitry Andric _LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_HIDE_FROM_ABI const_mem_fun_ref_t<_Sp, _Tp>
132cb14a3feSDimitry Andric mem_fun_ref(_Sp (_Tp::*__f)() const) {
133cb14a3feSDimitry Andric   return const_mem_fun_ref_t<_Sp, _Tp>(__f);
134cb14a3feSDimitry Andric }
135fe6060f1SDimitry Andric 
136fe6060f1SDimitry Andric template <class _Sp, class _Tp, class _Ap>
137cb14a3feSDimitry Andric _LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_HIDE_FROM_ABI const_mem_fun1_ref_t<_Sp, _Tp, _Ap>
138cb14a3feSDimitry Andric mem_fun_ref(_Sp (_Tp::*__f)(_Ap) const) {
139cb14a3feSDimitry Andric   return const_mem_fun1_ref_t<_Sp, _Tp, _Ap>(__f);
140cb14a3feSDimitry Andric }
141fe6060f1SDimitry Andric 
142fe6060f1SDimitry Andric #endif // _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_BINDERS)
143fe6060f1SDimitry Andric 
144fe6060f1SDimitry Andric _LIBCPP_END_NAMESPACE_STD
145fe6060f1SDimitry Andric 
146fe6060f1SDimitry Andric #endif // _LIBCPP___FUNCTIONAL_MEM_FUN_REF_H
147