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