1*e4b17023SJohn Marino// TR1 functional header -*- C++ -*- 2*e4b17023SJohn Marino 3*e4b17023SJohn Marino// Copyright (C) 2004, 2005, 2006, 2007, 2009, 2010, 2011 4*e4b17023SJohn Marino// Free Software Foundation, Inc. 5*e4b17023SJohn Marino// 6*e4b17023SJohn Marino// This file is part of the GNU ISO C++ Library. This library is free 7*e4b17023SJohn Marino// software; you can redistribute it and/or modify it under the 8*e4b17023SJohn Marino// terms of the GNU General Public License as published by the 9*e4b17023SJohn Marino// Free Software Foundation; either version 3, or (at your option) 10*e4b17023SJohn Marino// any later version. 11*e4b17023SJohn Marino 12*e4b17023SJohn Marino// This library is distributed in the hope that it will be useful, 13*e4b17023SJohn Marino// but WITHOUT ANY WARRANTY; without even the implied warranty of 14*e4b17023SJohn Marino// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15*e4b17023SJohn Marino// GNU General Public License for more details. 16*e4b17023SJohn Marino 17*e4b17023SJohn Marino// Under Section 7 of GPL version 3, you are granted additional 18*e4b17023SJohn Marino// permissions described in the GCC Runtime Library Exception, version 19*e4b17023SJohn Marino// 3.1, as published by the Free Software Foundation. 20*e4b17023SJohn Marino 21*e4b17023SJohn Marino// You should have received a copy of the GNU General Public License and 22*e4b17023SJohn Marino// a copy of the GCC Runtime Library Exception along with this program; 23*e4b17023SJohn Marino// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 24*e4b17023SJohn Marino// <http://www.gnu.org/licenses/>. 25*e4b17023SJohn Marino 26*e4b17023SJohn Marino/** @file tr1/functional 27*e4b17023SJohn Marino * This is a TR1 C++ Library header. 28*e4b17023SJohn Marino */ 29*e4b17023SJohn Marino 30*e4b17023SJohn Marino#ifndef _GLIBCXX_TR1_FUNCTIONAL 31*e4b17023SJohn Marino#define _GLIBCXX_TR1_FUNCTIONAL 1 32*e4b17023SJohn Marino 33*e4b17023SJohn Marino#pragma GCC system_header 34*e4b17023SJohn Marino 35*e4b17023SJohn Marino#include <bits/c++config.h> 36*e4b17023SJohn Marino#include <bits/stl_function.h> 37*e4b17023SJohn Marino 38*e4b17023SJohn Marino#include <typeinfo> 39*e4b17023SJohn Marino#include <new> 40*e4b17023SJohn Marino#include <tr1/tuple> 41*e4b17023SJohn Marino#include <tr1/type_traits> 42*e4b17023SJohn Marino#include <bits/stringfwd.h> 43*e4b17023SJohn Marino#include <tr1/functional_hash.h> 44*e4b17023SJohn Marino#include <ext/type_traits.h> 45*e4b17023SJohn Marino#include <bits/move.h> // for std::__addressof 46*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__ 47*e4b17023SJohn Marino# include <type_traits> // for integral_constant, true_type, false_type 48*e4b17023SJohn Marino#endif 49*e4b17023SJohn Marino 50*e4b17023SJohn Marinonamespace std _GLIBCXX_VISIBILITY(default) 51*e4b17023SJohn Marino{ 52*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__ 53*e4b17023SJohn Marino_GLIBCXX_BEGIN_NAMESPACE_VERSION 54*e4b17023SJohn Marino template<int> struct _Placeholder; 55*e4b17023SJohn Marino template<typename> class _Bind; 56*e4b17023SJohn Marino template<typename, typename> class _Bind_result; 57*e4b17023SJohn Marino_GLIBCXX_END_NAMESPACE_VERSION 58*e4b17023SJohn Marino#endif 59*e4b17023SJohn Marino 60*e4b17023SJohn Marinonamespace tr1 61*e4b17023SJohn Marino{ 62*e4b17023SJohn Marino_GLIBCXX_BEGIN_NAMESPACE_VERSION 63*e4b17023SJohn Marino 64*e4b17023SJohn Marino template<typename _MemberPointer> 65*e4b17023SJohn Marino class _Mem_fn; 66*e4b17023SJohn Marino template<typename _Tp, typename _Class> 67*e4b17023SJohn Marino _Mem_fn<_Tp _Class::*> 68*e4b17023SJohn Marino mem_fn(_Tp _Class::*); 69*e4b17023SJohn Marino 70*e4b17023SJohn Marino /** 71*e4b17023SJohn Marino * Actual implementation of _Has_result_type, which uses SFINAE to 72*e4b17023SJohn Marino * determine if the type _Tp has a publicly-accessible member type 73*e4b17023SJohn Marino * result_type. 74*e4b17023SJohn Marino */ 75*e4b17023SJohn Marino template<typename _Tp> 76*e4b17023SJohn Marino class _Has_result_type_helper : __sfinae_types 77*e4b17023SJohn Marino { 78*e4b17023SJohn Marino template<typename _Up> 79*e4b17023SJohn Marino struct _Wrap_type 80*e4b17023SJohn Marino { }; 81*e4b17023SJohn Marino 82*e4b17023SJohn Marino template<typename _Up> 83*e4b17023SJohn Marino static __one __test(_Wrap_type<typename _Up::result_type>*); 84*e4b17023SJohn Marino 85*e4b17023SJohn Marino template<typename _Up> 86*e4b17023SJohn Marino static __two __test(...); 87*e4b17023SJohn Marino 88*e4b17023SJohn Marino public: 89*e4b17023SJohn Marino static const bool value = sizeof(__test<_Tp>(0)) == 1; 90*e4b17023SJohn Marino }; 91*e4b17023SJohn Marino 92*e4b17023SJohn Marino template<typename _Tp> 93*e4b17023SJohn Marino struct _Has_result_type 94*e4b17023SJohn Marino : integral_constant<bool, 95*e4b17023SJohn Marino _Has_result_type_helper<typename remove_cv<_Tp>::type>::value> 96*e4b17023SJohn Marino { }; 97*e4b17023SJohn Marino 98*e4b17023SJohn Marino /** 99*e4b17023SJohn Marino * 100*e4b17023SJohn Marino */ 101*e4b17023SJohn Marino /// If we have found a result_type, extract it. 102*e4b17023SJohn Marino template<bool _Has_result_type, typename _Functor> 103*e4b17023SJohn Marino struct _Maybe_get_result_type 104*e4b17023SJohn Marino { }; 105*e4b17023SJohn Marino 106*e4b17023SJohn Marino template<typename _Functor> 107*e4b17023SJohn Marino struct _Maybe_get_result_type<true, _Functor> 108*e4b17023SJohn Marino { 109*e4b17023SJohn Marino typedef typename _Functor::result_type result_type; 110*e4b17023SJohn Marino }; 111*e4b17023SJohn Marino 112*e4b17023SJohn Marino /** 113*e4b17023SJohn Marino * Base class for any function object that has a weak result type, as 114*e4b17023SJohn Marino * defined in 3.3/3 of TR1. 115*e4b17023SJohn Marino */ 116*e4b17023SJohn Marino template<typename _Functor> 117*e4b17023SJohn Marino struct _Weak_result_type_impl 118*e4b17023SJohn Marino : _Maybe_get_result_type<_Has_result_type<_Functor>::value, _Functor> 119*e4b17023SJohn Marino { 120*e4b17023SJohn Marino }; 121*e4b17023SJohn Marino 122*e4b17023SJohn Marino /// Retrieve the result type for a function type. 123*e4b17023SJohn Marino template<typename _Res, typename... _ArgTypes> 124*e4b17023SJohn Marino struct _Weak_result_type_impl<_Res(_ArgTypes...)> 125*e4b17023SJohn Marino { 126*e4b17023SJohn Marino typedef _Res result_type; 127*e4b17023SJohn Marino }; 128*e4b17023SJohn Marino 129*e4b17023SJohn Marino /// Retrieve the result type for a function reference. 130*e4b17023SJohn Marino template<typename _Res, typename... _ArgTypes> 131*e4b17023SJohn Marino struct _Weak_result_type_impl<_Res(&)(_ArgTypes...)> 132*e4b17023SJohn Marino { 133*e4b17023SJohn Marino typedef _Res result_type; 134*e4b17023SJohn Marino }; 135*e4b17023SJohn Marino 136*e4b17023SJohn Marino /// Retrieve the result type for a function pointer. 137*e4b17023SJohn Marino template<typename _Res, typename... _ArgTypes> 138*e4b17023SJohn Marino struct _Weak_result_type_impl<_Res(*)(_ArgTypes...)> 139*e4b17023SJohn Marino { 140*e4b17023SJohn Marino typedef _Res result_type; 141*e4b17023SJohn Marino }; 142*e4b17023SJohn Marino 143*e4b17023SJohn Marino /// Retrieve result type for a member function pointer. 144*e4b17023SJohn Marino template<typename _Res, typename _Class, typename... _ArgTypes> 145*e4b17023SJohn Marino struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes...)> 146*e4b17023SJohn Marino { 147*e4b17023SJohn Marino typedef _Res result_type; 148*e4b17023SJohn Marino }; 149*e4b17023SJohn Marino 150*e4b17023SJohn Marino /// Retrieve result type for a const member function pointer. 151*e4b17023SJohn Marino template<typename _Res, typename _Class, typename... _ArgTypes> 152*e4b17023SJohn Marino struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes...) const> 153*e4b17023SJohn Marino { 154*e4b17023SJohn Marino typedef _Res result_type; 155*e4b17023SJohn Marino }; 156*e4b17023SJohn Marino 157*e4b17023SJohn Marino /// Retrieve result type for a volatile member function pointer. 158*e4b17023SJohn Marino template<typename _Res, typename _Class, typename... _ArgTypes> 159*e4b17023SJohn Marino struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes...) volatile> 160*e4b17023SJohn Marino { 161*e4b17023SJohn Marino typedef _Res result_type; 162*e4b17023SJohn Marino }; 163*e4b17023SJohn Marino 164*e4b17023SJohn Marino /// Retrieve result type for a const volatile member function pointer. 165*e4b17023SJohn Marino template<typename _Res, typename _Class, typename... _ArgTypes> 166*e4b17023SJohn Marino struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes...)const volatile> 167*e4b17023SJohn Marino { 168*e4b17023SJohn Marino typedef _Res result_type; 169*e4b17023SJohn Marino }; 170*e4b17023SJohn Marino 171*e4b17023SJohn Marino /** 172*e4b17023SJohn Marino * Strip top-level cv-qualifiers from the function object and let 173*e4b17023SJohn Marino * _Weak_result_type_impl perform the real work. 174*e4b17023SJohn Marino */ 175*e4b17023SJohn Marino template<typename _Functor> 176*e4b17023SJohn Marino struct _Weak_result_type 177*e4b17023SJohn Marino : _Weak_result_type_impl<typename remove_cv<_Functor>::type> 178*e4b17023SJohn Marino { 179*e4b17023SJohn Marino }; 180*e4b17023SJohn Marino 181*e4b17023SJohn Marino template<typename _Signature> 182*e4b17023SJohn Marino class result_of; 183*e4b17023SJohn Marino 184*e4b17023SJohn Marino /** 185*e4b17023SJohn Marino * Actual implementation of result_of. When _Has_result_type is 186*e4b17023SJohn Marino * true, gets its result from _Weak_result_type. Otherwise, uses 187*e4b17023SJohn Marino * the function object's member template result to extract the 188*e4b17023SJohn Marino * result type. 189*e4b17023SJohn Marino */ 190*e4b17023SJohn Marino template<bool _Has_result_type, typename _Signature> 191*e4b17023SJohn Marino struct _Result_of_impl; 192*e4b17023SJohn Marino 193*e4b17023SJohn Marino // Handle member data pointers using _Mem_fn's logic 194*e4b17023SJohn Marino template<typename _Res, typename _Class, typename _T1> 195*e4b17023SJohn Marino struct _Result_of_impl<false, _Res _Class::*(_T1)> 196*e4b17023SJohn Marino { 197*e4b17023SJohn Marino typedef typename _Mem_fn<_Res _Class::*> 198*e4b17023SJohn Marino ::template _Result_type<_T1>::type type; 199*e4b17023SJohn Marino }; 200*e4b17023SJohn Marino 201*e4b17023SJohn Marino /** 202*e4b17023SJohn Marino * Determine whether we can determine a result type from @c Functor 203*e4b17023SJohn Marino * alone. 204*e4b17023SJohn Marino */ 205*e4b17023SJohn Marino template<typename _Functor, typename... _ArgTypes> 206*e4b17023SJohn Marino class result_of<_Functor(_ArgTypes...)> 207*e4b17023SJohn Marino : public _Result_of_impl< 208*e4b17023SJohn Marino _Has_result_type<_Weak_result_type<_Functor> >::value, 209*e4b17023SJohn Marino _Functor(_ArgTypes...)> 210*e4b17023SJohn Marino { 211*e4b17023SJohn Marino }; 212*e4b17023SJohn Marino 213*e4b17023SJohn Marino /// We already know the result type for @c Functor; use it. 214*e4b17023SJohn Marino template<typename _Functor, typename... _ArgTypes> 215*e4b17023SJohn Marino struct _Result_of_impl<true, _Functor(_ArgTypes...)> 216*e4b17023SJohn Marino { 217*e4b17023SJohn Marino typedef typename _Weak_result_type<_Functor>::result_type type; 218*e4b17023SJohn Marino }; 219*e4b17023SJohn Marino 220*e4b17023SJohn Marino /** 221*e4b17023SJohn Marino * We need to compute the result type for this invocation the hard 222*e4b17023SJohn Marino * way. 223*e4b17023SJohn Marino */ 224*e4b17023SJohn Marino template<typename _Functor, typename... _ArgTypes> 225*e4b17023SJohn Marino struct _Result_of_impl<false, _Functor(_ArgTypes...)> 226*e4b17023SJohn Marino { 227*e4b17023SJohn Marino typedef typename _Functor 228*e4b17023SJohn Marino ::template result<_Functor(_ArgTypes...)>::type type; 229*e4b17023SJohn Marino }; 230*e4b17023SJohn Marino 231*e4b17023SJohn Marino /** 232*e4b17023SJohn Marino * It is unsafe to access ::result when there are zero arguments, so we 233*e4b17023SJohn Marino * return @c void instead. 234*e4b17023SJohn Marino */ 235*e4b17023SJohn Marino template<typename _Functor> 236*e4b17023SJohn Marino struct _Result_of_impl<false, _Functor()> 237*e4b17023SJohn Marino { 238*e4b17023SJohn Marino typedef void type; 239*e4b17023SJohn Marino }; 240*e4b17023SJohn Marino 241*e4b17023SJohn Marino /// Determines if the type _Tp derives from unary_function. 242*e4b17023SJohn Marino template<typename _Tp> 243*e4b17023SJohn Marino struct _Derives_from_unary_function : __sfinae_types 244*e4b17023SJohn Marino { 245*e4b17023SJohn Marino private: 246*e4b17023SJohn Marino template<typename _T1, typename _Res> 247*e4b17023SJohn Marino static __one __test(const volatile unary_function<_T1, _Res>*); 248*e4b17023SJohn Marino 249*e4b17023SJohn Marino // It's tempting to change "..." to const volatile void*, but 250*e4b17023SJohn Marino // that fails when _Tp is a function type. 251*e4b17023SJohn Marino static __two __test(...); 252*e4b17023SJohn Marino 253*e4b17023SJohn Marino public: 254*e4b17023SJohn Marino static const bool value = sizeof(__test((_Tp*)0)) == 1; 255*e4b17023SJohn Marino }; 256*e4b17023SJohn Marino 257*e4b17023SJohn Marino /// Determines if the type _Tp derives from binary_function. 258*e4b17023SJohn Marino template<typename _Tp> 259*e4b17023SJohn Marino struct _Derives_from_binary_function : __sfinae_types 260*e4b17023SJohn Marino { 261*e4b17023SJohn Marino private: 262*e4b17023SJohn Marino template<typename _T1, typename _T2, typename _Res> 263*e4b17023SJohn Marino static __one __test(const volatile binary_function<_T1, _T2, _Res>*); 264*e4b17023SJohn Marino 265*e4b17023SJohn Marino // It's tempting to change "..." to const volatile void*, but 266*e4b17023SJohn Marino // that fails when _Tp is a function type. 267*e4b17023SJohn Marino static __two __test(...); 268*e4b17023SJohn Marino 269*e4b17023SJohn Marino public: 270*e4b17023SJohn Marino static const bool value = sizeof(__test((_Tp*)0)) == 1; 271*e4b17023SJohn Marino }; 272*e4b17023SJohn Marino 273*e4b17023SJohn Marino /// Turns a function type into a function pointer type 274*e4b17023SJohn Marino template<typename _Tp, bool _IsFunctionType = is_function<_Tp>::value> 275*e4b17023SJohn Marino struct _Function_to_function_pointer 276*e4b17023SJohn Marino { 277*e4b17023SJohn Marino typedef _Tp type; 278*e4b17023SJohn Marino }; 279*e4b17023SJohn Marino 280*e4b17023SJohn Marino template<typename _Tp> 281*e4b17023SJohn Marino struct _Function_to_function_pointer<_Tp, true> 282*e4b17023SJohn Marino { 283*e4b17023SJohn Marino typedef _Tp* type; 284*e4b17023SJohn Marino }; 285*e4b17023SJohn Marino 286*e4b17023SJohn Marino /** 287*e4b17023SJohn Marino * Invoke a function object, which may be either a member pointer or a 288*e4b17023SJohn Marino * function object. The first parameter will tell which. 289*e4b17023SJohn Marino */ 290*e4b17023SJohn Marino template<typename _Functor, typename... _Args> 291*e4b17023SJohn Marino inline 292*e4b17023SJohn Marino typename __gnu_cxx::__enable_if< 293*e4b17023SJohn Marino (!is_member_pointer<_Functor>::value 294*e4b17023SJohn Marino && !is_function<_Functor>::value 295*e4b17023SJohn Marino && !is_function<typename remove_pointer<_Functor>::type>::value), 296*e4b17023SJohn Marino typename result_of<_Functor(_Args...)>::type 297*e4b17023SJohn Marino >::__type 298*e4b17023SJohn Marino __invoke(_Functor& __f, _Args&... __args) 299*e4b17023SJohn Marino { 300*e4b17023SJohn Marino return __f(__args...); 301*e4b17023SJohn Marino } 302*e4b17023SJohn Marino 303*e4b17023SJohn Marino template<typename _Functor, typename... _Args> 304*e4b17023SJohn Marino inline 305*e4b17023SJohn Marino typename __gnu_cxx::__enable_if< 306*e4b17023SJohn Marino (is_member_pointer<_Functor>::value 307*e4b17023SJohn Marino && !is_function<_Functor>::value 308*e4b17023SJohn Marino && !is_function<typename remove_pointer<_Functor>::type>::value), 309*e4b17023SJohn Marino typename result_of<_Functor(_Args...)>::type 310*e4b17023SJohn Marino >::__type 311*e4b17023SJohn Marino __invoke(_Functor& __f, _Args&... __args) 312*e4b17023SJohn Marino { 313*e4b17023SJohn Marino return mem_fn(__f)(__args...); 314*e4b17023SJohn Marino } 315*e4b17023SJohn Marino 316*e4b17023SJohn Marino // To pick up function references (that will become function pointers) 317*e4b17023SJohn Marino template<typename _Functor, typename... _Args> 318*e4b17023SJohn Marino inline 319*e4b17023SJohn Marino typename __gnu_cxx::__enable_if< 320*e4b17023SJohn Marino (is_pointer<_Functor>::value 321*e4b17023SJohn Marino && is_function<typename remove_pointer<_Functor>::type>::value), 322*e4b17023SJohn Marino typename result_of<_Functor(_Args...)>::type 323*e4b17023SJohn Marino >::__type 324*e4b17023SJohn Marino __invoke(_Functor __f, _Args&... __args) 325*e4b17023SJohn Marino { 326*e4b17023SJohn Marino return __f(__args...); 327*e4b17023SJohn Marino } 328*e4b17023SJohn Marino 329*e4b17023SJohn Marino /** 330*e4b17023SJohn Marino * Knowing which of unary_function and binary_function _Tp derives 331*e4b17023SJohn Marino * from, derives from the same and ensures that reference_wrapper 332*e4b17023SJohn Marino * will have a weak result type. See cases below. 333*e4b17023SJohn Marino */ 334*e4b17023SJohn Marino template<bool _Unary, bool _Binary, typename _Tp> 335*e4b17023SJohn Marino struct _Reference_wrapper_base_impl; 336*e4b17023SJohn Marino 337*e4b17023SJohn Marino // Not a unary_function or binary_function, so try a weak result type. 338*e4b17023SJohn Marino template<typename _Tp> 339*e4b17023SJohn Marino struct _Reference_wrapper_base_impl<false, false, _Tp> 340*e4b17023SJohn Marino : _Weak_result_type<_Tp> 341*e4b17023SJohn Marino { }; 342*e4b17023SJohn Marino 343*e4b17023SJohn Marino // unary_function but not binary_function 344*e4b17023SJohn Marino template<typename _Tp> 345*e4b17023SJohn Marino struct _Reference_wrapper_base_impl<true, false, _Tp> 346*e4b17023SJohn Marino : unary_function<typename _Tp::argument_type, 347*e4b17023SJohn Marino typename _Tp::result_type> 348*e4b17023SJohn Marino { }; 349*e4b17023SJohn Marino 350*e4b17023SJohn Marino // binary_function but not unary_function 351*e4b17023SJohn Marino template<typename _Tp> 352*e4b17023SJohn Marino struct _Reference_wrapper_base_impl<false, true, _Tp> 353*e4b17023SJohn Marino : binary_function<typename _Tp::first_argument_type, 354*e4b17023SJohn Marino typename _Tp::second_argument_type, 355*e4b17023SJohn Marino typename _Tp::result_type> 356*e4b17023SJohn Marino { }; 357*e4b17023SJohn Marino 358*e4b17023SJohn Marino // Both unary_function and binary_function. Import result_type to 359*e4b17023SJohn Marino // avoid conflicts. 360*e4b17023SJohn Marino template<typename _Tp> 361*e4b17023SJohn Marino struct _Reference_wrapper_base_impl<true, true, _Tp> 362*e4b17023SJohn Marino : unary_function<typename _Tp::argument_type, 363*e4b17023SJohn Marino typename _Tp::result_type>, 364*e4b17023SJohn Marino binary_function<typename _Tp::first_argument_type, 365*e4b17023SJohn Marino typename _Tp::second_argument_type, 366*e4b17023SJohn Marino typename _Tp::result_type> 367*e4b17023SJohn Marino { 368*e4b17023SJohn Marino typedef typename _Tp::result_type result_type; 369*e4b17023SJohn Marino }; 370*e4b17023SJohn Marino 371*e4b17023SJohn Marino /** 372*e4b17023SJohn Marino * Derives from unary_function or binary_function when it 373*e4b17023SJohn Marino * can. Specializations handle all of the easy cases. The primary 374*e4b17023SJohn Marino * template determines what to do with a class type, which may 375*e4b17023SJohn Marino * derive from both unary_function and binary_function. 376*e4b17023SJohn Marino */ 377*e4b17023SJohn Marino template<typename _Tp> 378*e4b17023SJohn Marino struct _Reference_wrapper_base 379*e4b17023SJohn Marino : _Reference_wrapper_base_impl< 380*e4b17023SJohn Marino _Derives_from_unary_function<_Tp>::value, 381*e4b17023SJohn Marino _Derives_from_binary_function<_Tp>::value, 382*e4b17023SJohn Marino _Tp> 383*e4b17023SJohn Marino { }; 384*e4b17023SJohn Marino 385*e4b17023SJohn Marino // - a function type (unary) 386*e4b17023SJohn Marino template<typename _Res, typename _T1> 387*e4b17023SJohn Marino struct _Reference_wrapper_base<_Res(_T1)> 388*e4b17023SJohn Marino : unary_function<_T1, _Res> 389*e4b17023SJohn Marino { }; 390*e4b17023SJohn Marino 391*e4b17023SJohn Marino // - a function type (binary) 392*e4b17023SJohn Marino template<typename _Res, typename _T1, typename _T2> 393*e4b17023SJohn Marino struct _Reference_wrapper_base<_Res(_T1, _T2)> 394*e4b17023SJohn Marino : binary_function<_T1, _T2, _Res> 395*e4b17023SJohn Marino { }; 396*e4b17023SJohn Marino 397*e4b17023SJohn Marino // - a function pointer type (unary) 398*e4b17023SJohn Marino template<typename _Res, typename _T1> 399*e4b17023SJohn Marino struct _Reference_wrapper_base<_Res(*)(_T1)> 400*e4b17023SJohn Marino : unary_function<_T1, _Res> 401*e4b17023SJohn Marino { }; 402*e4b17023SJohn Marino 403*e4b17023SJohn Marino // - a function pointer type (binary) 404*e4b17023SJohn Marino template<typename _Res, typename _T1, typename _T2> 405*e4b17023SJohn Marino struct _Reference_wrapper_base<_Res(*)(_T1, _T2)> 406*e4b17023SJohn Marino : binary_function<_T1, _T2, _Res> 407*e4b17023SJohn Marino { }; 408*e4b17023SJohn Marino 409*e4b17023SJohn Marino // - a pointer to member function type (unary, no qualifiers) 410*e4b17023SJohn Marino template<typename _Res, typename _T1> 411*e4b17023SJohn Marino struct _Reference_wrapper_base<_Res (_T1::*)()> 412*e4b17023SJohn Marino : unary_function<_T1*, _Res> 413*e4b17023SJohn Marino { }; 414*e4b17023SJohn Marino 415*e4b17023SJohn Marino // - a pointer to member function type (binary, no qualifiers) 416*e4b17023SJohn Marino template<typename _Res, typename _T1, typename _T2> 417*e4b17023SJohn Marino struct _Reference_wrapper_base<_Res (_T1::*)(_T2)> 418*e4b17023SJohn Marino : binary_function<_T1*, _T2, _Res> 419*e4b17023SJohn Marino { }; 420*e4b17023SJohn Marino 421*e4b17023SJohn Marino // - a pointer to member function type (unary, const) 422*e4b17023SJohn Marino template<typename _Res, typename _T1> 423*e4b17023SJohn Marino struct _Reference_wrapper_base<_Res (_T1::*)() const> 424*e4b17023SJohn Marino : unary_function<const _T1*, _Res> 425*e4b17023SJohn Marino { }; 426*e4b17023SJohn Marino 427*e4b17023SJohn Marino // - a pointer to member function type (binary, const) 428*e4b17023SJohn Marino template<typename _Res, typename _T1, typename _T2> 429*e4b17023SJohn Marino struct _Reference_wrapper_base<_Res (_T1::*)(_T2) const> 430*e4b17023SJohn Marino : binary_function<const _T1*, _T2, _Res> 431*e4b17023SJohn Marino { }; 432*e4b17023SJohn Marino 433*e4b17023SJohn Marino // - a pointer to member function type (unary, volatile) 434*e4b17023SJohn Marino template<typename _Res, typename _T1> 435*e4b17023SJohn Marino struct _Reference_wrapper_base<_Res (_T1::*)() volatile> 436*e4b17023SJohn Marino : unary_function<volatile _T1*, _Res> 437*e4b17023SJohn Marino { }; 438*e4b17023SJohn Marino 439*e4b17023SJohn Marino // - a pointer to member function type (binary, volatile) 440*e4b17023SJohn Marino template<typename _Res, typename _T1, typename _T2> 441*e4b17023SJohn Marino struct _Reference_wrapper_base<_Res (_T1::*)(_T2) volatile> 442*e4b17023SJohn Marino : binary_function<volatile _T1*, _T2, _Res> 443*e4b17023SJohn Marino { }; 444*e4b17023SJohn Marino 445*e4b17023SJohn Marino // - a pointer to member function type (unary, const volatile) 446*e4b17023SJohn Marino template<typename _Res, typename _T1> 447*e4b17023SJohn Marino struct _Reference_wrapper_base<_Res (_T1::*)() const volatile> 448*e4b17023SJohn Marino : unary_function<const volatile _T1*, _Res> 449*e4b17023SJohn Marino { }; 450*e4b17023SJohn Marino 451*e4b17023SJohn Marino // - a pointer to member function type (binary, const volatile) 452*e4b17023SJohn Marino template<typename _Res, typename _T1, typename _T2> 453*e4b17023SJohn Marino struct _Reference_wrapper_base<_Res (_T1::*)(_T2) const volatile> 454*e4b17023SJohn Marino : binary_function<const volatile _T1*, _T2, _Res> 455*e4b17023SJohn Marino { }; 456*e4b17023SJohn Marino 457*e4b17023SJohn Marino /// reference_wrapper 458*e4b17023SJohn Marino template<typename _Tp> 459*e4b17023SJohn Marino class reference_wrapper 460*e4b17023SJohn Marino : public _Reference_wrapper_base<typename remove_cv<_Tp>::type> 461*e4b17023SJohn Marino { 462*e4b17023SJohn Marino // If _Tp is a function type, we can't form result_of<_Tp(...)>, 463*e4b17023SJohn Marino // so turn it into a function pointer type. 464*e4b17023SJohn Marino typedef typename _Function_to_function_pointer<_Tp>::type 465*e4b17023SJohn Marino _M_func_type; 466*e4b17023SJohn Marino 467*e4b17023SJohn Marino _Tp* _M_data; 468*e4b17023SJohn Marino public: 469*e4b17023SJohn Marino typedef _Tp type; 470*e4b17023SJohn Marino 471*e4b17023SJohn Marino explicit 472*e4b17023SJohn Marino reference_wrapper(_Tp& __indata) 473*e4b17023SJohn Marino : _M_data(std::__addressof(__indata)) 474*e4b17023SJohn Marino { } 475*e4b17023SJohn Marino 476*e4b17023SJohn Marino reference_wrapper(const reference_wrapper<_Tp>& __inref): 477*e4b17023SJohn Marino _M_data(__inref._M_data) 478*e4b17023SJohn Marino { } 479*e4b17023SJohn Marino 480*e4b17023SJohn Marino reference_wrapper& 481*e4b17023SJohn Marino operator=(const reference_wrapper<_Tp>& __inref) 482*e4b17023SJohn Marino { 483*e4b17023SJohn Marino _M_data = __inref._M_data; 484*e4b17023SJohn Marino return *this; 485*e4b17023SJohn Marino } 486*e4b17023SJohn Marino 487*e4b17023SJohn Marino operator _Tp&() const 488*e4b17023SJohn Marino { return this->get(); } 489*e4b17023SJohn Marino 490*e4b17023SJohn Marino _Tp& 491*e4b17023SJohn Marino get() const 492*e4b17023SJohn Marino { return *_M_data; } 493*e4b17023SJohn Marino 494*e4b17023SJohn Marino template<typename... _Args> 495*e4b17023SJohn Marino typename result_of<_M_func_type(_Args...)>::type 496*e4b17023SJohn Marino operator()(_Args&... __args) const 497*e4b17023SJohn Marino { 498*e4b17023SJohn Marino return __invoke(get(), __args...); 499*e4b17023SJohn Marino } 500*e4b17023SJohn Marino }; 501*e4b17023SJohn Marino 502*e4b17023SJohn Marino 503*e4b17023SJohn Marino // Denotes a reference should be taken to a variable. 504*e4b17023SJohn Marino template<typename _Tp> 505*e4b17023SJohn Marino inline reference_wrapper<_Tp> 506*e4b17023SJohn Marino ref(_Tp& __t) 507*e4b17023SJohn Marino { return reference_wrapper<_Tp>(__t); } 508*e4b17023SJohn Marino 509*e4b17023SJohn Marino // Denotes a const reference should be taken to a variable. 510*e4b17023SJohn Marino template<typename _Tp> 511*e4b17023SJohn Marino inline reference_wrapper<const _Tp> 512*e4b17023SJohn Marino cref(const _Tp& __t) 513*e4b17023SJohn Marino { return reference_wrapper<const _Tp>(__t); } 514*e4b17023SJohn Marino 515*e4b17023SJohn Marino template<typename _Tp> 516*e4b17023SJohn Marino inline reference_wrapper<_Tp> 517*e4b17023SJohn Marino ref(reference_wrapper<_Tp> __t) 518*e4b17023SJohn Marino { return ref(__t.get()); } 519*e4b17023SJohn Marino 520*e4b17023SJohn Marino template<typename _Tp> 521*e4b17023SJohn Marino inline reference_wrapper<const _Tp> 522*e4b17023SJohn Marino cref(reference_wrapper<_Tp> __t) 523*e4b17023SJohn Marino { return cref(__t.get()); } 524*e4b17023SJohn Marino 525*e4b17023SJohn Marino template<typename _Tp, bool> 526*e4b17023SJohn Marino struct _Mem_fn_const_or_non 527*e4b17023SJohn Marino { 528*e4b17023SJohn Marino typedef const _Tp& type; 529*e4b17023SJohn Marino }; 530*e4b17023SJohn Marino 531*e4b17023SJohn Marino template<typename _Tp> 532*e4b17023SJohn Marino struct _Mem_fn_const_or_non<_Tp, false> 533*e4b17023SJohn Marino { 534*e4b17023SJohn Marino typedef _Tp& type; 535*e4b17023SJohn Marino }; 536*e4b17023SJohn Marino 537*e4b17023SJohn Marino /** 538*e4b17023SJohn Marino * Derives from @c unary_function or @c binary_function, or perhaps 539*e4b17023SJohn Marino * nothing, depending on the number of arguments provided. The 540*e4b17023SJohn Marino * primary template is the basis case, which derives nothing. 541*e4b17023SJohn Marino */ 542*e4b17023SJohn Marino template<typename _Res, typename... _ArgTypes> 543*e4b17023SJohn Marino struct _Maybe_unary_or_binary_function { }; 544*e4b17023SJohn Marino 545*e4b17023SJohn Marino /// Derives from @c unary_function, as appropriate. 546*e4b17023SJohn Marino template<typename _Res, typename _T1> 547*e4b17023SJohn Marino struct _Maybe_unary_or_binary_function<_Res, _T1> 548*e4b17023SJohn Marino : std::unary_function<_T1, _Res> { }; 549*e4b17023SJohn Marino 550*e4b17023SJohn Marino /// Derives from @c binary_function, as appropriate. 551*e4b17023SJohn Marino template<typename _Res, typename _T1, typename _T2> 552*e4b17023SJohn Marino struct _Maybe_unary_or_binary_function<_Res, _T1, _T2> 553*e4b17023SJohn Marino : std::binary_function<_T1, _T2, _Res> { }; 554*e4b17023SJohn Marino 555*e4b17023SJohn Marino /// Implementation of @c mem_fn for member function pointers. 556*e4b17023SJohn Marino template<typename _Res, typename _Class, typename... _ArgTypes> 557*e4b17023SJohn Marino class _Mem_fn<_Res (_Class::*)(_ArgTypes...)> 558*e4b17023SJohn Marino : public _Maybe_unary_or_binary_function<_Res, _Class*, _ArgTypes...> 559*e4b17023SJohn Marino { 560*e4b17023SJohn Marino typedef _Res (_Class::*_Functor)(_ArgTypes...); 561*e4b17023SJohn Marino 562*e4b17023SJohn Marino template<typename _Tp> 563*e4b17023SJohn Marino _Res 564*e4b17023SJohn Marino _M_call(_Tp& __object, const volatile _Class *, 565*e4b17023SJohn Marino _ArgTypes... __args) const 566*e4b17023SJohn Marino { return (__object.*__pmf)(__args...); } 567*e4b17023SJohn Marino 568*e4b17023SJohn Marino template<typename _Tp> 569*e4b17023SJohn Marino _Res 570*e4b17023SJohn Marino _M_call(_Tp& __ptr, const volatile void *, _ArgTypes... __args) const 571*e4b17023SJohn Marino { return ((*__ptr).*__pmf)(__args...); } 572*e4b17023SJohn Marino 573*e4b17023SJohn Marino public: 574*e4b17023SJohn Marino typedef _Res result_type; 575*e4b17023SJohn Marino 576*e4b17023SJohn Marino explicit _Mem_fn(_Functor __pmf) : __pmf(__pmf) { } 577*e4b17023SJohn Marino 578*e4b17023SJohn Marino // Handle objects 579*e4b17023SJohn Marino _Res 580*e4b17023SJohn Marino operator()(_Class& __object, _ArgTypes... __args) const 581*e4b17023SJohn Marino { return (__object.*__pmf)(__args...); } 582*e4b17023SJohn Marino 583*e4b17023SJohn Marino // Handle pointers 584*e4b17023SJohn Marino _Res 585*e4b17023SJohn Marino operator()(_Class* __object, _ArgTypes... __args) const 586*e4b17023SJohn Marino { return (__object->*__pmf)(__args...); } 587*e4b17023SJohn Marino 588*e4b17023SJohn Marino // Handle smart pointers, references and pointers to derived 589*e4b17023SJohn Marino template<typename _Tp> 590*e4b17023SJohn Marino _Res 591*e4b17023SJohn Marino operator()(_Tp& __object, _ArgTypes... __args) const 592*e4b17023SJohn Marino { return _M_call(__object, &__object, __args...); } 593*e4b17023SJohn Marino 594*e4b17023SJohn Marino private: 595*e4b17023SJohn Marino _Functor __pmf; 596*e4b17023SJohn Marino }; 597*e4b17023SJohn Marino 598*e4b17023SJohn Marino /// Implementation of @c mem_fn for const member function pointers. 599*e4b17023SJohn Marino template<typename _Res, typename _Class, typename... _ArgTypes> 600*e4b17023SJohn Marino class _Mem_fn<_Res (_Class::*)(_ArgTypes...) const> 601*e4b17023SJohn Marino : public _Maybe_unary_or_binary_function<_Res, const _Class*, 602*e4b17023SJohn Marino _ArgTypes...> 603*e4b17023SJohn Marino { 604*e4b17023SJohn Marino typedef _Res (_Class::*_Functor)(_ArgTypes...) const; 605*e4b17023SJohn Marino 606*e4b17023SJohn Marino template<typename _Tp> 607*e4b17023SJohn Marino _Res 608*e4b17023SJohn Marino _M_call(_Tp& __object, const volatile _Class *, 609*e4b17023SJohn Marino _ArgTypes... __args) const 610*e4b17023SJohn Marino { return (__object.*__pmf)(__args...); } 611*e4b17023SJohn Marino 612*e4b17023SJohn Marino template<typename _Tp> 613*e4b17023SJohn Marino _Res 614*e4b17023SJohn Marino _M_call(_Tp& __ptr, const volatile void *, _ArgTypes... __args) const 615*e4b17023SJohn Marino { return ((*__ptr).*__pmf)(__args...); } 616*e4b17023SJohn Marino 617*e4b17023SJohn Marino public: 618*e4b17023SJohn Marino typedef _Res result_type; 619*e4b17023SJohn Marino 620*e4b17023SJohn Marino explicit _Mem_fn(_Functor __pmf) : __pmf(__pmf) { } 621*e4b17023SJohn Marino 622*e4b17023SJohn Marino // Handle objects 623*e4b17023SJohn Marino _Res 624*e4b17023SJohn Marino operator()(const _Class& __object, _ArgTypes... __args) const 625*e4b17023SJohn Marino { return (__object.*__pmf)(__args...); } 626*e4b17023SJohn Marino 627*e4b17023SJohn Marino // Handle pointers 628*e4b17023SJohn Marino _Res 629*e4b17023SJohn Marino operator()(const _Class* __object, _ArgTypes... __args) const 630*e4b17023SJohn Marino { return (__object->*__pmf)(__args...); } 631*e4b17023SJohn Marino 632*e4b17023SJohn Marino // Handle smart pointers, references and pointers to derived 633*e4b17023SJohn Marino template<typename _Tp> 634*e4b17023SJohn Marino _Res operator()(_Tp& __object, _ArgTypes... __args) const 635*e4b17023SJohn Marino { return _M_call(__object, &__object, __args...); } 636*e4b17023SJohn Marino 637*e4b17023SJohn Marino private: 638*e4b17023SJohn Marino _Functor __pmf; 639*e4b17023SJohn Marino }; 640*e4b17023SJohn Marino 641*e4b17023SJohn Marino /// Implementation of @c mem_fn for volatile member function pointers. 642*e4b17023SJohn Marino template<typename _Res, typename _Class, typename... _ArgTypes> 643*e4b17023SJohn Marino class _Mem_fn<_Res (_Class::*)(_ArgTypes...) volatile> 644*e4b17023SJohn Marino : public _Maybe_unary_or_binary_function<_Res, volatile _Class*, 645*e4b17023SJohn Marino _ArgTypes...> 646*e4b17023SJohn Marino { 647*e4b17023SJohn Marino typedef _Res (_Class::*_Functor)(_ArgTypes...) volatile; 648*e4b17023SJohn Marino 649*e4b17023SJohn Marino template<typename _Tp> 650*e4b17023SJohn Marino _Res 651*e4b17023SJohn Marino _M_call(_Tp& __object, const volatile _Class *, 652*e4b17023SJohn Marino _ArgTypes... __args) const 653*e4b17023SJohn Marino { return (__object.*__pmf)(__args...); } 654*e4b17023SJohn Marino 655*e4b17023SJohn Marino template<typename _Tp> 656*e4b17023SJohn Marino _Res 657*e4b17023SJohn Marino _M_call(_Tp& __ptr, const volatile void *, _ArgTypes... __args) const 658*e4b17023SJohn Marino { return ((*__ptr).*__pmf)(__args...); } 659*e4b17023SJohn Marino 660*e4b17023SJohn Marino public: 661*e4b17023SJohn Marino typedef _Res result_type; 662*e4b17023SJohn Marino 663*e4b17023SJohn Marino explicit _Mem_fn(_Functor __pmf) : __pmf(__pmf) { } 664*e4b17023SJohn Marino 665*e4b17023SJohn Marino // Handle objects 666*e4b17023SJohn Marino _Res 667*e4b17023SJohn Marino operator()(volatile _Class& __object, _ArgTypes... __args) const 668*e4b17023SJohn Marino { return (__object.*__pmf)(__args...); } 669*e4b17023SJohn Marino 670*e4b17023SJohn Marino // Handle pointers 671*e4b17023SJohn Marino _Res 672*e4b17023SJohn Marino operator()(volatile _Class* __object, _ArgTypes... __args) const 673*e4b17023SJohn Marino { return (__object->*__pmf)(__args...); } 674*e4b17023SJohn Marino 675*e4b17023SJohn Marino // Handle smart pointers, references and pointers to derived 676*e4b17023SJohn Marino template<typename _Tp> 677*e4b17023SJohn Marino _Res 678*e4b17023SJohn Marino operator()(_Tp& __object, _ArgTypes... __args) const 679*e4b17023SJohn Marino { return _M_call(__object, &__object, __args...); } 680*e4b17023SJohn Marino 681*e4b17023SJohn Marino private: 682*e4b17023SJohn Marino _Functor __pmf; 683*e4b17023SJohn Marino }; 684*e4b17023SJohn Marino 685*e4b17023SJohn Marino /// Implementation of @c mem_fn for const volatile member function pointers. 686*e4b17023SJohn Marino template<typename _Res, typename _Class, typename... _ArgTypes> 687*e4b17023SJohn Marino class _Mem_fn<_Res (_Class::*)(_ArgTypes...) const volatile> 688*e4b17023SJohn Marino : public _Maybe_unary_or_binary_function<_Res, const volatile _Class*, 689*e4b17023SJohn Marino _ArgTypes...> 690*e4b17023SJohn Marino { 691*e4b17023SJohn Marino typedef _Res (_Class::*_Functor)(_ArgTypes...) const volatile; 692*e4b17023SJohn Marino 693*e4b17023SJohn Marino template<typename _Tp> 694*e4b17023SJohn Marino _Res 695*e4b17023SJohn Marino _M_call(_Tp& __object, const volatile _Class *, 696*e4b17023SJohn Marino _ArgTypes... __args) const 697*e4b17023SJohn Marino { return (__object.*__pmf)(__args...); } 698*e4b17023SJohn Marino 699*e4b17023SJohn Marino template<typename _Tp> 700*e4b17023SJohn Marino _Res 701*e4b17023SJohn Marino _M_call(_Tp& __ptr, const volatile void *, _ArgTypes... __args) const 702*e4b17023SJohn Marino { return ((*__ptr).*__pmf)(__args...); } 703*e4b17023SJohn Marino 704*e4b17023SJohn Marino public: 705*e4b17023SJohn Marino typedef _Res result_type; 706*e4b17023SJohn Marino 707*e4b17023SJohn Marino explicit _Mem_fn(_Functor __pmf) : __pmf(__pmf) { } 708*e4b17023SJohn Marino 709*e4b17023SJohn Marino // Handle objects 710*e4b17023SJohn Marino _Res 711*e4b17023SJohn Marino operator()(const volatile _Class& __object, _ArgTypes... __args) const 712*e4b17023SJohn Marino { return (__object.*__pmf)(__args...); } 713*e4b17023SJohn Marino 714*e4b17023SJohn Marino // Handle pointers 715*e4b17023SJohn Marino _Res 716*e4b17023SJohn Marino operator()(const volatile _Class* __object, _ArgTypes... __args) const 717*e4b17023SJohn Marino { return (__object->*__pmf)(__args...); } 718*e4b17023SJohn Marino 719*e4b17023SJohn Marino // Handle smart pointers, references and pointers to derived 720*e4b17023SJohn Marino template<typename _Tp> 721*e4b17023SJohn Marino _Res operator()(_Tp& __object, _ArgTypes... __args) const 722*e4b17023SJohn Marino { return _M_call(__object, &__object, __args...); } 723*e4b17023SJohn Marino 724*e4b17023SJohn Marino private: 725*e4b17023SJohn Marino _Functor __pmf; 726*e4b17023SJohn Marino }; 727*e4b17023SJohn Marino 728*e4b17023SJohn Marino 729*e4b17023SJohn Marino template<typename _Res, typename _Class> 730*e4b17023SJohn Marino class _Mem_fn<_Res _Class::*> 731*e4b17023SJohn Marino { 732*e4b17023SJohn Marino // This bit of genius is due to Peter Dimov, improved slightly by 733*e4b17023SJohn Marino // Douglas Gregor. 734*e4b17023SJohn Marino template<typename _Tp> 735*e4b17023SJohn Marino _Res& 736*e4b17023SJohn Marino _M_call(_Tp& __object, _Class *) const 737*e4b17023SJohn Marino { return __object.*__pm; } 738*e4b17023SJohn Marino 739*e4b17023SJohn Marino template<typename _Tp, typename _Up> 740*e4b17023SJohn Marino _Res& 741*e4b17023SJohn Marino _M_call(_Tp& __object, _Up * const *) const 742*e4b17023SJohn Marino { return (*__object).*__pm; } 743*e4b17023SJohn Marino 744*e4b17023SJohn Marino template<typename _Tp, typename _Up> 745*e4b17023SJohn Marino const _Res& 746*e4b17023SJohn Marino _M_call(_Tp& __object, const _Up * const *) const 747*e4b17023SJohn Marino { return (*__object).*__pm; } 748*e4b17023SJohn Marino 749*e4b17023SJohn Marino template<typename _Tp> 750*e4b17023SJohn Marino const _Res& 751*e4b17023SJohn Marino _M_call(_Tp& __object, const _Class *) const 752*e4b17023SJohn Marino { return __object.*__pm; } 753*e4b17023SJohn Marino 754*e4b17023SJohn Marino template<typename _Tp> 755*e4b17023SJohn Marino const _Res& 756*e4b17023SJohn Marino _M_call(_Tp& __ptr, const volatile void*) const 757*e4b17023SJohn Marino { return (*__ptr).*__pm; } 758*e4b17023SJohn Marino 759*e4b17023SJohn Marino template<typename _Tp> static _Tp& __get_ref(); 760*e4b17023SJohn Marino 761*e4b17023SJohn Marino template<typename _Tp> 762*e4b17023SJohn Marino static __sfinae_types::__one __check_const(_Tp&, _Class*); 763*e4b17023SJohn Marino template<typename _Tp, typename _Up> 764*e4b17023SJohn Marino static __sfinae_types::__one __check_const(_Tp&, _Up * const *); 765*e4b17023SJohn Marino template<typename _Tp, typename _Up> 766*e4b17023SJohn Marino static __sfinae_types::__two __check_const(_Tp&, const _Up * const *); 767*e4b17023SJohn Marino template<typename _Tp> 768*e4b17023SJohn Marino static __sfinae_types::__two __check_const(_Tp&, const _Class*); 769*e4b17023SJohn Marino template<typename _Tp> 770*e4b17023SJohn Marino static __sfinae_types::__two __check_const(_Tp&, const volatile void*); 771*e4b17023SJohn Marino 772*e4b17023SJohn Marino public: 773*e4b17023SJohn Marino template<typename _Tp> 774*e4b17023SJohn Marino struct _Result_type 775*e4b17023SJohn Marino : _Mem_fn_const_or_non<_Res, 776*e4b17023SJohn Marino (sizeof(__sfinae_types::__two) 777*e4b17023SJohn Marino == sizeof(__check_const<_Tp>(__get_ref<_Tp>(), (_Tp*)0)))> 778*e4b17023SJohn Marino { }; 779*e4b17023SJohn Marino 780*e4b17023SJohn Marino template<typename _Signature> 781*e4b17023SJohn Marino struct result; 782*e4b17023SJohn Marino 783*e4b17023SJohn Marino template<typename _CVMem, typename _Tp> 784*e4b17023SJohn Marino struct result<_CVMem(_Tp)> 785*e4b17023SJohn Marino : public _Result_type<_Tp> { }; 786*e4b17023SJohn Marino 787*e4b17023SJohn Marino template<typename _CVMem, typename _Tp> 788*e4b17023SJohn Marino struct result<_CVMem(_Tp&)> 789*e4b17023SJohn Marino : public _Result_type<_Tp> { }; 790*e4b17023SJohn Marino 791*e4b17023SJohn Marino explicit 792*e4b17023SJohn Marino _Mem_fn(_Res _Class::*__pm) : __pm(__pm) { } 793*e4b17023SJohn Marino 794*e4b17023SJohn Marino // Handle objects 795*e4b17023SJohn Marino _Res& 796*e4b17023SJohn Marino operator()(_Class& __object) const 797*e4b17023SJohn Marino { return __object.*__pm; } 798*e4b17023SJohn Marino 799*e4b17023SJohn Marino const _Res& 800*e4b17023SJohn Marino operator()(const _Class& __object) const 801*e4b17023SJohn Marino { return __object.*__pm; } 802*e4b17023SJohn Marino 803*e4b17023SJohn Marino // Handle pointers 804*e4b17023SJohn Marino _Res& 805*e4b17023SJohn Marino operator()(_Class* __object) const 806*e4b17023SJohn Marino { return __object->*__pm; } 807*e4b17023SJohn Marino 808*e4b17023SJohn Marino const _Res& 809*e4b17023SJohn Marino operator()(const _Class* __object) const 810*e4b17023SJohn Marino { return __object->*__pm; } 811*e4b17023SJohn Marino 812*e4b17023SJohn Marino // Handle smart pointers and derived 813*e4b17023SJohn Marino template<typename _Tp> 814*e4b17023SJohn Marino typename _Result_type<_Tp>::type 815*e4b17023SJohn Marino operator()(_Tp& __unknown) const 816*e4b17023SJohn Marino { return _M_call(__unknown, &__unknown); } 817*e4b17023SJohn Marino 818*e4b17023SJohn Marino private: 819*e4b17023SJohn Marino _Res _Class::*__pm; 820*e4b17023SJohn Marino }; 821*e4b17023SJohn Marino 822*e4b17023SJohn Marino /** 823*e4b17023SJohn Marino * @brief Returns a function object that forwards to the member 824*e4b17023SJohn Marino * pointer @a pm. 825*e4b17023SJohn Marino */ 826*e4b17023SJohn Marino template<typename _Tp, typename _Class> 827*e4b17023SJohn Marino inline _Mem_fn<_Tp _Class::*> 828*e4b17023SJohn Marino mem_fn(_Tp _Class::* __pm) 829*e4b17023SJohn Marino { 830*e4b17023SJohn Marino return _Mem_fn<_Tp _Class::*>(__pm); 831*e4b17023SJohn Marino } 832*e4b17023SJohn Marino 833*e4b17023SJohn Marino /** 834*e4b17023SJohn Marino * @brief Determines if the given type _Tp is a function object 835*e4b17023SJohn Marino * should be treated as a subexpression when evaluating calls to 836*e4b17023SJohn Marino * function objects returned by bind(). [TR1 3.6.1] 837*e4b17023SJohn Marino */ 838*e4b17023SJohn Marino template<typename _Tp> 839*e4b17023SJohn Marino struct is_bind_expression 840*e4b17023SJohn Marino { static const bool value = false; }; 841*e4b17023SJohn Marino 842*e4b17023SJohn Marino template<typename _Tp> 843*e4b17023SJohn Marino const bool is_bind_expression<_Tp>::value; 844*e4b17023SJohn Marino 845*e4b17023SJohn Marino /** 846*e4b17023SJohn Marino * @brief Determines if the given type _Tp is a placeholder in a 847*e4b17023SJohn Marino * bind() expression and, if so, which placeholder it is. [TR1 3.6.2] 848*e4b17023SJohn Marino */ 849*e4b17023SJohn Marino template<typename _Tp> 850*e4b17023SJohn Marino struct is_placeholder 851*e4b17023SJohn Marino { static const int value = 0; }; 852*e4b17023SJohn Marino 853*e4b17023SJohn Marino template<typename _Tp> 854*e4b17023SJohn Marino const int is_placeholder<_Tp>::value; 855*e4b17023SJohn Marino 856*e4b17023SJohn Marino /// The type of placeholder objects defined by libstdc++. 857*e4b17023SJohn Marino template<int _Num> struct _Placeholder { }; 858*e4b17023SJohn Marino 859*e4b17023SJohn Marino_GLIBCXX_END_NAMESPACE_VERSION 860*e4b17023SJohn Marino 861*e4b17023SJohn Marino /** @namespace std::tr1::placeholders 862*e4b17023SJohn Marino * @brief Sub-namespace for tr1/functional. 863*e4b17023SJohn Marino */ 864*e4b17023SJohn Marino namespace placeholders 865*e4b17023SJohn Marino { 866*e4b17023SJohn Marino _GLIBCXX_BEGIN_NAMESPACE_VERSION 867*e4b17023SJohn Marino /* Define a large number of placeholders. There is no way to 868*e4b17023SJohn Marino * simplify this with variadic templates, because we're introducing 869*e4b17023SJohn Marino * unique names for each. 870*e4b17023SJohn Marino */ 871*e4b17023SJohn Marino namespace 872*e4b17023SJohn Marino { 873*e4b17023SJohn Marino _Placeholder<1> _1; 874*e4b17023SJohn Marino _Placeholder<2> _2; 875*e4b17023SJohn Marino _Placeholder<3> _3; 876*e4b17023SJohn Marino _Placeholder<4> _4; 877*e4b17023SJohn Marino _Placeholder<5> _5; 878*e4b17023SJohn Marino _Placeholder<6> _6; 879*e4b17023SJohn Marino _Placeholder<7> _7; 880*e4b17023SJohn Marino _Placeholder<8> _8; 881*e4b17023SJohn Marino _Placeholder<9> _9; 882*e4b17023SJohn Marino _Placeholder<10> _10; 883*e4b17023SJohn Marino _Placeholder<11> _11; 884*e4b17023SJohn Marino _Placeholder<12> _12; 885*e4b17023SJohn Marino _Placeholder<13> _13; 886*e4b17023SJohn Marino _Placeholder<14> _14; 887*e4b17023SJohn Marino _Placeholder<15> _15; 888*e4b17023SJohn Marino _Placeholder<16> _16; 889*e4b17023SJohn Marino _Placeholder<17> _17; 890*e4b17023SJohn Marino _Placeholder<18> _18; 891*e4b17023SJohn Marino _Placeholder<19> _19; 892*e4b17023SJohn Marino _Placeholder<20> _20; 893*e4b17023SJohn Marino _Placeholder<21> _21; 894*e4b17023SJohn Marino _Placeholder<22> _22; 895*e4b17023SJohn Marino _Placeholder<23> _23; 896*e4b17023SJohn Marino _Placeholder<24> _24; 897*e4b17023SJohn Marino _Placeholder<25> _25; 898*e4b17023SJohn Marino _Placeholder<26> _26; 899*e4b17023SJohn Marino _Placeholder<27> _27; 900*e4b17023SJohn Marino _Placeholder<28> _28; 901*e4b17023SJohn Marino _Placeholder<29> _29; 902*e4b17023SJohn Marino } 903*e4b17023SJohn Marino _GLIBCXX_END_NAMESPACE_VERSION 904*e4b17023SJohn Marino } 905*e4b17023SJohn Marino 906*e4b17023SJohn Marino_GLIBCXX_BEGIN_NAMESPACE_VERSION 907*e4b17023SJohn Marino /** 908*e4b17023SJohn Marino * Partial specialization of is_placeholder that provides the placeholder 909*e4b17023SJohn Marino * number for the placeholder objects defined by libstdc++. 910*e4b17023SJohn Marino */ 911*e4b17023SJohn Marino template<int _Num> 912*e4b17023SJohn Marino struct is_placeholder<_Placeholder<_Num> > 913*e4b17023SJohn Marino { static const int value = _Num; }; 914*e4b17023SJohn Marino 915*e4b17023SJohn Marino template<int _Num> 916*e4b17023SJohn Marino const int is_placeholder<_Placeholder<_Num> >::value; 917*e4b17023SJohn Marino 918*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__ 919*e4b17023SJohn Marino template<int _Num> 920*e4b17023SJohn Marino struct is_placeholder<std::_Placeholder<_Num>> 921*e4b17023SJohn Marino : std::integral_constant<int, _Num> 922*e4b17023SJohn Marino { }; 923*e4b17023SJohn Marino 924*e4b17023SJohn Marino template<int _Num> 925*e4b17023SJohn Marino struct is_placeholder<const std::_Placeholder<_Num>> 926*e4b17023SJohn Marino : std::integral_constant<int, _Num> 927*e4b17023SJohn Marino { }; 928*e4b17023SJohn Marino#endif 929*e4b17023SJohn Marino 930*e4b17023SJohn Marino /** 931*e4b17023SJohn Marino * Stores a tuple of indices. Used by bind() to extract the elements 932*e4b17023SJohn Marino * in a tuple. 933*e4b17023SJohn Marino */ 934*e4b17023SJohn Marino template<int... _Indexes> 935*e4b17023SJohn Marino struct _Index_tuple { }; 936*e4b17023SJohn Marino 937*e4b17023SJohn Marino /// Builds an _Index_tuple<0, 1, 2, ..., _Num-1>. 938*e4b17023SJohn Marino template<std::size_t _Num, typename _Tuple = _Index_tuple<> > 939*e4b17023SJohn Marino struct _Build_index_tuple; 940*e4b17023SJohn Marino 941*e4b17023SJohn Marino template<std::size_t _Num, int... _Indexes> 942*e4b17023SJohn Marino struct _Build_index_tuple<_Num, _Index_tuple<_Indexes...> > 943*e4b17023SJohn Marino : _Build_index_tuple<_Num - 1, 944*e4b17023SJohn Marino _Index_tuple<_Indexes..., sizeof...(_Indexes)> > 945*e4b17023SJohn Marino { 946*e4b17023SJohn Marino }; 947*e4b17023SJohn Marino 948*e4b17023SJohn Marino template<int... _Indexes> 949*e4b17023SJohn Marino struct _Build_index_tuple<0, _Index_tuple<_Indexes...> > 950*e4b17023SJohn Marino { 951*e4b17023SJohn Marino typedef _Index_tuple<_Indexes...> __type; 952*e4b17023SJohn Marino }; 953*e4b17023SJohn Marino 954*e4b17023SJohn Marino /** 955*e4b17023SJohn Marino * Used by _Safe_tuple_element to indicate that there is no tuple 956*e4b17023SJohn Marino * element at this position. 957*e4b17023SJohn Marino */ 958*e4b17023SJohn Marino struct _No_tuple_element; 959*e4b17023SJohn Marino 960*e4b17023SJohn Marino /** 961*e4b17023SJohn Marino * Implementation helper for _Safe_tuple_element. This primary 962*e4b17023SJohn Marino * template handles the case where it is safe to use @c 963*e4b17023SJohn Marino * tuple_element. 964*e4b17023SJohn Marino */ 965*e4b17023SJohn Marino template<int __i, typename _Tuple, bool _IsSafe> 966*e4b17023SJohn Marino struct _Safe_tuple_element_impl 967*e4b17023SJohn Marino : tuple_element<__i, _Tuple> { }; 968*e4b17023SJohn Marino 969*e4b17023SJohn Marino /** 970*e4b17023SJohn Marino * Implementation helper for _Safe_tuple_element. This partial 971*e4b17023SJohn Marino * specialization handles the case where it is not safe to use @c 972*e4b17023SJohn Marino * tuple_element. We just return @c _No_tuple_element. 973*e4b17023SJohn Marino */ 974*e4b17023SJohn Marino template<int __i, typename _Tuple> 975*e4b17023SJohn Marino struct _Safe_tuple_element_impl<__i, _Tuple, false> 976*e4b17023SJohn Marino { 977*e4b17023SJohn Marino typedef _No_tuple_element type; 978*e4b17023SJohn Marino }; 979*e4b17023SJohn Marino 980*e4b17023SJohn Marino /** 981*e4b17023SJohn Marino * Like tuple_element, but returns @c _No_tuple_element when 982*e4b17023SJohn Marino * tuple_element would return an error. 983*e4b17023SJohn Marino */ 984*e4b17023SJohn Marino template<int __i, typename _Tuple> 985*e4b17023SJohn Marino struct _Safe_tuple_element 986*e4b17023SJohn Marino : _Safe_tuple_element_impl<__i, _Tuple, 987*e4b17023SJohn Marino (__i >= 0 && __i < tuple_size<_Tuple>::value)> 988*e4b17023SJohn Marino { 989*e4b17023SJohn Marino }; 990*e4b17023SJohn Marino 991*e4b17023SJohn Marino /** 992*e4b17023SJohn Marino * Maps an argument to bind() into an actual argument to the bound 993*e4b17023SJohn Marino * function object [TR1 3.6.3/5]. Only the first parameter should 994*e4b17023SJohn Marino * be specified: the rest are used to determine among the various 995*e4b17023SJohn Marino * implementations. Note that, although this class is a function 996*e4b17023SJohn Marino * object, it isn't entirely normal because it takes only two 997*e4b17023SJohn Marino * parameters regardless of the number of parameters passed to the 998*e4b17023SJohn Marino * bind expression. The first parameter is the bound argument and 999*e4b17023SJohn Marino * the second parameter is a tuple containing references to the 1000*e4b17023SJohn Marino * rest of the arguments. 1001*e4b17023SJohn Marino */ 1002*e4b17023SJohn Marino template<typename _Arg, 1003*e4b17023SJohn Marino bool _IsBindExp = is_bind_expression<_Arg>::value, 1004*e4b17023SJohn Marino bool _IsPlaceholder = (is_placeholder<_Arg>::value > 0)> 1005*e4b17023SJohn Marino class _Mu; 1006*e4b17023SJohn Marino 1007*e4b17023SJohn Marino /** 1008*e4b17023SJohn Marino * If the argument is reference_wrapper<_Tp>, returns the 1009*e4b17023SJohn Marino * underlying reference. [TR1 3.6.3/5 bullet 1] 1010*e4b17023SJohn Marino */ 1011*e4b17023SJohn Marino template<typename _Tp> 1012*e4b17023SJohn Marino class _Mu<reference_wrapper<_Tp>, false, false> 1013*e4b17023SJohn Marino { 1014*e4b17023SJohn Marino public: 1015*e4b17023SJohn Marino typedef _Tp& result_type; 1016*e4b17023SJohn Marino 1017*e4b17023SJohn Marino /* Note: This won't actually work for const volatile 1018*e4b17023SJohn Marino * reference_wrappers, because reference_wrapper::get() is const 1019*e4b17023SJohn Marino * but not volatile-qualified. This might be a defect in the TR. 1020*e4b17023SJohn Marino */ 1021*e4b17023SJohn Marino template<typename _CVRef, typename _Tuple> 1022*e4b17023SJohn Marino result_type 1023*e4b17023SJohn Marino operator()(_CVRef& __arg, const _Tuple&) const volatile 1024*e4b17023SJohn Marino { return __arg.get(); } 1025*e4b17023SJohn Marino }; 1026*e4b17023SJohn Marino 1027*e4b17023SJohn Marino /** 1028*e4b17023SJohn Marino * If the argument is a bind expression, we invoke the underlying 1029*e4b17023SJohn Marino * function object with the same cv-qualifiers as we are given and 1030*e4b17023SJohn Marino * pass along all of our arguments (unwrapped). [TR1 3.6.3/5 bullet 2] 1031*e4b17023SJohn Marino */ 1032*e4b17023SJohn Marino template<typename _Arg> 1033*e4b17023SJohn Marino class _Mu<_Arg, true, false> 1034*e4b17023SJohn Marino { 1035*e4b17023SJohn Marino public: 1036*e4b17023SJohn Marino template<typename _Signature> class result; 1037*e4b17023SJohn Marino 1038*e4b17023SJohn Marino // Determine the result type when we pass the arguments along. This 1039*e4b17023SJohn Marino // involves passing along the cv-qualifiers placed on _Mu and 1040*e4b17023SJohn Marino // unwrapping the argument bundle. 1041*e4b17023SJohn Marino template<typename _CVMu, typename _CVArg, typename... _Args> 1042*e4b17023SJohn Marino class result<_CVMu(_CVArg, tuple<_Args...>)> 1043*e4b17023SJohn Marino : public result_of<_CVArg(_Args...)> { }; 1044*e4b17023SJohn Marino 1045*e4b17023SJohn Marino template<typename _CVArg, typename... _Args> 1046*e4b17023SJohn Marino typename result_of<_CVArg(_Args...)>::type 1047*e4b17023SJohn Marino operator()(_CVArg& __arg, 1048*e4b17023SJohn Marino const tuple<_Args...>& __tuple) const volatile 1049*e4b17023SJohn Marino { 1050*e4b17023SJohn Marino // Construct an index tuple and forward to __call 1051*e4b17023SJohn Marino typedef typename _Build_index_tuple<sizeof...(_Args)>::__type 1052*e4b17023SJohn Marino _Indexes; 1053*e4b17023SJohn Marino return this->__call(__arg, __tuple, _Indexes()); 1054*e4b17023SJohn Marino } 1055*e4b17023SJohn Marino 1056*e4b17023SJohn Marino private: 1057*e4b17023SJohn Marino // Invokes the underlying function object __arg by unpacking all 1058*e4b17023SJohn Marino // of the arguments in the tuple. 1059*e4b17023SJohn Marino template<typename _CVArg, typename... _Args, int... _Indexes> 1060*e4b17023SJohn Marino typename result_of<_CVArg(_Args...)>::type 1061*e4b17023SJohn Marino __call(_CVArg& __arg, const tuple<_Args...>& __tuple, 1062*e4b17023SJohn Marino const _Index_tuple<_Indexes...>&) const volatile 1063*e4b17023SJohn Marino { 1064*e4b17023SJohn Marino return __arg(tr1::get<_Indexes>(__tuple)...); 1065*e4b17023SJohn Marino } 1066*e4b17023SJohn Marino }; 1067*e4b17023SJohn Marino 1068*e4b17023SJohn Marino /** 1069*e4b17023SJohn Marino * If the argument is a placeholder for the Nth argument, returns 1070*e4b17023SJohn Marino * a reference to the Nth argument to the bind function object. 1071*e4b17023SJohn Marino * [TR1 3.6.3/5 bullet 3] 1072*e4b17023SJohn Marino */ 1073*e4b17023SJohn Marino template<typename _Arg> 1074*e4b17023SJohn Marino class _Mu<_Arg, false, true> 1075*e4b17023SJohn Marino { 1076*e4b17023SJohn Marino public: 1077*e4b17023SJohn Marino template<typename _Signature> class result; 1078*e4b17023SJohn Marino 1079*e4b17023SJohn Marino template<typename _CVMu, typename _CVArg, typename _Tuple> 1080*e4b17023SJohn Marino class result<_CVMu(_CVArg, _Tuple)> 1081*e4b17023SJohn Marino { 1082*e4b17023SJohn Marino // Add a reference, if it hasn't already been done for us. 1083*e4b17023SJohn Marino // This allows us to be a little bit sloppy in constructing 1084*e4b17023SJohn Marino // the tuple that we pass to result_of<...>. 1085*e4b17023SJohn Marino typedef typename _Safe_tuple_element<(is_placeholder<_Arg>::value 1086*e4b17023SJohn Marino - 1), _Tuple>::type 1087*e4b17023SJohn Marino __base_type; 1088*e4b17023SJohn Marino 1089*e4b17023SJohn Marino public: 1090*e4b17023SJohn Marino typedef typename add_reference<__base_type>::type type; 1091*e4b17023SJohn Marino }; 1092*e4b17023SJohn Marino 1093*e4b17023SJohn Marino template<typename _Tuple> 1094*e4b17023SJohn Marino typename result<_Mu(_Arg, _Tuple)>::type 1095*e4b17023SJohn Marino operator()(const volatile _Arg&, const _Tuple& __tuple) const volatile 1096*e4b17023SJohn Marino { 1097*e4b17023SJohn Marino return ::std::tr1::get<(is_placeholder<_Arg>::value - 1)>(__tuple); 1098*e4b17023SJohn Marino } 1099*e4b17023SJohn Marino }; 1100*e4b17023SJohn Marino 1101*e4b17023SJohn Marino /** 1102*e4b17023SJohn Marino * If the argument is just a value, returns a reference to that 1103*e4b17023SJohn Marino * value. The cv-qualifiers on the reference are the same as the 1104*e4b17023SJohn Marino * cv-qualifiers on the _Mu object. [TR1 3.6.3/5 bullet 4] 1105*e4b17023SJohn Marino */ 1106*e4b17023SJohn Marino template<typename _Arg> 1107*e4b17023SJohn Marino class _Mu<_Arg, false, false> 1108*e4b17023SJohn Marino { 1109*e4b17023SJohn Marino public: 1110*e4b17023SJohn Marino template<typename _Signature> struct result; 1111*e4b17023SJohn Marino 1112*e4b17023SJohn Marino template<typename _CVMu, typename _CVArg, typename _Tuple> 1113*e4b17023SJohn Marino struct result<_CVMu(_CVArg, _Tuple)> 1114*e4b17023SJohn Marino { 1115*e4b17023SJohn Marino typedef typename add_reference<_CVArg>::type type; 1116*e4b17023SJohn Marino }; 1117*e4b17023SJohn Marino 1118*e4b17023SJohn Marino // Pick up the cv-qualifiers of the argument 1119*e4b17023SJohn Marino template<typename _CVArg, typename _Tuple> 1120*e4b17023SJohn Marino _CVArg& 1121*e4b17023SJohn Marino operator()(_CVArg& __arg, const _Tuple&) const volatile 1122*e4b17023SJohn Marino { return __arg; } 1123*e4b17023SJohn Marino }; 1124*e4b17023SJohn Marino 1125*e4b17023SJohn Marino /** 1126*e4b17023SJohn Marino * Maps member pointers into instances of _Mem_fn but leaves all 1127*e4b17023SJohn Marino * other function objects untouched. Used by tr1::bind(). The 1128*e4b17023SJohn Marino * primary template handles the non--member-pointer case. 1129*e4b17023SJohn Marino */ 1130*e4b17023SJohn Marino template<typename _Tp> 1131*e4b17023SJohn Marino struct _Maybe_wrap_member_pointer 1132*e4b17023SJohn Marino { 1133*e4b17023SJohn Marino typedef _Tp type; 1134*e4b17023SJohn Marino 1135*e4b17023SJohn Marino static const _Tp& 1136*e4b17023SJohn Marino __do_wrap(const _Tp& __x) 1137*e4b17023SJohn Marino { return __x; } 1138*e4b17023SJohn Marino }; 1139*e4b17023SJohn Marino 1140*e4b17023SJohn Marino /** 1141*e4b17023SJohn Marino * Maps member pointers into instances of _Mem_fn but leaves all 1142*e4b17023SJohn Marino * other function objects untouched. Used by tr1::bind(). This 1143*e4b17023SJohn Marino * partial specialization handles the member pointer case. 1144*e4b17023SJohn Marino */ 1145*e4b17023SJohn Marino template<typename _Tp, typename _Class> 1146*e4b17023SJohn Marino struct _Maybe_wrap_member_pointer<_Tp _Class::*> 1147*e4b17023SJohn Marino { 1148*e4b17023SJohn Marino typedef _Mem_fn<_Tp _Class::*> type; 1149*e4b17023SJohn Marino 1150*e4b17023SJohn Marino static type 1151*e4b17023SJohn Marino __do_wrap(_Tp _Class::* __pm) 1152*e4b17023SJohn Marino { return type(__pm); } 1153*e4b17023SJohn Marino }; 1154*e4b17023SJohn Marino 1155*e4b17023SJohn Marino /// Type of the function object returned from bind(). 1156*e4b17023SJohn Marino template<typename _Signature> 1157*e4b17023SJohn Marino struct _Bind; 1158*e4b17023SJohn Marino 1159*e4b17023SJohn Marino template<typename _Functor, typename... _Bound_args> 1160*e4b17023SJohn Marino class _Bind<_Functor(_Bound_args...)> 1161*e4b17023SJohn Marino : public _Weak_result_type<_Functor> 1162*e4b17023SJohn Marino { 1163*e4b17023SJohn Marino typedef _Bind __self_type; 1164*e4b17023SJohn Marino typedef typename _Build_index_tuple<sizeof...(_Bound_args)>::__type 1165*e4b17023SJohn Marino _Bound_indexes; 1166*e4b17023SJohn Marino 1167*e4b17023SJohn Marino _Functor _M_f; 1168*e4b17023SJohn Marino tuple<_Bound_args...> _M_bound_args; 1169*e4b17023SJohn Marino 1170*e4b17023SJohn Marino // Call unqualified 1171*e4b17023SJohn Marino template<typename... _Args, int... _Indexes> 1172*e4b17023SJohn Marino typename result_of< 1173*e4b17023SJohn Marino _Functor(typename result_of<_Mu<_Bound_args> 1174*e4b17023SJohn Marino (_Bound_args, tuple<_Args...>)>::type...) 1175*e4b17023SJohn Marino >::type 1176*e4b17023SJohn Marino __call(const tuple<_Args...>& __args, _Index_tuple<_Indexes...>) 1177*e4b17023SJohn Marino { 1178*e4b17023SJohn Marino return _M_f(_Mu<_Bound_args>() 1179*e4b17023SJohn Marino (tr1::get<_Indexes>(_M_bound_args), __args)...); 1180*e4b17023SJohn Marino } 1181*e4b17023SJohn Marino 1182*e4b17023SJohn Marino // Call as const 1183*e4b17023SJohn Marino template<typename... _Args, int... _Indexes> 1184*e4b17023SJohn Marino typename result_of< 1185*e4b17023SJohn Marino const _Functor(typename result_of<_Mu<_Bound_args> 1186*e4b17023SJohn Marino (const _Bound_args, tuple<_Args...>) 1187*e4b17023SJohn Marino >::type...)>::type 1188*e4b17023SJohn Marino __call(const tuple<_Args...>& __args, _Index_tuple<_Indexes...>) const 1189*e4b17023SJohn Marino { 1190*e4b17023SJohn Marino return _M_f(_Mu<_Bound_args>() 1191*e4b17023SJohn Marino (tr1::get<_Indexes>(_M_bound_args), __args)...); 1192*e4b17023SJohn Marino } 1193*e4b17023SJohn Marino 1194*e4b17023SJohn Marino // Call as volatile 1195*e4b17023SJohn Marino template<typename... _Args, int... _Indexes> 1196*e4b17023SJohn Marino typename result_of< 1197*e4b17023SJohn Marino volatile _Functor(typename result_of<_Mu<_Bound_args> 1198*e4b17023SJohn Marino (volatile _Bound_args, tuple<_Args...>) 1199*e4b17023SJohn Marino >::type...)>::type 1200*e4b17023SJohn Marino __call(const tuple<_Args...>& __args, 1201*e4b17023SJohn Marino _Index_tuple<_Indexes...>) volatile 1202*e4b17023SJohn Marino { 1203*e4b17023SJohn Marino return _M_f(_Mu<_Bound_args>() 1204*e4b17023SJohn Marino (tr1::get<_Indexes>(_M_bound_args), __args)...); 1205*e4b17023SJohn Marino } 1206*e4b17023SJohn Marino 1207*e4b17023SJohn Marino // Call as const volatile 1208*e4b17023SJohn Marino template<typename... _Args, int... _Indexes> 1209*e4b17023SJohn Marino typename result_of< 1210*e4b17023SJohn Marino const volatile _Functor(typename result_of<_Mu<_Bound_args> 1211*e4b17023SJohn Marino (const volatile _Bound_args, 1212*e4b17023SJohn Marino tuple<_Args...>) 1213*e4b17023SJohn Marino >::type...)>::type 1214*e4b17023SJohn Marino __call(const tuple<_Args...>& __args, 1215*e4b17023SJohn Marino _Index_tuple<_Indexes...>) const volatile 1216*e4b17023SJohn Marino { 1217*e4b17023SJohn Marino return _M_f(_Mu<_Bound_args>() 1218*e4b17023SJohn Marino (tr1::get<_Indexes>(_M_bound_args), __args)...); 1219*e4b17023SJohn Marino } 1220*e4b17023SJohn Marino 1221*e4b17023SJohn Marino public: 1222*e4b17023SJohn Marino explicit _Bind(_Functor __f, _Bound_args... __bound_args) 1223*e4b17023SJohn Marino : _M_f(__f), _M_bound_args(__bound_args...) { } 1224*e4b17023SJohn Marino 1225*e4b17023SJohn Marino // Call unqualified 1226*e4b17023SJohn Marino template<typename... _Args> 1227*e4b17023SJohn Marino typename result_of< 1228*e4b17023SJohn Marino _Functor(typename result_of<_Mu<_Bound_args> 1229*e4b17023SJohn Marino (_Bound_args, tuple<_Args...>)>::type...) 1230*e4b17023SJohn Marino >::type 1231*e4b17023SJohn Marino operator()(_Args&... __args) 1232*e4b17023SJohn Marino { 1233*e4b17023SJohn Marino return this->__call(tr1::tie(__args...), _Bound_indexes()); 1234*e4b17023SJohn Marino } 1235*e4b17023SJohn Marino 1236*e4b17023SJohn Marino // Call as const 1237*e4b17023SJohn Marino template<typename... _Args> 1238*e4b17023SJohn Marino typename result_of< 1239*e4b17023SJohn Marino const _Functor(typename result_of<_Mu<_Bound_args> 1240*e4b17023SJohn Marino (const _Bound_args, tuple<_Args...>)>::type...) 1241*e4b17023SJohn Marino >::type 1242*e4b17023SJohn Marino operator()(_Args&... __args) const 1243*e4b17023SJohn Marino { 1244*e4b17023SJohn Marino return this->__call(tr1::tie(__args...), _Bound_indexes()); 1245*e4b17023SJohn Marino } 1246*e4b17023SJohn Marino 1247*e4b17023SJohn Marino 1248*e4b17023SJohn Marino // Call as volatile 1249*e4b17023SJohn Marino template<typename... _Args> 1250*e4b17023SJohn Marino typename result_of< 1251*e4b17023SJohn Marino volatile _Functor(typename result_of<_Mu<_Bound_args> 1252*e4b17023SJohn Marino (volatile _Bound_args, tuple<_Args...>)>::type...) 1253*e4b17023SJohn Marino >::type 1254*e4b17023SJohn Marino operator()(_Args&... __args) volatile 1255*e4b17023SJohn Marino { 1256*e4b17023SJohn Marino return this->__call(tr1::tie(__args...), _Bound_indexes()); 1257*e4b17023SJohn Marino } 1258*e4b17023SJohn Marino 1259*e4b17023SJohn Marino 1260*e4b17023SJohn Marino // Call as const volatile 1261*e4b17023SJohn Marino template<typename... _Args> 1262*e4b17023SJohn Marino typename result_of< 1263*e4b17023SJohn Marino const volatile _Functor(typename result_of<_Mu<_Bound_args> 1264*e4b17023SJohn Marino (const volatile _Bound_args, 1265*e4b17023SJohn Marino tuple<_Args...>)>::type...) 1266*e4b17023SJohn Marino >::type 1267*e4b17023SJohn Marino operator()(_Args&... __args) const volatile 1268*e4b17023SJohn Marino { 1269*e4b17023SJohn Marino return this->__call(tr1::tie(__args...), _Bound_indexes()); 1270*e4b17023SJohn Marino } 1271*e4b17023SJohn Marino }; 1272*e4b17023SJohn Marino 1273*e4b17023SJohn Marino /// Type of the function object returned from bind<R>(). 1274*e4b17023SJohn Marino template<typename _Result, typename _Signature> 1275*e4b17023SJohn Marino struct _Bind_result; 1276*e4b17023SJohn Marino 1277*e4b17023SJohn Marino template<typename _Result, typename _Functor, typename... _Bound_args> 1278*e4b17023SJohn Marino class _Bind_result<_Result, _Functor(_Bound_args...)> 1279*e4b17023SJohn Marino { 1280*e4b17023SJohn Marino typedef _Bind_result __self_type; 1281*e4b17023SJohn Marino typedef typename _Build_index_tuple<sizeof...(_Bound_args)>::__type 1282*e4b17023SJohn Marino _Bound_indexes; 1283*e4b17023SJohn Marino 1284*e4b17023SJohn Marino _Functor _M_f; 1285*e4b17023SJohn Marino tuple<_Bound_args...> _M_bound_args; 1286*e4b17023SJohn Marino 1287*e4b17023SJohn Marino // Call unqualified 1288*e4b17023SJohn Marino template<typename... _Args, int... _Indexes> 1289*e4b17023SJohn Marino _Result 1290*e4b17023SJohn Marino __call(const tuple<_Args...>& __args, _Index_tuple<_Indexes...>) 1291*e4b17023SJohn Marino { 1292*e4b17023SJohn Marino return _M_f(_Mu<_Bound_args>() 1293*e4b17023SJohn Marino (tr1::get<_Indexes>(_M_bound_args), __args)...); 1294*e4b17023SJohn Marino } 1295*e4b17023SJohn Marino 1296*e4b17023SJohn Marino // Call as const 1297*e4b17023SJohn Marino template<typename... _Args, int... _Indexes> 1298*e4b17023SJohn Marino _Result 1299*e4b17023SJohn Marino __call(const tuple<_Args...>& __args, _Index_tuple<_Indexes...>) const 1300*e4b17023SJohn Marino { 1301*e4b17023SJohn Marino return _M_f(_Mu<_Bound_args>() 1302*e4b17023SJohn Marino (tr1::get<_Indexes>(_M_bound_args), __args)...); 1303*e4b17023SJohn Marino } 1304*e4b17023SJohn Marino 1305*e4b17023SJohn Marino // Call as volatile 1306*e4b17023SJohn Marino template<typename... _Args, int... _Indexes> 1307*e4b17023SJohn Marino _Result 1308*e4b17023SJohn Marino __call(const tuple<_Args...>& __args, 1309*e4b17023SJohn Marino _Index_tuple<_Indexes...>) volatile 1310*e4b17023SJohn Marino { 1311*e4b17023SJohn Marino return _M_f(_Mu<_Bound_args>() 1312*e4b17023SJohn Marino (tr1::get<_Indexes>(_M_bound_args), __args)...); 1313*e4b17023SJohn Marino } 1314*e4b17023SJohn Marino 1315*e4b17023SJohn Marino // Call as const volatile 1316*e4b17023SJohn Marino template<typename... _Args, int... _Indexes> 1317*e4b17023SJohn Marino _Result 1318*e4b17023SJohn Marino __call(const tuple<_Args...>& __args, 1319*e4b17023SJohn Marino _Index_tuple<_Indexes...>) const volatile 1320*e4b17023SJohn Marino { 1321*e4b17023SJohn Marino return _M_f(_Mu<_Bound_args>() 1322*e4b17023SJohn Marino (tr1::get<_Indexes>(_M_bound_args), __args)...); 1323*e4b17023SJohn Marino } 1324*e4b17023SJohn Marino 1325*e4b17023SJohn Marino public: 1326*e4b17023SJohn Marino typedef _Result result_type; 1327*e4b17023SJohn Marino 1328*e4b17023SJohn Marino explicit 1329*e4b17023SJohn Marino _Bind_result(_Functor __f, _Bound_args... __bound_args) 1330*e4b17023SJohn Marino : _M_f(__f), _M_bound_args(__bound_args...) { } 1331*e4b17023SJohn Marino 1332*e4b17023SJohn Marino // Call unqualified 1333*e4b17023SJohn Marino template<typename... _Args> 1334*e4b17023SJohn Marino result_type 1335*e4b17023SJohn Marino operator()(_Args&... __args) 1336*e4b17023SJohn Marino { 1337*e4b17023SJohn Marino return this->__call(tr1::tie(__args...), _Bound_indexes()); 1338*e4b17023SJohn Marino } 1339*e4b17023SJohn Marino 1340*e4b17023SJohn Marino // Call as const 1341*e4b17023SJohn Marino template<typename... _Args> 1342*e4b17023SJohn Marino result_type 1343*e4b17023SJohn Marino operator()(_Args&... __args) const 1344*e4b17023SJohn Marino { 1345*e4b17023SJohn Marino return this->__call(tr1::tie(__args...), _Bound_indexes()); 1346*e4b17023SJohn Marino } 1347*e4b17023SJohn Marino 1348*e4b17023SJohn Marino // Call as volatile 1349*e4b17023SJohn Marino template<typename... _Args> 1350*e4b17023SJohn Marino result_type 1351*e4b17023SJohn Marino operator()(_Args&... __args) volatile 1352*e4b17023SJohn Marino { 1353*e4b17023SJohn Marino return this->__call(tr1::tie(__args...), _Bound_indexes()); 1354*e4b17023SJohn Marino } 1355*e4b17023SJohn Marino 1356*e4b17023SJohn Marino // Call as const volatile 1357*e4b17023SJohn Marino template<typename... _Args> 1358*e4b17023SJohn Marino result_type 1359*e4b17023SJohn Marino operator()(_Args&... __args) const volatile 1360*e4b17023SJohn Marino { 1361*e4b17023SJohn Marino return this->__call(tr1::tie(__args...), _Bound_indexes()); 1362*e4b17023SJohn Marino } 1363*e4b17023SJohn Marino }; 1364*e4b17023SJohn Marino 1365*e4b17023SJohn Marino /// Class template _Bind is always a bind expression. 1366*e4b17023SJohn Marino template<typename _Signature> 1367*e4b17023SJohn Marino struct is_bind_expression<_Bind<_Signature> > 1368*e4b17023SJohn Marino { static const bool value = true; }; 1369*e4b17023SJohn Marino 1370*e4b17023SJohn Marino template<typename _Signature> 1371*e4b17023SJohn Marino const bool is_bind_expression<_Bind<_Signature> >::value; 1372*e4b17023SJohn Marino 1373*e4b17023SJohn Marino /// Class template _Bind is always a bind expression. 1374*e4b17023SJohn Marino template<typename _Signature> 1375*e4b17023SJohn Marino struct is_bind_expression<const _Bind<_Signature> > 1376*e4b17023SJohn Marino { static const bool value = true; }; 1377*e4b17023SJohn Marino 1378*e4b17023SJohn Marino template<typename _Signature> 1379*e4b17023SJohn Marino const bool is_bind_expression<const _Bind<_Signature> >::value; 1380*e4b17023SJohn Marino 1381*e4b17023SJohn Marino /// Class template _Bind is always a bind expression. 1382*e4b17023SJohn Marino template<typename _Signature> 1383*e4b17023SJohn Marino struct is_bind_expression<volatile _Bind<_Signature> > 1384*e4b17023SJohn Marino { static const bool value = true; }; 1385*e4b17023SJohn Marino 1386*e4b17023SJohn Marino template<typename _Signature> 1387*e4b17023SJohn Marino const bool is_bind_expression<volatile _Bind<_Signature> >::value; 1388*e4b17023SJohn Marino 1389*e4b17023SJohn Marino /// Class template _Bind is always a bind expression. 1390*e4b17023SJohn Marino template<typename _Signature> 1391*e4b17023SJohn Marino struct is_bind_expression<const volatile _Bind<_Signature> > 1392*e4b17023SJohn Marino { static const bool value = true; }; 1393*e4b17023SJohn Marino 1394*e4b17023SJohn Marino template<typename _Signature> 1395*e4b17023SJohn Marino const bool is_bind_expression<const volatile _Bind<_Signature> >::value; 1396*e4b17023SJohn Marino 1397*e4b17023SJohn Marino /// Class template _Bind_result is always a bind expression. 1398*e4b17023SJohn Marino template<typename _Result, typename _Signature> 1399*e4b17023SJohn Marino struct is_bind_expression<_Bind_result<_Result, _Signature> > 1400*e4b17023SJohn Marino { static const bool value = true; }; 1401*e4b17023SJohn Marino 1402*e4b17023SJohn Marino template<typename _Result, typename _Signature> 1403*e4b17023SJohn Marino const bool is_bind_expression<_Bind_result<_Result, _Signature> >::value; 1404*e4b17023SJohn Marino 1405*e4b17023SJohn Marino /// Class template _Bind_result is always a bind expression. 1406*e4b17023SJohn Marino template<typename _Result, typename _Signature> 1407*e4b17023SJohn Marino struct is_bind_expression<const _Bind_result<_Result, _Signature> > 1408*e4b17023SJohn Marino { static const bool value = true; }; 1409*e4b17023SJohn Marino 1410*e4b17023SJohn Marino template<typename _Result, typename _Signature> 1411*e4b17023SJohn Marino const bool 1412*e4b17023SJohn Marino is_bind_expression<const _Bind_result<_Result, _Signature> >::value; 1413*e4b17023SJohn Marino 1414*e4b17023SJohn Marino /// Class template _Bind_result is always a bind expression. 1415*e4b17023SJohn Marino template<typename _Result, typename _Signature> 1416*e4b17023SJohn Marino struct is_bind_expression<volatile _Bind_result<_Result, _Signature> > 1417*e4b17023SJohn Marino { static const bool value = true; }; 1418*e4b17023SJohn Marino 1419*e4b17023SJohn Marino template<typename _Result, typename _Signature> 1420*e4b17023SJohn Marino const bool 1421*e4b17023SJohn Marino is_bind_expression<volatile _Bind_result<_Result, _Signature> >::value; 1422*e4b17023SJohn Marino 1423*e4b17023SJohn Marino /// Class template _Bind_result is always a bind expression. 1424*e4b17023SJohn Marino template<typename _Result, typename _Signature> 1425*e4b17023SJohn Marino struct 1426*e4b17023SJohn Marino is_bind_expression<const volatile _Bind_result<_Result, _Signature> > 1427*e4b17023SJohn Marino { static const bool value = true; }; 1428*e4b17023SJohn Marino 1429*e4b17023SJohn Marino template<typename _Result, typename _Signature> 1430*e4b17023SJohn Marino const bool 1431*e4b17023SJohn Marino is_bind_expression<const volatile _Bind_result<_Result, 1432*e4b17023SJohn Marino _Signature> >::value; 1433*e4b17023SJohn Marino 1434*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__ 1435*e4b17023SJohn Marino template<typename _Signature> 1436*e4b17023SJohn Marino struct is_bind_expression<std::_Bind<_Signature>> 1437*e4b17023SJohn Marino : true_type { }; 1438*e4b17023SJohn Marino 1439*e4b17023SJohn Marino template<typename _Signature> 1440*e4b17023SJohn Marino struct is_bind_expression<const std::_Bind<_Signature>> 1441*e4b17023SJohn Marino : true_type { }; 1442*e4b17023SJohn Marino 1443*e4b17023SJohn Marino template<typename _Signature> 1444*e4b17023SJohn Marino struct is_bind_expression<volatile std::_Bind<_Signature>> 1445*e4b17023SJohn Marino : true_type { }; 1446*e4b17023SJohn Marino 1447*e4b17023SJohn Marino template<typename _Signature> 1448*e4b17023SJohn Marino struct is_bind_expression<const volatile std::_Bind<_Signature>> 1449*e4b17023SJohn Marino : true_type { }; 1450*e4b17023SJohn Marino 1451*e4b17023SJohn Marino template<typename _Result, typename _Signature> 1452*e4b17023SJohn Marino struct is_bind_expression<std::_Bind_result<_Result, _Signature>> 1453*e4b17023SJohn Marino : true_type { }; 1454*e4b17023SJohn Marino 1455*e4b17023SJohn Marino template<typename _Result, typename _Signature> 1456*e4b17023SJohn Marino struct is_bind_expression<const std::_Bind_result<_Result, _Signature>> 1457*e4b17023SJohn Marino : true_type { }; 1458*e4b17023SJohn Marino 1459*e4b17023SJohn Marino template<typename _Result, typename _Signature> 1460*e4b17023SJohn Marino struct is_bind_expression<volatile std::_Bind_result<_Result, _Signature>> 1461*e4b17023SJohn Marino : true_type { }; 1462*e4b17023SJohn Marino 1463*e4b17023SJohn Marino template<typename _Result, typename _Signature> 1464*e4b17023SJohn Marino struct is_bind_expression<const volatile std::_Bind_result<_Result, 1465*e4b17023SJohn Marino _Signature>> 1466*e4b17023SJohn Marino : true_type { }; 1467*e4b17023SJohn Marino#endif 1468*e4b17023SJohn Marino 1469*e4b17023SJohn Marino /// bind 1470*e4b17023SJohn Marino template<typename _Functor, typename... _ArgTypes> 1471*e4b17023SJohn Marino inline 1472*e4b17023SJohn Marino _Bind<typename _Maybe_wrap_member_pointer<_Functor>::type(_ArgTypes...)> 1473*e4b17023SJohn Marino bind(_Functor __f, _ArgTypes... __args) 1474*e4b17023SJohn Marino { 1475*e4b17023SJohn Marino typedef _Maybe_wrap_member_pointer<_Functor> __maybe_type; 1476*e4b17023SJohn Marino typedef typename __maybe_type::type __functor_type; 1477*e4b17023SJohn Marino typedef _Bind<__functor_type(_ArgTypes...)> __result_type; 1478*e4b17023SJohn Marino return __result_type(__maybe_type::__do_wrap(__f), __args...); 1479*e4b17023SJohn Marino } 1480*e4b17023SJohn Marino 1481*e4b17023SJohn Marino template<typename _Result, typename _Functor, typename... _ArgTypes> 1482*e4b17023SJohn Marino inline 1483*e4b17023SJohn Marino _Bind_result<_Result, 1484*e4b17023SJohn Marino typename _Maybe_wrap_member_pointer<_Functor>::type 1485*e4b17023SJohn Marino (_ArgTypes...)> 1486*e4b17023SJohn Marino bind(_Functor __f, _ArgTypes... __args) 1487*e4b17023SJohn Marino { 1488*e4b17023SJohn Marino typedef _Maybe_wrap_member_pointer<_Functor> __maybe_type; 1489*e4b17023SJohn Marino typedef typename __maybe_type::type __functor_type; 1490*e4b17023SJohn Marino typedef _Bind_result<_Result, __functor_type(_ArgTypes...)> 1491*e4b17023SJohn Marino __result_type; 1492*e4b17023SJohn Marino return __result_type(__maybe_type::__do_wrap(__f), __args...); 1493*e4b17023SJohn Marino } 1494*e4b17023SJohn Marino 1495*e4b17023SJohn Marino /** 1496*e4b17023SJohn Marino * @brief Exception class thrown when class template function's 1497*e4b17023SJohn Marino * operator() is called with an empty target. 1498*e4b17023SJohn Marino * @ingroup exceptions 1499*e4b17023SJohn Marino */ 1500*e4b17023SJohn Marino class bad_function_call : public std::exception { }; 1501*e4b17023SJohn Marino 1502*e4b17023SJohn Marino /** 1503*e4b17023SJohn Marino * The integral constant expression 0 can be converted into a 1504*e4b17023SJohn Marino * pointer to this type. It is used by the function template to 1505*e4b17023SJohn Marino * accept NULL pointers. 1506*e4b17023SJohn Marino */ 1507*e4b17023SJohn Marino struct _M_clear_type; 1508*e4b17023SJohn Marino 1509*e4b17023SJohn Marino /** 1510*e4b17023SJohn Marino * Trait identifying @a location-invariant types, meaning that the 1511*e4b17023SJohn Marino * address of the object (or any of its members) will not escape. 1512*e4b17023SJohn Marino * Also implies a trivial copy constructor and assignment operator. 1513*e4b17023SJohn Marino */ 1514*e4b17023SJohn Marino template<typename _Tp> 1515*e4b17023SJohn Marino struct __is_location_invariant 1516*e4b17023SJohn Marino : integral_constant<bool, 1517*e4b17023SJohn Marino (is_pointer<_Tp>::value 1518*e4b17023SJohn Marino || is_member_pointer<_Tp>::value)> 1519*e4b17023SJohn Marino { 1520*e4b17023SJohn Marino }; 1521*e4b17023SJohn Marino 1522*e4b17023SJohn Marino class _Undefined_class; 1523*e4b17023SJohn Marino 1524*e4b17023SJohn Marino union _Nocopy_types 1525*e4b17023SJohn Marino { 1526*e4b17023SJohn Marino void* _M_object; 1527*e4b17023SJohn Marino const void* _M_const_object; 1528*e4b17023SJohn Marino void (*_M_function_pointer)(); 1529*e4b17023SJohn Marino void (_Undefined_class::*_M_member_pointer)(); 1530*e4b17023SJohn Marino }; 1531*e4b17023SJohn Marino 1532*e4b17023SJohn Marino union _Any_data 1533*e4b17023SJohn Marino { 1534*e4b17023SJohn Marino void* _M_access() { return &_M_pod_data[0]; } 1535*e4b17023SJohn Marino const void* _M_access() const { return &_M_pod_data[0]; } 1536*e4b17023SJohn Marino 1537*e4b17023SJohn Marino template<typename _Tp> 1538*e4b17023SJohn Marino _Tp& 1539*e4b17023SJohn Marino _M_access() 1540*e4b17023SJohn Marino { return *static_cast<_Tp*>(_M_access()); } 1541*e4b17023SJohn Marino 1542*e4b17023SJohn Marino template<typename _Tp> 1543*e4b17023SJohn Marino const _Tp& 1544*e4b17023SJohn Marino _M_access() const 1545*e4b17023SJohn Marino { return *static_cast<const _Tp*>(_M_access()); } 1546*e4b17023SJohn Marino 1547*e4b17023SJohn Marino _Nocopy_types _M_unused; 1548*e4b17023SJohn Marino char _M_pod_data[sizeof(_Nocopy_types)]; 1549*e4b17023SJohn Marino }; 1550*e4b17023SJohn Marino 1551*e4b17023SJohn Marino enum _Manager_operation 1552*e4b17023SJohn Marino { 1553*e4b17023SJohn Marino __get_type_info, 1554*e4b17023SJohn Marino __get_functor_ptr, 1555*e4b17023SJohn Marino __clone_functor, 1556*e4b17023SJohn Marino __destroy_functor 1557*e4b17023SJohn Marino }; 1558*e4b17023SJohn Marino 1559*e4b17023SJohn Marino // Simple type wrapper that helps avoid annoying const problems 1560*e4b17023SJohn Marino // when casting between void pointers and pointers-to-pointers. 1561*e4b17023SJohn Marino template<typename _Tp> 1562*e4b17023SJohn Marino struct _Simple_type_wrapper 1563*e4b17023SJohn Marino { 1564*e4b17023SJohn Marino _Simple_type_wrapper(_Tp __value) : __value(__value) { } 1565*e4b17023SJohn Marino 1566*e4b17023SJohn Marino _Tp __value; 1567*e4b17023SJohn Marino }; 1568*e4b17023SJohn Marino 1569*e4b17023SJohn Marino template<typename _Tp> 1570*e4b17023SJohn Marino struct __is_location_invariant<_Simple_type_wrapper<_Tp> > 1571*e4b17023SJohn Marino : __is_location_invariant<_Tp> 1572*e4b17023SJohn Marino { 1573*e4b17023SJohn Marino }; 1574*e4b17023SJohn Marino 1575*e4b17023SJohn Marino // Converts a reference to a function object into a callable 1576*e4b17023SJohn Marino // function object. 1577*e4b17023SJohn Marino template<typename _Functor> 1578*e4b17023SJohn Marino inline _Functor& 1579*e4b17023SJohn Marino __callable_functor(_Functor& __f) 1580*e4b17023SJohn Marino { return __f; } 1581*e4b17023SJohn Marino 1582*e4b17023SJohn Marino template<typename _Member, typename _Class> 1583*e4b17023SJohn Marino inline _Mem_fn<_Member _Class::*> 1584*e4b17023SJohn Marino __callable_functor(_Member _Class::* &__p) 1585*e4b17023SJohn Marino { return mem_fn(__p); } 1586*e4b17023SJohn Marino 1587*e4b17023SJohn Marino template<typename _Member, typename _Class> 1588*e4b17023SJohn Marino inline _Mem_fn<_Member _Class::*> 1589*e4b17023SJohn Marino __callable_functor(_Member _Class::* const &__p) 1590*e4b17023SJohn Marino { return mem_fn(__p); } 1591*e4b17023SJohn Marino 1592*e4b17023SJohn Marino template<typename _Signature> 1593*e4b17023SJohn Marino class function; 1594*e4b17023SJohn Marino 1595*e4b17023SJohn Marino /// Base class of all polymorphic function object wrappers. 1596*e4b17023SJohn Marino class _Function_base 1597*e4b17023SJohn Marino { 1598*e4b17023SJohn Marino public: 1599*e4b17023SJohn Marino static const std::size_t _M_max_size = sizeof(_Nocopy_types); 1600*e4b17023SJohn Marino static const std::size_t _M_max_align = __alignof__(_Nocopy_types); 1601*e4b17023SJohn Marino 1602*e4b17023SJohn Marino template<typename _Functor> 1603*e4b17023SJohn Marino class _Base_manager 1604*e4b17023SJohn Marino { 1605*e4b17023SJohn Marino protected: 1606*e4b17023SJohn Marino static const bool __stored_locally = 1607*e4b17023SJohn Marino (__is_location_invariant<_Functor>::value 1608*e4b17023SJohn Marino && sizeof(_Functor) <= _M_max_size 1609*e4b17023SJohn Marino && __alignof__(_Functor) <= _M_max_align 1610*e4b17023SJohn Marino && (_M_max_align % __alignof__(_Functor) == 0)); 1611*e4b17023SJohn Marino 1612*e4b17023SJohn Marino typedef integral_constant<bool, __stored_locally> _Local_storage; 1613*e4b17023SJohn Marino 1614*e4b17023SJohn Marino // Retrieve a pointer to the function object 1615*e4b17023SJohn Marino static _Functor* 1616*e4b17023SJohn Marino _M_get_pointer(const _Any_data& __source) 1617*e4b17023SJohn Marino { 1618*e4b17023SJohn Marino const _Functor* __ptr = 1619*e4b17023SJohn Marino __stored_locally? &__source._M_access<_Functor>() 1620*e4b17023SJohn Marino /* have stored a pointer */ : __source._M_access<_Functor*>(); 1621*e4b17023SJohn Marino return const_cast<_Functor*>(__ptr); 1622*e4b17023SJohn Marino } 1623*e4b17023SJohn Marino 1624*e4b17023SJohn Marino // Clone a location-invariant function object that fits within 1625*e4b17023SJohn Marino // an _Any_data structure. 1626*e4b17023SJohn Marino static void 1627*e4b17023SJohn Marino _M_clone(_Any_data& __dest, const _Any_data& __source, true_type) 1628*e4b17023SJohn Marino { 1629*e4b17023SJohn Marino new (__dest._M_access()) _Functor(__source._M_access<_Functor>()); 1630*e4b17023SJohn Marino } 1631*e4b17023SJohn Marino 1632*e4b17023SJohn Marino // Clone a function object that is not location-invariant or 1633*e4b17023SJohn Marino // that cannot fit into an _Any_data structure. 1634*e4b17023SJohn Marino static void 1635*e4b17023SJohn Marino _M_clone(_Any_data& __dest, const _Any_data& __source, false_type) 1636*e4b17023SJohn Marino { 1637*e4b17023SJohn Marino __dest._M_access<_Functor*>() = 1638*e4b17023SJohn Marino new _Functor(*__source._M_access<_Functor*>()); 1639*e4b17023SJohn Marino } 1640*e4b17023SJohn Marino 1641*e4b17023SJohn Marino // Destroying a location-invariant object may still require 1642*e4b17023SJohn Marino // destruction. 1643*e4b17023SJohn Marino static void 1644*e4b17023SJohn Marino _M_destroy(_Any_data& __victim, true_type) 1645*e4b17023SJohn Marino { 1646*e4b17023SJohn Marino __victim._M_access<_Functor>().~_Functor(); 1647*e4b17023SJohn Marino } 1648*e4b17023SJohn Marino 1649*e4b17023SJohn Marino // Destroying an object located on the heap. 1650*e4b17023SJohn Marino static void 1651*e4b17023SJohn Marino _M_destroy(_Any_data& __victim, false_type) 1652*e4b17023SJohn Marino { 1653*e4b17023SJohn Marino delete __victim._M_access<_Functor*>(); 1654*e4b17023SJohn Marino } 1655*e4b17023SJohn Marino 1656*e4b17023SJohn Marino public: 1657*e4b17023SJohn Marino static bool 1658*e4b17023SJohn Marino _M_manager(_Any_data& __dest, const _Any_data& __source, 1659*e4b17023SJohn Marino _Manager_operation __op) 1660*e4b17023SJohn Marino { 1661*e4b17023SJohn Marino switch (__op) 1662*e4b17023SJohn Marino { 1663*e4b17023SJohn Marino#ifdef __GXX_RTTI 1664*e4b17023SJohn Marino case __get_type_info: 1665*e4b17023SJohn Marino __dest._M_access<const type_info*>() = &typeid(_Functor); 1666*e4b17023SJohn Marino break; 1667*e4b17023SJohn Marino#endif 1668*e4b17023SJohn Marino case __get_functor_ptr: 1669*e4b17023SJohn Marino __dest._M_access<_Functor*>() = _M_get_pointer(__source); 1670*e4b17023SJohn Marino break; 1671*e4b17023SJohn Marino 1672*e4b17023SJohn Marino case __clone_functor: 1673*e4b17023SJohn Marino _M_clone(__dest, __source, _Local_storage()); 1674*e4b17023SJohn Marino break; 1675*e4b17023SJohn Marino 1676*e4b17023SJohn Marino case __destroy_functor: 1677*e4b17023SJohn Marino _M_destroy(__dest, _Local_storage()); 1678*e4b17023SJohn Marino break; 1679*e4b17023SJohn Marino } 1680*e4b17023SJohn Marino return false; 1681*e4b17023SJohn Marino } 1682*e4b17023SJohn Marino 1683*e4b17023SJohn Marino static void 1684*e4b17023SJohn Marino _M_init_functor(_Any_data& __functor, const _Functor& __f) 1685*e4b17023SJohn Marino { _M_init_functor(__functor, __f, _Local_storage()); } 1686*e4b17023SJohn Marino 1687*e4b17023SJohn Marino template<typename _Signature> 1688*e4b17023SJohn Marino static bool 1689*e4b17023SJohn Marino _M_not_empty_function(const function<_Signature>& __f) 1690*e4b17023SJohn Marino { return static_cast<bool>(__f); } 1691*e4b17023SJohn Marino 1692*e4b17023SJohn Marino template<typename _Tp> 1693*e4b17023SJohn Marino static bool 1694*e4b17023SJohn Marino _M_not_empty_function(const _Tp*& __fp) 1695*e4b17023SJohn Marino { return __fp; } 1696*e4b17023SJohn Marino 1697*e4b17023SJohn Marino template<typename _Class, typename _Tp> 1698*e4b17023SJohn Marino static bool 1699*e4b17023SJohn Marino _M_not_empty_function(_Tp _Class::* const& __mp) 1700*e4b17023SJohn Marino { return __mp; } 1701*e4b17023SJohn Marino 1702*e4b17023SJohn Marino template<typename _Tp> 1703*e4b17023SJohn Marino static bool 1704*e4b17023SJohn Marino _M_not_empty_function(const _Tp&) 1705*e4b17023SJohn Marino { return true; } 1706*e4b17023SJohn Marino 1707*e4b17023SJohn Marino private: 1708*e4b17023SJohn Marino static void 1709*e4b17023SJohn Marino _M_init_functor(_Any_data& __functor, const _Functor& __f, true_type) 1710*e4b17023SJohn Marino { new (__functor._M_access()) _Functor(__f); } 1711*e4b17023SJohn Marino 1712*e4b17023SJohn Marino static void 1713*e4b17023SJohn Marino _M_init_functor(_Any_data& __functor, const _Functor& __f, false_type) 1714*e4b17023SJohn Marino { __functor._M_access<_Functor*>() = new _Functor(__f); } 1715*e4b17023SJohn Marino }; 1716*e4b17023SJohn Marino 1717*e4b17023SJohn Marino template<typename _Functor> 1718*e4b17023SJohn Marino class _Ref_manager : public _Base_manager<_Functor*> 1719*e4b17023SJohn Marino { 1720*e4b17023SJohn Marino typedef _Function_base::_Base_manager<_Functor*> _Base; 1721*e4b17023SJohn Marino 1722*e4b17023SJohn Marino public: 1723*e4b17023SJohn Marino static bool 1724*e4b17023SJohn Marino _M_manager(_Any_data& __dest, const _Any_data& __source, 1725*e4b17023SJohn Marino _Manager_operation __op) 1726*e4b17023SJohn Marino { 1727*e4b17023SJohn Marino switch (__op) 1728*e4b17023SJohn Marino { 1729*e4b17023SJohn Marino#ifdef __GXX_RTTI 1730*e4b17023SJohn Marino case __get_type_info: 1731*e4b17023SJohn Marino __dest._M_access<const type_info*>() = &typeid(_Functor); 1732*e4b17023SJohn Marino break; 1733*e4b17023SJohn Marino#endif 1734*e4b17023SJohn Marino case __get_functor_ptr: 1735*e4b17023SJohn Marino __dest._M_access<_Functor*>() = *_Base::_M_get_pointer(__source); 1736*e4b17023SJohn Marino return is_const<_Functor>::value; 1737*e4b17023SJohn Marino break; 1738*e4b17023SJohn Marino 1739*e4b17023SJohn Marino default: 1740*e4b17023SJohn Marino _Base::_M_manager(__dest, __source, __op); 1741*e4b17023SJohn Marino } 1742*e4b17023SJohn Marino return false; 1743*e4b17023SJohn Marino } 1744*e4b17023SJohn Marino 1745*e4b17023SJohn Marino static void 1746*e4b17023SJohn Marino _M_init_functor(_Any_data& __functor, reference_wrapper<_Functor> __f) 1747*e4b17023SJohn Marino { 1748*e4b17023SJohn Marino // TBD: Use address_of function instead. 1749*e4b17023SJohn Marino _Base::_M_init_functor(__functor, &__f.get()); 1750*e4b17023SJohn Marino } 1751*e4b17023SJohn Marino }; 1752*e4b17023SJohn Marino 1753*e4b17023SJohn Marino _Function_base() : _M_manager(0) { } 1754*e4b17023SJohn Marino 1755*e4b17023SJohn Marino ~_Function_base() 1756*e4b17023SJohn Marino { 1757*e4b17023SJohn Marino if (_M_manager) 1758*e4b17023SJohn Marino _M_manager(_M_functor, _M_functor, __destroy_functor); 1759*e4b17023SJohn Marino } 1760*e4b17023SJohn Marino 1761*e4b17023SJohn Marino 1762*e4b17023SJohn Marino bool _M_empty() const { return !_M_manager; } 1763*e4b17023SJohn Marino 1764*e4b17023SJohn Marino typedef bool (*_Manager_type)(_Any_data&, const _Any_data&, 1765*e4b17023SJohn Marino _Manager_operation); 1766*e4b17023SJohn Marino 1767*e4b17023SJohn Marino _Any_data _M_functor; 1768*e4b17023SJohn Marino _Manager_type _M_manager; 1769*e4b17023SJohn Marino }; 1770*e4b17023SJohn Marino 1771*e4b17023SJohn Marino template<typename _Signature, typename _Functor> 1772*e4b17023SJohn Marino class _Function_handler; 1773*e4b17023SJohn Marino 1774*e4b17023SJohn Marino template<typename _Res, typename _Functor, typename... _ArgTypes> 1775*e4b17023SJohn Marino class _Function_handler<_Res(_ArgTypes...), _Functor> 1776*e4b17023SJohn Marino : public _Function_base::_Base_manager<_Functor> 1777*e4b17023SJohn Marino { 1778*e4b17023SJohn Marino typedef _Function_base::_Base_manager<_Functor> _Base; 1779*e4b17023SJohn Marino 1780*e4b17023SJohn Marino public: 1781*e4b17023SJohn Marino static _Res 1782*e4b17023SJohn Marino _M_invoke(const _Any_data& __functor, _ArgTypes... __args) 1783*e4b17023SJohn Marino { 1784*e4b17023SJohn Marino return (*_Base::_M_get_pointer(__functor))(__args...); 1785*e4b17023SJohn Marino } 1786*e4b17023SJohn Marino }; 1787*e4b17023SJohn Marino 1788*e4b17023SJohn Marino template<typename _Functor, typename... _ArgTypes> 1789*e4b17023SJohn Marino class _Function_handler<void(_ArgTypes...), _Functor> 1790*e4b17023SJohn Marino : public _Function_base::_Base_manager<_Functor> 1791*e4b17023SJohn Marino { 1792*e4b17023SJohn Marino typedef _Function_base::_Base_manager<_Functor> _Base; 1793*e4b17023SJohn Marino 1794*e4b17023SJohn Marino public: 1795*e4b17023SJohn Marino static void 1796*e4b17023SJohn Marino _M_invoke(const _Any_data& __functor, _ArgTypes... __args) 1797*e4b17023SJohn Marino { 1798*e4b17023SJohn Marino (*_Base::_M_get_pointer(__functor))(__args...); 1799*e4b17023SJohn Marino } 1800*e4b17023SJohn Marino }; 1801*e4b17023SJohn Marino 1802*e4b17023SJohn Marino template<typename _Res, typename _Functor, typename... _ArgTypes> 1803*e4b17023SJohn Marino class _Function_handler<_Res(_ArgTypes...), reference_wrapper<_Functor> > 1804*e4b17023SJohn Marino : public _Function_base::_Ref_manager<_Functor> 1805*e4b17023SJohn Marino { 1806*e4b17023SJohn Marino typedef _Function_base::_Ref_manager<_Functor> _Base; 1807*e4b17023SJohn Marino 1808*e4b17023SJohn Marino public: 1809*e4b17023SJohn Marino static _Res 1810*e4b17023SJohn Marino _M_invoke(const _Any_data& __functor, _ArgTypes... __args) 1811*e4b17023SJohn Marino { 1812*e4b17023SJohn Marino return 1813*e4b17023SJohn Marino __callable_functor(**_Base::_M_get_pointer(__functor))(__args...); 1814*e4b17023SJohn Marino } 1815*e4b17023SJohn Marino }; 1816*e4b17023SJohn Marino 1817*e4b17023SJohn Marino template<typename _Functor, typename... _ArgTypes> 1818*e4b17023SJohn Marino class _Function_handler<void(_ArgTypes...), reference_wrapper<_Functor> > 1819*e4b17023SJohn Marino : public _Function_base::_Ref_manager<_Functor> 1820*e4b17023SJohn Marino { 1821*e4b17023SJohn Marino typedef _Function_base::_Ref_manager<_Functor> _Base; 1822*e4b17023SJohn Marino 1823*e4b17023SJohn Marino public: 1824*e4b17023SJohn Marino static void 1825*e4b17023SJohn Marino _M_invoke(const _Any_data& __functor, _ArgTypes... __args) 1826*e4b17023SJohn Marino { 1827*e4b17023SJohn Marino __callable_functor(**_Base::_M_get_pointer(__functor))(__args...); 1828*e4b17023SJohn Marino } 1829*e4b17023SJohn Marino }; 1830*e4b17023SJohn Marino 1831*e4b17023SJohn Marino template<typename _Class, typename _Member, typename _Res, 1832*e4b17023SJohn Marino typename... _ArgTypes> 1833*e4b17023SJohn Marino class _Function_handler<_Res(_ArgTypes...), _Member _Class::*> 1834*e4b17023SJohn Marino : public _Function_handler<void(_ArgTypes...), _Member _Class::*> 1835*e4b17023SJohn Marino { 1836*e4b17023SJohn Marino typedef _Function_handler<void(_ArgTypes...), _Member _Class::*> 1837*e4b17023SJohn Marino _Base; 1838*e4b17023SJohn Marino 1839*e4b17023SJohn Marino public: 1840*e4b17023SJohn Marino static _Res 1841*e4b17023SJohn Marino _M_invoke(const _Any_data& __functor, _ArgTypes... __args) 1842*e4b17023SJohn Marino { 1843*e4b17023SJohn Marino return tr1:: 1844*e4b17023SJohn Marino mem_fn(_Base::_M_get_pointer(__functor)->__value)(__args...); 1845*e4b17023SJohn Marino } 1846*e4b17023SJohn Marino }; 1847*e4b17023SJohn Marino 1848*e4b17023SJohn Marino template<typename _Class, typename _Member, typename... _ArgTypes> 1849*e4b17023SJohn Marino class _Function_handler<void(_ArgTypes...), _Member _Class::*> 1850*e4b17023SJohn Marino : public _Function_base::_Base_manager< 1851*e4b17023SJohn Marino _Simple_type_wrapper< _Member _Class::* > > 1852*e4b17023SJohn Marino { 1853*e4b17023SJohn Marino typedef _Member _Class::* _Functor; 1854*e4b17023SJohn Marino typedef _Simple_type_wrapper<_Functor> _Wrapper; 1855*e4b17023SJohn Marino typedef _Function_base::_Base_manager<_Wrapper> _Base; 1856*e4b17023SJohn Marino 1857*e4b17023SJohn Marino public: 1858*e4b17023SJohn Marino static bool 1859*e4b17023SJohn Marino _M_manager(_Any_data& __dest, const _Any_data& __source, 1860*e4b17023SJohn Marino _Manager_operation __op) 1861*e4b17023SJohn Marino { 1862*e4b17023SJohn Marino switch (__op) 1863*e4b17023SJohn Marino { 1864*e4b17023SJohn Marino#ifdef __GXX_RTTI 1865*e4b17023SJohn Marino case __get_type_info: 1866*e4b17023SJohn Marino __dest._M_access<const type_info*>() = &typeid(_Functor); 1867*e4b17023SJohn Marino break; 1868*e4b17023SJohn Marino#endif 1869*e4b17023SJohn Marino case __get_functor_ptr: 1870*e4b17023SJohn Marino __dest._M_access<_Functor*>() = 1871*e4b17023SJohn Marino &_Base::_M_get_pointer(__source)->__value; 1872*e4b17023SJohn Marino break; 1873*e4b17023SJohn Marino 1874*e4b17023SJohn Marino default: 1875*e4b17023SJohn Marino _Base::_M_manager(__dest, __source, __op); 1876*e4b17023SJohn Marino } 1877*e4b17023SJohn Marino return false; 1878*e4b17023SJohn Marino } 1879*e4b17023SJohn Marino 1880*e4b17023SJohn Marino static void 1881*e4b17023SJohn Marino _M_invoke(const _Any_data& __functor, _ArgTypes... __args) 1882*e4b17023SJohn Marino { 1883*e4b17023SJohn Marino tr1::mem_fn(_Base::_M_get_pointer(__functor)->__value)(__args...); 1884*e4b17023SJohn Marino } 1885*e4b17023SJohn Marino }; 1886*e4b17023SJohn Marino 1887*e4b17023SJohn Marino /// class function 1888*e4b17023SJohn Marino template<typename _Res, typename... _ArgTypes> 1889*e4b17023SJohn Marino class function<_Res(_ArgTypes...)> 1890*e4b17023SJohn Marino : public _Maybe_unary_or_binary_function<_Res, _ArgTypes...>, 1891*e4b17023SJohn Marino private _Function_base 1892*e4b17023SJohn Marino { 1893*e4b17023SJohn Marino#ifndef __GXX_EXPERIMENTAL_CXX0X__ 1894*e4b17023SJohn Marino /// This class is used to implement the safe_bool idiom. 1895*e4b17023SJohn Marino struct _Hidden_type 1896*e4b17023SJohn Marino { 1897*e4b17023SJohn Marino _Hidden_type* _M_bool; 1898*e4b17023SJohn Marino }; 1899*e4b17023SJohn Marino 1900*e4b17023SJohn Marino /// This typedef is used to implement the safe_bool idiom. 1901*e4b17023SJohn Marino typedef _Hidden_type* _Hidden_type::* _Safe_bool; 1902*e4b17023SJohn Marino#endif 1903*e4b17023SJohn Marino 1904*e4b17023SJohn Marino typedef _Res _Signature_type(_ArgTypes...); 1905*e4b17023SJohn Marino 1906*e4b17023SJohn Marino struct _Useless { }; 1907*e4b17023SJohn Marino 1908*e4b17023SJohn Marino public: 1909*e4b17023SJohn Marino typedef _Res result_type; 1910*e4b17023SJohn Marino 1911*e4b17023SJohn Marino // [3.7.2.1] construct/copy/destroy 1912*e4b17023SJohn Marino 1913*e4b17023SJohn Marino /** 1914*e4b17023SJohn Marino * @brief Default construct creates an empty function call wrapper. 1915*e4b17023SJohn Marino * @post @c !(bool)*this 1916*e4b17023SJohn Marino */ 1917*e4b17023SJohn Marino function() : _Function_base() { } 1918*e4b17023SJohn Marino 1919*e4b17023SJohn Marino /** 1920*e4b17023SJohn Marino * @brief Default construct creates an empty function call wrapper. 1921*e4b17023SJohn Marino * @post @c !(bool)*this 1922*e4b17023SJohn Marino */ 1923*e4b17023SJohn Marino function(_M_clear_type*) : _Function_base() { } 1924*e4b17023SJohn Marino 1925*e4b17023SJohn Marino /** 1926*e4b17023SJohn Marino * @brief %Function copy constructor. 1927*e4b17023SJohn Marino * @param x A %function object with identical call signature. 1928*e4b17023SJohn Marino * @post @c (bool)*this == (bool)x 1929*e4b17023SJohn Marino * 1930*e4b17023SJohn Marino * The newly-created %function contains a copy of the target of @a 1931*e4b17023SJohn Marino * x (if it has one). 1932*e4b17023SJohn Marino */ 1933*e4b17023SJohn Marino function(const function& __x); 1934*e4b17023SJohn Marino 1935*e4b17023SJohn Marino /** 1936*e4b17023SJohn Marino * @brief Builds a %function that targets a copy of the incoming 1937*e4b17023SJohn Marino * function object. 1938*e4b17023SJohn Marino * @param f A %function object that is callable with parameters of 1939*e4b17023SJohn Marino * type @c T1, @c T2, ..., @c TN and returns a value convertible 1940*e4b17023SJohn Marino * to @c Res. 1941*e4b17023SJohn Marino * 1942*e4b17023SJohn Marino * The newly-created %function object will target a copy of @a 1943*e4b17023SJohn Marino * f. If @a f is @c reference_wrapper<F>, then this function 1944*e4b17023SJohn Marino * object will contain a reference to the function object @c 1945*e4b17023SJohn Marino * f.get(). If @a f is a NULL function pointer or NULL 1946*e4b17023SJohn Marino * pointer-to-member, the newly-created object will be empty. 1947*e4b17023SJohn Marino * 1948*e4b17023SJohn Marino * If @a f is a non-NULL function pointer or an object of type @c 1949*e4b17023SJohn Marino * reference_wrapper<F>, this function will not throw. 1950*e4b17023SJohn Marino */ 1951*e4b17023SJohn Marino template<typename _Functor> 1952*e4b17023SJohn Marino function(_Functor __f, 1953*e4b17023SJohn Marino typename __gnu_cxx::__enable_if< 1954*e4b17023SJohn Marino !is_integral<_Functor>::value, _Useless>::__type 1955*e4b17023SJohn Marino = _Useless()); 1956*e4b17023SJohn Marino 1957*e4b17023SJohn Marino /** 1958*e4b17023SJohn Marino * @brief %Function assignment operator. 1959*e4b17023SJohn Marino * @param x A %function with identical call signature. 1960*e4b17023SJohn Marino * @post @c (bool)*this == (bool)x 1961*e4b17023SJohn Marino * @returns @c *this 1962*e4b17023SJohn Marino * 1963*e4b17023SJohn Marino * The target of @a x is copied to @c *this. If @a x has no 1964*e4b17023SJohn Marino * target, then @c *this will be empty. 1965*e4b17023SJohn Marino * 1966*e4b17023SJohn Marino * If @a x targets a function pointer or a reference to a function 1967*e4b17023SJohn Marino * object, then this operation will not throw an %exception. 1968*e4b17023SJohn Marino */ 1969*e4b17023SJohn Marino function& 1970*e4b17023SJohn Marino operator=(const function& __x) 1971*e4b17023SJohn Marino { 1972*e4b17023SJohn Marino function(__x).swap(*this); 1973*e4b17023SJohn Marino return *this; 1974*e4b17023SJohn Marino } 1975*e4b17023SJohn Marino 1976*e4b17023SJohn Marino /** 1977*e4b17023SJohn Marino * @brief %Function assignment to zero. 1978*e4b17023SJohn Marino * @post @c !(bool)*this 1979*e4b17023SJohn Marino * @returns @c *this 1980*e4b17023SJohn Marino * 1981*e4b17023SJohn Marino * The target of @c *this is deallocated, leaving it empty. 1982*e4b17023SJohn Marino */ 1983*e4b17023SJohn Marino function& 1984*e4b17023SJohn Marino operator=(_M_clear_type*) 1985*e4b17023SJohn Marino { 1986*e4b17023SJohn Marino if (_M_manager) 1987*e4b17023SJohn Marino { 1988*e4b17023SJohn Marino _M_manager(_M_functor, _M_functor, __destroy_functor); 1989*e4b17023SJohn Marino _M_manager = 0; 1990*e4b17023SJohn Marino _M_invoker = 0; 1991*e4b17023SJohn Marino } 1992*e4b17023SJohn Marino return *this; 1993*e4b17023SJohn Marino } 1994*e4b17023SJohn Marino 1995*e4b17023SJohn Marino /** 1996*e4b17023SJohn Marino * @brief %Function assignment to a new target. 1997*e4b17023SJohn Marino * @param f A %function object that is callable with parameters of 1998*e4b17023SJohn Marino * type @c T1, @c T2, ..., @c TN and returns a value convertible 1999*e4b17023SJohn Marino * to @c Res. 2000*e4b17023SJohn Marino * @return @c *this 2001*e4b17023SJohn Marino * 2002*e4b17023SJohn Marino * This %function object wrapper will target a copy of @a 2003*e4b17023SJohn Marino * f. If @a f is @c reference_wrapper<F>, then this function 2004*e4b17023SJohn Marino * object will contain a reference to the function object @c 2005*e4b17023SJohn Marino * f.get(). If @a f is a NULL function pointer or NULL 2006*e4b17023SJohn Marino * pointer-to-member, @c this object will be empty. 2007*e4b17023SJohn Marino * 2008*e4b17023SJohn Marino * If @a f is a non-NULL function pointer or an object of type @c 2009*e4b17023SJohn Marino * reference_wrapper<F>, this function will not throw. 2010*e4b17023SJohn Marino */ 2011*e4b17023SJohn Marino template<typename _Functor> 2012*e4b17023SJohn Marino typename __gnu_cxx::__enable_if<!is_integral<_Functor>::value, 2013*e4b17023SJohn Marino function&>::__type 2014*e4b17023SJohn Marino operator=(_Functor __f) 2015*e4b17023SJohn Marino { 2016*e4b17023SJohn Marino function(__f).swap(*this); 2017*e4b17023SJohn Marino return *this; 2018*e4b17023SJohn Marino } 2019*e4b17023SJohn Marino 2020*e4b17023SJohn Marino // [3.7.2.2] function modifiers 2021*e4b17023SJohn Marino 2022*e4b17023SJohn Marino /** 2023*e4b17023SJohn Marino * @brief Swap the targets of two %function objects. 2024*e4b17023SJohn Marino * @param f A %function with identical call signature. 2025*e4b17023SJohn Marino * 2026*e4b17023SJohn Marino * Swap the targets of @c this function object and @a f. This 2027*e4b17023SJohn Marino * function will not throw an %exception. 2028*e4b17023SJohn Marino */ 2029*e4b17023SJohn Marino void swap(function& __x) 2030*e4b17023SJohn Marino { 2031*e4b17023SJohn Marino std::swap(_M_functor, __x._M_functor); 2032*e4b17023SJohn Marino std::swap(_M_manager, __x._M_manager); 2033*e4b17023SJohn Marino std::swap(_M_invoker, __x._M_invoker); 2034*e4b17023SJohn Marino } 2035*e4b17023SJohn Marino 2036*e4b17023SJohn Marino // [3.7.2.3] function capacity 2037*e4b17023SJohn Marino 2038*e4b17023SJohn Marino /** 2039*e4b17023SJohn Marino * @brief Determine if the %function wrapper has a target. 2040*e4b17023SJohn Marino * 2041*e4b17023SJohn Marino * @return @c true when this %function object contains a target, 2042*e4b17023SJohn Marino * or @c false when it is empty. 2043*e4b17023SJohn Marino * 2044*e4b17023SJohn Marino * This function will not throw an %exception. 2045*e4b17023SJohn Marino */ 2046*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__ 2047*e4b17023SJohn Marino explicit operator bool() const 2048*e4b17023SJohn Marino { return !_M_empty(); } 2049*e4b17023SJohn Marino#else 2050*e4b17023SJohn Marino operator _Safe_bool() const 2051*e4b17023SJohn Marino { 2052*e4b17023SJohn Marino if (_M_empty()) 2053*e4b17023SJohn Marino return 0; 2054*e4b17023SJohn Marino else 2055*e4b17023SJohn Marino return &_Hidden_type::_M_bool; 2056*e4b17023SJohn Marino } 2057*e4b17023SJohn Marino#endif 2058*e4b17023SJohn Marino 2059*e4b17023SJohn Marino // [3.7.2.4] function invocation 2060*e4b17023SJohn Marino 2061*e4b17023SJohn Marino /** 2062*e4b17023SJohn Marino * @brief Invokes the function targeted by @c *this. 2063*e4b17023SJohn Marino * @returns the result of the target. 2064*e4b17023SJohn Marino * @throws bad_function_call when @c !(bool)*this 2065*e4b17023SJohn Marino * 2066*e4b17023SJohn Marino * The function call operator invokes the target function object 2067*e4b17023SJohn Marino * stored by @c this. 2068*e4b17023SJohn Marino */ 2069*e4b17023SJohn Marino _Res operator()(_ArgTypes... __args) const; 2070*e4b17023SJohn Marino 2071*e4b17023SJohn Marino#ifdef __GXX_RTTI 2072*e4b17023SJohn Marino // [3.7.2.5] function target access 2073*e4b17023SJohn Marino /** 2074*e4b17023SJohn Marino * @brief Determine the type of the target of this function object 2075*e4b17023SJohn Marino * wrapper. 2076*e4b17023SJohn Marino * 2077*e4b17023SJohn Marino * @returns the type identifier of the target function object, or 2078*e4b17023SJohn Marino * @c typeid(void) if @c !(bool)*this. 2079*e4b17023SJohn Marino * 2080*e4b17023SJohn Marino * This function will not throw an %exception. 2081*e4b17023SJohn Marino */ 2082*e4b17023SJohn Marino const type_info& target_type() const; 2083*e4b17023SJohn Marino 2084*e4b17023SJohn Marino /** 2085*e4b17023SJohn Marino * @brief Access the stored target function object. 2086*e4b17023SJohn Marino * 2087*e4b17023SJohn Marino * @return Returns a pointer to the stored target function object, 2088*e4b17023SJohn Marino * if @c typeid(Functor).equals(target_type()); otherwise, a NULL 2089*e4b17023SJohn Marino * pointer. 2090*e4b17023SJohn Marino * 2091*e4b17023SJohn Marino * This function will not throw an %exception. 2092*e4b17023SJohn Marino */ 2093*e4b17023SJohn Marino template<typename _Functor> _Functor* target(); 2094*e4b17023SJohn Marino 2095*e4b17023SJohn Marino /// @overload 2096*e4b17023SJohn Marino template<typename _Functor> const _Functor* target() const; 2097*e4b17023SJohn Marino#endif 2098*e4b17023SJohn Marino 2099*e4b17023SJohn Marino private: 2100*e4b17023SJohn Marino // [3.7.2.6] undefined operators 2101*e4b17023SJohn Marino template<typename _Function> 2102*e4b17023SJohn Marino void operator==(const function<_Function>&) const; 2103*e4b17023SJohn Marino template<typename _Function> 2104*e4b17023SJohn Marino void operator!=(const function<_Function>&) const; 2105*e4b17023SJohn Marino 2106*e4b17023SJohn Marino typedef _Res (*_Invoker_type)(const _Any_data&, _ArgTypes...); 2107*e4b17023SJohn Marino _Invoker_type _M_invoker; 2108*e4b17023SJohn Marino }; 2109*e4b17023SJohn Marino 2110*e4b17023SJohn Marino template<typename _Res, typename... _ArgTypes> 2111*e4b17023SJohn Marino function<_Res(_ArgTypes...)>:: 2112*e4b17023SJohn Marino function(const function& __x) 2113*e4b17023SJohn Marino : _Function_base() 2114*e4b17023SJohn Marino { 2115*e4b17023SJohn Marino if (static_cast<bool>(__x)) 2116*e4b17023SJohn Marino { 2117*e4b17023SJohn Marino _M_invoker = __x._M_invoker; 2118*e4b17023SJohn Marino _M_manager = __x._M_manager; 2119*e4b17023SJohn Marino __x._M_manager(_M_functor, __x._M_functor, __clone_functor); 2120*e4b17023SJohn Marino } 2121*e4b17023SJohn Marino } 2122*e4b17023SJohn Marino 2123*e4b17023SJohn Marino template<typename _Res, typename... _ArgTypes> 2124*e4b17023SJohn Marino template<typename _Functor> 2125*e4b17023SJohn Marino function<_Res(_ArgTypes...)>:: 2126*e4b17023SJohn Marino function(_Functor __f, 2127*e4b17023SJohn Marino typename __gnu_cxx::__enable_if< 2128*e4b17023SJohn Marino !is_integral<_Functor>::value, _Useless>::__type) 2129*e4b17023SJohn Marino : _Function_base() 2130*e4b17023SJohn Marino { 2131*e4b17023SJohn Marino typedef _Function_handler<_Signature_type, _Functor> _My_handler; 2132*e4b17023SJohn Marino 2133*e4b17023SJohn Marino if (_My_handler::_M_not_empty_function(__f)) 2134*e4b17023SJohn Marino { 2135*e4b17023SJohn Marino _M_invoker = &_My_handler::_M_invoke; 2136*e4b17023SJohn Marino _M_manager = &_My_handler::_M_manager; 2137*e4b17023SJohn Marino _My_handler::_M_init_functor(_M_functor, __f); 2138*e4b17023SJohn Marino } 2139*e4b17023SJohn Marino } 2140*e4b17023SJohn Marino 2141*e4b17023SJohn Marino template<typename _Res, typename... _ArgTypes> 2142*e4b17023SJohn Marino _Res 2143*e4b17023SJohn Marino function<_Res(_ArgTypes...)>:: 2144*e4b17023SJohn Marino operator()(_ArgTypes... __args) const 2145*e4b17023SJohn Marino { 2146*e4b17023SJohn Marino if (_M_empty()) 2147*e4b17023SJohn Marino { 2148*e4b17023SJohn Marino#if __EXCEPTIONS 2149*e4b17023SJohn Marino throw bad_function_call(); 2150*e4b17023SJohn Marino#else 2151*e4b17023SJohn Marino __builtin_abort(); 2152*e4b17023SJohn Marino#endif 2153*e4b17023SJohn Marino } 2154*e4b17023SJohn Marino return _M_invoker(_M_functor, __args...); 2155*e4b17023SJohn Marino } 2156*e4b17023SJohn Marino 2157*e4b17023SJohn Marino#ifdef __GXX_RTTI 2158*e4b17023SJohn Marino template<typename _Res, typename... _ArgTypes> 2159*e4b17023SJohn Marino const type_info& 2160*e4b17023SJohn Marino function<_Res(_ArgTypes...)>:: 2161*e4b17023SJohn Marino target_type() const 2162*e4b17023SJohn Marino { 2163*e4b17023SJohn Marino if (_M_manager) 2164*e4b17023SJohn Marino { 2165*e4b17023SJohn Marino _Any_data __typeinfo_result; 2166*e4b17023SJohn Marino _M_manager(__typeinfo_result, _M_functor, __get_type_info); 2167*e4b17023SJohn Marino return *__typeinfo_result._M_access<const type_info*>(); 2168*e4b17023SJohn Marino } 2169*e4b17023SJohn Marino else 2170*e4b17023SJohn Marino return typeid(void); 2171*e4b17023SJohn Marino } 2172*e4b17023SJohn Marino 2173*e4b17023SJohn Marino template<typename _Res, typename... _ArgTypes> 2174*e4b17023SJohn Marino template<typename _Functor> 2175*e4b17023SJohn Marino _Functor* 2176*e4b17023SJohn Marino function<_Res(_ArgTypes...)>:: 2177*e4b17023SJohn Marino target() 2178*e4b17023SJohn Marino { 2179*e4b17023SJohn Marino if (typeid(_Functor) == target_type() && _M_manager) 2180*e4b17023SJohn Marino { 2181*e4b17023SJohn Marino _Any_data __ptr; 2182*e4b17023SJohn Marino if (_M_manager(__ptr, _M_functor, __get_functor_ptr) 2183*e4b17023SJohn Marino && !is_const<_Functor>::value) 2184*e4b17023SJohn Marino return 0; 2185*e4b17023SJohn Marino else 2186*e4b17023SJohn Marino return __ptr._M_access<_Functor*>(); 2187*e4b17023SJohn Marino } 2188*e4b17023SJohn Marino else 2189*e4b17023SJohn Marino return 0; 2190*e4b17023SJohn Marino } 2191*e4b17023SJohn Marino 2192*e4b17023SJohn Marino template<typename _Res, typename... _ArgTypes> 2193*e4b17023SJohn Marino template<typename _Functor> 2194*e4b17023SJohn Marino const _Functor* 2195*e4b17023SJohn Marino function<_Res(_ArgTypes...)>:: 2196*e4b17023SJohn Marino target() const 2197*e4b17023SJohn Marino { 2198*e4b17023SJohn Marino if (typeid(_Functor) == target_type() && _M_manager) 2199*e4b17023SJohn Marino { 2200*e4b17023SJohn Marino _Any_data __ptr; 2201*e4b17023SJohn Marino _M_manager(__ptr, _M_functor, __get_functor_ptr); 2202*e4b17023SJohn Marino return __ptr._M_access<const _Functor*>(); 2203*e4b17023SJohn Marino } 2204*e4b17023SJohn Marino else 2205*e4b17023SJohn Marino return 0; 2206*e4b17023SJohn Marino } 2207*e4b17023SJohn Marino#endif 2208*e4b17023SJohn Marino 2209*e4b17023SJohn Marino // [3.7.2.7] null pointer comparisons 2210*e4b17023SJohn Marino 2211*e4b17023SJohn Marino /** 2212*e4b17023SJohn Marino * @brief Compares a polymorphic function object wrapper against 0 2213*e4b17023SJohn Marino * (the NULL pointer). 2214*e4b17023SJohn Marino * @returns @c true if the wrapper has no target, @c false otherwise 2215*e4b17023SJohn Marino * 2216*e4b17023SJohn Marino * This function will not throw an %exception. 2217*e4b17023SJohn Marino */ 2218*e4b17023SJohn Marino template<typename _Signature> 2219*e4b17023SJohn Marino inline bool 2220*e4b17023SJohn Marino operator==(const function<_Signature>& __f, _M_clear_type*) 2221*e4b17023SJohn Marino { return !static_cast<bool>(__f); } 2222*e4b17023SJohn Marino 2223*e4b17023SJohn Marino /// @overload 2224*e4b17023SJohn Marino template<typename _Signature> 2225*e4b17023SJohn Marino inline bool 2226*e4b17023SJohn Marino operator==(_M_clear_type*, const function<_Signature>& __f) 2227*e4b17023SJohn Marino { return !static_cast<bool>(__f); } 2228*e4b17023SJohn Marino 2229*e4b17023SJohn Marino /** 2230*e4b17023SJohn Marino * @brief Compares a polymorphic function object wrapper against 0 2231*e4b17023SJohn Marino * (the NULL pointer). 2232*e4b17023SJohn Marino * @returns @c false if the wrapper has no target, @c true otherwise 2233*e4b17023SJohn Marino * 2234*e4b17023SJohn Marino * This function will not throw an %exception. 2235*e4b17023SJohn Marino */ 2236*e4b17023SJohn Marino template<typename _Signature> 2237*e4b17023SJohn Marino inline bool 2238*e4b17023SJohn Marino operator!=(const function<_Signature>& __f, _M_clear_type*) 2239*e4b17023SJohn Marino { return static_cast<bool>(__f); } 2240*e4b17023SJohn Marino 2241*e4b17023SJohn Marino /// @overload 2242*e4b17023SJohn Marino template<typename _Signature> 2243*e4b17023SJohn Marino inline bool 2244*e4b17023SJohn Marino operator!=(_M_clear_type*, const function<_Signature>& __f) 2245*e4b17023SJohn Marino { return static_cast<bool>(__f); } 2246*e4b17023SJohn Marino 2247*e4b17023SJohn Marino // [3.7.2.8] specialized algorithms 2248*e4b17023SJohn Marino 2249*e4b17023SJohn Marino /** 2250*e4b17023SJohn Marino * @brief Swap the targets of two polymorphic function object wrappers. 2251*e4b17023SJohn Marino * 2252*e4b17023SJohn Marino * This function will not throw an %exception. 2253*e4b17023SJohn Marino */ 2254*e4b17023SJohn Marino template<typename _Signature> 2255*e4b17023SJohn Marino inline void 2256*e4b17023SJohn Marino swap(function<_Signature>& __x, function<_Signature>& __y) 2257*e4b17023SJohn Marino { __x.swap(__y); } 2258*e4b17023SJohn Marino 2259*e4b17023SJohn Marino_GLIBCXX_END_NAMESPACE_VERSION 2260*e4b17023SJohn Marino} 2261*e4b17023SJohn Marino 2262*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__ 2263*e4b17023SJohn Marino_GLIBCXX_BEGIN_NAMESPACE_VERSION 2264*e4b17023SJohn Marino 2265*e4b17023SJohn Marino template<typename> struct is_placeholder; 2266*e4b17023SJohn Marino 2267*e4b17023SJohn Marino template<int _Num> 2268*e4b17023SJohn Marino struct is_placeholder<tr1::_Placeholder<_Num>> 2269*e4b17023SJohn Marino : integral_constant<int, _Num> 2270*e4b17023SJohn Marino { }; 2271*e4b17023SJohn Marino 2272*e4b17023SJohn Marino template<int _Num> 2273*e4b17023SJohn Marino struct is_placeholder<const tr1::_Placeholder<_Num>> 2274*e4b17023SJohn Marino : integral_constant<int, _Num> 2275*e4b17023SJohn Marino { }; 2276*e4b17023SJohn Marino 2277*e4b17023SJohn Marino template<typename> struct is_bind_expression; 2278*e4b17023SJohn Marino 2279*e4b17023SJohn Marino template<typename _Signature> 2280*e4b17023SJohn Marino struct is_bind_expression<tr1::_Bind<_Signature>> 2281*e4b17023SJohn Marino : true_type { }; 2282*e4b17023SJohn Marino 2283*e4b17023SJohn Marino template<typename _Signature> 2284*e4b17023SJohn Marino struct is_bind_expression<const tr1::_Bind<_Signature>> 2285*e4b17023SJohn Marino : true_type { }; 2286*e4b17023SJohn Marino 2287*e4b17023SJohn Marino template<typename _Signature> 2288*e4b17023SJohn Marino struct is_bind_expression<volatile tr1::_Bind<_Signature>> 2289*e4b17023SJohn Marino : true_type { }; 2290*e4b17023SJohn Marino 2291*e4b17023SJohn Marino template<typename _Signature> 2292*e4b17023SJohn Marino struct is_bind_expression<const volatile tr1::_Bind<_Signature>> 2293*e4b17023SJohn Marino : true_type { }; 2294*e4b17023SJohn Marino 2295*e4b17023SJohn Marino template<typename _Result, typename _Signature> 2296*e4b17023SJohn Marino struct is_bind_expression<tr1::_Bind_result<_Result, _Signature>> 2297*e4b17023SJohn Marino : true_type { }; 2298*e4b17023SJohn Marino 2299*e4b17023SJohn Marino template<typename _Result, typename _Signature> 2300*e4b17023SJohn Marino struct is_bind_expression<const tr1::_Bind_result<_Result, _Signature>> 2301*e4b17023SJohn Marino : true_type { }; 2302*e4b17023SJohn Marino 2303*e4b17023SJohn Marino template<typename _Result, typename _Signature> 2304*e4b17023SJohn Marino struct is_bind_expression<volatile tr1::_Bind_result<_Result, _Signature>> 2305*e4b17023SJohn Marino : true_type { }; 2306*e4b17023SJohn Marino 2307*e4b17023SJohn Marino template<typename _Result, typename _Signature> 2308*e4b17023SJohn Marino struct is_bind_expression<const volatile tr1::_Bind_result<_Result, 2309*e4b17023SJohn Marino _Signature>> 2310*e4b17023SJohn Marino : true_type { }; 2311*e4b17023SJohn Marino 2312*e4b17023SJohn Marino_GLIBCXX_END_NAMESPACE_VERSION 2313*e4b17023SJohn Marino#endif 2314*e4b17023SJohn Marino} 2315*e4b17023SJohn Marino 2316*e4b17023SJohn Marino#endif // _GLIBCXX_TR1_FUNCTIONAL 2317