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