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