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