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