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