1 // -*- C++ -*- 2 //===-------------------------- memory ------------------------------------===// 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_MEMORY 12 #define _LIBCPP_MEMORY 13 14 /* 15 memory synopsis 16 17 namespace std 18 { 19 20 struct allocator_arg_t { }; 21 inline constexpr allocator_arg_t allocator_arg = allocator_arg_t(); 22 23 template <class T, class Alloc> struct uses_allocator; 24 25 template <class Ptr> 26 struct pointer_traits 27 { 28 typedef Ptr pointer; 29 typedef <details> element_type; 30 typedef <details> difference_type; 31 32 template <class U> using rebind = <details>; 33 34 static pointer pointer_to(<details>); 35 }; 36 37 template <class T> 38 struct pointer_traits<T*> 39 { 40 typedef T* pointer; 41 typedef T element_type; 42 typedef ptrdiff_t difference_type; 43 44 template <class U> using rebind = U*; 45 46 static pointer pointer_to(<details>) noexcept; // constexpr in C++20 47 }; 48 49 template <class T> constexpr T* to_address(T* p) noexcept; // C++20 50 template <class Ptr> auto to_address(const Ptr& p) noexcept; // C++20 51 52 template <class Alloc> 53 struct allocator_traits 54 { 55 typedef Alloc allocator_type; 56 typedef typename allocator_type::value_type 57 value_type; 58 59 typedef Alloc::pointer | value_type* pointer; 60 typedef Alloc::const_pointer 61 | pointer_traits<pointer>::rebind<const value_type> 62 const_pointer; 63 typedef Alloc::void_pointer 64 | pointer_traits<pointer>::rebind<void> 65 void_pointer; 66 typedef Alloc::const_void_pointer 67 | pointer_traits<pointer>::rebind<const void> 68 const_void_pointer; 69 typedef Alloc::difference_type 70 | pointer_traits<pointer>::difference_type 71 difference_type; 72 typedef Alloc::size_type 73 | make_unsigned<difference_type>::type 74 size_type; 75 typedef Alloc::propagate_on_container_copy_assignment 76 | false_type propagate_on_container_copy_assignment; 77 typedef Alloc::propagate_on_container_move_assignment 78 | false_type propagate_on_container_move_assignment; 79 typedef Alloc::propagate_on_container_swap 80 | false_type propagate_on_container_swap; 81 typedef Alloc::is_always_equal 82 | is_empty is_always_equal; 83 84 template <class T> using rebind_alloc = Alloc::rebind<U>::other | Alloc<T, Args...>; 85 template <class T> using rebind_traits = allocator_traits<rebind_alloc<T>>; 86 87 static pointer allocate(allocator_type& a, size_type n); // [[nodiscard]] in C++20 88 static pointer allocate(allocator_type& a, size_type n, const_void_pointer hint); // [[nodiscard]] in C++20 89 90 static void deallocate(allocator_type& a, pointer p, size_type n) noexcept; 91 92 template <class T, class... Args> 93 static void construct(allocator_type& a, T* p, Args&&... args); 94 95 template <class T> 96 static void destroy(allocator_type& a, T* p); 97 98 static size_type max_size(const allocator_type& a); // noexcept in C++14 99 100 static allocator_type 101 select_on_container_copy_construction(const allocator_type& a); 102 }; 103 104 template <> 105 class allocator<void> 106 { 107 public: 108 typedef void* pointer; 109 typedef const void* const_pointer; 110 typedef void value_type; 111 112 template <class _Up> struct rebind {typedef allocator<_Up> other;}; 113 }; 114 115 template <class T> 116 class allocator 117 { 118 public: 119 typedef size_t size_type; 120 typedef ptrdiff_t difference_type; 121 typedef T* pointer; 122 typedef const T* const_pointer; 123 typedef typename add_lvalue_reference<T>::type reference; 124 typedef typename add_lvalue_reference<const T>::type const_reference; 125 typedef T value_type; 126 127 template <class U> struct rebind {typedef allocator<U> other;}; 128 129 constexpr allocator() noexcept; // constexpr in C++20 130 constexpr allocator(const allocator&) noexcept; // constexpr in C++20 131 template <class U> 132 constexpr allocator(const allocator<U>&) noexcept; // constexpr in C++20 133 ~allocator(); 134 pointer address(reference x) const noexcept; 135 const_pointer address(const_reference x) const noexcept; 136 pointer allocate(size_type, allocator<void>::const_pointer hint = 0); 137 void deallocate(pointer p, size_type n) noexcept; 138 size_type max_size() const noexcept; 139 template<class U, class... Args> 140 void construct(U* p, Args&&... args); 141 template <class U> 142 void destroy(U* p); 143 }; 144 145 template <class T, class U> 146 bool operator==(const allocator<T>&, const allocator<U>&) noexcept; 147 148 template <class T, class U> 149 bool operator!=(const allocator<T>&, const allocator<U>&) noexcept; 150 151 template <class OutputIterator, class T> 152 class raw_storage_iterator 153 : public iterator<output_iterator_tag, 154 T, // purposefully not C++03 155 ptrdiff_t, // purposefully not C++03 156 T*, // purposefully not C++03 157 raw_storage_iterator&> // purposefully not C++03 158 { 159 public: 160 explicit raw_storage_iterator(OutputIterator x); 161 raw_storage_iterator& operator*(); 162 raw_storage_iterator& operator=(const T& element); 163 raw_storage_iterator& operator++(); 164 raw_storage_iterator operator++(int); 165 }; 166 167 template <class T> pair<T*,ptrdiff_t> get_temporary_buffer(ptrdiff_t n) noexcept; 168 template <class T> void return_temporary_buffer(T* p) noexcept; 169 170 template <class T> T* addressof(T& r) noexcept; 171 template <class T> T* addressof(const T&& r) noexcept = delete; 172 173 template <class InputIterator, class ForwardIterator> 174 ForwardIterator 175 uninitialized_copy(InputIterator first, InputIterator last, ForwardIterator result); 176 177 template <class InputIterator, class Size, class ForwardIterator> 178 ForwardIterator 179 uninitialized_copy_n(InputIterator first, Size n, ForwardIterator result); 180 181 template <class ForwardIterator, class T> 182 void uninitialized_fill(ForwardIterator first, ForwardIterator last, const T& x); 183 184 template <class ForwardIterator, class Size, class T> 185 ForwardIterator 186 uninitialized_fill_n(ForwardIterator first, Size n, const T& x); 187 188 template <class T> 189 void destroy_at(T* location); 190 191 template <class ForwardIterator> 192 void destroy(ForwardIterator first, ForwardIterator last); 193 194 template <class ForwardIterator, class Size> 195 ForwardIterator destroy_n(ForwardIterator first, Size n); 196 197 template <class InputIterator, class ForwardIterator> 198 ForwardIterator uninitialized_move(InputIterator first, InputIterator last, ForwardIterator result); 199 200 template <class InputIterator, class Size, class ForwardIterator> 201 pair<InputIterator,ForwardIterator> uninitialized_move_n(InputIterator first, Size n, ForwardIterator result); 202 203 template <class ForwardIterator> 204 void uninitialized_value_construct(ForwardIterator first, ForwardIterator last); 205 206 template <class ForwardIterator, class Size> 207 ForwardIterator uninitialized_value_construct_n(ForwardIterator first, Size n); 208 209 template <class ForwardIterator> 210 void uninitialized_default_construct(ForwardIterator first, ForwardIterator last); 211 212 template <class ForwardIterator, class Size> 213 ForwardIterator uninitialized_default_construct_n(ForwardIterator first, Size n); 214 215 template <class Y> struct auto_ptr_ref {}; // deprecated in C++11, removed in C++17 216 217 template<class X> 218 class auto_ptr // deprecated in C++11, removed in C++17 219 { 220 public: 221 typedef X element_type; 222 223 explicit auto_ptr(X* p =0) throw(); 224 auto_ptr(auto_ptr&) throw(); 225 template<class Y> auto_ptr(auto_ptr<Y>&) throw(); 226 auto_ptr& operator=(auto_ptr&) throw(); 227 template<class Y> auto_ptr& operator=(auto_ptr<Y>&) throw(); 228 auto_ptr& operator=(auto_ptr_ref<X> r) throw(); 229 ~auto_ptr() throw(); 230 231 typename add_lvalue_reference<X>::type operator*() const throw(); 232 X* operator->() const throw(); 233 X* get() const throw(); 234 X* release() throw(); 235 void reset(X* p =0) throw(); 236 237 auto_ptr(auto_ptr_ref<X>) throw(); 238 template<class Y> operator auto_ptr_ref<Y>() throw(); 239 template<class Y> operator auto_ptr<Y>() throw(); 240 }; 241 242 template <class T> 243 struct default_delete 244 { 245 constexpr default_delete() noexcept = default; 246 template <class U> default_delete(const default_delete<U>&) noexcept; 247 248 void operator()(T*) const noexcept; 249 }; 250 251 template <class T> 252 struct default_delete<T[]> 253 { 254 constexpr default_delete() noexcept = default; 255 void operator()(T*) const noexcept; 256 template <class U> void operator()(U*) const = delete; 257 }; 258 259 template <class T, class D = default_delete<T>> 260 class unique_ptr 261 { 262 public: 263 typedef see below pointer; 264 typedef T element_type; 265 typedef D deleter_type; 266 267 // constructors 268 constexpr unique_ptr() noexcept; 269 explicit unique_ptr(pointer p) noexcept; 270 unique_ptr(pointer p, see below d1) noexcept; 271 unique_ptr(pointer p, see below d2) noexcept; 272 unique_ptr(unique_ptr&& u) noexcept; 273 unique_ptr(nullptr_t) noexcept : unique_ptr() { } 274 template <class U, class E> 275 unique_ptr(unique_ptr<U, E>&& u) noexcept; 276 template <class U> 277 unique_ptr(auto_ptr<U>&& u) noexcept; // removed in C++17 278 279 // destructor 280 ~unique_ptr(); 281 282 // assignment 283 unique_ptr& operator=(unique_ptr&& u) noexcept; 284 template <class U, class E> unique_ptr& operator=(unique_ptr<U, E>&& u) noexcept; 285 unique_ptr& operator=(nullptr_t) noexcept; 286 287 // observers 288 typename add_lvalue_reference<T>::type operator*() const; 289 pointer operator->() const noexcept; 290 pointer get() const noexcept; 291 deleter_type& get_deleter() noexcept; 292 const deleter_type& get_deleter() const noexcept; 293 explicit operator bool() const noexcept; 294 295 // modifiers 296 pointer release() noexcept; 297 void reset(pointer p = pointer()) noexcept; 298 void swap(unique_ptr& u) noexcept; 299 }; 300 301 template <class T, class D> 302 class unique_ptr<T[], D> 303 { 304 public: 305 typedef implementation-defined pointer; 306 typedef T element_type; 307 typedef D deleter_type; 308 309 // constructors 310 constexpr unique_ptr() noexcept; 311 explicit unique_ptr(pointer p) noexcept; 312 unique_ptr(pointer p, see below d) noexcept; 313 unique_ptr(pointer p, see below d) noexcept; 314 unique_ptr(unique_ptr&& u) noexcept; 315 unique_ptr(nullptr_t) noexcept : unique_ptr() { } 316 317 // destructor 318 ~unique_ptr(); 319 320 // assignment 321 unique_ptr& operator=(unique_ptr&& u) noexcept; 322 unique_ptr& operator=(nullptr_t) noexcept; 323 324 // observers 325 T& operator[](size_t i) const; 326 pointer get() const noexcept; 327 deleter_type& get_deleter() noexcept; 328 const deleter_type& get_deleter() const noexcept; 329 explicit operator bool() const noexcept; 330 331 // modifiers 332 pointer release() noexcept; 333 void reset(pointer p = pointer()) noexcept; 334 void reset(nullptr_t) noexcept; 335 template <class U> void reset(U) = delete; 336 void swap(unique_ptr& u) noexcept; 337 }; 338 339 template <class T, class D> 340 void swap(unique_ptr<T, D>& x, unique_ptr<T, D>& y) noexcept; 341 342 template <class T1, class D1, class T2, class D2> 343 bool operator==(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 344 template <class T1, class D1, class T2, class D2> 345 bool operator!=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 346 template <class T1, class D1, class T2, class D2> 347 bool operator<(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 348 template <class T1, class D1, class T2, class D2> 349 bool operator<=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 350 template <class T1, class D1, class T2, class D2> 351 bool operator>(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 352 template <class T1, class D1, class T2, class D2> 353 bool operator>=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 354 355 template <class T, class D> 356 bool operator==(const unique_ptr<T, D>& x, nullptr_t) noexcept; 357 template <class T, class D> 358 bool operator==(nullptr_t, const unique_ptr<T, D>& y) noexcept; 359 template <class T, class D> 360 bool operator!=(const unique_ptr<T, D>& x, nullptr_t) noexcept; 361 template <class T, class D> 362 bool operator!=(nullptr_t, const unique_ptr<T, D>& y) noexcept; 363 364 template <class T, class D> 365 bool operator<(const unique_ptr<T, D>& x, nullptr_t); 366 template <class T, class D> 367 bool operator<(nullptr_t, const unique_ptr<T, D>& y); 368 template <class T, class D> 369 bool operator<=(const unique_ptr<T, D>& x, nullptr_t); 370 template <class T, class D> 371 bool operator<=(nullptr_t, const unique_ptr<T, D>& y); 372 template <class T, class D> 373 bool operator>(const unique_ptr<T, D>& x, nullptr_t); 374 template <class T, class D> 375 bool operator>(nullptr_t, const unique_ptr<T, D>& y); 376 template <class T, class D> 377 bool operator>=(const unique_ptr<T, D>& x, nullptr_t); 378 template <class T, class D> 379 bool operator>=(nullptr_t, const unique_ptr<T, D>& y); 380 381 class bad_weak_ptr 382 : public std::exception 383 { 384 bad_weak_ptr() noexcept; 385 }; 386 387 template<class T, class... Args> unique_ptr<T> make_unique(Args&&... args); // C++14 388 template<class T> unique_ptr<T> make_unique(size_t n); // C++14 389 template<class T, class... Args> unspecified make_unique(Args&&...) = delete; // C++14, T == U[N] 390 391 template<class E, class T, class Y, class D> 392 basic_ostream<E, T>& operator<< (basic_ostream<E, T>& os, unique_ptr<Y, D> const& p); 393 394 template<class T> 395 class shared_ptr 396 { 397 public: 398 typedef T element_type; 399 typedef weak_ptr<T> weak_type; // C++17 400 401 // constructors: 402 constexpr shared_ptr() noexcept; 403 template<class Y> explicit shared_ptr(Y* p); 404 template<class Y, class D> shared_ptr(Y* p, D d); 405 template<class Y, class D, class A> shared_ptr(Y* p, D d, A a); 406 template <class D> shared_ptr(nullptr_t p, D d); 407 template <class D, class A> shared_ptr(nullptr_t p, D d, A a); 408 template<class Y> shared_ptr(const shared_ptr<Y>& r, T *p) noexcept; 409 shared_ptr(const shared_ptr& r) noexcept; 410 template<class Y> shared_ptr(const shared_ptr<Y>& r) noexcept; 411 shared_ptr(shared_ptr&& r) noexcept; 412 template<class Y> shared_ptr(shared_ptr<Y>&& r) noexcept; 413 template<class Y> explicit shared_ptr(const weak_ptr<Y>& r); 414 template<class Y> shared_ptr(auto_ptr<Y>&& r); // removed in C++17 415 template <class Y, class D> shared_ptr(unique_ptr<Y, D>&& r); 416 shared_ptr(nullptr_t) : shared_ptr() { } 417 418 // destructor: 419 ~shared_ptr(); 420 421 // assignment: 422 shared_ptr& operator=(const shared_ptr& r) noexcept; 423 template<class Y> shared_ptr& operator=(const shared_ptr<Y>& r) noexcept; 424 shared_ptr& operator=(shared_ptr&& r) noexcept; 425 template<class Y> shared_ptr& operator=(shared_ptr<Y>&& r); 426 template<class Y> shared_ptr& operator=(auto_ptr<Y>&& r); // removed in C++17 427 template <class Y, class D> shared_ptr& operator=(unique_ptr<Y, D>&& r); 428 429 // modifiers: 430 void swap(shared_ptr& r) noexcept; 431 void reset() noexcept; 432 template<class Y> void reset(Y* p); 433 template<class Y, class D> void reset(Y* p, D d); 434 template<class Y, class D, class A> void reset(Y* p, D d, A a); 435 436 // observers: 437 T* get() const noexcept; 438 T& operator*() const noexcept; 439 T* operator->() const noexcept; 440 long use_count() const noexcept; 441 bool unique() const noexcept; 442 explicit operator bool() const noexcept; 443 template<class U> bool owner_before(shared_ptr<U> const& b) const noexcept; 444 template<class U> bool owner_before(weak_ptr<U> const& b) const noexcept; 445 }; 446 447 // shared_ptr comparisons: 448 template<class T, class U> 449 bool operator==(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; 450 template<class T, class U> 451 bool operator!=(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; 452 template<class T, class U> 453 bool operator<(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; 454 template<class T, class U> 455 bool operator>(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; 456 template<class T, class U> 457 bool operator<=(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; 458 template<class T, class U> 459 bool operator>=(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; 460 461 template <class T> 462 bool operator==(const shared_ptr<T>& x, nullptr_t) noexcept; 463 template <class T> 464 bool operator==(nullptr_t, const shared_ptr<T>& y) noexcept; 465 template <class T> 466 bool operator!=(const shared_ptr<T>& x, nullptr_t) noexcept; 467 template <class T> 468 bool operator!=(nullptr_t, const shared_ptr<T>& y) noexcept; 469 template <class T> 470 bool operator<(const shared_ptr<T>& x, nullptr_t) noexcept; 471 template <class T> 472 bool operator<(nullptr_t, const shared_ptr<T>& y) noexcept; 473 template <class T> 474 bool operator<=(const shared_ptr<T>& x, nullptr_t) noexcept; 475 template <class T> 476 bool operator<=(nullptr_t, const shared_ptr<T>& y) noexcept; 477 template <class T> 478 bool operator>(const shared_ptr<T>& x, nullptr_t) noexcept; 479 template <class T> 480 bool operator>(nullptr_t, const shared_ptr<T>& y) noexcept; 481 template <class T> 482 bool operator>=(const shared_ptr<T>& x, nullptr_t) noexcept; 483 template <class T> 484 bool operator>=(nullptr_t, const shared_ptr<T>& y) noexcept; 485 486 // shared_ptr specialized algorithms: 487 template<class T> void swap(shared_ptr<T>& a, shared_ptr<T>& b) noexcept; 488 489 // shared_ptr casts: 490 template<class T, class U> 491 shared_ptr<T> static_pointer_cast(shared_ptr<U> const& r) noexcept; 492 template<class T, class U> 493 shared_ptr<T> dynamic_pointer_cast(shared_ptr<U> const& r) noexcept; 494 template<class T, class U> 495 shared_ptr<T> const_pointer_cast(shared_ptr<U> const& r) noexcept; 496 497 // shared_ptr I/O: 498 template<class E, class T, class Y> 499 basic_ostream<E, T>& operator<< (basic_ostream<E, T>& os, shared_ptr<Y> const& p); 500 501 // shared_ptr get_deleter: 502 template<class D, class T> D* get_deleter(shared_ptr<T> const& p) noexcept; 503 504 template<class T, class... Args> 505 shared_ptr<T> make_shared(Args&&... args); 506 template<class T, class A, class... Args> 507 shared_ptr<T> allocate_shared(const A& a, Args&&... args); 508 509 template<class T> 510 class weak_ptr 511 { 512 public: 513 typedef T element_type; 514 515 // constructors 516 constexpr weak_ptr() noexcept; 517 template<class Y> weak_ptr(shared_ptr<Y> const& r) noexcept; 518 weak_ptr(weak_ptr const& r) noexcept; 519 template<class Y> weak_ptr(weak_ptr<Y> const& r) noexcept; 520 weak_ptr(weak_ptr&& r) noexcept; // C++14 521 template<class Y> weak_ptr(weak_ptr<Y>&& r) noexcept; // C++14 522 523 // destructor 524 ~weak_ptr(); 525 526 // assignment 527 weak_ptr& operator=(weak_ptr const& r) noexcept; 528 template<class Y> weak_ptr& operator=(weak_ptr<Y> const& r) noexcept; 529 template<class Y> weak_ptr& operator=(shared_ptr<Y> const& r) noexcept; 530 weak_ptr& operator=(weak_ptr&& r) noexcept; // C++14 531 template<class Y> weak_ptr& operator=(weak_ptr<Y>&& r) noexcept; // C++14 532 533 // modifiers 534 void swap(weak_ptr& r) noexcept; 535 void reset() noexcept; 536 537 // observers 538 long use_count() const noexcept; 539 bool expired() const noexcept; 540 shared_ptr<T> lock() const noexcept; 541 template<class U> bool owner_before(shared_ptr<U> const& b) const noexcept; 542 template<class U> bool owner_before(weak_ptr<U> const& b) const noexcept; 543 }; 544 545 // weak_ptr specialized algorithms: 546 template<class T> void swap(weak_ptr<T>& a, weak_ptr<T>& b) noexcept; 547 548 // class owner_less: 549 template<class T> struct owner_less; 550 551 template<class T> 552 struct owner_less<shared_ptr<T>> 553 : binary_function<shared_ptr<T>, shared_ptr<T>, bool> 554 { 555 typedef bool result_type; 556 bool operator()(shared_ptr<T> const&, shared_ptr<T> const&) const noexcept; 557 bool operator()(shared_ptr<T> const&, weak_ptr<T> const&) const noexcept; 558 bool operator()(weak_ptr<T> const&, shared_ptr<T> const&) const noexcept; 559 }; 560 561 template<class T> 562 struct owner_less<weak_ptr<T>> 563 : binary_function<weak_ptr<T>, weak_ptr<T>, bool> 564 { 565 typedef bool result_type; 566 bool operator()(weak_ptr<T> const&, weak_ptr<T> const&) const noexcept; 567 bool operator()(shared_ptr<T> const&, weak_ptr<T> const&) const noexcept; 568 bool operator()(weak_ptr<T> const&, shared_ptr<T> const&) const noexcept; 569 }; 570 571 template <> // Added in C++14 572 struct owner_less<void> 573 { 574 template <class _Tp, class _Up> 575 bool operator()( shared_ptr<_Tp> const& __x, shared_ptr<_Up> const& __y) const noexcept; 576 template <class _Tp, class _Up> 577 bool operator()( shared_ptr<_Tp> const& __x, weak_ptr<_Up> const& __y) const noexcept; 578 template <class _Tp, class _Up> 579 bool operator()( weak_ptr<_Tp> const& __x, shared_ptr<_Up> const& __y) const noexcept; 580 template <class _Tp, class _Up> 581 bool operator()( weak_ptr<_Tp> const& __x, weak_ptr<_Up> const& __y) const noexcept; 582 583 typedef void is_transparent; 584 }; 585 586 template<class T> 587 class enable_shared_from_this 588 { 589 protected: 590 constexpr enable_shared_from_this() noexcept; 591 enable_shared_from_this(enable_shared_from_this const&) noexcept; 592 enable_shared_from_this& operator=(enable_shared_from_this const&) noexcept; 593 ~enable_shared_from_this(); 594 public: 595 shared_ptr<T> shared_from_this(); 596 shared_ptr<T const> shared_from_this() const; 597 }; 598 599 template<class T> 600 bool atomic_is_lock_free(const shared_ptr<T>* p); 601 template<class T> 602 shared_ptr<T> atomic_load(const shared_ptr<T>* p); 603 template<class T> 604 shared_ptr<T> atomic_load_explicit(const shared_ptr<T>* p, memory_order mo); 605 template<class T> 606 void atomic_store(shared_ptr<T>* p, shared_ptr<T> r); 607 template<class T> 608 void atomic_store_explicit(shared_ptr<T>* p, shared_ptr<T> r, memory_order mo); 609 template<class T> 610 shared_ptr<T> atomic_exchange(shared_ptr<T>* p, shared_ptr<T> r); 611 template<class T> 612 shared_ptr<T> 613 atomic_exchange_explicit(shared_ptr<T>* p, shared_ptr<T> r, memory_order mo); 614 template<class T> 615 bool 616 atomic_compare_exchange_weak(shared_ptr<T>* p, shared_ptr<T>* v, shared_ptr<T> w); 617 template<class T> 618 bool 619 atomic_compare_exchange_strong( shared_ptr<T>* p, shared_ptr<T>* v, shared_ptr<T> w); 620 template<class T> 621 bool 622 atomic_compare_exchange_weak_explicit(shared_ptr<T>* p, shared_ptr<T>* v, 623 shared_ptr<T> w, memory_order success, 624 memory_order failure); 625 template<class T> 626 bool 627 atomic_compare_exchange_strong_explicit(shared_ptr<T>* p, shared_ptr<T>* v, 628 shared_ptr<T> w, memory_order success, 629 memory_order failure); 630 // Hash support 631 template <class T> struct hash; 632 template <class T, class D> struct hash<unique_ptr<T, D> >; 633 template <class T> struct hash<shared_ptr<T> >; 634 635 template <class T, class Alloc> 636 inline constexpr bool uses_allocator_v = uses_allocator<T, Alloc>::value; 637 638 // Pointer safety 639 enum class pointer_safety { relaxed, preferred, strict }; 640 void declare_reachable(void *p); 641 template <class T> T *undeclare_reachable(T *p); 642 void declare_no_pointers(char *p, size_t n); 643 void undeclare_no_pointers(char *p, size_t n); 644 pointer_safety get_pointer_safety() noexcept; 645 646 void* align(size_t alignment, size_t size, void*& ptr, size_t& space); 647 648 } // std 649 650 */ 651 652 #include <__config> 653 #include <type_traits> 654 #include <typeinfo> 655 #include <cstddef> 656 #include <cstdint> 657 #include <new> 658 #include <utility> 659 #include <limits> 660 #include <iterator> 661 #include <__functional_base> 662 #include <iosfwd> 663 #include <tuple> 664 #include <stdexcept> 665 #include <cstring> 666 #include <cassert> 667 #if !defined(_LIBCPP_HAS_NO_ATOMIC_HEADER) 668 # include <atomic> 669 #endif 670 #include <version> 671 672 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 673 #pragma GCC system_header 674 #endif 675 676 _LIBCPP_PUSH_MACROS 677 #include <__undef_macros> 678 679 680 _LIBCPP_BEGIN_NAMESPACE_STD 681 682 template <class _ValueType> 683 inline _LIBCPP_INLINE_VISIBILITY 684 _ValueType __libcpp_relaxed_load(_ValueType const* __value) { 685 #if !defined(_LIBCPP_HAS_NO_THREADS) && \ 686 defined(__ATOMIC_RELAXED) && \ 687 (__has_builtin(__atomic_load_n) || _GNUC_VER >= 407) 688 return __atomic_load_n(__value, __ATOMIC_RELAXED); 689 #else 690 return *__value; 691 #endif 692 } 693 694 template <class _ValueType> 695 inline _LIBCPP_INLINE_VISIBILITY 696 _ValueType __libcpp_acquire_load(_ValueType const* __value) { 697 #if !defined(_LIBCPP_HAS_NO_THREADS) && \ 698 defined(__ATOMIC_ACQUIRE) && \ 699 (__has_builtin(__atomic_load_n) || _GNUC_VER >= 407) 700 return __atomic_load_n(__value, __ATOMIC_ACQUIRE); 701 #else 702 return *__value; 703 #endif 704 } 705 706 // addressof moved to <type_traits> 707 708 template <class _Tp> class allocator; 709 710 template <> 711 class _LIBCPP_TEMPLATE_VIS allocator<void> 712 { 713 public: 714 typedef void* pointer; 715 typedef const void* const_pointer; 716 typedef void value_type; 717 718 template <class _Up> struct rebind {typedef allocator<_Up> other;}; 719 }; 720 721 template <> 722 class _LIBCPP_TEMPLATE_VIS allocator<const void> 723 { 724 public: 725 typedef const void* pointer; 726 typedef const void* const_pointer; 727 typedef const void value_type; 728 729 template <class _Up> struct rebind {typedef allocator<_Up> other;}; 730 }; 731 732 // pointer_traits 733 734 template <class _Tp, class = void> 735 struct __has_element_type : false_type {}; 736 737 template <class _Tp> 738 struct __has_element_type<_Tp, 739 typename __void_t<typename _Tp::element_type>::type> : true_type {}; 740 741 template <class _Ptr, bool = __has_element_type<_Ptr>::value> 742 struct __pointer_traits_element_type; 743 744 template <class _Ptr> 745 struct __pointer_traits_element_type<_Ptr, true> 746 { 747 typedef typename _Ptr::element_type type; 748 }; 749 750 #ifndef _LIBCPP_HAS_NO_VARIADICS 751 752 template <template <class, class...> class _Sp, class _Tp, class ..._Args> 753 struct __pointer_traits_element_type<_Sp<_Tp, _Args...>, true> 754 { 755 typedef typename _Sp<_Tp, _Args...>::element_type type; 756 }; 757 758 template <template <class, class...> class _Sp, class _Tp, class ..._Args> 759 struct __pointer_traits_element_type<_Sp<_Tp, _Args...>, false> 760 { 761 typedef _Tp type; 762 }; 763 764 #else // _LIBCPP_HAS_NO_VARIADICS 765 766 template <template <class> class _Sp, class _Tp> 767 struct __pointer_traits_element_type<_Sp<_Tp>, true> 768 { 769 typedef typename _Sp<_Tp>::element_type type; 770 }; 771 772 template <template <class> class _Sp, class _Tp> 773 struct __pointer_traits_element_type<_Sp<_Tp>, false> 774 { 775 typedef _Tp type; 776 }; 777 778 template <template <class, class> class _Sp, class _Tp, class _A0> 779 struct __pointer_traits_element_type<_Sp<_Tp, _A0>, true> 780 { 781 typedef typename _Sp<_Tp, _A0>::element_type type; 782 }; 783 784 template <template <class, class> class _Sp, class _Tp, class _A0> 785 struct __pointer_traits_element_type<_Sp<_Tp, _A0>, false> 786 { 787 typedef _Tp type; 788 }; 789 790 template <template <class, class, class> class _Sp, class _Tp, class _A0, class _A1> 791 struct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1>, true> 792 { 793 typedef typename _Sp<_Tp, _A0, _A1>::element_type type; 794 }; 795 796 template <template <class, class, class> class _Sp, class _Tp, class _A0, class _A1> 797 struct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1>, false> 798 { 799 typedef _Tp type; 800 }; 801 802 template <template <class, class, class, class> class _Sp, class _Tp, class _A0, 803 class _A1, class _A2> 804 struct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1, _A2>, true> 805 { 806 typedef typename _Sp<_Tp, _A0, _A1, _A2>::element_type type; 807 }; 808 809 template <template <class, class, class, class> class _Sp, class _Tp, class _A0, 810 class _A1, class _A2> 811 struct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1, _A2>, false> 812 { 813 typedef _Tp type; 814 }; 815 816 #endif // _LIBCPP_HAS_NO_VARIADICS 817 818 template <class _Tp, class = void> 819 struct __has_difference_type : false_type {}; 820 821 template <class _Tp> 822 struct __has_difference_type<_Tp, 823 typename __void_t<typename _Tp::difference_type>::type> : true_type {}; 824 825 template <class _Ptr, bool = __has_difference_type<_Ptr>::value> 826 struct __pointer_traits_difference_type 827 { 828 typedef ptrdiff_t type; 829 }; 830 831 template <class _Ptr> 832 struct __pointer_traits_difference_type<_Ptr, true> 833 { 834 typedef typename _Ptr::difference_type type; 835 }; 836 837 template <class _Tp, class _Up> 838 struct __has_rebind 839 { 840 private: 841 struct __two {char __lx; char __lxx;}; 842 template <class _Xp> static __two __test(...); 843 template <class _Xp> static char __test(typename _Xp::template rebind<_Up>* = 0); 844 public: 845 static const bool value = sizeof(__test<_Tp>(0)) == 1; 846 }; 847 848 template <class _Tp, class _Up, bool = __has_rebind<_Tp, _Up>::value> 849 struct __pointer_traits_rebind 850 { 851 #ifndef _LIBCPP_CXX03_LANG 852 typedef typename _Tp::template rebind<_Up> type; 853 #else 854 typedef typename _Tp::template rebind<_Up>::other type; 855 #endif 856 }; 857 858 #ifndef _LIBCPP_HAS_NO_VARIADICS 859 860 template <template <class, class...> class _Sp, class _Tp, class ..._Args, class _Up> 861 struct __pointer_traits_rebind<_Sp<_Tp, _Args...>, _Up, true> 862 { 863 #ifndef _LIBCPP_CXX03_LANG 864 typedef typename _Sp<_Tp, _Args...>::template rebind<_Up> type; 865 #else 866 typedef typename _Sp<_Tp, _Args...>::template rebind<_Up>::other type; 867 #endif 868 }; 869 870 template <template <class, class...> class _Sp, class _Tp, class ..._Args, class _Up> 871 struct __pointer_traits_rebind<_Sp<_Tp, _Args...>, _Up, false> 872 { 873 typedef _Sp<_Up, _Args...> type; 874 }; 875 876 #else // _LIBCPP_HAS_NO_VARIADICS 877 878 template <template <class> class _Sp, class _Tp, class _Up> 879 struct __pointer_traits_rebind<_Sp<_Tp>, _Up, true> 880 { 881 #ifndef _LIBCPP_CXX03_LANG 882 typedef typename _Sp<_Tp>::template rebind<_Up> type; 883 #else 884 typedef typename _Sp<_Tp>::template rebind<_Up>::other type; 885 #endif 886 }; 887 888 template <template <class> class _Sp, class _Tp, class _Up> 889 struct __pointer_traits_rebind<_Sp<_Tp>, _Up, false> 890 { 891 typedef _Sp<_Up> type; 892 }; 893 894 template <template <class, class> class _Sp, class _Tp, class _A0, class _Up> 895 struct __pointer_traits_rebind<_Sp<_Tp, _A0>, _Up, true> 896 { 897 #ifndef _LIBCPP_CXX03_LANG 898 typedef typename _Sp<_Tp, _A0>::template rebind<_Up> type; 899 #else 900 typedef typename _Sp<_Tp, _A0>::template rebind<_Up>::other type; 901 #endif 902 }; 903 904 template <template <class, class> class _Sp, class _Tp, class _A0, class _Up> 905 struct __pointer_traits_rebind<_Sp<_Tp, _A0>, _Up, false> 906 { 907 typedef _Sp<_Up, _A0> type; 908 }; 909 910 template <template <class, class, class> class _Sp, class _Tp, class _A0, 911 class _A1, class _Up> 912 struct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1>, _Up, true> 913 { 914 #ifndef _LIBCPP_CXX03_LANG 915 typedef typename _Sp<_Tp, _A0, _A1>::template rebind<_Up> type; 916 #else 917 typedef typename _Sp<_Tp, _A0, _A1>::template rebind<_Up>::other type; 918 #endif 919 }; 920 921 template <template <class, class, class> class _Sp, class _Tp, class _A0, 922 class _A1, class _Up> 923 struct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1>, _Up, false> 924 { 925 typedef _Sp<_Up, _A0, _A1> type; 926 }; 927 928 template <template <class, class, class, class> class _Sp, class _Tp, class _A0, 929 class _A1, class _A2, class _Up> 930 struct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1, _A2>, _Up, true> 931 { 932 #ifndef _LIBCPP_CXX03_LANG 933 typedef typename _Sp<_Tp, _A0, _A1, _A2>::template rebind<_Up> type; 934 #else 935 typedef typename _Sp<_Tp, _A0, _A1, _A2>::template rebind<_Up>::other type; 936 #endif 937 }; 938 939 template <template <class, class, class, class> class _Sp, class _Tp, class _A0, 940 class _A1, class _A2, class _Up> 941 struct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1, _A2>, _Up, false> 942 { 943 typedef _Sp<_Up, _A0, _A1, _A2> type; 944 }; 945 946 #endif // _LIBCPP_HAS_NO_VARIADICS 947 948 template <class _Ptr> 949 struct _LIBCPP_TEMPLATE_VIS pointer_traits 950 { 951 typedef _Ptr pointer; 952 typedef typename __pointer_traits_element_type<pointer>::type element_type; 953 typedef typename __pointer_traits_difference_type<pointer>::type difference_type; 954 955 #ifndef _LIBCPP_CXX03_LANG 956 template <class _Up> using rebind = typename __pointer_traits_rebind<pointer, _Up>::type; 957 #else 958 template <class _Up> struct rebind 959 {typedef typename __pointer_traits_rebind<pointer, _Up>::type other;}; 960 #endif // _LIBCPP_CXX03_LANG 961 962 private: 963 struct __nat {}; 964 public: 965 _LIBCPP_INLINE_VISIBILITY 966 static pointer pointer_to(typename conditional<is_void<element_type>::value, 967 __nat, element_type>::type& __r) 968 {return pointer::pointer_to(__r);} 969 }; 970 971 template <class _Tp> 972 struct _LIBCPP_TEMPLATE_VIS pointer_traits<_Tp*> 973 { 974 typedef _Tp* pointer; 975 typedef _Tp element_type; 976 typedef ptrdiff_t difference_type; 977 978 #ifndef _LIBCPP_CXX03_LANG 979 template <class _Up> using rebind = _Up*; 980 #else 981 template <class _Up> struct rebind {typedef _Up* other;}; 982 #endif 983 984 private: 985 struct __nat {}; 986 public: 987 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 988 static pointer pointer_to(typename conditional<is_void<element_type>::value, 989 __nat, element_type>::type& __r) _NOEXCEPT 990 {return _VSTD::addressof(__r);} 991 }; 992 993 template <class _From, class _To> 994 struct __rebind_pointer { 995 #ifndef _LIBCPP_CXX03_LANG 996 typedef typename pointer_traits<_From>::template rebind<_To> type; 997 #else 998 typedef typename pointer_traits<_From>::template rebind<_To>::other type; 999 #endif 1000 }; 1001 1002 // allocator_traits 1003 1004 template <class _Tp, class = void> 1005 struct __has_pointer_type : false_type {}; 1006 1007 template <class _Tp> 1008 struct __has_pointer_type<_Tp, 1009 typename __void_t<typename _Tp::pointer>::type> : true_type {}; 1010 1011 namespace __pointer_type_imp 1012 { 1013 1014 template <class _Tp, class _Dp, bool = __has_pointer_type<_Dp>::value> 1015 struct __pointer_type 1016 { 1017 typedef typename _Dp::pointer type; 1018 }; 1019 1020 template <class _Tp, class _Dp> 1021 struct __pointer_type<_Tp, _Dp, false> 1022 { 1023 typedef _Tp* type; 1024 }; 1025 1026 } // __pointer_type_imp 1027 1028 template <class _Tp, class _Dp> 1029 struct __pointer_type 1030 { 1031 typedef typename __pointer_type_imp::__pointer_type<_Tp, typename remove_reference<_Dp>::type>::type type; 1032 }; 1033 1034 template <class _Tp, class = void> 1035 struct __has_const_pointer : false_type {}; 1036 1037 template <class _Tp> 1038 struct __has_const_pointer<_Tp, 1039 typename __void_t<typename _Tp::const_pointer>::type> : true_type {}; 1040 1041 template <class _Tp, class _Ptr, class _Alloc, bool = __has_const_pointer<_Alloc>::value> 1042 struct __const_pointer 1043 { 1044 typedef typename _Alloc::const_pointer type; 1045 }; 1046 1047 template <class _Tp, class _Ptr, class _Alloc> 1048 struct __const_pointer<_Tp, _Ptr, _Alloc, false> 1049 { 1050 #ifndef _LIBCPP_CXX03_LANG 1051 typedef typename pointer_traits<_Ptr>::template rebind<const _Tp> type; 1052 #else 1053 typedef typename pointer_traits<_Ptr>::template rebind<const _Tp>::other type; 1054 #endif 1055 }; 1056 1057 template <class _Tp, class = void> 1058 struct __has_void_pointer : false_type {}; 1059 1060 template <class _Tp> 1061 struct __has_void_pointer<_Tp, 1062 typename __void_t<typename _Tp::void_pointer>::type> : true_type {}; 1063 1064 template <class _Ptr, class _Alloc, bool = __has_void_pointer<_Alloc>::value> 1065 struct __void_pointer 1066 { 1067 typedef typename _Alloc::void_pointer type; 1068 }; 1069 1070 template <class _Ptr, class _Alloc> 1071 struct __void_pointer<_Ptr, _Alloc, false> 1072 { 1073 #ifndef _LIBCPP_CXX03_LANG 1074 typedef typename pointer_traits<_Ptr>::template rebind<void> type; 1075 #else 1076 typedef typename pointer_traits<_Ptr>::template rebind<void>::other type; 1077 #endif 1078 }; 1079 1080 template <class _Tp, class = void> 1081 struct __has_const_void_pointer : false_type {}; 1082 1083 template <class _Tp> 1084 struct __has_const_void_pointer<_Tp, 1085 typename __void_t<typename _Tp::const_void_pointer>::type> : true_type {}; 1086 1087 template <class _Ptr, class _Alloc, bool = __has_const_void_pointer<_Alloc>::value> 1088 struct __const_void_pointer 1089 { 1090 typedef typename _Alloc::const_void_pointer type; 1091 }; 1092 1093 template <class _Ptr, class _Alloc> 1094 struct __const_void_pointer<_Ptr, _Alloc, false> 1095 { 1096 #ifndef _LIBCPP_CXX03_LANG 1097 typedef typename pointer_traits<_Ptr>::template rebind<const void> type; 1098 #else 1099 typedef typename pointer_traits<_Ptr>::template rebind<const void>::other type; 1100 #endif 1101 }; 1102 1103 template <class _Tp> 1104 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 1105 _Tp* 1106 __to_raw_pointer(_Tp* __p) _NOEXCEPT 1107 { 1108 return __p; 1109 } 1110 1111 #if _LIBCPP_STD_VER <= 17 1112 template <class _Pointer> 1113 inline _LIBCPP_INLINE_VISIBILITY 1114 typename pointer_traits<_Pointer>::element_type* 1115 __to_raw_pointer(_Pointer __p) _NOEXCEPT 1116 { 1117 return _VSTD::__to_raw_pointer(__p.operator->()); 1118 } 1119 #else 1120 template <class _Pointer> 1121 inline _LIBCPP_INLINE_VISIBILITY 1122 auto 1123 __to_raw_pointer(const _Pointer& __p) _NOEXCEPT 1124 -> decltype(pointer_traits<_Pointer>::to_address(__p)) 1125 { 1126 return pointer_traits<_Pointer>::to_address(__p); 1127 } 1128 1129 template <class _Pointer, class... _None> 1130 inline _LIBCPP_INLINE_VISIBILITY 1131 auto 1132 __to_raw_pointer(const _Pointer& __p, _None...) _NOEXCEPT 1133 { 1134 return _VSTD::__to_raw_pointer(__p.operator->()); 1135 } 1136 1137 template <class _Tp> 1138 inline _LIBCPP_INLINE_VISIBILITY constexpr 1139 _Tp* 1140 to_address(_Tp* __p) _NOEXCEPT 1141 { 1142 static_assert(!is_function_v<_Tp>, "_Tp is a function type"); 1143 return __p; 1144 } 1145 1146 template <class _Pointer> 1147 inline _LIBCPP_INLINE_VISIBILITY 1148 auto 1149 to_address(const _Pointer& __p) _NOEXCEPT 1150 { 1151 return _VSTD::__to_raw_pointer(__p); 1152 } 1153 #endif 1154 1155 template <class _Tp, class = void> 1156 struct __has_size_type : false_type {}; 1157 1158 template <class _Tp> 1159 struct __has_size_type<_Tp, 1160 typename __void_t<typename _Tp::size_type>::type> : true_type {}; 1161 1162 template <class _Alloc, class _DiffType, bool = __has_size_type<_Alloc>::value> 1163 struct __size_type 1164 { 1165 typedef typename make_unsigned<_DiffType>::type type; 1166 }; 1167 1168 template <class _Alloc, class _DiffType> 1169 struct __size_type<_Alloc, _DiffType, true> 1170 { 1171 typedef typename _Alloc::size_type type; 1172 }; 1173 1174 template <class _Tp, class = void> 1175 struct __has_propagate_on_container_copy_assignment : false_type {}; 1176 1177 template <class _Tp> 1178 struct __has_propagate_on_container_copy_assignment<_Tp, 1179 typename __void_t<typename _Tp::propagate_on_container_copy_assignment>::type> 1180 : true_type {}; 1181 1182 template <class _Alloc, bool = __has_propagate_on_container_copy_assignment<_Alloc>::value> 1183 struct __propagate_on_container_copy_assignment 1184 { 1185 typedef false_type type; 1186 }; 1187 1188 template <class _Alloc> 1189 struct __propagate_on_container_copy_assignment<_Alloc, true> 1190 { 1191 typedef typename _Alloc::propagate_on_container_copy_assignment type; 1192 }; 1193 1194 template <class _Tp, class = void> 1195 struct __has_propagate_on_container_move_assignment : false_type {}; 1196 1197 template <class _Tp> 1198 struct __has_propagate_on_container_move_assignment<_Tp, 1199 typename __void_t<typename _Tp::propagate_on_container_move_assignment>::type> 1200 : true_type {}; 1201 1202 template <class _Alloc, bool = __has_propagate_on_container_move_assignment<_Alloc>::value> 1203 struct __propagate_on_container_move_assignment 1204 { 1205 typedef false_type type; 1206 }; 1207 1208 template <class _Alloc> 1209 struct __propagate_on_container_move_assignment<_Alloc, true> 1210 { 1211 typedef typename _Alloc::propagate_on_container_move_assignment type; 1212 }; 1213 1214 template <class _Tp, class = void> 1215 struct __has_propagate_on_container_swap : false_type {}; 1216 1217 template <class _Tp> 1218 struct __has_propagate_on_container_swap<_Tp, 1219 typename __void_t<typename _Tp::propagate_on_container_swap>::type> 1220 : true_type {}; 1221 1222 template <class _Alloc, bool = __has_propagate_on_container_swap<_Alloc>::value> 1223 struct __propagate_on_container_swap 1224 { 1225 typedef false_type type; 1226 }; 1227 1228 template <class _Alloc> 1229 struct __propagate_on_container_swap<_Alloc, true> 1230 { 1231 typedef typename _Alloc::propagate_on_container_swap type; 1232 }; 1233 1234 template <class _Tp, class = void> 1235 struct __has_is_always_equal : false_type {}; 1236 1237 template <class _Tp> 1238 struct __has_is_always_equal<_Tp, 1239 typename __void_t<typename _Tp::is_always_equal>::type> 1240 : true_type {}; 1241 1242 template <class _Alloc, bool = __has_is_always_equal<_Alloc>::value> 1243 struct __is_always_equal 1244 { 1245 typedef typename _VSTD::is_empty<_Alloc>::type type; 1246 }; 1247 1248 template <class _Alloc> 1249 struct __is_always_equal<_Alloc, true> 1250 { 1251 typedef typename _Alloc::is_always_equal type; 1252 }; 1253 1254 template <class _Tp, class _Up, bool = __has_rebind<_Tp, _Up>::value> 1255 struct __has_rebind_other 1256 { 1257 private: 1258 struct __two {char __lx; char __lxx;}; 1259 template <class _Xp> static __two __test(...); 1260 template <class _Xp> static char __test(typename _Xp::template rebind<_Up>::other* = 0); 1261 public: 1262 static const bool value = sizeof(__test<_Tp>(0)) == 1; 1263 }; 1264 1265 template <class _Tp, class _Up> 1266 struct __has_rebind_other<_Tp, _Up, false> 1267 { 1268 static const bool value = false; 1269 }; 1270 1271 template <class _Tp, class _Up, bool = __has_rebind_other<_Tp, _Up>::value> 1272 struct __allocator_traits_rebind 1273 { 1274 typedef typename _Tp::template rebind<_Up>::other type; 1275 }; 1276 1277 #ifndef _LIBCPP_HAS_NO_VARIADICS 1278 1279 template <template <class, class...> class _Alloc, class _Tp, class ..._Args, class _Up> 1280 struct __allocator_traits_rebind<_Alloc<_Tp, _Args...>, _Up, true> 1281 { 1282 typedef typename _Alloc<_Tp, _Args...>::template rebind<_Up>::other type; 1283 }; 1284 1285 template <template <class, class...> class _Alloc, class _Tp, class ..._Args, class _Up> 1286 struct __allocator_traits_rebind<_Alloc<_Tp, _Args...>, _Up, false> 1287 { 1288 typedef _Alloc<_Up, _Args...> type; 1289 }; 1290 1291 #else // _LIBCPP_HAS_NO_VARIADICS 1292 1293 template <template <class> class _Alloc, class _Tp, class _Up> 1294 struct __allocator_traits_rebind<_Alloc<_Tp>, _Up, true> 1295 { 1296 typedef typename _Alloc<_Tp>::template rebind<_Up>::other type; 1297 }; 1298 1299 template <template <class> class _Alloc, class _Tp, class _Up> 1300 struct __allocator_traits_rebind<_Alloc<_Tp>, _Up, false> 1301 { 1302 typedef _Alloc<_Up> type; 1303 }; 1304 1305 template <template <class, class> class _Alloc, class _Tp, class _A0, class _Up> 1306 struct __allocator_traits_rebind<_Alloc<_Tp, _A0>, _Up, true> 1307 { 1308 typedef typename _Alloc<_Tp, _A0>::template rebind<_Up>::other type; 1309 }; 1310 1311 template <template <class, class> class _Alloc, class _Tp, class _A0, class _Up> 1312 struct __allocator_traits_rebind<_Alloc<_Tp, _A0>, _Up, false> 1313 { 1314 typedef _Alloc<_Up, _A0> type; 1315 }; 1316 1317 template <template <class, class, class> class _Alloc, class _Tp, class _A0, 1318 class _A1, class _Up> 1319 struct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1>, _Up, true> 1320 { 1321 typedef typename _Alloc<_Tp, _A0, _A1>::template rebind<_Up>::other type; 1322 }; 1323 1324 template <template <class, class, class> class _Alloc, class _Tp, class _A0, 1325 class _A1, class _Up> 1326 struct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1>, _Up, false> 1327 { 1328 typedef _Alloc<_Up, _A0, _A1> type; 1329 }; 1330 1331 template <template <class, class, class, class> class _Alloc, class _Tp, class _A0, 1332 class _A1, class _A2, class _Up> 1333 struct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1, _A2>, _Up, true> 1334 { 1335 typedef typename _Alloc<_Tp, _A0, _A1, _A2>::template rebind<_Up>::other type; 1336 }; 1337 1338 template <template <class, class, class, class> class _Alloc, class _Tp, class _A0, 1339 class _A1, class _A2, class _Up> 1340 struct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1, _A2>, _Up, false> 1341 { 1342 typedef _Alloc<_Up, _A0, _A1, _A2> type; 1343 }; 1344 1345 #endif // _LIBCPP_HAS_NO_VARIADICS 1346 1347 #ifndef _LIBCPP_CXX03_LANG 1348 1349 template <class _Alloc, class _SizeType, class _ConstVoidPtr> 1350 auto 1351 __has_allocate_hint_test(_Alloc&& __a, _SizeType&& __sz, _ConstVoidPtr&& __p) 1352 -> decltype((void)__a.allocate(__sz, __p), true_type()); 1353 1354 template <class _Alloc, class _SizeType, class _ConstVoidPtr> 1355 auto 1356 __has_allocate_hint_test(const _Alloc& __a, _SizeType&& __sz, _ConstVoidPtr&& __p) 1357 -> false_type; 1358 1359 template <class _Alloc, class _SizeType, class _ConstVoidPtr> 1360 struct __has_allocate_hint 1361 : integral_constant<bool, 1362 is_same< 1363 decltype(_VSTD::__has_allocate_hint_test(declval<_Alloc>(), 1364 declval<_SizeType>(), 1365 declval<_ConstVoidPtr>())), 1366 true_type>::value> 1367 { 1368 }; 1369 1370 #else // _LIBCPP_CXX03_LANG 1371 1372 template <class _Alloc, class _SizeType, class _ConstVoidPtr> 1373 struct __has_allocate_hint 1374 : true_type 1375 { 1376 }; 1377 1378 #endif // _LIBCPP_CXX03_LANG 1379 1380 #if !defined(_LIBCPP_CXX03_LANG) 1381 1382 template <class _Alloc, class _Tp, class ..._Args> 1383 decltype(_VSTD::declval<_Alloc>().construct(_VSTD::declval<_Tp*>(), 1384 _VSTD::declval<_Args>()...), 1385 true_type()) 1386 __has_construct_test(_Alloc&& __a, _Tp* __p, _Args&& ...__args); 1387 1388 template <class _Alloc, class _Pointer, class ..._Args> 1389 false_type 1390 __has_construct_test(const _Alloc& __a, _Pointer&& __p, _Args&& ...__args); 1391 1392 template <class _Alloc, class _Pointer, class ..._Args> 1393 struct __has_construct 1394 : integral_constant<bool, 1395 is_same< 1396 decltype(_VSTD::__has_construct_test(declval<_Alloc>(), 1397 declval<_Pointer>(), 1398 declval<_Args>()...)), 1399 true_type>::value> 1400 { 1401 }; 1402 1403 template <class _Alloc, class _Pointer> 1404 auto 1405 __has_destroy_test(_Alloc&& __a, _Pointer&& __p) 1406 -> decltype(__a.destroy(__p), true_type()); 1407 1408 template <class _Alloc, class _Pointer> 1409 auto 1410 __has_destroy_test(const _Alloc& __a, _Pointer&& __p) 1411 -> false_type; 1412 1413 template <class _Alloc, class _Pointer> 1414 struct __has_destroy 1415 : integral_constant<bool, 1416 is_same< 1417 decltype(_VSTD::__has_destroy_test(declval<_Alloc>(), 1418 declval<_Pointer>())), 1419 true_type>::value> 1420 { 1421 }; 1422 1423 template <class _Alloc> 1424 auto 1425 __has_max_size_test(_Alloc&& __a) 1426 -> decltype(__a.max_size(), true_type()); 1427 1428 template <class _Alloc> 1429 auto 1430 __has_max_size_test(const volatile _Alloc& __a) 1431 -> false_type; 1432 1433 template <class _Alloc> 1434 struct __has_max_size 1435 : integral_constant<bool, 1436 is_same< 1437 decltype(_VSTD::__has_max_size_test(declval<_Alloc&>())), 1438 true_type>::value> 1439 { 1440 }; 1441 1442 template <class _Alloc> 1443 auto 1444 __has_select_on_container_copy_construction_test(_Alloc&& __a) 1445 -> decltype(__a.select_on_container_copy_construction(), true_type()); 1446 1447 template <class _Alloc> 1448 auto 1449 __has_select_on_container_copy_construction_test(const volatile _Alloc& __a) 1450 -> false_type; 1451 1452 template <class _Alloc> 1453 struct __has_select_on_container_copy_construction 1454 : integral_constant<bool, 1455 is_same< 1456 decltype(_VSTD::__has_select_on_container_copy_construction_test(declval<_Alloc&>())), 1457 true_type>::value> 1458 { 1459 }; 1460 1461 #else // _LIBCPP_CXX03_LANG 1462 1463 template <class _Alloc, class _Pointer, class _Tp, class = void> 1464 struct __has_construct : std::false_type {}; 1465 1466 template <class _Alloc, class _Pointer, class _Tp> 1467 struct __has_construct<_Alloc, _Pointer, _Tp, typename __void_t< 1468 decltype(_VSTD::declval<_Alloc>().construct(_VSTD::declval<_Pointer>(), _VSTD::declval<_Tp>())) 1469 >::type> : std::true_type {}; 1470 1471 template <class _Alloc, class _Pointer, class = void> 1472 struct __has_destroy : false_type {}; 1473 1474 template <class _Alloc, class _Pointer> 1475 struct __has_destroy<_Alloc, _Pointer, typename __void_t< 1476 decltype(_VSTD::declval<_Alloc>().destroy(_VSTD::declval<_Pointer>())) 1477 >::type> : std::true_type {}; 1478 1479 template <class _Alloc> 1480 struct __has_max_size 1481 : true_type 1482 { 1483 }; 1484 1485 template <class _Alloc> 1486 struct __has_select_on_container_copy_construction 1487 : false_type 1488 { 1489 }; 1490 1491 #endif // _LIBCPP_CXX03_LANG 1492 1493 template <class _Alloc, class _Ptr, bool = __has_difference_type<_Alloc>::value> 1494 struct __alloc_traits_difference_type 1495 { 1496 typedef typename pointer_traits<_Ptr>::difference_type type; 1497 }; 1498 1499 template <class _Alloc, class _Ptr> 1500 struct __alloc_traits_difference_type<_Alloc, _Ptr, true> 1501 { 1502 typedef typename _Alloc::difference_type type; 1503 }; 1504 1505 template <class _Tp> 1506 struct __is_default_allocator : false_type {}; 1507 1508 template <class _Tp> 1509 struct __is_default_allocator<_VSTD::allocator<_Tp> > : true_type {}; 1510 1511 template <class _Alloc> 1512 struct _LIBCPP_TEMPLATE_VIS allocator_traits 1513 { 1514 typedef _Alloc allocator_type; 1515 typedef typename allocator_type::value_type value_type; 1516 1517 typedef typename __pointer_type<value_type, allocator_type>::type pointer; 1518 typedef typename __const_pointer<value_type, pointer, allocator_type>::type const_pointer; 1519 typedef typename __void_pointer<pointer, allocator_type>::type void_pointer; 1520 typedef typename __const_void_pointer<pointer, allocator_type>::type const_void_pointer; 1521 1522 typedef typename __alloc_traits_difference_type<allocator_type, pointer>::type difference_type; 1523 typedef typename __size_type<allocator_type, difference_type>::type size_type; 1524 1525 typedef typename __propagate_on_container_copy_assignment<allocator_type>::type 1526 propagate_on_container_copy_assignment; 1527 typedef typename __propagate_on_container_move_assignment<allocator_type>::type 1528 propagate_on_container_move_assignment; 1529 typedef typename __propagate_on_container_swap<allocator_type>::type 1530 propagate_on_container_swap; 1531 typedef typename __is_always_equal<allocator_type>::type 1532 is_always_equal; 1533 1534 #ifndef _LIBCPP_CXX03_LANG 1535 template <class _Tp> using rebind_alloc = 1536 typename __allocator_traits_rebind<allocator_type, _Tp>::type; 1537 template <class _Tp> using rebind_traits = allocator_traits<rebind_alloc<_Tp>>; 1538 #else // _LIBCPP_CXX03_LANG 1539 template <class _Tp> struct rebind_alloc 1540 {typedef typename __allocator_traits_rebind<allocator_type, _Tp>::type other;}; 1541 template <class _Tp> struct rebind_traits 1542 {typedef allocator_traits<typename rebind_alloc<_Tp>::other> other;}; 1543 #endif // _LIBCPP_CXX03_LANG 1544 1545 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 1546 static pointer allocate(allocator_type& __a, size_type __n) 1547 {return __a.allocate(__n);} 1548 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 1549 static pointer allocate(allocator_type& __a, size_type __n, const_void_pointer __hint) 1550 {return __allocate(__a, __n, __hint, 1551 __has_allocate_hint<allocator_type, size_type, const_void_pointer>());} 1552 1553 _LIBCPP_INLINE_VISIBILITY 1554 static void deallocate(allocator_type& __a, pointer __p, size_type __n) _NOEXCEPT 1555 {__a.deallocate(__p, __n);} 1556 1557 #ifndef _LIBCPP_HAS_NO_VARIADICS 1558 template <class _Tp, class... _Args> 1559 _LIBCPP_INLINE_VISIBILITY 1560 static void construct(allocator_type& __a, _Tp* __p, _Args&&... __args) 1561 {__construct(__has_construct<allocator_type, _Tp*, _Args...>(), 1562 __a, __p, _VSTD::forward<_Args>(__args)...);} 1563 #else // _LIBCPP_HAS_NO_VARIADICS 1564 template <class _Tp> 1565 _LIBCPP_INLINE_VISIBILITY 1566 static void construct(allocator_type&, _Tp* __p) 1567 { 1568 ::new ((void*)__p) _Tp(); 1569 } 1570 template <class _Tp, class _A0> 1571 _LIBCPP_INLINE_VISIBILITY 1572 static void construct(allocator_type& __a, _Tp* __p, const _A0& __a0) 1573 { 1574 __construct(__has_construct<allocator_type, _Tp*, const _A0&>(), 1575 __a, __p, __a0); 1576 } 1577 template <class _Tp, class _A0, class _A1> 1578 _LIBCPP_INLINE_VISIBILITY 1579 static void construct(allocator_type&, _Tp* __p, const _A0& __a0, 1580 const _A1& __a1) 1581 { 1582 ::new ((void*)__p) _Tp(__a0, __a1); 1583 } 1584 template <class _Tp, class _A0, class _A1, class _A2> 1585 _LIBCPP_INLINE_VISIBILITY 1586 static void construct(allocator_type&, _Tp* __p, const _A0& __a0, 1587 const _A1& __a1, const _A2& __a2) 1588 { 1589 ::new ((void*)__p) _Tp(__a0, __a1, __a2); 1590 } 1591 #endif // _LIBCPP_HAS_NO_VARIADICS 1592 1593 template <class _Tp> 1594 _LIBCPP_INLINE_VISIBILITY 1595 static void destroy(allocator_type& __a, _Tp* __p) 1596 {__destroy(__has_destroy<allocator_type, _Tp*>(), __a, __p);} 1597 1598 _LIBCPP_INLINE_VISIBILITY 1599 static size_type max_size(const allocator_type& __a) _NOEXCEPT 1600 {return __max_size(__has_max_size<const allocator_type>(), __a);} 1601 1602 _LIBCPP_INLINE_VISIBILITY 1603 static allocator_type 1604 select_on_container_copy_construction(const allocator_type& __a) 1605 {return __select_on_container_copy_construction( 1606 __has_select_on_container_copy_construction<const allocator_type>(), 1607 __a);} 1608 1609 template <class _Ptr> 1610 _LIBCPP_INLINE_VISIBILITY 1611 static 1612 void 1613 __construct_forward(allocator_type& __a, _Ptr __begin1, _Ptr __end1, _Ptr& __begin2) 1614 { 1615 for (; __begin1 != __end1; ++__begin1, (void) ++__begin2) 1616 construct(__a, _VSTD::__to_raw_pointer(__begin2), _VSTD::move_if_noexcept(*__begin1)); 1617 } 1618 1619 template <class _Tp> 1620 _LIBCPP_INLINE_VISIBILITY 1621 static 1622 typename enable_if 1623 < 1624 (__is_default_allocator<allocator_type>::value 1625 || !__has_construct<allocator_type, _Tp*, _Tp>::value) && 1626 is_trivially_move_constructible<_Tp>::value, 1627 void 1628 >::type 1629 __construct_forward(allocator_type&, _Tp* __begin1, _Tp* __end1, _Tp*& __begin2) 1630 { 1631 ptrdiff_t _Np = __end1 - __begin1; 1632 if (_Np > 0) 1633 { 1634 _VSTD::memcpy(__begin2, __begin1, _Np * sizeof(_Tp)); 1635 __begin2 += _Np; 1636 } 1637 } 1638 1639 template <class _Iter, class _Ptr> 1640 _LIBCPP_INLINE_VISIBILITY 1641 static 1642 void 1643 __construct_range_forward(allocator_type& __a, _Iter __begin1, _Iter __end1, _Ptr& __begin2) 1644 { 1645 for (; __begin1 != __end1; ++__begin1, (void) ++__begin2) 1646 construct(__a, _VSTD::__to_raw_pointer(__begin2), *__begin1); 1647 } 1648 1649 template <class _SourceTp, class _DestTp, 1650 class _RawSourceTp = typename remove_const<_SourceTp>::type, 1651 class _RawDestTp = typename remove_const<_DestTp>::type> 1652 _LIBCPP_INLINE_VISIBILITY 1653 static 1654 typename enable_if 1655 < 1656 is_trivially_move_constructible<_DestTp>::value && 1657 is_same<_RawSourceTp, _RawDestTp>::value && 1658 (__is_default_allocator<allocator_type>::value || 1659 !__has_construct<allocator_type, _DestTp*, _SourceTp&>::value), 1660 void 1661 >::type 1662 __construct_range_forward(allocator_type&, _SourceTp* __begin1, _SourceTp* __end1, _DestTp*& __begin2) 1663 { 1664 ptrdiff_t _Np = __end1 - __begin1; 1665 if (_Np > 0) 1666 { 1667 _VSTD::memcpy(const_cast<_RawDestTp*>(__begin2), __begin1, _Np * sizeof(_DestTp)); 1668 __begin2 += _Np; 1669 } 1670 } 1671 1672 template <class _Ptr> 1673 _LIBCPP_INLINE_VISIBILITY 1674 static 1675 void 1676 __construct_backward(allocator_type& __a, _Ptr __begin1, _Ptr __end1, _Ptr& __end2) 1677 { 1678 while (__end1 != __begin1) 1679 { 1680 construct(__a, _VSTD::__to_raw_pointer(__end2-1), _VSTD::move_if_noexcept(*--__end1)); 1681 --__end2; 1682 } 1683 } 1684 1685 template <class _Tp> 1686 _LIBCPP_INLINE_VISIBILITY 1687 static 1688 typename enable_if 1689 < 1690 (__is_default_allocator<allocator_type>::value 1691 || !__has_construct<allocator_type, _Tp*, _Tp>::value) && 1692 is_trivially_move_constructible<_Tp>::value, 1693 void 1694 >::type 1695 __construct_backward(allocator_type&, _Tp* __begin1, _Tp* __end1, _Tp*& __end2) 1696 { 1697 ptrdiff_t _Np = __end1 - __begin1; 1698 __end2 -= _Np; 1699 if (_Np > 0) 1700 _VSTD::memcpy(__end2, __begin1, _Np * sizeof(_Tp)); 1701 } 1702 1703 private: 1704 1705 _LIBCPP_INLINE_VISIBILITY 1706 static pointer __allocate(allocator_type& __a, size_type __n, 1707 const_void_pointer __hint, true_type) 1708 {return __a.allocate(__n, __hint);} 1709 _LIBCPP_INLINE_VISIBILITY 1710 static pointer __allocate(allocator_type& __a, size_type __n, 1711 const_void_pointer, false_type) 1712 {return __a.allocate(__n);} 1713 1714 #ifndef _LIBCPP_HAS_NO_VARIADICS 1715 template <class _Tp, class... _Args> 1716 _LIBCPP_INLINE_VISIBILITY 1717 static void __construct(true_type, allocator_type& __a, _Tp* __p, _Args&&... __args) 1718 {__a.construct(__p, _VSTD::forward<_Args>(__args)...);} 1719 template <class _Tp, class... _Args> 1720 _LIBCPP_INLINE_VISIBILITY 1721 static void __construct(false_type, allocator_type&, _Tp* __p, _Args&&... __args) 1722 { 1723 ::new ((void*)__p) _Tp(_VSTD::forward<_Args>(__args)...); 1724 } 1725 #else // _LIBCPP_HAS_NO_VARIADICS 1726 template <class _Tp, class _A0> 1727 _LIBCPP_INLINE_VISIBILITY 1728 static void __construct(true_type, allocator_type& __a, _Tp* __p, 1729 const _A0& __a0) 1730 {__a.construct(__p, __a0);} 1731 template <class _Tp, class _A0> 1732 _LIBCPP_INLINE_VISIBILITY 1733 static void __construct(false_type, allocator_type&, _Tp* __p, 1734 const _A0& __a0) 1735 { 1736 ::new ((void*)__p) _Tp(__a0); 1737 } 1738 #endif // _LIBCPP_HAS_NO_VARIADICS 1739 1740 template <class _Tp> 1741 _LIBCPP_INLINE_VISIBILITY 1742 static void __destroy(true_type, allocator_type& __a, _Tp* __p) 1743 {__a.destroy(__p);} 1744 template <class _Tp> 1745 _LIBCPP_INLINE_VISIBILITY 1746 static void __destroy(false_type, allocator_type&, _Tp* __p) 1747 { 1748 __p->~_Tp(); 1749 } 1750 1751 _LIBCPP_INLINE_VISIBILITY 1752 static size_type __max_size(true_type, const allocator_type& __a) _NOEXCEPT 1753 {return __a.max_size();} 1754 _LIBCPP_INLINE_VISIBILITY 1755 static size_type __max_size(false_type, const allocator_type&) _NOEXCEPT 1756 {return numeric_limits<size_type>::max() / sizeof(value_type);} 1757 1758 _LIBCPP_INLINE_VISIBILITY 1759 static allocator_type 1760 __select_on_container_copy_construction(true_type, const allocator_type& __a) 1761 {return __a.select_on_container_copy_construction();} 1762 _LIBCPP_INLINE_VISIBILITY 1763 static allocator_type 1764 __select_on_container_copy_construction(false_type, const allocator_type& __a) 1765 {return __a;} 1766 }; 1767 1768 template <class _Traits, class _Tp> 1769 struct __rebind_alloc_helper 1770 { 1771 #ifndef _LIBCPP_CXX03_LANG 1772 typedef typename _Traits::template rebind_alloc<_Tp> type; 1773 #else 1774 typedef typename _Traits::template rebind_alloc<_Tp>::other type; 1775 #endif 1776 }; 1777 1778 // allocator 1779 1780 template <class _Tp> 1781 class _LIBCPP_TEMPLATE_VIS allocator 1782 { 1783 public: 1784 typedef size_t size_type; 1785 typedef ptrdiff_t difference_type; 1786 typedef _Tp* pointer; 1787 typedef const _Tp* const_pointer; 1788 typedef _Tp& reference; 1789 typedef const _Tp& const_reference; 1790 typedef _Tp value_type; 1791 1792 typedef true_type propagate_on_container_move_assignment; 1793 typedef true_type is_always_equal; 1794 1795 template <class _Up> struct rebind {typedef allocator<_Up> other;}; 1796 1797 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 1798 allocator() _NOEXCEPT {} 1799 1800 template <class _Up> 1801 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 1802 allocator(const allocator<_Up>&) _NOEXCEPT {} 1803 1804 _LIBCPP_INLINE_VISIBILITY pointer address(reference __x) const _NOEXCEPT 1805 {return _VSTD::addressof(__x);} 1806 _LIBCPP_INLINE_VISIBILITY const_pointer address(const_reference __x) const _NOEXCEPT 1807 {return _VSTD::addressof(__x);} 1808 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 1809 pointer allocate(size_type __n, allocator<void>::const_pointer = 0) 1810 { 1811 if (__n > max_size()) 1812 __throw_length_error("allocator<T>::allocate(size_t n)" 1813 " 'n' exceeds maximum supported size"); 1814 return static_cast<pointer>(_VSTD::__libcpp_allocate(__n * sizeof(_Tp), __alignof(_Tp))); 1815 } 1816 _LIBCPP_INLINE_VISIBILITY void deallocate(pointer __p, size_type __n) _NOEXCEPT 1817 {_VSTD::__libcpp_deallocate((void*)__p, __n * sizeof(_Tp), __alignof(_Tp));} 1818 _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT 1819 {return size_type(~0) / sizeof(_Tp);} 1820 #if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 1821 template <class _Up, class... _Args> 1822 _LIBCPP_INLINE_VISIBILITY 1823 void 1824 construct(_Up* __p, _Args&&... __args) 1825 { 1826 ::new((void*)__p) _Up(_VSTD::forward<_Args>(__args)...); 1827 } 1828 #else // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 1829 _LIBCPP_INLINE_VISIBILITY 1830 void 1831 construct(pointer __p) 1832 { 1833 ::new((void*)__p) _Tp(); 1834 } 1835 # if defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) 1836 1837 template <class _A0> 1838 _LIBCPP_INLINE_VISIBILITY 1839 void 1840 construct(pointer __p, _A0& __a0) 1841 { 1842 ::new((void*)__p) _Tp(__a0); 1843 } 1844 template <class _A0> 1845 _LIBCPP_INLINE_VISIBILITY 1846 void 1847 construct(pointer __p, const _A0& __a0) 1848 { 1849 ::new((void*)__p) _Tp(__a0); 1850 } 1851 # endif // defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) 1852 template <class _A0, class _A1> 1853 _LIBCPP_INLINE_VISIBILITY 1854 void 1855 construct(pointer __p, _A0& __a0, _A1& __a1) 1856 { 1857 ::new((void*)__p) _Tp(__a0, __a1); 1858 } 1859 template <class _A0, class _A1> 1860 _LIBCPP_INLINE_VISIBILITY 1861 void 1862 construct(pointer __p, const _A0& __a0, _A1& __a1) 1863 { 1864 ::new((void*)__p) _Tp(__a0, __a1); 1865 } 1866 template <class _A0, class _A1> 1867 _LIBCPP_INLINE_VISIBILITY 1868 void 1869 construct(pointer __p, _A0& __a0, const _A1& __a1) 1870 { 1871 ::new((void*)__p) _Tp(__a0, __a1); 1872 } 1873 template <class _A0, class _A1> 1874 _LIBCPP_INLINE_VISIBILITY 1875 void 1876 construct(pointer __p, const _A0& __a0, const _A1& __a1) 1877 { 1878 ::new((void*)__p) _Tp(__a0, __a1); 1879 } 1880 #endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 1881 _LIBCPP_INLINE_VISIBILITY void destroy(pointer __p) {__p->~_Tp();} 1882 }; 1883 1884 template <class _Tp> 1885 class _LIBCPP_TEMPLATE_VIS allocator<const _Tp> 1886 { 1887 public: 1888 typedef size_t size_type; 1889 typedef ptrdiff_t difference_type; 1890 typedef const _Tp* pointer; 1891 typedef const _Tp* const_pointer; 1892 typedef const _Tp& reference; 1893 typedef const _Tp& const_reference; 1894 typedef const _Tp value_type; 1895 1896 typedef true_type propagate_on_container_move_assignment; 1897 typedef true_type is_always_equal; 1898 1899 template <class _Up> struct rebind {typedef allocator<_Up> other;}; 1900 1901 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 1902 allocator() _NOEXCEPT {} 1903 1904 template <class _Up> 1905 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 1906 allocator(const allocator<_Up>&) _NOEXCEPT {} 1907 1908 _LIBCPP_INLINE_VISIBILITY const_pointer address(const_reference __x) const _NOEXCEPT 1909 {return _VSTD::addressof(__x);} 1910 _LIBCPP_INLINE_VISIBILITY pointer allocate(size_type __n, allocator<void>::const_pointer = 0) 1911 { 1912 if (__n > max_size()) 1913 __throw_length_error("allocator<const T>::allocate(size_t n)" 1914 " 'n' exceeds maximum supported size"); 1915 return static_cast<pointer>(_VSTD::__libcpp_allocate(__n * sizeof(_Tp), __alignof(_Tp))); 1916 } 1917 _LIBCPP_INLINE_VISIBILITY void deallocate(pointer __p, size_type __n) _NOEXCEPT 1918 {_VSTD::__libcpp_deallocate((void*) const_cast<_Tp *>(__p), __n * sizeof(_Tp), __alignof(_Tp));} 1919 _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT 1920 {return size_type(~0) / sizeof(_Tp);} 1921 #if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 1922 template <class _Up, class... _Args> 1923 _LIBCPP_INLINE_VISIBILITY 1924 void 1925 construct(_Up* __p, _Args&&... __args) 1926 { 1927 ::new((void*)__p) _Up(_VSTD::forward<_Args>(__args)...); 1928 } 1929 #else // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 1930 _LIBCPP_INLINE_VISIBILITY 1931 void 1932 construct(pointer __p) 1933 { 1934 ::new((void*) const_cast<_Tp *>(__p)) _Tp(); 1935 } 1936 # if defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) 1937 1938 template <class _A0> 1939 _LIBCPP_INLINE_VISIBILITY 1940 void 1941 construct(pointer __p, _A0& __a0) 1942 { 1943 ::new((void*) const_cast<_Tp *>(__p)) _Tp(__a0); 1944 } 1945 template <class _A0> 1946 _LIBCPP_INLINE_VISIBILITY 1947 void 1948 construct(pointer __p, const _A0& __a0) 1949 { 1950 ::new((void*) const_cast<_Tp *>(__p)) _Tp(__a0); 1951 } 1952 # endif // defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) 1953 template <class _A0, class _A1> 1954 _LIBCPP_INLINE_VISIBILITY 1955 void 1956 construct(pointer __p, _A0& __a0, _A1& __a1) 1957 { 1958 ::new((void*) const_cast<_Tp *>(__p)) _Tp(__a0, __a1); 1959 } 1960 template <class _A0, class _A1> 1961 _LIBCPP_INLINE_VISIBILITY 1962 void 1963 construct(pointer __p, const _A0& __a0, _A1& __a1) 1964 { 1965 ::new((void*) const_cast<_Tp *>(__p)) _Tp(__a0, __a1); 1966 } 1967 template <class _A0, class _A1> 1968 _LIBCPP_INLINE_VISIBILITY 1969 void 1970 construct(pointer __p, _A0& __a0, const _A1& __a1) 1971 { 1972 ::new((void*) const_cast<_Tp *>(__p)) _Tp(__a0, __a1); 1973 } 1974 template <class _A0, class _A1> 1975 _LIBCPP_INLINE_VISIBILITY 1976 void 1977 construct(pointer __p, const _A0& __a0, const _A1& __a1) 1978 { 1979 ::new((void*) const_cast<_Tp *>(__p)) _Tp(__a0, __a1); 1980 } 1981 #endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 1982 _LIBCPP_INLINE_VISIBILITY void destroy(pointer __p) {__p->~_Tp();} 1983 }; 1984 1985 template <class _Tp, class _Up> 1986 inline _LIBCPP_INLINE_VISIBILITY 1987 bool operator==(const allocator<_Tp>&, const allocator<_Up>&) _NOEXCEPT {return true;} 1988 1989 template <class _Tp, class _Up> 1990 inline _LIBCPP_INLINE_VISIBILITY 1991 bool operator!=(const allocator<_Tp>&, const allocator<_Up>&) _NOEXCEPT {return false;} 1992 1993 template <class _OutputIterator, class _Tp> 1994 class _LIBCPP_TEMPLATE_VIS raw_storage_iterator 1995 : public iterator<output_iterator_tag, 1996 _Tp, // purposefully not C++03 1997 ptrdiff_t, // purposefully not C++03 1998 _Tp*, // purposefully not C++03 1999 raw_storage_iterator<_OutputIterator, _Tp>&> // purposefully not C++03 2000 { 2001 private: 2002 _OutputIterator __x_; 2003 public: 2004 _LIBCPP_INLINE_VISIBILITY explicit raw_storage_iterator(_OutputIterator __x) : __x_(__x) {} 2005 _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator*() {return *this;} 2006 _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator=(const _Tp& __element) 2007 {::new(_VSTD::addressof(*__x_)) _Tp(__element); return *this;} 2008 #if _LIBCPP_STD_VER >= 14 2009 _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator=(_Tp&& __element) 2010 {::new(_VSTD::addressof(*__x_)) _Tp(_VSTD::move(__element)); return *this;} 2011 #endif 2012 _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator++() {++__x_; return *this;} 2013 _LIBCPP_INLINE_VISIBILITY raw_storage_iterator operator++(int) 2014 {raw_storage_iterator __t(*this); ++__x_; return __t;} 2015 #if _LIBCPP_STD_VER >= 14 2016 _LIBCPP_INLINE_VISIBILITY _OutputIterator base() const { return __x_; } 2017 #endif 2018 }; 2019 2020 template <class _Tp> 2021 _LIBCPP_NODISCARD_EXT _LIBCPP_NO_CFI 2022 pair<_Tp*, ptrdiff_t> 2023 get_temporary_buffer(ptrdiff_t __n) _NOEXCEPT 2024 { 2025 pair<_Tp*, ptrdiff_t> __r(0, 0); 2026 const ptrdiff_t __m = (~ptrdiff_t(0) ^ 2027 ptrdiff_t(ptrdiff_t(1) << (sizeof(ptrdiff_t) * __CHAR_BIT__ - 1))) 2028 / sizeof(_Tp); 2029 if (__n > __m) 2030 __n = __m; 2031 while (__n > 0) 2032 { 2033 #if !defined(_LIBCPP_HAS_NO_ALIGNED_ALLOCATION) 2034 if (__is_overaligned_for_new(__alignof(_Tp))) 2035 { 2036 std::align_val_t __al = 2037 std::align_val_t(std::alignment_of<_Tp>::value); 2038 __r.first = static_cast<_Tp*>(::operator new( 2039 __n * sizeof(_Tp), __al, nothrow)); 2040 } else { 2041 __r.first = static_cast<_Tp*>(::operator new( 2042 __n * sizeof(_Tp), nothrow)); 2043 } 2044 #else 2045 if (__is_overaligned_for_new(__alignof(_Tp))) 2046 { 2047 // Since aligned operator new is unavailable, return an empty 2048 // buffer rather than one with invalid alignment. 2049 return __r; 2050 } 2051 2052 __r.first = static_cast<_Tp*>(::operator new(__n * sizeof(_Tp), nothrow)); 2053 #endif 2054 2055 if (__r.first) 2056 { 2057 __r.second = __n; 2058 break; 2059 } 2060 __n /= 2; 2061 } 2062 return __r; 2063 } 2064 2065 template <class _Tp> 2066 inline _LIBCPP_INLINE_VISIBILITY 2067 void return_temporary_buffer(_Tp* __p) _NOEXCEPT 2068 { 2069 _VSTD::__libcpp_deallocate_unsized((void*)__p, __alignof(_Tp)); 2070 } 2071 2072 #if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR) 2073 template <class _Tp> 2074 struct _LIBCPP_DEPRECATED_IN_CXX11 auto_ptr_ref 2075 { 2076 _Tp* __ptr_; 2077 }; 2078 2079 template<class _Tp> 2080 class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 auto_ptr 2081 { 2082 private: 2083 _Tp* __ptr_; 2084 public: 2085 typedef _Tp element_type; 2086 2087 _LIBCPP_INLINE_VISIBILITY explicit auto_ptr(_Tp* __p = 0) throw() : __ptr_(__p) {} 2088 _LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr& __p) throw() : __ptr_(__p.release()) {} 2089 template<class _Up> _LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr<_Up>& __p) throw() 2090 : __ptr_(__p.release()) {} 2091 _LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr& __p) throw() 2092 {reset(__p.release()); return *this;} 2093 template<class _Up> _LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr<_Up>& __p) throw() 2094 {reset(__p.release()); return *this;} 2095 _LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr_ref<_Tp> __p) throw() 2096 {reset(__p.__ptr_); return *this;} 2097 _LIBCPP_INLINE_VISIBILITY ~auto_ptr() throw() {delete __ptr_;} 2098 2099 _LIBCPP_INLINE_VISIBILITY _Tp& operator*() const throw() 2100 {return *__ptr_;} 2101 _LIBCPP_INLINE_VISIBILITY _Tp* operator->() const throw() {return __ptr_;} 2102 _LIBCPP_INLINE_VISIBILITY _Tp* get() const throw() {return __ptr_;} 2103 _LIBCPP_INLINE_VISIBILITY _Tp* release() throw() 2104 { 2105 _Tp* __t = __ptr_; 2106 __ptr_ = 0; 2107 return __t; 2108 } 2109 _LIBCPP_INLINE_VISIBILITY void reset(_Tp* __p = 0) throw() 2110 { 2111 if (__ptr_ != __p) 2112 delete __ptr_; 2113 __ptr_ = __p; 2114 } 2115 2116 _LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr_ref<_Tp> __p) throw() : __ptr_(__p.__ptr_) {} 2117 template<class _Up> _LIBCPP_INLINE_VISIBILITY operator auto_ptr_ref<_Up>() throw() 2118 {auto_ptr_ref<_Up> __t; __t.__ptr_ = release(); return __t;} 2119 template<class _Up> _LIBCPP_INLINE_VISIBILITY operator auto_ptr<_Up>() throw() 2120 {return auto_ptr<_Up>(release());} 2121 }; 2122 2123 template <> 2124 class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 auto_ptr<void> 2125 { 2126 public: 2127 typedef void element_type; 2128 }; 2129 #endif 2130 2131 template <class _Tp, int _Idx, 2132 bool _CanBeEmptyBase = 2133 is_empty<_Tp>::value && !__libcpp_is_final<_Tp>::value> 2134 struct __compressed_pair_elem { 2135 typedef _Tp _ParamT; 2136 typedef _Tp& reference; 2137 typedef const _Tp& const_reference; 2138 2139 #ifndef _LIBCPP_CXX03_LANG 2140 _LIBCPP_INLINE_VISIBILITY constexpr __compressed_pair_elem() : __value_() {} 2141 2142 template <class _Up, class = typename enable_if< 2143 !is_same<__compressed_pair_elem, typename decay<_Up>::type>::value 2144 >::type> 2145 _LIBCPP_INLINE_VISIBILITY 2146 constexpr explicit 2147 __compressed_pair_elem(_Up&& __u) 2148 : __value_(_VSTD::forward<_Up>(__u)) 2149 { 2150 } 2151 2152 template <class... _Args, size_t... _Indexes> 2153 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 2154 __compressed_pair_elem(piecewise_construct_t, tuple<_Args...> __args, 2155 __tuple_indices<_Indexes...>) 2156 : __value_(_VSTD::forward<_Args>(_VSTD::get<_Indexes>(__args))...) {} 2157 #else 2158 _LIBCPP_INLINE_VISIBILITY __compressed_pair_elem() : __value_() {} 2159 _LIBCPP_INLINE_VISIBILITY 2160 __compressed_pair_elem(_ParamT __p) : __value_(std::forward<_ParamT>(__p)) {} 2161 #endif 2162 2163 _LIBCPP_INLINE_VISIBILITY reference __get() _NOEXCEPT { return __value_; } 2164 _LIBCPP_INLINE_VISIBILITY 2165 const_reference __get() const _NOEXCEPT { return __value_; } 2166 2167 private: 2168 _Tp __value_; 2169 }; 2170 2171 template <class _Tp, int _Idx> 2172 struct __compressed_pair_elem<_Tp, _Idx, true> : private _Tp { 2173 typedef _Tp _ParamT; 2174 typedef _Tp& reference; 2175 typedef const _Tp& const_reference; 2176 typedef _Tp __value_type; 2177 2178 #ifndef _LIBCPP_CXX03_LANG 2179 _LIBCPP_INLINE_VISIBILITY constexpr __compressed_pair_elem() = default; 2180 2181 template <class _Up, class = typename enable_if< 2182 !is_same<__compressed_pair_elem, typename decay<_Up>::type>::value 2183 >::type> 2184 _LIBCPP_INLINE_VISIBILITY 2185 constexpr explicit 2186 __compressed_pair_elem(_Up&& __u) 2187 : __value_type(_VSTD::forward<_Up>(__u)) 2188 {} 2189 2190 template <class... _Args, size_t... _Indexes> 2191 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 2192 __compressed_pair_elem(piecewise_construct_t, tuple<_Args...> __args, 2193 __tuple_indices<_Indexes...>) 2194 : __value_type(_VSTD::forward<_Args>(_VSTD::get<_Indexes>(__args))...) {} 2195 #else 2196 _LIBCPP_INLINE_VISIBILITY __compressed_pair_elem() : __value_type() {} 2197 _LIBCPP_INLINE_VISIBILITY 2198 __compressed_pair_elem(_ParamT __p) 2199 : __value_type(std::forward<_ParamT>(__p)) {} 2200 #endif 2201 2202 _LIBCPP_INLINE_VISIBILITY reference __get() _NOEXCEPT { return *this; } 2203 _LIBCPP_INLINE_VISIBILITY 2204 const_reference __get() const _NOEXCEPT { return *this; } 2205 }; 2206 2207 // Tag used to construct the second element of the compressed pair. 2208 struct __second_tag {}; 2209 2210 template <class _T1, class _T2> 2211 class __compressed_pair : private __compressed_pair_elem<_T1, 0>, 2212 private __compressed_pair_elem<_T2, 1> { 2213 typedef __compressed_pair_elem<_T1, 0> _Base1; 2214 typedef __compressed_pair_elem<_T2, 1> _Base2; 2215 2216 // NOTE: This static assert should never fire because __compressed_pair 2217 // is *almost never* used in a scenario where it's possible for T1 == T2. 2218 // (The exception is std::function where it is possible that the function 2219 // object and the allocator have the same type). 2220 static_assert((!is_same<_T1, _T2>::value), 2221 "__compressed_pair cannot be instantated when T1 and T2 are the same type; " 2222 "The current implementation is NOT ABI-compatible with the previous " 2223 "implementation for this configuration"); 2224 2225 public: 2226 #ifndef _LIBCPP_CXX03_LANG 2227 template <bool _Dummy = true, 2228 class = typename enable_if< 2229 __dependent_type<is_default_constructible<_T1>, _Dummy>::value && 2230 __dependent_type<is_default_constructible<_T2>, _Dummy>::value 2231 >::type 2232 > 2233 _LIBCPP_INLINE_VISIBILITY 2234 constexpr __compressed_pair() {} 2235 2236 template <class _Tp, typename enable_if<!is_same<typename decay<_Tp>::type, 2237 __compressed_pair>::value, 2238 bool>::type = true> 2239 _LIBCPP_INLINE_VISIBILITY constexpr explicit 2240 __compressed_pair(_Tp&& __t) 2241 : _Base1(std::forward<_Tp>(__t)), _Base2() {} 2242 2243 template <class _Tp> 2244 _LIBCPP_INLINE_VISIBILITY constexpr 2245 __compressed_pair(__second_tag, _Tp&& __t) 2246 : _Base1(), _Base2(std::forward<_Tp>(__t)) {} 2247 2248 template <class _U1, class _U2> 2249 _LIBCPP_INLINE_VISIBILITY constexpr 2250 __compressed_pair(_U1&& __t1, _U2&& __t2) 2251 : _Base1(std::forward<_U1>(__t1)), _Base2(std::forward<_U2>(__t2)) {} 2252 2253 template <class... _Args1, class... _Args2> 2254 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 2255 __compressed_pair(piecewise_construct_t __pc, tuple<_Args1...> __first_args, 2256 tuple<_Args2...> __second_args) 2257 : _Base1(__pc, _VSTD::move(__first_args), 2258 typename __make_tuple_indices<sizeof...(_Args1)>::type()), 2259 _Base2(__pc, _VSTD::move(__second_args), 2260 typename __make_tuple_indices<sizeof...(_Args2)>::type()) {} 2261 2262 #else 2263 _LIBCPP_INLINE_VISIBILITY 2264 __compressed_pair() {} 2265 2266 _LIBCPP_INLINE_VISIBILITY explicit 2267 __compressed_pair(_T1 __t1) : _Base1(_VSTD::forward<_T1>(__t1)) {} 2268 2269 _LIBCPP_INLINE_VISIBILITY 2270 __compressed_pair(__second_tag, _T2 __t2) 2271 : _Base1(), _Base2(_VSTD::forward<_T2>(__t2)) {} 2272 2273 _LIBCPP_INLINE_VISIBILITY 2274 __compressed_pair(_T1 __t1, _T2 __t2) 2275 : _Base1(_VSTD::forward<_T1>(__t1)), _Base2(_VSTD::forward<_T2>(__t2)) {} 2276 #endif 2277 2278 _LIBCPP_INLINE_VISIBILITY 2279 typename _Base1::reference first() _NOEXCEPT { 2280 return static_cast<_Base1&>(*this).__get(); 2281 } 2282 2283 _LIBCPP_INLINE_VISIBILITY 2284 typename _Base1::const_reference first() const _NOEXCEPT { 2285 return static_cast<_Base1 const&>(*this).__get(); 2286 } 2287 2288 _LIBCPP_INLINE_VISIBILITY 2289 typename _Base2::reference second() _NOEXCEPT { 2290 return static_cast<_Base2&>(*this).__get(); 2291 } 2292 2293 _LIBCPP_INLINE_VISIBILITY 2294 typename _Base2::const_reference second() const _NOEXCEPT { 2295 return static_cast<_Base2 const&>(*this).__get(); 2296 } 2297 2298 _LIBCPP_INLINE_VISIBILITY 2299 void swap(__compressed_pair& __x) 2300 _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && 2301 __is_nothrow_swappable<_T2>::value) 2302 { 2303 using std::swap; 2304 swap(first(), __x.first()); 2305 swap(second(), __x.second()); 2306 } 2307 }; 2308 2309 template <class _T1, class _T2> 2310 inline _LIBCPP_INLINE_VISIBILITY 2311 void swap(__compressed_pair<_T1, _T2>& __x, __compressed_pair<_T1, _T2>& __y) 2312 _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && 2313 __is_nothrow_swappable<_T2>::value) { 2314 __x.swap(__y); 2315 } 2316 2317 // default_delete 2318 2319 template <class _Tp> 2320 struct _LIBCPP_TEMPLATE_VIS default_delete { 2321 static_assert(!is_function<_Tp>::value, 2322 "default_delete cannot be instantiated for function types"); 2323 #ifndef _LIBCPP_CXX03_LANG 2324 _LIBCPP_INLINE_VISIBILITY constexpr default_delete() noexcept = default; 2325 #else 2326 _LIBCPP_INLINE_VISIBILITY default_delete() {} 2327 #endif 2328 template <class _Up> 2329 _LIBCPP_INLINE_VISIBILITY 2330 default_delete(const default_delete<_Up>&, 2331 typename enable_if<is_convertible<_Up*, _Tp*>::value>::type* = 2332 0) _NOEXCEPT {} 2333 2334 _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __ptr) const _NOEXCEPT { 2335 static_assert(sizeof(_Tp) > 0, 2336 "default_delete can not delete incomplete type"); 2337 static_assert(!is_void<_Tp>::value, 2338 "default_delete can not delete incomplete type"); 2339 delete __ptr; 2340 } 2341 }; 2342 2343 template <class _Tp> 2344 struct _LIBCPP_TEMPLATE_VIS default_delete<_Tp[]> { 2345 private: 2346 template <class _Up> 2347 struct _EnableIfConvertible 2348 : enable_if<is_convertible<_Up(*)[], _Tp(*)[]>::value> {}; 2349 2350 public: 2351 #ifndef _LIBCPP_CXX03_LANG 2352 _LIBCPP_INLINE_VISIBILITY constexpr default_delete() noexcept = default; 2353 #else 2354 _LIBCPP_INLINE_VISIBILITY default_delete() {} 2355 #endif 2356 2357 template <class _Up> 2358 _LIBCPP_INLINE_VISIBILITY 2359 default_delete(const default_delete<_Up[]>&, 2360 typename _EnableIfConvertible<_Up>::type* = 0) _NOEXCEPT {} 2361 2362 template <class _Up> 2363 _LIBCPP_INLINE_VISIBILITY 2364 typename _EnableIfConvertible<_Up>::type 2365 operator()(_Up* __ptr) const _NOEXCEPT { 2366 static_assert(sizeof(_Tp) > 0, 2367 "default_delete can not delete incomplete type"); 2368 static_assert(!is_void<_Tp>::value, 2369 "default_delete can not delete void type"); 2370 delete[] __ptr; 2371 } 2372 }; 2373 2374 2375 2376 #ifndef _LIBCPP_CXX03_LANG 2377 template <class _Deleter> 2378 struct __unique_ptr_deleter_sfinae { 2379 static_assert(!is_reference<_Deleter>::value, "incorrect specialization"); 2380 typedef const _Deleter& __lval_ref_type; 2381 typedef _Deleter&& __good_rval_ref_type; 2382 typedef true_type __enable_rval_overload; 2383 }; 2384 2385 template <class _Deleter> 2386 struct __unique_ptr_deleter_sfinae<_Deleter const&> { 2387 typedef const _Deleter& __lval_ref_type; 2388 typedef const _Deleter&& __bad_rval_ref_type; 2389 typedef false_type __enable_rval_overload; 2390 }; 2391 2392 template <class _Deleter> 2393 struct __unique_ptr_deleter_sfinae<_Deleter&> { 2394 typedef _Deleter& __lval_ref_type; 2395 typedef _Deleter&& __bad_rval_ref_type; 2396 typedef false_type __enable_rval_overload; 2397 }; 2398 #endif // !defined(_LIBCPP_CXX03_LANG) 2399 2400 template <class _Tp, class _Dp = default_delete<_Tp> > 2401 class _LIBCPP_TEMPLATE_VIS unique_ptr { 2402 public: 2403 typedef _Tp element_type; 2404 typedef _Dp deleter_type; 2405 typedef typename __pointer_type<_Tp, deleter_type>::type pointer; 2406 2407 static_assert(!is_rvalue_reference<deleter_type>::value, 2408 "the specified deleter type cannot be an rvalue reference"); 2409 2410 private: 2411 __compressed_pair<pointer, deleter_type> __ptr_; 2412 2413 struct __nat { int __for_bool_; }; 2414 2415 #ifndef _LIBCPP_CXX03_LANG 2416 typedef __unique_ptr_deleter_sfinae<_Dp> _DeleterSFINAE; 2417 2418 template <bool _Dummy> 2419 using _LValRefType = 2420 typename __dependent_type<_DeleterSFINAE, _Dummy>::__lval_ref_type; 2421 2422 template <bool _Dummy> 2423 using _GoodRValRefType = 2424 typename __dependent_type<_DeleterSFINAE, _Dummy>::__good_rval_ref_type; 2425 2426 template <bool _Dummy> 2427 using _BadRValRefType = 2428 typename __dependent_type<_DeleterSFINAE, _Dummy>::__bad_rval_ref_type; 2429 2430 template <bool _Dummy, class _Deleter = typename __dependent_type< 2431 __identity<deleter_type>, _Dummy>::type> 2432 using _EnableIfDeleterDefaultConstructible = 2433 typename enable_if<is_default_constructible<_Deleter>::value && 2434 !is_pointer<_Deleter>::value>::type; 2435 2436 template <class _ArgType> 2437 using _EnableIfDeleterConstructible = 2438 typename enable_if<is_constructible<deleter_type, _ArgType>::value>::type; 2439 2440 template <class _UPtr, class _Up> 2441 using _EnableIfMoveConvertible = typename enable_if< 2442 is_convertible<typename _UPtr::pointer, pointer>::value && 2443 !is_array<_Up>::value 2444 >::type; 2445 2446 template <class _UDel> 2447 using _EnableIfDeleterConvertible = typename enable_if< 2448 (is_reference<_Dp>::value && is_same<_Dp, _UDel>::value) || 2449 (!is_reference<_Dp>::value && is_convertible<_UDel, _Dp>::value) 2450 >::type; 2451 2452 template <class _UDel> 2453 using _EnableIfDeleterAssignable = typename enable_if< 2454 is_assignable<_Dp&, _UDel&&>::value 2455 >::type; 2456 2457 public: 2458 template <bool _Dummy = true, 2459 class = _EnableIfDeleterDefaultConstructible<_Dummy>> 2460 _LIBCPP_INLINE_VISIBILITY 2461 constexpr unique_ptr() noexcept : __ptr_(pointer()) {} 2462 2463 template <bool _Dummy = true, 2464 class = _EnableIfDeleterDefaultConstructible<_Dummy>> 2465 _LIBCPP_INLINE_VISIBILITY 2466 constexpr unique_ptr(nullptr_t) noexcept : __ptr_(pointer()) {} 2467 2468 template <bool _Dummy = true, 2469 class = _EnableIfDeleterDefaultConstructible<_Dummy>> 2470 _LIBCPP_INLINE_VISIBILITY 2471 explicit unique_ptr(pointer __p) noexcept : __ptr_(__p) {} 2472 2473 template <bool _Dummy = true, 2474 class = _EnableIfDeleterConstructible<_LValRefType<_Dummy>>> 2475 _LIBCPP_INLINE_VISIBILITY 2476 unique_ptr(pointer __p, _LValRefType<_Dummy> __d) noexcept 2477 : __ptr_(__p, __d) {} 2478 2479 template <bool _Dummy = true, 2480 class = _EnableIfDeleterConstructible<_GoodRValRefType<_Dummy>>> 2481 _LIBCPP_INLINE_VISIBILITY 2482 unique_ptr(pointer __p, _GoodRValRefType<_Dummy> __d) noexcept 2483 : __ptr_(__p, _VSTD::move(__d)) { 2484 static_assert(!is_reference<deleter_type>::value, 2485 "rvalue deleter bound to reference"); 2486 } 2487 2488 template <bool _Dummy = true, 2489 class = _EnableIfDeleterConstructible<_BadRValRefType<_Dummy>>> 2490 _LIBCPP_INLINE_VISIBILITY 2491 unique_ptr(pointer __p, _BadRValRefType<_Dummy> __d) = delete; 2492 2493 _LIBCPP_INLINE_VISIBILITY 2494 unique_ptr(unique_ptr&& __u) noexcept 2495 : __ptr_(__u.release(), _VSTD::forward<deleter_type>(__u.get_deleter())) { 2496 } 2497 2498 template <class _Up, class _Ep, 2499 class = _EnableIfMoveConvertible<unique_ptr<_Up, _Ep>, _Up>, 2500 class = _EnableIfDeleterConvertible<_Ep> 2501 > 2502 _LIBCPP_INLINE_VISIBILITY 2503 unique_ptr(unique_ptr<_Up, _Ep>&& __u) _NOEXCEPT 2504 : __ptr_(__u.release(), _VSTD::forward<_Ep>(__u.get_deleter())) {} 2505 2506 #if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR) 2507 template <class _Up> 2508 _LIBCPP_INLINE_VISIBILITY 2509 unique_ptr(auto_ptr<_Up>&& __p, 2510 typename enable_if<is_convertible<_Up*, _Tp*>::value && 2511 is_same<_Dp, default_delete<_Tp>>::value, 2512 __nat>::type = __nat()) _NOEXCEPT 2513 : __ptr_(__p.release()) {} 2514 #endif 2515 2516 _LIBCPP_INLINE_VISIBILITY 2517 unique_ptr& operator=(unique_ptr&& __u) _NOEXCEPT { 2518 reset(__u.release()); 2519 __ptr_.second() = _VSTD::forward<deleter_type>(__u.get_deleter()); 2520 return *this; 2521 } 2522 2523 template <class _Up, class _Ep, 2524 class = _EnableIfMoveConvertible<unique_ptr<_Up, _Ep>, _Up>, 2525 class = _EnableIfDeleterAssignable<_Ep> 2526 > 2527 _LIBCPP_INLINE_VISIBILITY 2528 unique_ptr& operator=(unique_ptr<_Up, _Ep>&& __u) _NOEXCEPT { 2529 reset(__u.release()); 2530 __ptr_.second() = _VSTD::forward<_Ep>(__u.get_deleter()); 2531 return *this; 2532 } 2533 2534 #else // _LIBCPP_CXX03_LANG 2535 private: 2536 unique_ptr(unique_ptr&); 2537 template <class _Up, class _Ep> unique_ptr(unique_ptr<_Up, _Ep>&); 2538 2539 unique_ptr& operator=(unique_ptr&); 2540 template <class _Up, class _Ep> unique_ptr& operator=(unique_ptr<_Up, _Ep>&); 2541 2542 public: 2543 _LIBCPP_INLINE_VISIBILITY 2544 unique_ptr() : __ptr_(pointer()) 2545 { 2546 static_assert(!is_pointer<deleter_type>::value, 2547 "unique_ptr constructed with null function pointer deleter"); 2548 static_assert(is_default_constructible<deleter_type>::value, 2549 "unique_ptr::deleter_type is not default constructible"); 2550 } 2551 _LIBCPP_INLINE_VISIBILITY 2552 unique_ptr(nullptr_t) : __ptr_(pointer()) 2553 { 2554 static_assert(!is_pointer<deleter_type>::value, 2555 "unique_ptr constructed with null function pointer deleter"); 2556 } 2557 _LIBCPP_INLINE_VISIBILITY 2558 explicit unique_ptr(pointer __p) 2559 : __ptr_(_VSTD::move(__p)) { 2560 static_assert(!is_pointer<deleter_type>::value, 2561 "unique_ptr constructed with null function pointer deleter"); 2562 } 2563 2564 _LIBCPP_INLINE_VISIBILITY 2565 operator __rv<unique_ptr>() { 2566 return __rv<unique_ptr>(*this); 2567 } 2568 2569 _LIBCPP_INLINE_VISIBILITY 2570 unique_ptr(__rv<unique_ptr> __u) 2571 : __ptr_(__u->release(), 2572 _VSTD::forward<deleter_type>(__u->get_deleter())) {} 2573 2574 template <class _Up, class _Ep> 2575 _LIBCPP_INLINE_VISIBILITY 2576 typename enable_if< 2577 !is_array<_Up>::value && 2578 is_convertible<typename unique_ptr<_Up, _Ep>::pointer, 2579 pointer>::value && 2580 is_assignable<deleter_type&, _Ep&>::value, 2581 unique_ptr&>::type 2582 operator=(unique_ptr<_Up, _Ep> __u) { 2583 reset(__u.release()); 2584 __ptr_.second() = _VSTD::forward<_Ep>(__u.get_deleter()); 2585 return *this; 2586 } 2587 2588 _LIBCPP_INLINE_VISIBILITY 2589 unique_ptr(pointer __p, deleter_type __d) 2590 : __ptr_(_VSTD::move(__p), _VSTD::move(__d)) {} 2591 #endif // _LIBCPP_CXX03_LANG 2592 2593 #if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR) 2594 template <class _Up> 2595 _LIBCPP_INLINE_VISIBILITY 2596 typename enable_if<is_convertible<_Up*, _Tp*>::value && 2597 is_same<_Dp, default_delete<_Tp> >::value, 2598 unique_ptr&>::type 2599 operator=(auto_ptr<_Up> __p) { 2600 reset(__p.release()); 2601 return *this; 2602 } 2603 #endif 2604 2605 _LIBCPP_INLINE_VISIBILITY 2606 ~unique_ptr() { reset(); } 2607 2608 _LIBCPP_INLINE_VISIBILITY 2609 unique_ptr& operator=(nullptr_t) _NOEXCEPT { 2610 reset(); 2611 return *this; 2612 } 2613 2614 _LIBCPP_INLINE_VISIBILITY 2615 typename add_lvalue_reference<_Tp>::type 2616 operator*() const { 2617 return *__ptr_.first(); 2618 } 2619 _LIBCPP_INLINE_VISIBILITY 2620 pointer operator->() const _NOEXCEPT { 2621 return __ptr_.first(); 2622 } 2623 _LIBCPP_INLINE_VISIBILITY 2624 pointer get() const _NOEXCEPT { 2625 return __ptr_.first(); 2626 } 2627 _LIBCPP_INLINE_VISIBILITY 2628 deleter_type& get_deleter() _NOEXCEPT { 2629 return __ptr_.second(); 2630 } 2631 _LIBCPP_INLINE_VISIBILITY 2632 const deleter_type& get_deleter() const _NOEXCEPT { 2633 return __ptr_.second(); 2634 } 2635 _LIBCPP_INLINE_VISIBILITY 2636 _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT { 2637 return __ptr_.first() != nullptr; 2638 } 2639 2640 _LIBCPP_INLINE_VISIBILITY 2641 pointer release() _NOEXCEPT { 2642 pointer __t = __ptr_.first(); 2643 __ptr_.first() = pointer(); 2644 return __t; 2645 } 2646 2647 _LIBCPP_INLINE_VISIBILITY 2648 void reset(pointer __p = pointer()) _NOEXCEPT { 2649 pointer __tmp = __ptr_.first(); 2650 __ptr_.first() = __p; 2651 if (__tmp) 2652 __ptr_.second()(__tmp); 2653 } 2654 2655 _LIBCPP_INLINE_VISIBILITY 2656 void swap(unique_ptr& __u) _NOEXCEPT { 2657 __ptr_.swap(__u.__ptr_); 2658 } 2659 }; 2660 2661 2662 template <class _Tp, class _Dp> 2663 class _LIBCPP_TEMPLATE_VIS unique_ptr<_Tp[], _Dp> { 2664 public: 2665 typedef _Tp element_type; 2666 typedef _Dp deleter_type; 2667 typedef typename __pointer_type<_Tp, deleter_type>::type pointer; 2668 2669 private: 2670 __compressed_pair<pointer, deleter_type> __ptr_; 2671 2672 template <class _From> 2673 struct _CheckArrayPointerConversion : is_same<_From, pointer> {}; 2674 2675 template <class _FromElem> 2676 struct _CheckArrayPointerConversion<_FromElem*> 2677 : integral_constant<bool, 2678 is_same<_FromElem*, pointer>::value || 2679 (is_same<pointer, element_type*>::value && 2680 is_convertible<_FromElem(*)[], element_type(*)[]>::value) 2681 > 2682 {}; 2683 2684 #ifndef _LIBCPP_CXX03_LANG 2685 typedef __unique_ptr_deleter_sfinae<_Dp> _DeleterSFINAE; 2686 2687 template <bool _Dummy> 2688 using _LValRefType = 2689 typename __dependent_type<_DeleterSFINAE, _Dummy>::__lval_ref_type; 2690 2691 template <bool _Dummy> 2692 using _GoodRValRefType = 2693 typename __dependent_type<_DeleterSFINAE, _Dummy>::__good_rval_ref_type; 2694 2695 template <bool _Dummy> 2696 using _BadRValRefType = 2697 typename __dependent_type<_DeleterSFINAE, _Dummy>::__bad_rval_ref_type; 2698 2699 template <bool _Dummy, class _Deleter = typename __dependent_type< 2700 __identity<deleter_type>, _Dummy>::type> 2701 using _EnableIfDeleterDefaultConstructible = 2702 typename enable_if<is_default_constructible<_Deleter>::value && 2703 !is_pointer<_Deleter>::value>::type; 2704 2705 template <class _ArgType> 2706 using _EnableIfDeleterConstructible = 2707 typename enable_if<is_constructible<deleter_type, _ArgType>::value>::type; 2708 2709 template <class _Pp> 2710 using _EnableIfPointerConvertible = typename enable_if< 2711 _CheckArrayPointerConversion<_Pp>::value 2712 >::type; 2713 2714 template <class _UPtr, class _Up, 2715 class _ElemT = typename _UPtr::element_type> 2716 using _EnableIfMoveConvertible = typename enable_if< 2717 is_array<_Up>::value && 2718 is_same<pointer, element_type*>::value && 2719 is_same<typename _UPtr::pointer, _ElemT*>::value && 2720 is_convertible<_ElemT(*)[], element_type(*)[]>::value 2721 >::type; 2722 2723 template <class _UDel> 2724 using _EnableIfDeleterConvertible = typename enable_if< 2725 (is_reference<_Dp>::value && is_same<_Dp, _UDel>::value) || 2726 (!is_reference<_Dp>::value && is_convertible<_UDel, _Dp>::value) 2727 >::type; 2728 2729 template <class _UDel> 2730 using _EnableIfDeleterAssignable = typename enable_if< 2731 is_assignable<_Dp&, _UDel&&>::value 2732 >::type; 2733 2734 public: 2735 template <bool _Dummy = true, 2736 class = _EnableIfDeleterDefaultConstructible<_Dummy>> 2737 _LIBCPP_INLINE_VISIBILITY 2738 constexpr unique_ptr() noexcept : __ptr_(pointer()) {} 2739 2740 template <bool _Dummy = true, 2741 class = _EnableIfDeleterDefaultConstructible<_Dummy>> 2742 _LIBCPP_INLINE_VISIBILITY 2743 constexpr unique_ptr(nullptr_t) noexcept : __ptr_(pointer()) {} 2744 2745 template <class _Pp, bool _Dummy = true, 2746 class = _EnableIfDeleterDefaultConstructible<_Dummy>, 2747 class = _EnableIfPointerConvertible<_Pp>> 2748 _LIBCPP_INLINE_VISIBILITY 2749 explicit unique_ptr(_Pp __p) noexcept 2750 : __ptr_(__p) {} 2751 2752 template <class _Pp, bool _Dummy = true, 2753 class = _EnableIfDeleterConstructible<_LValRefType<_Dummy>>, 2754 class = _EnableIfPointerConvertible<_Pp>> 2755 _LIBCPP_INLINE_VISIBILITY 2756 unique_ptr(_Pp __p, _LValRefType<_Dummy> __d) noexcept 2757 : __ptr_(__p, __d) {} 2758 2759 template <bool _Dummy = true, 2760 class = _EnableIfDeleterConstructible<_LValRefType<_Dummy>>> 2761 _LIBCPP_INLINE_VISIBILITY 2762 unique_ptr(nullptr_t, _LValRefType<_Dummy> __d) noexcept 2763 : __ptr_(nullptr, __d) {} 2764 2765 template <class _Pp, bool _Dummy = true, 2766 class = _EnableIfDeleterConstructible<_GoodRValRefType<_Dummy>>, 2767 class = _EnableIfPointerConvertible<_Pp>> 2768 _LIBCPP_INLINE_VISIBILITY 2769 unique_ptr(_Pp __p, _GoodRValRefType<_Dummy> __d) noexcept 2770 : __ptr_(__p, _VSTD::move(__d)) { 2771 static_assert(!is_reference<deleter_type>::value, 2772 "rvalue deleter bound to reference"); 2773 } 2774 2775 template <bool _Dummy = true, 2776 class = _EnableIfDeleterConstructible<_GoodRValRefType<_Dummy>>> 2777 _LIBCPP_INLINE_VISIBILITY 2778 unique_ptr(nullptr_t, _GoodRValRefType<_Dummy> __d) noexcept 2779 : __ptr_(nullptr, _VSTD::move(__d)) { 2780 static_assert(!is_reference<deleter_type>::value, 2781 "rvalue deleter bound to reference"); 2782 } 2783 2784 template <class _Pp, bool _Dummy = true, 2785 class = _EnableIfDeleterConstructible<_BadRValRefType<_Dummy>>, 2786 class = _EnableIfPointerConvertible<_Pp>> 2787 _LIBCPP_INLINE_VISIBILITY 2788 unique_ptr(_Pp __p, _BadRValRefType<_Dummy> __d) = delete; 2789 2790 _LIBCPP_INLINE_VISIBILITY 2791 unique_ptr(unique_ptr&& __u) noexcept 2792 : __ptr_(__u.release(), _VSTD::forward<deleter_type>(__u.get_deleter())) { 2793 } 2794 2795 _LIBCPP_INLINE_VISIBILITY 2796 unique_ptr& operator=(unique_ptr&& __u) noexcept { 2797 reset(__u.release()); 2798 __ptr_.second() = _VSTD::forward<deleter_type>(__u.get_deleter()); 2799 return *this; 2800 } 2801 2802 template <class _Up, class _Ep, 2803 class = _EnableIfMoveConvertible<unique_ptr<_Up, _Ep>, _Up>, 2804 class = _EnableIfDeleterConvertible<_Ep> 2805 > 2806 _LIBCPP_INLINE_VISIBILITY 2807 unique_ptr(unique_ptr<_Up, _Ep>&& __u) noexcept 2808 : __ptr_(__u.release(), _VSTD::forward<_Ep>(__u.get_deleter())) { 2809 } 2810 2811 template <class _Up, class _Ep, 2812 class = _EnableIfMoveConvertible<unique_ptr<_Up, _Ep>, _Up>, 2813 class = _EnableIfDeleterAssignable<_Ep> 2814 > 2815 _LIBCPP_INLINE_VISIBILITY 2816 unique_ptr& 2817 operator=(unique_ptr<_Up, _Ep>&& __u) noexcept { 2818 reset(__u.release()); 2819 __ptr_.second() = _VSTD::forward<_Ep>(__u.get_deleter()); 2820 return *this; 2821 } 2822 2823 #else // _LIBCPP_CXX03_LANG 2824 private: 2825 template <class _Up> explicit unique_ptr(_Up); 2826 2827 unique_ptr(unique_ptr&); 2828 template <class _Up> unique_ptr(unique_ptr<_Up>&); 2829 2830 unique_ptr& operator=(unique_ptr&); 2831 template <class _Up> unique_ptr& operator=(unique_ptr<_Up>&); 2832 2833 template <class _Up> 2834 unique_ptr(_Up __u, 2835 typename conditional< 2836 is_reference<deleter_type>::value, deleter_type, 2837 typename add_lvalue_reference<const deleter_type>::type>::type, 2838 typename enable_if<is_convertible<_Up, pointer>::value, 2839 __nat>::type = __nat()); 2840 public: 2841 _LIBCPP_INLINE_VISIBILITY 2842 unique_ptr() : __ptr_(pointer()) { 2843 static_assert(!is_pointer<deleter_type>::value, 2844 "unique_ptr constructed with null function pointer deleter"); 2845 } 2846 _LIBCPP_INLINE_VISIBILITY 2847 unique_ptr(nullptr_t) : __ptr_(pointer()) { 2848 static_assert(!is_pointer<deleter_type>::value, 2849 "unique_ptr constructed with null function pointer deleter"); 2850 } 2851 2852 _LIBCPP_INLINE_VISIBILITY 2853 explicit unique_ptr(pointer __p) : __ptr_(__p) { 2854 static_assert(!is_pointer<deleter_type>::value, 2855 "unique_ptr constructed with null function pointer deleter"); 2856 } 2857 2858 _LIBCPP_INLINE_VISIBILITY 2859 unique_ptr(pointer __p, deleter_type __d) 2860 : __ptr_(__p, _VSTD::forward<deleter_type>(__d)) {} 2861 2862 _LIBCPP_INLINE_VISIBILITY 2863 unique_ptr(nullptr_t, deleter_type __d) 2864 : __ptr_(pointer(), _VSTD::forward<deleter_type>(__d)) {} 2865 2866 _LIBCPP_INLINE_VISIBILITY 2867 operator __rv<unique_ptr>() { 2868 return __rv<unique_ptr>(*this); 2869 } 2870 2871 _LIBCPP_INLINE_VISIBILITY 2872 unique_ptr(__rv<unique_ptr> __u) 2873 : __ptr_(__u->release(), 2874 _VSTD::forward<deleter_type>(__u->get_deleter())) {} 2875 2876 _LIBCPP_INLINE_VISIBILITY 2877 unique_ptr& operator=(__rv<unique_ptr> __u) { 2878 reset(__u->release()); 2879 __ptr_.second() = _VSTD::forward<deleter_type>(__u->get_deleter()); 2880 return *this; 2881 } 2882 2883 #endif // _LIBCPP_CXX03_LANG 2884 2885 public: 2886 _LIBCPP_INLINE_VISIBILITY 2887 ~unique_ptr() { reset(); } 2888 2889 _LIBCPP_INLINE_VISIBILITY 2890 unique_ptr& operator=(nullptr_t) _NOEXCEPT { 2891 reset(); 2892 return *this; 2893 } 2894 2895 _LIBCPP_INLINE_VISIBILITY 2896 typename add_lvalue_reference<_Tp>::type 2897 operator[](size_t __i) const { 2898 return __ptr_.first()[__i]; 2899 } 2900 _LIBCPP_INLINE_VISIBILITY 2901 pointer get() const _NOEXCEPT { 2902 return __ptr_.first(); 2903 } 2904 2905 _LIBCPP_INLINE_VISIBILITY 2906 deleter_type& get_deleter() _NOEXCEPT { 2907 return __ptr_.second(); 2908 } 2909 2910 _LIBCPP_INLINE_VISIBILITY 2911 const deleter_type& get_deleter() const _NOEXCEPT { 2912 return __ptr_.second(); 2913 } 2914 _LIBCPP_INLINE_VISIBILITY 2915 _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT { 2916 return __ptr_.first() != nullptr; 2917 } 2918 2919 _LIBCPP_INLINE_VISIBILITY 2920 pointer release() _NOEXCEPT { 2921 pointer __t = __ptr_.first(); 2922 __ptr_.first() = pointer(); 2923 return __t; 2924 } 2925 2926 template <class _Pp> 2927 _LIBCPP_INLINE_VISIBILITY 2928 typename enable_if< 2929 _CheckArrayPointerConversion<_Pp>::value 2930 >::type 2931 reset(_Pp __p) _NOEXCEPT { 2932 pointer __tmp = __ptr_.first(); 2933 __ptr_.first() = __p; 2934 if (__tmp) 2935 __ptr_.second()(__tmp); 2936 } 2937 2938 _LIBCPP_INLINE_VISIBILITY 2939 void reset(nullptr_t = nullptr) _NOEXCEPT { 2940 pointer __tmp = __ptr_.first(); 2941 __ptr_.first() = nullptr; 2942 if (__tmp) 2943 __ptr_.second()(__tmp); 2944 } 2945 2946 _LIBCPP_INLINE_VISIBILITY 2947 void swap(unique_ptr& __u) _NOEXCEPT { 2948 __ptr_.swap(__u.__ptr_); 2949 } 2950 2951 }; 2952 2953 template <class _Tp, class _Dp> 2954 inline _LIBCPP_INLINE_VISIBILITY 2955 typename enable_if< 2956 __is_swappable<_Dp>::value, 2957 void 2958 >::type 2959 swap(unique_ptr<_Tp, _Dp>& __x, unique_ptr<_Tp, _Dp>& __y) _NOEXCEPT {__x.swap(__y);} 2960 2961 template <class _T1, class _D1, class _T2, class _D2> 2962 inline _LIBCPP_INLINE_VISIBILITY 2963 bool 2964 operator==(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return __x.get() == __y.get();} 2965 2966 template <class _T1, class _D1, class _T2, class _D2> 2967 inline _LIBCPP_INLINE_VISIBILITY 2968 bool 2969 operator!=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__x == __y);} 2970 2971 template <class _T1, class _D1, class _T2, class _D2> 2972 inline _LIBCPP_INLINE_VISIBILITY 2973 bool 2974 operator< (const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) 2975 { 2976 typedef typename unique_ptr<_T1, _D1>::pointer _P1; 2977 typedef typename unique_ptr<_T2, _D2>::pointer _P2; 2978 typedef typename common_type<_P1, _P2>::type _Vp; 2979 return less<_Vp>()(__x.get(), __y.get()); 2980 } 2981 2982 template <class _T1, class _D1, class _T2, class _D2> 2983 inline _LIBCPP_INLINE_VISIBILITY 2984 bool 2985 operator> (const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return __y < __x;} 2986 2987 template <class _T1, class _D1, class _T2, class _D2> 2988 inline _LIBCPP_INLINE_VISIBILITY 2989 bool 2990 operator<=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__y < __x);} 2991 2992 template <class _T1, class _D1, class _T2, class _D2> 2993 inline _LIBCPP_INLINE_VISIBILITY 2994 bool 2995 operator>=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__x < __y);} 2996 2997 template <class _T1, class _D1> 2998 inline _LIBCPP_INLINE_VISIBILITY 2999 bool 3000 operator==(const unique_ptr<_T1, _D1>& __x, nullptr_t) _NOEXCEPT 3001 { 3002 return !__x; 3003 } 3004 3005 template <class _T1, class _D1> 3006 inline _LIBCPP_INLINE_VISIBILITY 3007 bool 3008 operator==(nullptr_t, const unique_ptr<_T1, _D1>& __x) _NOEXCEPT 3009 { 3010 return !__x; 3011 } 3012 3013 template <class _T1, class _D1> 3014 inline _LIBCPP_INLINE_VISIBILITY 3015 bool 3016 operator!=(const unique_ptr<_T1, _D1>& __x, nullptr_t) _NOEXCEPT 3017 { 3018 return static_cast<bool>(__x); 3019 } 3020 3021 template <class _T1, class _D1> 3022 inline _LIBCPP_INLINE_VISIBILITY 3023 bool 3024 operator!=(nullptr_t, const unique_ptr<_T1, _D1>& __x) _NOEXCEPT 3025 { 3026 return static_cast<bool>(__x); 3027 } 3028 3029 template <class _T1, class _D1> 3030 inline _LIBCPP_INLINE_VISIBILITY 3031 bool 3032 operator<(const unique_ptr<_T1, _D1>& __x, nullptr_t) 3033 { 3034 typedef typename unique_ptr<_T1, _D1>::pointer _P1; 3035 return less<_P1>()(__x.get(), nullptr); 3036 } 3037 3038 template <class _T1, class _D1> 3039 inline _LIBCPP_INLINE_VISIBILITY 3040 bool 3041 operator<(nullptr_t, const unique_ptr<_T1, _D1>& __x) 3042 { 3043 typedef typename unique_ptr<_T1, _D1>::pointer _P1; 3044 return less<_P1>()(nullptr, __x.get()); 3045 } 3046 3047 template <class _T1, class _D1> 3048 inline _LIBCPP_INLINE_VISIBILITY 3049 bool 3050 operator>(const unique_ptr<_T1, _D1>& __x, nullptr_t) 3051 { 3052 return nullptr < __x; 3053 } 3054 3055 template <class _T1, class _D1> 3056 inline _LIBCPP_INLINE_VISIBILITY 3057 bool 3058 operator>(nullptr_t, const unique_ptr<_T1, _D1>& __x) 3059 { 3060 return __x < nullptr; 3061 } 3062 3063 template <class _T1, class _D1> 3064 inline _LIBCPP_INLINE_VISIBILITY 3065 bool 3066 operator<=(const unique_ptr<_T1, _D1>& __x, nullptr_t) 3067 { 3068 return !(nullptr < __x); 3069 } 3070 3071 template <class _T1, class _D1> 3072 inline _LIBCPP_INLINE_VISIBILITY 3073 bool 3074 operator<=(nullptr_t, const unique_ptr<_T1, _D1>& __x) 3075 { 3076 return !(__x < nullptr); 3077 } 3078 3079 template <class _T1, class _D1> 3080 inline _LIBCPP_INLINE_VISIBILITY 3081 bool 3082 operator>=(const unique_ptr<_T1, _D1>& __x, nullptr_t) 3083 { 3084 return !(__x < nullptr); 3085 } 3086 3087 template <class _T1, class _D1> 3088 inline _LIBCPP_INLINE_VISIBILITY 3089 bool 3090 operator>=(nullptr_t, const unique_ptr<_T1, _D1>& __x) 3091 { 3092 return !(nullptr < __x); 3093 } 3094 3095 #ifdef _LIBCPP_HAS_NO_RVALUE_REFERENCES 3096 3097 template <class _Tp, class _Dp> 3098 inline _LIBCPP_INLINE_VISIBILITY 3099 unique_ptr<_Tp, _Dp> 3100 move(unique_ptr<_Tp, _Dp>& __t) 3101 { 3102 return unique_ptr<_Tp, _Dp>(__rv<unique_ptr<_Tp, _Dp> >(__t)); 3103 } 3104 3105 #endif 3106 3107 #if _LIBCPP_STD_VER > 11 3108 3109 template<class _Tp> 3110 struct __unique_if 3111 { 3112 typedef unique_ptr<_Tp> __unique_single; 3113 }; 3114 3115 template<class _Tp> 3116 struct __unique_if<_Tp[]> 3117 { 3118 typedef unique_ptr<_Tp[]> __unique_array_unknown_bound; 3119 }; 3120 3121 template<class _Tp, size_t _Np> 3122 struct __unique_if<_Tp[_Np]> 3123 { 3124 typedef void __unique_array_known_bound; 3125 }; 3126 3127 template<class _Tp, class... _Args> 3128 inline _LIBCPP_INLINE_VISIBILITY 3129 typename __unique_if<_Tp>::__unique_single 3130 make_unique(_Args&&... __args) 3131 { 3132 return unique_ptr<_Tp>(new _Tp(_VSTD::forward<_Args>(__args)...)); 3133 } 3134 3135 template<class _Tp> 3136 inline _LIBCPP_INLINE_VISIBILITY 3137 typename __unique_if<_Tp>::__unique_array_unknown_bound 3138 make_unique(size_t __n) 3139 { 3140 typedef typename remove_extent<_Tp>::type _Up; 3141 return unique_ptr<_Tp>(new _Up[__n]()); 3142 } 3143 3144 template<class _Tp, class... _Args> 3145 typename __unique_if<_Tp>::__unique_array_known_bound 3146 make_unique(_Args&&...) = delete; 3147 3148 #endif // _LIBCPP_STD_VER > 11 3149 3150 template <class _Tp, class _Dp> 3151 #ifdef _LIBCPP_CXX03_LANG 3152 struct _LIBCPP_TEMPLATE_VIS hash<unique_ptr<_Tp, _Dp> > 3153 #else 3154 struct _LIBCPP_TEMPLATE_VIS hash<__enable_hash_helper< 3155 unique_ptr<_Tp, _Dp>, typename unique_ptr<_Tp, _Dp>::pointer>> 3156 #endif 3157 { 3158 typedef unique_ptr<_Tp, _Dp> argument_type; 3159 typedef size_t result_type; 3160 _LIBCPP_INLINE_VISIBILITY 3161 result_type operator()(const argument_type& __ptr) const 3162 { 3163 typedef typename argument_type::pointer pointer; 3164 return hash<pointer>()(__ptr.get()); 3165 } 3166 }; 3167 3168 struct __destruct_n 3169 { 3170 private: 3171 size_t __size_; 3172 3173 template <class _Tp> 3174 _LIBCPP_INLINE_VISIBILITY void __process(_Tp* __p, false_type) _NOEXCEPT 3175 {for (size_t __i = 0; __i < __size_; ++__i, ++__p) __p->~_Tp();} 3176 3177 template <class _Tp> 3178 _LIBCPP_INLINE_VISIBILITY void __process(_Tp*, true_type) _NOEXCEPT 3179 {} 3180 3181 _LIBCPP_INLINE_VISIBILITY void __incr(false_type) _NOEXCEPT 3182 {++__size_;} 3183 _LIBCPP_INLINE_VISIBILITY void __incr(true_type) _NOEXCEPT 3184 {} 3185 3186 _LIBCPP_INLINE_VISIBILITY void __set(size_t __s, false_type) _NOEXCEPT 3187 {__size_ = __s;} 3188 _LIBCPP_INLINE_VISIBILITY void __set(size_t, true_type) _NOEXCEPT 3189 {} 3190 public: 3191 _LIBCPP_INLINE_VISIBILITY explicit __destruct_n(size_t __s) _NOEXCEPT 3192 : __size_(__s) {} 3193 3194 template <class _Tp> 3195 _LIBCPP_INLINE_VISIBILITY void __incr(_Tp*) _NOEXCEPT 3196 {__incr(integral_constant<bool, is_trivially_destructible<_Tp>::value>());} 3197 3198 template <class _Tp> 3199 _LIBCPP_INLINE_VISIBILITY void __set(size_t __s, _Tp*) _NOEXCEPT 3200 {__set(__s, integral_constant<bool, is_trivially_destructible<_Tp>::value>());} 3201 3202 template <class _Tp> 3203 _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __p) _NOEXCEPT 3204 {__process(__p, integral_constant<bool, is_trivially_destructible<_Tp>::value>());} 3205 }; 3206 3207 template <class _Alloc> 3208 class __allocator_destructor 3209 { 3210 typedef allocator_traits<_Alloc> __alloc_traits; 3211 public: 3212 typedef typename __alloc_traits::pointer pointer; 3213 typedef typename __alloc_traits::size_type size_type; 3214 private: 3215 _Alloc& __alloc_; 3216 size_type __s_; 3217 public: 3218 _LIBCPP_INLINE_VISIBILITY __allocator_destructor(_Alloc& __a, size_type __s) 3219 _NOEXCEPT 3220 : __alloc_(__a), __s_(__s) {} 3221 _LIBCPP_INLINE_VISIBILITY 3222 void operator()(pointer __p) _NOEXCEPT 3223 {__alloc_traits::deallocate(__alloc_, __p, __s_);} 3224 }; 3225 3226 template <class _InputIterator, class _ForwardIterator> 3227 _ForwardIterator 3228 uninitialized_copy(_InputIterator __f, _InputIterator __l, _ForwardIterator __r) 3229 { 3230 typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 3231 #ifndef _LIBCPP_NO_EXCEPTIONS 3232 _ForwardIterator __s = __r; 3233 try 3234 { 3235 #endif 3236 for (; __f != __l; ++__f, (void) ++__r) 3237 ::new (static_cast<void*>(_VSTD::addressof(*__r))) value_type(*__f); 3238 #ifndef _LIBCPP_NO_EXCEPTIONS 3239 } 3240 catch (...) 3241 { 3242 for (; __s != __r; ++__s) 3243 __s->~value_type(); 3244 throw; 3245 } 3246 #endif 3247 return __r; 3248 } 3249 3250 template <class _InputIterator, class _Size, class _ForwardIterator> 3251 _ForwardIterator 3252 uninitialized_copy_n(_InputIterator __f, _Size __n, _ForwardIterator __r) 3253 { 3254 typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 3255 #ifndef _LIBCPP_NO_EXCEPTIONS 3256 _ForwardIterator __s = __r; 3257 try 3258 { 3259 #endif 3260 for (; __n > 0; ++__f, (void) ++__r, (void) --__n) 3261 ::new (static_cast<void*>(_VSTD::addressof(*__r))) value_type(*__f); 3262 #ifndef _LIBCPP_NO_EXCEPTIONS 3263 } 3264 catch (...) 3265 { 3266 for (; __s != __r; ++__s) 3267 __s->~value_type(); 3268 throw; 3269 } 3270 #endif 3271 return __r; 3272 } 3273 3274 template <class _ForwardIterator, class _Tp> 3275 void 3276 uninitialized_fill(_ForwardIterator __f, _ForwardIterator __l, const _Tp& __x) 3277 { 3278 typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 3279 #ifndef _LIBCPP_NO_EXCEPTIONS 3280 _ForwardIterator __s = __f; 3281 try 3282 { 3283 #endif 3284 for (; __f != __l; ++__f) 3285 ::new (static_cast<void*>(_VSTD::addressof(*__f))) value_type(__x); 3286 #ifndef _LIBCPP_NO_EXCEPTIONS 3287 } 3288 catch (...) 3289 { 3290 for (; __s != __f; ++__s) 3291 __s->~value_type(); 3292 throw; 3293 } 3294 #endif 3295 } 3296 3297 template <class _ForwardIterator, class _Size, class _Tp> 3298 _ForwardIterator 3299 uninitialized_fill_n(_ForwardIterator __f, _Size __n, const _Tp& __x) 3300 { 3301 typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 3302 #ifndef _LIBCPP_NO_EXCEPTIONS 3303 _ForwardIterator __s = __f; 3304 try 3305 { 3306 #endif 3307 for (; __n > 0; ++__f, (void) --__n) 3308 ::new (static_cast<void*>(_VSTD::addressof(*__f))) value_type(__x); 3309 #ifndef _LIBCPP_NO_EXCEPTIONS 3310 } 3311 catch (...) 3312 { 3313 for (; __s != __f; ++__s) 3314 __s->~value_type(); 3315 throw; 3316 } 3317 #endif 3318 return __f; 3319 } 3320 3321 #if _LIBCPP_STD_VER > 14 3322 3323 template <class _Tp> 3324 inline _LIBCPP_INLINE_VISIBILITY 3325 void destroy_at(_Tp* __loc) { 3326 _LIBCPP_ASSERT(__loc, "null pointer given to destroy_at"); 3327 __loc->~_Tp(); 3328 } 3329 3330 template <class _ForwardIterator> 3331 inline _LIBCPP_INLINE_VISIBILITY 3332 void destroy(_ForwardIterator __first, _ForwardIterator __last) { 3333 for (; __first != __last; ++__first) 3334 _VSTD::destroy_at(_VSTD::addressof(*__first)); 3335 } 3336 3337 template <class _ForwardIterator, class _Size> 3338 inline _LIBCPP_INLINE_VISIBILITY 3339 _ForwardIterator destroy_n(_ForwardIterator __first, _Size __n) { 3340 for (; __n > 0; (void)++__first, --__n) 3341 _VSTD::destroy_at(_VSTD::addressof(*__first)); 3342 return __first; 3343 } 3344 3345 template <class _ForwardIterator> 3346 inline _LIBCPP_INLINE_VISIBILITY 3347 void uninitialized_default_construct(_ForwardIterator __first, _ForwardIterator __last) { 3348 using _Vt = typename iterator_traits<_ForwardIterator>::value_type; 3349 auto __idx = __first; 3350 #ifndef _LIBCPP_NO_EXCEPTIONS 3351 try { 3352 #endif 3353 for (; __idx != __last; ++__idx) 3354 ::new((void*)_VSTD::addressof(*__idx)) _Vt; 3355 #ifndef _LIBCPP_NO_EXCEPTIONS 3356 } catch (...) { 3357 _VSTD::destroy(__first, __idx); 3358 throw; 3359 } 3360 #endif 3361 } 3362 3363 template <class _ForwardIterator, class _Size> 3364 inline _LIBCPP_INLINE_VISIBILITY 3365 _ForwardIterator uninitialized_default_construct_n(_ForwardIterator __first, _Size __n) { 3366 using _Vt = typename iterator_traits<_ForwardIterator>::value_type; 3367 auto __idx = __first; 3368 #ifndef _LIBCPP_NO_EXCEPTIONS 3369 try { 3370 #endif 3371 for (; __n > 0; (void)++__idx, --__n) 3372 ::new((void*)_VSTD::addressof(*__idx)) _Vt; 3373 return __idx; 3374 #ifndef _LIBCPP_NO_EXCEPTIONS 3375 } catch (...) { 3376 _VSTD::destroy(__first, __idx); 3377 throw; 3378 } 3379 #endif 3380 } 3381 3382 3383 template <class _ForwardIterator> 3384 inline _LIBCPP_INLINE_VISIBILITY 3385 void uninitialized_value_construct(_ForwardIterator __first, _ForwardIterator __last) { 3386 using _Vt = typename iterator_traits<_ForwardIterator>::value_type; 3387 auto __idx = __first; 3388 #ifndef _LIBCPP_NO_EXCEPTIONS 3389 try { 3390 #endif 3391 for (; __idx != __last; ++__idx) 3392 ::new((void*)_VSTD::addressof(*__idx)) _Vt(); 3393 #ifndef _LIBCPP_NO_EXCEPTIONS 3394 } catch (...) { 3395 _VSTD::destroy(__first, __idx); 3396 throw; 3397 } 3398 #endif 3399 } 3400 3401 template <class _ForwardIterator, class _Size> 3402 inline _LIBCPP_INLINE_VISIBILITY 3403 _ForwardIterator uninitialized_value_construct_n(_ForwardIterator __first, _Size __n) { 3404 using _Vt = typename iterator_traits<_ForwardIterator>::value_type; 3405 auto __idx = __first; 3406 #ifndef _LIBCPP_NO_EXCEPTIONS 3407 try { 3408 #endif 3409 for (; __n > 0; (void)++__idx, --__n) 3410 ::new((void*)_VSTD::addressof(*__idx)) _Vt(); 3411 return __idx; 3412 #ifndef _LIBCPP_NO_EXCEPTIONS 3413 } catch (...) { 3414 _VSTD::destroy(__first, __idx); 3415 throw; 3416 } 3417 #endif 3418 } 3419 3420 3421 template <class _InputIt, class _ForwardIt> 3422 inline _LIBCPP_INLINE_VISIBILITY 3423 _ForwardIt uninitialized_move(_InputIt __first, _InputIt __last, _ForwardIt __first_res) { 3424 using _Vt = typename iterator_traits<_ForwardIt>::value_type; 3425 auto __idx = __first_res; 3426 #ifndef _LIBCPP_NO_EXCEPTIONS 3427 try { 3428 #endif 3429 for (; __first != __last; (void)++__idx, ++__first) 3430 ::new((void*)_VSTD::addressof(*__idx)) _Vt(std::move(*__first)); 3431 return __idx; 3432 #ifndef _LIBCPP_NO_EXCEPTIONS 3433 } catch (...) { 3434 _VSTD::destroy(__first_res, __idx); 3435 throw; 3436 } 3437 #endif 3438 } 3439 3440 template <class _InputIt, class _Size, class _ForwardIt> 3441 inline _LIBCPP_INLINE_VISIBILITY 3442 pair<_InputIt, _ForwardIt> 3443 uninitialized_move_n(_InputIt __first, _Size __n, _ForwardIt __first_res) { 3444 using _Vt = typename iterator_traits<_ForwardIt>::value_type; 3445 auto __idx = __first_res; 3446 #ifndef _LIBCPP_NO_EXCEPTIONS 3447 try { 3448 #endif 3449 for (; __n > 0; ++__idx, (void)++__first, --__n) 3450 ::new((void*)_VSTD::addressof(*__idx)) _Vt(std::move(*__first)); 3451 return {__first, __idx}; 3452 #ifndef _LIBCPP_NO_EXCEPTIONS 3453 } catch (...) { 3454 _VSTD::destroy(__first_res, __idx); 3455 throw; 3456 } 3457 #endif 3458 } 3459 3460 3461 #endif // _LIBCPP_STD_VER > 14 3462 3463 // NOTE: Relaxed and acq/rel atomics (for increment and decrement respectively) 3464 // should be sufficient for thread safety. 3465 // See https://bugs.llvm.org/show_bug.cgi?id=22803 3466 #if defined(__clang__) && __has_builtin(__atomic_add_fetch) \ 3467 && defined(__ATOMIC_RELAXED) \ 3468 && defined(__ATOMIC_ACQ_REL) 3469 # define _LIBCPP_HAS_BUILTIN_ATOMIC_SUPPORT 3470 #elif !defined(__clang__) && defined(_GNUC_VER) && _GNUC_VER >= 407 3471 # define _LIBCPP_HAS_BUILTIN_ATOMIC_SUPPORT 3472 #endif 3473 3474 template <class _Tp> 3475 inline _LIBCPP_INLINE_VISIBILITY _Tp 3476 __libcpp_atomic_refcount_increment(_Tp& __t) _NOEXCEPT 3477 { 3478 #if defined(_LIBCPP_HAS_BUILTIN_ATOMIC_SUPPORT) && !defined(_LIBCPP_HAS_NO_THREADS) 3479 return __atomic_add_fetch(&__t, 1, __ATOMIC_RELAXED); 3480 #else 3481 return __t += 1; 3482 #endif 3483 } 3484 3485 template <class _Tp> 3486 inline _LIBCPP_INLINE_VISIBILITY _Tp 3487 __libcpp_atomic_refcount_decrement(_Tp& __t) _NOEXCEPT 3488 { 3489 #if defined(_LIBCPP_HAS_BUILTIN_ATOMIC_SUPPORT) && !defined(_LIBCPP_HAS_NO_THREADS) 3490 return __atomic_add_fetch(&__t, -1, __ATOMIC_ACQ_REL); 3491 #else 3492 return __t -= 1; 3493 #endif 3494 } 3495 3496 class _LIBCPP_EXCEPTION_ABI bad_weak_ptr 3497 : public std::exception 3498 { 3499 public: 3500 virtual ~bad_weak_ptr() _NOEXCEPT; 3501 virtual const char* what() const _NOEXCEPT; 3502 }; 3503 3504 _LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY 3505 void __throw_bad_weak_ptr() 3506 { 3507 #ifndef _LIBCPP_NO_EXCEPTIONS 3508 throw bad_weak_ptr(); 3509 #else 3510 _VSTD::abort(); 3511 #endif 3512 } 3513 3514 template<class _Tp> class _LIBCPP_TEMPLATE_VIS weak_ptr; 3515 3516 class _LIBCPP_TYPE_VIS __shared_count 3517 { 3518 __shared_count(const __shared_count&); 3519 __shared_count& operator=(const __shared_count&); 3520 3521 protected: 3522 long __shared_owners_; 3523 virtual ~__shared_count(); 3524 private: 3525 virtual void __on_zero_shared() _NOEXCEPT = 0; 3526 3527 public: 3528 _LIBCPP_INLINE_VISIBILITY 3529 explicit __shared_count(long __refs = 0) _NOEXCEPT 3530 : __shared_owners_(__refs) {} 3531 3532 #if defined(_LIBCPP_BUILDING_LIBRARY) && \ 3533 defined(_LIBCPP_DEPRECATED_ABI_LEGACY_LIBRARY_DEFINITIONS_FOR_INLINE_FUNCTIONS) 3534 void __add_shared() _NOEXCEPT; 3535 bool __release_shared() _NOEXCEPT; 3536 #else 3537 _LIBCPP_INLINE_VISIBILITY 3538 void __add_shared() _NOEXCEPT { 3539 __libcpp_atomic_refcount_increment(__shared_owners_); 3540 } 3541 _LIBCPP_INLINE_VISIBILITY 3542 bool __release_shared() _NOEXCEPT { 3543 if (__libcpp_atomic_refcount_decrement(__shared_owners_) == -1) { 3544 __on_zero_shared(); 3545 return true; 3546 } 3547 return false; 3548 } 3549 #endif 3550 _LIBCPP_INLINE_VISIBILITY 3551 long use_count() const _NOEXCEPT { 3552 return __libcpp_relaxed_load(&__shared_owners_) + 1; 3553 } 3554 }; 3555 3556 class _LIBCPP_TYPE_VIS __shared_weak_count 3557 : private __shared_count 3558 { 3559 long __shared_weak_owners_; 3560 3561 public: 3562 _LIBCPP_INLINE_VISIBILITY 3563 explicit __shared_weak_count(long __refs = 0) _NOEXCEPT 3564 : __shared_count(__refs), 3565 __shared_weak_owners_(__refs) {} 3566 protected: 3567 virtual ~__shared_weak_count(); 3568 3569 public: 3570 #if defined(_LIBCPP_BUILDING_LIBRARY) && \ 3571 defined(_LIBCPP_DEPRECATED_ABI_LEGACY_LIBRARY_DEFINITIONS_FOR_INLINE_FUNCTIONS) 3572 void __add_shared() _NOEXCEPT; 3573 void __add_weak() _NOEXCEPT; 3574 void __release_shared() _NOEXCEPT; 3575 #else 3576 _LIBCPP_INLINE_VISIBILITY 3577 void __add_shared() _NOEXCEPT { 3578 __shared_count::__add_shared(); 3579 } 3580 _LIBCPP_INLINE_VISIBILITY 3581 void __add_weak() _NOEXCEPT { 3582 __libcpp_atomic_refcount_increment(__shared_weak_owners_); 3583 } 3584 _LIBCPP_INLINE_VISIBILITY 3585 void __release_shared() _NOEXCEPT { 3586 if (__shared_count::__release_shared()) 3587 __release_weak(); 3588 } 3589 #endif 3590 void __release_weak() _NOEXCEPT; 3591 _LIBCPP_INLINE_VISIBILITY 3592 long use_count() const _NOEXCEPT {return __shared_count::use_count();} 3593 __shared_weak_count* lock() _NOEXCEPT; 3594 3595 // Define the function out only if we build static libc++ without RTTI. 3596 // Otherwise we may break clients who need to compile their projects with 3597 // -fno-rtti and yet link against a libc++.dylib compiled 3598 // without -fno-rtti. 3599 #if !defined(_LIBCPP_NO_RTTI) || !defined(_LIBCPP_BUILD_STATIC) 3600 virtual const void* __get_deleter(const type_info&) const _NOEXCEPT; 3601 #endif 3602 private: 3603 virtual void __on_zero_shared_weak() _NOEXCEPT = 0; 3604 }; 3605 3606 template <class _Tp, class _Dp, class _Alloc> 3607 class __shared_ptr_pointer 3608 : public __shared_weak_count 3609 { 3610 __compressed_pair<__compressed_pair<_Tp, _Dp>, _Alloc> __data_; 3611 public: 3612 _LIBCPP_INLINE_VISIBILITY 3613 __shared_ptr_pointer(_Tp __p, _Dp __d, _Alloc __a) 3614 : __data_(__compressed_pair<_Tp, _Dp>(__p, _VSTD::move(__d)), _VSTD::move(__a)) {} 3615 3616 #ifndef _LIBCPP_NO_RTTI 3617 virtual const void* __get_deleter(const type_info&) const _NOEXCEPT; 3618 #endif 3619 3620 private: 3621 virtual void __on_zero_shared() _NOEXCEPT; 3622 virtual void __on_zero_shared_weak() _NOEXCEPT; 3623 }; 3624 3625 #ifndef _LIBCPP_NO_RTTI 3626 3627 template <class _Tp, class _Dp, class _Alloc> 3628 const void* 3629 __shared_ptr_pointer<_Tp, _Dp, _Alloc>::__get_deleter(const type_info& __t) const _NOEXCEPT 3630 { 3631 return __t == typeid(_Dp) ? _VSTD::addressof(__data_.first().second()) : nullptr; 3632 } 3633 3634 #endif // _LIBCPP_NO_RTTI 3635 3636 template <class _Tp, class _Dp, class _Alloc> 3637 void 3638 __shared_ptr_pointer<_Tp, _Dp, _Alloc>::__on_zero_shared() _NOEXCEPT 3639 { 3640 __data_.first().second()(__data_.first().first()); 3641 __data_.first().second().~_Dp(); 3642 } 3643 3644 template <class _Tp, class _Dp, class _Alloc> 3645 void 3646 __shared_ptr_pointer<_Tp, _Dp, _Alloc>::__on_zero_shared_weak() _NOEXCEPT 3647 { 3648 typedef typename __allocator_traits_rebind<_Alloc, __shared_ptr_pointer>::type _Al; 3649 typedef allocator_traits<_Al> _ATraits; 3650 typedef pointer_traits<typename _ATraits::pointer> _PTraits; 3651 3652 _Al __a(__data_.second()); 3653 __data_.second().~_Alloc(); 3654 __a.deallocate(_PTraits::pointer_to(*this), 1); 3655 } 3656 3657 template <class _Tp, class _Alloc> 3658 class __shared_ptr_emplace 3659 : public __shared_weak_count 3660 { 3661 __compressed_pair<_Alloc, _Tp> __data_; 3662 public: 3663 #ifndef _LIBCPP_HAS_NO_VARIADICS 3664 3665 _LIBCPP_INLINE_VISIBILITY 3666 __shared_ptr_emplace(_Alloc __a) 3667 : __data_(_VSTD::move(__a)) {} 3668 3669 template <class ..._Args> 3670 _LIBCPP_INLINE_VISIBILITY 3671 __shared_ptr_emplace(_Alloc __a, _Args&& ...__args) 3672 : __data_(piecewise_construct, _VSTD::forward_as_tuple(__a), 3673 _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)) {} 3674 3675 #else // _LIBCPP_HAS_NO_VARIADICS 3676 3677 _LIBCPP_INLINE_VISIBILITY 3678 __shared_ptr_emplace(_Alloc __a) 3679 : __data_(__a) {} 3680 3681 template <class _A0> 3682 _LIBCPP_INLINE_VISIBILITY 3683 __shared_ptr_emplace(_Alloc __a, _A0& __a0) 3684 : __data_(__a, _Tp(__a0)) {} 3685 3686 template <class _A0, class _A1> 3687 _LIBCPP_INLINE_VISIBILITY 3688 __shared_ptr_emplace(_Alloc __a, _A0& __a0, _A1& __a1) 3689 : __data_(__a, _Tp(__a0, __a1)) {} 3690 3691 template <class _A0, class _A1, class _A2> 3692 _LIBCPP_INLINE_VISIBILITY 3693 __shared_ptr_emplace(_Alloc __a, _A0& __a0, _A1& __a1, _A2& __a2) 3694 : __data_(__a, _Tp(__a0, __a1, __a2)) {} 3695 3696 #endif // _LIBCPP_HAS_NO_VARIADICS 3697 3698 private: 3699 virtual void __on_zero_shared() _NOEXCEPT; 3700 virtual void __on_zero_shared_weak() _NOEXCEPT; 3701 public: 3702 _LIBCPP_INLINE_VISIBILITY 3703 _Tp* get() _NOEXCEPT {return _VSTD::addressof(__data_.second());} 3704 }; 3705 3706 template <class _Tp, class _Alloc> 3707 void 3708 __shared_ptr_emplace<_Tp, _Alloc>::__on_zero_shared() _NOEXCEPT 3709 { 3710 __data_.second().~_Tp(); 3711 } 3712 3713 template <class _Tp, class _Alloc> 3714 void 3715 __shared_ptr_emplace<_Tp, _Alloc>::__on_zero_shared_weak() _NOEXCEPT 3716 { 3717 typedef typename __allocator_traits_rebind<_Alloc, __shared_ptr_emplace>::type _Al; 3718 typedef allocator_traits<_Al> _ATraits; 3719 typedef pointer_traits<typename _ATraits::pointer> _PTraits; 3720 _Al __a(__data_.first()); 3721 __data_.first().~_Alloc(); 3722 __a.deallocate(_PTraits::pointer_to(*this), 1); 3723 } 3724 3725 struct __shared_ptr_dummy_rebind_allocator_type; 3726 template <> 3727 class _LIBCPP_TEMPLATE_VIS allocator<__shared_ptr_dummy_rebind_allocator_type> 3728 { 3729 public: 3730 template <class _Other> 3731 struct rebind 3732 { 3733 typedef allocator<_Other> other; 3734 }; 3735 }; 3736 3737 template<class _Tp> class _LIBCPP_TEMPLATE_VIS enable_shared_from_this; 3738 3739 template<class _Tp> 3740 class _LIBCPP_TEMPLATE_VIS shared_ptr 3741 { 3742 public: 3743 typedef _Tp element_type; 3744 3745 #if _LIBCPP_STD_VER > 14 3746 typedef weak_ptr<_Tp> weak_type; 3747 #endif 3748 private: 3749 element_type* __ptr_; 3750 __shared_weak_count* __cntrl_; 3751 3752 struct __nat {int __for_bool_;}; 3753 public: 3754 _LIBCPP_INLINE_VISIBILITY 3755 _LIBCPP_CONSTEXPR shared_ptr() _NOEXCEPT; 3756 _LIBCPP_INLINE_VISIBILITY 3757 _LIBCPP_CONSTEXPR shared_ptr(nullptr_t) _NOEXCEPT; 3758 template<class _Yp> 3759 explicit shared_ptr(_Yp* __p, 3760 typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat()); 3761 template<class _Yp, class _Dp> 3762 shared_ptr(_Yp* __p, _Dp __d, 3763 typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat()); 3764 template<class _Yp, class _Dp, class _Alloc> 3765 shared_ptr(_Yp* __p, _Dp __d, _Alloc __a, 3766 typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat()); 3767 template <class _Dp> shared_ptr(nullptr_t __p, _Dp __d); 3768 template <class _Dp, class _Alloc> shared_ptr(nullptr_t __p, _Dp __d, _Alloc __a); 3769 template<class _Yp> _LIBCPP_INLINE_VISIBILITY shared_ptr(const shared_ptr<_Yp>& __r, element_type* __p) _NOEXCEPT; 3770 _LIBCPP_INLINE_VISIBILITY 3771 shared_ptr(const shared_ptr& __r) _NOEXCEPT; 3772 template<class _Yp> 3773 _LIBCPP_INLINE_VISIBILITY 3774 shared_ptr(const shared_ptr<_Yp>& __r, 3775 typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat()) 3776 _NOEXCEPT; 3777 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 3778 _LIBCPP_INLINE_VISIBILITY 3779 shared_ptr(shared_ptr&& __r) _NOEXCEPT; 3780 template<class _Yp> _LIBCPP_INLINE_VISIBILITY shared_ptr(shared_ptr<_Yp>&& __r, 3781 typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat()) 3782 _NOEXCEPT; 3783 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 3784 template<class _Yp> explicit shared_ptr(const weak_ptr<_Yp>& __r, 3785 typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type= __nat()); 3786 #if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR) 3787 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 3788 template<class _Yp> 3789 shared_ptr(auto_ptr<_Yp>&& __r, 3790 typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat()); 3791 #else 3792 template<class _Yp> 3793 shared_ptr(auto_ptr<_Yp> __r, 3794 typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat()); 3795 #endif 3796 #endif 3797 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 3798 template <class _Yp, class _Dp> 3799 shared_ptr(unique_ptr<_Yp, _Dp>&&, 3800 typename enable_if 3801 < 3802 !is_lvalue_reference<_Dp>::value && 3803 !is_array<_Yp>::value && 3804 is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 3805 __nat 3806 >::type = __nat()); 3807 template <class _Yp, class _Dp> 3808 shared_ptr(unique_ptr<_Yp, _Dp>&&, 3809 typename enable_if 3810 < 3811 is_lvalue_reference<_Dp>::value && 3812 !is_array<_Yp>::value && 3813 is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 3814 __nat 3815 >::type = __nat()); 3816 #else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 3817 template <class _Yp, class _Dp> 3818 shared_ptr(unique_ptr<_Yp, _Dp>, 3819 typename enable_if 3820 < 3821 !is_lvalue_reference<_Dp>::value && 3822 !is_array<_Yp>::value && 3823 is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 3824 __nat 3825 >::type = __nat()); 3826 template <class _Yp, class _Dp> 3827 shared_ptr(unique_ptr<_Yp, _Dp>, 3828 typename enable_if 3829 < 3830 is_lvalue_reference<_Dp>::value && 3831 !is_array<_Yp>::value && 3832 is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 3833 __nat 3834 >::type = __nat()); 3835 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 3836 3837 ~shared_ptr(); 3838 3839 _LIBCPP_INLINE_VISIBILITY 3840 shared_ptr& operator=(const shared_ptr& __r) _NOEXCEPT; 3841 template<class _Yp> 3842 typename enable_if 3843 < 3844 is_convertible<_Yp*, element_type*>::value, 3845 shared_ptr& 3846 >::type 3847 _LIBCPP_INLINE_VISIBILITY 3848 operator=(const shared_ptr<_Yp>& __r) _NOEXCEPT; 3849 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 3850 _LIBCPP_INLINE_VISIBILITY 3851 shared_ptr& operator=(shared_ptr&& __r) _NOEXCEPT; 3852 template<class _Yp> 3853 typename enable_if 3854 < 3855 is_convertible<_Yp*, element_type*>::value, 3856 shared_ptr<_Tp>& 3857 >::type 3858 _LIBCPP_INLINE_VISIBILITY 3859 operator=(shared_ptr<_Yp>&& __r); 3860 #if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR) 3861 template<class _Yp> 3862 _LIBCPP_INLINE_VISIBILITY 3863 typename enable_if 3864 < 3865 !is_array<_Yp>::value && 3866 is_convertible<_Yp*, element_type*>::value, 3867 shared_ptr 3868 >::type& 3869 operator=(auto_ptr<_Yp>&& __r); 3870 #endif 3871 #else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 3872 #if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR) 3873 template<class _Yp> 3874 _LIBCPP_INLINE_VISIBILITY 3875 typename enable_if 3876 < 3877 !is_array<_Yp>::value && 3878 is_convertible<_Yp*, element_type*>::value, 3879 shared_ptr& 3880 >::type 3881 operator=(auto_ptr<_Yp> __r); 3882 #endif 3883 #endif 3884 template <class _Yp, class _Dp> 3885 typename enable_if 3886 < 3887 !is_array<_Yp>::value && 3888 is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 3889 shared_ptr& 3890 >::type 3891 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 3892 _LIBCPP_INLINE_VISIBILITY 3893 operator=(unique_ptr<_Yp, _Dp>&& __r); 3894 #else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 3895 _LIBCPP_INLINE_VISIBILITY 3896 operator=(unique_ptr<_Yp, _Dp> __r); 3897 #endif 3898 3899 _LIBCPP_INLINE_VISIBILITY 3900 void swap(shared_ptr& __r) _NOEXCEPT; 3901 _LIBCPP_INLINE_VISIBILITY 3902 void reset() _NOEXCEPT; 3903 template<class _Yp> 3904 typename enable_if 3905 < 3906 is_convertible<_Yp*, element_type*>::value, 3907 void 3908 >::type 3909 _LIBCPP_INLINE_VISIBILITY 3910 reset(_Yp* __p); 3911 template<class _Yp, class _Dp> 3912 typename enable_if 3913 < 3914 is_convertible<_Yp*, element_type*>::value, 3915 void 3916 >::type 3917 _LIBCPP_INLINE_VISIBILITY 3918 reset(_Yp* __p, _Dp __d); 3919 template<class _Yp, class _Dp, class _Alloc> 3920 typename enable_if 3921 < 3922 is_convertible<_Yp*, element_type*>::value, 3923 void 3924 >::type 3925 _LIBCPP_INLINE_VISIBILITY 3926 reset(_Yp* __p, _Dp __d, _Alloc __a); 3927 3928 _LIBCPP_INLINE_VISIBILITY 3929 element_type* get() const _NOEXCEPT {return __ptr_;} 3930 _LIBCPP_INLINE_VISIBILITY 3931 typename add_lvalue_reference<element_type>::type operator*() const _NOEXCEPT 3932 {return *__ptr_;} 3933 _LIBCPP_INLINE_VISIBILITY 3934 element_type* operator->() const _NOEXCEPT {return __ptr_;} 3935 _LIBCPP_INLINE_VISIBILITY 3936 long use_count() const _NOEXCEPT {return __cntrl_ ? __cntrl_->use_count() : 0;} 3937 _LIBCPP_INLINE_VISIBILITY 3938 bool unique() const _NOEXCEPT {return use_count() == 1;} 3939 _LIBCPP_INLINE_VISIBILITY 3940 _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT {return get() != 0;} 3941 template <class _Up> 3942 _LIBCPP_INLINE_VISIBILITY 3943 bool owner_before(shared_ptr<_Up> const& __p) const _NOEXCEPT 3944 {return __cntrl_ < __p.__cntrl_;} 3945 template <class _Up> 3946 _LIBCPP_INLINE_VISIBILITY 3947 bool owner_before(weak_ptr<_Up> const& __p) const _NOEXCEPT 3948 {return __cntrl_ < __p.__cntrl_;} 3949 _LIBCPP_INLINE_VISIBILITY 3950 bool 3951 __owner_equivalent(const shared_ptr& __p) const 3952 {return __cntrl_ == __p.__cntrl_;} 3953 3954 #ifndef _LIBCPP_NO_RTTI 3955 template <class _Dp> 3956 _LIBCPP_INLINE_VISIBILITY 3957 _Dp* __get_deleter() const _NOEXCEPT 3958 {return static_cast<_Dp*>(__cntrl_ 3959 ? const_cast<void *>(__cntrl_->__get_deleter(typeid(_Dp))) 3960 : nullptr);} 3961 #endif // _LIBCPP_NO_RTTI 3962 3963 #ifndef _LIBCPP_HAS_NO_VARIADICS 3964 3965 template<class ..._Args> 3966 static 3967 shared_ptr<_Tp> 3968 make_shared(_Args&& ...__args); 3969 3970 template<class _Alloc, class ..._Args> 3971 static 3972 shared_ptr<_Tp> 3973 allocate_shared(const _Alloc& __a, _Args&& ...__args); 3974 3975 #else // _LIBCPP_HAS_NO_VARIADICS 3976 3977 static shared_ptr<_Tp> make_shared(); 3978 3979 template<class _A0> 3980 static shared_ptr<_Tp> make_shared(_A0&); 3981 3982 template<class _A0, class _A1> 3983 static shared_ptr<_Tp> make_shared(_A0&, _A1&); 3984 3985 template<class _A0, class _A1, class _A2> 3986 static shared_ptr<_Tp> make_shared(_A0&, _A1&, _A2&); 3987 3988 template<class _Alloc> 3989 static shared_ptr<_Tp> 3990 allocate_shared(const _Alloc& __a); 3991 3992 template<class _Alloc, class _A0> 3993 static shared_ptr<_Tp> 3994 allocate_shared(const _Alloc& __a, _A0& __a0); 3995 3996 template<class _Alloc, class _A0, class _A1> 3997 static shared_ptr<_Tp> 3998 allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1); 3999 4000 template<class _Alloc, class _A0, class _A1, class _A2> 4001 static shared_ptr<_Tp> 4002 allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1, _A2& __a2); 4003 4004 #endif // _LIBCPP_HAS_NO_VARIADICS 4005 4006 private: 4007 template <class _Yp, bool = is_function<_Yp>::value> 4008 struct __shared_ptr_default_allocator 4009 { 4010 typedef allocator<_Yp> type; 4011 }; 4012 4013 template <class _Yp> 4014 struct __shared_ptr_default_allocator<_Yp, true> 4015 { 4016 typedef allocator<__shared_ptr_dummy_rebind_allocator_type> type; 4017 }; 4018 4019 template <class _Yp, class _OrigPtr> 4020 _LIBCPP_INLINE_VISIBILITY 4021 typename enable_if<is_convertible<_OrigPtr*, 4022 const enable_shared_from_this<_Yp>* 4023 >::value, 4024 void>::type 4025 __enable_weak_this(const enable_shared_from_this<_Yp>* __e, 4026 _OrigPtr* __ptr) _NOEXCEPT 4027 { 4028 typedef typename remove_cv<_Yp>::type _RawYp; 4029 if (__e && __e->__weak_this_.expired()) 4030 { 4031 __e->__weak_this_ = shared_ptr<_RawYp>(*this, 4032 const_cast<_RawYp*>(static_cast<const _Yp*>(__ptr))); 4033 } 4034 } 4035 4036 _LIBCPP_INLINE_VISIBILITY void __enable_weak_this(...) _NOEXCEPT {} 4037 4038 template <class _Up> friend class _LIBCPP_TEMPLATE_VIS shared_ptr; 4039 template <class _Up> friend class _LIBCPP_TEMPLATE_VIS weak_ptr; 4040 }; 4041 4042 4043 template<class _Tp> 4044 inline 4045 _LIBCPP_CONSTEXPR 4046 shared_ptr<_Tp>::shared_ptr() _NOEXCEPT 4047 : __ptr_(0), 4048 __cntrl_(0) 4049 { 4050 } 4051 4052 template<class _Tp> 4053 inline 4054 _LIBCPP_CONSTEXPR 4055 shared_ptr<_Tp>::shared_ptr(nullptr_t) _NOEXCEPT 4056 : __ptr_(0), 4057 __cntrl_(0) 4058 { 4059 } 4060 4061 template<class _Tp> 4062 template<class _Yp> 4063 shared_ptr<_Tp>::shared_ptr(_Yp* __p, 4064 typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type) 4065 : __ptr_(__p) 4066 { 4067 unique_ptr<_Yp> __hold(__p); 4068 typedef typename __shared_ptr_default_allocator<_Yp>::type _AllocT; 4069 typedef __shared_ptr_pointer<_Yp*, default_delete<_Yp>, _AllocT > _CntrlBlk; 4070 __cntrl_ = new _CntrlBlk(__p, default_delete<_Yp>(), _AllocT()); 4071 __hold.release(); 4072 __enable_weak_this(__p, __p); 4073 } 4074 4075 template<class _Tp> 4076 template<class _Yp, class _Dp> 4077 shared_ptr<_Tp>::shared_ptr(_Yp* __p, _Dp __d, 4078 typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type) 4079 : __ptr_(__p) 4080 { 4081 #ifndef _LIBCPP_NO_EXCEPTIONS 4082 try 4083 { 4084 #endif // _LIBCPP_NO_EXCEPTIONS 4085 typedef typename __shared_ptr_default_allocator<_Yp>::type _AllocT; 4086 typedef __shared_ptr_pointer<_Yp*, _Dp, _AllocT > _CntrlBlk; 4087 __cntrl_ = new _CntrlBlk(__p, __d, _AllocT()); 4088 __enable_weak_this(__p, __p); 4089 #ifndef _LIBCPP_NO_EXCEPTIONS 4090 } 4091 catch (...) 4092 { 4093 __d(__p); 4094 throw; 4095 } 4096 #endif // _LIBCPP_NO_EXCEPTIONS 4097 } 4098 4099 template<class _Tp> 4100 template<class _Dp> 4101 shared_ptr<_Tp>::shared_ptr(nullptr_t __p, _Dp __d) 4102 : __ptr_(0) 4103 { 4104 #ifndef _LIBCPP_NO_EXCEPTIONS 4105 try 4106 { 4107 #endif // _LIBCPP_NO_EXCEPTIONS 4108 typedef typename __shared_ptr_default_allocator<_Tp>::type _AllocT; 4109 typedef __shared_ptr_pointer<nullptr_t, _Dp, _AllocT > _CntrlBlk; 4110 __cntrl_ = new _CntrlBlk(__p, __d, _AllocT()); 4111 #ifndef _LIBCPP_NO_EXCEPTIONS 4112 } 4113 catch (...) 4114 { 4115 __d(__p); 4116 throw; 4117 } 4118 #endif // _LIBCPP_NO_EXCEPTIONS 4119 } 4120 4121 template<class _Tp> 4122 template<class _Yp, class _Dp, class _Alloc> 4123 shared_ptr<_Tp>::shared_ptr(_Yp* __p, _Dp __d, _Alloc __a, 4124 typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type) 4125 : __ptr_(__p) 4126 { 4127 #ifndef _LIBCPP_NO_EXCEPTIONS 4128 try 4129 { 4130 #endif // _LIBCPP_NO_EXCEPTIONS 4131 typedef __shared_ptr_pointer<_Yp*, _Dp, _Alloc> _CntrlBlk; 4132 typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _A2; 4133 typedef __allocator_destructor<_A2> _D2; 4134 _A2 __a2(__a); 4135 unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); 4136 ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4137 _CntrlBlk(__p, __d, __a); 4138 __cntrl_ = _VSTD::addressof(*__hold2.release()); 4139 __enable_weak_this(__p, __p); 4140 #ifndef _LIBCPP_NO_EXCEPTIONS 4141 } 4142 catch (...) 4143 { 4144 __d(__p); 4145 throw; 4146 } 4147 #endif // _LIBCPP_NO_EXCEPTIONS 4148 } 4149 4150 template<class _Tp> 4151 template<class _Dp, class _Alloc> 4152 shared_ptr<_Tp>::shared_ptr(nullptr_t __p, _Dp __d, _Alloc __a) 4153 : __ptr_(0) 4154 { 4155 #ifndef _LIBCPP_NO_EXCEPTIONS 4156 try 4157 { 4158 #endif // _LIBCPP_NO_EXCEPTIONS 4159 typedef __shared_ptr_pointer<nullptr_t, _Dp, _Alloc> _CntrlBlk; 4160 typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _A2; 4161 typedef __allocator_destructor<_A2> _D2; 4162 _A2 __a2(__a); 4163 unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); 4164 ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4165 _CntrlBlk(__p, __d, __a); 4166 __cntrl_ = _VSTD::addressof(*__hold2.release()); 4167 #ifndef _LIBCPP_NO_EXCEPTIONS 4168 } 4169 catch (...) 4170 { 4171 __d(__p); 4172 throw; 4173 } 4174 #endif // _LIBCPP_NO_EXCEPTIONS 4175 } 4176 4177 template<class _Tp> 4178 template<class _Yp> 4179 inline 4180 shared_ptr<_Tp>::shared_ptr(const shared_ptr<_Yp>& __r, element_type *__p) _NOEXCEPT 4181 : __ptr_(__p), 4182 __cntrl_(__r.__cntrl_) 4183 { 4184 if (__cntrl_) 4185 __cntrl_->__add_shared(); 4186 } 4187 4188 template<class _Tp> 4189 inline 4190 shared_ptr<_Tp>::shared_ptr(const shared_ptr& __r) _NOEXCEPT 4191 : __ptr_(__r.__ptr_), 4192 __cntrl_(__r.__cntrl_) 4193 { 4194 if (__cntrl_) 4195 __cntrl_->__add_shared(); 4196 } 4197 4198 template<class _Tp> 4199 template<class _Yp> 4200 inline 4201 shared_ptr<_Tp>::shared_ptr(const shared_ptr<_Yp>& __r, 4202 typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type) 4203 _NOEXCEPT 4204 : __ptr_(__r.__ptr_), 4205 __cntrl_(__r.__cntrl_) 4206 { 4207 if (__cntrl_) 4208 __cntrl_->__add_shared(); 4209 } 4210 4211 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 4212 4213 template<class _Tp> 4214 inline 4215 shared_ptr<_Tp>::shared_ptr(shared_ptr&& __r) _NOEXCEPT 4216 : __ptr_(__r.__ptr_), 4217 __cntrl_(__r.__cntrl_) 4218 { 4219 __r.__ptr_ = 0; 4220 __r.__cntrl_ = 0; 4221 } 4222 4223 template<class _Tp> 4224 template<class _Yp> 4225 inline 4226 shared_ptr<_Tp>::shared_ptr(shared_ptr<_Yp>&& __r, 4227 typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type) 4228 _NOEXCEPT 4229 : __ptr_(__r.__ptr_), 4230 __cntrl_(__r.__cntrl_) 4231 { 4232 __r.__ptr_ = 0; 4233 __r.__cntrl_ = 0; 4234 } 4235 4236 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 4237 4238 #if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR) 4239 template<class _Tp> 4240 template<class _Yp> 4241 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 4242 shared_ptr<_Tp>::shared_ptr(auto_ptr<_Yp>&& __r, 4243 #else 4244 shared_ptr<_Tp>::shared_ptr(auto_ptr<_Yp> __r, 4245 #endif 4246 typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type) 4247 : __ptr_(__r.get()) 4248 { 4249 typedef __shared_ptr_pointer<_Yp*, default_delete<_Yp>, allocator<_Yp> > _CntrlBlk; 4250 __cntrl_ = new _CntrlBlk(__r.get(), default_delete<_Yp>(), allocator<_Yp>()); 4251 __enable_weak_this(__r.get(), __r.get()); 4252 __r.release(); 4253 } 4254 #endif 4255 4256 template<class _Tp> 4257 template <class _Yp, class _Dp> 4258 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 4259 shared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp>&& __r, 4260 #else 4261 shared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp> __r, 4262 #endif 4263 typename enable_if 4264 < 4265 !is_lvalue_reference<_Dp>::value && 4266 !is_array<_Yp>::value && 4267 is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 4268 __nat 4269 >::type) 4270 : __ptr_(__r.get()) 4271 { 4272 #if _LIBCPP_STD_VER > 11 4273 if (__ptr_ == nullptr) 4274 __cntrl_ = nullptr; 4275 else 4276 #endif 4277 { 4278 typedef typename __shared_ptr_default_allocator<_Yp>::type _AllocT; 4279 typedef __shared_ptr_pointer<_Yp*, _Dp, _AllocT > _CntrlBlk; 4280 __cntrl_ = new _CntrlBlk(__r.get(), __r.get_deleter(), _AllocT()); 4281 __enable_weak_this(__r.get(), __r.get()); 4282 } 4283 __r.release(); 4284 } 4285 4286 template<class _Tp> 4287 template <class _Yp, class _Dp> 4288 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 4289 shared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp>&& __r, 4290 #else 4291 shared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp> __r, 4292 #endif 4293 typename enable_if 4294 < 4295 is_lvalue_reference<_Dp>::value && 4296 !is_array<_Yp>::value && 4297 is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 4298 __nat 4299 >::type) 4300 : __ptr_(__r.get()) 4301 { 4302 #if _LIBCPP_STD_VER > 11 4303 if (__ptr_ == nullptr) 4304 __cntrl_ = nullptr; 4305 else 4306 #endif 4307 { 4308 typedef typename __shared_ptr_default_allocator<_Yp>::type _AllocT; 4309 typedef __shared_ptr_pointer<_Yp*, 4310 reference_wrapper<typename remove_reference<_Dp>::type>, 4311 _AllocT > _CntrlBlk; 4312 __cntrl_ = new _CntrlBlk(__r.get(), ref(__r.get_deleter()), _AllocT()); 4313 __enable_weak_this(__r.get(), __r.get()); 4314 } 4315 __r.release(); 4316 } 4317 4318 #ifndef _LIBCPP_HAS_NO_VARIADICS 4319 4320 template<class _Tp> 4321 template<class ..._Args> 4322 shared_ptr<_Tp> 4323 shared_ptr<_Tp>::make_shared(_Args&& ...__args) 4324 { 4325 static_assert( is_constructible<_Tp, _Args...>::value, "Can't construct object in make_shared" ); 4326 typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 4327 typedef allocator<_CntrlBlk> _A2; 4328 typedef __allocator_destructor<_A2> _D2; 4329 _A2 __a2; 4330 unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); 4331 ::new(__hold2.get()) _CntrlBlk(__a2, _VSTD::forward<_Args>(__args)...); 4332 shared_ptr<_Tp> __r; 4333 __r.__ptr_ = __hold2.get()->get(); 4334 __r.__cntrl_ = __hold2.release(); 4335 __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 4336 return __r; 4337 } 4338 4339 template<class _Tp> 4340 template<class _Alloc, class ..._Args> 4341 shared_ptr<_Tp> 4342 shared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _Args&& ...__args) 4343 { 4344 static_assert( is_constructible<_Tp, _Args...>::value, "Can't construct object in allocate_shared" ); 4345 typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 4346 typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _A2; 4347 typedef __allocator_destructor<_A2> _D2; 4348 _A2 __a2(__a); 4349 unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); 4350 ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4351 _CntrlBlk(__a, _VSTD::forward<_Args>(__args)...); 4352 shared_ptr<_Tp> __r; 4353 __r.__ptr_ = __hold2.get()->get(); 4354 __r.__cntrl_ = _VSTD::addressof(*__hold2.release()); 4355 __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 4356 return __r; 4357 } 4358 4359 #else // _LIBCPP_HAS_NO_VARIADICS 4360 4361 template<class _Tp> 4362 shared_ptr<_Tp> 4363 shared_ptr<_Tp>::make_shared() 4364 { 4365 static_assert((is_constructible<_Tp>::value), "Can't construct object in make_shared" ); 4366 typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 4367 typedef allocator<_CntrlBlk> _Alloc2; 4368 typedef __allocator_destructor<_Alloc2> _D2; 4369 _Alloc2 __alloc2; 4370 unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 4371 ::new(__hold2.get()) _CntrlBlk(__alloc2); 4372 shared_ptr<_Tp> __r; 4373 __r.__ptr_ = __hold2.get()->get(); 4374 __r.__cntrl_ = __hold2.release(); 4375 __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 4376 return __r; 4377 } 4378 4379 template<class _Tp> 4380 template<class _A0> 4381 shared_ptr<_Tp> 4382 shared_ptr<_Tp>::make_shared(_A0& __a0) 4383 { 4384 static_assert((is_constructible<_Tp, _A0>::value), "Can't construct object in make_shared" ); 4385 typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 4386 typedef allocator<_CntrlBlk> _Alloc2; 4387 typedef __allocator_destructor<_Alloc2> _D2; 4388 _Alloc2 __alloc2; 4389 unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 4390 ::new(__hold2.get()) _CntrlBlk(__alloc2, __a0); 4391 shared_ptr<_Tp> __r; 4392 __r.__ptr_ = __hold2.get()->get(); 4393 __r.__cntrl_ = __hold2.release(); 4394 __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 4395 return __r; 4396 } 4397 4398 template<class _Tp> 4399 template<class _A0, class _A1> 4400 shared_ptr<_Tp> 4401 shared_ptr<_Tp>::make_shared(_A0& __a0, _A1& __a1) 4402 { 4403 static_assert((is_constructible<_Tp, _A0, _A1>::value), "Can't construct object in make_shared" ); 4404 typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 4405 typedef allocator<_CntrlBlk> _Alloc2; 4406 typedef __allocator_destructor<_Alloc2> _D2; 4407 _Alloc2 __alloc2; 4408 unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 4409 ::new(__hold2.get()) _CntrlBlk(__alloc2, __a0, __a1); 4410 shared_ptr<_Tp> __r; 4411 __r.__ptr_ = __hold2.get()->get(); 4412 __r.__cntrl_ = __hold2.release(); 4413 __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 4414 return __r; 4415 } 4416 4417 template<class _Tp> 4418 template<class _A0, class _A1, class _A2> 4419 shared_ptr<_Tp> 4420 shared_ptr<_Tp>::make_shared(_A0& __a0, _A1& __a1, _A2& __a2) 4421 { 4422 static_assert((is_constructible<_Tp, _A0, _A1, _A2>::value), "Can't construct object in make_shared" ); 4423 typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 4424 typedef allocator<_CntrlBlk> _Alloc2; 4425 typedef __allocator_destructor<_Alloc2> _D2; 4426 _Alloc2 __alloc2; 4427 unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 4428 ::new(__hold2.get()) _CntrlBlk(__alloc2, __a0, __a1, __a2); 4429 shared_ptr<_Tp> __r; 4430 __r.__ptr_ = __hold2.get()->get(); 4431 __r.__cntrl_ = __hold2.release(); 4432 __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 4433 return __r; 4434 } 4435 4436 template<class _Tp> 4437 template<class _Alloc> 4438 shared_ptr<_Tp> 4439 shared_ptr<_Tp>::allocate_shared(const _Alloc& __a) 4440 { 4441 static_assert((is_constructible<_Tp>::value), "Can't construct object in allocate_shared" ); 4442 typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 4443 typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _Alloc2; 4444 typedef __allocator_destructor<_Alloc2> _D2; 4445 _Alloc2 __alloc2(__a); 4446 unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 4447 ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4448 _CntrlBlk(__a); 4449 shared_ptr<_Tp> __r; 4450 __r.__ptr_ = __hold2.get()->get(); 4451 __r.__cntrl_ = _VSTD::addressof(*__hold2.release()); 4452 __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 4453 return __r; 4454 } 4455 4456 template<class _Tp> 4457 template<class _Alloc, class _A0> 4458 shared_ptr<_Tp> 4459 shared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _A0& __a0) 4460 { 4461 static_assert((is_constructible<_Tp, _A0>::value), "Can't construct object in allocate_shared" ); 4462 typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 4463 typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _Alloc2; 4464 typedef __allocator_destructor<_Alloc2> _D2; 4465 _Alloc2 __alloc2(__a); 4466 unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 4467 ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4468 _CntrlBlk(__a, __a0); 4469 shared_ptr<_Tp> __r; 4470 __r.__ptr_ = __hold2.get()->get(); 4471 __r.__cntrl_ = _VSTD::addressof(*__hold2.release()); 4472 __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 4473 return __r; 4474 } 4475 4476 template<class _Tp> 4477 template<class _Alloc, class _A0, class _A1> 4478 shared_ptr<_Tp> 4479 shared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1) 4480 { 4481 static_assert((is_constructible<_Tp, _A0, _A1>::value), "Can't construct object in allocate_shared" ); 4482 typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 4483 typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _Alloc2; 4484 typedef __allocator_destructor<_Alloc2> _D2; 4485 _Alloc2 __alloc2(__a); 4486 unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 4487 ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4488 _CntrlBlk(__a, __a0, __a1); 4489 shared_ptr<_Tp> __r; 4490 __r.__ptr_ = __hold2.get()->get(); 4491 __r.__cntrl_ = _VSTD::addressof(*__hold2.release()); 4492 __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 4493 return __r; 4494 } 4495 4496 template<class _Tp> 4497 template<class _Alloc, class _A0, class _A1, class _A2> 4498 shared_ptr<_Tp> 4499 shared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1, _A2& __a2) 4500 { 4501 static_assert((is_constructible<_Tp, _A0, _A1, _A2>::value), "Can't construct object in allocate_shared" ); 4502 typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 4503 typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _Alloc2; 4504 typedef __allocator_destructor<_Alloc2> _D2; 4505 _Alloc2 __alloc2(__a); 4506 unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 4507 ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4508 _CntrlBlk(__a, __a0, __a1, __a2); 4509 shared_ptr<_Tp> __r; 4510 __r.__ptr_ = __hold2.get()->get(); 4511 __r.__cntrl_ = _VSTD::addressof(*__hold2.release()); 4512 __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 4513 return __r; 4514 } 4515 4516 #endif // _LIBCPP_HAS_NO_VARIADICS 4517 4518 template<class _Tp> 4519 shared_ptr<_Tp>::~shared_ptr() 4520 { 4521 if (__cntrl_) 4522 __cntrl_->__release_shared(); 4523 } 4524 4525 template<class _Tp> 4526 inline 4527 shared_ptr<_Tp>& 4528 shared_ptr<_Tp>::operator=(const shared_ptr& __r) _NOEXCEPT 4529 { 4530 shared_ptr(__r).swap(*this); 4531 return *this; 4532 } 4533 4534 template<class _Tp> 4535 template<class _Yp> 4536 inline 4537 typename enable_if 4538 < 4539 is_convertible<_Yp*, typename shared_ptr<_Tp>::element_type*>::value, 4540 shared_ptr<_Tp>& 4541 >::type 4542 shared_ptr<_Tp>::operator=(const shared_ptr<_Yp>& __r) _NOEXCEPT 4543 { 4544 shared_ptr(__r).swap(*this); 4545 return *this; 4546 } 4547 4548 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 4549 4550 template<class _Tp> 4551 inline 4552 shared_ptr<_Tp>& 4553 shared_ptr<_Tp>::operator=(shared_ptr&& __r) _NOEXCEPT 4554 { 4555 shared_ptr(_VSTD::move(__r)).swap(*this); 4556 return *this; 4557 } 4558 4559 template<class _Tp> 4560 template<class _Yp> 4561 inline 4562 typename enable_if 4563 < 4564 is_convertible<_Yp*, typename shared_ptr<_Tp>::element_type*>::value, 4565 shared_ptr<_Tp>& 4566 >::type 4567 shared_ptr<_Tp>::operator=(shared_ptr<_Yp>&& __r) 4568 { 4569 shared_ptr(_VSTD::move(__r)).swap(*this); 4570 return *this; 4571 } 4572 4573 #if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR) 4574 template<class _Tp> 4575 template<class _Yp> 4576 inline 4577 typename enable_if 4578 < 4579 !is_array<_Yp>::value && 4580 is_convertible<_Yp*, typename shared_ptr<_Tp>::element_type*>::value, 4581 shared_ptr<_Tp> 4582 >::type& 4583 shared_ptr<_Tp>::operator=(auto_ptr<_Yp>&& __r) 4584 { 4585 shared_ptr(_VSTD::move(__r)).swap(*this); 4586 return *this; 4587 } 4588 #endif 4589 4590 template<class _Tp> 4591 template <class _Yp, class _Dp> 4592 inline 4593 typename enable_if 4594 < 4595 !is_array<_Yp>::value && 4596 is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, 4597 typename shared_ptr<_Tp>::element_type*>::value, 4598 shared_ptr<_Tp>& 4599 >::type 4600 shared_ptr<_Tp>::operator=(unique_ptr<_Yp, _Dp>&& __r) 4601 { 4602 shared_ptr(_VSTD::move(__r)).swap(*this); 4603 return *this; 4604 } 4605 4606 #else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 4607 4608 #if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR) 4609 template<class _Tp> 4610 template<class _Yp> 4611 inline _LIBCPP_INLINE_VISIBILITY 4612 typename enable_if 4613 < 4614 !is_array<_Yp>::value && 4615 is_convertible<_Yp*, typename shared_ptr<_Tp>::element_type*>::value, 4616 shared_ptr<_Tp>& 4617 >::type 4618 shared_ptr<_Tp>::operator=(auto_ptr<_Yp> __r) 4619 { 4620 shared_ptr(__r).swap(*this); 4621 return *this; 4622 } 4623 #endif 4624 4625 template<class _Tp> 4626 template <class _Yp, class _Dp> 4627 inline _LIBCPP_INLINE_VISIBILITY 4628 typename enable_if 4629 < 4630 !is_array<_Yp>::value && 4631 is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, 4632 typename shared_ptr<_Tp>::element_type*>::value, 4633 shared_ptr<_Tp>& 4634 >::type 4635 shared_ptr<_Tp>::operator=(unique_ptr<_Yp, _Dp> __r) 4636 { 4637 shared_ptr(_VSTD::move(__r)).swap(*this); 4638 return *this; 4639 } 4640 4641 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 4642 4643 template<class _Tp> 4644 inline 4645 void 4646 shared_ptr<_Tp>::swap(shared_ptr& __r) _NOEXCEPT 4647 { 4648 _VSTD::swap(__ptr_, __r.__ptr_); 4649 _VSTD::swap(__cntrl_, __r.__cntrl_); 4650 } 4651 4652 template<class _Tp> 4653 inline 4654 void 4655 shared_ptr<_Tp>::reset() _NOEXCEPT 4656 { 4657 shared_ptr().swap(*this); 4658 } 4659 4660 template<class _Tp> 4661 template<class _Yp> 4662 inline 4663 typename enable_if 4664 < 4665 is_convertible<_Yp*, typename shared_ptr<_Tp>::element_type*>::value, 4666 void 4667 >::type 4668 shared_ptr<_Tp>::reset(_Yp* __p) 4669 { 4670 shared_ptr(__p).swap(*this); 4671 } 4672 4673 template<class _Tp> 4674 template<class _Yp, class _Dp> 4675 inline 4676 typename enable_if 4677 < 4678 is_convertible<_Yp*, typename shared_ptr<_Tp>::element_type*>::value, 4679 void 4680 >::type 4681 shared_ptr<_Tp>::reset(_Yp* __p, _Dp __d) 4682 { 4683 shared_ptr(__p, __d).swap(*this); 4684 } 4685 4686 template<class _Tp> 4687 template<class _Yp, class _Dp, class _Alloc> 4688 inline 4689 typename enable_if 4690 < 4691 is_convertible<_Yp*, typename shared_ptr<_Tp>::element_type*>::value, 4692 void 4693 >::type 4694 shared_ptr<_Tp>::reset(_Yp* __p, _Dp __d, _Alloc __a) 4695 { 4696 shared_ptr(__p, __d, __a).swap(*this); 4697 } 4698 4699 #ifndef _LIBCPP_HAS_NO_VARIADICS 4700 4701 template<class _Tp, class ..._Args> 4702 inline _LIBCPP_INLINE_VISIBILITY 4703 typename enable_if 4704 < 4705 !is_array<_Tp>::value, 4706 shared_ptr<_Tp> 4707 >::type 4708 make_shared(_Args&& ...__args) 4709 { 4710 return shared_ptr<_Tp>::make_shared(_VSTD::forward<_Args>(__args)...); 4711 } 4712 4713 template<class _Tp, class _Alloc, class ..._Args> 4714 inline _LIBCPP_INLINE_VISIBILITY 4715 typename enable_if 4716 < 4717 !is_array<_Tp>::value, 4718 shared_ptr<_Tp> 4719 >::type 4720 allocate_shared(const _Alloc& __a, _Args&& ...__args) 4721 { 4722 return shared_ptr<_Tp>::allocate_shared(__a, _VSTD::forward<_Args>(__args)...); 4723 } 4724 4725 #else // _LIBCPP_HAS_NO_VARIADICS 4726 4727 template<class _Tp> 4728 inline _LIBCPP_INLINE_VISIBILITY 4729 shared_ptr<_Tp> 4730 make_shared() 4731 { 4732 return shared_ptr<_Tp>::make_shared(); 4733 } 4734 4735 template<class _Tp, class _A0> 4736 inline _LIBCPP_INLINE_VISIBILITY 4737 shared_ptr<_Tp> 4738 make_shared(_A0& __a0) 4739 { 4740 return shared_ptr<_Tp>::make_shared(__a0); 4741 } 4742 4743 template<class _Tp, class _A0, class _A1> 4744 inline _LIBCPP_INLINE_VISIBILITY 4745 shared_ptr<_Tp> 4746 make_shared(_A0& __a0, _A1& __a1) 4747 { 4748 return shared_ptr<_Tp>::make_shared(__a0, __a1); 4749 } 4750 4751 template<class _Tp, class _A0, class _A1, class _A2> 4752 inline _LIBCPP_INLINE_VISIBILITY 4753 shared_ptr<_Tp> 4754 make_shared(_A0& __a0, _A1& __a1, _A2& __a2) 4755 { 4756 return shared_ptr<_Tp>::make_shared(__a0, __a1, __a2); 4757 } 4758 4759 template<class _Tp, class _Alloc> 4760 inline _LIBCPP_INLINE_VISIBILITY 4761 shared_ptr<_Tp> 4762 allocate_shared(const _Alloc& __a) 4763 { 4764 return shared_ptr<_Tp>::allocate_shared(__a); 4765 } 4766 4767 template<class _Tp, class _Alloc, class _A0> 4768 inline _LIBCPP_INLINE_VISIBILITY 4769 shared_ptr<_Tp> 4770 allocate_shared(const _Alloc& __a, _A0& __a0) 4771 { 4772 return shared_ptr<_Tp>::allocate_shared(__a, __a0); 4773 } 4774 4775 template<class _Tp, class _Alloc, class _A0, class _A1> 4776 inline _LIBCPP_INLINE_VISIBILITY 4777 shared_ptr<_Tp> 4778 allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1) 4779 { 4780 return shared_ptr<_Tp>::allocate_shared(__a, __a0, __a1); 4781 } 4782 4783 template<class _Tp, class _Alloc, class _A0, class _A1, class _A2> 4784 inline _LIBCPP_INLINE_VISIBILITY 4785 shared_ptr<_Tp> 4786 allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1, _A2& __a2) 4787 { 4788 return shared_ptr<_Tp>::allocate_shared(__a, __a0, __a1, __a2); 4789 } 4790 4791 #endif // _LIBCPP_HAS_NO_VARIADICS 4792 4793 template<class _Tp, class _Up> 4794 inline _LIBCPP_INLINE_VISIBILITY 4795 bool 4796 operator==(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 4797 { 4798 return __x.get() == __y.get(); 4799 } 4800 4801 template<class _Tp, class _Up> 4802 inline _LIBCPP_INLINE_VISIBILITY 4803 bool 4804 operator!=(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 4805 { 4806 return !(__x == __y); 4807 } 4808 4809 template<class _Tp, class _Up> 4810 inline _LIBCPP_INLINE_VISIBILITY 4811 bool 4812 operator<(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 4813 { 4814 #if _LIBCPP_STD_VER <= 11 4815 typedef typename common_type<_Tp*, _Up*>::type _Vp; 4816 return less<_Vp>()(__x.get(), __y.get()); 4817 #else 4818 return less<>()(__x.get(), __y.get()); 4819 #endif 4820 4821 } 4822 4823 template<class _Tp, class _Up> 4824 inline _LIBCPP_INLINE_VISIBILITY 4825 bool 4826 operator>(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 4827 { 4828 return __y < __x; 4829 } 4830 4831 template<class _Tp, class _Up> 4832 inline _LIBCPP_INLINE_VISIBILITY 4833 bool 4834 operator<=(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 4835 { 4836 return !(__y < __x); 4837 } 4838 4839 template<class _Tp, class _Up> 4840 inline _LIBCPP_INLINE_VISIBILITY 4841 bool 4842 operator>=(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 4843 { 4844 return !(__x < __y); 4845 } 4846 4847 template<class _Tp> 4848 inline _LIBCPP_INLINE_VISIBILITY 4849 bool 4850 operator==(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 4851 { 4852 return !__x; 4853 } 4854 4855 template<class _Tp> 4856 inline _LIBCPP_INLINE_VISIBILITY 4857 bool 4858 operator==(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 4859 { 4860 return !__x; 4861 } 4862 4863 template<class _Tp> 4864 inline _LIBCPP_INLINE_VISIBILITY 4865 bool 4866 operator!=(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 4867 { 4868 return static_cast<bool>(__x); 4869 } 4870 4871 template<class _Tp> 4872 inline _LIBCPP_INLINE_VISIBILITY 4873 bool 4874 operator!=(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 4875 { 4876 return static_cast<bool>(__x); 4877 } 4878 4879 template<class _Tp> 4880 inline _LIBCPP_INLINE_VISIBILITY 4881 bool 4882 operator<(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 4883 { 4884 return less<_Tp*>()(__x.get(), nullptr); 4885 } 4886 4887 template<class _Tp> 4888 inline _LIBCPP_INLINE_VISIBILITY 4889 bool 4890 operator<(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 4891 { 4892 return less<_Tp*>()(nullptr, __x.get()); 4893 } 4894 4895 template<class _Tp> 4896 inline _LIBCPP_INLINE_VISIBILITY 4897 bool 4898 operator>(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 4899 { 4900 return nullptr < __x; 4901 } 4902 4903 template<class _Tp> 4904 inline _LIBCPP_INLINE_VISIBILITY 4905 bool 4906 operator>(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 4907 { 4908 return __x < nullptr; 4909 } 4910 4911 template<class _Tp> 4912 inline _LIBCPP_INLINE_VISIBILITY 4913 bool 4914 operator<=(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 4915 { 4916 return !(nullptr < __x); 4917 } 4918 4919 template<class _Tp> 4920 inline _LIBCPP_INLINE_VISIBILITY 4921 bool 4922 operator<=(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 4923 { 4924 return !(__x < nullptr); 4925 } 4926 4927 template<class _Tp> 4928 inline _LIBCPP_INLINE_VISIBILITY 4929 bool 4930 operator>=(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 4931 { 4932 return !(__x < nullptr); 4933 } 4934 4935 template<class _Tp> 4936 inline _LIBCPP_INLINE_VISIBILITY 4937 bool 4938 operator>=(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 4939 { 4940 return !(nullptr < __x); 4941 } 4942 4943 template<class _Tp> 4944 inline _LIBCPP_INLINE_VISIBILITY 4945 void 4946 swap(shared_ptr<_Tp>& __x, shared_ptr<_Tp>& __y) _NOEXCEPT 4947 { 4948 __x.swap(__y); 4949 } 4950 4951 template<class _Tp, class _Up> 4952 inline _LIBCPP_INLINE_VISIBILITY 4953 typename enable_if 4954 < 4955 !is_array<_Tp>::value && !is_array<_Up>::value, 4956 shared_ptr<_Tp> 4957 >::type 4958 static_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT 4959 { 4960 return shared_ptr<_Tp>(__r, static_cast<_Tp*>(__r.get())); 4961 } 4962 4963 template<class _Tp, class _Up> 4964 inline _LIBCPP_INLINE_VISIBILITY 4965 typename enable_if 4966 < 4967 !is_array<_Tp>::value && !is_array<_Up>::value, 4968 shared_ptr<_Tp> 4969 >::type 4970 dynamic_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT 4971 { 4972 _Tp* __p = dynamic_cast<_Tp*>(__r.get()); 4973 return __p ? shared_ptr<_Tp>(__r, __p) : shared_ptr<_Tp>(); 4974 } 4975 4976 template<class _Tp, class _Up> 4977 typename enable_if 4978 < 4979 is_array<_Tp>::value == is_array<_Up>::value, 4980 shared_ptr<_Tp> 4981 >::type 4982 const_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT 4983 { 4984 typedef typename remove_extent<_Tp>::type _RTp; 4985 return shared_ptr<_Tp>(__r, const_cast<_RTp*>(__r.get())); 4986 } 4987 4988 #ifndef _LIBCPP_NO_RTTI 4989 4990 template<class _Dp, class _Tp> 4991 inline _LIBCPP_INLINE_VISIBILITY 4992 _Dp* 4993 get_deleter(const shared_ptr<_Tp>& __p) _NOEXCEPT 4994 { 4995 return __p.template __get_deleter<_Dp>(); 4996 } 4997 4998 #endif // _LIBCPP_NO_RTTI 4999 5000 template<class _Tp> 5001 class _LIBCPP_TEMPLATE_VIS weak_ptr 5002 { 5003 public: 5004 typedef _Tp element_type; 5005 private: 5006 element_type* __ptr_; 5007 __shared_weak_count* __cntrl_; 5008 5009 public: 5010 _LIBCPP_INLINE_VISIBILITY 5011 _LIBCPP_CONSTEXPR weak_ptr() _NOEXCEPT; 5012 template<class _Yp> _LIBCPP_INLINE_VISIBILITY weak_ptr(shared_ptr<_Yp> const& __r, 5013 typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0) 5014 _NOEXCEPT; 5015 _LIBCPP_INLINE_VISIBILITY 5016 weak_ptr(weak_ptr const& __r) _NOEXCEPT; 5017 template<class _Yp> _LIBCPP_INLINE_VISIBILITY weak_ptr(weak_ptr<_Yp> const& __r, 5018 typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0) 5019 _NOEXCEPT; 5020 5021 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 5022 _LIBCPP_INLINE_VISIBILITY 5023 weak_ptr(weak_ptr&& __r) _NOEXCEPT; 5024 template<class _Yp> _LIBCPP_INLINE_VISIBILITY weak_ptr(weak_ptr<_Yp>&& __r, 5025 typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0) 5026 _NOEXCEPT; 5027 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 5028 ~weak_ptr(); 5029 5030 _LIBCPP_INLINE_VISIBILITY 5031 weak_ptr& operator=(weak_ptr const& __r) _NOEXCEPT; 5032 template<class _Yp> 5033 typename enable_if 5034 < 5035 is_convertible<_Yp*, element_type*>::value, 5036 weak_ptr& 5037 >::type 5038 _LIBCPP_INLINE_VISIBILITY 5039 operator=(weak_ptr<_Yp> const& __r) _NOEXCEPT; 5040 5041 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 5042 5043 _LIBCPP_INLINE_VISIBILITY 5044 weak_ptr& operator=(weak_ptr&& __r) _NOEXCEPT; 5045 template<class _Yp> 5046 typename enable_if 5047 < 5048 is_convertible<_Yp*, element_type*>::value, 5049 weak_ptr& 5050 >::type 5051 _LIBCPP_INLINE_VISIBILITY 5052 operator=(weak_ptr<_Yp>&& __r) _NOEXCEPT; 5053 5054 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 5055 5056 template<class _Yp> 5057 typename enable_if 5058 < 5059 is_convertible<_Yp*, element_type*>::value, 5060 weak_ptr& 5061 >::type 5062 _LIBCPP_INLINE_VISIBILITY 5063 operator=(shared_ptr<_Yp> const& __r) _NOEXCEPT; 5064 5065 _LIBCPP_INLINE_VISIBILITY 5066 void swap(weak_ptr& __r) _NOEXCEPT; 5067 _LIBCPP_INLINE_VISIBILITY 5068 void reset() _NOEXCEPT; 5069 5070 _LIBCPP_INLINE_VISIBILITY 5071 long use_count() const _NOEXCEPT 5072 {return __cntrl_ ? __cntrl_->use_count() : 0;} 5073 _LIBCPP_INLINE_VISIBILITY 5074 bool expired() const _NOEXCEPT 5075 {return __cntrl_ == 0 || __cntrl_->use_count() == 0;} 5076 shared_ptr<_Tp> lock() const _NOEXCEPT; 5077 template<class _Up> 5078 _LIBCPP_INLINE_VISIBILITY 5079 bool owner_before(const shared_ptr<_Up>& __r) const _NOEXCEPT 5080 {return __cntrl_ < __r.__cntrl_;} 5081 template<class _Up> 5082 _LIBCPP_INLINE_VISIBILITY 5083 bool owner_before(const weak_ptr<_Up>& __r) const _NOEXCEPT 5084 {return __cntrl_ < __r.__cntrl_;} 5085 5086 template <class _Up> friend class _LIBCPP_TEMPLATE_VIS weak_ptr; 5087 template <class _Up> friend class _LIBCPP_TEMPLATE_VIS shared_ptr; 5088 }; 5089 5090 template<class _Tp> 5091 inline 5092 _LIBCPP_CONSTEXPR 5093 weak_ptr<_Tp>::weak_ptr() _NOEXCEPT 5094 : __ptr_(0), 5095 __cntrl_(0) 5096 { 5097 } 5098 5099 template<class _Tp> 5100 inline 5101 weak_ptr<_Tp>::weak_ptr(weak_ptr const& __r) _NOEXCEPT 5102 : __ptr_(__r.__ptr_), 5103 __cntrl_(__r.__cntrl_) 5104 { 5105 if (__cntrl_) 5106 __cntrl_->__add_weak(); 5107 } 5108 5109 template<class _Tp> 5110 template<class _Yp> 5111 inline 5112 weak_ptr<_Tp>::weak_ptr(shared_ptr<_Yp> const& __r, 5113 typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type) 5114 _NOEXCEPT 5115 : __ptr_(__r.__ptr_), 5116 __cntrl_(__r.__cntrl_) 5117 { 5118 if (__cntrl_) 5119 __cntrl_->__add_weak(); 5120 } 5121 5122 template<class _Tp> 5123 template<class _Yp> 5124 inline 5125 weak_ptr<_Tp>::weak_ptr(weak_ptr<_Yp> const& __r, 5126 typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type) 5127 _NOEXCEPT 5128 : __ptr_(__r.__ptr_), 5129 __cntrl_(__r.__cntrl_) 5130 { 5131 if (__cntrl_) 5132 __cntrl_->__add_weak(); 5133 } 5134 5135 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 5136 5137 template<class _Tp> 5138 inline 5139 weak_ptr<_Tp>::weak_ptr(weak_ptr&& __r) _NOEXCEPT 5140 : __ptr_(__r.__ptr_), 5141 __cntrl_(__r.__cntrl_) 5142 { 5143 __r.__ptr_ = 0; 5144 __r.__cntrl_ = 0; 5145 } 5146 5147 template<class _Tp> 5148 template<class _Yp> 5149 inline 5150 weak_ptr<_Tp>::weak_ptr(weak_ptr<_Yp>&& __r, 5151 typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type) 5152 _NOEXCEPT 5153 : __ptr_(__r.__ptr_), 5154 __cntrl_(__r.__cntrl_) 5155 { 5156 __r.__ptr_ = 0; 5157 __r.__cntrl_ = 0; 5158 } 5159 5160 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 5161 5162 template<class _Tp> 5163 weak_ptr<_Tp>::~weak_ptr() 5164 { 5165 if (__cntrl_) 5166 __cntrl_->__release_weak(); 5167 } 5168 5169 template<class _Tp> 5170 inline 5171 weak_ptr<_Tp>& 5172 weak_ptr<_Tp>::operator=(weak_ptr const& __r) _NOEXCEPT 5173 { 5174 weak_ptr(__r).swap(*this); 5175 return *this; 5176 } 5177 5178 template<class _Tp> 5179 template<class _Yp> 5180 inline 5181 typename enable_if 5182 < 5183 is_convertible<_Yp*, _Tp*>::value, 5184 weak_ptr<_Tp>& 5185 >::type 5186 weak_ptr<_Tp>::operator=(weak_ptr<_Yp> const& __r) _NOEXCEPT 5187 { 5188 weak_ptr(__r).swap(*this); 5189 return *this; 5190 } 5191 5192 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 5193 5194 template<class _Tp> 5195 inline 5196 weak_ptr<_Tp>& 5197 weak_ptr<_Tp>::operator=(weak_ptr&& __r) _NOEXCEPT 5198 { 5199 weak_ptr(_VSTD::move(__r)).swap(*this); 5200 return *this; 5201 } 5202 5203 template<class _Tp> 5204 template<class _Yp> 5205 inline 5206 typename enable_if 5207 < 5208 is_convertible<_Yp*, _Tp*>::value, 5209 weak_ptr<_Tp>& 5210 >::type 5211 weak_ptr<_Tp>::operator=(weak_ptr<_Yp>&& __r) _NOEXCEPT 5212 { 5213 weak_ptr(_VSTD::move(__r)).swap(*this); 5214 return *this; 5215 } 5216 5217 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 5218 5219 template<class _Tp> 5220 template<class _Yp> 5221 inline 5222 typename enable_if 5223 < 5224 is_convertible<_Yp*, _Tp*>::value, 5225 weak_ptr<_Tp>& 5226 >::type 5227 weak_ptr<_Tp>::operator=(shared_ptr<_Yp> const& __r) _NOEXCEPT 5228 { 5229 weak_ptr(__r).swap(*this); 5230 return *this; 5231 } 5232 5233 template<class _Tp> 5234 inline 5235 void 5236 weak_ptr<_Tp>::swap(weak_ptr& __r) _NOEXCEPT 5237 { 5238 _VSTD::swap(__ptr_, __r.__ptr_); 5239 _VSTD::swap(__cntrl_, __r.__cntrl_); 5240 } 5241 5242 template<class _Tp> 5243 inline _LIBCPP_INLINE_VISIBILITY 5244 void 5245 swap(weak_ptr<_Tp>& __x, weak_ptr<_Tp>& __y) _NOEXCEPT 5246 { 5247 __x.swap(__y); 5248 } 5249 5250 template<class _Tp> 5251 inline 5252 void 5253 weak_ptr<_Tp>::reset() _NOEXCEPT 5254 { 5255 weak_ptr().swap(*this); 5256 } 5257 5258 template<class _Tp> 5259 template<class _Yp> 5260 shared_ptr<_Tp>::shared_ptr(const weak_ptr<_Yp>& __r, 5261 typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type) 5262 : __ptr_(__r.__ptr_), 5263 __cntrl_(__r.__cntrl_ ? __r.__cntrl_->lock() : __r.__cntrl_) 5264 { 5265 if (__cntrl_ == 0) 5266 __throw_bad_weak_ptr(); 5267 } 5268 5269 template<class _Tp> 5270 shared_ptr<_Tp> 5271 weak_ptr<_Tp>::lock() const _NOEXCEPT 5272 { 5273 shared_ptr<_Tp> __r; 5274 __r.__cntrl_ = __cntrl_ ? __cntrl_->lock() : __cntrl_; 5275 if (__r.__cntrl_) 5276 __r.__ptr_ = __ptr_; 5277 return __r; 5278 } 5279 5280 #if _LIBCPP_STD_VER > 14 5281 template <class _Tp = void> struct owner_less; 5282 #else 5283 template <class _Tp> struct owner_less; 5284 #endif 5285 5286 template <class _Tp> 5287 struct _LIBCPP_TEMPLATE_VIS owner_less<shared_ptr<_Tp> > 5288 : binary_function<shared_ptr<_Tp>, shared_ptr<_Tp>, bool> 5289 { 5290 typedef bool result_type; 5291 _LIBCPP_INLINE_VISIBILITY 5292 bool operator()(shared_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const _NOEXCEPT 5293 {return __x.owner_before(__y);} 5294 _LIBCPP_INLINE_VISIBILITY 5295 bool operator()(shared_ptr<_Tp> const& __x, weak_ptr<_Tp> const& __y) const _NOEXCEPT 5296 {return __x.owner_before(__y);} 5297 _LIBCPP_INLINE_VISIBILITY 5298 bool operator()( weak_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const _NOEXCEPT 5299 {return __x.owner_before(__y);} 5300 }; 5301 5302 template <class _Tp> 5303 struct _LIBCPP_TEMPLATE_VIS owner_less<weak_ptr<_Tp> > 5304 : binary_function<weak_ptr<_Tp>, weak_ptr<_Tp>, bool> 5305 { 5306 typedef bool result_type; 5307 _LIBCPP_INLINE_VISIBILITY 5308 bool operator()( weak_ptr<_Tp> const& __x, weak_ptr<_Tp> const& __y) const _NOEXCEPT 5309 {return __x.owner_before(__y);} 5310 _LIBCPP_INLINE_VISIBILITY 5311 bool operator()(shared_ptr<_Tp> const& __x, weak_ptr<_Tp> const& __y) const _NOEXCEPT 5312 {return __x.owner_before(__y);} 5313 _LIBCPP_INLINE_VISIBILITY 5314 bool operator()( weak_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const _NOEXCEPT 5315 {return __x.owner_before(__y);} 5316 }; 5317 5318 #if _LIBCPP_STD_VER > 14 5319 template <> 5320 struct _LIBCPP_TEMPLATE_VIS owner_less<void> 5321 { 5322 template <class _Tp, class _Up> 5323 _LIBCPP_INLINE_VISIBILITY 5324 bool operator()( shared_ptr<_Tp> const& __x, shared_ptr<_Up> const& __y) const _NOEXCEPT 5325 {return __x.owner_before(__y);} 5326 template <class _Tp, class _Up> 5327 _LIBCPP_INLINE_VISIBILITY 5328 bool operator()( shared_ptr<_Tp> const& __x, weak_ptr<_Up> const& __y) const _NOEXCEPT 5329 {return __x.owner_before(__y);} 5330 template <class _Tp, class _Up> 5331 _LIBCPP_INLINE_VISIBILITY 5332 bool operator()( weak_ptr<_Tp> const& __x, shared_ptr<_Up> const& __y) const _NOEXCEPT 5333 {return __x.owner_before(__y);} 5334 template <class _Tp, class _Up> 5335 _LIBCPP_INLINE_VISIBILITY 5336 bool operator()( weak_ptr<_Tp> const& __x, weak_ptr<_Up> const& __y) const _NOEXCEPT 5337 {return __x.owner_before(__y);} 5338 typedef void is_transparent; 5339 }; 5340 #endif 5341 5342 template<class _Tp> 5343 class _LIBCPP_TEMPLATE_VIS enable_shared_from_this 5344 { 5345 mutable weak_ptr<_Tp> __weak_this_; 5346 protected: 5347 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 5348 enable_shared_from_this() _NOEXCEPT {} 5349 _LIBCPP_INLINE_VISIBILITY 5350 enable_shared_from_this(enable_shared_from_this const&) _NOEXCEPT {} 5351 _LIBCPP_INLINE_VISIBILITY 5352 enable_shared_from_this& operator=(enable_shared_from_this const&) _NOEXCEPT 5353 {return *this;} 5354 _LIBCPP_INLINE_VISIBILITY 5355 ~enable_shared_from_this() {} 5356 public: 5357 _LIBCPP_INLINE_VISIBILITY 5358 shared_ptr<_Tp> shared_from_this() 5359 {return shared_ptr<_Tp>(__weak_this_);} 5360 _LIBCPP_INLINE_VISIBILITY 5361 shared_ptr<_Tp const> shared_from_this() const 5362 {return shared_ptr<const _Tp>(__weak_this_);} 5363 5364 #if _LIBCPP_STD_VER > 14 5365 _LIBCPP_INLINE_VISIBILITY 5366 weak_ptr<_Tp> weak_from_this() _NOEXCEPT 5367 { return __weak_this_; } 5368 5369 _LIBCPP_INLINE_VISIBILITY 5370 weak_ptr<const _Tp> weak_from_this() const _NOEXCEPT 5371 { return __weak_this_; } 5372 #endif // _LIBCPP_STD_VER > 14 5373 5374 template <class _Up> friend class shared_ptr; 5375 }; 5376 5377 template <class _Tp> 5378 struct _LIBCPP_TEMPLATE_VIS hash<shared_ptr<_Tp> > 5379 { 5380 typedef shared_ptr<_Tp> argument_type; 5381 typedef size_t result_type; 5382 5383 _LIBCPP_INLINE_VISIBILITY 5384 result_type operator()(const argument_type& __ptr) const _NOEXCEPT 5385 { 5386 return hash<_Tp*>()(__ptr.get()); 5387 } 5388 }; 5389 5390 template<class _CharT, class _Traits, class _Yp> 5391 inline _LIBCPP_INLINE_VISIBILITY 5392 basic_ostream<_CharT, _Traits>& 5393 operator<<(basic_ostream<_CharT, _Traits>& __os, shared_ptr<_Yp> const& __p); 5394 5395 5396 #if !defined(_LIBCPP_HAS_NO_ATOMIC_HEADER) 5397 5398 class _LIBCPP_TYPE_VIS __sp_mut 5399 { 5400 void* __lx; 5401 public: 5402 void lock() _NOEXCEPT; 5403 void unlock() _NOEXCEPT; 5404 5405 private: 5406 _LIBCPP_CONSTEXPR __sp_mut(void*) _NOEXCEPT; 5407 __sp_mut(const __sp_mut&); 5408 __sp_mut& operator=(const __sp_mut&); 5409 5410 friend _LIBCPP_FUNC_VIS __sp_mut& __get_sp_mut(const void*); 5411 }; 5412 5413 _LIBCPP_FUNC_VIS _LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR 5414 __sp_mut& __get_sp_mut(const void*); 5415 5416 template <class _Tp> 5417 inline _LIBCPP_INLINE_VISIBILITY 5418 bool 5419 atomic_is_lock_free(const shared_ptr<_Tp>*) 5420 { 5421 return false; 5422 } 5423 5424 template <class _Tp> 5425 _LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR 5426 shared_ptr<_Tp> 5427 atomic_load(const shared_ptr<_Tp>* __p) 5428 { 5429 __sp_mut& __m = __get_sp_mut(__p); 5430 __m.lock(); 5431 shared_ptr<_Tp> __q = *__p; 5432 __m.unlock(); 5433 return __q; 5434 } 5435 5436 template <class _Tp> 5437 inline _LIBCPP_INLINE_VISIBILITY 5438 _LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR 5439 shared_ptr<_Tp> 5440 atomic_load_explicit(const shared_ptr<_Tp>* __p, memory_order) 5441 { 5442 return atomic_load(__p); 5443 } 5444 5445 template <class _Tp> 5446 _LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR 5447 void 5448 atomic_store(shared_ptr<_Tp>* __p, shared_ptr<_Tp> __r) 5449 { 5450 __sp_mut& __m = __get_sp_mut(__p); 5451 __m.lock(); 5452 __p->swap(__r); 5453 __m.unlock(); 5454 } 5455 5456 template <class _Tp> 5457 inline _LIBCPP_INLINE_VISIBILITY 5458 _LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR 5459 void 5460 atomic_store_explicit(shared_ptr<_Tp>* __p, shared_ptr<_Tp> __r, memory_order) 5461 { 5462 atomic_store(__p, __r); 5463 } 5464 5465 template <class _Tp> 5466 _LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR 5467 shared_ptr<_Tp> 5468 atomic_exchange(shared_ptr<_Tp>* __p, shared_ptr<_Tp> __r) 5469 { 5470 __sp_mut& __m = __get_sp_mut(__p); 5471 __m.lock(); 5472 __p->swap(__r); 5473 __m.unlock(); 5474 return __r; 5475 } 5476 5477 template <class _Tp> 5478 inline _LIBCPP_INLINE_VISIBILITY 5479 _LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR 5480 shared_ptr<_Tp> 5481 atomic_exchange_explicit(shared_ptr<_Tp>* __p, shared_ptr<_Tp> __r, memory_order) 5482 { 5483 return atomic_exchange(__p, __r); 5484 } 5485 5486 template <class _Tp> 5487 _LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR 5488 bool 5489 atomic_compare_exchange_strong(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v, shared_ptr<_Tp> __w) 5490 { 5491 shared_ptr<_Tp> __temp; 5492 __sp_mut& __m = __get_sp_mut(__p); 5493 __m.lock(); 5494 if (__p->__owner_equivalent(*__v)) 5495 { 5496 _VSTD::swap(__temp, *__p); 5497 *__p = __w; 5498 __m.unlock(); 5499 return true; 5500 } 5501 _VSTD::swap(__temp, *__v); 5502 *__v = *__p; 5503 __m.unlock(); 5504 return false; 5505 } 5506 5507 template <class _Tp> 5508 inline _LIBCPP_INLINE_VISIBILITY 5509 _LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR 5510 bool 5511 atomic_compare_exchange_weak(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v, shared_ptr<_Tp> __w) 5512 { 5513 return atomic_compare_exchange_strong(__p, __v, __w); 5514 } 5515 5516 template <class _Tp> 5517 inline _LIBCPP_INLINE_VISIBILITY 5518 _LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR 5519 bool 5520 atomic_compare_exchange_strong_explicit(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v, 5521 shared_ptr<_Tp> __w, memory_order, memory_order) 5522 { 5523 return atomic_compare_exchange_strong(__p, __v, __w); 5524 } 5525 5526 template <class _Tp> 5527 inline _LIBCPP_INLINE_VISIBILITY 5528 _LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR 5529 bool 5530 atomic_compare_exchange_weak_explicit(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v, 5531 shared_ptr<_Tp> __w, memory_order, memory_order) 5532 { 5533 return atomic_compare_exchange_weak(__p, __v, __w); 5534 } 5535 5536 #endif // !defined(_LIBCPP_HAS_NO_ATOMIC_HEADER) 5537 5538 //enum class 5539 #if defined(_LIBCPP_ABI_POINTER_SAFETY_ENUM_TYPE) 5540 # ifndef _LIBCPP_CXX03_LANG 5541 enum class pointer_safety : unsigned char { 5542 relaxed, 5543 preferred, 5544 strict 5545 }; 5546 # endif 5547 #else 5548 struct _LIBCPP_TYPE_VIS pointer_safety 5549 { 5550 enum __lx 5551 { 5552 relaxed, 5553 preferred, 5554 strict 5555 }; 5556 5557 __lx __v_; 5558 5559 _LIBCPP_INLINE_VISIBILITY 5560 pointer_safety() : __v_() {} 5561 5562 _LIBCPP_INLINE_VISIBILITY 5563 pointer_safety(__lx __v) : __v_(__v) {} 5564 _LIBCPP_INLINE_VISIBILITY 5565 operator int() const {return __v_;} 5566 }; 5567 #endif 5568 5569 #if !defined(_LIBCPP_ABI_POINTER_SAFETY_ENUM_TYPE) && \ 5570 defined(_LIBCPP_BUILDING_LIBRARY) 5571 _LIBCPP_FUNC_VIS pointer_safety get_pointer_safety() _NOEXCEPT; 5572 #else 5573 // This function is only offered in C++03 under ABI v1. 5574 # if !defined(_LIBCPP_ABI_POINTER_SAFETY_ENUM_TYPE) || !defined(_LIBCPP_CXX03_LANG) 5575 inline _LIBCPP_INLINE_VISIBILITY 5576 pointer_safety get_pointer_safety() _NOEXCEPT { 5577 return pointer_safety::relaxed; 5578 } 5579 # endif 5580 #endif 5581 5582 5583 _LIBCPP_FUNC_VIS void declare_reachable(void* __p); 5584 _LIBCPP_FUNC_VIS void declare_no_pointers(char* __p, size_t __n); 5585 _LIBCPP_FUNC_VIS void undeclare_no_pointers(char* __p, size_t __n); 5586 _LIBCPP_FUNC_VIS void* __undeclare_reachable(void* __p); 5587 5588 template <class _Tp> 5589 inline _LIBCPP_INLINE_VISIBILITY 5590 _Tp* 5591 undeclare_reachable(_Tp* __p) 5592 { 5593 return static_cast<_Tp*>(__undeclare_reachable(__p)); 5594 } 5595 5596 _LIBCPP_FUNC_VIS void* align(size_t __align, size_t __sz, void*& __ptr, size_t& __space); 5597 5598 // --- Helper for container swap -- 5599 template <typename _Alloc> 5600 inline _LIBCPP_INLINE_VISIBILITY 5601 void __swap_allocator(_Alloc & __a1, _Alloc & __a2) 5602 #if _LIBCPP_STD_VER >= 14 5603 _NOEXCEPT 5604 #else 5605 _NOEXCEPT_(__is_nothrow_swappable<_Alloc>::value) 5606 #endif 5607 { 5608 __swap_allocator(__a1, __a2, 5609 integral_constant<bool, _VSTD::allocator_traits<_Alloc>::propagate_on_container_swap::value>()); 5610 } 5611 5612 template <typename _Alloc> 5613 _LIBCPP_INLINE_VISIBILITY 5614 void __swap_allocator(_Alloc & __a1, _Alloc & __a2, true_type) 5615 #if _LIBCPP_STD_VER >= 14 5616 _NOEXCEPT 5617 #else 5618 _NOEXCEPT_(__is_nothrow_swappable<_Alloc>::value) 5619 #endif 5620 { 5621 using _VSTD::swap; 5622 swap(__a1, __a2); 5623 } 5624 5625 template <typename _Alloc> 5626 inline _LIBCPP_INLINE_VISIBILITY 5627 void __swap_allocator(_Alloc &, _Alloc &, false_type) _NOEXCEPT {} 5628 5629 template <typename _Alloc, typename _Traits=allocator_traits<_Alloc> > 5630 struct __noexcept_move_assign_container : public integral_constant<bool, 5631 _Traits::propagate_on_container_move_assignment::value 5632 #if _LIBCPP_STD_VER > 14 5633 || _Traits::is_always_equal::value 5634 #else 5635 && is_nothrow_move_assignable<_Alloc>::value 5636 #endif 5637 > {}; 5638 5639 5640 #ifndef _LIBCPP_HAS_NO_VARIADICS 5641 template <class _Tp, class _Alloc> 5642 struct __temp_value { 5643 typedef allocator_traits<_Alloc> _Traits; 5644 5645 typename aligned_storage<sizeof(_Tp), alignof(_Tp)>::type __v; 5646 _Alloc &__a; 5647 5648 _Tp *__addr() { return reinterpret_cast<_Tp *>(addressof(__v)); } 5649 _Tp & get() { return *__addr(); } 5650 5651 template<class... _Args> 5652 _LIBCPP_NO_CFI 5653 __temp_value(_Alloc &__alloc, _Args&& ... __args) : __a(__alloc) { 5654 _Traits::construct(__a, reinterpret_cast<_Tp*>(addressof(__v)), 5655 _VSTD::forward<_Args>(__args)...); 5656 } 5657 5658 ~__temp_value() { _Traits::destroy(__a, __addr()); } 5659 }; 5660 #endif 5661 5662 template<typename _Alloc, typename = void, typename = void> 5663 struct __is_allocator : false_type {}; 5664 5665 template<typename _Alloc> 5666 struct __is_allocator<_Alloc, 5667 typename __void_t<typename _Alloc::value_type>::type, 5668 typename __void_t<decltype(_VSTD::declval<_Alloc&>().allocate(size_t(0)))>::type 5669 > 5670 : true_type {}; 5671 5672 _LIBCPP_END_NAMESPACE_STD 5673 5674 _LIBCPP_POP_MACROS 5675 5676 #endif // _LIBCPP_MEMORY 5677