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