1 // -*- C++ -*- 2 //===----------------------------------------------------------------------===// 3 // 4 // The LLVM Compiler Infrastructure 5 // 6 // This file is dual licensed under the MIT and the University of Illinois Open 7 // Source Licenses. See LICENSE.TXT for details. 8 // 9 //===----------------------------------------------------------------------===// 10 11 #ifndef _LIBCPP_FUNCTIONAL_BASE 12 #define _LIBCPP_FUNCTIONAL_BASE 13 14 #include <__config> 15 #include <type_traits> 16 #include <typeinfo> 17 #include <exception> 18 #include <new> 19 20 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 21 #pragma GCC system_header 22 #endif 23 24 _LIBCPP_BEGIN_NAMESPACE_STD 25 26 template <class _Arg, class _Result> 27 struct _LIBCPP_TYPE_VIS_ONLY unary_function 28 { 29 typedef _Arg argument_type; 30 typedef _Result result_type; 31 }; 32 33 template <class _Arg1, class _Arg2, class _Result> 34 struct _LIBCPP_TYPE_VIS_ONLY binary_function 35 { 36 typedef _Arg1 first_argument_type; 37 typedef _Arg2 second_argument_type; 38 typedef _Result result_type; 39 }; 40 41 template <class _Tp> struct _LIBCPP_TYPE_VIS_ONLY hash; 42 43 template <class _Tp> 44 struct __has_result_type 45 { 46 private: 47 struct __two {char __lx; char __lxx;}; 48 template <class _Up> static __two __test(...); 49 template <class _Up> static char __test(typename _Up::result_type* = 0); 50 public: 51 static const bool value = sizeof(__test<_Tp>(0)) == 1; 52 }; 53 54 #if _LIBCPP_STD_VER > 11 55 template <class _Tp = void> 56 #else 57 template <class _Tp> 58 #endif 59 struct _LIBCPP_TYPE_VIS_ONLY less : binary_function<_Tp, _Tp, bool> 60 { 61 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 62 bool operator()(const _Tp& __x, const _Tp& __y) const 63 {return __x < __y;} 64 }; 65 66 #if _LIBCPP_STD_VER > 11 67 template <> 68 struct _LIBCPP_TYPE_VIS_ONLY less<void> 69 { 70 template <class _T1, class _T2> 71 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 72 auto operator()(_T1&& __t, _T2&& __u) const 73 { return _VSTD::forward<_T1>(__t) < _VSTD::forward<_T2>(__u); } 74 typedef void is_transparent; 75 }; 76 #endif 77 78 // addressof 79 80 template <class _Tp> 81 inline _LIBCPP_INLINE_VISIBILITY 82 _Tp* 83 addressof(_Tp& __x) _NOEXCEPT 84 { 85 return (_Tp*)&reinterpret_cast<const volatile char&>(__x); 86 } 87 88 #if defined(_LIBCPP_HAS_OBJC_ARC) && !defined(_LIBCPP_PREDEFINED_OBJC_ARC_ADDRESSOF) 89 // Objective-C++ Automatic Reference Counting uses qualified pointers 90 // that require special addressof() signatures. When 91 // _LIBCPP_PREDEFINED_OBJC_ARC_ADDRESSOF is defined, the compiler 92 // itself is providing these definitions. Otherwise, we provide them. 93 template <class _Tp> 94 inline _LIBCPP_INLINE_VISIBILITY 95 __strong _Tp* 96 addressof(__strong _Tp& __x) _NOEXCEPT 97 { 98 return &__x; 99 } 100 101 #ifdef _LIBCPP_HAS_OBJC_ARC_WEAK 102 template <class _Tp> 103 inline _LIBCPP_INLINE_VISIBILITY 104 __weak _Tp* 105 addressof(__weak _Tp& __x) _NOEXCEPT 106 { 107 return &__x; 108 } 109 #endif 110 111 template <class _Tp> 112 inline _LIBCPP_INLINE_VISIBILITY 113 __autoreleasing _Tp* 114 addressof(__autoreleasing _Tp& __x) _NOEXCEPT 115 { 116 return &__x; 117 } 118 119 template <class _Tp> 120 inline _LIBCPP_INLINE_VISIBILITY 121 __unsafe_unretained _Tp* 122 addressof(__unsafe_unretained _Tp& __x) _NOEXCEPT 123 { 124 return &__x; 125 } 126 #endif 127 128 #ifdef _LIBCPP_HAS_NO_VARIADICS 129 130 #include <__functional_base_03> 131 132 #else // _LIBCPP_HAS_NO_VARIADICS 133 134 // __weak_result_type 135 136 template <class _Tp> 137 struct __derives_from_unary_function 138 { 139 private: 140 struct __two {char __lx; char __lxx;}; 141 static __two __test(...); 142 template <class _Ap, class _Rp> 143 static unary_function<_Ap, _Rp> 144 __test(const volatile unary_function<_Ap, _Rp>*); 145 public: 146 static const bool value = !is_same<decltype(__test((_Tp*)0)), __two>::value; 147 typedef decltype(__test((_Tp*)0)) type; 148 }; 149 150 template <class _Tp> 151 struct __derives_from_binary_function 152 { 153 private: 154 struct __two {char __lx; char __lxx;}; 155 static __two __test(...); 156 template <class _A1, class _A2, class _Rp> 157 static binary_function<_A1, _A2, _Rp> 158 __test(const volatile binary_function<_A1, _A2, _Rp>*); 159 public: 160 static const bool value = !is_same<decltype(__test((_Tp*)0)), __two>::value; 161 typedef decltype(__test((_Tp*)0)) type; 162 }; 163 164 template <class _Tp, bool = __derives_from_unary_function<_Tp>::value> 165 struct __maybe_derive_from_unary_function // bool is true 166 : public __derives_from_unary_function<_Tp>::type 167 { 168 }; 169 170 template <class _Tp> 171 struct __maybe_derive_from_unary_function<_Tp, false> 172 { 173 }; 174 175 template <class _Tp, bool = __derives_from_binary_function<_Tp>::value> 176 struct __maybe_derive_from_binary_function // bool is true 177 : public __derives_from_binary_function<_Tp>::type 178 { 179 }; 180 181 template <class _Tp> 182 struct __maybe_derive_from_binary_function<_Tp, false> 183 { 184 }; 185 186 template <class _Tp, bool = __has_result_type<_Tp>::value> 187 struct __weak_result_type_imp // bool is true 188 : public __maybe_derive_from_unary_function<_Tp>, 189 public __maybe_derive_from_binary_function<_Tp> 190 { 191 typedef typename _Tp::result_type result_type; 192 }; 193 194 template <class _Tp> 195 struct __weak_result_type_imp<_Tp, false> 196 : public __maybe_derive_from_unary_function<_Tp>, 197 public __maybe_derive_from_binary_function<_Tp> 198 { 199 }; 200 201 template <class _Tp> 202 struct __weak_result_type 203 : public __weak_result_type_imp<_Tp> 204 { 205 }; 206 207 // 0 argument case 208 209 template <class _Rp> 210 struct __weak_result_type<_Rp ()> 211 { 212 typedef _Rp result_type; 213 }; 214 215 template <class _Rp> 216 struct __weak_result_type<_Rp (&)()> 217 { 218 typedef _Rp result_type; 219 }; 220 221 template <class _Rp> 222 struct __weak_result_type<_Rp (*)()> 223 { 224 typedef _Rp result_type; 225 }; 226 227 // 1 argument case 228 229 template <class _Rp, class _A1> 230 struct __weak_result_type<_Rp (_A1)> 231 : public unary_function<_A1, _Rp> 232 { 233 }; 234 235 template <class _Rp, class _A1> 236 struct __weak_result_type<_Rp (&)(_A1)> 237 : public unary_function<_A1, _Rp> 238 { 239 }; 240 241 template <class _Rp, class _A1> 242 struct __weak_result_type<_Rp (*)(_A1)> 243 : public unary_function<_A1, _Rp> 244 { 245 }; 246 247 template <class _Rp, class _Cp> 248 struct __weak_result_type<_Rp (_Cp::*)()> 249 : public unary_function<_Cp*, _Rp> 250 { 251 }; 252 253 template <class _Rp, class _Cp> 254 struct __weak_result_type<_Rp (_Cp::*)() const> 255 : public unary_function<const _Cp*, _Rp> 256 { 257 }; 258 259 template <class _Rp, class _Cp> 260 struct __weak_result_type<_Rp (_Cp::*)() volatile> 261 : public unary_function<volatile _Cp*, _Rp> 262 { 263 }; 264 265 template <class _Rp, class _Cp> 266 struct __weak_result_type<_Rp (_Cp::*)() const volatile> 267 : public unary_function<const volatile _Cp*, _Rp> 268 { 269 }; 270 271 // 2 argument case 272 273 template <class _Rp, class _A1, class _A2> 274 struct __weak_result_type<_Rp (_A1, _A2)> 275 : public binary_function<_A1, _A2, _Rp> 276 { 277 }; 278 279 template <class _Rp, class _A1, class _A2> 280 struct __weak_result_type<_Rp (*)(_A1, _A2)> 281 : public binary_function<_A1, _A2, _Rp> 282 { 283 }; 284 285 template <class _Rp, class _A1, class _A2> 286 struct __weak_result_type<_Rp (&)(_A1, _A2)> 287 : public binary_function<_A1, _A2, _Rp> 288 { 289 }; 290 291 template <class _Rp, class _Cp, class _A1> 292 struct __weak_result_type<_Rp (_Cp::*)(_A1)> 293 : public binary_function<_Cp*, _A1, _Rp> 294 { 295 }; 296 297 template <class _Rp, class _Cp, class _A1> 298 struct __weak_result_type<_Rp (_Cp::*)(_A1) const> 299 : public binary_function<const _Cp*, _A1, _Rp> 300 { 301 }; 302 303 template <class _Rp, class _Cp, class _A1> 304 struct __weak_result_type<_Rp (_Cp::*)(_A1) volatile> 305 : public binary_function<volatile _Cp*, _A1, _Rp> 306 { 307 }; 308 309 template <class _Rp, class _Cp, class _A1> 310 struct __weak_result_type<_Rp (_Cp::*)(_A1) const volatile> 311 : public binary_function<const volatile _Cp*, _A1, _Rp> 312 { 313 }; 314 315 // 3 or more arguments 316 317 template <class _Rp, class _A1, class _A2, class _A3, class ..._A4> 318 struct __weak_result_type<_Rp (_A1, _A2, _A3, _A4...)> 319 { 320 typedef _Rp result_type; 321 }; 322 323 template <class _Rp, class _A1, class _A2, class _A3, class ..._A4> 324 struct __weak_result_type<_Rp (&)(_A1, _A2, _A3, _A4...)> 325 { 326 typedef _Rp result_type; 327 }; 328 329 template <class _Rp, class _A1, class _A2, class _A3, class ..._A4> 330 struct __weak_result_type<_Rp (*)(_A1, _A2, _A3, _A4...)> 331 { 332 typedef _Rp result_type; 333 }; 334 335 template <class _Rp, class _Cp, class _A1, class _A2, class ..._A3> 336 struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...)> 337 { 338 typedef _Rp result_type; 339 }; 340 341 template <class _Rp, class _Cp, class _A1, class _A2, class ..._A3> 342 struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...) const> 343 { 344 typedef _Rp result_type; 345 }; 346 347 template <class _Rp, class _Cp, class _A1, class _A2, class ..._A3> 348 struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...) volatile> 349 { 350 typedef _Rp result_type; 351 }; 352 353 template <class _Rp, class _Cp, class _A1, class _A2, class ..._A3> 354 struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...) const volatile> 355 { 356 typedef _Rp result_type; 357 }; 358 359 // __invoke 360 361 // bullets 1 and 2 362 363 template <class _Fp, class _A0, class ..._Args, 364 class> 365 inline _LIBCPP_INLINE_VISIBILITY 366 auto 367 __invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args) 368 -> decltype((_VSTD::forward<_A0>(__a0).*__f)(_VSTD::forward<_Args>(__args)...)) 369 { 370 return (_VSTD::forward<_A0>(__a0).*__f)(_VSTD::forward<_Args>(__args)...); 371 } 372 373 template <class _Fp, class _A0, class ..._Args, 374 class> 375 inline _LIBCPP_INLINE_VISIBILITY 376 auto 377 __invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args) 378 -> decltype(((*_VSTD::forward<_A0>(__a0)).*__f)(_VSTD::forward<_Args>(__args)...)) 379 { 380 return ((*_VSTD::forward<_A0>(__a0)).*__f)(_VSTD::forward<_Args>(__args)...); 381 } 382 383 // bullets 3 and 4 384 385 template <class _Fp, class _A0, 386 class> 387 inline _LIBCPP_INLINE_VISIBILITY 388 auto 389 __invoke(_Fp&& __f, _A0&& __a0) 390 -> decltype(_VSTD::forward<_A0>(__a0).*__f) 391 { 392 return _VSTD::forward<_A0>(__a0).*__f; 393 } 394 395 template <class _Fp, class _A0, 396 class> 397 inline _LIBCPP_INLINE_VISIBILITY 398 auto 399 __invoke(_Fp&& __f, _A0&& __a0) 400 -> decltype((*_VSTD::forward<_A0>(__a0)).*__f) 401 { 402 return (*_VSTD::forward<_A0>(__a0)).*__f; 403 } 404 405 // bullet 5 406 407 template <class _Fp, class ..._Args> 408 inline _LIBCPP_INLINE_VISIBILITY 409 auto 410 __invoke(_Fp&& __f, _Args&& ...__args) 411 -> decltype(_VSTD::forward<_Fp>(__f)(_VSTD::forward<_Args>(__args)...)) 412 { 413 return _VSTD::forward<_Fp>(__f)(_VSTD::forward<_Args>(__args)...); 414 } 415 416 template <class _Tp, class ..._Args> 417 struct __invoke_return 418 { 419 typedef decltype(__invoke(_VSTD::declval<_Tp>(), _VSTD::declval<_Args>()...)) type; 420 }; 421 422 template <class _Tp> 423 class _LIBCPP_TYPE_VIS_ONLY reference_wrapper 424 : public __weak_result_type<_Tp> 425 { 426 public: 427 // types 428 typedef _Tp type; 429 private: 430 type* __f_; 431 432 public: 433 // construct/copy/destroy 434 _LIBCPP_INLINE_VISIBILITY reference_wrapper(type& __f) _NOEXCEPT 435 : __f_(_VSTD::addressof(__f)) {} 436 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 437 private: reference_wrapper(type&&); public: // = delete; // do not bind to temps 438 #endif 439 440 // access 441 _LIBCPP_INLINE_VISIBILITY operator type& () const _NOEXCEPT {return *__f_;} 442 _LIBCPP_INLINE_VISIBILITY type& get() const _NOEXCEPT {return *__f_;} 443 444 // invoke 445 template <class... _ArgTypes> 446 _LIBCPP_INLINE_VISIBILITY 447 typename __invoke_of<type&, _ArgTypes...>::type 448 operator() (_ArgTypes&&... __args) const 449 { 450 return __invoke(get(), _VSTD::forward<_ArgTypes>(__args)...); 451 } 452 }; 453 454 template <class _Tp> struct __is_reference_wrapper_impl : public false_type {}; 455 template <class _Tp> struct __is_reference_wrapper_impl<reference_wrapper<_Tp> > : public true_type {}; 456 template <class _Tp> struct __is_reference_wrapper 457 : public __is_reference_wrapper_impl<typename remove_cv<_Tp>::type> {}; 458 459 template <class _Tp> 460 inline _LIBCPP_INLINE_VISIBILITY 461 reference_wrapper<_Tp> 462 ref(_Tp& __t) _NOEXCEPT 463 { 464 return reference_wrapper<_Tp>(__t); 465 } 466 467 template <class _Tp> 468 inline _LIBCPP_INLINE_VISIBILITY 469 reference_wrapper<_Tp> 470 ref(reference_wrapper<_Tp> __t) _NOEXCEPT 471 { 472 return ref(__t.get()); 473 } 474 475 template <class _Tp> 476 inline _LIBCPP_INLINE_VISIBILITY 477 reference_wrapper<const _Tp> 478 cref(const _Tp& __t) _NOEXCEPT 479 { 480 return reference_wrapper<const _Tp>(__t); 481 } 482 483 template <class _Tp> 484 inline _LIBCPP_INLINE_VISIBILITY 485 reference_wrapper<const _Tp> 486 cref(reference_wrapper<_Tp> __t) _NOEXCEPT 487 { 488 return cref(__t.get()); 489 } 490 491 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 492 #ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS 493 494 template <class _Tp> void ref(const _Tp&&) = delete; 495 template <class _Tp> void cref(const _Tp&&) = delete; 496 497 #else // _LIBCPP_HAS_NO_DELETED_FUNCTIONS 498 499 template <class _Tp> void ref(const _Tp&&);// = delete; 500 template <class _Tp> void cref(const _Tp&&);// = delete; 501 502 #endif // _LIBCPP_HAS_NO_DELETED_FUNCTIONS 503 504 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 505 506 #endif // _LIBCPP_HAS_NO_VARIADICS 507 508 #if _LIBCPP_STD_VER > 11 509 template <class _Tp1, class _Tp2 = void> 510 struct __is_transparent 511 { 512 private: 513 struct __two {char __lx; char __lxx;}; 514 template <class _Up> static __two __test(...); 515 template <class _Up> static char __test(typename _Up::is_transparent* = 0); 516 public: 517 static const bool value = sizeof(__test<_Tp1>(0)) == 1; 518 }; 519 #endif 520 521 // allocator_arg_t 522 523 struct _LIBCPP_TYPE_VIS_ONLY allocator_arg_t { }; 524 525 #if defined(_LIBCPP_HAS_NO_CONSTEXPR) || defined(_LIBCPP_BUILDING_MEMORY) 526 extern const allocator_arg_t allocator_arg; 527 #else 528 constexpr allocator_arg_t allocator_arg = allocator_arg_t(); 529 #endif 530 531 // uses_allocator 532 533 template <class _Tp> 534 struct __has_allocator_type 535 { 536 private: 537 struct __two {char __lx; char __lxx;}; 538 template <class _Up> static __two __test(...); 539 template <class _Up> static char __test(typename _Up::allocator_type* = 0); 540 public: 541 static const bool value = sizeof(__test<_Tp>(0)) == 1; 542 }; 543 544 template <class _Tp, class _Alloc, bool = __has_allocator_type<_Tp>::value> 545 struct __uses_allocator 546 : public integral_constant<bool, 547 is_convertible<_Alloc, typename _Tp::allocator_type>::value> 548 { 549 }; 550 551 template <class _Tp, class _Alloc> 552 struct __uses_allocator<_Tp, _Alloc, false> 553 : public false_type 554 { 555 }; 556 557 template <class _Tp, class _Alloc> 558 struct _LIBCPP_TYPE_VIS_ONLY uses_allocator 559 : public __uses_allocator<_Tp, _Alloc> 560 { 561 }; 562 563 #ifndef _LIBCPP_HAS_NO_VARIADICS 564 565 // allocator construction 566 567 template <class _Tp, class _Alloc, class ..._Args> 568 struct __uses_alloc_ctor_imp 569 { 570 static const bool __ua = uses_allocator<_Tp, _Alloc>::value; 571 static const bool __ic = 572 is_constructible<_Tp, allocator_arg_t, _Alloc, _Args...>::value; 573 static const int value = __ua ? 2 - __ic : 0; 574 }; 575 576 template <class _Tp, class _Alloc, class ..._Args> 577 struct __uses_alloc_ctor 578 : integral_constant<int, __uses_alloc_ctor_imp<_Tp, _Alloc, _Args...>::value> 579 {}; 580 581 template <class _Tp, class _Allocator, class... _Args> 582 inline _LIBCPP_INLINE_VISIBILITY 583 void __user_alloc_construct_impl (integral_constant<int, 0>, _Tp *__storage, const _Allocator &, _Args &&... __args ) 584 { 585 new (__storage) _Tp (_VSTD::forward<_Args>(__args)...); 586 } 587 588 template <class _Tp, class _Allocator, class... _Args> 589 inline _LIBCPP_INLINE_VISIBILITY 590 void __user_alloc_construct_impl (integral_constant<int, 1>, _Tp *__storage, const _Allocator &__a, _Args &&... __args ) 591 { 592 new (__storage) _Tp (allocator_arg, __a, _VSTD::forward<_Args>(__args)...); 593 } 594 595 template <class _Tp, class _Allocator, class... _Args> 596 inline _LIBCPP_INLINE_VISIBILITY 597 void __user_alloc_construct_impl (integral_constant<int, 2>, _Tp *__storage, const _Allocator &__a, _Args &&... __args ) 598 { 599 new (__storage) _Tp (_VSTD::forward<_Args>(__args)..., __a); 600 } 601 602 template <class _Tp, class _Allocator, class... _Args> 603 inline _LIBCPP_INLINE_VISIBILITY 604 void __user_alloc_construct (_Tp *__storage, const _Allocator &__a, _Args &&... __args) 605 { 606 __user_alloc_construct_impl( 607 __uses_alloc_ctor<_Tp, _Allocator>(), 608 __storage, __a, _VSTD::forward<_Args>(__args)... 609 ); 610 } 611 #endif // _LIBCPP_HAS_NO_VARIADICS 612 613 _LIBCPP_END_NAMESPACE_STD 614 615 #endif // _LIBCPP_FUNCTIONAL_BASE 616