13e519524SHoward Hinnant// -*- C++ -*- 23e519524SHoward Hinnant//===-------------------------- memory ------------------------------------===// 33e519524SHoward Hinnant// 45b08a8a4SHoward Hinnant// The LLVM Compiler Infrastructure 53e519524SHoward Hinnant// 6412dbebeSHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 7412dbebeSHoward Hinnant// Source Licenses. See LICENSE.TXT for details. 83e519524SHoward Hinnant// 93e519524SHoward Hinnant//===----------------------------------------------------------------------===// 103e519524SHoward Hinnant 113e519524SHoward Hinnant#ifndef _LIBCPP_MEMORY 123e519524SHoward Hinnant#define _LIBCPP_MEMORY 133e519524SHoward Hinnant 143e519524SHoward Hinnant/* 153e519524SHoward Hinnant memory synopsis 163e519524SHoward Hinnant 173e519524SHoward Hinnantnamespace std 183e519524SHoward Hinnant{ 193e519524SHoward Hinnant 203e519524SHoward Hinnantstruct allocator_arg_t { }; 213e519524SHoward Hinnantconstexpr allocator_arg_t allocator_arg = allocator_arg_t(); 223e519524SHoward Hinnant 233e519524SHoward Hinnanttemplate <class T, class Alloc> struct uses_allocator; 243e519524SHoward Hinnant 253e519524SHoward Hinnanttemplate <class Ptr> 263e519524SHoward Hinnantstruct pointer_traits 273e519524SHoward Hinnant{ 283e519524SHoward Hinnant typedef Ptr pointer; 293e519524SHoward Hinnant typedef <details> element_type; 303e519524SHoward Hinnant typedef <details> difference_type; 313e519524SHoward Hinnant 323e519524SHoward Hinnant template <class U> using rebind = <details>; 333e519524SHoward Hinnant 343e519524SHoward Hinnant static pointer pointer_to(<details>); 353e519524SHoward Hinnant}; 363e519524SHoward Hinnant 373739fe79SHoward Hinnanttemplate <class T> 383739fe79SHoward Hinnantstruct pointer_traits<T*> 393739fe79SHoward Hinnant{ 403739fe79SHoward Hinnant typedef T* pointer; 413739fe79SHoward Hinnant typedef T element_type; 423739fe79SHoward Hinnant typedef ptrdiff_t difference_type; 433739fe79SHoward Hinnant 443739fe79SHoward Hinnant template <class U> using rebind = U*; 453739fe79SHoward Hinnant 463739fe79SHoward Hinnant static pointer pointer_to(<details>) noexcept; 473739fe79SHoward Hinnant}; 483739fe79SHoward Hinnant 493e519524SHoward Hinnanttemplate <class Alloc> 503e519524SHoward Hinnantstruct allocator_traits 513e519524SHoward Hinnant{ 523e519524SHoward Hinnant typedef Alloc allocator_type; 533e519524SHoward Hinnant typedef typename allocator_type::value_type 543e519524SHoward Hinnant value_type; 553e519524SHoward Hinnant 563e519524SHoward Hinnant typedef Alloc::pointer | value_type* pointer; 573e519524SHoward Hinnant typedef Alloc::const_pointer 583e519524SHoward Hinnant | pointer_traits<pointer>::rebind<const value_type> 593e519524SHoward Hinnant const_pointer; 603e519524SHoward Hinnant typedef Alloc::void_pointer 613e519524SHoward Hinnant | pointer_traits<pointer>::rebind<void> 623e519524SHoward Hinnant void_pointer; 633e519524SHoward Hinnant typedef Alloc::const_void_pointer 643e519524SHoward Hinnant | pointer_traits<pointer>::rebind<const void> 653e519524SHoward Hinnant const_void_pointer; 663e519524SHoward Hinnant typedef Alloc::difference_type 67a4a1ef1fSHoward Hinnant | pointer_traits<pointer>::difference_type 68a4a1ef1fSHoward Hinnant difference_type; 69a4a1ef1fSHoward Hinnant typedef Alloc::size_type 70a4a1ef1fSHoward Hinnant | make_unsigned<difference_type>::type 71a4a1ef1fSHoward Hinnant size_type; 723e519524SHoward Hinnant typedef Alloc::propagate_on_container_copy_assignment 733e519524SHoward Hinnant | false_type propagate_on_container_copy_assignment; 743e519524SHoward Hinnant typedef Alloc::propagate_on_container_move_assignment 753e519524SHoward Hinnant | false_type propagate_on_container_move_assignment; 763e519524SHoward Hinnant typedef Alloc::propagate_on_container_swap 773e519524SHoward Hinnant | false_type propagate_on_container_swap; 783e519524SHoward Hinnant 793e519524SHoward Hinnant template <class T> using rebind_alloc = Alloc::rebind<U>::other | Alloc<T, Args...>; 803e519524SHoward Hinnant template <class T> using rebind_traits = allocator_traits<rebind_alloc<T>>; 813e519524SHoward Hinnant 823e519524SHoward Hinnant static pointer allocate(allocator_type& a, size_type n); 833e519524SHoward Hinnant static pointer allocate(allocator_type& a, size_type n, const_void_pointer hint); 843e519524SHoward Hinnant 853739fe79SHoward Hinnant static void deallocate(allocator_type& a, pointer p, size_type n) noexcept; 863e519524SHoward Hinnant 873e519524SHoward Hinnant template <class T, class... Args> 883e519524SHoward Hinnant static void construct(allocator_type& a, T* p, Args&&... args); 893e519524SHoward Hinnant 903e519524SHoward Hinnant template <class T> 913e519524SHoward Hinnant static void destroy(allocator_type& a, T* p); 923e519524SHoward Hinnant 933e519524SHoward Hinnant static size_type max_size(const allocator_type& a); 943e519524SHoward Hinnant 953e519524SHoward Hinnant static allocator_type 963e519524SHoward Hinnant select_on_container_copy_construction(const allocator_type& a); 973e519524SHoward Hinnant}; 983e519524SHoward Hinnant 993e519524SHoward Hinnanttemplate <> 1003e519524SHoward Hinnantclass allocator<void> 1013e519524SHoward Hinnant{ 1023e519524SHoward Hinnantpublic: 1033e519524SHoward Hinnant typedef void* pointer; 1043e519524SHoward Hinnant typedef const void* const_pointer; 1053e519524SHoward Hinnant typedef void value_type; 1063e519524SHoward Hinnant 1073e519524SHoward Hinnant template <class _Up> struct rebind {typedef allocator<_Up> other;}; 1083e519524SHoward Hinnant}; 1093e519524SHoward Hinnant 1103e519524SHoward Hinnanttemplate <class T> 1113e519524SHoward Hinnantclass allocator 1123e519524SHoward Hinnant{ 1133e519524SHoward Hinnantpublic: 1143e519524SHoward Hinnant typedef size_t size_type; 1153e519524SHoward Hinnant typedef ptrdiff_t difference_type; 1163e519524SHoward Hinnant typedef T* pointer; 1173e519524SHoward Hinnant typedef const T* const_pointer; 1183e519524SHoward Hinnant typedef typename add_lvalue_reference<T>::type reference; 1193e519524SHoward Hinnant typedef typename add_lvalue_reference<const T>::type const_reference; 1203e519524SHoward Hinnant typedef T value_type; 1213e519524SHoward Hinnant 1223e519524SHoward Hinnant template <class U> struct rebind {typedef allocator<U> other;}; 1233e519524SHoward Hinnant 1243739fe79SHoward Hinnant allocator() noexcept; 1253739fe79SHoward Hinnant allocator(const allocator&) noexcept; 1263739fe79SHoward Hinnant template <class U> allocator(const allocator<U>&) noexcept; 1273739fe79SHoward Hinnant ~allocator(); 1283739fe79SHoward Hinnant pointer address(reference x) const noexcept; 1293739fe79SHoward Hinnant const_pointer address(const_reference x) const noexcept; 1303e519524SHoward Hinnant pointer allocate(size_type, allocator<void>::const_pointer hint = 0); 1313739fe79SHoward Hinnant void deallocate(pointer p, size_type n) noexcept; 1323739fe79SHoward Hinnant size_type max_size() const noexcept; 1333739fe79SHoward Hinnant template<class U, class... Args> 1343739fe79SHoward Hinnant void construct(U* p, Args&&... args); 1353739fe79SHoward Hinnant template <class U> 1363739fe79SHoward Hinnant void destroy(U* p); 1373e519524SHoward Hinnant}; 1383e519524SHoward Hinnant 1393e519524SHoward Hinnanttemplate <class T, class U> 1403739fe79SHoward Hinnantbool operator==(const allocator<T>&, const allocator<U>&) noexcept; 1413e519524SHoward Hinnant 1423e519524SHoward Hinnanttemplate <class T, class U> 1433739fe79SHoward Hinnantbool operator!=(const allocator<T>&, const allocator<U>&) noexcept; 1443e519524SHoward Hinnant 1453e519524SHoward Hinnanttemplate <class OutputIterator, class T> 1463e519524SHoward Hinnantclass raw_storage_iterator 1473e519524SHoward Hinnant : public iterator<output_iterator_tag, 1483e519524SHoward Hinnant T, // purposefully not C++03 1493e519524SHoward Hinnant ptrdiff_t, // purposefully not C++03 1503e519524SHoward Hinnant T*, // purposefully not C++03 1513e519524SHoward Hinnant raw_storage_iterator&> // purposefully not C++03 1523e519524SHoward Hinnant{ 1533e519524SHoward Hinnantpublic: 1543e519524SHoward Hinnant explicit raw_storage_iterator(OutputIterator x); 1553e519524SHoward Hinnant raw_storage_iterator& operator*(); 1563e519524SHoward Hinnant raw_storage_iterator& operator=(const T& element); 1573e519524SHoward Hinnant raw_storage_iterator& operator++(); 1583e519524SHoward Hinnant raw_storage_iterator operator++(int); 1593e519524SHoward Hinnant}; 1603e519524SHoward Hinnant 1613739fe79SHoward Hinnanttemplate <class T> pair<T*,ptrdiff_t> get_temporary_buffer(ptrdiff_t n) noexcept; 1623739fe79SHoward Hinnanttemplate <class T> void return_temporary_buffer(T* p) noexcept; 1633739fe79SHoward Hinnant 1643739fe79SHoward Hinnanttemplate <class T> T* addressof(T& r) noexcept; 1653e519524SHoward Hinnant 1663e519524SHoward Hinnanttemplate <class InputIterator, class ForwardIterator> 1673e519524SHoward HinnantForwardIterator 1683e519524SHoward Hinnantuninitialized_copy(InputIterator first, InputIterator last, ForwardIterator result); 1693e519524SHoward Hinnant 1703739fe79SHoward Hinnanttemplate <class InputIterator, class Size, class ForwardIterator> 1713739fe79SHoward HinnantForwardIterator 1723739fe79SHoward Hinnantuninitialized_copy_n(InputIterator first, Size n, ForwardIterator result); 1733739fe79SHoward Hinnant 1743e519524SHoward Hinnanttemplate <class ForwardIterator, class T> 1753e519524SHoward Hinnantvoid uninitialized_fill(ForwardIterator first, ForwardIterator last, const T& x); 1763e519524SHoward Hinnant 1773e519524SHoward Hinnanttemplate <class ForwardIterator, class Size, class T> 17848d05bd2SHoward HinnantForwardIterator 17948d05bd2SHoward Hinnantuninitialized_fill_n(ForwardIterator first, Size n, const T& x); 1803e519524SHoward Hinnant 1813e519524SHoward Hinnanttemplate <class Y> struct auto_ptr_ref {}; 1823e519524SHoward Hinnant 1833e519524SHoward Hinnanttemplate<class X> 1843e519524SHoward Hinnantclass auto_ptr 1853e519524SHoward Hinnant{ 1863e519524SHoward Hinnantpublic: 1873e519524SHoward Hinnant typedef X element_type; 1883e519524SHoward Hinnant 1893e519524SHoward Hinnant explicit auto_ptr(X* p =0) throw(); 1903e519524SHoward Hinnant auto_ptr(auto_ptr&) throw(); 1913e519524SHoward Hinnant template<class Y> auto_ptr(auto_ptr<Y>&) throw(); 1923e519524SHoward Hinnant auto_ptr& operator=(auto_ptr&) throw(); 1933e519524SHoward Hinnant template<class Y> auto_ptr& operator=(auto_ptr<Y>&) throw(); 1943e519524SHoward Hinnant auto_ptr& operator=(auto_ptr_ref<X> r) throw(); 1953e519524SHoward Hinnant ~auto_ptr() throw(); 1963e519524SHoward Hinnant 1973e519524SHoward Hinnant typename add_lvalue_reference<X>::type operator*() const throw(); 1983e519524SHoward Hinnant X* operator->() const throw(); 1993e519524SHoward Hinnant X* get() const throw(); 2003e519524SHoward Hinnant X* release() throw(); 2013e519524SHoward Hinnant void reset(X* p =0) throw(); 2023e519524SHoward Hinnant 2033e519524SHoward Hinnant auto_ptr(auto_ptr_ref<X>) throw(); 2043e519524SHoward Hinnant template<class Y> operator auto_ptr_ref<Y>() throw(); 2053e519524SHoward Hinnant template<class Y> operator auto_ptr<Y>() throw(); 2063e519524SHoward Hinnant}; 2073e519524SHoward Hinnant 20820cc2a42SHoward Hinnanttemplate <class T> 20920cc2a42SHoward Hinnantstruct default_delete 21020cc2a42SHoward Hinnant{ 2113739fe79SHoward Hinnant constexpr default_delete() noexcept = default; 2123739fe79SHoward Hinnant template <class U> default_delete(const default_delete<U>&) noexcept; 21320cc2a42SHoward Hinnant 2143739fe79SHoward Hinnant void operator()(T*) const noexcept; 21520cc2a42SHoward Hinnant}; 21620cc2a42SHoward Hinnant 21720cc2a42SHoward Hinnanttemplate <class T> 21820cc2a42SHoward Hinnantstruct default_delete<T[]> 21920cc2a42SHoward Hinnant{ 2203739fe79SHoward Hinnant constexpr default_delete() noexcept = default; 2213739fe79SHoward Hinnant void operator()(T*) const noexcept; 22220cc2a42SHoward Hinnant template <class U> void operator()(U*) const = delete; 22320cc2a42SHoward Hinnant}; 22420cc2a42SHoward Hinnant 22520cc2a42SHoward Hinnanttemplate <class T, class D = default_delete<T>> 22620cc2a42SHoward Hinnantclass unique_ptr 22720cc2a42SHoward Hinnant{ 22820cc2a42SHoward Hinnantpublic: 22920cc2a42SHoward Hinnant typedef see below pointer; 23020cc2a42SHoward Hinnant typedef T element_type; 23120cc2a42SHoward Hinnant typedef D deleter_type; 23220cc2a42SHoward Hinnant 23320cc2a42SHoward Hinnant // constructors 2343739fe79SHoward Hinnant constexpr unique_ptr() noexcept; 2353739fe79SHoward Hinnant explicit unique_ptr(pointer p) noexcept; 2363739fe79SHoward Hinnant unique_ptr(pointer p, see below d1) noexcept; 2373739fe79SHoward Hinnant unique_ptr(pointer p, see below d2) noexcept; 2383739fe79SHoward Hinnant unique_ptr(unique_ptr&& u) noexcept; 2393739fe79SHoward Hinnant unique_ptr(nullptr_t) noexcept : unique_ptr() { } 24020cc2a42SHoward Hinnant template <class U, class E> 2413739fe79SHoward Hinnant unique_ptr(unique_ptr<U, E>&& u) noexcept; 24220cc2a42SHoward Hinnant template <class U> 2433739fe79SHoward Hinnant unique_ptr(auto_ptr<U>&& u) noexcept; 24420cc2a42SHoward Hinnant 24520cc2a42SHoward Hinnant // destructor 24620cc2a42SHoward Hinnant ~unique_ptr(); 24720cc2a42SHoward Hinnant 24820cc2a42SHoward Hinnant // assignment 2493739fe79SHoward Hinnant unique_ptr& operator=(unique_ptr&& u) noexcept; 2503739fe79SHoward Hinnant template <class U, class E> unique_ptr& operator=(unique_ptr<U, E>&& u) noexcept; 2513739fe79SHoward Hinnant unique_ptr& operator=(nullptr_t) noexcept; 25220cc2a42SHoward Hinnant 25320cc2a42SHoward Hinnant // observers 25420cc2a42SHoward Hinnant typename add_lvalue_reference<T>::type operator*() const; 2553739fe79SHoward Hinnant pointer operator->() const noexcept; 2563739fe79SHoward Hinnant pointer get() const noexcept; 2573739fe79SHoward Hinnant deleter_type& get_deleter() noexcept; 2583739fe79SHoward Hinnant const deleter_type& get_deleter() const noexcept; 2593739fe79SHoward Hinnant explicit operator bool() const noexcept; 26020cc2a42SHoward Hinnant 26120cc2a42SHoward Hinnant // modifiers 2623739fe79SHoward Hinnant pointer release() noexcept; 2633739fe79SHoward Hinnant void reset(pointer p = pointer()) noexcept; 2643739fe79SHoward Hinnant void swap(unique_ptr& u) noexcept; 26520cc2a42SHoward Hinnant}; 26620cc2a42SHoward Hinnant 26720cc2a42SHoward Hinnanttemplate <class T, class D> 26820cc2a42SHoward Hinnantclass unique_ptr<T[], D> 26920cc2a42SHoward Hinnant{ 27020cc2a42SHoward Hinnantpublic: 27120cc2a42SHoward Hinnant typedef implementation-defined pointer; 27220cc2a42SHoward Hinnant typedef T element_type; 27320cc2a42SHoward Hinnant typedef D deleter_type; 27420cc2a42SHoward Hinnant 27520cc2a42SHoward Hinnant // constructors 2763739fe79SHoward Hinnant constexpr unique_ptr() noexcept; 2773739fe79SHoward Hinnant explicit unique_ptr(pointer p) noexcept; 2783739fe79SHoward Hinnant unique_ptr(pointer p, see below d) noexcept; 2793739fe79SHoward Hinnant unique_ptr(pointer p, see below d) noexcept; 2803739fe79SHoward Hinnant unique_ptr(unique_ptr&& u) noexcept; 2813739fe79SHoward Hinnant unique_ptr(nullptr_t) noexcept : unique_ptr() { } 28220cc2a42SHoward Hinnant 28320cc2a42SHoward Hinnant // destructor 284b3371f6fSHoward Hinnant ~unique_ptr(); 28520cc2a42SHoward Hinnant 28620cc2a42SHoward Hinnant // assignment 2873739fe79SHoward Hinnant unique_ptr& operator=(unique_ptr&& u) noexcept; 2883739fe79SHoward Hinnant unique_ptr& operator=(nullptr_t) noexcept; 28920cc2a42SHoward Hinnant 29020cc2a42SHoward Hinnant // observers 29120cc2a42SHoward Hinnant T& operator[](size_t i) const; 2923739fe79SHoward Hinnant pointer get() const noexcept; 2933739fe79SHoward Hinnant deleter_type& get_deleter() noexcept; 2943739fe79SHoward Hinnant const deleter_type& get_deleter() const noexcept; 2953739fe79SHoward Hinnant explicit operator bool() const noexcept; 29620cc2a42SHoward Hinnant 29720cc2a42SHoward Hinnant // modifiers 2983739fe79SHoward Hinnant pointer release() noexcept; 2993739fe79SHoward Hinnant void reset(pointer p = pointer()) noexcept; 3003739fe79SHoward Hinnant void reset(nullptr_t) noexcept; 30120cc2a42SHoward Hinnant template <class U> void reset(U) = delete; 3023739fe79SHoward Hinnant void swap(unique_ptr& u) noexcept; 30320cc2a42SHoward Hinnant}; 30420cc2a42SHoward Hinnant 30520cc2a42SHoward Hinnanttemplate <class T, class D> 3063739fe79SHoward Hinnant void swap(unique_ptr<T, D>& x, unique_ptr<T, D>& y) noexcept; 30720cc2a42SHoward Hinnant 30820cc2a42SHoward Hinnanttemplate <class T1, class D1, class T2, class D2> 30920cc2a42SHoward Hinnant bool operator==(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 31020cc2a42SHoward Hinnanttemplate <class T1, class D1, class T2, class D2> 31120cc2a42SHoward Hinnant bool operator!=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 31220cc2a42SHoward Hinnanttemplate <class T1, class D1, class T2, class D2> 31320cc2a42SHoward Hinnant bool operator<(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 31420cc2a42SHoward Hinnanttemplate <class T1, class D1, class T2, class D2> 31520cc2a42SHoward Hinnant bool operator<=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 31620cc2a42SHoward Hinnanttemplate <class T1, class D1, class T2, class D2> 31720cc2a42SHoward Hinnant bool operator>(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 31820cc2a42SHoward Hinnanttemplate <class T1, class D1, class T2, class D2> 31920cc2a42SHoward Hinnant bool operator>=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 32020cc2a42SHoward Hinnant 3213739fe79SHoward Hinnanttemplate <class T, class D> 3223739fe79SHoward Hinnant bool operator==(const unique_ptr<T, D>& x, nullptr_t) noexcept; 3233739fe79SHoward Hinnanttemplate <class T, class D> 3243739fe79SHoward Hinnant bool operator==(nullptr_t, const unique_ptr<T, D>& y) noexcept; 3253739fe79SHoward Hinnanttemplate <class T, class D> 3263739fe79SHoward Hinnant bool operator!=(const unique_ptr<T, D>& x, nullptr_t) noexcept; 3273739fe79SHoward Hinnanttemplate <class T, class D> 3283739fe79SHoward Hinnant bool operator!=(nullptr_t, const unique_ptr<T, D>& y) noexcept; 3293739fe79SHoward Hinnant 3303739fe79SHoward Hinnanttemplate <class T, class D> 3313739fe79SHoward Hinnant bool operator<(const unique_ptr<T, D>& x, nullptr_t); 3323739fe79SHoward Hinnanttemplate <class T, class D> 3333739fe79SHoward Hinnant bool operator<(nullptr_t, const unique_ptr<T, D>& y); 3343739fe79SHoward Hinnanttemplate <class T, class D> 3353739fe79SHoward Hinnant bool operator<=(const unique_ptr<T, D>& x, nullptr_t); 3363739fe79SHoward Hinnanttemplate <class T, class D> 3373739fe79SHoward Hinnant bool operator<=(nullptr_t, const unique_ptr<T, D>& y); 3383739fe79SHoward Hinnanttemplate <class T, class D> 3393739fe79SHoward Hinnant bool operator>(const unique_ptr<T, D>& x, nullptr_t); 3403739fe79SHoward Hinnanttemplate <class T, class D> 3413739fe79SHoward Hinnant bool operator>(nullptr_t, const unique_ptr<T, D>& y); 3423739fe79SHoward Hinnanttemplate <class T, class D> 3433739fe79SHoward Hinnant bool operator>=(const unique_ptr<T, D>& x, nullptr_t); 3443739fe79SHoward Hinnanttemplate <class T, class D> 3453739fe79SHoward Hinnant bool operator>=(nullptr_t, const unique_ptr<T, D>& y); 3463739fe79SHoward Hinnant 34720cc2a42SHoward Hinnantclass bad_weak_ptr 34820cc2a42SHoward Hinnant : public std::exception 34920cc2a42SHoward Hinnant{ 3503739fe79SHoward Hinnant bad_weak_ptr() noexcept; 35120cc2a42SHoward Hinnant}; 35220cc2a42SHoward Hinnant 35320cc2a42SHoward Hinnanttemplate<class T> 35420cc2a42SHoward Hinnantclass shared_ptr 35520cc2a42SHoward Hinnant{ 35620cc2a42SHoward Hinnantpublic: 35720cc2a42SHoward Hinnant typedef T element_type; 35820cc2a42SHoward Hinnant 35920cc2a42SHoward Hinnant // constructors: 3603739fe79SHoward Hinnant constexpr shared_ptr() noexcept; 36120cc2a42SHoward Hinnant template<class Y> explicit shared_ptr(Y* p); 36220cc2a42SHoward Hinnant template<class Y, class D> shared_ptr(Y* p, D d); 36320cc2a42SHoward Hinnant template<class Y, class D, class A> shared_ptr(Y* p, D d, A a); 36420cc2a42SHoward Hinnant template <class D> shared_ptr(nullptr_t p, D d); 36520cc2a42SHoward Hinnant template <class D, class A> shared_ptr(nullptr_t p, D d, A a); 3663739fe79SHoward Hinnant template<class Y> shared_ptr(const shared_ptr<Y>& r, T *p) noexcept; 3673739fe79SHoward Hinnant shared_ptr(const shared_ptr& r) noexcept; 3683739fe79SHoward Hinnant template<class Y> shared_ptr(const shared_ptr<Y>& r) noexcept; 3693739fe79SHoward Hinnant shared_ptr(shared_ptr&& r) noexcept; 3703739fe79SHoward Hinnant template<class Y> shared_ptr(shared_ptr<Y>&& r) noexcept; 37120cc2a42SHoward Hinnant template<class Y> explicit shared_ptr(const weak_ptr<Y>& r); 37220cc2a42SHoward Hinnant template<class Y> shared_ptr(auto_ptr<Y>&& r); 37320cc2a42SHoward Hinnant template <class Y, class D> shared_ptr(unique_ptr<Y, D>&& r); 37420cc2a42SHoward Hinnant shared_ptr(nullptr_t) : shared_ptr() { } 37520cc2a42SHoward Hinnant 37620cc2a42SHoward Hinnant // destructor: 37720cc2a42SHoward Hinnant ~shared_ptr(); 37820cc2a42SHoward Hinnant 37920cc2a42SHoward Hinnant // assignment: 3803739fe79SHoward Hinnant shared_ptr& operator=(const shared_ptr& r) noexcept; 3813739fe79SHoward Hinnant template<class Y> shared_ptr& operator=(const shared_ptr<Y>& r) noexcept; 3823739fe79SHoward Hinnant shared_ptr& operator=(shared_ptr&& r) noexcept; 38320cc2a42SHoward Hinnant template<class Y> shared_ptr& operator=(shared_ptr<Y>&& r); 38420cc2a42SHoward Hinnant template<class Y> shared_ptr& operator=(auto_ptr<Y>&& r); 38520cc2a42SHoward Hinnant template <class Y, class D> shared_ptr& operator=(unique_ptr<Y, D>&& r); 38620cc2a42SHoward Hinnant 38720cc2a42SHoward Hinnant // modifiers: 3883739fe79SHoward Hinnant void swap(shared_ptr& r) noexcept; 3893739fe79SHoward Hinnant void reset() noexcept; 39020cc2a42SHoward Hinnant template<class Y> void reset(Y* p); 39120cc2a42SHoward Hinnant template<class Y, class D> void reset(Y* p, D d); 39220cc2a42SHoward Hinnant template<class Y, class D, class A> void reset(Y* p, D d, A a); 39320cc2a42SHoward Hinnant 3943739fe79SHoward Hinnant // observers: 3953739fe79SHoward Hinnant T* get() const noexcept; 3963739fe79SHoward Hinnant T& operator*() const noexcept; 3973739fe79SHoward Hinnant T* operator->() const noexcept; 3983739fe79SHoward Hinnant long use_count() const noexcept; 3993739fe79SHoward Hinnant bool unique() const noexcept; 4003739fe79SHoward Hinnant explicit operator bool() const noexcept; 40120cc2a42SHoward Hinnant template<class U> bool owner_before(shared_ptr<U> const& b) const; 40220cc2a42SHoward Hinnant template<class U> bool owner_before(weak_ptr<U> const& b) const; 40320cc2a42SHoward Hinnant}; 40420cc2a42SHoward Hinnant 40520cc2a42SHoward Hinnant// shared_ptr comparisons: 40620cc2a42SHoward Hinnanttemplate<class T, class U> 4073739fe79SHoward Hinnant bool operator==(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; 40820cc2a42SHoward Hinnanttemplate<class T, class U> 4093739fe79SHoward Hinnant bool operator!=(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; 41020cc2a42SHoward Hinnanttemplate<class T, class U> 4113739fe79SHoward Hinnant bool operator<(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; 41220cc2a42SHoward Hinnanttemplate<class T, class U> 4133739fe79SHoward Hinnant bool operator>(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; 41420cc2a42SHoward Hinnanttemplate<class T, class U> 4153739fe79SHoward Hinnant bool operator<=(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; 41620cc2a42SHoward Hinnanttemplate<class T, class U> 4173739fe79SHoward Hinnant bool operator>=(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; 4183739fe79SHoward Hinnant 4193739fe79SHoward Hinnanttemplate <class T> 4203739fe79SHoward Hinnant bool operator==(const shared_ptr<T>& x, nullptr_t) noexcept; 4213739fe79SHoward Hinnanttemplate <class T> 4223739fe79SHoward Hinnant bool operator==(nullptr_t, const shared_ptr<T>& y) noexcept; 4233739fe79SHoward Hinnanttemplate <class T> 4243739fe79SHoward Hinnant bool operator!=(const shared_ptr<T>& x, nullptr_t) noexcept; 4253739fe79SHoward Hinnanttemplate <class T> 4263739fe79SHoward Hinnant bool operator!=(nullptr_t, const shared_ptr<T>& y) noexcept; 4273739fe79SHoward Hinnanttemplate <class T> 4283739fe79SHoward Hinnant bool operator<(const shared_ptr<T>& x, nullptr_t) noexcept; 4293739fe79SHoward Hinnanttemplate <class T> 4303739fe79SHoward Hinnantbool operator<(nullptr_t, const shared_ptr<T>& y) noexcept; 4313739fe79SHoward Hinnanttemplate <class T> 4323739fe79SHoward Hinnant bool operator<=(const shared_ptr<T>& x, nullptr_t) noexcept; 4333739fe79SHoward Hinnanttemplate <class T> 4343739fe79SHoward Hinnant bool operator<=(nullptr_t, const shared_ptr<T>& y) noexcept; 4353739fe79SHoward Hinnanttemplate <class T> 4363739fe79SHoward Hinnant bool operator>(const shared_ptr<T>& x, nullptr_t) noexcept; 4373739fe79SHoward Hinnanttemplate <class T> 4383739fe79SHoward Hinnant bool operator>(nullptr_t, const shared_ptr<T>& y) noexcept; 4393739fe79SHoward Hinnanttemplate <class T> 4403739fe79SHoward Hinnant bool operator>=(const shared_ptr<T>& x, nullptr_t) noexcept; 4413739fe79SHoward Hinnanttemplate <class T> 4423739fe79SHoward Hinnant bool operator>=(nullptr_t, const shared_ptr<T>& y) noexcept; 44320cc2a42SHoward Hinnant 44420cc2a42SHoward Hinnant// shared_ptr specialized algorithms: 4453739fe79SHoward Hinnanttemplate<class T> void swap(shared_ptr<T>& a, shared_ptr<T>& b) noexcept; 44620cc2a42SHoward Hinnant 44720cc2a42SHoward Hinnant// shared_ptr casts: 44820cc2a42SHoward Hinnanttemplate<class T, class U> 4493739fe79SHoward Hinnant shared_ptr<T> static_pointer_cast(shared_ptr<U> const& r) noexcept; 45020cc2a42SHoward Hinnanttemplate<class T, class U> 4513739fe79SHoward Hinnant shared_ptr<T> dynamic_pointer_cast(shared_ptr<U> const& r) noexcept; 45220cc2a42SHoward Hinnanttemplate<class T, class U> 4533739fe79SHoward Hinnant shared_ptr<T> const_pointer_cast(shared_ptr<U> const& r) noexcept; 45420cc2a42SHoward Hinnant 45520cc2a42SHoward Hinnant// shared_ptr I/O: 45620cc2a42SHoward Hinnanttemplate<class E, class T, class Y> 45720cc2a42SHoward Hinnant basic_ostream<E, T>& operator<< (basic_ostream<E, T>& os, shared_ptr<Y> const& p); 45820cc2a42SHoward Hinnant 45920cc2a42SHoward Hinnant// shared_ptr get_deleter: 4603739fe79SHoward Hinnanttemplate<class D, class T> D* get_deleter(shared_ptr<T> const& p) noexcept; 46120cc2a42SHoward Hinnant 46220cc2a42SHoward Hinnanttemplate<class T, class... Args> 46320cc2a42SHoward Hinnant shared_ptr<T> make_shared(Args&&... args); 46420cc2a42SHoward Hinnanttemplate<class T, class A, class... Args> 46520cc2a42SHoward Hinnant shared_ptr<T> allocate_shared(const A& a, Args&&... args); 46620cc2a42SHoward Hinnant 46720cc2a42SHoward Hinnanttemplate<class T> 46820cc2a42SHoward Hinnantclass weak_ptr 46920cc2a42SHoward Hinnant{ 47020cc2a42SHoward Hinnantpublic: 47120cc2a42SHoward Hinnant typedef T element_type; 47220cc2a42SHoward Hinnant 47320cc2a42SHoward Hinnant // constructors 4743739fe79SHoward Hinnant constexpr weak_ptr() noexcept; 4753739fe79SHoward Hinnant template<class Y> weak_ptr(shared_ptr<Y> const& r) noexcept; 4763739fe79SHoward Hinnant weak_ptr(weak_ptr const& r) noexcept; 4773739fe79SHoward Hinnant template<class Y> weak_ptr(weak_ptr<Y> const& r) noexcept; 47820cc2a42SHoward Hinnant 47920cc2a42SHoward Hinnant // destructor 48020cc2a42SHoward Hinnant ~weak_ptr(); 48120cc2a42SHoward Hinnant 48220cc2a42SHoward Hinnant // assignment 4833739fe79SHoward Hinnant weak_ptr& operator=(weak_ptr const& r) noexcept; 4843739fe79SHoward Hinnant template<class Y> weak_ptr& operator=(weak_ptr<Y> const& r) noexcept; 4853739fe79SHoward Hinnant template<class Y> weak_ptr& operator=(shared_ptr<Y> const& r) noexcept; 48620cc2a42SHoward Hinnant 48720cc2a42SHoward Hinnant // modifiers 4883739fe79SHoward Hinnant void swap(weak_ptr& r) noexcept; 4893739fe79SHoward Hinnant void reset() noexcept; 49020cc2a42SHoward Hinnant 49120cc2a42SHoward Hinnant // observers 4923739fe79SHoward Hinnant long use_count() const noexcept; 4933739fe79SHoward Hinnant bool expired() const noexcept; 4943739fe79SHoward Hinnant shared_ptr<T> lock() const noexcept; 49520cc2a42SHoward Hinnant template<class U> bool owner_before(shared_ptr<U> const& b); 49620cc2a42SHoward Hinnant template<class U> bool owner_before(weak_ptr<U> const& b); 49720cc2a42SHoward Hinnant}; 49820cc2a42SHoward Hinnant 49920cc2a42SHoward Hinnant// weak_ptr specialized algorithms: 5003739fe79SHoward Hinnanttemplate<class T> void swap(weak_ptr<T>& a, weak_ptr<T>& b) noexcept; 50120cc2a42SHoward Hinnant 50220cc2a42SHoward Hinnant// class owner_less: 50320cc2a42SHoward Hinnanttemplate<class T> struct owner_less; 50420cc2a42SHoward Hinnant 50520cc2a42SHoward Hinnanttemplate<class T> 50620cc2a42SHoward Hinnantstruct owner_less<shared_ptr<T>> 50720cc2a42SHoward Hinnant : binary_function<shared_ptr<T>, shared_ptr<T>, bool> 50820cc2a42SHoward Hinnant{ 50920cc2a42SHoward Hinnant typedef bool result_type; 51020cc2a42SHoward Hinnant bool operator()(shared_ptr<T> const&, shared_ptr<T> const&) const; 51120cc2a42SHoward Hinnant bool operator()(shared_ptr<T> const&, weak_ptr<T> const&) const; 51220cc2a42SHoward Hinnant bool operator()(weak_ptr<T> const&, shared_ptr<T> const&) const; 51320cc2a42SHoward Hinnant}; 51420cc2a42SHoward Hinnant 51520cc2a42SHoward Hinnanttemplate<class T> 51620cc2a42SHoward Hinnantstruct owner_less<weak_ptr<T>> 51720cc2a42SHoward Hinnant : binary_function<weak_ptr<T>, weak_ptr<T>, bool> 51820cc2a42SHoward Hinnant{ 51920cc2a42SHoward Hinnant typedef bool result_type; 52020cc2a42SHoward Hinnant bool operator()(weak_ptr<T> const&, weak_ptr<T> const&) const; 52120cc2a42SHoward Hinnant bool operator()(shared_ptr<T> const&, weak_ptr<T> const&) const; 52220cc2a42SHoward Hinnant bool operator()(weak_ptr<T> const&, shared_ptr<T> const&) const; 52320cc2a42SHoward Hinnant}; 52420cc2a42SHoward Hinnant 52520cc2a42SHoward Hinnanttemplate<class T> 52620cc2a42SHoward Hinnantclass enable_shared_from_this 52720cc2a42SHoward Hinnant{ 52820cc2a42SHoward Hinnantprotected: 5293739fe79SHoward Hinnant constexpr enable_shared_from_this() noexcept; 5303739fe79SHoward Hinnant enable_shared_from_this(enable_shared_from_this const&) noexcept; 5313739fe79SHoward Hinnant enable_shared_from_this& operator=(enable_shared_from_this const&) noexcept; 53220cc2a42SHoward Hinnant ~enable_shared_from_this(); 53320cc2a42SHoward Hinnantpublic: 53420cc2a42SHoward Hinnant shared_ptr<T> shared_from_this(); 53520cc2a42SHoward Hinnant shared_ptr<T const> shared_from_this() const; 53620cc2a42SHoward Hinnant}; 53720cc2a42SHoward Hinnant 53820cc2a42SHoward Hinnanttemplate<class T> 53920cc2a42SHoward Hinnant bool atomic_is_lock_free(const shared_ptr<T>* p); 54020cc2a42SHoward Hinnanttemplate<class T> 54120cc2a42SHoward Hinnant shared_ptr<T> atomic_load(const shared_ptr<T>* p); 54220cc2a42SHoward Hinnanttemplate<class T> 54320cc2a42SHoward Hinnant shared_ptr<T> atomic_load_explicit(const shared_ptr<T>* p, memory_order mo); 54420cc2a42SHoward Hinnanttemplate<class T> 54520cc2a42SHoward Hinnant void atomic_store(shared_ptr<T>* p, shared_ptr<T> r); 54620cc2a42SHoward Hinnanttemplate<class T> 54720cc2a42SHoward Hinnant void atomic_store_explicit(shared_ptr<T>* p, shared_ptr<T> r, memory_order mo); 54820cc2a42SHoward Hinnanttemplate<class T> 54920cc2a42SHoward Hinnant shared_ptr<T> atomic_exchange(shared_ptr<T>* p, shared_ptr<T> r); 55020cc2a42SHoward Hinnanttemplate<class T> 55120cc2a42SHoward Hinnant shared_ptr<T> 55220cc2a42SHoward Hinnant atomic_exchange_explicit(shared_ptr<T>* p, shared_ptr<T> r, memory_order mo); 55320cc2a42SHoward Hinnanttemplate<class T> 55420cc2a42SHoward Hinnant bool 55520cc2a42SHoward Hinnant atomic_compare_exchange_weak(shared_ptr<T>* p, shared_ptr<T>* v, shared_ptr<T> w); 55620cc2a42SHoward Hinnanttemplate<class T> 55720cc2a42SHoward Hinnant bool 55820cc2a42SHoward Hinnant atomic_compare_exchange_strong( shared_ptr<T>* p, shared_ptr<T>* v, shared_ptr<T> w); 55920cc2a42SHoward Hinnanttemplate<class T> 56020cc2a42SHoward Hinnant bool 56120cc2a42SHoward Hinnant atomic_compare_exchange_weak_explicit(shared_ptr<T>* p, shared_ptr<T>* v, 56220cc2a42SHoward Hinnant shared_ptr<T> w, memory_order success, 56320cc2a42SHoward Hinnant memory_order failure); 56420cc2a42SHoward Hinnanttemplate<class T> 56520cc2a42SHoward Hinnant bool 56620cc2a42SHoward Hinnant atomic_compare_exchange_strong_explicit(shared_ptr<T>* p, shared_ptr<T>* v, 56720cc2a42SHoward Hinnant shared_ptr<T> w, memory_order success, 56820cc2a42SHoward Hinnant memory_order failure); 56920cc2a42SHoward Hinnant// Hash support 57020cc2a42SHoward Hinnanttemplate <class T> struct hash; 57120cc2a42SHoward Hinnanttemplate <class T, class D> struct hash<unique_ptr<T, D> >; 57220cc2a42SHoward Hinnanttemplate <class T> struct hash<shared_ptr<T> >; 57320cc2a42SHoward Hinnant 57420cc2a42SHoward Hinnant// Pointer safety 57520cc2a42SHoward Hinnantenum class pointer_safety { relaxed, preferred, strict }; 57620cc2a42SHoward Hinnantvoid declare_reachable(void *p); 57720cc2a42SHoward Hinnanttemplate <class T> T *undeclare_reachable(T *p); 57820cc2a42SHoward Hinnantvoid declare_no_pointers(char *p, size_t n); 57920cc2a42SHoward Hinnantvoid undeclare_no_pointers(char *p, size_t n); 5803739fe79SHoward Hinnantpointer_safety get_pointer_safety() noexcept; 58120cc2a42SHoward Hinnant 5823e519524SHoward Hinnantvoid* align(size_t alignment, size_t size, void*& ptr, size_t& space); 5833e519524SHoward Hinnant 5843e519524SHoward Hinnant} // std 5853e519524SHoward Hinnant 5863e519524SHoward Hinnant*/ 5873e519524SHoward Hinnant 5883e519524SHoward Hinnant#include <__config> 5893e519524SHoward Hinnant#include <type_traits> 5903e519524SHoward Hinnant#include <typeinfo> 5913e519524SHoward Hinnant#include <cstddef> 5923e519524SHoward Hinnant#include <cstdint> 5933e519524SHoward Hinnant#include <new> 5943e519524SHoward Hinnant#include <utility> 5953e519524SHoward Hinnant#include <limits> 5963e519524SHoward Hinnant#include <iterator> 5973e519524SHoward Hinnant#include <__functional_base> 5983e519524SHoward Hinnant#if defined(_LIBCPP_NO_EXCEPTIONS) 5993e519524SHoward Hinnant #include <cassert> 6003e519524SHoward Hinnant#endif 6013e519524SHoward Hinnant 6023e519524SHoward Hinnant#pragma GCC system_header 6033e519524SHoward Hinnant 6043e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 6053e519524SHoward Hinnant 6063e519524SHoward Hinnant// allocator_arg_t 6073e519524SHoward Hinnant 608848a5374SHoward Hinnantstruct _LIBCPP_VISIBLE allocator_arg_t { }; 6093e519524SHoward Hinnant 6103e519524SHoward Hinnantextern const allocator_arg_t allocator_arg; 6113e519524SHoward Hinnant 6123e519524SHoward Hinnant// addressof 6133e519524SHoward Hinnant 6143e519524SHoward Hinnanttemplate <class _Tp> 6153e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 6163e519524SHoward Hinnant_Tp* 6173739fe79SHoward Hinnantaddressof(_Tp& __x) _NOEXCEPT 6183e519524SHoward Hinnant{ 6193e519524SHoward Hinnant return (_Tp*)&(char&)__x; 6203e519524SHoward Hinnant} 6213e519524SHoward Hinnant 6223e519524SHoward Hinnanttemplate <class _Tp> class allocator; 6233e519524SHoward Hinnant 6243e519524SHoward Hinnanttemplate <> 625848a5374SHoward Hinnantclass _LIBCPP_VISIBLE allocator<void> 6263e519524SHoward Hinnant{ 6273e519524SHoward Hinnantpublic: 6283e519524SHoward Hinnant typedef void* pointer; 6293e519524SHoward Hinnant typedef const void* const_pointer; 6303e519524SHoward Hinnant typedef void value_type; 6313e519524SHoward Hinnant 6323e519524SHoward Hinnant template <class _Up> struct rebind {typedef allocator<_Up> other;}; 6333e519524SHoward Hinnant}; 6343e519524SHoward Hinnant 6353e519524SHoward Hinnant// pointer_traits 6363e519524SHoward Hinnant 6373e519524SHoward Hinnanttemplate <class _Tp> 6383e519524SHoward Hinnantstruct __has_element_type 6393e519524SHoward Hinnant{ 6403e519524SHoward Hinnantprivate: 6413e519524SHoward Hinnant struct __two {char _; char __;}; 6423e519524SHoward Hinnant template <class _Up> static __two __test(...); 6433e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::element_type* = 0); 6443e519524SHoward Hinnantpublic: 6453e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 6463e519524SHoward Hinnant}; 6473e519524SHoward Hinnant 6483e519524SHoward Hinnanttemplate <class _Ptr, bool = __has_element_type<_Ptr>::value> 6493e519524SHoward Hinnantstruct __pointer_traits_element_type; 6503e519524SHoward Hinnant 6513e519524SHoward Hinnanttemplate <class _Ptr> 6523e519524SHoward Hinnantstruct __pointer_traits_element_type<_Ptr, true> 6533e519524SHoward Hinnant{ 6543e519524SHoward Hinnant typedef typename _Ptr::element_type type; 6553e519524SHoward Hinnant}; 6563e519524SHoward Hinnant 6573e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 6583e519524SHoward Hinnant 6593e519524SHoward Hinnanttemplate <template <class, class...> class _Sp, class _Tp, class ..._Args> 6603e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _Args...>, true> 6613e519524SHoward Hinnant{ 6623e519524SHoward Hinnant typedef typename _Sp<_Tp, _Args...>::element_type type; 6633e519524SHoward Hinnant}; 6643e519524SHoward Hinnant 6653e519524SHoward Hinnanttemplate <template <class, class...> class _Sp, class _Tp, class ..._Args> 6663e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _Args...>, false> 6673e519524SHoward Hinnant{ 6683e519524SHoward Hinnant typedef _Tp type; 6693e519524SHoward Hinnant}; 6703e519524SHoward Hinnant 671b3371f6fSHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 6723e519524SHoward Hinnant 6733e519524SHoward Hinnanttemplate <template <class> class _Sp, class _Tp> 6743e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp>, true> 6753e519524SHoward Hinnant{ 6763e519524SHoward Hinnant typedef typename _Sp<_Tp>::element_type type; 6773e519524SHoward Hinnant}; 6783e519524SHoward Hinnant 6793e519524SHoward Hinnanttemplate <template <class> class _Sp, class _Tp> 6803e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp>, false> 6813e519524SHoward Hinnant{ 6823e519524SHoward Hinnant typedef _Tp type; 6833e519524SHoward Hinnant}; 6843e519524SHoward Hinnant 6853e519524SHoward Hinnanttemplate <template <class, class> class _Sp, class _Tp, class _A0> 6863e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0>, true> 6873e519524SHoward Hinnant{ 6883e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0>::element_type type; 6893e519524SHoward Hinnant}; 6903e519524SHoward Hinnant 6913e519524SHoward Hinnanttemplate <template <class, class> class _Sp, class _Tp, class _A0> 6923e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0>, false> 6933e519524SHoward Hinnant{ 6943e519524SHoward Hinnant typedef _Tp type; 6953e519524SHoward Hinnant}; 6963e519524SHoward Hinnant 6973e519524SHoward Hinnanttemplate <template <class, class, class> class _Sp, class _Tp, class _A0, class _A1> 6983e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1>, true> 6993e519524SHoward Hinnant{ 7003e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1>::element_type type; 7013e519524SHoward Hinnant}; 7023e519524SHoward Hinnant 7033e519524SHoward Hinnanttemplate <template <class, class, class> class _Sp, class _Tp, class _A0, class _A1> 7043e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1>, false> 7053e519524SHoward Hinnant{ 7063e519524SHoward Hinnant typedef _Tp type; 7073e519524SHoward Hinnant}; 7083e519524SHoward Hinnant 7093e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Sp, class _Tp, class _A0, 7103e519524SHoward Hinnant class _A1, class _A2> 7113e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1, _A2>, true> 7123e519524SHoward Hinnant{ 7133e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1, _A2>::element_type type; 7143e519524SHoward Hinnant}; 7153e519524SHoward Hinnant 7163e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Sp, class _Tp, class _A0, 7173e519524SHoward Hinnant class _A1, class _A2> 7183e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1, _A2>, false> 7193e519524SHoward Hinnant{ 7203e519524SHoward Hinnant typedef _Tp type; 7213e519524SHoward Hinnant}; 7223e519524SHoward Hinnant 723b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 7243e519524SHoward Hinnant 7253e519524SHoward Hinnanttemplate <class _Tp> 7263e519524SHoward Hinnantstruct __has_difference_type 7273e519524SHoward Hinnant{ 7283e519524SHoward Hinnantprivate: 7293e519524SHoward Hinnant struct __two {char _; char __;}; 7303e519524SHoward Hinnant template <class _Up> static __two __test(...); 7313e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::difference_type* = 0); 7323e519524SHoward Hinnantpublic: 7333e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 7343e519524SHoward Hinnant}; 7353e519524SHoward Hinnant 7363e519524SHoward Hinnanttemplate <class _Ptr, bool = __has_difference_type<_Ptr>::value> 7373e519524SHoward Hinnantstruct __pointer_traits_difference_type 7383e519524SHoward Hinnant{ 7393e519524SHoward Hinnant typedef ptrdiff_t type; 7403e519524SHoward Hinnant}; 7413e519524SHoward Hinnant 7423e519524SHoward Hinnanttemplate <class _Ptr> 7433e519524SHoward Hinnantstruct __pointer_traits_difference_type<_Ptr, true> 7443e519524SHoward Hinnant{ 7453e519524SHoward Hinnant typedef typename _Ptr::difference_type type; 7463e519524SHoward Hinnant}; 7473e519524SHoward Hinnant 7483e519524SHoward Hinnanttemplate <class _Tp, class _Up> 7493e519524SHoward Hinnantstruct __has_rebind 7503e519524SHoward Hinnant{ 7513e519524SHoward Hinnantprivate: 7523e519524SHoward Hinnant struct __two {char _; char __;}; 7533e519524SHoward Hinnant template <class _Xp> static __two __test(...); 7543e519524SHoward Hinnant template <class _Xp> static char __test(typename _Xp::template rebind<_Up>* = 0); 7553e519524SHoward Hinnantpublic: 7563e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 7573e519524SHoward Hinnant}; 7583e519524SHoward Hinnant 7593e519524SHoward Hinnanttemplate <class _Tp, class _Up, bool = __has_rebind<_Tp, _Up>::value> 7603e519524SHoward Hinnantstruct __pointer_traits_rebind 7613e519524SHoward Hinnant{ 7623e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 7633e519524SHoward Hinnant typedef typename _Tp::template rebind<_Up> type; 7643e519524SHoward Hinnant#else 7653e519524SHoward Hinnant typedef typename _Tp::template rebind<_Up>::other type; 7663e519524SHoward Hinnant#endif 7673e519524SHoward Hinnant}; 7683e519524SHoward Hinnant 7693e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 7703e519524SHoward Hinnant 7713e519524SHoward Hinnanttemplate <template <class, class...> class _Sp, class _Tp, class ..._Args, class _Up> 7723e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _Args...>, _Up, true> 7733e519524SHoward Hinnant{ 7743e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 7753e519524SHoward Hinnant typedef typename _Sp<_Tp, _Args...>::template rebind<_Up> type; 7763e519524SHoward Hinnant#else 7773e519524SHoward Hinnant typedef typename _Sp<_Tp, _Args...>::template rebind<_Up>::other type; 7783e519524SHoward Hinnant#endif 7793e519524SHoward Hinnant}; 7803e519524SHoward Hinnant 7813e519524SHoward Hinnanttemplate <template <class, class...> class _Sp, class _Tp, class ..._Args, class _Up> 7823e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _Args...>, _Up, false> 7833e519524SHoward Hinnant{ 7843e519524SHoward Hinnant typedef _Sp<_Up, _Args...> type; 7853e519524SHoward Hinnant}; 7863e519524SHoward Hinnant 787b3371f6fSHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 7883e519524SHoward Hinnant 7893e519524SHoward Hinnanttemplate <template <class> class _Sp, class _Tp, class _Up> 7903e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp>, _Up, true> 7913e519524SHoward Hinnant{ 7923e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 7933e519524SHoward Hinnant typedef typename _Sp<_Tp>::template rebind<_Up> type; 7943e519524SHoward Hinnant#else 7953e519524SHoward Hinnant typedef typename _Sp<_Tp>::template rebind<_Up>::other type; 7963e519524SHoward Hinnant#endif 7973e519524SHoward Hinnant}; 7983e519524SHoward Hinnant 7993e519524SHoward Hinnanttemplate <template <class> class _Sp, class _Tp, class _Up> 8003e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp>, _Up, false> 8013e519524SHoward Hinnant{ 8023e519524SHoward Hinnant typedef _Sp<_Up> type; 8033e519524SHoward Hinnant}; 8043e519524SHoward Hinnant 8053e519524SHoward Hinnanttemplate <template <class, class> class _Sp, class _Tp, class _A0, class _Up> 8063e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0>, _Up, true> 8073e519524SHoward Hinnant{ 8083e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 8093e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0>::template rebind<_Up> type; 8103e519524SHoward Hinnant#else 8113e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0>::template rebind<_Up>::other type; 8123e519524SHoward Hinnant#endif 8133e519524SHoward Hinnant}; 8143e519524SHoward Hinnant 8153e519524SHoward Hinnanttemplate <template <class, class> class _Sp, class _Tp, class _A0, class _Up> 8163e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0>, _Up, false> 8173e519524SHoward Hinnant{ 8183e519524SHoward Hinnant typedef _Sp<_Up, _A0> type; 8193e519524SHoward Hinnant}; 8203e519524SHoward Hinnant 8213e519524SHoward Hinnanttemplate <template <class, class, class> class _Sp, class _Tp, class _A0, 8223e519524SHoward Hinnant class _A1, class _Up> 8233e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1>, _Up, true> 8243e519524SHoward Hinnant{ 8253e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 8263e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1>::template rebind<_Up> type; 8273e519524SHoward Hinnant#else 8283e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1>::template rebind<_Up>::other type; 8293e519524SHoward Hinnant#endif 8303e519524SHoward Hinnant}; 8313e519524SHoward Hinnant 8323e519524SHoward Hinnanttemplate <template <class, class, class> class _Sp, class _Tp, class _A0, 8333e519524SHoward Hinnant class _A1, class _Up> 8343e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1>, _Up, false> 8353e519524SHoward Hinnant{ 8363e519524SHoward Hinnant typedef _Sp<_Up, _A0, _A1> type; 8373e519524SHoward Hinnant}; 8383e519524SHoward Hinnant 8393e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Sp, class _Tp, class _A0, 8403e519524SHoward Hinnant class _A1, class _A2, class _Up> 8413e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1, _A2>, _Up, true> 8423e519524SHoward Hinnant{ 8433e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 8443e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1, _A2>::template rebind<_Up> type; 8453e519524SHoward Hinnant#else 8463e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1, _A2>::template rebind<_Up>::other type; 8473e519524SHoward Hinnant#endif 8483e519524SHoward Hinnant}; 8493e519524SHoward Hinnant 8503e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Sp, class _Tp, class _A0, 8513e519524SHoward Hinnant class _A1, class _A2, class _Up> 8523e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1, _A2>, _Up, false> 8533e519524SHoward Hinnant{ 8543e519524SHoward Hinnant typedef _Sp<_Up, _A0, _A1, _A2> type; 8553e519524SHoward Hinnant}; 8563e519524SHoward Hinnant 857b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 8583e519524SHoward Hinnant 8593e519524SHoward Hinnanttemplate <class _Ptr> 860848a5374SHoward Hinnantstruct _LIBCPP_VISIBLE pointer_traits 8613e519524SHoward Hinnant{ 8623e519524SHoward Hinnant typedef _Ptr pointer; 8633e519524SHoward Hinnant typedef typename __pointer_traits_element_type<pointer>::type element_type; 8643e519524SHoward Hinnant typedef typename __pointer_traits_difference_type<pointer>::type difference_type; 8653e519524SHoward Hinnant 8663e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 867f7384975SHoward Hinnant template <class _Up> using rebind = typename __pointer_traits_rebind<pointer, _Up>::type; 8683e519524SHoward Hinnant#else 8693e519524SHoward Hinnant template <class _Up> struct rebind 8703e519524SHoward Hinnant {typedef typename __pointer_traits_rebind<pointer, _Up>::type other;}; 871b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_TEMPLATE_ALIASES 8723e519524SHoward Hinnant 8733e519524SHoward Hinnantprivate: 8743e519524SHoward Hinnant struct __nat {}; 8753e519524SHoward Hinnantpublic: 876848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8773e519524SHoward Hinnant static pointer pointer_to(typename conditional<is_void<element_type>::value, 8783e519524SHoward Hinnant __nat, element_type>::type& __r) 8793e519524SHoward Hinnant {return pointer::pointer_to(__r);} 8803e519524SHoward Hinnant}; 8813e519524SHoward Hinnant 8823e519524SHoward Hinnanttemplate <class _Tp> 883848a5374SHoward Hinnantstruct _LIBCPP_VISIBLE pointer_traits<_Tp*> 8843e519524SHoward Hinnant{ 8853e519524SHoward Hinnant typedef _Tp* pointer; 8863e519524SHoward Hinnant typedef _Tp element_type; 8873e519524SHoward Hinnant typedef ptrdiff_t difference_type; 8883e519524SHoward Hinnant 8893e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 8903e519524SHoward Hinnant template <class _Up> using rebind = _Up*; 8913e519524SHoward Hinnant#else 8923e519524SHoward Hinnant template <class _Up> struct rebind {typedef _Up* other;}; 8933e519524SHoward Hinnant#endif 8943e519524SHoward Hinnant 8953e519524SHoward Hinnantprivate: 8963e519524SHoward Hinnant struct __nat {}; 8973e519524SHoward Hinnantpublic: 898848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8993e519524SHoward Hinnant static pointer pointer_to(typename conditional<is_void<element_type>::value, 9003739fe79SHoward Hinnant __nat, element_type>::type& __r) _NOEXCEPT 9013e519524SHoward Hinnant {return _STD::addressof(__r);} 9023e519524SHoward Hinnant}; 9033e519524SHoward Hinnant 9043e519524SHoward Hinnant// allocator_traits 9053e519524SHoward Hinnant 9063e519524SHoward Hinnantnamespace __has_pointer_type_imp 9073e519524SHoward Hinnant{ 9083e519524SHoward Hinnant template <class _Up> static __two test(...); 9093e519524SHoward Hinnant template <class _Up> static char test(typename _Up::pointer* = 0); 9103e519524SHoward Hinnant} 9113e519524SHoward Hinnant 9123e519524SHoward Hinnanttemplate <class _Tp> 9133e519524SHoward Hinnantstruct __has_pointer_type 9143e519524SHoward Hinnant : public integral_constant<bool, sizeof(__has_pointer_type_imp::test<_Tp>(0)) == 1> 9153e519524SHoward Hinnant{ 9163e519524SHoward Hinnant}; 9173e519524SHoward Hinnant 9183e519524SHoward Hinnantnamespace __pointer_type_imp 9193e519524SHoward Hinnant{ 9203e519524SHoward Hinnant 9213e519524SHoward Hinnanttemplate <class _Tp, class _Dp, bool = __has_pointer_type<_Dp>::value> 9223e519524SHoward Hinnantstruct __pointer_type 9233e519524SHoward Hinnant{ 9243e519524SHoward Hinnant typedef typename _Dp::pointer type; 9253e519524SHoward Hinnant}; 9263e519524SHoward Hinnant 9273e519524SHoward Hinnanttemplate <class _Tp, class _Dp> 9283e519524SHoward Hinnantstruct __pointer_type<_Tp, _Dp, false> 9293e519524SHoward Hinnant{ 9303e519524SHoward Hinnant typedef _Tp* type; 9313e519524SHoward Hinnant}; 9323e519524SHoward Hinnant 933a4a1ef1fSHoward Hinnant} // __pointer_type_imp 9343e519524SHoward Hinnant 9353e519524SHoward Hinnanttemplate <class _Tp, class _Dp> 9363e519524SHoward Hinnantstruct __pointer_type 9373e519524SHoward Hinnant{ 9383e519524SHoward Hinnant typedef typename __pointer_type_imp::__pointer_type<_Tp, typename remove_reference<_Dp>::type>::type type; 9393e519524SHoward Hinnant}; 9403e519524SHoward Hinnant 9413e519524SHoward Hinnanttemplate <class _Tp> 9423e519524SHoward Hinnantstruct __has_const_pointer 9433e519524SHoward Hinnant{ 9443e519524SHoward Hinnantprivate: 9453e519524SHoward Hinnant struct __two {char _; char __;}; 9463e519524SHoward Hinnant template <class _Up> static __two __test(...); 9473e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::const_pointer* = 0); 9483e519524SHoward Hinnantpublic: 9493e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 9503e519524SHoward Hinnant}; 9513e519524SHoward Hinnant 9523e519524SHoward Hinnanttemplate <class _Tp, class _Ptr, class _Alloc, bool = __has_const_pointer<_Alloc>::value> 9533e519524SHoward Hinnantstruct __const_pointer 9543e519524SHoward Hinnant{ 9553e519524SHoward Hinnant typedef typename _Alloc::const_pointer type; 9563e519524SHoward Hinnant}; 9573e519524SHoward Hinnant 9583e519524SHoward Hinnanttemplate <class _Tp, class _Ptr, class _Alloc> 9593e519524SHoward Hinnantstruct __const_pointer<_Tp, _Ptr, _Alloc, false> 9603e519524SHoward Hinnant{ 9613e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 9623e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<const _Tp> type; 9633e519524SHoward Hinnant#else 9643e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<const _Tp>::other type; 9653e519524SHoward Hinnant#endif 9663e519524SHoward Hinnant}; 9673e519524SHoward Hinnant 9683e519524SHoward Hinnanttemplate <class _Tp> 9693e519524SHoward Hinnantstruct __has_void_pointer 9703e519524SHoward Hinnant{ 9713e519524SHoward Hinnantprivate: 9723e519524SHoward Hinnant struct __two {char _; char __;}; 9733e519524SHoward Hinnant template <class _Up> static __two __test(...); 9743e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::void_pointer* = 0); 9753e519524SHoward Hinnantpublic: 9763e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 9773e519524SHoward Hinnant}; 9783e519524SHoward Hinnant 9793e519524SHoward Hinnanttemplate <class _Ptr, class _Alloc, bool = __has_void_pointer<_Alloc>::value> 9803e519524SHoward Hinnantstruct __void_pointer 9813e519524SHoward Hinnant{ 9823e519524SHoward Hinnant typedef typename _Alloc::void_pointer type; 9833e519524SHoward Hinnant}; 9843e519524SHoward Hinnant 9853e519524SHoward Hinnanttemplate <class _Ptr, class _Alloc> 9863e519524SHoward Hinnantstruct __void_pointer<_Ptr, _Alloc, false> 9873e519524SHoward Hinnant{ 9883e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 9893e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<void> type; 9903e519524SHoward Hinnant#else 9913e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<void>::other type; 9923e519524SHoward Hinnant#endif 9933e519524SHoward Hinnant}; 9943e519524SHoward Hinnant 9953e519524SHoward Hinnanttemplate <class _Tp> 9963e519524SHoward Hinnantstruct __has_const_void_pointer 9973e519524SHoward Hinnant{ 9983e519524SHoward Hinnantprivate: 9993e519524SHoward Hinnant struct __two {char _; char __;}; 10003e519524SHoward Hinnant template <class _Up> static __two __test(...); 10013e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::const_void_pointer* = 0); 10023e519524SHoward Hinnantpublic: 10033e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 10043e519524SHoward Hinnant}; 10053e519524SHoward Hinnant 10063e519524SHoward Hinnanttemplate <class _Ptr, class _Alloc, bool = __has_const_void_pointer<_Alloc>::value> 10073e519524SHoward Hinnantstruct __const_void_pointer 10083e519524SHoward Hinnant{ 10093e519524SHoward Hinnant typedef typename _Alloc::const_void_pointer type; 10103e519524SHoward Hinnant}; 10113e519524SHoward Hinnant 10123e519524SHoward Hinnanttemplate <class _Ptr, class _Alloc> 10133e519524SHoward Hinnantstruct __const_void_pointer<_Ptr, _Alloc, false> 10143e519524SHoward Hinnant{ 10153e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 10163e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<const void> type; 10173e519524SHoward Hinnant#else 10183e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<const void>::other type; 10193e519524SHoward Hinnant#endif 10203e519524SHoward Hinnant}; 10213e519524SHoward Hinnant 10223e519524SHoward Hinnanttemplate <class _T> 10233e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 10243e519524SHoward Hinnant_T* 10253739fe79SHoward Hinnant__to_raw_pointer(_T* __p) _NOEXCEPT 10263e519524SHoward Hinnant{ 10273e519524SHoward Hinnant return __p; 10283e519524SHoward Hinnant} 10293e519524SHoward Hinnant 10303e519524SHoward Hinnanttemplate <class _Pointer> 10313e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 10323e519524SHoward Hinnanttypename pointer_traits<_Pointer>::element_type* 10333739fe79SHoward Hinnant__to_raw_pointer(_Pointer __p) _NOEXCEPT 10343e519524SHoward Hinnant{ 10353e519524SHoward Hinnant return _STD::__to_raw_pointer(__p.operator->()); 10363e519524SHoward Hinnant} 10373e519524SHoward Hinnant 10383e519524SHoward Hinnanttemplate <class _Tp> 10393e519524SHoward Hinnantstruct __has_size_type 10403e519524SHoward Hinnant{ 10413e519524SHoward Hinnantprivate: 10423e519524SHoward Hinnant struct __two {char _; char __;}; 10433e519524SHoward Hinnant template <class _Up> static __two __test(...); 10443e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::size_type* = 0); 10453e519524SHoward Hinnantpublic: 10463e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 10473e519524SHoward Hinnant}; 10483e519524SHoward Hinnant 1049a4a1ef1fSHoward Hinnanttemplate <class _Alloc, class _DiffType, bool = __has_size_type<_Alloc>::value> 10503e519524SHoward Hinnantstruct __size_type 10513e519524SHoward Hinnant{ 1052a4a1ef1fSHoward Hinnant typedef typename make_unsigned<_DiffType>::type type; 10533e519524SHoward Hinnant}; 10543e519524SHoward Hinnant 1055a4a1ef1fSHoward Hinnanttemplate <class _Alloc, class _DiffType> 1056a4a1ef1fSHoward Hinnantstruct __size_type<_Alloc, _DiffType, true> 10573e519524SHoward Hinnant{ 10583e519524SHoward Hinnant typedef typename _Alloc::size_type type; 10593e519524SHoward Hinnant}; 10603e519524SHoward Hinnant 10613e519524SHoward Hinnanttemplate <class _Tp> 10623e519524SHoward Hinnantstruct __has_propagate_on_container_copy_assignment 10633e519524SHoward Hinnant{ 10643e519524SHoward Hinnantprivate: 10653e519524SHoward Hinnant struct __two {char _; char __;}; 10663e519524SHoward Hinnant template <class _Up> static __two __test(...); 10673e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::propagate_on_container_copy_assignment* = 0); 10683e519524SHoward Hinnantpublic: 10693e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 10703e519524SHoward Hinnant}; 10713e519524SHoward Hinnant 10723e519524SHoward Hinnanttemplate <class _Alloc, bool = __has_propagate_on_container_copy_assignment<_Alloc>::value> 10733e519524SHoward Hinnantstruct __propagate_on_container_copy_assignment 10743e519524SHoward Hinnant{ 10753e519524SHoward Hinnant typedef false_type type; 10763e519524SHoward Hinnant}; 10773e519524SHoward Hinnant 10783e519524SHoward Hinnanttemplate <class _Alloc> 10793e519524SHoward Hinnantstruct __propagate_on_container_copy_assignment<_Alloc, true> 10803e519524SHoward Hinnant{ 10813e519524SHoward Hinnant typedef typename _Alloc::propagate_on_container_copy_assignment type; 10823e519524SHoward Hinnant}; 10833e519524SHoward Hinnant 10843e519524SHoward Hinnanttemplate <class _Tp> 10853e519524SHoward Hinnantstruct __has_propagate_on_container_move_assignment 10863e519524SHoward Hinnant{ 10873e519524SHoward Hinnantprivate: 10883e519524SHoward Hinnant struct __two {char _; char __;}; 10893e519524SHoward Hinnant template <class _Up> static __two __test(...); 10903e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::propagate_on_container_move_assignment* = 0); 10913e519524SHoward Hinnantpublic: 10923e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 10933e519524SHoward Hinnant}; 10943e519524SHoward Hinnant 10953e519524SHoward Hinnanttemplate <class _Alloc, bool = __has_propagate_on_container_move_assignment<_Alloc>::value> 10963e519524SHoward Hinnantstruct __propagate_on_container_move_assignment 10973e519524SHoward Hinnant{ 10983e519524SHoward Hinnant typedef false_type type; 10993e519524SHoward Hinnant}; 11003e519524SHoward Hinnant 11013e519524SHoward Hinnanttemplate <class _Alloc> 11023e519524SHoward Hinnantstruct __propagate_on_container_move_assignment<_Alloc, true> 11033e519524SHoward Hinnant{ 11043e519524SHoward Hinnant typedef typename _Alloc::propagate_on_container_move_assignment type; 11053e519524SHoward Hinnant}; 11063e519524SHoward Hinnant 11073e519524SHoward Hinnanttemplate <class _Tp> 11083e519524SHoward Hinnantstruct __has_propagate_on_container_swap 11093e519524SHoward Hinnant{ 11103e519524SHoward Hinnantprivate: 11113e519524SHoward Hinnant struct __two {char _; char __;}; 11123e519524SHoward Hinnant template <class _Up> static __two __test(...); 11133e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::propagate_on_container_swap* = 0); 11143e519524SHoward Hinnantpublic: 11153e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 11163e519524SHoward Hinnant}; 11173e519524SHoward Hinnant 11183e519524SHoward Hinnanttemplate <class _Alloc, bool = __has_propagate_on_container_swap<_Alloc>::value> 11193e519524SHoward Hinnantstruct __propagate_on_container_swap 11203e519524SHoward Hinnant{ 11213e519524SHoward Hinnant typedef false_type type; 11223e519524SHoward Hinnant}; 11233e519524SHoward Hinnant 11243e519524SHoward Hinnanttemplate <class _Alloc> 11253e519524SHoward Hinnantstruct __propagate_on_container_swap<_Alloc, true> 11263e519524SHoward Hinnant{ 11273e519524SHoward Hinnant typedef typename _Alloc::propagate_on_container_swap type; 11283e519524SHoward Hinnant}; 11293e519524SHoward Hinnant 11303e519524SHoward Hinnanttemplate <class _Tp, class _Up, bool = __has_rebind<_Tp, _Up>::value> 11313e519524SHoward Hinnantstruct __has_rebind_other 11323e519524SHoward Hinnant{ 11333e519524SHoward Hinnantprivate: 11343e519524SHoward Hinnant struct __two {char _; char __;}; 11353e519524SHoward Hinnant template <class _Xp> static __two __test(...); 11363e519524SHoward Hinnant template <class _Xp> static char __test(typename _Xp::template rebind<_Up>::other* = 0); 11373e519524SHoward Hinnantpublic: 11383e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 11393e519524SHoward Hinnant}; 11403e519524SHoward Hinnant 11413e519524SHoward Hinnanttemplate <class _Tp, class _Up> 11423e519524SHoward Hinnantstruct __has_rebind_other<_Tp, _Up, false> 11433e519524SHoward Hinnant{ 11443e519524SHoward Hinnant static const bool value = false; 11453e519524SHoward Hinnant}; 11463e519524SHoward Hinnant 11473e519524SHoward Hinnanttemplate <class _Tp, class _Up, bool = __has_rebind_other<_Tp, _Up>::value> 11483e519524SHoward Hinnantstruct __allocator_traits_rebind 11493e519524SHoward Hinnant{ 11503e519524SHoward Hinnant typedef typename _Tp::template rebind<_Up>::other type; 11513e519524SHoward Hinnant}; 11523e519524SHoward Hinnant 11533e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 11543e519524SHoward Hinnant 11553e519524SHoward Hinnanttemplate <template <class, class...> class _Alloc, class _Tp, class ..._Args, class _Up> 11563e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _Args...>, _Up, true> 11573e519524SHoward Hinnant{ 11583e519524SHoward Hinnant typedef typename _Alloc<_Tp, _Args...>::template rebind<_Up>::other type; 11593e519524SHoward Hinnant}; 11603e519524SHoward Hinnant 11613e519524SHoward Hinnanttemplate <template <class, class...> class _Alloc, class _Tp, class ..._Args, class _Up> 11623e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _Args...>, _Up, false> 11633e519524SHoward Hinnant{ 11643e519524SHoward Hinnant typedef _Alloc<_Up, _Args...> type; 11653e519524SHoward Hinnant}; 11663e519524SHoward Hinnant 1167b3371f6fSHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 11683e519524SHoward Hinnant 11693e519524SHoward Hinnanttemplate <template <class> class _Alloc, class _Tp, class _Up> 11703e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp>, _Up, true> 11713e519524SHoward Hinnant{ 11723e519524SHoward Hinnant typedef typename _Alloc<_Tp>::template rebind<_Up>::other type; 11733e519524SHoward Hinnant}; 11743e519524SHoward Hinnant 11753e519524SHoward Hinnanttemplate <template <class> class _Alloc, class _Tp, class _Up> 11763e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp>, _Up, false> 11773e519524SHoward Hinnant{ 11783e519524SHoward Hinnant typedef _Alloc<_Up> type; 11793e519524SHoward Hinnant}; 11803e519524SHoward Hinnant 11813e519524SHoward Hinnanttemplate <template <class, class> class _Alloc, class _Tp, class _A0, class _Up> 11823e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0>, _Up, true> 11833e519524SHoward Hinnant{ 11843e519524SHoward Hinnant typedef typename _Alloc<_Tp, _A0>::template rebind<_Up>::other type; 11853e519524SHoward Hinnant}; 11863e519524SHoward Hinnant 11873e519524SHoward Hinnanttemplate <template <class, class> class _Alloc, class _Tp, class _A0, class _Up> 11883e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0>, _Up, false> 11893e519524SHoward Hinnant{ 11903e519524SHoward Hinnant typedef _Alloc<_Up, _A0> type; 11913e519524SHoward Hinnant}; 11923e519524SHoward Hinnant 11933e519524SHoward Hinnanttemplate <template <class, class, class> class _Alloc, class _Tp, class _A0, 11943e519524SHoward Hinnant class _A1, class _Up> 11953e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1>, _Up, true> 11963e519524SHoward Hinnant{ 11973e519524SHoward Hinnant typedef typename _Alloc<_Tp, _A0, _A1>::template rebind<_Up>::other type; 11983e519524SHoward Hinnant}; 11993e519524SHoward Hinnant 12003e519524SHoward Hinnanttemplate <template <class, class, class> class _Alloc, class _Tp, class _A0, 12013e519524SHoward Hinnant class _A1, class _Up> 12023e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1>, _Up, false> 12033e519524SHoward Hinnant{ 12043e519524SHoward Hinnant typedef _Alloc<_Up, _A0, _A1> type; 12053e519524SHoward Hinnant}; 12063e519524SHoward Hinnant 12073e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Alloc, class _Tp, class _A0, 12083e519524SHoward Hinnant class _A1, class _A2, class _Up> 12093e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1, _A2>, _Up, true> 12103e519524SHoward Hinnant{ 12113e519524SHoward Hinnant typedef typename _Alloc<_Tp, _A0, _A1, _A2>::template rebind<_Up>::other type; 12123e519524SHoward Hinnant}; 12133e519524SHoward Hinnant 12143e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Alloc, class _Tp, class _A0, 12153e519524SHoward Hinnant class _A1, class _A2, class _Up> 12163e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1, _A2>, _Up, false> 12173e519524SHoward Hinnant{ 12183e519524SHoward Hinnant typedef _Alloc<_Up, _A0, _A1, _A2> type; 12193e519524SHoward Hinnant}; 12203e519524SHoward Hinnant 1221b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 12223e519524SHoward Hinnant 12233e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_ADVANCED_SFINAE 12243e519524SHoward Hinnant 12253e519524SHoward Hinnanttemplate <class _Alloc, class _SizeType, class _ConstVoidPtr> 12263e519524SHoward Hinnantauto 12273e519524SHoward Hinnant__has_allocate_hint_test(_Alloc&& __a, _SizeType&& __sz, _ConstVoidPtr&& __p) 12283e519524SHoward Hinnant -> decltype(__a.allocate(__sz, __p), true_type()); 12293e519524SHoward Hinnant 12303e519524SHoward Hinnanttemplate <class _Alloc, class _SizeType, class _ConstVoidPtr> 12313e519524SHoward Hinnantauto 12323e519524SHoward Hinnant__has_allocate_hint_test(const _Alloc& __a, _SizeType&& __sz, _ConstVoidPtr&& __p) 12333e519524SHoward Hinnant -> false_type; 12343e519524SHoward Hinnant 12353e519524SHoward Hinnanttemplate <class _Alloc, class _SizeType, class _ConstVoidPtr> 12363e519524SHoward Hinnantstruct __has_allocate_hint 12373e519524SHoward Hinnant : integral_constant<bool, 12383e519524SHoward Hinnant is_same< 12393e519524SHoward Hinnant decltype(__has_allocate_hint_test(declval<_Alloc>(), 12403e519524SHoward Hinnant declval<_SizeType>(), 12413e519524SHoward Hinnant declval<_ConstVoidPtr>())), 12423e519524SHoward Hinnant true_type>::value> 12433e519524SHoward Hinnant{ 12443e519524SHoward Hinnant}; 12453e519524SHoward Hinnant 1246b3371f6fSHoward Hinnant#else // _LIBCPP_HAS_NO_ADVANCED_SFINAE 12473e519524SHoward Hinnant 12483e519524SHoward Hinnanttemplate <class _Alloc, class _SizeType, class _ConstVoidPtr> 12493e519524SHoward Hinnantstruct __has_allocate_hint 12503e519524SHoward Hinnant : true_type 12513e519524SHoward Hinnant{ 12523e519524SHoward Hinnant}; 12533e519524SHoward Hinnant 1254b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_ADVANCED_SFINAE 12553e519524SHoward Hinnant 12563e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_ADVANCED_SFINAE 12573e519524SHoward Hinnant 12583e519524SHoward Hinnanttemplate <class _Alloc, class _Tp, class ..._Args> 12593e519524SHoward Hinnantdecltype(_STD::declval<_Alloc>().construct(_STD::declval<_Tp*>(), 12603e519524SHoward Hinnant _STD::declval<_Args>()...), 12613e519524SHoward Hinnant true_type()) 12623e519524SHoward Hinnant__has_construct_test(_Alloc&& __a, _Tp* __p, _Args&& ...__args); 12633e519524SHoward Hinnant 12643e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer, class ..._Args> 12653e519524SHoward Hinnantfalse_type 12663e519524SHoward Hinnant__has_construct_test(const _Alloc& __a, _Pointer&& __p, _Args&& ...__args); 12673e519524SHoward Hinnant 12683e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer, class ..._Args> 12693e519524SHoward Hinnantstruct __has_construct 12703e519524SHoward Hinnant : integral_constant<bool, 12713e519524SHoward Hinnant is_same< 12723e519524SHoward Hinnant decltype(__has_construct_test(declval<_Alloc>(), 12733e519524SHoward Hinnant declval<_Pointer>(), 12743e519524SHoward Hinnant declval<_Args>()...)), 12753e519524SHoward Hinnant true_type>::value> 12763e519524SHoward Hinnant{ 12773e519524SHoward Hinnant}; 12783e519524SHoward Hinnant 12793e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer> 12803e519524SHoward Hinnantauto 12813e519524SHoward Hinnant__has_destroy_test(_Alloc&& __a, _Pointer&& __p) 12823e519524SHoward Hinnant -> decltype(__a.destroy(__p), true_type()); 12833e519524SHoward Hinnant 12843e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer> 12853e519524SHoward Hinnantauto 12863e519524SHoward Hinnant__has_destroy_test(const _Alloc& __a, _Pointer&& __p) 12873e519524SHoward Hinnant -> false_type; 12883e519524SHoward Hinnant 12893e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer> 12903e519524SHoward Hinnantstruct __has_destroy 12913e519524SHoward Hinnant : integral_constant<bool, 12923e519524SHoward Hinnant is_same< 12933e519524SHoward Hinnant decltype(__has_destroy_test(declval<_Alloc>(), 12943e519524SHoward Hinnant declval<_Pointer>())), 12953e519524SHoward Hinnant true_type>::value> 12963e519524SHoward Hinnant{ 12973e519524SHoward Hinnant}; 12983e519524SHoward Hinnant 12993e519524SHoward Hinnanttemplate <class _Alloc> 13003e519524SHoward Hinnantauto 13013e519524SHoward Hinnant__has_max_size_test(_Alloc&& __a) 13023e519524SHoward Hinnant -> decltype(__a.max_size(), true_type()); 13033e519524SHoward Hinnant 13043e519524SHoward Hinnanttemplate <class _Alloc> 13053e519524SHoward Hinnantauto 13063e519524SHoward Hinnant__has_max_size_test(const volatile _Alloc& __a) 13073e519524SHoward Hinnant -> false_type; 13083e519524SHoward Hinnant 13093e519524SHoward Hinnanttemplate <class _Alloc> 13103e519524SHoward Hinnantstruct __has_max_size 13113e519524SHoward Hinnant : integral_constant<bool, 13123e519524SHoward Hinnant is_same< 13133e519524SHoward Hinnant decltype(__has_max_size_test(declval<_Alloc&>())), 13143e519524SHoward Hinnant true_type>::value> 13153e519524SHoward Hinnant{ 13163e519524SHoward Hinnant}; 13173e519524SHoward Hinnant 13183e519524SHoward Hinnanttemplate <class _Alloc> 13193e519524SHoward Hinnantauto 13203e519524SHoward Hinnant__has_select_on_container_copy_construction_test(_Alloc&& __a) 13213e519524SHoward Hinnant -> decltype(__a.select_on_container_copy_construction(), true_type()); 13223e519524SHoward Hinnant 13233e519524SHoward Hinnanttemplate <class _Alloc> 13243e519524SHoward Hinnantauto 13253e519524SHoward Hinnant__has_select_on_container_copy_construction_test(const volatile _Alloc& __a) 13263e519524SHoward Hinnant -> false_type; 13273e519524SHoward Hinnant 13283e519524SHoward Hinnanttemplate <class _Alloc> 13293e519524SHoward Hinnantstruct __has_select_on_container_copy_construction 13303e519524SHoward Hinnant : integral_constant<bool, 13313e519524SHoward Hinnant is_same< 13323e519524SHoward Hinnant decltype(__has_select_on_container_copy_construction_test(declval<_Alloc&>())), 13333e519524SHoward Hinnant true_type>::value> 13343e519524SHoward Hinnant{ 13353e519524SHoward Hinnant}; 13363e519524SHoward Hinnant 1337b3371f6fSHoward Hinnant#else // _LIBCPP_HAS_NO_ADVANCED_SFINAE 13383e519524SHoward Hinnant 13393e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 13403e519524SHoward Hinnant 13413e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer, class ..._Args> 13423e519524SHoward Hinnantstruct __has_construct 13433e519524SHoward Hinnant : false_type 13443e519524SHoward Hinnant{ 13453e519524SHoward Hinnant}; 13463e519524SHoward Hinnant 1347b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 13483e519524SHoward Hinnant 13493e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer> 13503e519524SHoward Hinnantstruct __has_destroy 13513e519524SHoward Hinnant : false_type 13523e519524SHoward Hinnant{ 13533e519524SHoward Hinnant}; 13543e519524SHoward Hinnant 13553e519524SHoward Hinnanttemplate <class _Alloc> 13563e519524SHoward Hinnantstruct __has_max_size 13573e519524SHoward Hinnant : true_type 13583e519524SHoward Hinnant{ 13593e519524SHoward Hinnant}; 13603e519524SHoward Hinnant 13613e519524SHoward Hinnanttemplate <class _Alloc> 13623e519524SHoward Hinnantstruct __has_select_on_container_copy_construction 13633e519524SHoward Hinnant : false_type 13643e519524SHoward Hinnant{ 13653e519524SHoward Hinnant}; 13663e519524SHoward Hinnant 1367b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_ADVANCED_SFINAE 13683e519524SHoward Hinnant 1369a4a1ef1fSHoward Hinnanttemplate <class _Alloc, class _Ptr, bool = __has_difference_type<_Alloc>::value> 1370a4a1ef1fSHoward Hinnantstruct __alloc_traits_difference_type 1371a4a1ef1fSHoward Hinnant{ 1372a4a1ef1fSHoward Hinnant typedef typename pointer_traits<_Ptr>::difference_type type; 1373a4a1ef1fSHoward Hinnant}; 1374a4a1ef1fSHoward Hinnant 1375a4a1ef1fSHoward Hinnanttemplate <class _Alloc, class _Ptr> 1376a4a1ef1fSHoward Hinnantstruct __alloc_traits_difference_type<_Alloc, _Ptr, true> 1377a4a1ef1fSHoward Hinnant{ 1378a4a1ef1fSHoward Hinnant typedef typename _Alloc::difference_type type; 1379a4a1ef1fSHoward Hinnant}; 1380a4a1ef1fSHoward Hinnant 13813e519524SHoward Hinnanttemplate <class _Alloc> 1382848a5374SHoward Hinnantstruct _LIBCPP_VISIBLE allocator_traits 13833e519524SHoward Hinnant{ 13843e519524SHoward Hinnant typedef _Alloc allocator_type; 13853e519524SHoward Hinnant typedef typename allocator_type::value_type value_type; 13863e519524SHoward Hinnant 13873e519524SHoward Hinnant typedef typename __pointer_type<value_type, allocator_type>::type pointer; 13883e519524SHoward Hinnant typedef typename __const_pointer<value_type, pointer, allocator_type>::type const_pointer; 13893e519524SHoward Hinnant typedef typename __void_pointer<pointer, allocator_type>::type void_pointer; 13903e519524SHoward Hinnant typedef typename __const_void_pointer<pointer, allocator_type>::type const_void_pointer; 13913e519524SHoward Hinnant 1392a4a1ef1fSHoward Hinnant typedef typename __alloc_traits_difference_type<allocator_type, pointer>::type difference_type; 1393a4a1ef1fSHoward Hinnant typedef typename __size_type<allocator_type, difference_type>::type size_type; 13943e519524SHoward Hinnant 13953e519524SHoward Hinnant typedef typename __propagate_on_container_copy_assignment<allocator_type>::type 13963e519524SHoward Hinnant propagate_on_container_copy_assignment; 13973e519524SHoward Hinnant typedef typename __propagate_on_container_move_assignment<allocator_type>::type 13983e519524SHoward Hinnant propagate_on_container_move_assignment; 13993e519524SHoward Hinnant typedef typename __propagate_on_container_swap<allocator_type>::type 14003e519524SHoward Hinnant propagate_on_container_swap; 14013e519524SHoward Hinnant 14023e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 14033e519524SHoward Hinnant template <class _Tp> using rebind_alloc = 1404f7384975SHoward Hinnant typename __allocator_traits_rebind<allocator_type, _Tp>::type; 14053e519524SHoward Hinnant template <class _Tp> using rebind_traits = allocator_traits<rebind_alloc<_Tp>>; 1406b3371f6fSHoward Hinnant#else // _LIBCPP_HAS_NO_TEMPLATE_ALIASES 14073e519524SHoward Hinnant template <class _Tp> struct rebind_alloc 14083e519524SHoward Hinnant {typedef typename __allocator_traits_rebind<allocator_type, _Tp>::type other;}; 14093e519524SHoward Hinnant template <class _Tp> struct rebind_traits 14103e519524SHoward Hinnant {typedef allocator_traits<typename rebind_alloc<_Tp>::other> other;}; 1411b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_TEMPLATE_ALIASES 14123e519524SHoward Hinnant 1413848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14143e519524SHoward Hinnant static pointer allocate(allocator_type& __a, size_type __n) 14153e519524SHoward Hinnant {return __a.allocate(__n);} 1416848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14173e519524SHoward Hinnant static pointer allocate(allocator_type& __a, size_type __n, const_void_pointer __hint) 14183e519524SHoward Hinnant {return allocate(__a, __n, __hint, 14193e519524SHoward Hinnant __has_allocate_hint<allocator_type, size_type, const_void_pointer>());} 14203e519524SHoward Hinnant 1421848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14223739fe79SHoward Hinnant static void deallocate(allocator_type& __a, pointer __p, size_type __n) _NOEXCEPT 14233e519524SHoward Hinnant {__a.deallocate(__p, __n);} 14243e519524SHoward Hinnant 14253e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 14263e519524SHoward Hinnant template <class _Tp, class... _Args> 1427848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14283e519524SHoward Hinnant static void construct(allocator_type& __a, _Tp* __p, _Args&&... __args) 14293e519524SHoward Hinnant {__construct(__has_construct<allocator_type, pointer, _Args...>(), 14303e519524SHoward Hinnant __a, __p, _STD::forward<_Args>(__args)...);} 1431b3371f6fSHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 14323e519524SHoward Hinnant template <class _Tp> 1433848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14343e519524SHoward Hinnant static void construct(allocator_type& __a, _Tp* __p) 14353e519524SHoward Hinnant { 14363e519524SHoward Hinnant ::new ((void*)__p) _Tp(); 14373e519524SHoward Hinnant } 14383e519524SHoward Hinnant template <class _Tp, class _A0> 1439848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14403e519524SHoward Hinnant static void construct(allocator_type& __a, _Tp* __p, const _A0& __a0) 14413e519524SHoward Hinnant { 14423e519524SHoward Hinnant ::new ((void*)__p) _Tp(__a0); 14433e519524SHoward Hinnant } 14443e519524SHoward Hinnant template <class _Tp, class _A0, class _A1> 1445848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14463e519524SHoward Hinnant static void construct(allocator_type& __a, _Tp* __p, const _A0& __a0, 14473e519524SHoward Hinnant const _A1& __a1) 14483e519524SHoward Hinnant { 14493e519524SHoward Hinnant ::new ((void*)__p) _Tp(__a0, __a1); 14503e519524SHoward Hinnant } 14513e519524SHoward Hinnant template <class _Tp, class _A0, class _A1, class _A2> 1452848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14533e519524SHoward Hinnant static void construct(allocator_type& __a, _Tp* __p, const _A0& __a0, 14543e519524SHoward Hinnant const _A1& __a1, const _A2& __a2) 14553e519524SHoward Hinnant { 14563e519524SHoward Hinnant ::new ((void*)__p) _Tp(__a0, __a1, __a2); 14573e519524SHoward Hinnant } 1458b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 14593e519524SHoward Hinnant 14603e519524SHoward Hinnant template <class _Tp> 1461848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14623e519524SHoward Hinnant static void destroy(allocator_type& __a, _Tp* __p) 14633e519524SHoward Hinnant {__destroy(__has_destroy<allocator_type, _Tp*>(), __a, __p);} 14643e519524SHoward Hinnant 1465848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14663e519524SHoward Hinnant static size_type max_size(const allocator_type& __a) 14673e519524SHoward Hinnant {return __max_size(__has_max_size<const allocator_type>(), __a);} 14683e519524SHoward Hinnant 1469848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14703e519524SHoward Hinnant static allocator_type 14713e519524SHoward Hinnant select_on_container_copy_construction(const allocator_type& __a) 14723e519524SHoward Hinnant {return select_on_container_copy_construction( 14733e519524SHoward Hinnant __has_select_on_container_copy_construction<const allocator_type>(), 14743e519524SHoward Hinnant __a);} 14753e519524SHoward Hinnant 14763e519524SHoward Hinnantprivate: 14773e519524SHoward Hinnant 1478848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14793e519524SHoward Hinnant static pointer allocate(allocator_type& __a, size_type __n, 14803e519524SHoward Hinnant const_void_pointer __hint, true_type) 14813e519524SHoward Hinnant {return __a.allocate(__n, __hint);} 1482848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14833e519524SHoward Hinnant static pointer allocate(allocator_type& __a, size_type __n, 14843e519524SHoward Hinnant const_void_pointer __hint, false_type) 14853e519524SHoward Hinnant {return __a.allocate(__n);} 14863e519524SHoward Hinnant 14873e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 14883e519524SHoward Hinnant template <class _Tp, class... _Args> 1489848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14903e519524SHoward Hinnant static void __construct(true_type, allocator_type& __a, _Tp* __p, _Args&&... __args) 14913e519524SHoward Hinnant {__a.construct(__p, _STD::forward<_Args>(__args)...);} 14923e519524SHoward Hinnant template <class _Tp, class... _Args> 1493848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14943e519524SHoward Hinnant static void __construct(false_type, allocator_type&, _Tp* __p, _Args&&... __args) 14953e519524SHoward Hinnant { 14963e519524SHoward Hinnant ::new ((void*)__p) _Tp(_STD::forward<_Args>(__args)...); 14973e519524SHoward Hinnant } 1498b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 14993e519524SHoward Hinnant 15003e519524SHoward Hinnant template <class _Tp> 1501848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15023e519524SHoward Hinnant static void __destroy(true_type, allocator_type& __a, _Tp* __p) 15033e519524SHoward Hinnant {__a.destroy(__p);} 15043e519524SHoward Hinnant template <class _Tp> 1505848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15063e519524SHoward Hinnant static void __destroy(false_type, allocator_type&, _Tp* __p) 15073e519524SHoward Hinnant { 15083e519524SHoward Hinnant __p->~_Tp(); 15093e519524SHoward Hinnant } 15103e519524SHoward Hinnant 1511848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15123e519524SHoward Hinnant static size_type __max_size(true_type, const allocator_type& __a) 15133e519524SHoward Hinnant {return __a.max_size();} 1514848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15153e519524SHoward Hinnant static size_type __max_size(false_type, const allocator_type&) 15163e519524SHoward Hinnant {return numeric_limits<size_type>::max();} 15173e519524SHoward Hinnant 1518848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15193e519524SHoward Hinnant static allocator_type 15203e519524SHoward Hinnant select_on_container_copy_construction(true_type, const allocator_type& __a) 15213e519524SHoward Hinnant {return __a.select_on_container_copy_construction();} 1522848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15233e519524SHoward Hinnant static allocator_type 15243e519524SHoward Hinnant select_on_container_copy_construction(false_type, const allocator_type& __a) 15253e519524SHoward Hinnant {return __a;} 15263e519524SHoward Hinnant}; 15273e519524SHoward Hinnant 15283e519524SHoward Hinnant// uses_allocator 15293e519524SHoward Hinnant 15303e519524SHoward Hinnanttemplate <class _Tp> 15313e519524SHoward Hinnantstruct __has_allocator_type 15323e519524SHoward Hinnant{ 15333e519524SHoward Hinnantprivate: 15343e519524SHoward Hinnant struct __two {char _; char __;}; 15353e519524SHoward Hinnant template <class _Up> static __two __test(...); 15363e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::allocator_type* = 0); 15373e519524SHoward Hinnantpublic: 15383e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 15393e519524SHoward Hinnant}; 15403e519524SHoward Hinnant 15413e519524SHoward Hinnanttemplate <class _Tp, class _Alloc, bool = __has_allocator_type<_Tp>::value> 15423e519524SHoward Hinnantstruct __uses_allocator 15433e519524SHoward Hinnant : public integral_constant<bool, 15443e519524SHoward Hinnant is_convertible<_Alloc, typename _Tp::allocator_type>::value> 15453e519524SHoward Hinnant{ 15463e519524SHoward Hinnant}; 15473e519524SHoward Hinnant 15483e519524SHoward Hinnanttemplate <class _Tp, class _Alloc> 15493e519524SHoward Hinnantstruct __uses_allocator<_Tp, _Alloc, false> 15503e519524SHoward Hinnant : public false_type 15513e519524SHoward Hinnant{ 15523e519524SHoward Hinnant}; 15533e519524SHoward Hinnant 15543e519524SHoward Hinnanttemplate <class _Tp, class _Alloc> 1555848a5374SHoward Hinnantstruct _LIBCPP_VISIBLE uses_allocator 15563e519524SHoward Hinnant : public __uses_allocator<_Tp, _Alloc> 15573e519524SHoward Hinnant{ 15583e519524SHoward Hinnant}; 15593e519524SHoward Hinnant 1560119cd0baSHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 15613e519524SHoward Hinnant 15623e519524SHoward Hinnant// uses-allocator construction 15633e519524SHoward Hinnant 15643e519524SHoward Hinnanttemplate <class _Tp, class _Alloc, class ..._Args> 15653e519524SHoward Hinnantstruct __uses_alloc_ctor_imp 15663e519524SHoward Hinnant{ 15673e519524SHoward Hinnant static const bool __ua = uses_allocator<_Tp, _Alloc>::value; 15683e519524SHoward Hinnant static const bool __ic = 15693e519524SHoward Hinnant is_constructible<_Tp, allocator_arg_t, _Alloc, _Args...>::value; 15703e519524SHoward Hinnant static const int value = __ua ? 2 - __ic : 0; 15713e519524SHoward Hinnant}; 15723e519524SHoward Hinnant 15733e519524SHoward Hinnanttemplate <class _Tp, class _Alloc, class ..._Args> 15743e519524SHoward Hinnantstruct __uses_alloc_ctor 15753e519524SHoward Hinnant : integral_constant<int, __uses_alloc_ctor_imp<_Tp, _Alloc, _Args...>::value> 15763e519524SHoward Hinnant {}; 15773e519524SHoward Hinnant 1578119cd0baSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 15793e519524SHoward Hinnant 15803e519524SHoward Hinnant// allocator 15813e519524SHoward Hinnant 15823e519524SHoward Hinnanttemplate <class _Tp> 1583f9cca3b7SHoward Hinnantclass _LIBCPP_VISIBLE allocator 15843e519524SHoward Hinnant{ 15853e519524SHoward Hinnantpublic: 15863e519524SHoward Hinnant typedef size_t size_type; 15873e519524SHoward Hinnant typedef ptrdiff_t difference_type; 15883e519524SHoward Hinnant typedef _Tp* pointer; 15893e519524SHoward Hinnant typedef const _Tp* const_pointer; 15903e519524SHoward Hinnant typedef _Tp& reference; 15913e519524SHoward Hinnant typedef const _Tp& const_reference; 15923e519524SHoward Hinnant typedef _Tp value_type; 15933e519524SHoward Hinnant 1594*b58f59cdSHoward Hinnant typedef true_type propagate_on_container_move_assignment; 1595*b58f59cdSHoward Hinnant 15963e519524SHoward Hinnant template <class _Up> struct rebind {typedef allocator<_Up> other;}; 15973e519524SHoward Hinnant 15983739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY allocator() _NOEXCEPT {} 15993739fe79SHoward Hinnant template <class _Up> _LIBCPP_INLINE_VISIBILITY allocator(const allocator<_Up>&) _NOEXCEPT {} 16003739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer address(reference __x) const _NOEXCEPT 16013739fe79SHoward Hinnant {return _STD::addressof(__x);} 16023739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY const_pointer address(const_reference __x) const _NOEXCEPT 16033739fe79SHoward Hinnant {return _STD::addressof(__x);} 16043e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer allocate(size_type __n, allocator<void>::const_pointer = 0) 16053e519524SHoward Hinnant {return static_cast<pointer>(::operator new(__n * sizeof(_Tp)));} 16063739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void deallocate(pointer __p, size_type) _NOEXCEPT 16073739fe79SHoward Hinnant {::operator delete((void*)__p);} 16083739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT 16093739fe79SHoward Hinnant {return size_type(~0) / sizeof(_Tp);} 16107609c9b6SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 16113e519524SHoward Hinnant template <class _Up, class... _Args> 16123e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16133e519524SHoward Hinnant void 16143e519524SHoward Hinnant construct(_Up* __p, _Args&&... __args) 16153e519524SHoward Hinnant { 16163e519524SHoward Hinnant ::new((void*)__p) _Up(_STD::forward<_Args>(__args)...); 16173e519524SHoward Hinnant } 16187609c9b6SHoward Hinnant#else // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 16193e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16203e519524SHoward Hinnant void 16213e519524SHoward Hinnant construct(pointer __p) 16223e519524SHoward Hinnant { 16233e519524SHoward Hinnant ::new((void*)__p) _Tp(); 16243e519524SHoward Hinnant } 1625f5799be4SMichael J. Spencer# if defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) 16263e519524SHoward Hinnant template <class _A0> 16273e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16283e519524SHoward Hinnant typename enable_if 16293e519524SHoward Hinnant < 16303e519524SHoward Hinnant !is_convertible<_A0, __rv<_A0> >::value, 16313e519524SHoward Hinnant void 16323e519524SHoward Hinnant >::type 16333e519524SHoward Hinnant construct(pointer __p, _A0& __a0) 16343e519524SHoward Hinnant { 16353e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0); 16363e519524SHoward Hinnant } 16373e519524SHoward Hinnant template <class _A0> 16383e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16393e519524SHoward Hinnant typename enable_if 16403e519524SHoward Hinnant < 16413e519524SHoward Hinnant !is_convertible<_A0, __rv<_A0> >::value, 16423e519524SHoward Hinnant void 16433e519524SHoward Hinnant >::type 16443e519524SHoward Hinnant construct(pointer __p, const _A0& __a0) 16453e519524SHoward Hinnant { 16463e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0); 16473e519524SHoward Hinnant } 16483e519524SHoward Hinnant template <class _A0> 16493e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16503e519524SHoward Hinnant typename enable_if 16513e519524SHoward Hinnant < 16523e519524SHoward Hinnant is_convertible<_A0, __rv<_A0> >::value, 16533e519524SHoward Hinnant void 16543e519524SHoward Hinnant >::type 16553e519524SHoward Hinnant construct(pointer __p, _A0 __a0) 16563e519524SHoward Hinnant { 16573e519524SHoward Hinnant ::new((void*)__p) _Tp(_STD::move(__a0)); 16583e519524SHoward Hinnant } 1659f5799be4SMichael J. Spencer# endif // defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) 16603e519524SHoward Hinnant template <class _A0, class _A1> 16613e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16623e519524SHoward Hinnant void 16633e519524SHoward Hinnant construct(pointer __p, _A0& __a0, _A1& __a1) 16643e519524SHoward Hinnant { 16653e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 16663e519524SHoward Hinnant } 16673e519524SHoward Hinnant template <class _A0, class _A1> 16683e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16693e519524SHoward Hinnant void 16703e519524SHoward Hinnant construct(pointer __p, const _A0& __a0, _A1& __a1) 16713e519524SHoward Hinnant { 16723e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 16733e519524SHoward Hinnant } 16743e519524SHoward Hinnant template <class _A0, class _A1> 16753e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16763e519524SHoward Hinnant void 16773e519524SHoward Hinnant construct(pointer __p, _A0& __a0, const _A1& __a1) 16783e519524SHoward Hinnant { 16793e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 16803e519524SHoward Hinnant } 16813e519524SHoward Hinnant template <class _A0, class _A1> 16823e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16833e519524SHoward Hinnant void 16843e519524SHoward Hinnant construct(pointer __p, const _A0& __a0, const _A1& __a1) 16853e519524SHoward Hinnant { 16863e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 16873e519524SHoward Hinnant } 16887609c9b6SHoward Hinnant#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 16893e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void destroy(pointer __p) {__p->~_Tp();} 16903e519524SHoward Hinnant}; 16913e519524SHoward Hinnant 16923e519524SHoward Hinnanttemplate <class _Tp, class _Up> 16933e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 16943739fe79SHoward Hinnantbool operator==(const allocator<_Tp>&, const allocator<_Up>&) _NOEXCEPT {return true;} 16953e519524SHoward Hinnant 16963e519524SHoward Hinnanttemplate <class _Tp, class _Up> 16973e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 16983739fe79SHoward Hinnantbool operator!=(const allocator<_Tp>&, const allocator<_Up>&) _NOEXCEPT {return false;} 16993e519524SHoward Hinnant 17003e519524SHoward Hinnanttemplate <class _OutputIterator, class _Tp> 1701848a5374SHoward Hinnantclass _LIBCPP_VISIBLE raw_storage_iterator 17023e519524SHoward Hinnant : public iterator<output_iterator_tag, 17033e519524SHoward Hinnant _Tp, // purposefully not C++03 17043e519524SHoward Hinnant ptrdiff_t, // purposefully not C++03 17053e519524SHoward Hinnant _Tp*, // purposefully not C++03 17063e519524SHoward Hinnant raw_storage_iterator<_OutputIterator, _Tp>&> // purposefully not C++03 17073e519524SHoward Hinnant{ 17083e519524SHoward Hinnantprivate: 17093e519524SHoward Hinnant _OutputIterator __x_; 17103e519524SHoward Hinnantpublic: 17113e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit raw_storage_iterator(_OutputIterator __x) : __x_(__x) {} 17123e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator*() {return *this;} 17133e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator=(const _Tp& __element) 17143e519524SHoward Hinnant {::new(&*__x_) _Tp(__element); return *this;} 17153e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator++() {++__x_; return *this;} 17163e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY raw_storage_iterator operator++(int) 17173e519524SHoward Hinnant {raw_storage_iterator __t(*this); ++__x_; return __t;} 17183e519524SHoward Hinnant}; 17193e519524SHoward Hinnant 17203e519524SHoward Hinnanttemplate <class _Tp> 17213e519524SHoward Hinnantpair<_Tp*, ptrdiff_t> 17223739fe79SHoward Hinnantget_temporary_buffer(ptrdiff_t __n) _NOEXCEPT 17233e519524SHoward Hinnant{ 17243e519524SHoward Hinnant pair<_Tp*, ptrdiff_t> __r(0, 0); 17253e519524SHoward Hinnant const ptrdiff_t __m = (~ptrdiff_t(0) ^ 17263e519524SHoward Hinnant ptrdiff_t(ptrdiff_t(1) << (sizeof(ptrdiff_t) * __CHAR_BIT__ - 1))) 17273e519524SHoward Hinnant / sizeof(_Tp); 17283e519524SHoward Hinnant if (__n > __m) 17293e519524SHoward Hinnant __n = __m; 17303e519524SHoward Hinnant while (__n > 0) 17313e519524SHoward Hinnant { 17323e519524SHoward Hinnant __r.first = static_cast<_Tp*>(::operator new(__n * sizeof(_Tp), nothrow)); 17333e519524SHoward Hinnant if (__r.first) 17343e519524SHoward Hinnant { 17353e519524SHoward Hinnant __r.second = __n; 17363e519524SHoward Hinnant break; 17373e519524SHoward Hinnant } 17383e519524SHoward Hinnant __n /= 2; 17393e519524SHoward Hinnant } 17403e519524SHoward Hinnant return __r; 17413e519524SHoward Hinnant} 17423e519524SHoward Hinnant 17433e519524SHoward Hinnanttemplate <class _Tp> 17443e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 17453739fe79SHoward Hinnantvoid return_temporary_buffer(_Tp* __p) _NOEXCEPT {::operator delete(__p);} 17463e519524SHoward Hinnant 17473e519524SHoward Hinnanttemplate <class _Tp> 17483e519524SHoward Hinnantstruct auto_ptr_ref 17493e519524SHoward Hinnant{ 17503e519524SHoward Hinnant _Tp* __ptr_; 17513e519524SHoward Hinnant}; 17523e519524SHoward Hinnant 17533e519524SHoward Hinnanttemplate<class _Tp> 1754848a5374SHoward Hinnantclass _LIBCPP_VISIBLE auto_ptr 17553e519524SHoward Hinnant{ 17563e519524SHoward Hinnantprivate: 17573e519524SHoward Hinnant _Tp* __ptr_; 17583e519524SHoward Hinnantpublic: 17593e519524SHoward Hinnant typedef _Tp element_type; 17603e519524SHoward Hinnant 17613e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit auto_ptr(_Tp* __p = 0) throw() : __ptr_(__p) {} 17623e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr& __p) throw() : __ptr_(__p.release()) {} 17633e519524SHoward Hinnant template<class _Up> _LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr<_Up>& __p) throw() 17643e519524SHoward Hinnant : __ptr_(__p.release()) {} 17653e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr& __p) throw() 17663e519524SHoward Hinnant {reset(__p.release()); return *this;} 17673e519524SHoward Hinnant template<class _Up> _LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr<_Up>& __p) throw() 17683e519524SHoward Hinnant {reset(__p.release()); return *this;} 17693e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr_ref<_Tp> __p) throw() 17703e519524SHoward Hinnant {reset(__p.__ptr_); return *this;} 17713e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY ~auto_ptr() throw() {delete __ptr_;} 17723e519524SHoward Hinnant 17733e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Tp& operator*() const throw() 17743e519524SHoward Hinnant {return *__ptr_;} 17753e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Tp* operator->() const throw() {return __ptr_;} 17763e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Tp* get() const throw() {return __ptr_;} 17773e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Tp* release() throw() 17783e519524SHoward Hinnant { 17793e519524SHoward Hinnant _Tp* __t = __ptr_; 17803e519524SHoward Hinnant __ptr_ = 0; 17813e519524SHoward Hinnant return __t; 17823e519524SHoward Hinnant } 17833e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void reset(_Tp* __p = 0) throw() 17843e519524SHoward Hinnant { 17853e519524SHoward Hinnant if (__ptr_ != __p) 17863e519524SHoward Hinnant delete __ptr_; 17873e519524SHoward Hinnant __ptr_ = __p; 17883e519524SHoward Hinnant } 17893e519524SHoward Hinnant 17903e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr_ref<_Tp> __p) throw() : __ptr_(__p.__ptr_) {} 17913e519524SHoward Hinnant template<class _Up> _LIBCPP_INLINE_VISIBILITY operator auto_ptr_ref<_Up>() throw() 17923e519524SHoward Hinnant {auto_ptr_ref<_Up> __t; __t.__ptr_ = release(); return __t;} 17933e519524SHoward Hinnant template<class _Up> _LIBCPP_INLINE_VISIBILITY operator auto_ptr<_Up>() throw() 17943e519524SHoward Hinnant {return auto_ptr<_Up>(release());} 17953e519524SHoward Hinnant}; 17963e519524SHoward Hinnant 17973e519524SHoward Hinnanttemplate <> 1798848a5374SHoward Hinnantclass _LIBCPP_VISIBLE auto_ptr<void> 17993e519524SHoward Hinnant{ 18003e519524SHoward Hinnantpublic: 18013e519524SHoward Hinnant typedef void element_type; 18023e519524SHoward Hinnant}; 18033e519524SHoward Hinnant 18043e519524SHoward Hinnanttemplate <class _T1, class _T2, bool = is_same<typename remove_cv<_T1>::type, 18053e519524SHoward Hinnant typename remove_cv<_T2>::type>::value, 18063e519524SHoward Hinnant bool = is_empty<_T1>::value, 18073e519524SHoward Hinnant bool = is_empty<_T2>::value> 18083e519524SHoward Hinnantstruct __libcpp_compressed_pair_switch; 18093e519524SHoward Hinnant 18103e519524SHoward Hinnanttemplate <class _T1, class _T2, bool IsSame> 18113e519524SHoward Hinnantstruct __libcpp_compressed_pair_switch<_T1, _T2, IsSame, false, false> {enum {value = 0};}; 18123e519524SHoward Hinnant 18133e519524SHoward Hinnanttemplate <class _T1, class _T2, bool IsSame> 18143e519524SHoward Hinnantstruct __libcpp_compressed_pair_switch<_T1, _T2, IsSame, true, false> {enum {value = 1};}; 18153e519524SHoward Hinnant 18163e519524SHoward Hinnanttemplate <class _T1, class _T2, bool IsSame> 18173e519524SHoward Hinnantstruct __libcpp_compressed_pair_switch<_T1, _T2, IsSame, false, true> {enum {value = 2};}; 18183e519524SHoward Hinnant 18193e519524SHoward Hinnanttemplate <class _T1, class _T2> 18203e519524SHoward Hinnantstruct __libcpp_compressed_pair_switch<_T1, _T2, false, true, true> {enum {value = 3};}; 18213e519524SHoward Hinnant 18223e519524SHoward Hinnanttemplate <class _T1, class _T2> 18233e519524SHoward Hinnantstruct __libcpp_compressed_pair_switch<_T1, _T2, true, true, true> {enum {value = 1};}; 18243e519524SHoward Hinnant 18253e519524SHoward Hinnanttemplate <class _T1, class _T2, unsigned = __libcpp_compressed_pair_switch<_T1, _T2>::value> 18263e519524SHoward Hinnantclass __libcpp_compressed_pair_imp; 18273e519524SHoward Hinnant 18283e519524SHoward Hinnanttemplate <class _T1, class _T2> 18293e519524SHoward Hinnantclass __libcpp_compressed_pair_imp<_T1, _T2, 0> 18303e519524SHoward Hinnant{ 18313e519524SHoward Hinnantprivate: 18323e519524SHoward Hinnant _T1 __first_; 18333e519524SHoward Hinnant _T2 __second_; 18343e519524SHoward Hinnantpublic: 18353e519524SHoward Hinnant typedef _T1 _T1_param; 18363e519524SHoward Hinnant typedef _T2 _T2_param; 18373e519524SHoward Hinnant 18383e519524SHoward Hinnant typedef typename remove_reference<_T1>::type& _T1_reference; 18393e519524SHoward Hinnant typedef typename remove_reference<_T2>::type& _T2_reference; 18403e519524SHoward Hinnant 18413e519524SHoward Hinnant typedef const typename remove_reference<_T1>::type& _T1_const_reference; 18423e519524SHoward Hinnant typedef const typename remove_reference<_T2>::type& _T2_const_reference; 18433e519524SHoward Hinnant 18443e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp() {} 18453e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T1_param __t1, int = 0) 18463e519524SHoward Hinnant : __first_(_STD::forward<_T1_param>(__t1)) {} 18473e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T2_param __t2, int* = 0) 18483e519524SHoward Hinnant : __second_(_STD::forward<_T2_param>(__t2)) {} 18493e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(_T1_param __t1, _T2_param __t2) 18503e519524SHoward Hinnant : __first_(_STD::forward<_T1_param>(__t1)), __second_(_STD::forward<_T2_param>(__t2)) {} 18513e519524SHoward Hinnant 18527609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 18533e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(__libcpp_compressed_pair_imp&& __p) 18543739fe79SHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<_T1>::value && 18553739fe79SHoward Hinnant is_nothrow_move_constructible<_T2>::value) 18563e519524SHoward Hinnant : __first_(_STD::forward<_T1>(__p.first())), __second_(_STD::forward<_T2>(__p.second())) {} 18577609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 18583e519524SHoward Hinnant 18593739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return __first_;} 18603739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return __first_;} 18613e519524SHoward Hinnant 18623739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_reference second() _NOEXCEPT {return __second_;} 18633739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_const_reference second() const _NOEXCEPT {return __second_;} 18643e519524SHoward Hinnant 18653e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void swap(__libcpp_compressed_pair_imp& __x) 18663739fe79SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && 18673739fe79SHoward Hinnant __is_nothrow_swappable<_T1>::value) 18683e519524SHoward Hinnant { 18693e519524SHoward Hinnant using _STD::swap; 18703e519524SHoward Hinnant swap(__first_, __x.__first_); 18713e519524SHoward Hinnant swap(__second_, __x.__second_); 18723e519524SHoward Hinnant } 18733e519524SHoward Hinnant}; 18743e519524SHoward Hinnant 18753e519524SHoward Hinnanttemplate <class _T1, class _T2> 18763e519524SHoward Hinnantclass __libcpp_compressed_pair_imp<_T1, _T2, 1> 18773e519524SHoward Hinnant : private _T1 18783e519524SHoward Hinnant{ 18793e519524SHoward Hinnantprivate: 18803e519524SHoward Hinnant _T2 __second_; 18813e519524SHoward Hinnantpublic: 18823e519524SHoward Hinnant typedef _T1 _T1_param; 18833e519524SHoward Hinnant typedef _T2 _T2_param; 18843e519524SHoward Hinnant 18853e519524SHoward Hinnant typedef _T1& _T1_reference; 18863e519524SHoward Hinnant typedef typename remove_reference<_T2>::type& _T2_reference; 18873e519524SHoward Hinnant 18883e519524SHoward Hinnant typedef const _T1& _T1_const_reference; 18893e519524SHoward Hinnant typedef const typename remove_reference<_T2>::type& _T2_const_reference; 18903e519524SHoward Hinnant 18913e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp() {} 18923e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T1_param __t1, int = 0) 18933e519524SHoward Hinnant : _T1(_STD::forward<_T1_param>(__t1)) {} 18943e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T2_param __t2, int* = 0) 18953e519524SHoward Hinnant : __second_(_STD::forward<_T2_param>(__t2)) {} 18963e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(_T1_param __t1, _T2_param __t2) 18973e519524SHoward Hinnant : _T1(_STD::forward<_T1_param>(__t1)), __second_(_STD::forward<_T2_param>(__t2)) {} 18983e519524SHoward Hinnant 18997609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 19003e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(__libcpp_compressed_pair_imp&& __p) 19013739fe79SHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<_T1>::value && 19023739fe79SHoward Hinnant is_nothrow_move_constructible<_T2>::value) 19033e519524SHoward Hinnant : _T1(_STD::move(__p.first())), __second_(_STD::forward<_T2>(__p.second())) {} 19047609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 19053e519524SHoward Hinnant 19063739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return *this;} 19073739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return *this;} 19083e519524SHoward Hinnant 19093739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_reference second() _NOEXCEPT {return __second_;} 19103739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_const_reference second() const _NOEXCEPT {return __second_;} 19113e519524SHoward Hinnant 19123e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void swap(__libcpp_compressed_pair_imp& __x) 19133739fe79SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && 19143739fe79SHoward Hinnant __is_nothrow_swappable<_T1>::value) 19153e519524SHoward Hinnant { 19163e519524SHoward Hinnant using _STD::swap; 19173e519524SHoward Hinnant swap(__second_, __x.__second_); 19183e519524SHoward Hinnant } 19193e519524SHoward Hinnant}; 19203e519524SHoward Hinnant 19213e519524SHoward Hinnanttemplate <class _T1, class _T2> 19223e519524SHoward Hinnantclass __libcpp_compressed_pair_imp<_T1, _T2, 2> 19233e519524SHoward Hinnant : private _T2 19243e519524SHoward Hinnant{ 19253e519524SHoward Hinnantprivate: 19263e519524SHoward Hinnant _T1 __first_; 19273e519524SHoward Hinnantpublic: 19283e519524SHoward Hinnant typedef _T1 _T1_param; 19293e519524SHoward Hinnant typedef _T2 _T2_param; 19303e519524SHoward Hinnant 19313e519524SHoward Hinnant typedef typename remove_reference<_T1>::type& _T1_reference; 19323e519524SHoward Hinnant typedef _T2& _T2_reference; 19333e519524SHoward Hinnant 19343e519524SHoward Hinnant typedef const typename remove_reference<_T1>::type& _T1_const_reference; 19353e519524SHoward Hinnant typedef const _T2& _T2_const_reference; 19363e519524SHoward Hinnant 19373e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp() {} 19383e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T1_param __t1) 19393e519524SHoward Hinnant : __first_(_STD::forward<_T1_param>(__t1)) {} 19403e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T2_param __t2) 19413e519524SHoward Hinnant : _T2(_STD::forward<_T2_param>(__t2)) {} 19423e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(_T1_param __t1, _T2_param __t2) 19433739fe79SHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<_T1>::value && 19443739fe79SHoward Hinnant is_nothrow_move_constructible<_T2>::value) 19453e519524SHoward Hinnant : _T2(_STD::forward<_T2_param>(__t2)), __first_(_STD::forward<_T1_param>(__t1)) {} 19463e519524SHoward Hinnant 19477609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 19483e519524SHoward Hinnant __libcpp_compressed_pair_imp(__libcpp_compressed_pair_imp&& __p) 19493e519524SHoward Hinnant : _T2(_STD::forward<_T2>(__p.second())), __first_(_STD::move(__p.first())) {} 19507609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 19513e519524SHoward Hinnant 19523739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return __first_;} 19533739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return __first_;} 19543e519524SHoward Hinnant 19553739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_reference second() _NOEXCEPT {return *this;} 19563739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_const_reference second() const _NOEXCEPT {return *this;} 19573e519524SHoward Hinnant 19583e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void swap(__libcpp_compressed_pair_imp& __x) 19593739fe79SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && 19603739fe79SHoward Hinnant __is_nothrow_swappable<_T1>::value) 19613e519524SHoward Hinnant { 19623e519524SHoward Hinnant using _STD::swap; 19633e519524SHoward Hinnant swap(__first_, __x.__first_); 19643e519524SHoward Hinnant } 19653e519524SHoward Hinnant}; 19663e519524SHoward Hinnant 19673e519524SHoward Hinnanttemplate <class _T1, class _T2> 19683e519524SHoward Hinnantclass __libcpp_compressed_pair_imp<_T1, _T2, 3> 19693e519524SHoward Hinnant : private _T1, 19703e519524SHoward Hinnant private _T2 19713e519524SHoward Hinnant{ 19723e519524SHoward Hinnantpublic: 19733e519524SHoward Hinnant typedef _T1 _T1_param; 19743e519524SHoward Hinnant typedef _T2 _T2_param; 19753e519524SHoward Hinnant 19763e519524SHoward Hinnant typedef _T1& _T1_reference; 19773e519524SHoward Hinnant typedef _T2& _T2_reference; 19783e519524SHoward Hinnant 19793e519524SHoward Hinnant typedef const _T1& _T1_const_reference; 19803e519524SHoward Hinnant typedef const _T2& _T2_const_reference; 19813e519524SHoward Hinnant 19823e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp() {} 19833e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T1_param __t1) 19843e519524SHoward Hinnant : _T1(_STD::forward<_T1_param>(__t1)) {} 19853e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T2_param __t2) 19863e519524SHoward Hinnant : _T2(_STD::forward<_T2_param>(__t2)) {} 19873e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(_T1_param __t1, _T2_param __t2) 19883e519524SHoward Hinnant : _T1(_STD::forward<_T1_param>(__t1)), _T2(_STD::forward<_T2_param>(__t2)) {} 19893e519524SHoward Hinnant 19907609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 19913e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(__libcpp_compressed_pair_imp&& __p) 19923739fe79SHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<_T1>::value && 19933739fe79SHoward Hinnant is_nothrow_move_constructible<_T2>::value) 19943e519524SHoward Hinnant : _T1(_STD::move(__p.first())), _T2(_STD::move(__p.second())) {} 19957609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 19963e519524SHoward Hinnant 19973739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return *this;} 19983739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return *this;} 19993e519524SHoward Hinnant 20003739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_reference second() _NOEXCEPT {return *this;} 20013739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_const_reference second() const _NOEXCEPT {return *this;} 20023e519524SHoward Hinnant 20033e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void swap(__libcpp_compressed_pair_imp& __x) 20043739fe79SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && 20053739fe79SHoward Hinnant __is_nothrow_swappable<_T1>::value) 20063e519524SHoward Hinnant { 20073e519524SHoward Hinnant } 20083e519524SHoward Hinnant}; 20093e519524SHoward Hinnant 20103e519524SHoward Hinnanttemplate <class _T1, class _T2> 20113e519524SHoward Hinnantclass __compressed_pair 20123e519524SHoward Hinnant : private __libcpp_compressed_pair_imp<_T1, _T2> 20133e519524SHoward Hinnant{ 20143e519524SHoward Hinnant typedef __libcpp_compressed_pair_imp<_T1, _T2> base; 20153e519524SHoward Hinnantpublic: 20163e519524SHoward Hinnant typedef typename base::_T1_param _T1_param; 20173e519524SHoward Hinnant typedef typename base::_T2_param _T2_param; 20183e519524SHoward Hinnant 20193e519524SHoward Hinnant typedef typename base::_T1_reference _T1_reference; 20203e519524SHoward Hinnant typedef typename base::_T2_reference _T2_reference; 20213e519524SHoward Hinnant 20223e519524SHoward Hinnant typedef typename base::_T1_const_reference _T1_const_reference; 20233e519524SHoward Hinnant typedef typename base::_T2_const_reference _T2_const_reference; 20243e519524SHoward Hinnant 20253e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __compressed_pair() {} 20263e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __compressed_pair(_T1_param __t1, int = 0) 20273e519524SHoward Hinnant : base(_STD::forward<_T1_param>(__t1)) {} 20283e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __compressed_pair(_T2_param __t2, int* = 0) 20293e519524SHoward Hinnant : base(_STD::forward<_T2_param>(__t2)) {} 20303e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __compressed_pair(_T1_param __t1, _T2_param __t2) 20313e519524SHoward Hinnant : base(_STD::forward<_T1_param>(__t1), _STD::forward<_T2_param>(__t2)) {} 20323e519524SHoward Hinnant 20337609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 20343e519524SHoward Hinnant __compressed_pair(__compressed_pair&& __p) 20353739fe79SHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<_T1>::value && 20363739fe79SHoward Hinnant is_nothrow_move_constructible<_T2>::value) 20373e519524SHoward Hinnant : base(_STD::move(__p)) {} 20387609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 20393e519524SHoward Hinnant 20403739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return base::first();} 20413739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return base::first();} 20423e519524SHoward Hinnant 20433739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_reference second() _NOEXCEPT {return base::second();} 20443739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_const_reference second() const _NOEXCEPT {return base::second();} 20453e519524SHoward Hinnant 20463739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void swap(__compressed_pair& __x) 20473739fe79SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && 20483739fe79SHoward Hinnant __is_nothrow_swappable<_T1>::value) 20493739fe79SHoward Hinnant {base::swap(__x);} 20503e519524SHoward Hinnant}; 20513e519524SHoward Hinnant 20523e519524SHoward Hinnanttemplate <class _T1, class _T2> 20533e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 20543e519524SHoward Hinnantvoid 20553e519524SHoward Hinnantswap(__compressed_pair<_T1, _T2>& __x, __compressed_pair<_T1, _T2>& __y) 20563739fe79SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && 20573739fe79SHoward Hinnant __is_nothrow_swappable<_T1>::value) 20583e519524SHoward Hinnant {__x.swap(__y);} 20593e519524SHoward Hinnant 20603e519524SHoward Hinnanttemplate <class _Tp> 2061848a5374SHoward Hinnantstruct _LIBCPP_VISIBLE default_delete 20623e519524SHoward Hinnant{ 20633739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY default_delete() _NOEXCEPT {} 20643e519524SHoward Hinnant template <class _Up> 20653e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY default_delete(const default_delete<_Up>&, 20663739fe79SHoward Hinnant typename enable_if<is_convertible<_Up*, _Tp*>::value>::type* = 0) _NOEXCEPT {} 20673739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void operator() (_Tp* __ptr) const _NOEXCEPT 20683e519524SHoward Hinnant { 20693e519524SHoward Hinnant static_assert(sizeof(_Tp) > 0, "default_delete can not delete incomplete type"); 20703e519524SHoward Hinnant delete __ptr; 20713e519524SHoward Hinnant } 20723e519524SHoward Hinnant}; 20733e519524SHoward Hinnant 20743e519524SHoward Hinnanttemplate <class _Tp> 2075848a5374SHoward Hinnantstruct _LIBCPP_VISIBLE default_delete<_Tp[]> 20763e519524SHoward Hinnant{ 20773739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void operator() (_Tp* __ptr) const _NOEXCEPT 20783e519524SHoward Hinnant { 20793e519524SHoward Hinnant static_assert(sizeof(_Tp) > 0, "default_delete can not delete incomplete type"); 20803e519524SHoward Hinnant delete [] __ptr; 20813e519524SHoward Hinnant } 20823e519524SHoward Hinnantprivate: 20833e519524SHoward Hinnant template <class _Up> void operator() (_Up*) const; 20843e519524SHoward Hinnant}; 20853e519524SHoward Hinnant 20863e519524SHoward Hinnanttemplate <class _Tp, class _Dp = default_delete<_Tp> > 2087848a5374SHoward Hinnantclass _LIBCPP_VISIBLE unique_ptr 20883e519524SHoward Hinnant{ 20893e519524SHoward Hinnantpublic: 20903e519524SHoward Hinnant typedef _Tp element_type; 20913e519524SHoward Hinnant typedef _Dp deleter_type; 20923e519524SHoward Hinnant typedef typename __pointer_type<_Tp, deleter_type>::type pointer; 20933e519524SHoward Hinnantprivate: 20943e519524SHoward Hinnant __compressed_pair<pointer, deleter_type> __ptr_; 20953e519524SHoward Hinnant 20967609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 20973e519524SHoward Hinnant unique_ptr(const unique_ptr&); 20983e519524SHoward Hinnant unique_ptr& operator=(const unique_ptr&); 20993e519524SHoward Hinnant template <class _Up, class _Ep> 21003e519524SHoward Hinnant unique_ptr(const unique_ptr<_Up, _Ep>&); 21013e519524SHoward Hinnant template <class _Up, class _Ep> 21023e519524SHoward Hinnant unique_ptr& operator=(const unique_ptr<_Up, _Ep>&); 21037609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 21043e519524SHoward Hinnant unique_ptr(unique_ptr&); 21053e519524SHoward Hinnant template <class _Up, class _Ep> 21063e519524SHoward Hinnant unique_ptr(unique_ptr<_Up, _Ep>&); 21073e519524SHoward Hinnant unique_ptr& operator=(unique_ptr&); 21083e519524SHoward Hinnant template <class _Up, class _Ep> 21093e519524SHoward Hinnant unique_ptr& operator=(unique_ptr<_Up, _Ep>&); 21107609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 21113e519524SHoward Hinnant 21123e519524SHoward Hinnant struct __nat {int __for_bool_;}; 21133e519524SHoward Hinnant 21143e519524SHoward Hinnant typedef typename remove_reference<deleter_type>::type& _Dp_reference; 21153e519524SHoward Hinnant typedef const typename remove_reference<deleter_type>::type& _Dp_const_reference; 21163e519524SHoward Hinnantpublic: 21173739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr() _NOEXCEPT 21183e519524SHoward Hinnant : __ptr_(pointer()) 21193e519524SHoward Hinnant { 21203e519524SHoward Hinnant static_assert(!is_pointer<deleter_type>::value, 21213e519524SHoward Hinnant "unique_ptr constructed with null function pointer deleter"); 21223e519524SHoward Hinnant } 21233739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(nullptr_t) _NOEXCEPT 21243e519524SHoward Hinnant : __ptr_(pointer()) 21253e519524SHoward Hinnant { 21263e519524SHoward Hinnant static_assert(!is_pointer<deleter_type>::value, 21273e519524SHoward Hinnant "unique_ptr constructed with null function pointer deleter"); 21283e519524SHoward Hinnant } 21293739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit unique_ptr(pointer __p) _NOEXCEPT 21303e519524SHoward Hinnant : __ptr_(_STD::move(__p)) 21313e519524SHoward Hinnant { 21323e519524SHoward Hinnant static_assert(!is_pointer<deleter_type>::value, 21333e519524SHoward Hinnant "unique_ptr constructed with null function pointer deleter"); 21343e519524SHoward Hinnant } 21353e519524SHoward Hinnant 21367609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 21373e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(pointer __p, typename conditional< 21383e519524SHoward Hinnant is_reference<deleter_type>::value, 21393e519524SHoward Hinnant deleter_type, 21403e519524SHoward Hinnant typename add_lvalue_reference<const deleter_type>::type>::type __d) 21413739fe79SHoward Hinnant _NOEXCEPT 21423e519524SHoward Hinnant : __ptr_(__p, __d) {} 21433e519524SHoward Hinnant 21443e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(pointer __p, typename remove_reference<deleter_type>::type&& __d) 21453739fe79SHoward Hinnant _NOEXCEPT 21463e519524SHoward Hinnant : __ptr_(__p, _STD::move(__d)) 21473e519524SHoward Hinnant { 21483e519524SHoward Hinnant static_assert(!is_reference<deleter_type>::value, "rvalue deleter bound to reference"); 21493e519524SHoward Hinnant } 21503739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(unique_ptr&& __u) _NOEXCEPT 21513e519524SHoward Hinnant : __ptr_(__u.release(), _STD::forward<deleter_type>(__u.get_deleter())) {} 21523e519524SHoward Hinnant template <class _Up, class _Ep> 21533e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 21543e519524SHoward Hinnant unique_ptr(unique_ptr<_Up, _Ep>&& __u, 21553e519524SHoward Hinnant typename enable_if 21563e519524SHoward Hinnant < 21573e519524SHoward Hinnant !is_array<_Up>::value && 21583e519524SHoward Hinnant is_convertible<typename unique_ptr<_Up, _Ep>::pointer, pointer>::value && 21593e519524SHoward Hinnant is_convertible<_Ep, deleter_type>::value && 21603e519524SHoward Hinnant ( 21613e519524SHoward Hinnant !is_reference<deleter_type>::value || 21623e519524SHoward Hinnant is_same<deleter_type, _Ep>::value 21633e519524SHoward Hinnant ), 21643e519524SHoward Hinnant __nat 21653739fe79SHoward Hinnant >::type = __nat()) _NOEXCEPT 21663e519524SHoward Hinnant : __ptr_(__u.release(), _STD::forward<_Ep>(__u.get_deleter())) {} 21673e519524SHoward Hinnant 21683e519524SHoward Hinnant template <class _Up> 21693e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(auto_ptr<_Up>&& __p, 21703e519524SHoward Hinnant typename enable_if< 21713e519524SHoward Hinnant is_convertible<_Up*, _Tp*>::value && 21723e519524SHoward Hinnant is_same<_Dp, default_delete<_Tp> >::value, 21733e519524SHoward Hinnant __nat 21743739fe79SHoward Hinnant >::type = __nat()) _NOEXCEPT 21753e519524SHoward Hinnant : __ptr_(__p.release()) 21763e519524SHoward Hinnant { 21773e519524SHoward Hinnant } 21783e519524SHoward Hinnant 21793739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(unique_ptr&& __u) _NOEXCEPT 21803e519524SHoward Hinnant { 21813e519524SHoward Hinnant reset(__u.release()); 21823e519524SHoward Hinnant __ptr_.second() = _STD::forward<deleter_type>(__u.get_deleter()); 21833e519524SHoward Hinnant return *this; 21843e519524SHoward Hinnant } 21853e519524SHoward Hinnant 21863e519524SHoward Hinnant template <class _Up, class _Ep> 21873e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 21883e519524SHoward Hinnant typename enable_if 21893e519524SHoward Hinnant < 21903e519524SHoward Hinnant !is_array<_Up>::value, 21913e519524SHoward Hinnant unique_ptr& 21923e519524SHoward Hinnant >::type 21933739fe79SHoward Hinnant operator=(unique_ptr<_Up, _Ep>&& __u) _NOEXCEPT 21943e519524SHoward Hinnant { 21953e519524SHoward Hinnant reset(__u.release()); 21963e519524SHoward Hinnant __ptr_.second() = _STD::forward<_Ep>(__u.get_deleter()); 21973e519524SHoward Hinnant return *this; 21983e519524SHoward Hinnant } 21997609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 22003e519524SHoward Hinnant 22013e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY operator __rv<unique_ptr>() 22023e519524SHoward Hinnant { 22033e519524SHoward Hinnant return __rv<unique_ptr>(*this); 22043e519524SHoward Hinnant } 22053e519524SHoward Hinnant 22063e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(__rv<unique_ptr> __u) 22073e519524SHoward Hinnant : __ptr_(__u->release(), _STD::forward<deleter_type>(__u->get_deleter())) {} 22083e519524SHoward Hinnant 22093e519524SHoward Hinnant template <class _Up, class _Ep> 22103e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(unique_ptr<_Up, _Ep> __u) 22113e519524SHoward Hinnant { 22123e519524SHoward Hinnant reset(__u.release()); 22133e519524SHoward Hinnant __ptr_.second() = _STD::forward<deleter_type>(__u.get_deleter()); 22143e519524SHoward Hinnant return *this; 22153e519524SHoward Hinnant } 22163e519524SHoward Hinnant 22173e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(pointer __p, deleter_type __d) 22183e519524SHoward Hinnant : __ptr_(_STD::move(__p), _STD::move(__d)) {} 22193e519524SHoward Hinnant 22203e519524SHoward Hinnant template <class _Up> 22213e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22223e519524SHoward Hinnant typename enable_if< 22233e519524SHoward Hinnant is_convertible<_Up*, _Tp*>::value && 22243e519524SHoward Hinnant is_same<_Dp, default_delete<_Tp> >::value, 22253e519524SHoward Hinnant unique_ptr& 22263e519524SHoward Hinnant >::type 22273e519524SHoward Hinnant operator=(auto_ptr<_Up> __p) 22283e519524SHoward Hinnant {reset(__p.release()); return *this;} 22293e519524SHoward Hinnant 22307609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 22313e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY ~unique_ptr() {reset();} 22323e519524SHoward Hinnant 22333739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(nullptr_t) _NOEXCEPT 22343e519524SHoward Hinnant { 22353e519524SHoward Hinnant reset(); 22363e519524SHoward Hinnant return *this; 22373e519524SHoward Hinnant } 22383e519524SHoward Hinnant 22393e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY typename add_lvalue_reference<_Tp>::type operator*() const 22403e519524SHoward Hinnant {return *__ptr_.first();} 22413739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer operator->() const _NOEXCEPT {return __ptr_.first();} 22423739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer get() const _NOEXCEPT {return __ptr_.first();} 22433739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Dp_reference get_deleter() _NOEXCEPT 22443739fe79SHoward Hinnant {return __ptr_.second();} 22453739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Dp_const_reference get_deleter() const _NOEXCEPT 22463739fe79SHoward Hinnant {return __ptr_.second();} 22473739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY operator int __nat::*() const 22483739fe79SHoward Hinnant _NOEXCEPT 22493739fe79SHoward Hinnant {return __ptr_.first() ? &__nat::__for_bool_ : 0;} 22503e519524SHoward Hinnant 22513739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer release() _NOEXCEPT 22523e519524SHoward Hinnant { 22533e519524SHoward Hinnant pointer __t = __ptr_.first(); 22543e519524SHoward Hinnant __ptr_.first() = pointer(); 22553e519524SHoward Hinnant return __t; 22563e519524SHoward Hinnant } 22573e519524SHoward Hinnant 22583739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void reset(pointer __p = pointer()) _NOEXCEPT 22593e519524SHoward Hinnant { 22603e519524SHoward Hinnant pointer __tmp = __ptr_.first(); 22613e519524SHoward Hinnant __ptr_.first() = __p; 22623e519524SHoward Hinnant if (__tmp) 22633e519524SHoward Hinnant __ptr_.second()(__tmp); 22643e519524SHoward Hinnant } 22653e519524SHoward Hinnant 22663739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void swap(unique_ptr& __u) _NOEXCEPT 22673739fe79SHoward Hinnant {__ptr_.swap(__u.__ptr_);} 22683e519524SHoward Hinnant}; 22693e519524SHoward Hinnant 22703e519524SHoward Hinnanttemplate <class _Tp, class _Dp> 2271848a5374SHoward Hinnantclass _LIBCPP_VISIBLE unique_ptr<_Tp[], _Dp> 22723e519524SHoward Hinnant{ 22733e519524SHoward Hinnantpublic: 22743e519524SHoward Hinnant typedef _Tp element_type; 22753e519524SHoward Hinnant typedef _Dp deleter_type; 22763e519524SHoward Hinnant typedef typename __pointer_type<_Tp, deleter_type>::type pointer; 22773e519524SHoward Hinnantprivate: 22783e519524SHoward Hinnant __compressed_pair<pointer, deleter_type> __ptr_; 22793e519524SHoward Hinnant 22807609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 22813e519524SHoward Hinnant unique_ptr(const unique_ptr&); 22823e519524SHoward Hinnant unique_ptr& operator=(const unique_ptr&); 22837609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 22843e519524SHoward Hinnant unique_ptr(unique_ptr&); 22853e519524SHoward Hinnant template <class _Up> 22863e519524SHoward Hinnant unique_ptr(unique_ptr<_Up>&); 22873e519524SHoward Hinnant unique_ptr& operator=(unique_ptr&); 22883e519524SHoward Hinnant template <class _Up> 22893e519524SHoward Hinnant unique_ptr& operator=(unique_ptr<_Up>&); 22907609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 22913e519524SHoward Hinnant 22923e519524SHoward Hinnant struct __nat {int __for_bool_;}; 22933e519524SHoward Hinnant 22943e519524SHoward Hinnant typedef typename remove_reference<deleter_type>::type& _Dp_reference; 22953e519524SHoward Hinnant typedef const typename remove_reference<deleter_type>::type& _Dp_const_reference; 22963e519524SHoward Hinnantpublic: 22973739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr() _NOEXCEPT 22983e519524SHoward Hinnant : __ptr_(pointer()) 22993e519524SHoward Hinnant { 23003e519524SHoward Hinnant static_assert(!is_pointer<deleter_type>::value, 23013e519524SHoward Hinnant "unique_ptr constructed with null function pointer deleter"); 23023e519524SHoward Hinnant } 23033739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(nullptr_t) _NOEXCEPT 23043e519524SHoward Hinnant : __ptr_(pointer()) 23053e519524SHoward Hinnant { 23063e519524SHoward Hinnant static_assert(!is_pointer<deleter_type>::value, 23073e519524SHoward Hinnant "unique_ptr constructed with null function pointer deleter"); 23083e519524SHoward Hinnant } 23097609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 23103e519524SHoward Hinnant template <class _P, 23113e519524SHoward Hinnant class = typename enable_if<is_same<_P, pointer>::value>::type 23123e519524SHoward Hinnant > 23133739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit unique_ptr(_P __p) _NOEXCEPT 23143e519524SHoward Hinnant : __ptr_(__p) 23153e519524SHoward Hinnant { 23163e519524SHoward Hinnant static_assert(!is_pointer<deleter_type>::value, 23173e519524SHoward Hinnant "unique_ptr constructed with null function pointer deleter"); 23183e519524SHoward Hinnant } 23193e519524SHoward Hinnant 23203e519524SHoward Hinnant template <class _P, 23213e519524SHoward Hinnant class = typename enable_if<is_same<_P, pointer>::value>::type 23223e519524SHoward Hinnant > 23233e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(_P __p, typename conditional< 23243e519524SHoward Hinnant is_reference<deleter_type>::value, 23253e519524SHoward Hinnant deleter_type, 23263e519524SHoward Hinnant typename add_lvalue_reference<const deleter_type>::type>::type __d) 23273739fe79SHoward Hinnant _NOEXCEPT 23283e519524SHoward Hinnant : __ptr_(__p, __d) {} 23293e519524SHoward Hinnant 23303e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(nullptr_t, typename conditional< 23313e519524SHoward Hinnant is_reference<deleter_type>::value, 23323e519524SHoward Hinnant deleter_type, 23333e519524SHoward Hinnant typename add_lvalue_reference<const deleter_type>::type>::type __d) 23343739fe79SHoward Hinnant _NOEXCEPT 23353e519524SHoward Hinnant : __ptr_(pointer(), __d) {} 23363e519524SHoward Hinnant 23373e519524SHoward Hinnant template <class _P, 23383e519524SHoward Hinnant class = typename enable_if<is_same<_P, pointer>::value || 23393e519524SHoward Hinnant is_same<_P, nullptr_t>::value>::type 23403e519524SHoward Hinnant > 23413e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(_P __p, typename remove_reference<deleter_type>::type&& __d) 23423739fe79SHoward Hinnant _NOEXCEPT 23433e519524SHoward Hinnant : __ptr_(__p, _STD::move(__d)) 23443e519524SHoward Hinnant { 23453e519524SHoward Hinnant static_assert(!is_reference<deleter_type>::value, "rvalue deleter bound to reference"); 23463e519524SHoward Hinnant } 23473e519524SHoward Hinnant 23483e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(nullptr_t, typename remove_reference<deleter_type>::type&& __d) 23493739fe79SHoward Hinnant _NOEXCEPT 23503e519524SHoward Hinnant : __ptr_(pointer(), _STD::move(__d)) 23513e519524SHoward Hinnant { 23523e519524SHoward Hinnant static_assert(!is_reference<deleter_type>::value, "rvalue deleter bound to reference"); 23533e519524SHoward Hinnant } 23543e519524SHoward Hinnant 23553739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(unique_ptr&& __u) _NOEXCEPT 23563e519524SHoward Hinnant : __ptr_(__u.release(), _STD::forward<deleter_type>(__u.get_deleter())) {} 23573e519524SHoward Hinnant 23583739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(unique_ptr&& __u) _NOEXCEPT 23593e519524SHoward Hinnant { 23603e519524SHoward Hinnant reset(__u.release()); 23613e519524SHoward Hinnant __ptr_.second() = _STD::forward<deleter_type>(__u.get_deleter()); 23623e519524SHoward Hinnant return *this; 23633e519524SHoward Hinnant } 23647609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 23653e519524SHoward Hinnant 23663e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit unique_ptr(pointer __p) 23673e519524SHoward Hinnant : __ptr_(__p) 23683e519524SHoward Hinnant { 23693e519524SHoward Hinnant static_assert(!is_pointer<deleter_type>::value, 23703e519524SHoward Hinnant "unique_ptr constructed with null function pointer deleter"); 23713e519524SHoward Hinnant } 23723e519524SHoward Hinnant 23733e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(pointer __p, deleter_type __d) 23743e519524SHoward Hinnant : __ptr_(__p, _STD::forward<deleter_type>(__d)) {} 23753e519524SHoward Hinnant 23763e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(nullptr_t, deleter_type __d) 23773e519524SHoward Hinnant : __ptr_(pointer(), _STD::forward<deleter_type>(__d)) {} 23783e519524SHoward Hinnant 23793e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY operator __rv<unique_ptr>() 23803e519524SHoward Hinnant { 23813e519524SHoward Hinnant return __rv<unique_ptr>(*this); 23823e519524SHoward Hinnant } 23833e519524SHoward Hinnant 23843e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(__rv<unique_ptr> __u) 23853e519524SHoward Hinnant : __ptr_(__u->release(), _STD::forward<deleter_type>(__u->get_deleter())) {} 23863e519524SHoward Hinnant 23873e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(__rv<unique_ptr> __u) 23883e519524SHoward Hinnant { 23893e519524SHoward Hinnant reset(__u->release()); 23903e519524SHoward Hinnant __ptr_.second() = _STD::forward<deleter_type>(__u->get_deleter()); 23913e519524SHoward Hinnant return *this; 23923e519524SHoward Hinnant } 23933e519524SHoward Hinnant 23947609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 23953e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY ~unique_ptr() {reset();} 23963e519524SHoward Hinnant 23973739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(nullptr_t) _NOEXCEPT 23983e519524SHoward Hinnant { 23993e519524SHoward Hinnant reset(); 24003e519524SHoward Hinnant return *this; 24013e519524SHoward Hinnant } 24023e519524SHoward Hinnant 24033e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY typename add_lvalue_reference<_Tp>::type operator[](size_t __i) const 24043e519524SHoward Hinnant {return __ptr_.first()[__i];} 24053739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer get() const _NOEXCEPT {return __ptr_.first();} 24063739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Dp_reference get_deleter() _NOEXCEPT 24073739fe79SHoward Hinnant {return __ptr_.second();} 24083739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Dp_const_reference get_deleter() const _NOEXCEPT 24093739fe79SHoward Hinnant {return __ptr_.second();} 24103739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY operator int __nat::*() const _NOEXCEPT 24113739fe79SHoward Hinnant {return __ptr_.first() ? &__nat::__for_bool_ : 0;} 24123e519524SHoward Hinnant 24133739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer release() _NOEXCEPT 24143e519524SHoward Hinnant { 24153e519524SHoward Hinnant pointer __t = __ptr_.first(); 24163e519524SHoward Hinnant __ptr_.first() = pointer(); 24173e519524SHoward Hinnant return __t; 24183e519524SHoward Hinnant } 24193e519524SHoward Hinnant 24207609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 24213e519524SHoward Hinnant template <class _P, 24223e519524SHoward Hinnant class = typename enable_if<is_same<_P, pointer>::value>::type 24233e519524SHoward Hinnant > 24243739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void reset(_P __p) _NOEXCEPT 24253e519524SHoward Hinnant { 24263e519524SHoward Hinnant pointer __tmp = __ptr_.first(); 24273e519524SHoward Hinnant __ptr_.first() = __p; 24283e519524SHoward Hinnant if (__tmp) 24293e519524SHoward Hinnant __ptr_.second()(__tmp); 24303e519524SHoward Hinnant } 24313739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void reset(nullptr_t) _NOEXCEPT 24323e519524SHoward Hinnant { 24333e519524SHoward Hinnant pointer __tmp = __ptr_.first(); 24343e519524SHoward Hinnant __ptr_.first() = nullptr; 24353e519524SHoward Hinnant if (__tmp) 24363e519524SHoward Hinnant __ptr_.second()(__tmp); 24373e519524SHoward Hinnant } 24383739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void reset() _NOEXCEPT 24393e519524SHoward Hinnant { 24403e519524SHoward Hinnant pointer __tmp = __ptr_.first(); 24413e519524SHoward Hinnant __ptr_.first() = nullptr; 24423e519524SHoward Hinnant if (__tmp) 24433e519524SHoward Hinnant __ptr_.second()(__tmp); 24443e519524SHoward Hinnant } 24457609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 24463e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void reset(pointer __p = pointer()) 24473e519524SHoward Hinnant { 24483e519524SHoward Hinnant pointer __tmp = __ptr_.first(); 24493e519524SHoward Hinnant __ptr_.first() = __p; 24503e519524SHoward Hinnant if (__tmp) 24513e519524SHoward Hinnant __ptr_.second()(__tmp); 24523e519524SHoward Hinnant } 24537609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 24543e519524SHoward Hinnant 24553e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void swap(unique_ptr& __u) {__ptr_.swap(__u.__ptr_);} 24563e519524SHoward Hinnantprivate: 24573e519524SHoward Hinnant 24587609c9b6SHoward Hinnant#ifdef _LIBCPP_HAS_NO_RVALUE_REFERENCES 24593e519524SHoward Hinnant template <class _Up> 24603e519524SHoward Hinnant explicit unique_ptr(_Up); 24613e519524SHoward Hinnant template <class _Up> 24623e519524SHoward Hinnant unique_ptr(_Up __u, 24633e519524SHoward Hinnant typename conditional< 24643e519524SHoward Hinnant is_reference<deleter_type>::value, 24653e519524SHoward Hinnant deleter_type, 24663e519524SHoward Hinnant typename add_lvalue_reference<const deleter_type>::type>::type, 24673e519524SHoward Hinnant typename enable_if 24683e519524SHoward Hinnant < 24693e519524SHoward Hinnant is_convertible<_Up, pointer>::value, 24703e519524SHoward Hinnant __nat 24713e519524SHoward Hinnant >::type = __nat()); 24727609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 24733e519524SHoward Hinnant}; 24743e519524SHoward Hinnant 24753e519524SHoward Hinnanttemplate <class _Tp, class _Dp> 24763e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 24773e519524SHoward Hinnantvoid 24783739fe79SHoward Hinnantswap(unique_ptr<_Tp, _Dp>& __x, unique_ptr<_Tp, _Dp>& __y) _NOEXCEPT {__x.swap(__y);} 24793e519524SHoward Hinnant 24803e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 24813e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 24823e519524SHoward Hinnantbool 24833e519524SHoward Hinnantoperator==(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return __x.get() == __y.get();} 24843e519524SHoward Hinnant 24853e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 24863e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 24873e519524SHoward Hinnantbool 24883e519524SHoward Hinnantoperator!=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__x == __y);} 24893e519524SHoward Hinnant 24903e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 24913e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 24923e519524SHoward Hinnantbool 24933e519524SHoward Hinnantoperator< (const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return __x.get() < __y.get();} 24943e519524SHoward Hinnant 24953e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 24963e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 24973e519524SHoward Hinnantbool 24983e519524SHoward Hinnantoperator> (const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return __y < __x;} 24993e519524SHoward Hinnant 25003e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 25013e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 25023e519524SHoward Hinnantbool 25033e519524SHoward Hinnantoperator<=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__y < __x);} 25043e519524SHoward Hinnant 25053e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 25063e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 25073e519524SHoward Hinnantbool 25083e519524SHoward Hinnantoperator>=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__x < __y);} 25093e519524SHoward Hinnant 2510d1803b6cSHoward Hinnanttemplate <class> struct hash; 2511d1803b6cSHoward Hinnant 2512d1803b6cSHoward Hinnanttemplate<class _Tp> 2513848a5374SHoward Hinnantstruct _LIBCPP_VISIBLE hash<_Tp*> 2514d1803b6cSHoward Hinnant : public unary_function<_Tp*, size_t> 2515d1803b6cSHoward Hinnant{ 2516848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 25173739fe79SHoward Hinnant size_t operator()(_Tp* __v) const _NOEXCEPT 2518d1803b6cSHoward Hinnant { 2519d1803b6cSHoward Hinnant const size_t* const __p = reinterpret_cast<const size_t*>(&__v); 2520d1803b6cSHoward Hinnant return *__p; 2521d1803b6cSHoward Hinnant } 2522d1803b6cSHoward Hinnant}; 2523d1803b6cSHoward Hinnant 2524d1803b6cSHoward Hinnanttemplate <class _Tp, class _Dp> 2525848a5374SHoward Hinnantstruct _LIBCPP_VISIBLE hash<unique_ptr<_Tp, _Dp> > 2526d1803b6cSHoward Hinnant{ 2527d1803b6cSHoward Hinnant typedef unique_ptr<_Tp, _Dp> argument_type; 2528d1803b6cSHoward Hinnant typedef size_t result_type; 2529848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 25303739fe79SHoward Hinnant result_type operator()(const argument_type& __ptr) const _NOEXCEPT 2531d1803b6cSHoward Hinnant { 2532d1803b6cSHoward Hinnant typedef typename argument_type::pointer pointer; 2533d1803b6cSHoward Hinnant return hash<pointer>()(__ptr.get()); 2534d1803b6cSHoward Hinnant } 2535d1803b6cSHoward Hinnant}; 2536d1803b6cSHoward Hinnant 25373e519524SHoward Hinnantstruct __destruct_n 25383e519524SHoward Hinnant{ 25393e519524SHoward Hinnantprivate: 25403e519524SHoward Hinnant size_t size; 25413e519524SHoward Hinnant 25423e519524SHoward Hinnant template <class _Tp> 25433739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __process(_Tp* __p, false_type) _NOEXCEPT 25443e519524SHoward Hinnant {for (size_t __i = 0; __i < size; ++__i, ++__p) __p->~_Tp();} 25453e519524SHoward Hinnant 25463e519524SHoward Hinnant template <class _Tp> 25473739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __process(_Tp*, true_type) _NOEXCEPT 25483e519524SHoward Hinnant {} 25493e519524SHoward Hinnant 25503739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __incr(false_type) _NOEXCEPT 25513e519524SHoward Hinnant {++size;} 25523739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __incr(true_type) _NOEXCEPT 25533e519524SHoward Hinnant {} 25543e519524SHoward Hinnant 25553739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __set(size_t __s, false_type) _NOEXCEPT 25563e519524SHoward Hinnant {size = __s;} 25573739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __set(size_t, true_type) _NOEXCEPT 25583e519524SHoward Hinnant {} 25593e519524SHoward Hinnantpublic: 25603739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __destruct_n(size_t __s) _NOEXCEPT 25613739fe79SHoward Hinnant : size(__s) {} 25623e519524SHoward Hinnant 25633e519524SHoward Hinnant template <class _Tp> 25643739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __incr(_Tp*) _NOEXCEPT 2565ca740483SHoward Hinnant {__incr(integral_constant<bool, is_trivially_destructible<_Tp>::value>());} 25663e519524SHoward Hinnant 25673e519524SHoward Hinnant template <class _Tp> 25683739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __set(size_t __s, _Tp*) _NOEXCEPT 2569ca740483SHoward Hinnant {__set(__s, integral_constant<bool, is_trivially_destructible<_Tp>::value>());} 25703e519524SHoward Hinnant 25713e519524SHoward Hinnant template <class _Tp> 25723739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __p) _NOEXCEPT 2573ca740483SHoward Hinnant {__process(__p, integral_constant<bool, is_trivially_destructible<_Tp>::value>());} 25743e519524SHoward Hinnant}; 25753e519524SHoward Hinnant 25763e519524SHoward Hinnanttemplate <class _Alloc> 25773e519524SHoward Hinnantclass __allocator_destructor 25783e519524SHoward Hinnant{ 25793e519524SHoward Hinnant typedef allocator_traits<_Alloc> __alloc_traits; 25803e519524SHoward Hinnantpublic: 25813e519524SHoward Hinnant typedef typename __alloc_traits::pointer pointer; 25823e519524SHoward Hinnant typedef typename __alloc_traits::size_type size_type; 25833e519524SHoward Hinnantprivate: 25843e519524SHoward Hinnant _Alloc& __alloc_; 25853e519524SHoward Hinnant size_type __s_; 25863e519524SHoward Hinnantpublic: 25873e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __allocator_destructor(_Alloc& __a, size_type __s) 25883739fe79SHoward Hinnant _NOEXCEPT 25893e519524SHoward Hinnant : __alloc_(__a), __s_(__s) {} 2590848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 25913739fe79SHoward Hinnant void operator()(pointer __p) _NOEXCEPT 25923739fe79SHoward Hinnant {__alloc_traits::deallocate(__alloc_, __p, __s_);} 25933e519524SHoward Hinnant}; 25943e519524SHoward Hinnant 25953e519524SHoward Hinnanttemplate <class _InputIterator, class _ForwardIterator> 25963e519524SHoward Hinnant_ForwardIterator 25973e519524SHoward Hinnantuninitialized_copy(_InputIterator __f, _InputIterator __l, _ForwardIterator __r) 25983e519524SHoward Hinnant{ 25993e519524SHoward Hinnant __destruct_n __d(0); 26003e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 26013e519524SHoward Hinnant unique_ptr<value_type, __destruct_n&> __h(&*__r, __d); 26023e519524SHoward Hinnant for (; __f != __l; ++__f, ++__r, __d.__incr((value_type*)0)) 26033e519524SHoward Hinnant ::new(&*__r) value_type(*__f); 26043e519524SHoward Hinnant __h.release(); 26053e519524SHoward Hinnant return __r; 26063e519524SHoward Hinnant} 26073e519524SHoward Hinnant 26083e519524SHoward Hinnanttemplate <class _InputIterator, class _Size, class _ForwardIterator> 26093e519524SHoward Hinnant_ForwardIterator 26103e519524SHoward Hinnantuninitialized_copy_n(_InputIterator __f, _Size __n, _ForwardIterator __r) 26113e519524SHoward Hinnant{ 26123e519524SHoward Hinnant __destruct_n __d(0); 26133e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 26143e519524SHoward Hinnant unique_ptr<value_type, __destruct_n&> __h(&*__r, __d); 26153e519524SHoward Hinnant for (; __n > 0; ++__f, ++__r, __d.__incr((value_type*)0), --__n) 26163e519524SHoward Hinnant ::new(&*__r) value_type(*__f); 26173e519524SHoward Hinnant __h.release(); 26183e519524SHoward Hinnant return __r; 26193e519524SHoward Hinnant} 26203e519524SHoward Hinnant 26213e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Tp> 26223e519524SHoward Hinnantvoid 26233e519524SHoward Hinnantuninitialized_fill(_ForwardIterator __f, _ForwardIterator __l, const _Tp& __x) 26243e519524SHoward Hinnant{ 26253e519524SHoward Hinnant __destruct_n __d(0); 26263e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 26273e519524SHoward Hinnant unique_ptr<value_type, __destruct_n&> __h(&*__f, __d); 26283e519524SHoward Hinnant for (; __f != __l; ++__f, __d.__incr((value_type*)0)) 26293e519524SHoward Hinnant ::new(&*__f) value_type(__x); 26303e519524SHoward Hinnant __h.release(); 26313e519524SHoward Hinnant} 26323e519524SHoward Hinnant 26333e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Size, class _Tp> 263448d05bd2SHoward Hinnant_ForwardIterator 26353e519524SHoward Hinnantuninitialized_fill_n(_ForwardIterator __f, _Size __n, const _Tp& __x) 26363e519524SHoward Hinnant{ 26373e519524SHoward Hinnant __destruct_n __d(0); 26383e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 26393e519524SHoward Hinnant unique_ptr<value_type, __destruct_n&> __h(&*__f, __d); 26403e519524SHoward Hinnant for (; __n > 0; ++__f, --__n, __d.__incr((value_type*)0)) 26413e519524SHoward Hinnant ::new(&*__f) value_type(__x); 26423e519524SHoward Hinnant __h.release(); 264348d05bd2SHoward Hinnant return __f; 26443e519524SHoward Hinnant} 26453e519524SHoward Hinnant 2646848a5374SHoward Hinnantclass _LIBCPP_EXCEPTION_ABI bad_weak_ptr 26473e519524SHoward Hinnant : public std::exception 26483e519524SHoward Hinnant{ 26493e519524SHoward Hinnantpublic: 26503739fe79SHoward Hinnant virtual ~bad_weak_ptr() _NOEXCEPT; 26513739fe79SHoward Hinnant virtual const char* what() const _NOEXCEPT; 26523e519524SHoward Hinnant}; 26533e519524SHoward Hinnant 26543e519524SHoward Hinnanttemplate<class _Tp> class weak_ptr; 26553e519524SHoward Hinnant 26563e519524SHoward Hinnantclass __shared_count 26573e519524SHoward Hinnant{ 26583e519524SHoward Hinnant __shared_count(const __shared_count&); 26593e519524SHoward Hinnant __shared_count& operator=(const __shared_count&); 26603e519524SHoward Hinnant 26613e519524SHoward Hinnantprotected: 26623e519524SHoward Hinnant long __shared_owners_; 26633e519524SHoward Hinnant virtual ~__shared_count(); 26643e519524SHoward Hinnantprivate: 26653739fe79SHoward Hinnant virtual void __on_zero_shared() _NOEXCEPT = 0; 26663e519524SHoward Hinnant 26673e519524SHoward Hinnantpublic: 2668848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 26693739fe79SHoward Hinnant explicit __shared_count(long __refs = 0) _NOEXCEPT 26703e519524SHoward Hinnant : __shared_owners_(__refs) {} 26713e519524SHoward Hinnant 26723739fe79SHoward Hinnant void __add_shared() _NOEXCEPT; 26733739fe79SHoward Hinnant bool __release_shared() _NOEXCEPT; 2674848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 26753739fe79SHoward Hinnant long use_count() const _NOEXCEPT {return __shared_owners_ + 1;} 26763e519524SHoward Hinnant}; 26773e519524SHoward Hinnant 26783e519524SHoward Hinnantclass __shared_weak_count 26793e519524SHoward Hinnant : private __shared_count 26803e519524SHoward Hinnant{ 26813e519524SHoward Hinnant long __shared_weak_owners_; 26823e519524SHoward Hinnant 26833e519524SHoward Hinnantpublic: 2684848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 26853739fe79SHoward Hinnant explicit __shared_weak_count(long __refs = 0) _NOEXCEPT 26863e519524SHoward Hinnant : __shared_count(__refs), 26873e519524SHoward Hinnant __shared_weak_owners_(__refs) {} 26883e519524SHoward Hinnantprotected: 26893e519524SHoward Hinnant virtual ~__shared_weak_count(); 26903e519524SHoward Hinnant 26913e519524SHoward Hinnantpublic: 26923739fe79SHoward Hinnant void __add_shared() _NOEXCEPT; 26933739fe79SHoward Hinnant void __add_weak() _NOEXCEPT; 26943739fe79SHoward Hinnant void __release_shared() _NOEXCEPT; 26953739fe79SHoward Hinnant void __release_weak() _NOEXCEPT; 2696848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 26973739fe79SHoward Hinnant long use_count() const _NOEXCEPT {return __shared_count::use_count();} 26983739fe79SHoward Hinnant __shared_weak_count* lock() _NOEXCEPT; 26993e519524SHoward Hinnant 270054b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI 27013739fe79SHoward Hinnant virtual const void* __get_deleter(const type_info&) const _NOEXCEPT; 270254b409fdSHoward Hinnant#endif 27033e519524SHoward Hinnantprivate: 27043739fe79SHoward Hinnant virtual void __on_zero_shared_weak() _NOEXCEPT = 0; 27053e519524SHoward Hinnant}; 27063e519524SHoward Hinnant 27073e519524SHoward Hinnanttemplate <class _Tp, class _Dp, class _Alloc> 27083e519524SHoward Hinnantclass __shared_ptr_pointer 27093e519524SHoward Hinnant : public __shared_weak_count 27103e519524SHoward Hinnant{ 27113e519524SHoward Hinnant __compressed_pair<__compressed_pair<_Tp, _Dp>, _Alloc> __data_; 27123e519524SHoward Hinnantpublic: 2713848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 27143e519524SHoward Hinnant __shared_ptr_pointer(_Tp __p, _Dp __d, _Alloc __a) 27153e519524SHoward Hinnant : __data_(__compressed_pair<_Tp, _Dp>(__p, _STD::move(__d)), _STD::move(__a)) {} 27163e519524SHoward Hinnant 271754b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI 27183739fe79SHoward Hinnant virtual const void* __get_deleter(const type_info&) const _NOEXCEPT; 271954b409fdSHoward Hinnant#endif 27203e519524SHoward Hinnant 27213e519524SHoward Hinnantprivate: 27223739fe79SHoward Hinnant virtual void __on_zero_shared() _NOEXCEPT; 27233739fe79SHoward Hinnant virtual void __on_zero_shared_weak() _NOEXCEPT; 27243e519524SHoward Hinnant}; 27253e519524SHoward Hinnant 272654b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI 272754b409fdSHoward Hinnant 27283e519524SHoward Hinnanttemplate <class _Tp, class _Dp, class _Alloc> 27293e519524SHoward Hinnantconst void* 27303739fe79SHoward Hinnant__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__get_deleter(const type_info& __t) const _NOEXCEPT 27313e519524SHoward Hinnant{ 27323e519524SHoward Hinnant return __t == typeid(_Dp) ? &__data_.first().second() : 0; 27333e519524SHoward Hinnant} 27343e519524SHoward Hinnant 2735b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_RTTI 273654b409fdSHoward Hinnant 27373e519524SHoward Hinnanttemplate <class _Tp, class _Dp, class _Alloc> 27383e519524SHoward Hinnantvoid 27393739fe79SHoward Hinnant__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__on_zero_shared() _NOEXCEPT 27403e519524SHoward Hinnant{ 27413e519524SHoward Hinnant __data_.first().second()(__data_.first().first()); 27423e519524SHoward Hinnant __data_.first().second().~_Dp(); 27433e519524SHoward Hinnant} 27443e519524SHoward Hinnant 27453e519524SHoward Hinnanttemplate <class _Tp, class _Dp, class _Alloc> 27463e519524SHoward Hinnantvoid 27473739fe79SHoward Hinnant__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__on_zero_shared_weak() _NOEXCEPT 27483e519524SHoward Hinnant{ 27493e519524SHoward Hinnant typename _Alloc::template rebind<__shared_ptr_pointer>::other __a(__data_.second()); 27503e519524SHoward Hinnant __data_.second().~_Alloc(); 27513e519524SHoward Hinnant __a.deallocate(this, 1); 27523e519524SHoward Hinnant} 27533e519524SHoward Hinnant 27543e519524SHoward Hinnanttemplate <class _Tp, class _Alloc> 27553e519524SHoward Hinnantclass __shared_ptr_emplace 27563e519524SHoward Hinnant : public __shared_weak_count 27573e519524SHoward Hinnant{ 27583e519524SHoward Hinnant __compressed_pair<_Alloc, _Tp> __data_; 27593e519524SHoward Hinnantpublic: 27603e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 27613e519524SHoward Hinnant 2762848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 27633e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a) 27643e519524SHoward Hinnant : __data_(_STD::move(__a)) {} 27653e519524SHoward Hinnant 27663e519524SHoward Hinnant template <class ..._Args> 2767848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 27683e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a, _Args&& ...__args) 27693e519524SHoward Hinnant : __data_(_STD::move(__a), _Tp(_STD::forward<_Args>(__args)...)) {} 27703e519524SHoward Hinnant 27713e519524SHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 27723e519524SHoward Hinnant 2773848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 27743e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a) 27753e519524SHoward Hinnant : __data_(__a) {} 27763e519524SHoward Hinnant 27773e519524SHoward Hinnant template <class _A0> 2778848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 27793e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a, _A0& __a0) 27803e519524SHoward Hinnant : __data_(__a, _Tp(__a0)) {} 27813e519524SHoward Hinnant 27823e519524SHoward Hinnant template <class _A0, class _A1> 2783848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 27843e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a, _A0& __a0, _A1& __a1) 27853e519524SHoward Hinnant : __data_(__a, _Tp(__a0, __a1)) {} 27863e519524SHoward Hinnant 27873e519524SHoward Hinnant template <class _A0, class _A1, class _A2> 2788848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 27893e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a, _A0& __a0, _A1& __a1, _A2& __a2) 27903e519524SHoward Hinnant : __data_(__a, _Tp(__a0, __a1, __a2)) {} 27913e519524SHoward Hinnant 27923e519524SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 27933e519524SHoward Hinnant 27943e519524SHoward Hinnantprivate: 27953739fe79SHoward Hinnant virtual void __on_zero_shared() _NOEXCEPT; 27963739fe79SHoward Hinnant virtual void __on_zero_shared_weak() _NOEXCEPT; 27973e519524SHoward Hinnantpublic: 2798848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 27993739fe79SHoward Hinnant _Tp* get() _NOEXCEPT {return &__data_.second();} 28003e519524SHoward Hinnant}; 28013e519524SHoward Hinnant 28023e519524SHoward Hinnanttemplate <class _Tp, class _Alloc> 28033e519524SHoward Hinnantvoid 28043739fe79SHoward Hinnant__shared_ptr_emplace<_Tp, _Alloc>::__on_zero_shared() _NOEXCEPT 28053e519524SHoward Hinnant{ 28063e519524SHoward Hinnant __data_.second().~_Tp(); 28073e519524SHoward Hinnant} 28083e519524SHoward Hinnant 28093e519524SHoward Hinnanttemplate <class _Tp, class _Alloc> 28103e519524SHoward Hinnantvoid 28113739fe79SHoward Hinnant__shared_ptr_emplace<_Tp, _Alloc>::__on_zero_shared_weak() _NOEXCEPT 28123e519524SHoward Hinnant{ 28133e519524SHoward Hinnant typename _Alloc::template rebind<__shared_ptr_emplace>::other __a(__data_.first()); 28143e519524SHoward Hinnant __data_.first().~_Alloc(); 28153e519524SHoward Hinnant __a.deallocate(this, 1); 28163e519524SHoward Hinnant} 28173e519524SHoward Hinnant 28183e519524SHoward Hinnanttemplate<class _Tp> class enable_shared_from_this; 28193e519524SHoward Hinnant 28203e519524SHoward Hinnanttemplate<class _Tp> 2821848a5374SHoward Hinnantclass _LIBCPP_VISIBLE shared_ptr 28223e519524SHoward Hinnant{ 28233e519524SHoward Hinnantpublic: 28243e519524SHoward Hinnant typedef _Tp element_type; 28253e519524SHoward Hinnantprivate: 28263e519524SHoward Hinnant element_type* __ptr_; 28273e519524SHoward Hinnant __shared_weak_count* __cntrl_; 28283e519524SHoward Hinnant 28293e519524SHoward Hinnant struct __nat {int __for_bool_;}; 28303e519524SHoward Hinnantpublic: 28313739fe79SHoward Hinnant shared_ptr() _NOEXCEPT; 28323739fe79SHoward Hinnant shared_ptr(nullptr_t) _NOEXCEPT; 28333e519524SHoward Hinnant template<class _Yp> explicit shared_ptr(_Yp* __p); 28343e519524SHoward Hinnant template<class _Yp, class _Dp> shared_ptr(_Yp* __p, _Dp __d); 28353e519524SHoward Hinnant template<class _Yp, class _Dp, class _Alloc> shared_ptr(_Yp* __p, _Dp __d, _Alloc __a); 28363e519524SHoward Hinnant template <class _Dp> shared_ptr(nullptr_t __p, _Dp __d); 28373e519524SHoward Hinnant template <class _Dp, class _Alloc> shared_ptr(nullptr_t __p, _Dp __d, _Alloc __a); 28383739fe79SHoward Hinnant template<class _Yp> shared_ptr(const shared_ptr<_Yp>& __r, element_type* __p) _NOEXCEPT; 28393739fe79SHoward Hinnant shared_ptr(const shared_ptr& __r) _NOEXCEPT; 28403e519524SHoward Hinnant template<class _Yp> 28413e519524SHoward Hinnant shared_ptr(const shared_ptr<_Yp>& __r, 28423739fe79SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type = __nat()) 28433739fe79SHoward Hinnant _NOEXCEPT; 28447609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 28453739fe79SHoward Hinnant shared_ptr(shared_ptr&& __r) _NOEXCEPT; 28463e519524SHoward Hinnant template<class _Yp> shared_ptr(shared_ptr<_Yp>&& __r, 28473739fe79SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type = __nat()) 28483739fe79SHoward Hinnant _NOEXCEPT; 28497609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 28503e519524SHoward Hinnant template<class _Yp> explicit shared_ptr(const weak_ptr<_Yp>& __r, 28513e519524SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type= __nat()); 28527609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 28533e519524SHoward Hinnant template<class _Yp> shared_ptr(auto_ptr<_Yp>&& __r); 2854b3371f6fSHoward Hinnant#else 2855b3371f6fSHoward Hinnant template<class _Yp> shared_ptr(auto_ptr<_Yp> __r); 28563e519524SHoward Hinnant#endif 28577609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 28583e519524SHoward Hinnantprivate: 28593e519524SHoward Hinnant template <class _Yp, class _Dp> shared_ptr(const unique_ptr<_Yp, _Dp>& __r);// = delete; 28603e519524SHoward Hinnantpublic: 28613e519524SHoward Hinnant template <class _Yp, class _Dp> shared_ptr(unique_ptr<_Yp, _Dp>&&, 28623e519524SHoward Hinnant typename enable_if<!is_lvalue_reference<_Dp>::value, __nat>::type = __nat()); 28633e519524SHoward Hinnant template <class _Yp, class _Dp> shared_ptr(unique_ptr<_Yp, _Dp>&&, 28643e519524SHoward Hinnant typename enable_if<is_lvalue_reference<_Dp>::value, __nat>::type = __nat()); 28657609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 28663e519524SHoward Hinnant template <class _Yp, class _Dp> shared_ptr(unique_ptr<_Yp, _Dp>, 28673e519524SHoward Hinnant typename enable_if<!is_lvalue_reference<_Dp>::value, __nat>::type = __nat()); 28683e519524SHoward Hinnant template <class _Yp, class _Dp> shared_ptr(unique_ptr<_Yp, _Dp>, 28693e519524SHoward Hinnant typename enable_if<is_lvalue_reference<_Dp>::value, __nat>::type = __nat()); 28707609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 28713e519524SHoward Hinnant 28723e519524SHoward Hinnant ~shared_ptr(); 28733e519524SHoward Hinnant 28743739fe79SHoward Hinnant shared_ptr& operator=(const shared_ptr& __r) _NOEXCEPT; 28753739fe79SHoward Hinnant template<class _Yp> shared_ptr& operator=(const shared_ptr<_Yp>& __r) _NOEXCEPT; 28767609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 28773739fe79SHoward Hinnant shared_ptr& operator=(shared_ptr&& __r) _NOEXCEPT; 28783e519524SHoward Hinnant template<class _Yp> shared_ptr& operator=(shared_ptr<_Yp>&& __r); 28793e519524SHoward Hinnant template<class _Yp> shared_ptr& operator=(auto_ptr<_Yp>&& __r); 28807609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 28819f1102b7SHoward Hinnant template<class _Yp> shared_ptr& operator=(auto_ptr<_Yp> __r); 28823e519524SHoward Hinnant#endif 28837609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 28843e519524SHoward Hinnantprivate: 28853e519524SHoward Hinnant template <class _Yp, class _Dp> shared_ptr& operator=(const unique_ptr<_Yp, _Dp>& __r);// = delete; 28863e519524SHoward Hinnantpublic: 28873e519524SHoward Hinnant template <class _Yp, class _Dp> shared_ptr& operator=(unique_ptr<_Yp, _Dp>&& __r); 28887609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 28893e519524SHoward Hinnant template <class _Yp, class _Dp> shared_ptr& operator=(unique_ptr<_Yp, _Dp> __r); 28903e519524SHoward Hinnant#endif 28913e519524SHoward Hinnant 28923739fe79SHoward Hinnant void swap(shared_ptr& __r) _NOEXCEPT; 28933739fe79SHoward Hinnant void reset() _NOEXCEPT; 28943739fe79SHoward Hinnant template<class _Yp> void reset(_Yp* __p) _NOEXCEPT; 28953e519524SHoward Hinnant template<class _Yp, class _Dp> void reset(_Yp* __p, _Dp __d); 28963e519524SHoward Hinnant template<class _Yp, class _Dp, class _Alloc> void reset(_Yp* __p, _Dp __d, _Alloc __a); 28973e519524SHoward Hinnant 2898848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 28993739fe79SHoward Hinnant element_type* get() const _NOEXCEPT {return __ptr_;} 2900848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 29013739fe79SHoward Hinnant typename add_lvalue_reference<element_type>::type operator*() const _NOEXCEPT 29023739fe79SHoward Hinnant {return *__ptr_;} 2903848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 29043739fe79SHoward Hinnant element_type* operator->() const _NOEXCEPT {return __ptr_;} 2905848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 29063739fe79SHoward Hinnant long use_count() const _NOEXCEPT {return __cntrl_ ? __cntrl_->use_count() : 0;} 2907848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 29083739fe79SHoward Hinnant bool unique() const _NOEXCEPT {return use_count() == 1;} 2909848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 29103739fe79SHoward Hinnant /*explicit*/ operator bool() const _NOEXCEPT {return get() != 0;} 2911848a5374SHoward Hinnant template <class _U> 2912848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2913848a5374SHoward Hinnant bool owner_before(shared_ptr<_U> const& __p) const 29143e519524SHoward Hinnant {return __cntrl_ < __p.__cntrl_;} 2915848a5374SHoward Hinnant template <class _U> 2916848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2917848a5374SHoward Hinnant bool owner_before(weak_ptr<_U> const& __p) const 29183e519524SHoward Hinnant {return __cntrl_ < __p.__cntrl_;} 29193e519524SHoward Hinnant 292054b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI 29213e519524SHoward Hinnant template <class _Dp> 2922848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 29233739fe79SHoward Hinnant _Dp* __get_deleter() const _NOEXCEPT 29243e519524SHoward Hinnant {return (_Dp*)(__cntrl_ ? __cntrl_->__get_deleter(typeid(_Dp)) : 0);} 2925b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_RTTI 29263e519524SHoward Hinnant 29273e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 29283e519524SHoward Hinnant 29293e519524SHoward Hinnant template<class ..._Args> 29303e519524SHoward Hinnant static 29313e519524SHoward Hinnant shared_ptr<_Tp> 29323e519524SHoward Hinnant make_shared(_Args&& ...__args); 29333e519524SHoward Hinnant 29343e519524SHoward Hinnant template<class _Alloc, class ..._Args> 29353e519524SHoward Hinnant static 29363e519524SHoward Hinnant shared_ptr<_Tp> 29373e519524SHoward Hinnant allocate_shared(const _Alloc& __a, _Args&& ...__args); 29383e519524SHoward Hinnant 29393e519524SHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 29403e519524SHoward Hinnant 29413e519524SHoward Hinnant static shared_ptr<_Tp> make_shared(); 29423e519524SHoward Hinnant 29433e519524SHoward Hinnant template<class _A0> 29443e519524SHoward Hinnant static shared_ptr<_Tp> make_shared(_A0&); 29453e519524SHoward Hinnant 29463e519524SHoward Hinnant template<class _A0, class _A1> 29473e519524SHoward Hinnant static shared_ptr<_Tp> make_shared(_A0&, _A1&); 29483e519524SHoward Hinnant 29493e519524SHoward Hinnant template<class _A0, class _A1, class _A2> 29503e519524SHoward Hinnant static shared_ptr<_Tp> make_shared(_A0&, _A1&, _A2&); 29513e519524SHoward Hinnant 29523e519524SHoward Hinnant template<class _Alloc> 29533e519524SHoward Hinnant static shared_ptr<_Tp> 29543e519524SHoward Hinnant allocate_shared(const _Alloc& __a); 29553e519524SHoward Hinnant 29563e519524SHoward Hinnant template<class _Alloc, class _A0> 29573e519524SHoward Hinnant static shared_ptr<_Tp> 29583e519524SHoward Hinnant allocate_shared(const _Alloc& __a, _A0& __a0); 29593e519524SHoward Hinnant 29603e519524SHoward Hinnant template<class _Alloc, class _A0, class _A1> 29613e519524SHoward Hinnant static shared_ptr<_Tp> 29623e519524SHoward Hinnant allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1); 29633e519524SHoward Hinnant 29643e519524SHoward Hinnant template<class _Alloc, class _A0, class _A1, class _A2> 29653e519524SHoward Hinnant static shared_ptr<_Tp> 29663e519524SHoward Hinnant allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1, _A2& __a2); 29673e519524SHoward Hinnant 29683e519524SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 29693e519524SHoward Hinnant 29703e519524SHoward Hinnantprivate: 29713e519524SHoward Hinnant 29723e519524SHoward Hinnant template <class _Yp> 2973848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 29743e519524SHoward Hinnant void 29753739fe79SHoward Hinnant __enable_weak_this(const enable_shared_from_this<_Yp>* __e) _NOEXCEPT 29763e519524SHoward Hinnant { 29773e519524SHoward Hinnant if (__e) 29783e519524SHoward Hinnant __e->__weak_this_ = *this; 29793e519524SHoward Hinnant } 29803e519524SHoward Hinnant 2981848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 29823739fe79SHoward Hinnant void __enable_weak_this(const void*) _NOEXCEPT {} 29833e519524SHoward Hinnant 2984848a5374SHoward Hinnant template <class _Up> friend class _LIBCPP_VISIBLE shared_ptr; 2985848a5374SHoward Hinnant template <class _Up> friend class _LIBCPP_VISIBLE weak_ptr; 29863e519524SHoward Hinnant}; 29873e519524SHoward Hinnant 29883e519524SHoward Hinnanttemplate<class _Tp> 29893e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 29903739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr() _NOEXCEPT 29913e519524SHoward Hinnant : __ptr_(0), 29923e519524SHoward Hinnant __cntrl_(0) 29933e519524SHoward Hinnant{ 29943e519524SHoward Hinnant} 29953e519524SHoward Hinnant 29963e519524SHoward Hinnanttemplate<class _Tp> 29973e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 29983739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr(nullptr_t) _NOEXCEPT 29993e519524SHoward Hinnant : __ptr_(0), 30003e519524SHoward Hinnant __cntrl_(0) 30013e519524SHoward Hinnant{ 30023e519524SHoward Hinnant} 30033e519524SHoward Hinnant 30043e519524SHoward Hinnanttemplate<class _Tp> 30053e519524SHoward Hinnanttemplate<class _Yp> 30063e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(_Yp* __p) 30073e519524SHoward Hinnant : __ptr_(__p) 30083e519524SHoward Hinnant{ 30093e519524SHoward Hinnant unique_ptr<_Yp> __hold(__p); 30103e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, default_delete<_Yp>, allocator<_Yp> > _CntrlBlk; 30113e519524SHoward Hinnant __cntrl_ = new _CntrlBlk(__p, default_delete<_Yp>(), allocator<_Yp>()); 30123e519524SHoward Hinnant __hold.release(); 30133e519524SHoward Hinnant __enable_weak_this(__p); 30143e519524SHoward Hinnant} 30153e519524SHoward Hinnant 30163e519524SHoward Hinnanttemplate<class _Tp> 30173e519524SHoward Hinnanttemplate<class _Yp, class _Dp> 30183e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(_Yp* __p, _Dp __d) 30193e519524SHoward Hinnant : __ptr_(__p) 30203e519524SHoward Hinnant{ 30213e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 30223e519524SHoward Hinnant try 30233e519524SHoward Hinnant { 3024b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 30253e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, _Dp, allocator<_Yp> > _CntrlBlk; 30263e519524SHoward Hinnant __cntrl_ = new _CntrlBlk(__p, __d, allocator<_Yp>()); 30273e519524SHoward Hinnant __enable_weak_this(__p); 30283e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 30293e519524SHoward Hinnant } 30303e519524SHoward Hinnant catch (...) 30313e519524SHoward Hinnant { 30323e519524SHoward Hinnant __d(__p); 30333e519524SHoward Hinnant throw; 30343e519524SHoward Hinnant } 3035b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 30363e519524SHoward Hinnant} 30373e519524SHoward Hinnant 30383e519524SHoward Hinnanttemplate<class _Tp> 30393e519524SHoward Hinnanttemplate<class _Dp> 30403e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(nullptr_t __p, _Dp __d) 30413e519524SHoward Hinnant : __ptr_(0) 30423e519524SHoward Hinnant{ 30433e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 30443e519524SHoward Hinnant try 30453e519524SHoward Hinnant { 3046b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 30473e519524SHoward Hinnant typedef __shared_ptr_pointer<nullptr_t, _Dp, allocator<_Tp> > _CntrlBlk; 30483e519524SHoward Hinnant __cntrl_ = new _CntrlBlk(__p, __d, allocator<_Tp>()); 30493e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 30503e519524SHoward Hinnant } 30513e519524SHoward Hinnant catch (...) 30523e519524SHoward Hinnant { 30533e519524SHoward Hinnant __d(__p); 30543e519524SHoward Hinnant throw; 30553e519524SHoward Hinnant } 3056b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 30573e519524SHoward Hinnant} 30583e519524SHoward Hinnant 30593e519524SHoward Hinnanttemplate<class _Tp> 30603e519524SHoward Hinnanttemplate<class _Yp, class _Dp, class _Alloc> 30613e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(_Yp* __p, _Dp __d, _Alloc __a) 30623e519524SHoward Hinnant : __ptr_(__p) 30633e519524SHoward Hinnant{ 30643e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 30653e519524SHoward Hinnant try 30663e519524SHoward Hinnant { 3067b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 30683e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, _Dp, _Alloc> _CntrlBlk; 30693e519524SHoward Hinnant typedef typename _Alloc::template rebind<_CntrlBlk>::other _A2; 30703e519524SHoward Hinnant typedef __allocator_destructor<_A2> _D2; 30713e519524SHoward Hinnant _A2 __a2(__a); 30723e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); 30733e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__p, __d, __a); 30743e519524SHoward Hinnant __cntrl_ = __hold2.release(); 30753e519524SHoward Hinnant __enable_weak_this(__p); 30763e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 30773e519524SHoward Hinnant } 30783e519524SHoward Hinnant catch (...) 30793e519524SHoward Hinnant { 30803e519524SHoward Hinnant __d(__p); 30813e519524SHoward Hinnant throw; 30823e519524SHoward Hinnant } 3083b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 30843e519524SHoward Hinnant} 30853e519524SHoward Hinnant 30863e519524SHoward Hinnanttemplate<class _Tp> 30873e519524SHoward Hinnanttemplate<class _Dp, class _Alloc> 30883e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(nullptr_t __p, _Dp __d, _Alloc __a) 30893e519524SHoward Hinnant : __ptr_(0) 30903e519524SHoward Hinnant{ 30913e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 30923e519524SHoward Hinnant try 30933e519524SHoward Hinnant { 3094b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 30953e519524SHoward Hinnant typedef __shared_ptr_pointer<nullptr_t, _Dp, _Alloc> _CntrlBlk; 30963e519524SHoward Hinnant typedef typename _Alloc::template rebind<_CntrlBlk>::other _A2; 30973e519524SHoward Hinnant typedef __allocator_destructor<_A2> _D2; 30983e519524SHoward Hinnant _A2 __a2(__a); 30993e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); 31003e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__p, __d, __a); 31013e519524SHoward Hinnant __cntrl_ = __hold2.release(); 31023e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 31033e519524SHoward Hinnant } 31043e519524SHoward Hinnant catch (...) 31053e519524SHoward Hinnant { 31063e519524SHoward Hinnant __d(__p); 31073e519524SHoward Hinnant throw; 31083e519524SHoward Hinnant } 3109b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 31103e519524SHoward Hinnant} 31113e519524SHoward Hinnant 31123e519524SHoward Hinnanttemplate<class _Tp> 31133e519524SHoward Hinnanttemplate<class _Yp> 31143e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 31153739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr(const shared_ptr<_Yp>& __r, element_type *__p) _NOEXCEPT 31163e519524SHoward Hinnant : __ptr_(__p), 31173e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 31183e519524SHoward Hinnant{ 31193e519524SHoward Hinnant if (__cntrl_) 31203e519524SHoward Hinnant __cntrl_->__add_shared(); 31213e519524SHoward Hinnant} 31223e519524SHoward Hinnant 31233e519524SHoward Hinnanttemplate<class _Tp> 31243e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 31253739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr(const shared_ptr& __r) _NOEXCEPT 31263e519524SHoward Hinnant : __ptr_(__r.__ptr_), 31273e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 31283e519524SHoward Hinnant{ 31293e519524SHoward Hinnant if (__cntrl_) 31303e519524SHoward Hinnant __cntrl_->__add_shared(); 31313e519524SHoward Hinnant} 31323e519524SHoward Hinnant 31333e519524SHoward Hinnanttemplate<class _Tp> 31343e519524SHoward Hinnanttemplate<class _Yp> 31353e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 31363e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(const shared_ptr<_Yp>& __r, 31373e519524SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type) 31383739fe79SHoward Hinnant _NOEXCEPT 31393e519524SHoward Hinnant : __ptr_(__r.__ptr_), 31403e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 31413e519524SHoward Hinnant{ 31423e519524SHoward Hinnant if (__cntrl_) 31433e519524SHoward Hinnant __cntrl_->__add_shared(); 31443e519524SHoward Hinnant} 31453e519524SHoward Hinnant 31467609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 31473e519524SHoward Hinnant 31483e519524SHoward Hinnanttemplate<class _Tp> 31493e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 31503739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr(shared_ptr&& __r) _NOEXCEPT 31513e519524SHoward Hinnant : __ptr_(__r.__ptr_), 31523e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 31533e519524SHoward Hinnant{ 31543e519524SHoward Hinnant __r.__ptr_ = 0; 31553e519524SHoward Hinnant __r.__cntrl_ = 0; 31563e519524SHoward Hinnant} 31573e519524SHoward Hinnant 31583e519524SHoward Hinnanttemplate<class _Tp> 31593e519524SHoward Hinnanttemplate<class _Yp> 31603e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 31613e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(shared_ptr<_Yp>&& __r, 31623e519524SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type) 31633739fe79SHoward Hinnant _NOEXCEPT 31643e519524SHoward Hinnant : __ptr_(__r.__ptr_), 31653e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 31663e519524SHoward Hinnant{ 31673e519524SHoward Hinnant __r.__ptr_ = 0; 31683e519524SHoward Hinnant __r.__cntrl_ = 0; 31693e519524SHoward Hinnant} 31703e519524SHoward Hinnant 31717609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 31723e519524SHoward Hinnant 31733e519524SHoward Hinnanttemplate<class _Tp> 31743e519524SHoward Hinnanttemplate<class _Yp> 31757609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 31763e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(auto_ptr<_Yp>&& __r) 31773e519524SHoward Hinnant#else 31789f1102b7SHoward Hinnantshared_ptr<_Tp>::shared_ptr(auto_ptr<_Yp> __r) 31793e519524SHoward Hinnant#endif 31803e519524SHoward Hinnant : __ptr_(__r.get()) 31813e519524SHoward Hinnant{ 31823e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, default_delete<_Yp>, allocator<_Yp> > _CntrlBlk; 31833e519524SHoward Hinnant __cntrl_ = new _CntrlBlk(__r.get(), default_delete<_Yp>(), allocator<_Yp>()); 31843e519524SHoward Hinnant __enable_weak_this(__r.get()); 31853e519524SHoward Hinnant __r.release(); 31863e519524SHoward Hinnant} 31873e519524SHoward Hinnant 31883e519524SHoward Hinnanttemplate<class _Tp> 31893e519524SHoward Hinnanttemplate <class _Yp, class _Dp> 31907609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 31913e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp>&& __r, 31923e519524SHoward Hinnant#else 31933e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp> __r, 31943e519524SHoward Hinnant#endif 31953e519524SHoward Hinnant typename enable_if<!is_lvalue_reference<_Dp>::value, __nat>::type) 31963e519524SHoward Hinnant : __ptr_(__r.get()) 31973e519524SHoward Hinnant{ 31983e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, _Dp, allocator<_Yp> > _CntrlBlk; 31993e519524SHoward Hinnant __cntrl_ = new _CntrlBlk(__r.get(), __r.get_deleter(), allocator<_Yp>()); 32003e519524SHoward Hinnant __enable_weak_this(__r.get()); 32013e519524SHoward Hinnant __r.release(); 32023e519524SHoward Hinnant} 32033e519524SHoward Hinnant 32043e519524SHoward Hinnanttemplate<class _Tp> 32053e519524SHoward Hinnanttemplate <class _Yp, class _Dp> 32067609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 32073e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp>&& __r, 32083e519524SHoward Hinnant#else 32093e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp> __r, 32103e519524SHoward Hinnant#endif 32113e519524SHoward Hinnant typename enable_if<is_lvalue_reference<_Dp>::value, __nat>::type) 32123e519524SHoward Hinnant : __ptr_(__r.get()) 32133e519524SHoward Hinnant{ 32143e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, 32153e519524SHoward Hinnant reference_wrapper<typename remove_reference<_Dp>::type>, 32163e519524SHoward Hinnant allocator<_Yp> > _CntrlBlk; 32173e519524SHoward Hinnant __cntrl_ = new _CntrlBlk(__r.get(), ref(__r.get_deleter()), allocator<_Yp>()); 32183e519524SHoward Hinnant __enable_weak_this(__r.get()); 32193e519524SHoward Hinnant __r.release(); 32203e519524SHoward Hinnant} 32213e519524SHoward Hinnant 32223e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 32233e519524SHoward Hinnant 32243e519524SHoward Hinnanttemplate<class _Tp> 32253e519524SHoward Hinnanttemplate<class ..._Args> 32263e519524SHoward Hinnantshared_ptr<_Tp> 32273e519524SHoward Hinnantshared_ptr<_Tp>::make_shared(_Args&& ...__args) 32283e519524SHoward Hinnant{ 32293e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 32303e519524SHoward Hinnant typedef allocator<_CntrlBlk> _A2; 32313e519524SHoward Hinnant typedef __allocator_destructor<_A2> _D2; 32323e519524SHoward Hinnant _A2 __a2; 32333e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); 32343e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__a2, _STD::forward<_Args>(__args)...); 32353e519524SHoward Hinnant shared_ptr<_Tp> __r; 32363e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 32373e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 32383e519524SHoward Hinnant __r.__enable_weak_this(__r.__ptr_); 32393e519524SHoward Hinnant return __r; 32403e519524SHoward Hinnant} 32413e519524SHoward Hinnant 32423e519524SHoward Hinnanttemplate<class _Tp> 32433e519524SHoward Hinnanttemplate<class _Alloc, class ..._Args> 32443e519524SHoward Hinnantshared_ptr<_Tp> 32453e519524SHoward Hinnantshared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _Args&& ...__args) 32463e519524SHoward Hinnant{ 32473e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 32483e519524SHoward Hinnant typedef typename _Alloc::template rebind<_CntrlBlk>::other _A2; 32493e519524SHoward Hinnant typedef __allocator_destructor<_A2> _D2; 32503e519524SHoward Hinnant _A2 __a2(__a); 32513e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); 32523e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__a, _STD::forward<_Args>(__args)...); 32533e519524SHoward Hinnant shared_ptr<_Tp> __r; 32543e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 32553e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 32563e519524SHoward Hinnant __r.__enable_weak_this(__r.__ptr_); 32573e519524SHoward Hinnant return __r; 32583e519524SHoward Hinnant} 32593e519524SHoward Hinnant 32603e519524SHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 32613e519524SHoward Hinnant 32623e519524SHoward Hinnanttemplate<class _Tp> 32633e519524SHoward Hinnantshared_ptr<_Tp> 32643e519524SHoward Hinnantshared_ptr<_Tp>::make_shared() 32653e519524SHoward Hinnant{ 32663e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 32673e519524SHoward Hinnant typedef allocator<_CntrlBlk> _Alloc2; 32683e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 32693e519524SHoward Hinnant _Alloc2 __alloc2; 32703e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 32713e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__alloc2); 32723e519524SHoward Hinnant shared_ptr<_Tp> __r; 32733e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 32743e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 32753e519524SHoward Hinnant __r.__enable_weak_this(__r.__ptr_); 32763e519524SHoward Hinnant return __r; 32773e519524SHoward Hinnant} 32783e519524SHoward Hinnant 32793e519524SHoward Hinnanttemplate<class _Tp> 32803e519524SHoward Hinnanttemplate<class _A0> 32813e519524SHoward Hinnantshared_ptr<_Tp> 32823e519524SHoward Hinnantshared_ptr<_Tp>::make_shared(_A0& __a0) 32833e519524SHoward Hinnant{ 32843e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 32853e519524SHoward Hinnant typedef allocator<_CntrlBlk> _Alloc2; 32863e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 32873e519524SHoward Hinnant _Alloc2 __alloc2; 32883e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 32893e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__alloc2, __a0); 32903e519524SHoward Hinnant shared_ptr<_Tp> __r; 32913e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 32923e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 32933e519524SHoward Hinnant __r.__enable_weak_this(__r.__ptr_); 32943e519524SHoward Hinnant return __r; 32953e519524SHoward Hinnant} 32963e519524SHoward Hinnant 32973e519524SHoward Hinnanttemplate<class _Tp> 32983e519524SHoward Hinnanttemplate<class _A0, class _A1> 32993e519524SHoward Hinnantshared_ptr<_Tp> 33003e519524SHoward Hinnantshared_ptr<_Tp>::make_shared(_A0& __a0, _A1& __a1) 33013e519524SHoward Hinnant{ 33023e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 33033e519524SHoward Hinnant typedef allocator<_CntrlBlk> _Alloc2; 33043e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 33053e519524SHoward Hinnant _Alloc2 __alloc2; 33063e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 33073e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__alloc2, __a0, __a1); 33083e519524SHoward Hinnant shared_ptr<_Tp> __r; 33093e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 33103e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 33113e519524SHoward Hinnant __r.__enable_weak_this(__r.__ptr_); 33123e519524SHoward Hinnant return __r; 33133e519524SHoward Hinnant} 33143e519524SHoward Hinnant 33153e519524SHoward Hinnanttemplate<class _Tp> 33163e519524SHoward Hinnanttemplate<class _A0, class _A1, class _A2> 33173e519524SHoward Hinnantshared_ptr<_Tp> 33183e519524SHoward Hinnantshared_ptr<_Tp>::make_shared(_A0& __a0, _A1& __a1, _A2& __a2) 33193e519524SHoward Hinnant{ 33203e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 33213e519524SHoward Hinnant typedef allocator<_CntrlBlk> _Alloc2; 33223e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 33233e519524SHoward Hinnant _Alloc2 __alloc2; 33243e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 33253e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__alloc2, __a0, __a1, __a2); 33263e519524SHoward Hinnant shared_ptr<_Tp> __r; 33273e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 33283e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 33293e519524SHoward Hinnant __r.__enable_weak_this(__r.__ptr_); 33303e519524SHoward Hinnant return __r; 33313e519524SHoward Hinnant} 33323e519524SHoward Hinnant 33333e519524SHoward Hinnanttemplate<class _Tp> 33343e519524SHoward Hinnanttemplate<class _Alloc> 33353e519524SHoward Hinnantshared_ptr<_Tp> 33363e519524SHoward Hinnantshared_ptr<_Tp>::allocate_shared(const _Alloc& __a) 33373e519524SHoward Hinnant{ 33383e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 33393e519524SHoward Hinnant typedef typename _Alloc::template rebind<_CntrlBlk>::other _Alloc2; 33403e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 33413e519524SHoward Hinnant _Alloc2 __alloc2(__a); 33423e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 33433e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__a); 33443e519524SHoward Hinnant shared_ptr<_Tp> __r; 33453e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 33463e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 33473e519524SHoward Hinnant __r.__enable_weak_this(__r.__ptr_); 33483e519524SHoward Hinnant return __r; 33493e519524SHoward Hinnant} 33503e519524SHoward Hinnant 33513e519524SHoward Hinnanttemplate<class _Tp> 33523e519524SHoward Hinnanttemplate<class _Alloc, class _A0> 33533e519524SHoward Hinnantshared_ptr<_Tp> 33543e519524SHoward Hinnantshared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _A0& __a0) 33553e519524SHoward Hinnant{ 33563e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 33573e519524SHoward Hinnant typedef typename _Alloc::template rebind<_CntrlBlk>::other _Alloc2; 33583e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 33593e519524SHoward Hinnant _Alloc2 __alloc2(__a); 33603e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 33613e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__a, __a0); 33623e519524SHoward Hinnant shared_ptr<_Tp> __r; 33633e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 33643e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 33653e519524SHoward Hinnant __r.__enable_weak_this(__r.__ptr_); 33663e519524SHoward Hinnant return __r; 33673e519524SHoward Hinnant} 33683e519524SHoward Hinnant 33693e519524SHoward Hinnanttemplate<class _Tp> 33703e519524SHoward Hinnanttemplate<class _Alloc, class _A0, class _A1> 33713e519524SHoward Hinnantshared_ptr<_Tp> 33723e519524SHoward Hinnantshared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1) 33733e519524SHoward Hinnant{ 33743e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 33753e519524SHoward Hinnant typedef typename _Alloc::template rebind<_CntrlBlk>::other _Alloc2; 33763e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 33773e519524SHoward Hinnant _Alloc2 __alloc2(__a); 33783e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 33793e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__a, __a0, __a1); 33803e519524SHoward Hinnant shared_ptr<_Tp> __r; 33813e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 33823e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 33833e519524SHoward Hinnant __r.__enable_weak_this(__r.__ptr_); 33843e519524SHoward Hinnant return __r; 33853e519524SHoward Hinnant} 33863e519524SHoward Hinnant 33873e519524SHoward Hinnanttemplate<class _Tp> 33883e519524SHoward Hinnanttemplate<class _Alloc, class _A0, class _A1, class _A2> 33893e519524SHoward Hinnantshared_ptr<_Tp> 33903e519524SHoward Hinnantshared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1, _A2& __a2) 33913e519524SHoward Hinnant{ 33923e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 33933e519524SHoward Hinnant typedef typename _Alloc::template rebind<_CntrlBlk>::other _Alloc2; 33943e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 33953e519524SHoward Hinnant _Alloc2 __alloc2(__a); 33963e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 33973e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__a, __a0, __a1, __a2); 33983e519524SHoward Hinnant shared_ptr<_Tp> __r; 33993e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 34003e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 34013e519524SHoward Hinnant __r.__enable_weak_this(__r.__ptr_); 34023e519524SHoward Hinnant return __r; 34033e519524SHoward Hinnant} 34043e519524SHoward Hinnant 34053e519524SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 34063e519524SHoward Hinnant 34073e519524SHoward Hinnanttemplate<class _Tp> 34083e519524SHoward Hinnantshared_ptr<_Tp>::~shared_ptr() 34093e519524SHoward Hinnant{ 34103e519524SHoward Hinnant if (__cntrl_) 34113e519524SHoward Hinnant __cntrl_->__release_shared(); 34123e519524SHoward Hinnant} 34133e519524SHoward Hinnant 34143e519524SHoward Hinnanttemplate<class _Tp> 34153e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 34163e519524SHoward Hinnantshared_ptr<_Tp>& 34173739fe79SHoward Hinnantshared_ptr<_Tp>::operator=(const shared_ptr& __r) _NOEXCEPT 34183e519524SHoward Hinnant{ 34193e519524SHoward Hinnant shared_ptr(__r).swap(*this); 34203e519524SHoward Hinnant return *this; 34213e519524SHoward Hinnant} 34223e519524SHoward Hinnant 34233e519524SHoward Hinnanttemplate<class _Tp> 34243e519524SHoward Hinnanttemplate<class _Yp> 34253e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 34263e519524SHoward Hinnantshared_ptr<_Tp>& 34273739fe79SHoward Hinnantshared_ptr<_Tp>::operator=(const shared_ptr<_Yp>& __r) _NOEXCEPT 34283e519524SHoward Hinnant{ 34293e519524SHoward Hinnant shared_ptr(__r).swap(*this); 34303e519524SHoward Hinnant return *this; 34313e519524SHoward Hinnant} 34323e519524SHoward Hinnant 34337609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 34343e519524SHoward Hinnant 34353e519524SHoward Hinnanttemplate<class _Tp> 34363e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 34373e519524SHoward Hinnantshared_ptr<_Tp>& 34383739fe79SHoward Hinnantshared_ptr<_Tp>::operator=(shared_ptr&& __r) _NOEXCEPT 34393e519524SHoward Hinnant{ 34403e519524SHoward Hinnant shared_ptr(_STD::move(__r)).swap(*this); 34413e519524SHoward Hinnant return *this; 34423e519524SHoward Hinnant} 34433e519524SHoward Hinnant 34443e519524SHoward Hinnanttemplate<class _Tp> 34453e519524SHoward Hinnanttemplate<class _Yp> 34463e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 34473e519524SHoward Hinnantshared_ptr<_Tp>& 34483e519524SHoward Hinnantshared_ptr<_Tp>::operator=(shared_ptr<_Yp>&& __r) 34493e519524SHoward Hinnant{ 34503e519524SHoward Hinnant shared_ptr(_STD::move(__r)).swap(*this); 34513e519524SHoward Hinnant return *this; 34523e519524SHoward Hinnant} 34533e519524SHoward Hinnant 34543e519524SHoward Hinnanttemplate<class _Tp> 34553e519524SHoward Hinnanttemplate<class _Yp> 34563e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 34573e519524SHoward Hinnantshared_ptr<_Tp>& 34583e519524SHoward Hinnantshared_ptr<_Tp>::operator=(auto_ptr<_Yp>&& __r) 34593e519524SHoward Hinnant{ 3460f7384975SHoward Hinnant shared_ptr(_STD::move(__r)).swap(*this); 34613e519524SHoward Hinnant return *this; 34623e519524SHoward Hinnant} 34633e519524SHoward Hinnant 34643e519524SHoward Hinnanttemplate<class _Tp> 34653e519524SHoward Hinnanttemplate <class _Yp, class _Dp> 34663e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 34673e519524SHoward Hinnantshared_ptr<_Tp>& 34683e519524SHoward Hinnantshared_ptr<_Tp>::operator=(unique_ptr<_Yp, _Dp>&& __r) 34693e519524SHoward Hinnant{ 34703e519524SHoward Hinnant shared_ptr(_STD::move(__r)).swap(*this); 34713e519524SHoward Hinnant return *this; 34723e519524SHoward Hinnant} 34733e519524SHoward Hinnant 34747609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 34753e519524SHoward Hinnant 34763e519524SHoward Hinnanttemplate<class _Tp> 34773e519524SHoward Hinnanttemplate<class _Yp> 34783e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 34793e519524SHoward Hinnantshared_ptr<_Tp>& 3480b3371f6fSHoward Hinnantshared_ptr<_Tp>::operator=(auto_ptr<_Yp> __r) 34813e519524SHoward Hinnant{ 34823e519524SHoward Hinnant shared_ptr(__r).swap(*this); 34833e519524SHoward Hinnant return *this; 34843e519524SHoward Hinnant} 34853e519524SHoward Hinnant 34863e519524SHoward Hinnanttemplate<class _Tp> 34873e519524SHoward Hinnanttemplate <class _Yp, class _Dp> 34883e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 34893e519524SHoward Hinnantshared_ptr<_Tp>& 34903e519524SHoward Hinnantshared_ptr<_Tp>::operator=(unique_ptr<_Yp, _Dp> __r) 34913e519524SHoward Hinnant{ 34923e519524SHoward Hinnant shared_ptr(_STD::move(__r)).swap(*this); 34933e519524SHoward Hinnant return *this; 34943e519524SHoward Hinnant} 34953e519524SHoward Hinnant 34967609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 34973e519524SHoward Hinnant 34983e519524SHoward Hinnanttemplate<class _Tp> 34993e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 35003e519524SHoward Hinnantvoid 35013739fe79SHoward Hinnantshared_ptr<_Tp>::swap(shared_ptr& __r) _NOEXCEPT 35023e519524SHoward Hinnant{ 35033e519524SHoward Hinnant _STD::swap(__ptr_, __r.__ptr_); 35043e519524SHoward Hinnant _STD::swap(__cntrl_, __r.__cntrl_); 35053e519524SHoward Hinnant} 35063e519524SHoward Hinnant 35073e519524SHoward Hinnanttemplate<class _Tp> 35083e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 35093e519524SHoward Hinnantvoid 35103739fe79SHoward Hinnantshared_ptr<_Tp>::reset() _NOEXCEPT 35113e519524SHoward Hinnant{ 35123e519524SHoward Hinnant shared_ptr().swap(*this); 35133e519524SHoward Hinnant} 35143e519524SHoward Hinnant 35153e519524SHoward Hinnanttemplate<class _Tp> 35163e519524SHoward Hinnanttemplate<class _Yp> 35173e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 35183e519524SHoward Hinnantvoid 35193e519524SHoward Hinnantshared_ptr<_Tp>::reset(_Yp* __p) 35203e519524SHoward Hinnant{ 35213e519524SHoward Hinnant shared_ptr(__p).swap(*this); 35223e519524SHoward Hinnant} 35233e519524SHoward Hinnant 35243e519524SHoward Hinnanttemplate<class _Tp> 35253e519524SHoward Hinnanttemplate<class _Yp, class _Dp> 35263e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 35273e519524SHoward Hinnantvoid 35283e519524SHoward Hinnantshared_ptr<_Tp>::reset(_Yp* __p, _Dp __d) 35293e519524SHoward Hinnant{ 35303e519524SHoward Hinnant shared_ptr(__p, __d).swap(*this); 35313e519524SHoward Hinnant} 35323e519524SHoward Hinnant 35333e519524SHoward Hinnanttemplate<class _Tp> 35343e519524SHoward Hinnanttemplate<class _Yp, class _Dp, class _Alloc> 35353e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 35363e519524SHoward Hinnantvoid 35373e519524SHoward Hinnantshared_ptr<_Tp>::reset(_Yp* __p, _Dp __d, _Alloc __a) 35383e519524SHoward Hinnant{ 35393e519524SHoward Hinnant shared_ptr(__p, __d, __a).swap(*this); 35403e519524SHoward Hinnant} 35413e519524SHoward Hinnant 35423e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 35433e519524SHoward Hinnant 35443e519524SHoward Hinnanttemplate<class _Tp, class ..._Args> 35453e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 35463e519524SHoward Hinnantshared_ptr<_Tp> 35473e519524SHoward Hinnantmake_shared(_Args&& ...__args) 35483e519524SHoward Hinnant{ 35493e519524SHoward Hinnant return shared_ptr<_Tp>::make_shared(_STD::forward<_Args>(__args)...); 35503e519524SHoward Hinnant} 35513e519524SHoward Hinnant 35523e519524SHoward Hinnanttemplate<class _Tp, class _Alloc, class ..._Args> 35533e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 35543e519524SHoward Hinnantshared_ptr<_Tp> 35553e519524SHoward Hinnantallocate_shared(const _Alloc& __a, _Args&& ...__args) 35563e519524SHoward Hinnant{ 35573e519524SHoward Hinnant return shared_ptr<_Tp>::allocate_shared(__a, _STD::forward<_Args>(__args)...); 35583e519524SHoward Hinnant} 35593e519524SHoward Hinnant 35603e519524SHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 35613e519524SHoward Hinnant 35623e519524SHoward Hinnanttemplate<class _Tp> 35633e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 35643e519524SHoward Hinnantshared_ptr<_Tp> 35653e519524SHoward Hinnantmake_shared() 35663e519524SHoward Hinnant{ 35673e519524SHoward Hinnant return shared_ptr<_Tp>::make_shared(); 35683e519524SHoward Hinnant} 35693e519524SHoward Hinnant 35703e519524SHoward Hinnanttemplate<class _Tp, class _A0> 35713e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 35723e519524SHoward Hinnantshared_ptr<_Tp> 35733e519524SHoward Hinnantmake_shared(_A0& __a0) 35743e519524SHoward Hinnant{ 35753e519524SHoward Hinnant return shared_ptr<_Tp>::make_shared(__a0); 35763e519524SHoward Hinnant} 35773e519524SHoward Hinnant 35783e519524SHoward Hinnanttemplate<class _Tp, class _A0, class _A1> 35793e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 35803e519524SHoward Hinnantshared_ptr<_Tp> 35813e519524SHoward Hinnantmake_shared(_A0& __a0, _A1& __a1) 35823e519524SHoward Hinnant{ 35833e519524SHoward Hinnant return shared_ptr<_Tp>::make_shared(__a0, __a1); 35843e519524SHoward Hinnant} 35853e519524SHoward Hinnant 35863e519524SHoward Hinnanttemplate<class _Tp, class _A0, class _A1, class _A2> 35873e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 35883e519524SHoward Hinnantshared_ptr<_Tp> 35893e519524SHoward Hinnantmake_shared(_A0& __a0, _A1& __a1, _A2& __a2) 35903e519524SHoward Hinnant{ 35913e519524SHoward Hinnant return shared_ptr<_Tp>::make_shared(__a0, __a1, __a2); 35923e519524SHoward Hinnant} 35933e519524SHoward Hinnant 35943e519524SHoward Hinnanttemplate<class _Tp, class _Alloc> 35953e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 35963e519524SHoward Hinnantshared_ptr<_Tp> 35973e519524SHoward Hinnantallocate_shared(const _Alloc& __a) 35983e519524SHoward Hinnant{ 35993e519524SHoward Hinnant return shared_ptr<_Tp>::allocate_shared(__a); 36003e519524SHoward Hinnant} 36013e519524SHoward Hinnant 36023e519524SHoward Hinnanttemplate<class _Tp, class _Alloc, class _A0> 36033e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 36043e519524SHoward Hinnantshared_ptr<_Tp> 36053e519524SHoward Hinnantallocate_shared(const _Alloc& __a, _A0& __a0) 36063e519524SHoward Hinnant{ 36073e519524SHoward Hinnant return shared_ptr<_Tp>::allocate_shared(__a, __a0); 36083e519524SHoward Hinnant} 36093e519524SHoward Hinnant 36103e519524SHoward Hinnanttemplate<class _Tp, class _Alloc, class _A0, class _A1> 36113e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 36123e519524SHoward Hinnantshared_ptr<_Tp> 36133e519524SHoward Hinnantallocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1) 36143e519524SHoward Hinnant{ 36153e519524SHoward Hinnant return shared_ptr<_Tp>::allocate_shared(__a, __a0, __a1); 36163e519524SHoward Hinnant} 36173e519524SHoward Hinnant 36183e519524SHoward Hinnanttemplate<class _Tp, class _Alloc, class _A0, class _A1, class _A2> 36193e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 36203e519524SHoward Hinnantshared_ptr<_Tp> 36213e519524SHoward Hinnantallocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1, _A2& __a2) 36223e519524SHoward Hinnant{ 36233e519524SHoward Hinnant return shared_ptr<_Tp>::allocate_shared(__a, __a0, __a1, __a2); 36243e519524SHoward Hinnant} 36253e519524SHoward Hinnant 36263e519524SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 36273e519524SHoward Hinnant 36283e519524SHoward Hinnanttemplate<class _Tp, class _Up> 36293e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 36303e519524SHoward Hinnantbool 36313739fe79SHoward Hinnantoperator==(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 36323e519524SHoward Hinnant{ 36333e519524SHoward Hinnant return __x.get() == __y.get(); 36343e519524SHoward Hinnant} 36353e519524SHoward Hinnant 36363e519524SHoward Hinnanttemplate<class _Tp, class _Up> 36373e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 36383e519524SHoward Hinnantbool 36393739fe79SHoward Hinnantoperator!=(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 36403e519524SHoward Hinnant{ 36413e519524SHoward Hinnant return !(__x == __y); 36423e519524SHoward Hinnant} 36433e519524SHoward Hinnant 36443e519524SHoward Hinnanttemplate<class _Tp, class _Up> 36453e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 36463e519524SHoward Hinnantbool 36473739fe79SHoward Hinnantoperator<(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 36483e519524SHoward Hinnant{ 36493e519524SHoward Hinnant return __x.get() < __y.get(); 36503e519524SHoward Hinnant} 36513e519524SHoward Hinnant 36523e519524SHoward Hinnanttemplate<class _Tp> 36533e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 36543e519524SHoward Hinnantvoid 36553739fe79SHoward Hinnantswap(shared_ptr<_Tp>& __x, shared_ptr<_Tp>& __y) _NOEXCEPT 36563e519524SHoward Hinnant{ 36573e519524SHoward Hinnant __x.swap(__y); 36583e519524SHoward Hinnant} 36593e519524SHoward Hinnant 36603e519524SHoward Hinnanttemplate<class _Tp, class _Up> 36613e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 36623e519524SHoward Hinnantshared_ptr<_Tp> 36633739fe79SHoward Hinnantstatic_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT 36643e519524SHoward Hinnant{ 36653e519524SHoward Hinnant return shared_ptr<_Tp>(__r, static_cast<_Tp*>(__r.get())); 36663e519524SHoward Hinnant} 36673e519524SHoward Hinnant 36683e519524SHoward Hinnanttemplate<class _Tp, class _Up> 36693e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 36703e519524SHoward Hinnantshared_ptr<_Tp> 36713739fe79SHoward Hinnantdynamic_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT 36723e519524SHoward Hinnant{ 36733e519524SHoward Hinnant _Tp* __p = dynamic_cast<_Tp*>(__r.get()); 36743e519524SHoward Hinnant return __p ? shared_ptr<_Tp>(__r, __p) : shared_ptr<_Tp>(); 36753e519524SHoward Hinnant} 36763e519524SHoward Hinnant 36773e519524SHoward Hinnanttemplate<class _Tp, class _Up> 36783e519524SHoward Hinnantshared_ptr<_Tp> 36793739fe79SHoward Hinnantconst_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT 36803e519524SHoward Hinnant{ 36813e519524SHoward Hinnant return shared_ptr<_Tp>(__r, const_cast<_Tp*>(__r.get())); 36823e519524SHoward Hinnant} 36833e519524SHoward Hinnant 368454b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI 368554b409fdSHoward Hinnant 36863e519524SHoward Hinnanttemplate<class _Dp, class _Tp> 36873e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 36883e519524SHoward Hinnant_Dp* 36893739fe79SHoward Hinnantget_deleter(const shared_ptr<_Tp>& __p) _NOEXCEPT 36903e519524SHoward Hinnant{ 36913e519524SHoward Hinnant return __p.template __get_deleter<_Dp>(); 36923e519524SHoward Hinnant} 36933e519524SHoward Hinnant 3694b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_RTTI 369554b409fdSHoward Hinnant 36963e519524SHoward Hinnanttemplate<class _Tp> 3697848a5374SHoward Hinnantclass _LIBCPP_VISIBLE weak_ptr 36983e519524SHoward Hinnant{ 36993e519524SHoward Hinnantpublic: 37003e519524SHoward Hinnant typedef _Tp element_type; 37013e519524SHoward Hinnantprivate: 37023e519524SHoward Hinnant element_type* __ptr_; 37033e519524SHoward Hinnant __shared_weak_count* __cntrl_; 37043e519524SHoward Hinnant 37053e519524SHoward Hinnantpublic: 37063739fe79SHoward Hinnant weak_ptr() _NOEXCEPT; 37073e519524SHoward Hinnant template<class _Yp> weak_ptr(shared_ptr<_Yp> const& __r, 37083739fe79SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0) 37093739fe79SHoward Hinnant _NOEXCEPT; 37103739fe79SHoward Hinnant weak_ptr(weak_ptr const& __r) _NOEXCEPT; 37113e519524SHoward Hinnant template<class _Yp> weak_ptr(weak_ptr<_Yp> const& __r, 37123739fe79SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0) 37133739fe79SHoward Hinnant _NOEXCEPT; 37143e519524SHoward Hinnant 37153e519524SHoward Hinnant ~weak_ptr(); 37163e519524SHoward Hinnant 37173739fe79SHoward Hinnant weak_ptr& operator=(weak_ptr const& __r) _NOEXCEPT; 37183739fe79SHoward Hinnant template<class _Yp> weak_ptr& operator=(weak_ptr<_Yp> const& __r) _NOEXCEPT; 37193739fe79SHoward Hinnant template<class _Yp> weak_ptr& operator=(shared_ptr<_Yp> const& __r) _NOEXCEPT; 37203e519524SHoward Hinnant 37213739fe79SHoward Hinnant void swap(weak_ptr& __r) _NOEXCEPT; 37223739fe79SHoward Hinnant void reset() _NOEXCEPT; 37233e519524SHoward Hinnant 3724848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 37253739fe79SHoward Hinnant long use_count() const _NOEXCEPT 37263739fe79SHoward Hinnant {return __cntrl_ ? __cntrl_->use_count() : 0;} 3727848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 37283739fe79SHoward Hinnant bool expired() const _NOEXCEPT 37293739fe79SHoward Hinnant {return __cntrl_ == 0 || __cntrl_->use_count() == 0;} 37303739fe79SHoward Hinnant shared_ptr<_Tp> lock() const _NOEXCEPT; 3731848a5374SHoward Hinnant template<class _Up> 3732848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 3733848a5374SHoward Hinnant bool owner_before(const shared_ptr<_Up>& __r) const 37343e519524SHoward Hinnant {return __cntrl_ < __r.__cntrl_;} 3735848a5374SHoward Hinnant template<class _Up> 3736848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 3737848a5374SHoward Hinnant bool owner_before(const weak_ptr<_Up>& __r) const 37383e519524SHoward Hinnant {return __cntrl_ < __r.__cntrl_;} 37393e519524SHoward Hinnant 3740848a5374SHoward Hinnant template <class _Up> friend class _LIBCPP_VISIBLE weak_ptr; 3741848a5374SHoward Hinnant template <class _Up> friend class _LIBCPP_VISIBLE shared_ptr; 37423e519524SHoward Hinnant}; 37433e519524SHoward Hinnant 37443e519524SHoward Hinnanttemplate<class _Tp> 37453e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 37463739fe79SHoward Hinnantweak_ptr<_Tp>::weak_ptr() _NOEXCEPT 37473e519524SHoward Hinnant : __ptr_(0), 37483e519524SHoward Hinnant __cntrl_(0) 37493e519524SHoward Hinnant{ 37503e519524SHoward Hinnant} 37513e519524SHoward Hinnant 37523e519524SHoward Hinnanttemplate<class _Tp> 37533e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 37543739fe79SHoward Hinnantweak_ptr<_Tp>::weak_ptr(weak_ptr const& __r) _NOEXCEPT 37553e519524SHoward Hinnant : __ptr_(__r.__ptr_), 37563e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 37573e519524SHoward Hinnant{ 37583e519524SHoward Hinnant if (__cntrl_) 37593e519524SHoward Hinnant __cntrl_->__add_weak(); 37603e519524SHoward Hinnant} 37613e519524SHoward Hinnant 37623e519524SHoward Hinnanttemplate<class _Tp> 37633e519524SHoward Hinnanttemplate<class _Yp> 37643e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 37653e519524SHoward Hinnantweak_ptr<_Tp>::weak_ptr(shared_ptr<_Yp> const& __r, 37665eb6bdfaSHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type) 37673739fe79SHoward Hinnant _NOEXCEPT 37683e519524SHoward Hinnant : __ptr_(__r.__ptr_), 37693e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 37703e519524SHoward Hinnant{ 37713e519524SHoward Hinnant if (__cntrl_) 37723e519524SHoward Hinnant __cntrl_->__add_weak(); 37733e519524SHoward Hinnant} 37743e519524SHoward Hinnant 37753e519524SHoward Hinnanttemplate<class _Tp> 37763e519524SHoward Hinnanttemplate<class _Yp> 37773e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 37783e519524SHoward Hinnantweak_ptr<_Tp>::weak_ptr(weak_ptr<_Yp> const& __r, 37795eb6bdfaSHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type) 37803739fe79SHoward Hinnant _NOEXCEPT 37813e519524SHoward Hinnant : __ptr_(__r.__ptr_), 37823e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 37833e519524SHoward Hinnant{ 37843e519524SHoward Hinnant if (__cntrl_) 37853e519524SHoward Hinnant __cntrl_->__add_weak(); 37863e519524SHoward Hinnant} 37873e519524SHoward Hinnant 37883e519524SHoward Hinnanttemplate<class _Tp> 37893e519524SHoward Hinnantweak_ptr<_Tp>::~weak_ptr() 37903e519524SHoward Hinnant{ 37913e519524SHoward Hinnant if (__cntrl_) 37923e519524SHoward Hinnant __cntrl_->__release_weak(); 37933e519524SHoward Hinnant} 37943e519524SHoward Hinnant 37953e519524SHoward Hinnanttemplate<class _Tp> 37963e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 37973e519524SHoward Hinnantweak_ptr<_Tp>& 37983739fe79SHoward Hinnantweak_ptr<_Tp>::operator=(weak_ptr const& __r) _NOEXCEPT 37993e519524SHoward Hinnant{ 38003e519524SHoward Hinnant weak_ptr(__r).swap(*this); 38013e519524SHoward Hinnant return *this; 38023e519524SHoward Hinnant} 38033e519524SHoward Hinnant 38043e519524SHoward Hinnanttemplate<class _Tp> 38053e519524SHoward Hinnanttemplate<class _Yp> 38063e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 38073e519524SHoward Hinnantweak_ptr<_Tp>& 38083739fe79SHoward Hinnantweak_ptr<_Tp>::operator=(weak_ptr<_Yp> const& __r) _NOEXCEPT 38093e519524SHoward Hinnant{ 38103e519524SHoward Hinnant weak_ptr(__r).swap(*this); 38113e519524SHoward Hinnant return *this; 38123e519524SHoward Hinnant} 38133e519524SHoward Hinnant 38143e519524SHoward Hinnanttemplate<class _Tp> 38153e519524SHoward Hinnanttemplate<class _Yp> 38163e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 38173e519524SHoward Hinnantweak_ptr<_Tp>& 38183739fe79SHoward Hinnantweak_ptr<_Tp>::operator=(shared_ptr<_Yp> const& __r) _NOEXCEPT 38193e519524SHoward Hinnant{ 38203e519524SHoward Hinnant weak_ptr(__r).swap(*this); 38213e519524SHoward Hinnant return *this; 38223e519524SHoward Hinnant} 38233e519524SHoward Hinnant 38243e519524SHoward Hinnanttemplate<class _Tp> 38253e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 38263e519524SHoward Hinnantvoid 38273739fe79SHoward Hinnantweak_ptr<_Tp>::swap(weak_ptr& __r) _NOEXCEPT 38283e519524SHoward Hinnant{ 38293e519524SHoward Hinnant _STD::swap(__ptr_, __r.__ptr_); 38303e519524SHoward Hinnant _STD::swap(__cntrl_, __r.__cntrl_); 38313e519524SHoward Hinnant} 38323e519524SHoward Hinnant 38333e519524SHoward Hinnanttemplate<class _Tp> 38343e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 38353e519524SHoward Hinnantvoid 38363739fe79SHoward Hinnantswap(weak_ptr<_Tp>& __x, weak_ptr<_Tp>& __y) _NOEXCEPT 38373e519524SHoward Hinnant{ 38383e519524SHoward Hinnant __x.swap(__y); 38393e519524SHoward Hinnant} 38403e519524SHoward Hinnant 38413e519524SHoward Hinnanttemplate<class _Tp> 38423e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 38433e519524SHoward Hinnantvoid 38443739fe79SHoward Hinnantweak_ptr<_Tp>::reset() _NOEXCEPT 38453e519524SHoward Hinnant{ 38463e519524SHoward Hinnant weak_ptr().swap(*this); 38473e519524SHoward Hinnant} 38483e519524SHoward Hinnant 38493e519524SHoward Hinnanttemplate<class _Tp> 38503e519524SHoward Hinnanttemplate<class _Yp> 38513e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(const weak_ptr<_Yp>& __r, 38523e519524SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type) 38533e519524SHoward Hinnant : __ptr_(__r.__ptr_), 38543e519524SHoward Hinnant __cntrl_(__r.__cntrl_ ? __r.__cntrl_->lock() : __r.__cntrl_) 38553e519524SHoward Hinnant{ 38563e519524SHoward Hinnant if (__cntrl_ == 0) 38573e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 38583e519524SHoward Hinnant throw bad_weak_ptr(); 38593e519524SHoward Hinnant#else 38603e519524SHoward Hinnant assert(!"bad_weak_ptr"); 38613e519524SHoward Hinnant#endif 38623e519524SHoward Hinnant} 38633e519524SHoward Hinnant 38643e519524SHoward Hinnanttemplate<class _Tp> 38653e519524SHoward Hinnantshared_ptr<_Tp> 38663739fe79SHoward Hinnantweak_ptr<_Tp>::lock() const _NOEXCEPT 38673e519524SHoward Hinnant{ 38683e519524SHoward Hinnant shared_ptr<_Tp> __r; 38693e519524SHoward Hinnant __r.__cntrl_ = __cntrl_ ? __cntrl_->lock() : __cntrl_; 38703e519524SHoward Hinnant if (__r.__cntrl_) 38713e519524SHoward Hinnant __r.__ptr_ = __ptr_; 38723e519524SHoward Hinnant return __r; 38733e519524SHoward Hinnant} 38743e519524SHoward Hinnant 38753e519524SHoward Hinnanttemplate <class _Tp> struct owner_less; 38763e519524SHoward Hinnant 38773e519524SHoward Hinnanttemplate <class _Tp> 3878848a5374SHoward Hinnantstruct _LIBCPP_VISIBLE owner_less<shared_ptr<_Tp> > 38793e519524SHoward Hinnant : binary_function<shared_ptr<_Tp>, shared_ptr<_Tp>, bool> 38803e519524SHoward Hinnant{ 38813e519524SHoward Hinnant typedef bool result_type; 3882848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 38833e519524SHoward Hinnant bool operator()(shared_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const 38843e519524SHoward Hinnant {return __x.owner_before(__y);} 3885848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 38863e519524SHoward Hinnant bool operator()(shared_ptr<_Tp> const& __x, weak_ptr<_Tp> const& __y) const 38873e519524SHoward Hinnant {return __x.owner_before(__y);} 3888848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 38893e519524SHoward Hinnant bool operator()( weak_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const 38903e519524SHoward Hinnant {return __x.owner_before(__y);} 38913e519524SHoward Hinnant}; 38923e519524SHoward Hinnant 38933e519524SHoward Hinnanttemplate <class _Tp> 3894848a5374SHoward Hinnantstruct _LIBCPP_VISIBLE owner_less<weak_ptr<_Tp> > 38953e519524SHoward Hinnant : binary_function<weak_ptr<_Tp>, weak_ptr<_Tp>, bool> 38963e519524SHoward Hinnant{ 38973e519524SHoward Hinnant typedef bool result_type; 3898848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 38993e519524SHoward Hinnant bool operator()( weak_ptr<_Tp> const& __x, weak_ptr<_Tp> const& __y) const 39003e519524SHoward Hinnant {return __x.owner_before(__y);} 3901848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 39023e519524SHoward Hinnant bool operator()(shared_ptr<_Tp> const& __x, weak_ptr<_Tp> const& __y) const 39033e519524SHoward Hinnant {return __x.owner_before(__y);} 3904848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 39053e519524SHoward Hinnant bool operator()( weak_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const 39063e519524SHoward Hinnant {return __x.owner_before(__y);} 39073e519524SHoward Hinnant}; 39083e519524SHoward Hinnant 39093e519524SHoward Hinnanttemplate<class _Tp> 3910848a5374SHoward Hinnantclass _LIBCPP_VISIBLE enable_shared_from_this 39113e519524SHoward Hinnant{ 39123e519524SHoward Hinnant mutable weak_ptr<_Tp> __weak_this_; 39133e519524SHoward Hinnantprotected: 3914848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 39153739fe79SHoward Hinnant enable_shared_from_this() _NOEXCEPT {} 3916848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 39173739fe79SHoward Hinnant enable_shared_from_this(enable_shared_from_this const&) _NOEXCEPT {} 3918848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 39193739fe79SHoward Hinnant enable_shared_from_this& operator=(enable_shared_from_this const&) _NOEXCEPT 39203739fe79SHoward Hinnant {return *this;} 3921848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 39223e519524SHoward Hinnant ~enable_shared_from_this() {} 39233e519524SHoward Hinnantpublic: 3924848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 39253739fe79SHoward Hinnant shared_ptr<_Tp> shared_from_this() 39263739fe79SHoward Hinnant {return shared_ptr<_Tp>(__weak_this_);} 3927848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 39283739fe79SHoward Hinnant shared_ptr<_Tp const> shared_from_this() const 39293739fe79SHoward Hinnant {return shared_ptr<const _Tp>(__weak_this_);} 39303e519524SHoward Hinnant 39313e519524SHoward Hinnant template <class _Up> friend class shared_ptr; 39323e519524SHoward Hinnant}; 39333e519524SHoward Hinnant 3934d1803b6cSHoward Hinnanttemplate <class _Tp> 3935848a5374SHoward Hinnantstruct _LIBCPP_VISIBLE hash<shared_ptr<_Tp> > 3936d1803b6cSHoward Hinnant{ 3937d1803b6cSHoward Hinnant typedef shared_ptr<_Tp> argument_type; 3938d1803b6cSHoward Hinnant typedef size_t result_type; 3939848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 39403739fe79SHoward Hinnant result_type operator()(const argument_type& __ptr) const _NOEXCEPT 3941d1803b6cSHoward Hinnant { 3942d1803b6cSHoward Hinnant return hash<_Tp*>()(__ptr.get()); 3943d1803b6cSHoward Hinnant } 3944d1803b6cSHoward Hinnant}; 3945d1803b6cSHoward Hinnant 39463e519524SHoward Hinnant//enum class 3947848a5374SHoward Hinnantstruct _LIBCPP_VISIBLE pointer_safety 39483e519524SHoward Hinnant{ 39493e519524SHoward Hinnant enum _ 39503e519524SHoward Hinnant { 39513e519524SHoward Hinnant relaxed, 39523e519524SHoward Hinnant preferred, 39533e519524SHoward Hinnant strict 39543e519524SHoward Hinnant }; 39553e519524SHoward Hinnant 39563e519524SHoward Hinnant _ __v_; 39573e519524SHoward Hinnant 3958848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 39593e519524SHoward Hinnant pointer_safety(_ __v) : __v_(__v) {} 3960848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 39613e519524SHoward Hinnant operator int() const {return __v_;} 39623e519524SHoward Hinnant}; 39633e519524SHoward Hinnant 39643e519524SHoward Hinnantvoid declare_reachable(void* __p); 39653e519524SHoward Hinnantvoid declare_no_pointers(char* __p, size_t __n); 39663e519524SHoward Hinnantvoid undeclare_no_pointers(char* __p, size_t __n); 39673739fe79SHoward Hinnantpointer_safety get_pointer_safety() _NOEXCEPT; 39683e519524SHoward Hinnantvoid* __undeclare_reachable(void*); 39693e519524SHoward Hinnant 39703e519524SHoward Hinnanttemplate <class _Tp> 39713e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 39723e519524SHoward Hinnant_Tp* 39733e519524SHoward Hinnantundeclare_reachable(_Tp* __p) 39743e519524SHoward Hinnant{ 39753e519524SHoward Hinnant return static_cast<_Tp*>(__undeclare_reachable(__p)); 39763e519524SHoward Hinnant} 39773e519524SHoward Hinnant 39783e519524SHoward Hinnantvoid* align(size_t, size_t, void*&, size_t&); 39793e519524SHoward Hinnant 39803e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD 39813e519524SHoward Hinnant 39823e519524SHoward Hinnant#endif // _LIBCPP_MEMORY 3983