type_traits revision 232950
1// -*- C++ -*- 2//===------------------------ type_traits ---------------------------------===// 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_TYPE_TRAITS 12#define _LIBCPP_TYPE_TRAITS 13 14/* 15 type_traits synopsis 16 17namespace std 18{ 19 20 // helper class: 21 template <class T, T v> struct integral_constant; 22 typedef integral_constant<bool, true> true_type; 23 typedef integral_constant<bool, false> false_type; 24 25 // helper traits 26 template <bool, class T = void> struct enable_if; 27 template <bool, class T, class F> struct conditional; 28 29 // Primary classification traits: 30 template <class T> struct is_void; 31 template <class T> struct is_integral; 32 template <class T> struct is_floating_point; 33 template <class T> struct is_array; 34 template <class T> struct is_pointer; 35 template <class T> struct is_lvalue_reference; 36 template <class T> struct is_rvalue_reference; 37 template <class T> struct is_member_object_pointer; 38 template <class T> struct is_member_function_pointer; 39 template <class T> struct is_enum; 40 template <class T> struct is_union; 41 template <class T> struct is_class; 42 template <class T> struct is_function; 43 44 // Secondary classification traits: 45 template <class T> struct is_reference; 46 template <class T> struct is_arithmetic; 47 template <class T> struct is_fundamental; 48 template <class T> struct is_member_pointer; 49 template <class T> struct is_scalar; 50 template <class T> struct is_object; 51 template <class T> struct is_compound; 52 53 // Const-volatile properties and transformations: 54 template <class T> struct is_const; 55 template <class T> struct is_volatile; 56 template <class T> struct remove_const; 57 template <class T> struct remove_volatile; 58 template <class T> struct remove_cv; 59 template <class T> struct add_const; 60 template <class T> struct add_volatile; 61 template <class T> struct add_cv; 62 63 // Reference transformations: 64 template <class T> struct remove_reference; 65 template <class T> struct add_lvalue_reference; 66 template <class T> struct add_rvalue_reference; 67 68 // Pointer transformations: 69 template <class T> struct remove_pointer; 70 template <class T> struct add_pointer; 71 72 // Integral properties: 73 template <class T> struct is_signed; 74 template <class T> struct is_unsigned; 75 template <class T> struct make_signed; 76 template <class T> struct make_unsigned; 77 78 // Array properties and transformations: 79 template <class T> struct rank; 80 template <class T, unsigned I = 0> struct extent; 81 template <class T> struct remove_extent; 82 template <class T> struct remove_all_extents; 83 84 // Member introspection: 85 template <class T> struct is_pod; 86 template <class T> struct is_trivial; 87 template <class T> struct is_trivially_copyable; 88 template <class T> struct is_standard_layout; 89 template <class T> struct is_literal_type; 90 template <class T> struct is_empty; 91 template <class T> struct is_polymorphic; 92 template <class T> struct is_abstract; 93 94 template <class T, class... Args> struct is_constructible; 95 template <class T> struct is_default_constructible; 96 template <class T> struct is_copy_constructible; 97 template <class T> struct is_move_constructible; 98 template <class T, class U> struct is_assignable; 99 template <class T> struct is_copy_assignable; 100 template <class T> struct is_move_assignable; 101 template <class T> struct is_destructible; 102 103 template <class T, class... Args> struct is_trivially_constructible; 104 template <class T> struct is_trivially_default_constructible; 105 template <class T> struct is_trivially_copy_constructible; 106 template <class T> struct is_trivially_move_constructible; 107 template <class T, class U> struct is_trivially_assignable; 108 template <class T> struct is_trivially_copy_assignable; 109 template <class T> struct is_trivially_move_assignable; 110 template <class T> struct is_trivially_destructible; 111 112 template <class T, class... Args> struct is_nothrow_constructible; 113 template <class T> struct is_nothrow_default_constructible; 114 template <class T> struct is_nothrow_copy_constructible; 115 template <class T> struct is_nothrow_move_constructible; 116 template <class T, class U> struct is_nothrow_assignable; 117 template <class T> struct is_nothrow_copy_assignable; 118 template <class T> struct is_nothrow_move_assignable; 119 template <class T> struct is_nothrow_destructible; 120 121 template <class T> struct has_virtual_destructor; 122 123 // Relationships between types: 124 template <class T, class U> struct is_same; 125 template <class Base, class Derived> struct is_base_of; 126 template <class From, class To> struct is_convertible; 127 128 // Alignment properties and transformations: 129 template <class T> struct alignment_of; 130 template <size_t Len, size_t Align = most_stringent_alignment_requirement> 131 struct aligned_storage; 132 133 template <class T> struct decay; 134 template <class... T> struct common_type; 135 template <class T> struct underlying_type; 136 template <class> class result_of; // undefined 137 template <class Fn, class... ArgTypes> class result_of<Fn(ArgTypes...)>; 138 139} // std 140 141*/ 142#include <__config> 143#include <cstddef> 144 145#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 146#pragma GCC system_header 147#endif 148 149_LIBCPP_BEGIN_NAMESPACE_STD 150 151template <bool _Bp, class _If, class _Then> 152 struct _LIBCPP_VISIBLE conditional {typedef _If type;}; 153template <class _If, class _Then> 154 struct _LIBCPP_VISIBLE conditional<false, _If, _Then> {typedef _Then type;}; 155 156template <bool, class _Tp = void> struct _LIBCPP_VISIBLE enable_if {}; 157template <class _Tp> struct _LIBCPP_VISIBLE enable_if<true, _Tp> {typedef _Tp type;}; 158 159struct __two {char _[2];}; 160 161// helper class: 162 163template <class _Tp, _Tp __v> 164struct _LIBCPP_VISIBLE integral_constant 165{ 166 static constexpr _Tp value = __v; 167 typedef _Tp value_type; 168 typedef integral_constant type; 169 _LIBCPP_INLINE_VISIBILITY 170#ifndef _LIBCPP_HAS_NO_CONSTEXPR 171 constexpr 172#endif 173 operator value_type() 174#ifdef _LIBCPP_HAS_NO_CONSTEXPR 175 const 176#endif 177 {return value;} 178}; 179 180template <class _Tp, _Tp __v> 181constexpr _Tp integral_constant<_Tp, __v>::value; 182 183typedef integral_constant<bool, true> true_type; 184typedef integral_constant<bool, false> false_type; 185 186// is_const 187 188template <class _Tp> struct _LIBCPP_VISIBLE is_const : public false_type {}; 189template <class _Tp> struct _LIBCPP_VISIBLE is_const<_Tp const> : public true_type {}; 190 191// is_volatile 192 193template <class _Tp> struct _LIBCPP_VISIBLE is_volatile : public false_type {}; 194template <class _Tp> struct _LIBCPP_VISIBLE is_volatile<_Tp volatile> : public true_type {}; 195 196// remove_const 197 198template <class _Tp> struct _LIBCPP_VISIBLE remove_const {typedef _Tp type;}; 199template <class _Tp> struct _LIBCPP_VISIBLE remove_const<const _Tp> {typedef _Tp type;}; 200 201// remove_volatile 202 203template <class _Tp> struct _LIBCPP_VISIBLE remove_volatile {typedef _Tp type;}; 204template <class _Tp> struct _LIBCPP_VISIBLE remove_volatile<volatile _Tp> {typedef _Tp type;}; 205 206// remove_cv 207 208template <class _Tp> struct _LIBCPP_VISIBLE remove_cv 209{typedef typename remove_volatile<typename remove_const<_Tp>::type>::type type;}; 210 211// is_void 212 213template <class _Tp> struct __is_void : public false_type {}; 214template <> struct __is_void<void> : public true_type {}; 215 216template <class _Tp> struct _LIBCPP_VISIBLE is_void 217 : public __is_void<typename remove_cv<_Tp>::type> {}; 218 219// __is_nullptr_t 220 221template <class _Tp> struct ____is_nullptr_t : public false_type {}; 222template <> struct ____is_nullptr_t<nullptr_t> : public true_type {}; 223 224template <class _Tp> struct _LIBCPP_VISIBLE __is_nullptr_t 225 : public ____is_nullptr_t<typename remove_cv<_Tp>::type> {}; 226 227// is_integral 228 229template <class _Tp> struct __is_integral : public false_type {}; 230template <> struct __is_integral<bool> : public true_type {}; 231template <> struct __is_integral<char> : public true_type {}; 232template <> struct __is_integral<signed char> : public true_type {}; 233template <> struct __is_integral<unsigned char> : public true_type {}; 234template <> struct __is_integral<wchar_t> : public true_type {}; 235#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS 236template <> struct __is_integral<char16_t> : public true_type {}; 237template <> struct __is_integral<char32_t> : public true_type {}; 238#endif // _LIBCPP_HAS_NO_UNICODE_CHARS 239template <> struct __is_integral<short> : public true_type {}; 240template <> struct __is_integral<unsigned short> : public true_type {}; 241template <> struct __is_integral<int> : public true_type {}; 242template <> struct __is_integral<unsigned int> : public true_type {}; 243template <> struct __is_integral<long> : public true_type {}; 244template <> struct __is_integral<unsigned long> : public true_type {}; 245template <> struct __is_integral<long long> : public true_type {}; 246template <> struct __is_integral<unsigned long long> : public true_type {}; 247 248template <class _Tp> struct _LIBCPP_VISIBLE is_integral 249 : public __is_integral<typename remove_cv<_Tp>::type> {}; 250 251// is_floating_point 252 253template <class _Tp> struct __is_floating_point : public false_type {}; 254template <> struct __is_floating_point<float> : public true_type {}; 255template <> struct __is_floating_point<double> : public true_type {}; 256template <> struct __is_floating_point<long double> : public true_type {}; 257 258template <class _Tp> struct _LIBCPP_VISIBLE is_floating_point 259 : public __is_floating_point<typename remove_cv<_Tp>::type> {}; 260 261// is_array 262 263template <class _Tp> struct _LIBCPP_VISIBLE is_array 264 : public false_type {}; 265template <class _Tp> struct _LIBCPP_VISIBLE is_array<_Tp[]> 266 : public true_type {}; 267template <class _Tp, size_t _Np> struct _LIBCPP_VISIBLE is_array<_Tp[_Np]> 268 : public true_type {}; 269 270// is_pointer 271 272template <class _Tp> struct __is_pointer : public false_type {}; 273template <class _Tp> struct __is_pointer<_Tp*> : public true_type {}; 274 275template <class _Tp> struct _LIBCPP_VISIBLE is_pointer 276 : public __is_pointer<typename remove_cv<_Tp>::type> {}; 277 278// is_reference 279 280template <class _Tp> struct _LIBCPP_VISIBLE is_lvalue_reference : public false_type {}; 281template <class _Tp> struct _LIBCPP_VISIBLE is_lvalue_reference<_Tp&> : public true_type {}; 282 283template <class _Tp> struct _LIBCPP_VISIBLE is_rvalue_reference : public false_type {}; 284#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 285template <class _Tp> struct _LIBCPP_VISIBLE is_rvalue_reference<_Tp&&> : public true_type {}; 286#endif 287 288template <class _Tp> struct _LIBCPP_VISIBLE is_reference : public false_type {}; 289template <class _Tp> struct _LIBCPP_VISIBLE is_reference<_Tp&> : public true_type {}; 290#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 291template <class _Tp> struct _LIBCPP_VISIBLE is_reference<_Tp&&> : public true_type {}; 292#endif 293 294#if defined(__clang__) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) 295#define _LIBCPP_HAS_TYPE_TRAITS 296#endif 297 298// is_union 299 300#if __has_feature(is_union) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) 301 302template <class _Tp> struct _LIBCPP_VISIBLE is_union 303 : public integral_constant<bool, __is_union(_Tp)> {}; 304 305#else 306 307template <class _Tp> struct __libcpp_union : public false_type {}; 308template <class _Tp> struct _LIBCPP_VISIBLE is_union 309 : public __libcpp_union<typename remove_cv<_Tp>::type> {}; 310 311#endif 312 313// is_class 314 315#if __has_feature(is_class) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) 316 317template <class _Tp> struct _LIBCPP_VISIBLE is_class 318 : public integral_constant<bool, __is_class(_Tp)> {}; 319 320#else 321 322namespace __is_class_imp 323{ 324template <class _Tp> char __test(int _Tp::*); 325template <class _Tp> __two __test(...); 326} 327 328template <class _Tp> struct _LIBCPP_VISIBLE is_class 329 : public integral_constant<bool, sizeof(__is_class_imp::__test<_Tp>(0)) == 1 && !is_union<_Tp>::value> {}; 330 331#endif 332 333// is_same 334 335template <class _Tp, class _Up> struct _LIBCPP_VISIBLE is_same : public false_type {}; 336template <class _Tp> struct _LIBCPP_VISIBLE is_same<_Tp, _Tp> : public true_type {}; 337 338// is_function 339 340namespace __is_function_imp 341{ 342template <class _Tp> char __test(_Tp*); 343template <class _Tp> __two __test(...); 344template <class _Tp> _Tp& __source(); 345} 346 347template <class _Tp, bool = is_class<_Tp>::value || 348 is_union<_Tp>::value || 349 is_void<_Tp>::value || 350 is_reference<_Tp>::value || 351 is_same<_Tp, nullptr_t>::value > 352struct __is_function 353 : public integral_constant<bool, sizeof(__is_function_imp::__test<_Tp>(__is_function_imp::__source<_Tp>())) == 1> 354 {}; 355template <class _Tp> struct __is_function<_Tp, true> : public false_type {}; 356 357template <class _Tp> struct _LIBCPP_VISIBLE is_function 358 : public __is_function<_Tp> {}; 359 360// is_member_function_pointer 361 362template <class _Tp> struct __is_member_function_pointer : public false_type {}; 363template <class _Tp, class _Up> struct __is_member_function_pointer<_Tp _Up::*> : public is_function<_Tp> {}; 364 365template <class _Tp> struct _LIBCPP_VISIBLE is_member_function_pointer 366 : public __is_member_function_pointer<typename remove_cv<_Tp>::type> {}; 367 368// is_member_pointer 369 370template <class _Tp> struct __is_member_pointer : public false_type {}; 371template <class _Tp, class _Up> struct __is_member_pointer<_Tp _Up::*> : public true_type {}; 372 373template <class _Tp> struct _LIBCPP_VISIBLE is_member_pointer 374 : public __is_member_pointer<typename remove_cv<_Tp>::type> {}; 375 376// is_member_object_pointer 377 378template <class _Tp> struct _LIBCPP_VISIBLE is_member_object_pointer 379 : public integral_constant<bool, is_member_pointer<_Tp>::value && 380 !is_member_function_pointer<_Tp>::value> {}; 381 382// is_enum 383 384#if __has_feature(is_enum) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) 385 386template <class _Tp> struct _LIBCPP_VISIBLE is_enum 387 : public integral_constant<bool, __is_enum(_Tp)> {}; 388 389#else 390 391template <class _Tp> struct _LIBCPP_VISIBLE is_enum 392 : public integral_constant<bool, !is_void<_Tp>::value && 393 !is_integral<_Tp>::value && 394 !is_floating_point<_Tp>::value && 395 !is_array<_Tp>::value && 396 !is_pointer<_Tp>::value && 397 !is_reference<_Tp>::value && 398 !is_member_pointer<_Tp>::value && 399 !is_union<_Tp>::value && 400 !is_class<_Tp>::value && 401 !is_function<_Tp>::value > {}; 402 403#endif 404 405// is_arithmetic 406 407template <class _Tp> struct _LIBCPP_VISIBLE is_arithmetic 408 : public integral_constant<bool, is_integral<_Tp>::value || 409 is_floating_point<_Tp>::value> {}; 410 411// is_fundamental 412 413template <class _Tp> struct _LIBCPP_VISIBLE is_fundamental 414 : public integral_constant<bool, is_void<_Tp>::value || 415 __is_nullptr_t<_Tp>::value || 416 is_arithmetic<_Tp>::value> {}; 417 418// is_scalar 419 420template <class _Tp> struct _LIBCPP_VISIBLE is_scalar 421 : public integral_constant<bool, is_arithmetic<_Tp>::value || 422 is_member_pointer<_Tp>::value || 423 is_pointer<_Tp>::value || 424 __is_nullptr_t<_Tp>::value || 425 is_enum<_Tp>::value > {}; 426 427template <> struct _LIBCPP_VISIBLE is_scalar<nullptr_t> : public true_type {}; 428 429// is_object 430 431template <class _Tp> struct _LIBCPP_VISIBLE is_object 432 : public integral_constant<bool, is_scalar<_Tp>::value || 433 is_array<_Tp>::value || 434 is_union<_Tp>::value || 435 is_class<_Tp>::value > {}; 436 437// is_compound 438 439template <class _Tp> struct _LIBCPP_VISIBLE is_compound 440 : public integral_constant<bool, !is_fundamental<_Tp>::value> {}; 441 442// add_const 443 444template <class _Tp, bool = is_reference<_Tp>::value || 445 is_function<_Tp>::value || 446 is_const<_Tp>::value > 447struct __add_const {typedef _Tp type;}; 448 449template <class _Tp> 450struct __add_const<_Tp, false> {typedef const _Tp type;}; 451 452template <class _Tp> struct _LIBCPP_VISIBLE add_const 453 {typedef typename __add_const<_Tp>::type type;}; 454 455// add_volatile 456 457template <class _Tp, bool = is_reference<_Tp>::value || 458 is_function<_Tp>::value || 459 is_volatile<_Tp>::value > 460struct __add_volatile {typedef _Tp type;}; 461 462template <class _Tp> 463struct __add_volatile<_Tp, false> {typedef volatile _Tp type;}; 464 465template <class _Tp> struct _LIBCPP_VISIBLE add_volatile 466 {typedef typename __add_volatile<_Tp>::type type;}; 467 468// add_cv 469 470template <class _Tp> struct _LIBCPP_VISIBLE add_cv 471 {typedef typename add_const<typename add_volatile<_Tp>::type>::type type;}; 472 473// remove_reference 474 475template <class _Tp> struct _LIBCPP_VISIBLE remove_reference {typedef _Tp type;}; 476template <class _Tp> struct _LIBCPP_VISIBLE remove_reference<_Tp&> {typedef _Tp type;}; 477#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 478template <class _Tp> struct _LIBCPP_VISIBLE remove_reference<_Tp&&> {typedef _Tp type;}; 479#endif 480 481// add_lvalue_reference 482 483template <class _Tp> struct _LIBCPP_VISIBLE add_lvalue_reference {typedef _Tp& type;}; 484template <class _Tp> struct _LIBCPP_VISIBLE add_lvalue_reference<_Tp&> {typedef _Tp& type;}; // for older compiler 485template <> struct _LIBCPP_VISIBLE add_lvalue_reference<void> {typedef void type;}; 486template <> struct _LIBCPP_VISIBLE add_lvalue_reference<const void> {typedef const void type;}; 487template <> struct _LIBCPP_VISIBLE add_lvalue_reference<volatile void> {typedef volatile void type;}; 488template <> struct _LIBCPP_VISIBLE add_lvalue_reference<const volatile void> {typedef const volatile void type;}; 489 490#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 491 492template <class _Tp> struct _LIBCPP_VISIBLE add_rvalue_reference {typedef _Tp&& type;}; 493template <> struct _LIBCPP_VISIBLE add_rvalue_reference<void> {typedef void type;}; 494template <> struct _LIBCPP_VISIBLE add_rvalue_reference<const void> {typedef const void type;}; 495template <> struct _LIBCPP_VISIBLE add_rvalue_reference<volatile void> {typedef volatile void type;}; 496template <> struct _LIBCPP_VISIBLE add_rvalue_reference<const volatile void> {typedef const volatile void type;}; 497 498#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 499 500#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 501 502template <class _Tp> 503typename add_rvalue_reference<_Tp>::type 504declval() _NOEXCEPT; 505 506#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 507 508template <class _Tp> 509typename add_lvalue_reference<_Tp>::type 510declval(); 511 512#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 513 514struct __any 515{ 516 __any(...); 517}; 518 519// remove_pointer 520 521template <class _Tp> struct _LIBCPP_VISIBLE remove_pointer {typedef _Tp type;}; 522template <class _Tp> struct _LIBCPP_VISIBLE remove_pointer<_Tp*> {typedef _Tp type;}; 523template <class _Tp> struct _LIBCPP_VISIBLE remove_pointer<_Tp* const> {typedef _Tp type;}; 524template <class _Tp> struct _LIBCPP_VISIBLE remove_pointer<_Tp* volatile> {typedef _Tp type;}; 525template <class _Tp> struct _LIBCPP_VISIBLE remove_pointer<_Tp* const volatile> {typedef _Tp type;}; 526 527// add_pointer 528 529template <class _Tp> struct _LIBCPP_VISIBLE add_pointer 530 {typedef typename remove_reference<_Tp>::type* type;}; 531 532// is_signed 533 534template <class _Tp, bool = is_integral<_Tp>::value> 535struct ___is_signed : public integral_constant<bool, _Tp(-1) < _Tp(0)> {}; 536 537template <class _Tp> 538struct ___is_signed<_Tp, false> : public true_type {}; // floating point 539 540template <class _Tp, bool = is_arithmetic<_Tp>::value> 541struct __is_signed : public ___is_signed<_Tp> {}; 542 543template <class _Tp> struct __is_signed<_Tp, false> : public false_type {}; 544 545template <class _Tp> struct _LIBCPP_VISIBLE is_signed : public __is_signed<_Tp> {}; 546 547// is_unsigned 548 549template <class _Tp, bool = is_integral<_Tp>::value> 550struct ___is_unsigned : public integral_constant<bool, _Tp(0) < _Tp(-1)> {}; 551 552template <class _Tp> 553struct ___is_unsigned<_Tp, false> : public false_type {}; // floating point 554 555template <class _Tp, bool = is_arithmetic<_Tp>::value> 556struct __is_unsigned : public ___is_unsigned<_Tp> {}; 557 558template <class _Tp> struct __is_unsigned<_Tp, false> : public false_type {}; 559 560template <class _Tp> struct _LIBCPP_VISIBLE is_unsigned : public __is_unsigned<_Tp> {}; 561 562// rank 563 564template <class _Tp> struct _LIBCPP_VISIBLE rank 565 : public integral_constant<size_t, 0> {}; 566template <class _Tp> struct _LIBCPP_VISIBLE rank<_Tp[]> 567 : public integral_constant<size_t, rank<_Tp>::value + 1> {}; 568template <class _Tp, size_t _Np> struct _LIBCPP_VISIBLE rank<_Tp[_Np]> 569 : public integral_constant<size_t, rank<_Tp>::value + 1> {}; 570 571// extent 572 573template <class _Tp, unsigned _Ip = 0> struct _LIBCPP_VISIBLE extent 574 : public integral_constant<size_t, 0> {}; 575template <class _Tp> struct _LIBCPP_VISIBLE extent<_Tp[], 0> 576 : public integral_constant<size_t, 0> {}; 577template <class _Tp, unsigned _Ip> struct _LIBCPP_VISIBLE extent<_Tp[], _Ip> 578 : public integral_constant<size_t, extent<_Tp, _Ip-1>::value> {}; 579template <class _Tp, size_t _Np> struct _LIBCPP_VISIBLE extent<_Tp[_Np], 0> 580 : public integral_constant<size_t, _Np> {}; 581template <class _Tp, size_t _Np, unsigned _Ip> struct _LIBCPP_VISIBLE extent<_Tp[_Np], _Ip> 582 : public integral_constant<size_t, extent<_Tp, _Ip-1>::value> {}; 583 584// remove_extent 585 586template <class _Tp> struct _LIBCPP_VISIBLE remove_extent 587 {typedef _Tp type;}; 588template <class _Tp> struct _LIBCPP_VISIBLE remove_extent<_Tp[]> 589 {typedef _Tp type;}; 590template <class _Tp, size_t _Np> struct _LIBCPP_VISIBLE remove_extent<_Tp[_Np]> 591 {typedef _Tp type;}; 592 593// remove_all_extents 594 595template <class _Tp> struct _LIBCPP_VISIBLE remove_all_extents 596 {typedef _Tp type;}; 597template <class _Tp> struct _LIBCPP_VISIBLE remove_all_extents<_Tp[]> 598 {typedef typename remove_all_extents<_Tp>::type type;}; 599template <class _Tp, size_t _Np> struct _LIBCPP_VISIBLE remove_all_extents<_Tp[_Np]> 600 {typedef typename remove_all_extents<_Tp>::type type;}; 601 602// is_abstract 603 604namespace __is_abstract_imp 605{ 606template <class _Tp> char __test(_Tp (*)[1]); 607template <class _Tp> __two __test(...); 608} 609 610template <class _Tp, bool = is_class<_Tp>::value> 611struct __libcpp_abstract : public integral_constant<bool, sizeof(__is_abstract_imp::__test<_Tp>(0)) != 1> {}; 612 613template <class _Tp> struct __libcpp_abstract<_Tp, false> : public false_type {}; 614 615template <class _Tp> struct _LIBCPP_VISIBLE is_abstract : public __libcpp_abstract<_Tp> {}; 616 617// is_convertible 618 619#if __has_feature(is_convertible_to) 620 621template <class _T1, class _T2> struct _LIBCPP_VISIBLE is_convertible 622 : public integral_constant<bool, __is_convertible_to(_T1, _T2)> {}; 623 624#else // __has_feature(is_convertible_to) 625 626namespace __is_convertible_imp 627{ 628#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 629template <class _Tp> char __test(const volatile typename remove_reference<_Tp>::type&&); 630#else 631template <class _Tp> char __test(_Tp); 632#endif 633template <class _Tp> __two __test(...); 634#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 635template <class _Tp> _Tp&& __source(); 636#else 637template <class _Tp> typename remove_reference<_Tp>::type& __source(); 638#endif 639 640template <class _Tp, bool _IsArray = is_array<_Tp>::value, 641 bool _IsFunction = is_function<_Tp>::value, 642 bool _IsVoid = is_void<_Tp>::value> 643 struct __is_array_function_or_void {enum {value = 0};}; 644template <class _Tp> struct __is_array_function_or_void<_Tp, true, false, false> {enum {value = 1};}; 645template <class _Tp> struct __is_array_function_or_void<_Tp, false, true, false> {enum {value = 2};}; 646template <class _Tp> struct __is_array_function_or_void<_Tp, false, false, true> {enum {value = 3};}; 647} 648 649template <class _Tp, 650 unsigned = __is_convertible_imp::__is_array_function_or_void<typename remove_reference<_Tp>::type>::value> 651struct __is_convertible_check 652{ 653 static const size_t __v = 0; 654}; 655 656template <class _Tp> 657struct __is_convertible_check<_Tp, 0> 658{ 659 static const size_t __v = sizeof(_Tp); 660}; 661 662template <class _T1, class _T2, 663 unsigned _T1_is_array_function_or_void = __is_convertible_imp::__is_array_function_or_void<_T1>::value, 664 unsigned _T2_is_array_function_or_void = __is_convertible_imp::__is_array_function_or_void<_T2>::value> 665struct __is_convertible 666 : public integral_constant<bool, 667 sizeof(__is_convertible_imp::__test<_T2>(__is_convertible_imp::__source<_T1>())) == 1 668 > 669{}; 670 671template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 1, 0> : false_type {}; 672 673template <class _T1> struct __is_convertible<_T1, const _T1&, 1, 0> : true_type {}; 674#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 675template <class _T1> struct __is_convertible<_T1, _T1&&, 1, 0> : true_type {}; 676template <class _T1> struct __is_convertible<_T1, const _T1&&, 1, 0> : true_type {}; 677template <class _T1> struct __is_convertible<_T1, volatile _T1&&, 1, 0> : true_type {}; 678template <class _T1> struct __is_convertible<_T1, const volatile _T1&&, 1, 0> : true_type {}; 679#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 680 681template <class _T1, class _T2> struct __is_convertible<_T1, _T2*, 1, 0> 682 : public integral_constant<bool, __is_convertible<typename remove_all_extents<_T1>::type*, _T2*>::value> {}; 683 684template <class _T1, class _T2> struct __is_convertible<_T1, _T2* const, 1, 0> 685 : public integral_constant<bool, __is_convertible<typename remove_all_extents<_T1>::type*, _T2*const>::value> {}; 686 687template <class _T1, class _T2> struct __is_convertible<_T1, _T2* volatile, 1, 0> 688 : public integral_constant<bool, __is_convertible<typename remove_all_extents<_T1>::type*, _T2*volatile>::value> {}; 689 690template <class _T1, class _T2> struct __is_convertible<_T1, _T2* const volatile, 1, 0> 691 : public integral_constant<bool, __is_convertible<typename remove_all_extents<_T1>::type*, _T2*const volatile>::value> {}; 692 693template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 2, 0> : public false_type {}; 694#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 695template <class _T1> struct __is_convertible<_T1, _T1&&, 2, 0> : public true_type {}; 696#endif 697template <class _T1> struct __is_convertible<_T1, _T1*, 2, 0> : public true_type {}; 698template <class _T1> struct __is_convertible<_T1, _T1*const, 2, 0> : public true_type {}; 699template <class _T1> struct __is_convertible<_T1, _T1*volatile, 2, 0> : public true_type {}; 700template <class _T1> struct __is_convertible<_T1, _T1*const volatile, 2, 0> : public true_type {}; 701 702template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 3, 0> : public false_type {}; 703 704template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 0, 1> : public false_type {}; 705template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 1, 1> : public false_type {}; 706template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 2, 1> : public false_type {}; 707template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 3, 1> : public false_type {}; 708 709template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 0, 2> : public false_type {}; 710template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 1, 2> : public false_type {}; 711template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 2, 2> : public false_type {}; 712template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 3, 2> : public false_type {}; 713 714template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 0, 3> : public false_type {}; 715template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 1, 3> : public false_type {}; 716template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 2, 3> : public false_type {}; 717template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 3, 3> : public true_type {}; 718 719template <class _T1, class _T2> struct _LIBCPP_VISIBLE is_convertible 720 : public __is_convertible<_T1, _T2> 721{ 722 static const size_t __complete_check1 = __is_convertible_check<_T1>::__v; 723 static const size_t __complete_check2 = __is_convertible_check<_T2>::__v; 724}; 725 726#endif // __has_feature(is_convertible_to) 727 728// is_base_of 729 730#ifdef _LIBCP_HAS_IS_BASE_OF 731 732template <class _Bp, class _Dp> 733struct _LIBCPP_VISIBLE is_base_of 734 : public integral_constant<bool, __is_base_of(_Bp, _Dp)> {}; 735 736#else // __has_feature(is_base_of) 737 738#error is_base_of not implemented. 739 740#endif // __has_feature(is_base_of) 741 742// is_empty 743 744#if __has_feature(is_empty) 745 746template <class _Tp> 747struct _LIBCPP_VISIBLE is_empty 748 : public integral_constant<bool, __is_empty(_Tp)> {}; 749 750#else // __has_feature(is_empty) 751 752template <class _Tp> 753struct __is_empty1 754 : public _Tp 755{ 756 double _; 757}; 758 759struct __is_empty2 760{ 761 double _; 762}; 763 764template <class _Tp, bool = is_class<_Tp>::value> 765struct __libcpp_empty : public integral_constant<bool, sizeof(__is_empty1<_Tp>) == sizeof(__is_empty2)> {}; 766 767template <class _Tp> struct __libcpp_empty<_Tp, false> : public false_type {}; 768 769template <class _Tp> struct _LIBCPP_VISIBLE is_empty : public __libcpp_empty<_Tp> {}; 770 771#endif // __has_feature(is_empty) 772 773// is_polymorphic 774 775#if __has_feature(is_polymorphic) 776 777template <class _Tp> 778struct _LIBCPP_VISIBLE is_polymorphic 779 : public integral_constant<bool, __is_polymorphic(_Tp)> {}; 780 781#else 782 783template <class _Tp> struct __is_polymorphic1 : public _Tp {}; 784template <class _Tp> struct __is_polymorphic2 : public _Tp {virtual ~__is_polymorphic2() throw();}; 785 786template <class _Tp, bool = is_class<_Tp>::value> 787struct __libcpp_polymorphic 788 : public integral_constant<bool, sizeof(__is_polymorphic1<_Tp>) == sizeof(__is_polymorphic2<_Tp>)> {}; 789 790template <class _Tp> struct __libcpp_polymorphic<_Tp, false> : public false_type {}; 791 792template <class _Tp> struct _LIBCPP_VISIBLE is_polymorphic 793 : public __libcpp_polymorphic<_Tp> {}; 794 795#endif // __has_feature(is_polymorphic) 796 797// has_virtual_destructor 798 799#if __has_feature(has_virtual_destructor) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) 800 801template <class _Tp> struct _LIBCPP_VISIBLE has_virtual_destructor 802 : public integral_constant<bool, __has_virtual_destructor(_Tp)> {}; 803 804#else // _LIBCPP_HAS_TYPE_TRAITS 805 806template <class _Tp> struct _LIBCPP_VISIBLE has_virtual_destructor 807 : public false_type {}; 808 809#endif // _LIBCPP_HAS_TYPE_TRAITS 810 811// alignment_of 812 813template <class _Tp> struct __alignment_of {_Tp _;}; 814 815template <class _Tp> struct _LIBCPP_VISIBLE alignment_of 816 : public integral_constant<size_t, __alignof__(__alignment_of<typename remove_all_extents<_Tp>::type>)> {}; 817 818// aligned_storage 819 820template <class _Hp, class _Tp> 821struct __type_list 822{ 823 typedef _Hp _Head; 824 typedef _Tp _Tail; 825}; 826 827struct __nat 828{ 829#ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS 830 __nat() = delete; 831 __nat(const __nat&) = delete; 832 __nat& operator=(const __nat&) = delete; 833 ~__nat() = delete; 834#endif 835}; 836 837template <class _Tp> 838struct __align_type 839{ 840 static const size_t value = alignment_of<_Tp>::value; 841 typedef _Tp type; 842}; 843 844struct __struct_double {long double _;}; 845struct __struct_double4 {double _[4];}; 846 847typedef 848 __type_list<__align_type<unsigned char>, 849 __type_list<__align_type<unsigned short>, 850 __type_list<__align_type<unsigned int>, 851 __type_list<__align_type<unsigned long>, 852 __type_list<__align_type<unsigned long long>, 853 __type_list<__align_type<double>, 854 __type_list<__align_type<long double>, 855 __type_list<__align_type<__struct_double>, 856 __type_list<__align_type<__struct_double4>, 857 __type_list<__align_type<int*>, 858 __nat 859 > > > > > > > > > > __all_types; 860 861template <class _TL, size_t _Align> struct __find_pod; 862 863template <class _Hp, size_t _Align> 864struct __find_pod<__type_list<_Hp, __nat>, _Align> 865{ 866 typedef typename conditional< 867 _Align == _Hp::value, 868 typename _Hp::type, 869 void 870 >::type type; 871}; 872 873template <class _Hp, class _Tp, size_t _Align> 874struct __find_pod<__type_list<_Hp, _Tp>, _Align> 875{ 876 typedef typename conditional< 877 _Align == _Hp::value, 878 typename _Hp::type, 879 typename __find_pod<_Tp, _Align>::type 880 >::type type; 881}; 882 883template <class _TL, size_t _Len> struct __find_max_align; 884 885template <class _Hp, size_t _Len> 886struct __find_max_align<__type_list<_Hp, __nat>, _Len> : public integral_constant<size_t, _Hp::value> {}; 887 888template <size_t _Len, size_t _A1, size_t _A2> 889struct __select_align 890{ 891private: 892 static const size_t __min = _A2 < _A1 ? _A2 : _A1; 893 static const size_t __max = _A1 < _A2 ? _A2 : _A1; 894public: 895 static const size_t value = _Len < __max ? __min : __max; 896}; 897 898template <class _Hp, class _Tp, size_t _Len> 899struct __find_max_align<__type_list<_Hp, _Tp>, _Len> 900 : public integral_constant<size_t, __select_align<_Len, _Hp::value, __find_max_align<_Tp, _Len>::value>::value> {}; 901 902template <size_t _Len, const size_t _Align = __find_max_align<__all_types, _Len>::value> 903struct _LIBCPP_VISIBLE aligned_storage 904{ 905 typedef typename __find_pod<__all_types, _Align>::type _Aligner; 906 static_assert(!is_void<_Aligner>::value, ""); 907 union type 908 { 909 _Aligner __align; 910 unsigned char __data[_Len]; 911 }; 912}; 913 914#define _CREATE_ALIGNED_STORAGE_SPECIALIZATION(n) \ 915template <size_t _Len>\ 916struct _LIBCPP_VISIBLE aligned_storage<_Len, n>\ 917{\ 918 struct _ALIGNAS(n) type\ 919 {\ 920 unsigned char _[_Len];\ 921 };\ 922} 923 924_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x1); 925_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x2); 926_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x4); 927_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x8); 928_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x10); 929_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x20); 930_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x40); 931_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x80); 932_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x100); 933_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x200); 934_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x400); 935_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x800); 936_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x1000); 937_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x2000); 938// MSDN says that MSVC does not support alignment beyond 8192 (=0x2000) 939#if !defined(_MSC_VER) 940_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x4000); 941#endif // !_MSC_VER 942 943#undef _CREATE_ALIGNED_STORAGE_SPECIALIZATION 944 945// __promote 946 947template <class _A1, class _A2 = void, class _A3 = void, 948 bool = (is_arithmetic<_A1>::value || is_void<_A1>::value) && 949 (is_arithmetic<_A2>::value || is_void<_A2>::value) && 950 (is_arithmetic<_A3>::value || is_void<_A3>::value)> 951class __promote {}; 952 953template <class _A1, class _A2, class _A3> 954class __promote<_A1, _A2, _A3, true> 955{ 956private: 957 typedef typename __promote<_A1>::type __type1; 958 typedef typename __promote<_A2>::type __type2; 959 typedef typename __promote<_A3>::type __type3; 960public: 961 typedef decltype(__type1() + __type2() + __type3()) type; 962}; 963 964template <class _A1, class _A2> 965class __promote<_A1, _A2, void, true> 966{ 967private: 968 typedef typename __promote<_A1>::type __type1; 969 typedef typename __promote<_A2>::type __type2; 970public: 971 typedef decltype(__type1() + __type2()) type; 972}; 973 974template <class _A1> 975class __promote<_A1, void, void, true> 976{ 977public: 978 typedef typename conditional<is_arithmetic<_A1>::value, 979 typename conditional<is_integral<_A1>::value, double, _A1>::type, 980 void 981 >::type type; 982}; 983 984#ifdef _LIBCPP_STORE_AS_OPTIMIZATION 985 986// __transform 987 988template <class _Tp, size_t = sizeof(_Tp), bool = is_scalar<_Tp>::value> struct __transform {typedef _Tp type;}; 989template <class _Tp> struct __transform<_Tp, 1, true> {typedef unsigned char type;}; 990template <class _Tp> struct __transform<_Tp, 2, true> {typedef unsigned short type;}; 991template <class _Tp> struct __transform<_Tp, 4, true> {typedef unsigned int type;}; 992template <class _Tp> struct __transform<_Tp, 8, true> {typedef unsigned long long type;}; 993 994#endif // _LIBCPP_STORE_AS_OPTIMIZATION 995 996// make_signed / make_unsigned 997 998typedef 999 __type_list<signed char, 1000 __type_list<signed short, 1001 __type_list<signed int, 1002 __type_list<signed long, 1003 __type_list<signed long long, 1004 __nat 1005 > > > > > __signed_types; 1006 1007typedef 1008 __type_list<unsigned char, 1009 __type_list<unsigned short, 1010 __type_list<unsigned int, 1011 __type_list<unsigned long, 1012 __type_list<unsigned long long, 1013 __nat 1014 > > > > > __unsigned_types; 1015 1016template <class _TypeList, size_t _Size, bool = _Size <= sizeof(typename _TypeList::_Head)> struct __find_first; 1017 1018template <class _Hp, class _Tp, size_t _Size> 1019struct __find_first<__type_list<_Hp, _Tp>, _Size, true> 1020{ 1021 typedef _Hp type; 1022}; 1023 1024template <class _Hp, class _Tp, size_t _Size> 1025struct __find_first<__type_list<_Hp, _Tp>, _Size, false> 1026{ 1027 typedef typename __find_first<_Tp, _Size>::type type; 1028}; 1029 1030template <class _Tp, class _Up, bool = is_const<typename remove_reference<_Tp>::type>::value, 1031 bool = is_volatile<typename remove_reference<_Tp>::type>::value> 1032struct __apply_cv 1033{ 1034 typedef _Up type; 1035}; 1036 1037template <class _Tp, class _Up> 1038struct __apply_cv<_Tp, _Up, true, false> 1039{ 1040 typedef const _Up type; 1041}; 1042 1043template <class _Tp, class _Up> 1044struct __apply_cv<_Tp, _Up, false, true> 1045{ 1046 typedef volatile _Up type; 1047}; 1048 1049template <class _Tp, class _Up> 1050struct __apply_cv<_Tp, _Up, true, true> 1051{ 1052 typedef const volatile _Up type; 1053}; 1054 1055template <class _Tp, class _Up> 1056struct __apply_cv<_Tp&, _Up, false, false> 1057{ 1058 typedef _Up& type; 1059}; 1060 1061template <class _Tp, class _Up> 1062struct __apply_cv<_Tp&, _Up, true, false> 1063{ 1064 typedef const _Up& type; 1065}; 1066 1067template <class _Tp, class _Up> 1068struct __apply_cv<_Tp&, _Up, false, true> 1069{ 1070 typedef volatile _Up& type; 1071}; 1072 1073template <class _Tp, class _Up> 1074struct __apply_cv<_Tp&, _Up, true, true> 1075{ 1076 typedef const volatile _Up& type; 1077}; 1078 1079template <class _Tp, bool = is_integral<_Tp>::value || is_enum<_Tp>::value> 1080struct __make_signed {}; 1081 1082template <class _Tp> 1083struct __make_signed<_Tp, true> 1084{ 1085 typedef typename __find_first<__signed_types, sizeof(_Tp)>::type type; 1086}; 1087 1088template <> struct __make_signed<bool, true> {}; 1089template <> struct __make_signed< signed short, true> {typedef short type;}; 1090template <> struct __make_signed<unsigned short, true> {typedef short type;}; 1091template <> struct __make_signed< signed int, true> {typedef int type;}; 1092template <> struct __make_signed<unsigned int, true> {typedef int type;}; 1093template <> struct __make_signed< signed long, true> {typedef long type;}; 1094template <> struct __make_signed<unsigned long, true> {typedef long type;}; 1095template <> struct __make_signed< signed long long, true> {typedef long long type;}; 1096template <> struct __make_signed<unsigned long long, true> {typedef long long type;}; 1097 1098template <class _Tp> 1099struct _LIBCPP_VISIBLE make_signed 1100{ 1101 typedef typename __apply_cv<_Tp, typename __make_signed<typename remove_cv<_Tp>::type>::type>::type type; 1102}; 1103 1104template <class _Tp, bool = is_integral<_Tp>::value || is_enum<_Tp>::value> 1105struct __make_unsigned {}; 1106 1107template <class _Tp> 1108struct __make_unsigned<_Tp, true> 1109{ 1110 typedef typename __find_first<__unsigned_types, sizeof(_Tp)>::type type; 1111}; 1112 1113template <> struct __make_unsigned<bool, true> {}; 1114template <> struct __make_unsigned< signed short, true> {typedef unsigned short type;}; 1115template <> struct __make_unsigned<unsigned short, true> {typedef unsigned short type;}; 1116template <> struct __make_unsigned< signed int, true> {typedef unsigned int type;}; 1117template <> struct __make_unsigned<unsigned int, true> {typedef unsigned int type;}; 1118template <> struct __make_unsigned< signed long, true> {typedef unsigned long type;}; 1119template <> struct __make_unsigned<unsigned long, true> {typedef unsigned long type;}; 1120template <> struct __make_unsigned< signed long long, true> {typedef unsigned long long type;}; 1121template <> struct __make_unsigned<unsigned long long, true> {typedef unsigned long long type;}; 1122 1123template <class _Tp> 1124struct _LIBCPP_VISIBLE make_unsigned 1125{ 1126 typedef typename __apply_cv<_Tp, typename __make_unsigned<typename remove_cv<_Tp>::type>::type>::type type; 1127}; 1128 1129#ifdef _LIBCPP_HAS_NO_VARIADICS 1130 1131template <class _Tp, class _Up = void, class V = void> 1132struct _LIBCPP_VISIBLE common_type 1133{ 1134public: 1135 typedef typename common_type<typename common_type<_Tp, _Up>::type, V>::type type; 1136}; 1137 1138template <class _Tp> 1139struct _LIBCPP_VISIBLE common_type<_Tp, void, void> 1140{ 1141public: 1142 typedef _Tp type; 1143}; 1144 1145template <class _Tp, class _Up> 1146struct _LIBCPP_VISIBLE common_type<_Tp, _Up, void> 1147{ 1148private: 1149#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1150 static _Tp&& __t(); 1151 static _Up&& __u(); 1152#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 1153 static _Tp __t(); 1154 static _Up __u(); 1155#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 1156public: 1157 typedef typename remove_reference<decltype(true ? __t() : __u())>::type type; 1158}; 1159 1160#else // _LIBCPP_HAS_NO_VARIADICS 1161 1162template <class ..._Tp> struct common_type; 1163 1164template <class _Tp> 1165struct _LIBCPP_VISIBLE common_type<_Tp> 1166{ 1167 typedef _Tp type; 1168}; 1169 1170template <class _Tp, class _Up> 1171struct _LIBCPP_VISIBLE common_type<_Tp, _Up> 1172{ 1173private: 1174 static _Tp&& __t(); 1175 static _Up&& __u(); 1176 static bool __f(); 1177public: 1178 typedef typename remove_reference<decltype(__f() ? __t() : __u())>::type type; 1179}; 1180 1181template <class _Tp, class _Up, class ..._Vp> 1182struct _LIBCPP_VISIBLE common_type<_Tp, _Up, _Vp...> 1183{ 1184 typedef typename common_type<typename common_type<_Tp, _Up>::type, _Vp...>::type type; 1185}; 1186 1187#endif // _LIBCPP_HAS_NO_VARIADICS 1188 1189// is_assignable 1190 1191template <class _Tp, class _Arg> 1192decltype((_VSTD::declval<_Tp>() = _VSTD::declval<_Arg>(), true_type())) 1193#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1194__is_assignable_test(_Tp&&, _Arg&&); 1195#else 1196__is_assignable_test(_Tp, _Arg&); 1197#endif 1198 1199template <class _Arg> 1200false_type 1201#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1202__is_assignable_test(__any, _Arg&&); 1203#else 1204__is_assignable_test(__any, _Arg&); 1205#endif 1206 1207template <class _Tp, class _Arg, bool = is_void<_Tp>::value || is_void<_Arg>::value> 1208struct __is_assignable_imp 1209 : public common_type 1210 < 1211 decltype(__is_assignable_test(declval<_Tp>(), declval<_Arg>())) 1212 >::type {}; 1213 1214template <class _Tp, class _Arg> 1215struct __is_assignable_imp<_Tp, _Arg, true> 1216 : public false_type 1217{ 1218}; 1219 1220template <class _Tp, class _Arg> 1221struct is_assignable 1222 : public __is_assignable_imp<_Tp, _Arg> {}; 1223 1224// is_copy_assignable 1225 1226template <class _Tp> struct _LIBCPP_VISIBLE is_copy_assignable 1227 : public is_assignable<typename add_lvalue_reference<_Tp>::type, 1228 const typename add_lvalue_reference<_Tp>::type> {}; 1229 1230// is_move_assignable 1231 1232template <class _Tp> struct _LIBCPP_VISIBLE is_move_assignable 1233#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1234 : public is_assignable<typename add_lvalue_reference<_Tp>::type, 1235 const typename add_rvalue_reference<_Tp>::type> {}; 1236#else 1237 : public is_copy_assignable<_Tp> {}; 1238#endif 1239 1240// is_destructible 1241 1242template <class _Tp> 1243struct __destructible_test 1244{ 1245 _Tp __t; 1246}; 1247 1248template <class _Tp> 1249decltype((_VSTD::declval<__destructible_test<_Tp> >().~__destructible_test<_Tp>(), true_type())) 1250#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1251__is_destructible_test(_Tp&&); 1252#else 1253__is_destructible_test(_Tp&); 1254#endif 1255 1256false_type 1257__is_destructible_test(__any); 1258 1259template <class _Tp, bool = is_void<_Tp>::value || is_abstract<_Tp>::value> 1260struct __destructible_imp 1261 : public common_type 1262 < 1263 decltype(__is_destructible_test(declval<_Tp>())) 1264 >::type {}; 1265 1266template <class _Tp> 1267struct __destructible_imp<_Tp, true> 1268 : public false_type {}; 1269 1270template <class _Tp> 1271struct is_destructible 1272 : public __destructible_imp<_Tp> {}; 1273 1274// move 1275 1276#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1277 1278template <class _Tp> 1279inline _LIBCPP_INLINE_VISIBILITY 1280typename remove_reference<_Tp>::type&& 1281move(_Tp&& __t) _NOEXCEPT 1282{ 1283 typedef typename remove_reference<_Tp>::type _Up; 1284 return static_cast<_Up&&>(__t); 1285} 1286 1287template <class _Tp> 1288inline _LIBCPP_INLINE_VISIBILITY 1289_Tp&& 1290forward(typename std::remove_reference<_Tp>::type& __t) _NOEXCEPT 1291{ 1292 return static_cast<_Tp&&>(__t); 1293} 1294 1295template <class _Tp> 1296inline _LIBCPP_INLINE_VISIBILITY 1297_Tp&& 1298forward(typename std::remove_reference<_Tp>::type&& __t) _NOEXCEPT 1299{ 1300 static_assert(!std::is_lvalue_reference<_Tp>::value, 1301 "Can not forward an rvalue as an lvalue."); 1302 return static_cast<_Tp&&>(__t); 1303} 1304 1305#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 1306 1307template <class _Tp> 1308class __rv 1309{ 1310 typedef typename remove_reference<_Tp>::type _Trr; 1311 _Trr& t_; 1312public: 1313 _LIBCPP_INLINE_VISIBILITY 1314 _Trr* operator->() {return &t_;} 1315 _LIBCPP_INLINE_VISIBILITY 1316 explicit __rv(_Trr& __t) : t_(__t) {} 1317}; 1318 1319template <class _Tp> 1320inline _LIBCPP_INLINE_VISIBILITY 1321typename enable_if 1322< 1323 !is_convertible<_Tp, __rv<_Tp> >::value, 1324 _Tp& 1325>::type 1326move(_Tp& __t) 1327{ 1328 return __t; 1329} 1330 1331template <class _Tp> 1332inline _LIBCPP_INLINE_VISIBILITY 1333typename enable_if 1334< 1335 !is_convertible<_Tp, __rv<_Tp> >::value, 1336 const _Tp& 1337>::type 1338move(const _Tp& __t) 1339{ 1340 return __t; 1341} 1342 1343template <class _Tp> 1344inline _LIBCPP_INLINE_VISIBILITY 1345typename enable_if 1346< 1347 is_convertible<_Tp, __rv<_Tp> >::value, 1348 _Tp 1349>::type 1350move(_Tp& __t) 1351{ 1352 return _Tp(__rv<_Tp>(__t)); 1353} 1354 1355template <class _Tp, class _Up> 1356inline _LIBCPP_INLINE_VISIBILITY 1357typename enable_if 1358< 1359 !is_convertible<_Tp, __rv<_Tp> >::value, 1360 typename add_lvalue_reference<_Tp>::type 1361>::type 1362forward(_Up& __t) 1363{ 1364 return __t; 1365} 1366 1367template <class _Tp, class _Up> 1368inline _LIBCPP_INLINE_VISIBILITY 1369typename enable_if 1370< 1371 !is_convertible<_Tp, __rv<_Tp> >::value, 1372 typename add_lvalue_reference<_Tp>::type 1373>::type 1374forward(const _Up& __t) 1375{ 1376 return __t; 1377} 1378 1379template <class _Tp, class _Up> 1380inline _LIBCPP_INLINE_VISIBILITY 1381typename enable_if 1382< 1383 is_convertible<_Tp, __rv<_Tp> >::value, 1384 _Tp 1385>::type 1386forward(_Up& __t) 1387{ 1388 return _Tp(__rv<_Tp>(__t)); 1389} 1390 1391template <class _Tp, class _Up> 1392inline _LIBCPP_INLINE_VISIBILITY 1393typename enable_if 1394< 1395 is_convertible<_Tp, __rv<_Tp> >::value, 1396 _Tp 1397>::type 1398forward(const _Up& __t) 1399{ 1400 return _Tp(__rv<_Tp>(__t)); 1401} 1402 1403#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 1404 1405template <class _Tp> 1406struct _LIBCPP_VISIBLE decay 1407{ 1408private: 1409 typedef typename remove_reference<_Tp>::type _Up; 1410public: 1411 typedef typename conditional 1412 < 1413 is_array<_Up>::value, 1414 typename remove_extent<_Up>::type*, 1415 typename conditional 1416 < 1417 is_function<_Up>::value, 1418 typename add_pointer<_Up>::type, 1419 typename remove_cv<_Up>::type 1420 >::type 1421 >::type type; 1422}; 1423 1424#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1425 1426template <class _Tp> 1427inline _LIBCPP_INLINE_VISIBILITY 1428typename decay<_Tp>::type 1429__decay_copy(_Tp&& __t) 1430{ 1431 return _VSTD::forward<_Tp>(__t); 1432} 1433 1434#else 1435 1436template <class _Tp> 1437inline _LIBCPP_INLINE_VISIBILITY 1438typename decay<_Tp>::type 1439__decay_copy(const _Tp& __t) 1440{ 1441 return _VSTD::forward<_Tp>(__t); 1442} 1443 1444#endif 1445 1446template <class _MP, bool _IsMemberFuctionPtr, bool _IsMemberObjectPtr> 1447struct __member_pointer_traits_imp 1448{ 1449}; 1450 1451#ifndef _LIBCPP_HAS_NO_VARIADICS 1452 1453template <class _Rp, class _Class, class ..._Param> 1454struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...), true, false> 1455{ 1456 typedef _Class _ClassType; 1457 typedef _Rp _ReturnType; 1458}; 1459 1460template <class _Rp, class _Class, class ..._Param> 1461struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const, true, false> 1462{ 1463 typedef _Class const _ClassType; 1464 typedef _Rp _ReturnType; 1465}; 1466 1467template <class _Rp, class _Class, class ..._Param> 1468struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) volatile, true, false> 1469{ 1470 typedef _Class volatile _ClassType; 1471 typedef _Rp _ReturnType; 1472}; 1473 1474template <class _Rp, class _Class, class ..._Param> 1475struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const volatile, true, false> 1476{ 1477 typedef _Class const volatile _ClassType; 1478 typedef _Rp _ReturnType; 1479}; 1480 1481#if __has_feature(cxx_reference_qualified_functions) 1482 1483template <class _Rp, class _Class, class ..._Param> 1484struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) &, true, false> 1485{ 1486 typedef _Class& _ClassType; 1487 typedef _Rp _ReturnType; 1488}; 1489 1490template <class _Rp, class _Class, class ..._Param> 1491struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const&, true, false> 1492{ 1493 typedef _Class const& _ClassType; 1494 typedef _Rp _ReturnType; 1495}; 1496 1497template <class _Rp, class _Class, class ..._Param> 1498struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) volatile&, true, false> 1499{ 1500 typedef _Class volatile& _ClassType; 1501 typedef _Rp _ReturnType; 1502}; 1503 1504template <class _Rp, class _Class, class ..._Param> 1505struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const volatile&, true, false> 1506{ 1507 typedef _Class const volatile& _ClassType; 1508 typedef _Rp _ReturnType; 1509}; 1510 1511template <class _Rp, class _Class, class ..._Param> 1512struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) &&, true, false> 1513{ 1514 typedef _Class&& _ClassType; 1515 typedef _Rp _ReturnType; 1516}; 1517 1518template <class _Rp, class _Class, class ..._Param> 1519struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const&&, true, false> 1520{ 1521 typedef _Class const&& _ClassType; 1522 typedef _Rp _ReturnType; 1523}; 1524 1525template <class _Rp, class _Class, class ..._Param> 1526struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) volatile&&, true, false> 1527{ 1528 typedef _Class volatile&& _ClassType; 1529 typedef _Rp _ReturnType; 1530}; 1531 1532template <class _Rp, class _Class, class ..._Param> 1533struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const volatile&&, true, false> 1534{ 1535 typedef _Class const volatile&& _ClassType; 1536 typedef _Rp _ReturnType; 1537}; 1538 1539#endif // __has_feature(cxx_reference_qualified_functions) 1540 1541#else // _LIBCPP_HAS_NO_VARIADICS 1542 1543template <class _Rp, class _Class> 1544struct __member_pointer_traits_imp<_Rp (_Class::*)(), true, false> 1545{ 1546 typedef _Class _ClassType; 1547 typedef _Rp _ReturnType; 1548}; 1549 1550template <class _Rp, class _Class, class _P0> 1551struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0), true, false> 1552{ 1553 typedef _Class _ClassType; 1554 typedef _Rp _ReturnType; 1555}; 1556 1557template <class _Rp, class _Class, class _P0, class _P1> 1558struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1), true, false> 1559{ 1560 typedef _Class _ClassType; 1561 typedef _Rp _ReturnType; 1562}; 1563 1564template <class _Rp, class _Class, class _P0, class _P1, class _P2> 1565struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2), true, false> 1566{ 1567 typedef _Class _ClassType; 1568 typedef _Rp _ReturnType; 1569}; 1570 1571template <class _Rp, class _Class> 1572struct __member_pointer_traits_imp<_Rp (_Class::*)() const, true, false> 1573{ 1574 typedef _Class const _ClassType; 1575 typedef _Rp _ReturnType; 1576}; 1577 1578template <class _Rp, class _Class, class _P0> 1579struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0) const, true, false> 1580{ 1581 typedef _Class const _ClassType; 1582 typedef _Rp _ReturnType; 1583}; 1584 1585template <class _Rp, class _Class, class _P0, class _P1> 1586struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1) const, true, false> 1587{ 1588 typedef _Class const _ClassType; 1589 typedef _Rp _ReturnType; 1590}; 1591 1592template <class _Rp, class _Class, class _P0, class _P1, class _P2> 1593struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2) const, true, false> 1594{ 1595 typedef _Class const _ClassType; 1596 typedef _Rp _ReturnType; 1597}; 1598 1599template <class _Rp, class _Class> 1600struct __member_pointer_traits_imp<_Rp (_Class::*)() volatile, true, false> 1601{ 1602 typedef _Class volatile _ClassType; 1603 typedef _Rp _ReturnType; 1604}; 1605 1606template <class _Rp, class _Class, class _P0> 1607struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0) volatile, true, false> 1608{ 1609 typedef _Class volatile _ClassType; 1610 typedef _Rp _ReturnType; 1611}; 1612 1613template <class _Rp, class _Class, class _P0, class _P1> 1614struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1) volatile, true, false> 1615{ 1616 typedef _Class volatile _ClassType; 1617 typedef _Rp _ReturnType; 1618}; 1619 1620template <class _Rp, class _Class, class _P0, class _P1, class _P2> 1621struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2) volatile, true, false> 1622{ 1623 typedef _Class volatile _ClassType; 1624 typedef _Rp _ReturnType; 1625}; 1626 1627template <class _Rp, class _Class> 1628struct __member_pointer_traits_imp<_Rp (_Class::*)() const volatile, true, false> 1629{ 1630 typedef _Class const volatile _ClassType; 1631 typedef _Rp _ReturnType; 1632}; 1633 1634template <class _Rp, class _Class, class _P0> 1635struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0) const volatile, true, false> 1636{ 1637 typedef _Class const volatile _ClassType; 1638 typedef _Rp _ReturnType; 1639}; 1640 1641template <class _Rp, class _Class, class _P0, class _P1> 1642struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1) const volatile, true, false> 1643{ 1644 typedef _Class const volatile _ClassType; 1645 typedef _Rp _ReturnType; 1646}; 1647 1648template <class _Rp, class _Class, class _P0, class _P1, class _P2> 1649struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2) const volatile, true, false> 1650{ 1651 typedef _Class const volatile _ClassType; 1652 typedef _Rp _ReturnType; 1653}; 1654 1655#endif // _LIBCPP_HAS_NO_VARIADICS 1656 1657template <class _Rp, class _Class> 1658struct __member_pointer_traits_imp<_Rp _Class::*, false, true> 1659{ 1660 typedef _Class _ClassType; 1661 typedef _Rp _ReturnType; 1662}; 1663 1664template <class _MP> 1665struct __member_pointer_traits 1666 : public __member_pointer_traits_imp<_MP, 1667 is_member_function_pointer<_MP>::value, 1668 is_member_object_pointer<_MP>::value> 1669{ 1670// typedef ... _ClassType; 1671// typedef ... _ReturnType; 1672}; 1673 1674// result_of 1675 1676template <class _Callable> class result_of; 1677 1678template <class _Fn, bool, bool> 1679class __result_of 1680{ 1681}; 1682 1683#ifndef _LIBCPP_HAS_NO_VARIADICS 1684 1685template <class _Fn, class ..._ArgTypes> 1686class __result_of<_Fn(_ArgTypes...), true, false> 1687{ 1688public: 1689 typedef decltype(declval<_Fn>()(declval<_ArgTypes>()...)) type; 1690}; 1691 1692template <class _MP, class _Tp, bool _IsMemberFunctionPtr> 1693struct __result_of_mp; 1694 1695// member function pointer 1696 1697template <class _MP, class _Tp> 1698struct __result_of_mp<_MP, _Tp, true> 1699 : public common_type<typename __member_pointer_traits<_MP>::_ReturnType> 1700{ 1701}; 1702 1703// member data pointer 1704 1705template <class _MP, class _Tp, bool> 1706struct __result_of_mdp; 1707 1708template <class _Rp, class _Class, class _Tp> 1709struct __result_of_mdp<_Rp _Class::*, _Tp, false> 1710{ 1711 typedef typename __apply_cv<decltype(*_VSTD::declval<_Tp>()), _Rp>::type&& type; 1712}; 1713 1714template <class _Rp, class _Class, class _Tp> 1715struct __result_of_mdp<_Rp _Class::*, _Tp, true> 1716{ 1717 typedef typename __apply_cv<_Tp, _Rp>::type&& type; 1718}; 1719 1720template <class _Rp, class _Class, class _Tp> 1721struct __result_of_mp<_Rp _Class::*, _Tp, false> 1722 : public __result_of_mdp<_Rp _Class::*, _Tp, 1723 is_base_of<_Class, typename remove_reference<_Tp>::type>::value> 1724{ 1725}; 1726 1727template <class _Fn, class _Tp, class ..._ArgTypes> 1728class __result_of<_Fn(_Tp, _ArgTypes...), false, true> // _Fn must be member pointer 1729 : public __result_of_mp<typename remove_reference<_Fn>::type, 1730 _Tp, 1731 is_member_function_pointer<typename remove_reference<_Fn>::type>::value> 1732{ 1733}; 1734 1735// result_of 1736 1737template <class _Fn, class ..._ArgTypes> 1738class _LIBCPP_VISIBLE result_of<_Fn(_ArgTypes...)> 1739 : public __result_of<_Fn(_ArgTypes...), 1740 is_class<typename remove_reference<_Fn>::type>::value || 1741 is_function<typename remove_reference<_Fn>::type>::value, 1742 is_member_pointer<typename remove_reference<_Fn>::type>::value 1743 > 1744{ 1745}; 1746 1747#else // _LIBCPP_HAS_NO_VARIADICS 1748 1749template <class _Fn> 1750class __result_of<_Fn(), true, false> 1751{ 1752public: 1753 typedef decltype(declval<_Fn>()()) type; 1754}; 1755 1756template <class _Fn, class _A0> 1757class __result_of<_Fn(_A0), true, false> 1758{ 1759public: 1760 typedef decltype(declval<_Fn>()(declval<_A0>())) type; 1761}; 1762 1763template <class _Fn, class _A0, class _A1> 1764class __result_of<_Fn(_A0, _A1), true, false> 1765{ 1766public: 1767 typedef decltype(declval<_Fn>()(declval<_A0>(), declval<_A1>())) type; 1768}; 1769 1770template <class _Fn, class _A0, class _A1, class _A2> 1771class __result_of<_Fn(_A0, _A1, _A2), true, false> 1772{ 1773public: 1774 typedef decltype(declval<_Fn>()(declval<_A0>(), declval<_A1>(), declval<_A2>())) type; 1775}; 1776 1777template <class _MP, class _Tp, bool _IsMemberFunctionPtr> 1778struct __result_of_mp; 1779 1780// member function pointer 1781 1782template <class _MP, class _Tp> 1783struct __result_of_mp<_MP, _Tp, true> 1784 : public common_type<typename __member_pointer_traits<_MP>::_ReturnType> 1785{ 1786}; 1787 1788// member data pointer 1789 1790template <class _MP, class _Tp, bool> 1791struct __result_of_mdp; 1792 1793template <class _Rp, class _Class, class _Tp> 1794struct __result_of_mdp<_Rp _Class::*, _Tp, false> 1795{ 1796 typedef typename __apply_cv<decltype(*_VSTD::declval<_Tp>()), _Rp>::type& type; 1797}; 1798 1799template <class _Rp, class _Class, class _Tp> 1800struct __result_of_mdp<_Rp _Class::*, _Tp, true> 1801{ 1802 typedef typename __apply_cv<_Tp, _Rp>::type& type; 1803}; 1804 1805template <class _Rp, class _Class, class _Tp> 1806struct __result_of_mp<_Rp _Class::*, _Tp, false> 1807 : public __result_of_mdp<_Rp _Class::*, _Tp, 1808 is_base_of<_Class, typename remove_reference<_Tp>::type>::value> 1809{ 1810}; 1811 1812 1813 1814template <class _Fn, class _Tp> 1815class __result_of<_Fn(_Tp), false, true> // _Fn must be member pointer 1816 : public __result_of_mp<typename remove_reference<_Fn>::type, 1817 _Tp, 1818 is_member_function_pointer<typename remove_reference<_Fn>::type>::value> 1819{ 1820}; 1821 1822template <class _Fn, class _Tp, class _A0> 1823class __result_of<_Fn(_Tp, _A0), false, true> // _Fn must be member pointer 1824 : public __result_of_mp<typename remove_reference<_Fn>::type, 1825 _Tp, 1826 is_member_function_pointer<typename remove_reference<_Fn>::type>::value> 1827{ 1828}; 1829 1830template <class _Fn, class _Tp, class _A0, class _A1> 1831class __result_of<_Fn(_Tp, _A0, _A1), false, true> // _Fn must be member pointer 1832 : public __result_of_mp<typename remove_reference<_Fn>::type, 1833 _Tp, 1834 is_member_function_pointer<typename remove_reference<_Fn>::type>::value> 1835{ 1836}; 1837 1838template <class _Fn, class _Tp, class _A0, class _A1, class _A2> 1839class __result_of<_Fn(_Tp, _A0, _A1, _A2), false, true> // _Fn must be member pointer 1840 : public __result_of_mp<typename remove_reference<_Fn>::type, 1841 _Tp, 1842 is_member_function_pointer<typename remove_reference<_Fn>::type>::value> 1843{ 1844}; 1845 1846// result_of 1847 1848template <class _Fn> 1849class _LIBCPP_VISIBLE result_of<_Fn()> 1850 : public __result_of<_Fn(), 1851 is_class<typename remove_reference<_Fn>::type>::value || 1852 is_function<typename remove_reference<_Fn>::type>::value, 1853 is_member_pointer<typename remove_reference<_Fn>::type>::value 1854 > 1855{ 1856}; 1857 1858template <class _Fn, class _A0> 1859class _LIBCPP_VISIBLE result_of<_Fn(_A0)> 1860 : public __result_of<_Fn(_A0), 1861 is_class<typename remove_reference<_Fn>::type>::value || 1862 is_function<typename remove_reference<_Fn>::type>::value, 1863 is_member_pointer<typename remove_reference<_Fn>::type>::value 1864 > 1865{ 1866}; 1867 1868template <class _Fn, class _A0, class _A1> 1869class _LIBCPP_VISIBLE result_of<_Fn(_A0, _A1)> 1870 : public __result_of<_Fn(_A0, _A1), 1871 is_class<typename remove_reference<_Fn>::type>::value || 1872 is_function<typename remove_reference<_Fn>::type>::value, 1873 is_member_pointer<typename remove_reference<_Fn>::type>::value 1874 > 1875{ 1876}; 1877 1878template <class _Fn, class _A0, class _A1, class _A2> 1879class _LIBCPP_VISIBLE result_of<_Fn(_A0, _A1, _A2)> 1880 : public __result_of<_Fn(_A0, _A1, _A2), 1881 is_class<typename remove_reference<_Fn>::type>::value || 1882 is_function<typename remove_reference<_Fn>::type>::value, 1883 is_member_pointer<typename remove_reference<_Fn>::type>::value 1884 > 1885{ 1886}; 1887 1888#endif // _LIBCPP_HAS_NO_VARIADICS 1889 1890#ifndef _LIBCPP_HAS_NO_VARIADICS 1891 1892// template <class T, class... Args> struct is_constructible; 1893 1894// main is_constructible test 1895 1896template <class _Tp, class ..._Args> 1897decltype(_VSTD::move(_Tp(_VSTD::declval<_Args>()...)), true_type()) 1898__is_constructible_test(_Tp&&, _Args&& ...); 1899 1900template <class ..._Args> 1901false_type 1902__is_constructible_test(__any, _Args&& ...); 1903 1904template <bool, class _Tp, class... _Args> 1905struct __is_constructible // false, _Tp is not a scalar 1906 : public common_type 1907 < 1908 decltype(__is_constructible_test(declval<_Tp>(), declval<_Args>()...)) 1909 >::type 1910 {}; 1911 1912// function types are not constructible 1913 1914template <class _Rp, class... _A1, class... _A2> 1915struct __is_constructible<false, _Rp(_A1...), _A2...> 1916 : public false_type 1917 {}; 1918 1919// handle scalars and reference types 1920 1921// Scalars are default constructible, references are not 1922 1923template <class _Tp> 1924struct __is_constructible<true, _Tp> 1925 : public is_scalar<_Tp> 1926 {}; 1927 1928// Scalars and references are constructible from one arg if that arg is 1929// implicitly convertible to the scalar or reference. 1930 1931template <class _Tp> 1932struct __is_constructible_ref 1933{ 1934 true_type static __(_Tp); 1935 false_type static __(...); 1936}; 1937 1938template <class _Tp, class _A0> 1939struct __is_constructible<true, _Tp, _A0> 1940 : public common_type 1941 < 1942 decltype(__is_constructible_ref<_Tp>::__(declval<_A0>())) 1943 >::type 1944 {}; 1945 1946// Scalars and references are not constructible from multiple args. 1947 1948template <class _Tp, class _A0, class ..._Args> 1949struct __is_constructible<true, _Tp, _A0, _Args...> 1950 : public false_type 1951 {}; 1952 1953// Treat scalars and reference types separately 1954 1955template <bool, class _Tp, class... _Args> 1956struct __is_constructible_void_check 1957 : public __is_constructible<is_scalar<_Tp>::value || is_reference<_Tp>::value, 1958 _Tp, _Args...> 1959 {}; 1960 1961// If any of T or Args is void, is_constructible should be false 1962 1963template <class _Tp, class... _Args> 1964struct __is_constructible_void_check<true, _Tp, _Args...> 1965 : public false_type 1966 {}; 1967 1968template <class ..._Args> struct __contains_void; 1969 1970template <> struct __contains_void<> : false_type {}; 1971 1972template <class _A0, class ..._Args> 1973struct __contains_void<_A0, _Args...> 1974{ 1975 static const bool value = is_void<_A0>::value || 1976 __contains_void<_Args...>::value; 1977}; 1978 1979// is_constructible entry point 1980 1981template <class _Tp, class... _Args> 1982struct _LIBCPP_VISIBLE is_constructible 1983 : public __is_constructible_void_check<__contains_void<_Tp, _Args...>::value 1984 || is_abstract<_Tp>::value, 1985 _Tp, _Args...> 1986 {}; 1987 1988// Array types are default constructible if their element type 1989// is default constructible 1990 1991template <class _Ap, size_t _Np> 1992struct __is_constructible<false, _Ap[_Np]> 1993 : public is_constructible<typename remove_all_extents<_Ap>::type> 1994 {}; 1995 1996// Otherwise array types are not constructible by this syntax 1997 1998template <class _Ap, size_t _Np, class ..._Args> 1999struct __is_constructible<false, _Ap[_Np], _Args...> 2000 : public false_type 2001 {}; 2002 2003// Incomplete array types are not constructible 2004 2005template <class _Ap, class ..._Args> 2006struct __is_constructible<false, _Ap[], _Args...> 2007 : public false_type 2008 {}; 2009 2010#else // _LIBCPP_HAS_NO_VARIADICS 2011 2012// template <class T> struct is_constructible0; 2013 2014// main is_constructible0 test 2015 2016template <class _Tp> 2017decltype((_Tp(), true_type())) 2018__is_constructible0_test(_Tp&); 2019 2020false_type 2021__is_constructible0_test(__any); 2022 2023template <class _Tp, class _A0> 2024decltype((_Tp(_VSTD::declval<_A0>()), true_type())) 2025__is_constructible1_test(_Tp&, _A0&); 2026 2027template <class _A0> 2028false_type 2029__is_constructible1_test(__any, _A0&); 2030 2031template <class _Tp, class _A0, class _A1> 2032decltype((_Tp(_VSTD::declval<_A0>(), _VSTD::declval<_A1>()), true_type())) 2033__is_constructible2_test(_Tp&, _A0&, _A1&); 2034 2035template <class _A0, class _A1> 2036false_type 2037__is_constructible2_test(__any, _A0&, _A1&); 2038 2039template <bool, class _Tp> 2040struct __is_constructible0_imp // false, _Tp is not a scalar 2041 : public common_type 2042 < 2043 decltype(__is_constructible0_test(declval<_Tp&>())) 2044 >::type 2045 {}; 2046 2047template <bool, class _Tp, class _A0> 2048struct __is_constructible1_imp // false, _Tp is not a scalar 2049 : public common_type 2050 < 2051 decltype(__is_constructible1_test(declval<_Tp&>(), declval<_A0&>())) 2052 >::type 2053 {}; 2054 2055template <bool, class _Tp, class _A0, class _A1> 2056struct __is_constructible2_imp // false, _Tp is not a scalar 2057 : public common_type 2058 < 2059 decltype(__is_constructible2_test(declval<_Tp&>(), declval<_A0>(), declval<_A1>())) 2060 >::type 2061 {}; 2062 2063// handle scalars and reference types 2064 2065// Scalars are default constructible, references are not 2066 2067template <class _Tp> 2068struct __is_constructible0_imp<true, _Tp> 2069 : public is_scalar<_Tp> 2070 {}; 2071 2072template <class _Tp, class _A0> 2073struct __is_constructible1_imp<true, _Tp, _A0> 2074 : public is_convertible<_A0, _Tp> 2075 {}; 2076 2077template <class _Tp, class _A0, class _A1> 2078struct __is_constructible2_imp<true, _Tp, _A0, _A1> 2079 : public false_type 2080 {}; 2081 2082// Treat scalars and reference types separately 2083 2084template <bool, class _Tp> 2085struct __is_constructible0_void_check 2086 : public __is_constructible0_imp<is_scalar<_Tp>::value || is_reference<_Tp>::value, 2087 _Tp> 2088 {}; 2089 2090template <bool, class _Tp, class _A0> 2091struct __is_constructible1_void_check 2092 : public __is_constructible1_imp<is_scalar<_Tp>::value || is_reference<_Tp>::value, 2093 _Tp, _A0> 2094 {}; 2095 2096template <bool, class _Tp, class _A0, class _A1> 2097struct __is_constructible2_void_check 2098 : public __is_constructible2_imp<is_scalar<_Tp>::value || is_reference<_Tp>::value, 2099 _Tp, _A0, _A1> 2100 {}; 2101 2102// If any of T or Args is void, is_constructible should be false 2103 2104template <class _Tp> 2105struct __is_constructible0_void_check<true, _Tp> 2106 : public false_type 2107 {}; 2108 2109template <class _Tp, class _A0> 2110struct __is_constructible1_void_check<true, _Tp, _A0> 2111 : public false_type 2112 {}; 2113 2114template <class _Tp, class _A0, class _A1> 2115struct __is_constructible2_void_check<true, _Tp, _A0, _A1> 2116 : public false_type 2117 {}; 2118 2119// is_constructible entry point 2120 2121namespace __is_construct 2122{ 2123 2124struct __nat {}; 2125 2126} 2127 2128template <class _Tp, class _A0 = __is_construct::__nat, 2129 class _A1 = __is_construct::__nat> 2130struct _LIBCPP_VISIBLE is_constructible 2131 : public __is_constructible2_void_check<is_void<_Tp>::value 2132 || is_abstract<_Tp>::value 2133 || is_function<_Tp>::value 2134 || is_void<_A0>::value 2135 || is_void<_A1>::value, 2136 _Tp, _A0, _A1> 2137 {}; 2138 2139template <class _Tp> 2140struct _LIBCPP_VISIBLE is_constructible<_Tp, __is_construct::__nat, __is_construct::__nat> 2141 : public __is_constructible0_void_check<is_void<_Tp>::value 2142 || is_abstract<_Tp>::value 2143 || is_function<_Tp>::value, 2144 _Tp> 2145 {}; 2146 2147template <class _Tp, class _A0> 2148struct _LIBCPP_VISIBLE is_constructible<_Tp, _A0, __is_construct::__nat> 2149 : public __is_constructible1_void_check<is_void<_Tp>::value 2150 || is_abstract<_Tp>::value 2151 || is_function<_Tp>::value 2152 || is_void<_A0>::value, 2153 _Tp, _A0> 2154 {}; 2155 2156// Array types are default constructible if their element type 2157// is default constructible 2158 2159template <class _Ap, size_t _Np> 2160struct __is_constructible0_imp<false, _Ap[_Np]> 2161 : public is_constructible<typename remove_all_extents<_Ap>::type> 2162 {}; 2163 2164template <class _Ap, size_t _Np, class _A0> 2165struct __is_constructible1_imp<false, _Ap[_Np], _A0> 2166 : public false_type 2167 {}; 2168 2169template <class _Ap, size_t _Np, class _A0, class _A1> 2170struct __is_constructible2_imp<false, _Ap[_Np], _A0, _A1> 2171 : public false_type 2172 {}; 2173 2174// Incomplete array types are not constructible 2175 2176template <class _Ap> 2177struct __is_constructible0_imp<false, _Ap[]> 2178 : public false_type 2179 {}; 2180 2181template <class _Ap, class _A0> 2182struct __is_constructible1_imp<false, _Ap[], _A0> 2183 : public false_type 2184 {}; 2185 2186template <class _Ap, class _A0, class _A1> 2187struct __is_constructible2_imp<false, _Ap[], _A0, _A1> 2188 : public false_type 2189 {}; 2190 2191#endif // _LIBCPP_HAS_NO_VARIADICS 2192 2193// is_default_constructible 2194 2195template <class _Tp> 2196struct _LIBCPP_VISIBLE is_default_constructible 2197 : public is_constructible<_Tp> 2198 {}; 2199 2200// is_copy_constructible 2201 2202template <class _Tp> 2203struct _LIBCPP_VISIBLE is_copy_constructible 2204 : public is_constructible<_Tp, const typename add_lvalue_reference<_Tp>::type> 2205 {}; 2206 2207// is_move_constructible 2208 2209template <class _Tp> 2210struct _LIBCPP_VISIBLE is_move_constructible 2211#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 2212 : public is_constructible<_Tp, typename add_rvalue_reference<_Tp>::type> 2213#else 2214 : public is_copy_constructible<_Tp> 2215#endif 2216 {}; 2217 2218// is_trivially_constructible 2219 2220#ifndef _LIBCPP_HAS_NO_VARIADICS 2221 2222#if __has_feature(is_trivially_constructible) 2223 2224template <class _Tp, class... _Args> 2225struct _LIBCPP_VISIBLE is_trivially_constructible 2226 : integral_constant<bool, __is_trivially_constructible(_Tp, _Args...)> 2227{ 2228}; 2229 2230#else // !__has_feature(is_trivially_constructible) 2231 2232template <class _Tp, class... _Args> 2233struct _LIBCPP_VISIBLE is_trivially_constructible 2234 : false_type 2235{ 2236}; 2237 2238template <class _Tp> 2239struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp> 2240#if __has_feature(has_trivial_constructor) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) 2241 : integral_constant<bool, __has_trivial_constructor(_Tp)> 2242#else 2243 : integral_constant<bool, is_scalar<_Tp>::value> 2244#endif 2245{ 2246}; 2247 2248template <class _Tp> 2249#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 2250struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, _Tp&&> 2251#else 2252struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, _Tp> 2253#endif 2254 : integral_constant<bool, is_scalar<_Tp>::value> 2255{ 2256}; 2257 2258template <class _Tp> 2259struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, const _Tp&> 2260 : integral_constant<bool, is_scalar<_Tp>::value> 2261{ 2262}; 2263 2264template <class _Tp> 2265struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, _Tp&> 2266 : integral_constant<bool, is_scalar<_Tp>::value> 2267{ 2268}; 2269 2270#endif // !__has_feature(is_trivially_constructible) 2271 2272#else // _LIBCPP_HAS_NO_VARIADICS 2273 2274template <class _Tp, class _A0 = __is_construct::__nat, 2275 class _A1 = __is_construct::__nat> 2276struct _LIBCPP_VISIBLE is_trivially_constructible 2277 : false_type 2278{ 2279}; 2280 2281#if __has_feature(is_trivially_constructible) 2282 2283template <class _Tp> 2284struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, __is_construct::__nat, 2285 __is_construct::__nat> 2286 : integral_constant<bool, __is_trivially_constructible(_Tp)> 2287{ 2288}; 2289 2290template <class _Tp> 2291struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, _Tp, 2292 __is_construct::__nat> 2293 : integral_constant<bool, __is_trivially_constructible(_Tp, _Tp)> 2294{ 2295}; 2296 2297template <class _Tp> 2298struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, const _Tp&, 2299 __is_construct::__nat> 2300 : integral_constant<bool, __is_trivially_constructible(_Tp, const _Tp&)> 2301{ 2302}; 2303 2304template <class _Tp> 2305struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, _Tp&, 2306 __is_construct::__nat> 2307 : integral_constant<bool, __is_trivially_constructible(_Tp, _Tp&)> 2308{ 2309}; 2310 2311#else // !__has_feature(is_trivially_constructible) 2312 2313template <class _Tp> 2314struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, __is_construct::__nat, 2315 __is_construct::__nat> 2316 : integral_constant<bool, is_scalar<_Tp>::value> 2317{ 2318}; 2319 2320template <class _Tp> 2321struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, _Tp, 2322 __is_construct::__nat> 2323 : integral_constant<bool, is_scalar<_Tp>::value> 2324{ 2325}; 2326 2327template <class _Tp> 2328struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, const _Tp&, 2329 __is_construct::__nat> 2330 : integral_constant<bool, is_scalar<_Tp>::value> 2331{ 2332}; 2333 2334template <class _Tp> 2335struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, _Tp&, 2336 __is_construct::__nat> 2337 : integral_constant<bool, is_scalar<_Tp>::value> 2338{ 2339}; 2340 2341#endif // !__has_feature(is_trivially_constructible) 2342 2343#endif // _LIBCPP_HAS_NO_VARIADICS 2344 2345// is_trivially_default_constructible 2346 2347template <class _Tp> struct _LIBCPP_VISIBLE is_trivially_default_constructible 2348 : public is_trivially_constructible<_Tp> 2349 {}; 2350 2351// is_trivially_copy_constructible 2352 2353template <class _Tp> struct _LIBCPP_VISIBLE is_trivially_copy_constructible 2354 : public is_trivially_constructible<_Tp, const typename add_lvalue_reference<_Tp>::type> 2355 {}; 2356 2357// is_trivially_move_constructible 2358 2359template <class _Tp> struct _LIBCPP_VISIBLE is_trivially_move_constructible 2360#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 2361 : public is_trivially_constructible<_Tp, typename add_rvalue_reference<_Tp>::type> 2362#else 2363 : public is_trivially_copy_constructible<_Tp> 2364#endif 2365 {}; 2366 2367// is_trivially_assignable 2368 2369#if __has_feature(is_trivially_constructible) 2370 2371template <class _Tp, class _Arg> 2372struct is_trivially_assignable 2373 : integral_constant<bool, __is_trivially_assignable(_Tp, _Arg)> 2374{ 2375}; 2376 2377#else // !__has_feature(is_trivially_constructible) 2378 2379template <class _Tp, class _Arg> 2380struct is_trivially_assignable 2381 : public false_type {}; 2382 2383template <class _Tp> 2384struct is_trivially_assignable<_Tp&, _Tp> 2385 : integral_constant<bool, is_scalar<_Tp>::value> {}; 2386 2387template <class _Tp> 2388struct is_trivially_assignable<_Tp&, _Tp&> 2389 : integral_constant<bool, is_scalar<_Tp>::value> {}; 2390 2391template <class _Tp> 2392struct is_trivially_assignable<_Tp&, const _Tp&> 2393 : integral_constant<bool, is_scalar<_Tp>::value> {}; 2394 2395#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 2396 2397template <class _Tp> 2398struct is_trivially_assignable<_Tp&, _Tp&&> 2399 : integral_constant<bool, is_scalar<_Tp>::value> {}; 2400 2401#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 2402 2403#endif // !__has_feature(is_trivially_constructible) 2404 2405// is_trivially_copy_assignable 2406 2407template <class _Tp> struct _LIBCPP_VISIBLE is_trivially_copy_assignable 2408 : public is_trivially_assignable<typename add_lvalue_reference<_Tp>::type, 2409 const typename add_lvalue_reference<_Tp>::type> 2410 {}; 2411 2412// is_trivially_move_assignable 2413 2414template <class _Tp> struct _LIBCPP_VISIBLE is_trivially_move_assignable 2415 : public is_trivially_assignable<typename add_lvalue_reference<_Tp>::type, 2416#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 2417 typename add_rvalue_reference<_Tp>::type> 2418#else 2419 typename add_lvalue_reference<_Tp>::type> 2420#endif 2421 {}; 2422 2423// is_trivially_destructible 2424 2425#if __has_feature(has_trivial_destructor) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) 2426 2427template <class _Tp> struct _LIBCPP_VISIBLE is_trivially_destructible 2428 : public integral_constant<bool, __has_trivial_destructor(_Tp)> {}; 2429 2430#else // _LIBCPP_HAS_TYPE_TRAITS 2431 2432template <class _Tp> struct __libcpp_trivial_destructor 2433 : public integral_constant<bool, is_scalar<_Tp>::value || 2434 is_reference<_Tp>::value> {}; 2435 2436template <class _Tp> struct _LIBCPP_VISIBLE is_trivially_destructible 2437 : public __libcpp_trivial_destructor<typename remove_all_extents<_Tp>::type> {}; 2438 2439#endif // _LIBCPP_HAS_TYPE_TRAITS 2440 2441// is_nothrow_constructible 2442 2443#ifndef _LIBCPP_HAS_NO_VARIADICS 2444 2445#if __has_feature(cxx_noexcept) 2446 2447template <bool, class _Tp, class... _Args> struct __is_nothrow_constructible; 2448 2449template <class _Tp, class... _Args> 2450struct __is_nothrow_constructible<true, _Tp, _Args...> 2451 : public integral_constant<bool, noexcept(_Tp(declval<_Args>()...))> 2452{ 2453}; 2454 2455template <class _Tp, class... _Args> 2456struct __is_nothrow_constructible<false, _Tp, _Args...> 2457 : public false_type 2458{ 2459}; 2460 2461template <class _Tp, class... _Args> 2462struct _LIBCPP_VISIBLE is_nothrow_constructible 2463 : __is_nothrow_constructible<is_constructible<_Tp, _Args...>::value, _Tp, _Args...> 2464{ 2465}; 2466 2467template <class _Tp, size_t _Ns> 2468struct _LIBCPP_VISIBLE is_nothrow_constructible<_Tp[_Ns]> 2469 : __is_nothrow_constructible<is_constructible<_Tp>::value, _Tp> 2470{ 2471}; 2472 2473#else // __has_feature(cxx_noexcept) 2474 2475template <class _Tp, class... _Args> 2476struct _LIBCPP_VISIBLE is_nothrow_constructible 2477 : false_type 2478{ 2479}; 2480 2481template <class _Tp> 2482struct _LIBCPP_VISIBLE is_nothrow_constructible<_Tp> 2483#if __has_feature(has_nothrow_constructor) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) 2484 : integral_constant<bool, __has_nothrow_constructor(_Tp)> 2485#else 2486 : integral_constant<bool, is_scalar<_Tp>::value> 2487#endif 2488{ 2489}; 2490 2491template <class _Tp> 2492#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 2493struct _LIBCPP_VISIBLE is_nothrow_constructible<_Tp, _Tp&&> 2494#else 2495struct _LIBCPP_VISIBLE is_nothrow_constructible<_Tp, _Tp> 2496#endif 2497#if __has_feature(has_nothrow_copy) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) 2498 : integral_constant<bool, __has_nothrow_copy(_Tp)> 2499#else 2500 : integral_constant<bool, is_scalar<_Tp>::value> 2501#endif 2502{ 2503}; 2504 2505template <class _Tp> 2506struct _LIBCPP_VISIBLE is_nothrow_constructible<_Tp, const _Tp&> 2507#if __has_feature(has_nothrow_copy) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) 2508 : integral_constant<bool, __has_nothrow_copy(_Tp)> 2509#else 2510 : integral_constant<bool, is_scalar<_Tp>::value> 2511#endif 2512{ 2513}; 2514 2515template <class _Tp> 2516struct _LIBCPP_VISIBLE is_nothrow_constructible<_Tp, _Tp&> 2517#if __has_feature(has_nothrow_copy) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) 2518 : integral_constant<bool, __has_nothrow_copy(_Tp)> 2519#else 2520 : integral_constant<bool, is_scalar<_Tp>::value> 2521#endif 2522{ 2523}; 2524 2525#endif // __has_feature(cxx_noexcept) 2526 2527#else // _LIBCPP_HAS_NO_VARIADICS 2528 2529template <class _Tp, class _A0 = __is_construct::__nat, 2530 class _A1 = __is_construct::__nat> 2531struct _LIBCPP_VISIBLE is_nothrow_constructible 2532 : false_type 2533{ 2534}; 2535 2536template <class _Tp> 2537struct _LIBCPP_VISIBLE is_nothrow_constructible<_Tp, __is_construct::__nat, 2538 __is_construct::__nat> 2539#if __has_feature(has_nothrow_constructor) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) 2540 : integral_constant<bool, __has_nothrow_constructor(_Tp)> 2541#else 2542 : integral_constant<bool, is_scalar<_Tp>::value> 2543#endif 2544{ 2545}; 2546 2547template <class _Tp> 2548struct _LIBCPP_VISIBLE is_nothrow_constructible<_Tp, _Tp, 2549 __is_construct::__nat> 2550#if __has_feature(has_nothrow_copy) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) 2551 : integral_constant<bool, __has_nothrow_copy(_Tp)> 2552#else 2553 : integral_constant<bool, is_scalar<_Tp>::value> 2554#endif 2555{ 2556}; 2557 2558template <class _Tp> 2559struct _LIBCPP_VISIBLE is_nothrow_constructible<_Tp, const _Tp&, 2560 __is_construct::__nat> 2561#if __has_feature(has_nothrow_copy) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) 2562 : integral_constant<bool, __has_nothrow_copy(_Tp)> 2563#else 2564 : integral_constant<bool, is_scalar<_Tp>::value> 2565#endif 2566{ 2567}; 2568 2569template <class _Tp> 2570struct _LIBCPP_VISIBLE is_nothrow_constructible<_Tp, _Tp&, 2571 __is_construct::__nat> 2572#if __has_feature(has_nothrow_copy) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) 2573 : integral_constant<bool, __has_nothrow_copy(_Tp)> 2574#else 2575 : integral_constant<bool, is_scalar<_Tp>::value> 2576#endif 2577{ 2578}; 2579 2580#endif // _LIBCPP_HAS_NO_VARIADICS 2581 2582// is_nothrow_default_constructible 2583 2584template <class _Tp> struct _LIBCPP_VISIBLE is_nothrow_default_constructible 2585 : public is_nothrow_constructible<_Tp> 2586 {}; 2587 2588// is_nothrow_copy_constructible 2589 2590template <class _Tp> struct _LIBCPP_VISIBLE is_nothrow_copy_constructible 2591 : public is_nothrow_constructible<_Tp, const typename add_lvalue_reference<_Tp>::type> 2592 {}; 2593 2594// is_nothrow_move_constructible 2595 2596template <class _Tp> struct _LIBCPP_VISIBLE is_nothrow_move_constructible 2597#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 2598 : public is_nothrow_constructible<_Tp, typename add_rvalue_reference<_Tp>::type> 2599#else 2600 : public is_nothrow_copy_constructible<_Tp> 2601#endif 2602 {}; 2603 2604// is_nothrow_assignable 2605 2606#if __has_feature(cxx_noexcept) 2607 2608template <bool, class _Tp, class _Arg> struct __is_nothrow_assignable; 2609 2610template <class _Tp, class _Arg> 2611struct __is_nothrow_assignable<false, _Tp, _Arg> 2612 : public false_type 2613{ 2614}; 2615 2616template <class _Tp, class _Arg> 2617struct __is_nothrow_assignable<true, _Tp, _Arg> 2618 : public integral_constant<bool, noexcept(_VSTD::declval<_Tp>() = _VSTD::declval<_Arg>()) > 2619{ 2620}; 2621 2622template <class _Tp, class _Arg> 2623struct _LIBCPP_VISIBLE is_nothrow_assignable 2624 : public __is_nothrow_assignable<is_assignable<_Tp, _Arg>::value, _Tp, _Arg> 2625{ 2626}; 2627 2628#else // __has_feature(cxx_noexcept) 2629 2630template <class _Tp, class _Arg> 2631struct _LIBCPP_VISIBLE is_nothrow_assignable 2632 : public false_type {}; 2633 2634template <class _Tp> 2635struct _LIBCPP_VISIBLE is_nothrow_assignable<_Tp&, _Tp> 2636#if __has_feature(has_nothrow_assign) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) 2637 : integral_constant<bool, __has_nothrow_assign(_Tp)> {}; 2638#else 2639 : integral_constant<bool, is_scalar<_Tp>::value> {}; 2640#endif 2641 2642template <class _Tp> 2643struct _LIBCPP_VISIBLE is_nothrow_assignable<_Tp&, _Tp&> 2644#if __has_feature(has_nothrow_assign) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) 2645 : integral_constant<bool, __has_nothrow_assign(_Tp)> {}; 2646#else 2647 : integral_constant<bool, is_scalar<_Tp>::value> {}; 2648#endif 2649 2650template <class _Tp> 2651struct _LIBCPP_VISIBLE is_nothrow_assignable<_Tp&, const _Tp&> 2652#if __has_feature(has_nothrow_assign) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) 2653 : integral_constant<bool, __has_nothrow_assign(_Tp)> {}; 2654#else 2655 : integral_constant<bool, is_scalar<_Tp>::value> {}; 2656#endif 2657 2658#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 2659 2660template <class _Tp> 2661struct is_nothrow_assignable<_Tp&, _Tp&&> 2662#if __has_feature(has_nothrow_assign) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) 2663 : integral_constant<bool, __has_nothrow_assign(_Tp)> {}; 2664#else 2665 : integral_constant<bool, is_scalar<_Tp>::value> {}; 2666#endif 2667 2668#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 2669 2670#endif // __has_feature(cxx_noexcept) 2671 2672// is_nothrow_copy_assignable 2673 2674template <class _Tp> struct _LIBCPP_VISIBLE is_nothrow_copy_assignable 2675 : public is_nothrow_assignable<typename add_lvalue_reference<_Tp>::type, 2676 const typename add_lvalue_reference<_Tp>::type> 2677 {}; 2678 2679// is_nothrow_move_assignable 2680 2681template <class _Tp> struct _LIBCPP_VISIBLE is_nothrow_move_assignable 2682 : public is_nothrow_assignable<typename add_lvalue_reference<_Tp>::type, 2683#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 2684 typename add_rvalue_reference<_Tp>::type> 2685#else 2686 typename add_lvalue_reference<_Tp>::type> 2687#endif 2688 {}; 2689 2690// is_nothrow_destructible 2691 2692#if __has_feature(cxx_noexcept) 2693 2694template <bool, class _Tp> struct __is_nothrow_destructible; 2695 2696template <class _Tp> 2697struct __is_nothrow_destructible<false, _Tp> 2698 : public false_type 2699{ 2700}; 2701 2702template <class _Tp> 2703struct __is_nothrow_destructible<true, _Tp> 2704 : public integral_constant<bool, noexcept(_VSTD::declval<_Tp>().~_Tp()) > 2705{ 2706}; 2707 2708template <class _Tp> 2709struct _LIBCPP_VISIBLE is_nothrow_destructible 2710 : public __is_nothrow_destructible<is_destructible<_Tp>::value, _Tp> 2711{ 2712}; 2713 2714template <class _Tp, size_t _Ns> 2715struct _LIBCPP_VISIBLE is_nothrow_destructible<_Tp[_Ns]> 2716 : public is_nothrow_destructible<_Tp> 2717{ 2718}; 2719 2720template <class _Tp> 2721struct _LIBCPP_VISIBLE is_nothrow_destructible<_Tp&> 2722 : public true_type 2723{ 2724}; 2725 2726#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 2727 2728template <class _Tp> 2729struct _LIBCPP_VISIBLE is_nothrow_destructible<_Tp&&> 2730 : public true_type 2731{ 2732}; 2733 2734#endif 2735 2736#else 2737 2738template <class _Tp> struct __libcpp_nothrow_destructor 2739 : public integral_constant<bool, is_scalar<_Tp>::value || 2740 is_reference<_Tp>::value> {}; 2741 2742template <class _Tp> struct _LIBCPP_VISIBLE is_nothrow_destructible 2743 : public __libcpp_nothrow_destructor<typename remove_all_extents<_Tp>::type> {}; 2744 2745#endif 2746 2747// is_pod 2748 2749#if __has_feature(is_pod) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) 2750 2751template <class _Tp> struct _LIBCPP_VISIBLE is_pod 2752 : public integral_constant<bool, __is_pod(_Tp)> {}; 2753 2754#else // _LIBCPP_HAS_TYPE_TRAITS 2755 2756template <class _Tp> struct _LIBCPP_VISIBLE is_pod 2757 : public integral_constant<bool, is_trivially_default_constructible<_Tp>::value && 2758 is_trivially_copy_constructible<_Tp>::value && 2759 is_trivially_copy_assignable<_Tp>::value && 2760 is_trivially_destructible<_Tp>::value> {}; 2761 2762#endif // _LIBCPP_HAS_TYPE_TRAITS 2763 2764// is_literal_type; 2765 2766template <class _Tp> struct _LIBCPP_VISIBLE is_literal_type 2767#if __has_feature(is_literal) 2768 : public integral_constant<bool, __is_literal(_Tp)> 2769#else 2770 : integral_constant<bool, is_scalar<typename remove_all_extents<_Tp>::type>::value || 2771 is_reference<typename remove_all_extents<_Tp>::type>::value> 2772#endif 2773 {}; 2774 2775// is_standard_layout; 2776 2777template <class _Tp> struct _LIBCPP_VISIBLE is_standard_layout 2778#if __has_feature(is_standard_layout) 2779 : public integral_constant<bool, __is_standard_layout(_Tp)> 2780#else 2781 : integral_constant<bool, is_scalar<typename remove_all_extents<_Tp>::type>::value> 2782#endif 2783 {}; 2784 2785// is_trivially_copyable; 2786 2787template <class _Tp> struct _LIBCPP_VISIBLE is_trivially_copyable 2788#if __has_feature(is_trivially_copyable) 2789 : public integral_constant<bool, __is_trivially_copyable(_Tp)> 2790#else 2791 : integral_constant<bool, is_scalar<typename remove_all_extents<_Tp>::type>::value> 2792#endif 2793 {}; 2794 2795// is_trivial; 2796 2797template <class _Tp> struct _LIBCPP_VISIBLE is_trivial 2798#if __has_feature(is_trivial) 2799 : public integral_constant<bool, __is_trivial(_Tp)> 2800#else 2801 : integral_constant<bool, is_trivially_copyable<_Tp>::value && 2802 is_trivially_default_constructible<_Tp>::value> 2803#endif 2804 {}; 2805 2806#ifndef _LIBCPP_HAS_NO_VARIADICS 2807 2808// Check for complete types 2809 2810template <class ..._Tp> struct __check_complete; 2811 2812template <> 2813struct __check_complete<> 2814{ 2815}; 2816 2817template <class _Hp, class _T0, class ..._Tp> 2818struct __check_complete<_Hp, _T0, _Tp...> 2819 : private __check_complete<_Hp>, 2820 private __check_complete<_T0, _Tp...> 2821{ 2822}; 2823 2824template <class _Hp> 2825struct __check_complete<_Hp, _Hp> 2826 : private __check_complete<_Hp> 2827{ 2828}; 2829 2830template <class _Tp> 2831struct __check_complete<_Tp> 2832{ 2833 static_assert(sizeof(_Tp) > 0, "Type must be complete."); 2834}; 2835 2836template <class _Tp> 2837struct __check_complete<_Tp&> 2838 : private __check_complete<_Tp> 2839{ 2840}; 2841 2842template <class _Tp> 2843struct __check_complete<_Tp&&> 2844 : private __check_complete<_Tp> 2845{ 2846}; 2847 2848template <class _Rp, class ..._Param> 2849struct __check_complete<_Rp (*)(_Param...)> 2850 : private __check_complete<_Param...> 2851{ 2852}; 2853 2854template <class _Rp, class ..._Param> 2855struct __check_complete<_Rp (_Param...)> 2856 : private __check_complete<_Param...> 2857{ 2858}; 2859 2860template <class _Rp, class _Class, class ..._Param> 2861struct __check_complete<_Rp (_Class::*)(_Param...)> 2862 : private __check_complete<_Class, _Param...> 2863{ 2864}; 2865 2866template <class _Rp, class _Class, class ..._Param> 2867struct __check_complete<_Rp (_Class::*)(_Param...) const> 2868 : private __check_complete<_Class, _Param...> 2869{ 2870}; 2871 2872template <class _Rp, class _Class, class ..._Param> 2873struct __check_complete<_Rp (_Class::*)(_Param...) volatile> 2874 : private __check_complete<_Class, _Param...> 2875{ 2876}; 2877 2878template <class _Rp, class _Class, class ..._Param> 2879struct __check_complete<_Rp (_Class::*)(_Param...) const volatile> 2880 : private __check_complete<_Class, _Param...> 2881{ 2882}; 2883 2884#if __has_feature(cxx_reference_qualified_functions) 2885 2886template <class _Rp, class _Class, class ..._Param> 2887struct __check_complete<_Rp (_Class::*)(_Param...) &> 2888 : private __check_complete<_Class, _Param...> 2889{ 2890}; 2891 2892template <class _Rp, class _Class, class ..._Param> 2893struct __check_complete<_Rp (_Class::*)(_Param...) const&> 2894 : private __check_complete<_Class, _Param...> 2895{ 2896}; 2897 2898template <class _Rp, class _Class, class ..._Param> 2899struct __check_complete<_Rp (_Class::*)(_Param...) volatile&> 2900 : private __check_complete<_Class, _Param...> 2901{ 2902}; 2903 2904template <class _Rp, class _Class, class ..._Param> 2905struct __check_complete<_Rp (_Class::*)(_Param...) const volatile&> 2906 : private __check_complete<_Class, _Param...> 2907{ 2908}; 2909 2910template <class _Rp, class _Class, class ..._Param> 2911struct __check_complete<_Rp (_Class::*)(_Param...) &&> 2912 : private __check_complete<_Class, _Param...> 2913{ 2914}; 2915 2916template <class _Rp, class _Class, class ..._Param> 2917struct __check_complete<_Rp (_Class::*)(_Param...) const&&> 2918 : private __check_complete<_Class, _Param...> 2919{ 2920}; 2921 2922template <class _Rp, class _Class, class ..._Param> 2923struct __check_complete<_Rp (_Class::*)(_Param...) volatile&&> 2924 : private __check_complete<_Class, _Param...> 2925{ 2926}; 2927 2928template <class _Rp, class _Class, class ..._Param> 2929struct __check_complete<_Rp (_Class::*)(_Param...) const volatile&&> 2930 : private __check_complete<_Class, _Param...> 2931{ 2932}; 2933 2934#endif 2935 2936template <class _Rp, class _Class> 2937struct __check_complete<_Rp _Class::*> 2938 : private __check_complete<_Class> 2939{ 2940}; 2941 2942// __invoke forward declarations 2943 2944// fall back - none of the bullets 2945 2946template <class ..._Args> 2947auto 2948__invoke(__any, _Args&& ...__args) 2949 -> __nat; 2950 2951// bullets 1 and 2 2952 2953template <class _Fp, class _A0, class ..._Args> 2954auto 2955__invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args) 2956 -> decltype((_VSTD::forward<_A0>(__a0).*__f)(_VSTD::forward<_Args>(__args)...)); 2957 2958template <class _Fp, class _A0, class ..._Args> 2959auto 2960__invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args) 2961 -> decltype(((*_VSTD::forward<_A0>(__a0)).*__f)(_VSTD::forward<_Args>(__args)...)); 2962 2963// bullets 3 and 4 2964 2965template <class _Fp, class _A0> 2966auto 2967__invoke(_Fp&& __f, _A0&& __a0) 2968 -> decltype(_VSTD::forward<_A0>(__a0).*__f); 2969 2970template <class _Fp, class _A0> 2971auto 2972__invoke(_Fp&& __f, _A0&& __a0) 2973 -> decltype((*_VSTD::forward<_A0>(__a0)).*__f); 2974 2975// bullet 5 2976 2977template <class _Fp, class ..._Args> 2978auto 2979__invoke(_Fp&& __f, _Args&& ...__args) 2980 -> decltype(_VSTD::forward<_Fp>(__f)(_VSTD::forward<_Args>(__args)...)); 2981 2982// __invokable 2983 2984template <class _Fp, class ..._Args> 2985struct __invokable_imp 2986 : private __check_complete<_Fp, _Args...> 2987{ 2988 typedef decltype( 2989 __invoke(_VSTD::declval<_Fp>(), _VSTD::declval<_Args>()...) 2990 ) type; 2991 static const bool value = !is_same<type, __nat>::value; 2992}; 2993 2994template <class _Fp, class ..._Args> 2995struct __invokable 2996 : public integral_constant<bool, 2997 __invokable_imp<_Fp, _Args...>::value> 2998{ 2999}; 3000 3001// __invoke_of 3002 3003template <bool _Invokable, class _Fp, class ..._Args> 3004struct __invoke_of_imp // false 3005{ 3006}; 3007 3008template <class _Fp, class ..._Args> 3009struct __invoke_of_imp<true, _Fp, _Args...> 3010{ 3011 typedef typename __invokable_imp<_Fp, _Args...>::type type; 3012}; 3013 3014template <class _Fp, class ..._Args> 3015struct __invoke_of 3016 : public __invoke_of_imp<__invokable<_Fp, _Args...>::value, _Fp, _Args...> 3017{ 3018}; 3019 3020#endif // _LIBCPP_HAS_NO_VARIADICS 3021 3022template <class _Tp> 3023inline _LIBCPP_INLINE_VISIBILITY 3024#ifndef _LIBCPP_HAS_NO_ADVANCED_SFINAE 3025typename enable_if 3026< 3027 is_move_constructible<_Tp>::value && 3028 is_move_assignable<_Tp>::value 3029>::type 3030#else 3031void 3032#endif 3033swap(_Tp& __x, _Tp& __y) _NOEXCEPT_(is_nothrow_move_constructible<_Tp>::value && 3034 is_nothrow_move_assignable<_Tp>::value) 3035{ 3036 _Tp __t(_VSTD::move(__x)); 3037 __x = _VSTD::move(__y); 3038 __y = _VSTD::move(__t); 3039} 3040 3041template <class _ForwardIterator1, class _ForwardIterator2> 3042inline _LIBCPP_INLINE_VISIBILITY 3043void 3044iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b) 3045 // _NOEXCEPT_(_NOEXCEPT_(swap(*__a, *__b))) 3046 _NOEXCEPT_(_NOEXCEPT_(swap(*_VSTD::declval<_ForwardIterator1>(), 3047 *_VSTD::declval<_ForwardIterator2>()))) 3048{ 3049 swap(*__a, *__b); 3050} 3051 3052// __swappable 3053 3054namespace __detail 3055{ 3056 3057using _VSTD::swap; 3058__nat swap(__any, __any); 3059 3060template <class _Tp> 3061struct __swappable 3062{ 3063 typedef decltype(swap(_VSTD::declval<_Tp&>(), _VSTD::declval<_Tp&>())) type; 3064 static const bool value = !is_same<type, __nat>::value; 3065}; 3066 3067} // __detail 3068 3069template <class _Tp> 3070struct __is_swappable 3071 : public integral_constant<bool, __detail::__swappable<_Tp>::value> 3072{ 3073}; 3074 3075#if __has_feature(cxx_noexcept) 3076 3077template <bool, class _Tp> 3078struct __is_nothrow_swappable_imp 3079 : public integral_constant<bool, noexcept(swap(_VSTD::declval<_Tp&>(), 3080 _VSTD::declval<_Tp&>()))> 3081{ 3082}; 3083 3084template <class _Tp> 3085struct __is_nothrow_swappable_imp<false, _Tp> 3086 : public false_type 3087{ 3088}; 3089 3090template <class _Tp> 3091struct __is_nothrow_swappable 3092 : public __is_nothrow_swappable_imp<__is_swappable<_Tp>::value, _Tp> 3093{ 3094}; 3095 3096#else // __has_feature(cxx_noexcept) 3097 3098template <class _Tp> 3099struct __is_nothrow_swappable 3100 : public false_type 3101{ 3102}; 3103 3104#endif // __has_feature(cxx_noexcept) 3105 3106#ifdef _LIBCXX_UNDERLYING_TYPE 3107 3108template <class _Tp> 3109struct underlying_type 3110{ 3111 typedef _LIBCXX_UNDERLYING_TYPE(_Tp) type; 3112}; 3113 3114#else // _LIBCXX_UNDERLYING_TYPE 3115 3116template <class _Tp, bool _Support = false> 3117struct underlying_type 3118{ 3119 static_assert(_Support, "The underyling_type trait requires compiler " 3120 "support. Either no such support exists or " 3121 "libc++ does not know how to use it."); 3122}; 3123 3124#endif // _LIBCXX_UNDERLYING_TYPE 3125 3126_LIBCPP_END_NAMESPACE_STD 3127 3128#endif // _LIBCPP_TYPE_TRAITS 3129