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:
mem_fun_t(_Sp (_Tp::* __p)())30cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI explicit mem_fun_t(_Sp (_Tp::*__p)()) : __p_(__p) {}
operator()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:
mem_fun1_t(_Sp (_Tp::* __p)(_Ap))39cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI explicit mem_fun1_t(_Sp (_Tp::*__p)(_Ap)) : __p_(__p) {}
operator()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>
mem_fun(_Sp (_Tp::* __f)())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>
mem_fun(_Sp (_Tp::* __f)(_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:
mem_fun_ref_t(_Sp (_Tp::* __p)())58cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI explicit mem_fun_ref_t(_Sp (_Tp::*__p)()) : __p_(__p) {}
operator()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:
mem_fun1_ref_t(_Sp (_Tp::* __p)(_Ap))67cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI explicit mem_fun1_ref_t(_Sp (_Tp::*__p)(_Ap)) : __p_(__p) {}
operator()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>
mem_fun_ref(_Sp (_Tp::* __f)())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>
mem_fun_ref(_Sp (_Tp::* __f)(_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:
const_mem_fun_t(_Sp (_Tp::* __p)()const)87cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI explicit const_mem_fun_t(_Sp (_Tp::*__p)() const) : __p_(__p) {}
operator()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:
const_mem_fun1_t(_Sp (_Tp::* __p)(_Ap)const)97cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI explicit const_mem_fun1_t(_Sp (_Tp::*__p)(_Ap) const) : __p_(__p) {}
operator()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>
mem_fun(_Sp (_Tp::* __f)()const)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>
mem_fun(_Sp (_Tp::* __f)(_Ap)const)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:
const_mem_fun_ref_t(_Sp (_Tp::* __p)()const)117cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI explicit const_mem_fun_ref_t(_Sp (_Tp::*__p)() const) : __p_(__p) {}
operator()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:
const_mem_fun1_ref_t(_Sp (_Tp::* __p)(_Ap)const)126cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI explicit const_mem_fun1_ref_t(_Sp (_Tp::*__p)(_Ap) const) : __p_(__p) {}
operator()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>
mem_fun_ref(_Sp (_Tp::* __f)()const)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>
mem_fun_ref(_Sp (_Tp::* __f)(_Ap)const)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