138 lines · c
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-exception7//8//===----------------------------------------------------------------------===//9 10#ifndef _LIBCPP___CXX03___FUNCTIONAL_MEM_FUN_REF_H11#define _LIBCPP___CXX03___FUNCTIONAL_MEM_FUN_REF_H12 13#include <__cxx03/__config>14#include <__cxx03/__functional/binary_function.h>15#include <__cxx03/__functional/unary_function.h>16 17#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)18# pragma GCC system_header19#endif20 21_LIBCPP_BEGIN_NAMESPACE_STD22 23template <class _Sp, class _Tp>24class _LIBCPP_TEMPLATE_VIS mem_fun_t : public __unary_function<_Tp*, _Sp> {25 _Sp (_Tp::*__p_)();26 27public:28 _LIBCPP_HIDE_FROM_ABI explicit mem_fun_t(_Sp (_Tp::*__p)()) : __p_(__p) {}29 _LIBCPP_HIDE_FROM_ABI _Sp operator()(_Tp* __p) const { return (__p->*__p_)(); }30};31 32template <class _Sp, class _Tp, class _Ap>33class _LIBCPP_TEMPLATE_VIS mem_fun1_t : public __binary_function<_Tp*, _Ap, _Sp> {34 _Sp (_Tp::*__p_)(_Ap);35 36public:37 _LIBCPP_HIDE_FROM_ABI explicit mem_fun1_t(_Sp (_Tp::*__p)(_Ap)) : __p_(__p) {}38 _LIBCPP_HIDE_FROM_ABI _Sp operator()(_Tp* __p, _Ap __x) const { return (__p->*__p_)(__x); }39};40 41template <class _Sp, class _Tp>42inline _LIBCPP_HIDE_FROM_ABI mem_fun_t<_Sp, _Tp> mem_fun(_Sp (_Tp::*__f)()) {43 return mem_fun_t<_Sp, _Tp>(__f);44}45 46template <class _Sp, class _Tp, class _Ap>47inline _LIBCPP_HIDE_FROM_ABI mem_fun1_t<_Sp, _Tp, _Ap> mem_fun(_Sp (_Tp::*__f)(_Ap)) {48 return mem_fun1_t<_Sp, _Tp, _Ap>(__f);49}50 51template <class _Sp, class _Tp>52class _LIBCPP_TEMPLATE_VIS mem_fun_ref_t : public __unary_function<_Tp, _Sp> {53 _Sp (_Tp::*__p_)();54 55public:56 _LIBCPP_HIDE_FROM_ABI explicit mem_fun_ref_t(_Sp (_Tp::*__p)()) : __p_(__p) {}57 _LIBCPP_HIDE_FROM_ABI _Sp operator()(_Tp& __p) const { return (__p.*__p_)(); }58};59 60template <class _Sp, class _Tp, class _Ap>61class _LIBCPP_TEMPLATE_VIS mem_fun1_ref_t : public __binary_function<_Tp, _Ap, _Sp> {62 _Sp (_Tp::*__p_)(_Ap);63 64public:65 _LIBCPP_HIDE_FROM_ABI explicit mem_fun1_ref_t(_Sp (_Tp::*__p)(_Ap)) : __p_(__p) {}66 _LIBCPP_HIDE_FROM_ABI _Sp operator()(_Tp& __p, _Ap __x) const { return (__p.*__p_)(__x); }67};68 69template <class _Sp, class _Tp>70inline _LIBCPP_HIDE_FROM_ABI mem_fun_ref_t<_Sp, _Tp> mem_fun_ref(_Sp (_Tp::*__f)()) {71 return mem_fun_ref_t<_Sp, _Tp>(__f);72}73 74template <class _Sp, class _Tp, class _Ap>75inline _LIBCPP_HIDE_FROM_ABI mem_fun1_ref_t<_Sp, _Tp, _Ap> mem_fun_ref(_Sp (_Tp::*__f)(_Ap)) {76 return mem_fun1_ref_t<_Sp, _Tp, _Ap>(__f);77}78 79template <class _Sp, class _Tp>80class _LIBCPP_TEMPLATE_VIS const_mem_fun_t : public __unary_function<const _Tp*, _Sp> {81 _Sp (_Tp::*__p_)() const;82 83public:84 _LIBCPP_HIDE_FROM_ABI explicit const_mem_fun_t(_Sp (_Tp::*__p)() const) : __p_(__p) {}85 _LIBCPP_HIDE_FROM_ABI _Sp operator()(const _Tp* __p) const { return (__p->*__p_)(); }86};87 88template <class _Sp, class _Tp, class _Ap>89class _LIBCPP_TEMPLATE_VIS const_mem_fun1_t : public __binary_function<const _Tp*, _Ap, _Sp> {90 _Sp (_Tp::*__p_)(_Ap) const;91 92public:93 _LIBCPP_HIDE_FROM_ABI explicit const_mem_fun1_t(_Sp (_Tp::*__p)(_Ap) const) : __p_(__p) {}94 _LIBCPP_HIDE_FROM_ABI _Sp operator()(const _Tp* __p, _Ap __x) const { return (__p->*__p_)(__x); }95};96 97template <class _Sp, class _Tp>98inline _LIBCPP_HIDE_FROM_ABI const_mem_fun_t<_Sp, _Tp> mem_fun(_Sp (_Tp::*__f)() const) {99 return const_mem_fun_t<_Sp, _Tp>(__f);100}101 102template <class _Sp, class _Tp, class _Ap>103inline _LIBCPP_HIDE_FROM_ABI const_mem_fun1_t<_Sp, _Tp, _Ap> mem_fun(_Sp (_Tp::*__f)(_Ap) const) {104 return const_mem_fun1_t<_Sp, _Tp, _Ap>(__f);105}106 107template <class _Sp, class _Tp>108class _LIBCPP_TEMPLATE_VIS const_mem_fun_ref_t : public __unary_function<_Tp, _Sp> {109 _Sp (_Tp::*__p_)() const;110 111public:112 _LIBCPP_HIDE_FROM_ABI explicit const_mem_fun_ref_t(_Sp (_Tp::*__p)() const) : __p_(__p) {}113 _LIBCPP_HIDE_FROM_ABI _Sp operator()(const _Tp& __p) const { return (__p.*__p_)(); }114};115 116template <class _Sp, class _Tp, class _Ap>117class _LIBCPP_TEMPLATE_VIS const_mem_fun1_ref_t : public __binary_function<_Tp, _Ap, _Sp> {118 _Sp (_Tp::*__p_)(_Ap) const;119 120public:121 _LIBCPP_HIDE_FROM_ABI explicit const_mem_fun1_ref_t(_Sp (_Tp::*__p)(_Ap) const) : __p_(__p) {}122 _LIBCPP_HIDE_FROM_ABI _Sp operator()(const _Tp& __p, _Ap __x) const { return (__p.*__p_)(__x); }123};124 125template <class _Sp, class _Tp>126inline _LIBCPP_HIDE_FROM_ABI const_mem_fun_ref_t<_Sp, _Tp> mem_fun_ref(_Sp (_Tp::*__f)() const) {127 return const_mem_fun_ref_t<_Sp, _Tp>(__f);128}129 130template <class _Sp, class _Tp, class _Ap>131inline _LIBCPP_HIDE_FROM_ABI const_mem_fun1_ref_t<_Sp, _Tp, _Ap> mem_fun_ref(_Sp (_Tp::*__f)(_Ap) const) {132 return const_mem_fun1_ref_t<_Sp, _Tp, _Ap>(__f);133}134 135_LIBCPP_END_NAMESPACE_STD136 137#endif // _LIBCPP___CXX03___FUNCTIONAL_MEM_FUN_REF_H138