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