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