ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/src/trunk/contrib/libc++/include/memory
Revision: 9679
Committed: Wed Dec 13 20:12:38 2017 UTC (6 years, 5 months ago) by laffer1
File size: 173966 byte(s)
Log Message:
update libcxxrt and libc++

File Contents

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