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_FN_H 11fe6060f1SDimitry Andric #define _LIBCPP___FUNCTIONAL_MEM_FN_H 12fe6060f1SDimitry Andric 13fe6060f1SDimitry Andric #include <__config> 14fe6060f1SDimitry Andric #include <__functional/binary_function.h> 15fe6060f1SDimitry Andric #include <__functional/invoke.h> 1604eeddc0SDimitry Andric #include <__functional/weak_result_type.h> 1781ad6265SDimitry Andric #include <__utility/forward.h> 18fe6060f1SDimitry Andric 19fe6060f1SDimitry Andric #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 20fe6060f1SDimitry Andric # pragma GCC system_header 21fe6060f1SDimitry Andric #endif 22fe6060f1SDimitry Andric 23fe6060f1SDimitry Andric _LIBCPP_BEGIN_NAMESPACE_STD 24fe6060f1SDimitry Andric 25fe6060f1SDimitry Andric template <class _Tp> 26*cb14a3feSDimitry Andric class __mem_fn : public __weak_result_type<_Tp> { 27fe6060f1SDimitry Andric public: 28fe6060f1SDimitry Andric // types 29fe6060f1SDimitry Andric typedef _Tp type; 30*cb14a3feSDimitry Andric 31fe6060f1SDimitry Andric private: 32fe6060f1SDimitry Andric type __f_; 33fe6060f1SDimitry Andric 34fe6060f1SDimitry Andric public: __mem_fn(type __f)35*cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __mem_fn(type __f) _NOEXCEPT : __f_(__f) {} 36fe6060f1SDimitry Andric 37fe6060f1SDimitry Andric // invoke 38fe6060f1SDimitry Andric template <class... _ArgTypes> 395f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 4081ad6265SDimitry Andric 41fe6060f1SDimitry Andric typename __invoke_return<type, _ArgTypes...>::type operator()42fe6060f1SDimitry Andric operator()(_ArgTypes&&... __args) const { 4381ad6265SDimitry Andric return std::__invoke(__f_, std::forward<_ArgTypes>(__args)...); 44fe6060f1SDimitry Andric } 45fe6060f1SDimitry Andric }; 46fe6060f1SDimitry Andric 47fe6060f1SDimitry Andric template <class _Rp, class _Tp> mem_fn(_Rp _Tp::* __pm)48*cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __mem_fn<_Rp _Tp::*> mem_fn(_Rp _Tp::*__pm) _NOEXCEPT { 49fe6060f1SDimitry Andric return __mem_fn<_Rp _Tp::*>(__pm); 50fe6060f1SDimitry Andric } 51fe6060f1SDimitry Andric 52fe6060f1SDimitry Andric _LIBCPP_END_NAMESPACE_STD 53fe6060f1SDimitry Andric 54fe6060f1SDimitry Andric #endif // _LIBCPP___FUNCTIONAL_MEM_FN_H 55