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