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