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