176d0caaeSpatrick // -*- C++ -*- 276d0caaeSpatrick //===----------------------------------------------------------------------===// 376d0caaeSpatrick // 476d0caaeSpatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 576d0caaeSpatrick // See https://llvm.org/LICENSE.txt for license information. 676d0caaeSpatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 776d0caaeSpatrick // 876d0caaeSpatrick //===----------------------------------------------------------------------===// 976d0caaeSpatrick 1076d0caaeSpatrick #ifndef _LIBCPP___FUNCTIONAL_BIND_H 1176d0caaeSpatrick #define _LIBCPP___FUNCTIONAL_BIND_H 1276d0caaeSpatrick 1376d0caaeSpatrick #include <__config> 1476d0caaeSpatrick #include <__functional/invoke.h> 15*4bdff4beSrobert #include <__functional/weak_result_type.h> 1676d0caaeSpatrick #include <cstddef> 1776d0caaeSpatrick #include <tuple> 1876d0caaeSpatrick #include <type_traits> 1976d0caaeSpatrick 2076d0caaeSpatrick #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 2176d0caaeSpatrick # pragma GCC system_header 2276d0caaeSpatrick #endif 2376d0caaeSpatrick 2476d0caaeSpatrick _LIBCPP_BEGIN_NAMESPACE_STD 2576d0caaeSpatrick 26*4bdff4beSrobert template<class _Tp> 27*4bdff4beSrobert struct is_bind_expression : _If< 28*4bdff4beSrobert _IsSame<_Tp, __remove_cvref_t<_Tp> >::value, 29*4bdff4beSrobert false_type, 30*4bdff4beSrobert is_bind_expression<__remove_cvref_t<_Tp> > 31*4bdff4beSrobert > {}; 3276d0caaeSpatrick 3376d0caaeSpatrick #if _LIBCPP_STD_VER > 14 3476d0caaeSpatrick template <class _Tp> 35*4bdff4beSrobert inline constexpr size_t is_bind_expression_v = is_bind_expression<_Tp>::value; 3676d0caaeSpatrick #endif 3776d0caaeSpatrick 38*4bdff4beSrobert template<class _Tp> 39*4bdff4beSrobert struct is_placeholder : _If< 40*4bdff4beSrobert _IsSame<_Tp, __remove_cvref_t<_Tp> >::value, 41*4bdff4beSrobert integral_constant<int, 0>, 42*4bdff4beSrobert is_placeholder<__remove_cvref_t<_Tp> > 43*4bdff4beSrobert > {}; 4476d0caaeSpatrick 4576d0caaeSpatrick #if _LIBCPP_STD_VER > 14 4676d0caaeSpatrick template <class _Tp> 47*4bdff4beSrobert inline constexpr size_t is_placeholder_v = is_placeholder<_Tp>::value; 4876d0caaeSpatrick #endif 4976d0caaeSpatrick 5076d0caaeSpatrick namespace placeholders 5176d0caaeSpatrick { 5276d0caaeSpatrick 5376d0caaeSpatrick template <int _Np> struct __ph {}; 5476d0caaeSpatrick 5576d0caaeSpatrick #if defined(_LIBCPP_CXX03_LANG) || defined(_LIBCPP_BUILDING_LIBRARY) 5676d0caaeSpatrick _LIBCPP_FUNC_VIS extern const __ph<1> _1; 5776d0caaeSpatrick _LIBCPP_FUNC_VIS extern const __ph<2> _2; 5876d0caaeSpatrick _LIBCPP_FUNC_VIS extern const __ph<3> _3; 5976d0caaeSpatrick _LIBCPP_FUNC_VIS extern const __ph<4> _4; 6076d0caaeSpatrick _LIBCPP_FUNC_VIS extern const __ph<5> _5; 6176d0caaeSpatrick _LIBCPP_FUNC_VIS extern const __ph<6> _6; 6276d0caaeSpatrick _LIBCPP_FUNC_VIS extern const __ph<7> _7; 6376d0caaeSpatrick _LIBCPP_FUNC_VIS extern const __ph<8> _8; 6476d0caaeSpatrick _LIBCPP_FUNC_VIS extern const __ph<9> _9; 6576d0caaeSpatrick _LIBCPP_FUNC_VIS extern const __ph<10> _10; 6676d0caaeSpatrick #else 67*4bdff4beSrobert /* inline */ constexpr __ph<1> _1{}; 68*4bdff4beSrobert /* inline */ constexpr __ph<2> _2{}; 69*4bdff4beSrobert /* inline */ constexpr __ph<3> _3{}; 70*4bdff4beSrobert /* inline */ constexpr __ph<4> _4{}; 71*4bdff4beSrobert /* inline */ constexpr __ph<5> _5{}; 72*4bdff4beSrobert /* inline */ constexpr __ph<6> _6{}; 73*4bdff4beSrobert /* inline */ constexpr __ph<7> _7{}; 74*4bdff4beSrobert /* inline */ constexpr __ph<8> _8{}; 75*4bdff4beSrobert /* inline */ constexpr __ph<9> _9{}; 76*4bdff4beSrobert /* inline */ constexpr __ph<10> _10{}; 7776d0caaeSpatrick #endif // defined(_LIBCPP_CXX03_LANG) || defined(_LIBCPP_BUILDING_LIBRARY) 7876d0caaeSpatrick 79*4bdff4beSrobert } // namespace placeholders 8076d0caaeSpatrick 8176d0caaeSpatrick template<int _Np> 82*4bdff4beSrobert struct is_placeholder<placeholders::__ph<_Np> > 8376d0caaeSpatrick : public integral_constant<int, _Np> {}; 8476d0caaeSpatrick 8576d0caaeSpatrick 8676d0caaeSpatrick #ifndef _LIBCPP_CXX03_LANG 8776d0caaeSpatrick 8876d0caaeSpatrick template <class _Tp, class _Uj> 8976d0caaeSpatrick inline _LIBCPP_INLINE_VISIBILITY 9076d0caaeSpatrick _Tp& 9176d0caaeSpatrick __mu(reference_wrapper<_Tp> __t, _Uj&) 9276d0caaeSpatrick { 9376d0caaeSpatrick return __t.get(); 9476d0caaeSpatrick } 9576d0caaeSpatrick 9676d0caaeSpatrick template <class _Ti, class ..._Uj, size_t ..._Indx> 9776d0caaeSpatrick inline _LIBCPP_INLINE_VISIBILITY 9876d0caaeSpatrick typename __invoke_of<_Ti&, _Uj...>::type 9976d0caaeSpatrick __mu_expand(_Ti& __ti, tuple<_Uj...>& __uj, __tuple_indices<_Indx...>) 10076d0caaeSpatrick { 10176d0caaeSpatrick return __ti(_VSTD::forward<_Uj>(_VSTD::get<_Indx>(__uj))...); 10276d0caaeSpatrick } 10376d0caaeSpatrick 10476d0caaeSpatrick template <class _Ti, class ..._Uj> 10576d0caaeSpatrick inline _LIBCPP_INLINE_VISIBILITY 106*4bdff4beSrobert typename __enable_if_t 10776d0caaeSpatrick < 10876d0caaeSpatrick is_bind_expression<_Ti>::value, 10976d0caaeSpatrick __invoke_of<_Ti&, _Uj...> 11076d0caaeSpatrick >::type 11176d0caaeSpatrick __mu(_Ti& __ti, tuple<_Uj...>& __uj) 11276d0caaeSpatrick { 11376d0caaeSpatrick typedef typename __make_tuple_indices<sizeof...(_Uj)>::type __indices; 11476d0caaeSpatrick return _VSTD::__mu_expand(__ti, __uj, __indices()); 11576d0caaeSpatrick } 11676d0caaeSpatrick 11776d0caaeSpatrick template <bool IsPh, class _Ti, class _Uj> 11876d0caaeSpatrick struct __mu_return2 {}; 11976d0caaeSpatrick 12076d0caaeSpatrick template <class _Ti, class _Uj> 12176d0caaeSpatrick struct __mu_return2<true, _Ti, _Uj> 12276d0caaeSpatrick { 12376d0caaeSpatrick typedef typename tuple_element<is_placeholder<_Ti>::value - 1, _Uj>::type type; 12476d0caaeSpatrick }; 12576d0caaeSpatrick 12676d0caaeSpatrick template <class _Ti, class _Uj> 12776d0caaeSpatrick inline _LIBCPP_INLINE_VISIBILITY 12876d0caaeSpatrick typename enable_if 12976d0caaeSpatrick < 13076d0caaeSpatrick 0 < is_placeholder<_Ti>::value, 13176d0caaeSpatrick typename __mu_return2<0 < is_placeholder<_Ti>::value, _Ti, _Uj>::type 13276d0caaeSpatrick >::type 13376d0caaeSpatrick __mu(_Ti&, _Uj& __uj) 13476d0caaeSpatrick { 13576d0caaeSpatrick const size_t _Indx = is_placeholder<_Ti>::value - 1; 13676d0caaeSpatrick return _VSTD::forward<typename tuple_element<_Indx, _Uj>::type>(_VSTD::get<_Indx>(__uj)); 13776d0caaeSpatrick } 13876d0caaeSpatrick 13976d0caaeSpatrick template <class _Ti, class _Uj> 14076d0caaeSpatrick inline _LIBCPP_INLINE_VISIBILITY 14176d0caaeSpatrick typename enable_if 14276d0caaeSpatrick < 14376d0caaeSpatrick !is_bind_expression<_Ti>::value && 14476d0caaeSpatrick is_placeholder<_Ti>::value == 0 && 14576d0caaeSpatrick !__is_reference_wrapper<_Ti>::value, 14676d0caaeSpatrick _Ti& 14776d0caaeSpatrick >::type 14876d0caaeSpatrick __mu(_Ti& __ti, _Uj&) 14976d0caaeSpatrick { 15076d0caaeSpatrick return __ti; 15176d0caaeSpatrick } 15276d0caaeSpatrick 15376d0caaeSpatrick template <class _Ti, bool IsReferenceWrapper, bool IsBindEx, bool IsPh, 15476d0caaeSpatrick class _TupleUj> 15576d0caaeSpatrick struct __mu_return_impl; 15676d0caaeSpatrick 15776d0caaeSpatrick template <bool _Invokable, class _Ti, class ..._Uj> 15876d0caaeSpatrick struct __mu_return_invokable // false 15976d0caaeSpatrick { 16076d0caaeSpatrick typedef __nat type; 16176d0caaeSpatrick }; 16276d0caaeSpatrick 16376d0caaeSpatrick template <class _Ti, class ..._Uj> 16476d0caaeSpatrick struct __mu_return_invokable<true, _Ti, _Uj...> 16576d0caaeSpatrick { 16676d0caaeSpatrick typedef typename __invoke_of<_Ti&, _Uj...>::type type; 16776d0caaeSpatrick }; 16876d0caaeSpatrick 16976d0caaeSpatrick template <class _Ti, class ..._Uj> 17076d0caaeSpatrick struct __mu_return_impl<_Ti, false, true, false, tuple<_Uj...> > 17176d0caaeSpatrick : public __mu_return_invokable<__invokable<_Ti&, _Uj...>::value, _Ti, _Uj...> 17276d0caaeSpatrick { 17376d0caaeSpatrick }; 17476d0caaeSpatrick 17576d0caaeSpatrick template <class _Ti, class _TupleUj> 17676d0caaeSpatrick struct __mu_return_impl<_Ti, false, false, true, _TupleUj> 17776d0caaeSpatrick { 17876d0caaeSpatrick typedef typename tuple_element<is_placeholder<_Ti>::value - 1, 17976d0caaeSpatrick _TupleUj>::type&& type; 18076d0caaeSpatrick }; 18176d0caaeSpatrick 18276d0caaeSpatrick template <class _Ti, class _TupleUj> 18376d0caaeSpatrick struct __mu_return_impl<_Ti, true, false, false, _TupleUj> 18476d0caaeSpatrick { 18576d0caaeSpatrick typedef typename _Ti::type& type; 18676d0caaeSpatrick }; 18776d0caaeSpatrick 18876d0caaeSpatrick template <class _Ti, class _TupleUj> 18976d0caaeSpatrick struct __mu_return_impl<_Ti, false, false, false, _TupleUj> 19076d0caaeSpatrick { 19176d0caaeSpatrick typedef _Ti& type; 19276d0caaeSpatrick }; 19376d0caaeSpatrick 19476d0caaeSpatrick template <class _Ti, class _TupleUj> 19576d0caaeSpatrick struct __mu_return 19676d0caaeSpatrick : public __mu_return_impl<_Ti, 19776d0caaeSpatrick __is_reference_wrapper<_Ti>::value, 19876d0caaeSpatrick is_bind_expression<_Ti>::value, 19976d0caaeSpatrick 0 < is_placeholder<_Ti>::value && 20076d0caaeSpatrick is_placeholder<_Ti>::value <= tuple_size<_TupleUj>::value, 20176d0caaeSpatrick _TupleUj> 20276d0caaeSpatrick { 20376d0caaeSpatrick }; 20476d0caaeSpatrick 20576d0caaeSpatrick template <class _Fp, class _BoundArgs, class _TupleUj> 20676d0caaeSpatrick struct __is_valid_bind_return 20776d0caaeSpatrick { 20876d0caaeSpatrick static const bool value = false; 20976d0caaeSpatrick }; 21076d0caaeSpatrick 21176d0caaeSpatrick template <class _Fp, class ..._BoundArgs, class _TupleUj> 21276d0caaeSpatrick struct __is_valid_bind_return<_Fp, tuple<_BoundArgs...>, _TupleUj> 21376d0caaeSpatrick { 21476d0caaeSpatrick static const bool value = __invokable<_Fp, 21576d0caaeSpatrick typename __mu_return<_BoundArgs, _TupleUj>::type...>::value; 21676d0caaeSpatrick }; 21776d0caaeSpatrick 21876d0caaeSpatrick template <class _Fp, class ..._BoundArgs, class _TupleUj> 21976d0caaeSpatrick struct __is_valid_bind_return<_Fp, const tuple<_BoundArgs...>, _TupleUj> 22076d0caaeSpatrick { 22176d0caaeSpatrick static const bool value = __invokable<_Fp, 22276d0caaeSpatrick typename __mu_return<const _BoundArgs, _TupleUj>::type...>::value; 22376d0caaeSpatrick }; 22476d0caaeSpatrick 22576d0caaeSpatrick template <class _Fp, class _BoundArgs, class _TupleUj, 22676d0caaeSpatrick bool = __is_valid_bind_return<_Fp, _BoundArgs, _TupleUj>::value> 22776d0caaeSpatrick struct __bind_return; 22876d0caaeSpatrick 22976d0caaeSpatrick template <class _Fp, class ..._BoundArgs, class _TupleUj> 23076d0caaeSpatrick struct __bind_return<_Fp, tuple<_BoundArgs...>, _TupleUj, true> 23176d0caaeSpatrick { 23276d0caaeSpatrick typedef typename __invoke_of 23376d0caaeSpatrick < 23476d0caaeSpatrick _Fp&, 23576d0caaeSpatrick typename __mu_return 23676d0caaeSpatrick < 23776d0caaeSpatrick _BoundArgs, 23876d0caaeSpatrick _TupleUj 23976d0caaeSpatrick >::type... 24076d0caaeSpatrick >::type type; 24176d0caaeSpatrick }; 24276d0caaeSpatrick 24376d0caaeSpatrick template <class _Fp, class ..._BoundArgs, class _TupleUj> 24476d0caaeSpatrick struct __bind_return<_Fp, const tuple<_BoundArgs...>, _TupleUj, true> 24576d0caaeSpatrick { 24676d0caaeSpatrick typedef typename __invoke_of 24776d0caaeSpatrick < 24876d0caaeSpatrick _Fp&, 24976d0caaeSpatrick typename __mu_return 25076d0caaeSpatrick < 25176d0caaeSpatrick const _BoundArgs, 25276d0caaeSpatrick _TupleUj 25376d0caaeSpatrick >::type... 25476d0caaeSpatrick >::type type; 25576d0caaeSpatrick }; 25676d0caaeSpatrick 25776d0caaeSpatrick template <class _Fp, class _BoundArgs, size_t ..._Indx, class _Args> 25876d0caaeSpatrick inline _LIBCPP_INLINE_VISIBILITY 25976d0caaeSpatrick typename __bind_return<_Fp, _BoundArgs, _Args>::type 26076d0caaeSpatrick __apply_functor(_Fp& __f, _BoundArgs& __bound_args, __tuple_indices<_Indx...>, 26176d0caaeSpatrick _Args&& __args) 26276d0caaeSpatrick { 26376d0caaeSpatrick return _VSTD::__invoke(__f, _VSTD::__mu(_VSTD::get<_Indx>(__bound_args), __args)...); 26476d0caaeSpatrick } 26576d0caaeSpatrick 26676d0caaeSpatrick template<class _Fp, class ..._BoundArgs> 267*4bdff4beSrobert class __bind : public __weak_result_type<typename decay<_Fp>::type> 26876d0caaeSpatrick { 26976d0caaeSpatrick protected: 27076d0caaeSpatrick typedef typename decay<_Fp>::type _Fd; 27176d0caaeSpatrick typedef tuple<typename decay<_BoundArgs>::type...> _Td; 27276d0caaeSpatrick private: 27376d0caaeSpatrick _Fd __f_; 27476d0caaeSpatrick _Td __bound_args_; 27576d0caaeSpatrick 27676d0caaeSpatrick typedef typename __make_tuple_indices<sizeof...(_BoundArgs)>::type __indices; 27776d0caaeSpatrick public: 27876d0caaeSpatrick template <class _Gp, class ..._BA, 27976d0caaeSpatrick class = typename enable_if 28076d0caaeSpatrick < 28176d0caaeSpatrick is_constructible<_Fd, _Gp>::value && 282*4bdff4beSrobert !is_same<__libcpp_remove_reference_t<_Gp>, 28376d0caaeSpatrick __bind>::value 28476d0caaeSpatrick >::type> 285*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 28676d0caaeSpatrick explicit __bind(_Gp&& __f, _BA&& ...__bound_args) 28776d0caaeSpatrick : __f_(_VSTD::forward<_Gp>(__f)), 28876d0caaeSpatrick __bound_args_(_VSTD::forward<_BA>(__bound_args)...) {} 28976d0caaeSpatrick 29076d0caaeSpatrick template <class ..._Args> 291*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 29276d0caaeSpatrick typename __bind_return<_Fd, _Td, tuple<_Args&&...> >::type 29376d0caaeSpatrick operator()(_Args&& ...__args) 29476d0caaeSpatrick { 29576d0caaeSpatrick return _VSTD::__apply_functor(__f_, __bound_args_, __indices(), 29676d0caaeSpatrick tuple<_Args&&...>(_VSTD::forward<_Args>(__args)...)); 29776d0caaeSpatrick } 29876d0caaeSpatrick 29976d0caaeSpatrick template <class ..._Args> 300*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 30176d0caaeSpatrick typename __bind_return<const _Fd, const _Td, tuple<_Args&&...> >::type 30276d0caaeSpatrick operator()(_Args&& ...__args) const 30376d0caaeSpatrick { 30476d0caaeSpatrick return _VSTD::__apply_functor(__f_, __bound_args_, __indices(), 30576d0caaeSpatrick tuple<_Args&&...>(_VSTD::forward<_Args>(__args)...)); 30676d0caaeSpatrick } 30776d0caaeSpatrick }; 30876d0caaeSpatrick 30976d0caaeSpatrick template<class _Fp, class ..._BoundArgs> 310*4bdff4beSrobert struct is_bind_expression<__bind<_Fp, _BoundArgs...> > : public true_type {}; 31176d0caaeSpatrick 31276d0caaeSpatrick template<class _Rp, class _Fp, class ..._BoundArgs> 31376d0caaeSpatrick class __bind_r 31476d0caaeSpatrick : public __bind<_Fp, _BoundArgs...> 31576d0caaeSpatrick { 31676d0caaeSpatrick typedef __bind<_Fp, _BoundArgs...> base; 31776d0caaeSpatrick typedef typename base::_Fd _Fd; 31876d0caaeSpatrick typedef typename base::_Td _Td; 31976d0caaeSpatrick public: 32076d0caaeSpatrick typedef _Rp result_type; 32176d0caaeSpatrick 32276d0caaeSpatrick 32376d0caaeSpatrick template <class _Gp, class ..._BA, 32476d0caaeSpatrick class = typename enable_if 32576d0caaeSpatrick < 32676d0caaeSpatrick is_constructible<_Fd, _Gp>::value && 327*4bdff4beSrobert !is_same<__libcpp_remove_reference_t<_Gp>, 32876d0caaeSpatrick __bind_r>::value 32976d0caaeSpatrick >::type> 330*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 33176d0caaeSpatrick explicit __bind_r(_Gp&& __f, _BA&& ...__bound_args) 33276d0caaeSpatrick : base(_VSTD::forward<_Gp>(__f), 33376d0caaeSpatrick _VSTD::forward<_BA>(__bound_args)...) {} 33476d0caaeSpatrick 33576d0caaeSpatrick template <class ..._Args> 336*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 33776d0caaeSpatrick typename enable_if 33876d0caaeSpatrick < 33976d0caaeSpatrick is_convertible<typename __bind_return<_Fd, _Td, tuple<_Args&&...> >::type, 34076d0caaeSpatrick result_type>::value || is_void<_Rp>::value, 34176d0caaeSpatrick result_type 34276d0caaeSpatrick >::type 34376d0caaeSpatrick operator()(_Args&& ...__args) 34476d0caaeSpatrick { 34576d0caaeSpatrick typedef __invoke_void_return_wrapper<_Rp> _Invoker; 34676d0caaeSpatrick return _Invoker::__call(static_cast<base&>(*this), _VSTD::forward<_Args>(__args)...); 34776d0caaeSpatrick } 34876d0caaeSpatrick 34976d0caaeSpatrick template <class ..._Args> 350*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 35176d0caaeSpatrick typename enable_if 35276d0caaeSpatrick < 35376d0caaeSpatrick is_convertible<typename __bind_return<const _Fd, const _Td, tuple<_Args&&...> >::type, 35476d0caaeSpatrick result_type>::value || is_void<_Rp>::value, 35576d0caaeSpatrick result_type 35676d0caaeSpatrick >::type 35776d0caaeSpatrick operator()(_Args&& ...__args) const 35876d0caaeSpatrick { 35976d0caaeSpatrick typedef __invoke_void_return_wrapper<_Rp> _Invoker; 36076d0caaeSpatrick return _Invoker::__call(static_cast<base const&>(*this), _VSTD::forward<_Args>(__args)...); 36176d0caaeSpatrick } 36276d0caaeSpatrick }; 36376d0caaeSpatrick 36476d0caaeSpatrick template<class _Rp, class _Fp, class ..._BoundArgs> 365*4bdff4beSrobert struct is_bind_expression<__bind_r<_Rp, _Fp, _BoundArgs...> > : public true_type {}; 36676d0caaeSpatrick 36776d0caaeSpatrick template<class _Fp, class ..._BoundArgs> 368*4bdff4beSrobert inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 36976d0caaeSpatrick __bind<_Fp, _BoundArgs...> 37076d0caaeSpatrick bind(_Fp&& __f, _BoundArgs&&... __bound_args) 37176d0caaeSpatrick { 37276d0caaeSpatrick typedef __bind<_Fp, _BoundArgs...> type; 37376d0caaeSpatrick return type(_VSTD::forward<_Fp>(__f), _VSTD::forward<_BoundArgs>(__bound_args)...); 37476d0caaeSpatrick } 37576d0caaeSpatrick 37676d0caaeSpatrick template<class _Rp, class _Fp, class ..._BoundArgs> 377*4bdff4beSrobert inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 37876d0caaeSpatrick __bind_r<_Rp, _Fp, _BoundArgs...> 37976d0caaeSpatrick bind(_Fp&& __f, _BoundArgs&&... __bound_args) 38076d0caaeSpatrick { 38176d0caaeSpatrick typedef __bind_r<_Rp, _Fp, _BoundArgs...> type; 38276d0caaeSpatrick return type(_VSTD::forward<_Fp>(__f), _VSTD::forward<_BoundArgs>(__bound_args)...); 38376d0caaeSpatrick } 38476d0caaeSpatrick 38576d0caaeSpatrick #endif // _LIBCPP_CXX03_LANG 38676d0caaeSpatrick 38776d0caaeSpatrick _LIBCPP_END_NAMESPACE_STD 38876d0caaeSpatrick 38976d0caaeSpatrick #endif // _LIBCPP___FUNCTIONAL_BIND_H 390