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