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> 598e3163f5aSHoward Hinnant#include <iosfwd> 5993e519524SHoward Hinnant#if defined(_LIBCPP_NO_EXCEPTIONS) 6003e519524SHoward Hinnant #include <cassert> 6013e519524SHoward Hinnant#endif 6023e519524SHoward Hinnant 6033e519524SHoward Hinnant#pragma GCC system_header 6043e519524SHoward Hinnant 6053e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 6063e519524SHoward Hinnant 6073e519524SHoward Hinnant// allocator_arg_t 6083e519524SHoward Hinnant 609848a5374SHoward Hinnantstruct _LIBCPP_VISIBLE allocator_arg_t { }; 6103e519524SHoward Hinnant 6113e519524SHoward Hinnantextern const allocator_arg_t allocator_arg; 6123e519524SHoward Hinnant 6133e519524SHoward Hinnant// addressof 6143e519524SHoward Hinnant 6153e519524SHoward Hinnanttemplate <class _Tp> 6163e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 6173e519524SHoward Hinnant_Tp* 6183739fe79SHoward Hinnantaddressof(_Tp& __x) _NOEXCEPT 6193e519524SHoward Hinnant{ 6203e519524SHoward Hinnant return (_Tp*)&(char&)__x; 6213e519524SHoward Hinnant} 6223e519524SHoward Hinnant 62364ec101eSDouglas Gregor#if defined(_LIBCPP_HAS_OBJC_ARC) && !defined(_LIBCPP_PREDEFINED_OBJC_ARC_ADDRESSOF) 62464ec101eSDouglas Gregor// Objective-C++ Automatic Reference Counting uses qualified pointers 62564ec101eSDouglas Gregor// that require special addressof() signatures. When 62664ec101eSDouglas Gregor// _LIBCPP_PREDEFINED_OBJC_ARC_ADDRESSOF is defined, the compiler 62764ec101eSDouglas Gregor// itself is providing these definitions. Otherwise, we provide them. 62864ec101eSDouglas Gregortemplate <class _Tp> 62964ec101eSDouglas Gregorinline _LIBCPP_INLINE_VISIBILITY 63064ec101eSDouglas Gregor__strong _Tp* 63164ec101eSDouglas Gregoraddressof(__strong _Tp& __x) _NOEXCEPT 63264ec101eSDouglas Gregor{ 63364ec101eSDouglas Gregor return &__x; 63464ec101eSDouglas Gregor} 63564ec101eSDouglas Gregor 63664ec101eSDouglas Gregor#ifdef _LIBCPP_HAS_OBJC_ARC_WEAK 63764ec101eSDouglas Gregortemplate <class _Tp> 63864ec101eSDouglas Gregorinline _LIBCPP_INLINE_VISIBILITY 63964ec101eSDouglas Gregor__weak _Tp* 64064ec101eSDouglas Gregoraddressof(__weak _Tp& __x) _NOEXCEPT 64164ec101eSDouglas Gregor{ 64264ec101eSDouglas Gregor return &__x; 64364ec101eSDouglas Gregor} 64464ec101eSDouglas Gregor#endif 64564ec101eSDouglas Gregor 64664ec101eSDouglas Gregortemplate <class _Tp> 64764ec101eSDouglas Gregorinline _LIBCPP_INLINE_VISIBILITY 64864ec101eSDouglas Gregor__autoreleasing _Tp* 64964ec101eSDouglas Gregoraddressof(__autoreleasing _Tp& __x) _NOEXCEPT 65064ec101eSDouglas Gregor{ 65164ec101eSDouglas Gregor return &__x; 65264ec101eSDouglas Gregor} 65364ec101eSDouglas Gregor 65464ec101eSDouglas Gregortemplate <class _Tp> 65564ec101eSDouglas Gregorinline _LIBCPP_INLINE_VISIBILITY 65664ec101eSDouglas Gregor__unsafe_unretained _Tp* 65764ec101eSDouglas Gregoraddressof(__unsafe_unretained _Tp& __x) _NOEXCEPT 65864ec101eSDouglas Gregor{ 65964ec101eSDouglas Gregor return &__x; 66064ec101eSDouglas Gregor} 66164ec101eSDouglas Gregor#endif 66264ec101eSDouglas Gregor 6633e519524SHoward Hinnanttemplate <class _Tp> class allocator; 6643e519524SHoward Hinnant 6653e519524SHoward Hinnanttemplate <> 666848a5374SHoward Hinnantclass _LIBCPP_VISIBLE allocator<void> 6673e519524SHoward Hinnant{ 6683e519524SHoward Hinnantpublic: 6693e519524SHoward Hinnant typedef void* pointer; 6703e519524SHoward Hinnant typedef const void* const_pointer; 6713e519524SHoward Hinnant typedef void value_type; 6723e519524SHoward Hinnant 6733e519524SHoward Hinnant template <class _Up> struct rebind {typedef allocator<_Up> other;}; 6743e519524SHoward Hinnant}; 6753e519524SHoward Hinnant 6763e519524SHoward Hinnant// pointer_traits 6773e519524SHoward Hinnant 6783e519524SHoward Hinnanttemplate <class _Tp> 6793e519524SHoward Hinnantstruct __has_element_type 6803e519524SHoward Hinnant{ 6813e519524SHoward Hinnantprivate: 6823e519524SHoward Hinnant struct __two {char _; char __;}; 6833e519524SHoward Hinnant template <class _Up> static __two __test(...); 6843e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::element_type* = 0); 6853e519524SHoward Hinnantpublic: 6863e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 6873e519524SHoward Hinnant}; 6883e519524SHoward Hinnant 6893e519524SHoward Hinnanttemplate <class _Ptr, bool = __has_element_type<_Ptr>::value> 6903e519524SHoward Hinnantstruct __pointer_traits_element_type; 6913e519524SHoward Hinnant 6923e519524SHoward Hinnanttemplate <class _Ptr> 6933e519524SHoward Hinnantstruct __pointer_traits_element_type<_Ptr, true> 6943e519524SHoward Hinnant{ 6953e519524SHoward Hinnant typedef typename _Ptr::element_type type; 6963e519524SHoward Hinnant}; 6973e519524SHoward Hinnant 6983e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 6993e519524SHoward Hinnant 7003e519524SHoward Hinnanttemplate <template <class, class...> class _Sp, class _Tp, class ..._Args> 7013e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _Args...>, true> 7023e519524SHoward Hinnant{ 7033e519524SHoward Hinnant typedef typename _Sp<_Tp, _Args...>::element_type type; 7043e519524SHoward Hinnant}; 7053e519524SHoward Hinnant 7063e519524SHoward Hinnanttemplate <template <class, class...> class _Sp, class _Tp, class ..._Args> 7073e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _Args...>, false> 7083e519524SHoward Hinnant{ 7093e519524SHoward Hinnant typedef _Tp type; 7103e519524SHoward Hinnant}; 7113e519524SHoward Hinnant 712b3371f6fSHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 7133e519524SHoward Hinnant 7143e519524SHoward Hinnanttemplate <template <class> class _Sp, class _Tp> 7153e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp>, true> 7163e519524SHoward Hinnant{ 7173e519524SHoward Hinnant typedef typename _Sp<_Tp>::element_type type; 7183e519524SHoward Hinnant}; 7193e519524SHoward Hinnant 7203e519524SHoward Hinnanttemplate <template <class> class _Sp, class _Tp> 7213e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp>, false> 7223e519524SHoward Hinnant{ 7233e519524SHoward Hinnant typedef _Tp type; 7243e519524SHoward Hinnant}; 7253e519524SHoward Hinnant 7263e519524SHoward Hinnanttemplate <template <class, class> class _Sp, class _Tp, class _A0> 7273e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0>, true> 7283e519524SHoward Hinnant{ 7293e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0>::element_type type; 7303e519524SHoward Hinnant}; 7313e519524SHoward Hinnant 7323e519524SHoward Hinnanttemplate <template <class, class> class _Sp, class _Tp, class _A0> 7333e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0>, false> 7343e519524SHoward Hinnant{ 7353e519524SHoward Hinnant typedef _Tp type; 7363e519524SHoward Hinnant}; 7373e519524SHoward Hinnant 7383e519524SHoward Hinnanttemplate <template <class, class, class> class _Sp, class _Tp, class _A0, class _A1> 7393e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1>, true> 7403e519524SHoward Hinnant{ 7413e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1>::element_type type; 7423e519524SHoward Hinnant}; 7433e519524SHoward Hinnant 7443e519524SHoward Hinnanttemplate <template <class, class, class> class _Sp, class _Tp, class _A0, class _A1> 7453e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1>, false> 7463e519524SHoward Hinnant{ 7473e519524SHoward Hinnant typedef _Tp type; 7483e519524SHoward Hinnant}; 7493e519524SHoward Hinnant 7503e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Sp, class _Tp, class _A0, 7513e519524SHoward Hinnant class _A1, class _A2> 7523e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1, _A2>, true> 7533e519524SHoward Hinnant{ 7543e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1, _A2>::element_type type; 7553e519524SHoward Hinnant}; 7563e519524SHoward Hinnant 7573e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Sp, class _Tp, class _A0, 7583e519524SHoward Hinnant class _A1, class _A2> 7593e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1, _A2>, false> 7603e519524SHoward Hinnant{ 7613e519524SHoward Hinnant typedef _Tp type; 7623e519524SHoward Hinnant}; 7633e519524SHoward Hinnant 764b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 7653e519524SHoward Hinnant 7663e519524SHoward Hinnanttemplate <class _Tp> 7673e519524SHoward Hinnantstruct __has_difference_type 7683e519524SHoward Hinnant{ 7693e519524SHoward Hinnantprivate: 7703e519524SHoward Hinnant struct __two {char _; char __;}; 7713e519524SHoward Hinnant template <class _Up> static __two __test(...); 7723e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::difference_type* = 0); 7733e519524SHoward Hinnantpublic: 7743e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 7753e519524SHoward Hinnant}; 7763e519524SHoward Hinnant 7773e519524SHoward Hinnanttemplate <class _Ptr, bool = __has_difference_type<_Ptr>::value> 7783e519524SHoward Hinnantstruct __pointer_traits_difference_type 7793e519524SHoward Hinnant{ 7803e519524SHoward Hinnant typedef ptrdiff_t type; 7813e519524SHoward Hinnant}; 7823e519524SHoward Hinnant 7833e519524SHoward Hinnanttemplate <class _Ptr> 7843e519524SHoward Hinnantstruct __pointer_traits_difference_type<_Ptr, true> 7853e519524SHoward Hinnant{ 7863e519524SHoward Hinnant typedef typename _Ptr::difference_type type; 7873e519524SHoward Hinnant}; 7883e519524SHoward Hinnant 7893e519524SHoward Hinnanttemplate <class _Tp, class _Up> 7903e519524SHoward Hinnantstruct __has_rebind 7913e519524SHoward Hinnant{ 7923e519524SHoward Hinnantprivate: 7933e519524SHoward Hinnant struct __two {char _; char __;}; 7943e519524SHoward Hinnant template <class _Xp> static __two __test(...); 7953e519524SHoward Hinnant template <class _Xp> static char __test(typename _Xp::template rebind<_Up>* = 0); 7963e519524SHoward Hinnantpublic: 7973e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 7983e519524SHoward Hinnant}; 7993e519524SHoward Hinnant 8003e519524SHoward Hinnanttemplate <class _Tp, class _Up, bool = __has_rebind<_Tp, _Up>::value> 8013e519524SHoward Hinnantstruct __pointer_traits_rebind 8023e519524SHoward Hinnant{ 8033e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 8043e519524SHoward Hinnant typedef typename _Tp::template rebind<_Up> type; 8053e519524SHoward Hinnant#else 8063e519524SHoward Hinnant typedef typename _Tp::template rebind<_Up>::other type; 8073e519524SHoward Hinnant#endif 8083e519524SHoward Hinnant}; 8093e519524SHoward Hinnant 8103e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 8113e519524SHoward Hinnant 8123e519524SHoward Hinnanttemplate <template <class, class...> class _Sp, class _Tp, class ..._Args, class _Up> 8133e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _Args...>, _Up, true> 8143e519524SHoward Hinnant{ 8153e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 8163e519524SHoward Hinnant typedef typename _Sp<_Tp, _Args...>::template rebind<_Up> type; 8173e519524SHoward Hinnant#else 8183e519524SHoward Hinnant typedef typename _Sp<_Tp, _Args...>::template rebind<_Up>::other type; 8193e519524SHoward Hinnant#endif 8203e519524SHoward Hinnant}; 8213e519524SHoward Hinnant 8223e519524SHoward Hinnanttemplate <template <class, class...> class _Sp, class _Tp, class ..._Args, class _Up> 8233e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _Args...>, _Up, false> 8243e519524SHoward Hinnant{ 8253e519524SHoward Hinnant typedef _Sp<_Up, _Args...> type; 8263e519524SHoward Hinnant}; 8273e519524SHoward Hinnant 828b3371f6fSHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 8293e519524SHoward Hinnant 8303e519524SHoward Hinnanttemplate <template <class> class _Sp, class _Tp, class _Up> 8313e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp>, _Up, true> 8323e519524SHoward Hinnant{ 8333e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 8343e519524SHoward Hinnant typedef typename _Sp<_Tp>::template rebind<_Up> type; 8353e519524SHoward Hinnant#else 8363e519524SHoward Hinnant typedef typename _Sp<_Tp>::template rebind<_Up>::other type; 8373e519524SHoward Hinnant#endif 8383e519524SHoward Hinnant}; 8393e519524SHoward Hinnant 8403e519524SHoward Hinnanttemplate <template <class> class _Sp, class _Tp, class _Up> 8413e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp>, _Up, false> 8423e519524SHoward Hinnant{ 8433e519524SHoward Hinnant typedef _Sp<_Up> type; 8443e519524SHoward Hinnant}; 8453e519524SHoward Hinnant 8463e519524SHoward Hinnanttemplate <template <class, class> class _Sp, class _Tp, class _A0, class _Up> 8473e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0>, _Up, true> 8483e519524SHoward Hinnant{ 8493e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 8503e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0>::template rebind<_Up> type; 8513e519524SHoward Hinnant#else 8523e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0>::template rebind<_Up>::other type; 8533e519524SHoward Hinnant#endif 8543e519524SHoward Hinnant}; 8553e519524SHoward Hinnant 8563e519524SHoward Hinnanttemplate <template <class, class> class _Sp, class _Tp, class _A0, class _Up> 8573e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0>, _Up, false> 8583e519524SHoward Hinnant{ 8593e519524SHoward Hinnant typedef _Sp<_Up, _A0> type; 8603e519524SHoward Hinnant}; 8613e519524SHoward Hinnant 8623e519524SHoward Hinnanttemplate <template <class, class, class> class _Sp, class _Tp, class _A0, 8633e519524SHoward Hinnant class _A1, class _Up> 8643e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1>, _Up, true> 8653e519524SHoward Hinnant{ 8663e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 8673e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1>::template rebind<_Up> type; 8683e519524SHoward Hinnant#else 8693e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1>::template rebind<_Up>::other type; 8703e519524SHoward Hinnant#endif 8713e519524SHoward Hinnant}; 8723e519524SHoward Hinnant 8733e519524SHoward Hinnanttemplate <template <class, class, class> class _Sp, class _Tp, class _A0, 8743e519524SHoward Hinnant class _A1, class _Up> 8753e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1>, _Up, false> 8763e519524SHoward Hinnant{ 8773e519524SHoward Hinnant typedef _Sp<_Up, _A0, _A1> type; 8783e519524SHoward Hinnant}; 8793e519524SHoward Hinnant 8803e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Sp, class _Tp, class _A0, 8813e519524SHoward Hinnant class _A1, class _A2, class _Up> 8823e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1, _A2>, _Up, true> 8833e519524SHoward Hinnant{ 8843e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 8853e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1, _A2>::template rebind<_Up> type; 8863e519524SHoward Hinnant#else 8873e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1, _A2>::template rebind<_Up>::other type; 8883e519524SHoward Hinnant#endif 8893e519524SHoward Hinnant}; 8903e519524SHoward Hinnant 8913e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Sp, class _Tp, class _A0, 8923e519524SHoward Hinnant class _A1, class _A2, class _Up> 8933e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1, _A2>, _Up, false> 8943e519524SHoward Hinnant{ 8953e519524SHoward Hinnant typedef _Sp<_Up, _A0, _A1, _A2> type; 8963e519524SHoward Hinnant}; 8973e519524SHoward Hinnant 898b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 8993e519524SHoward Hinnant 9003e519524SHoward Hinnanttemplate <class _Ptr> 901848a5374SHoward Hinnantstruct _LIBCPP_VISIBLE pointer_traits 9023e519524SHoward Hinnant{ 9033e519524SHoward Hinnant typedef _Ptr pointer; 9043e519524SHoward Hinnant typedef typename __pointer_traits_element_type<pointer>::type element_type; 9053e519524SHoward Hinnant typedef typename __pointer_traits_difference_type<pointer>::type difference_type; 9063e519524SHoward Hinnant 9073e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 908f7384975SHoward Hinnant template <class _Up> using rebind = typename __pointer_traits_rebind<pointer, _Up>::type; 9093e519524SHoward Hinnant#else 9103e519524SHoward Hinnant template <class _Up> struct rebind 9113e519524SHoward Hinnant {typedef typename __pointer_traits_rebind<pointer, _Up>::type other;}; 912b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_TEMPLATE_ALIASES 9133e519524SHoward Hinnant 9143e519524SHoward Hinnantprivate: 9153e519524SHoward Hinnant struct __nat {}; 9163e519524SHoward Hinnantpublic: 917848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9183e519524SHoward Hinnant static pointer pointer_to(typename conditional<is_void<element_type>::value, 9193e519524SHoward Hinnant __nat, element_type>::type& __r) 9203e519524SHoward Hinnant {return pointer::pointer_to(__r);} 9213e519524SHoward Hinnant}; 9223e519524SHoward Hinnant 9233e519524SHoward Hinnanttemplate <class _Tp> 924848a5374SHoward Hinnantstruct _LIBCPP_VISIBLE pointer_traits<_Tp*> 9253e519524SHoward Hinnant{ 9263e519524SHoward Hinnant typedef _Tp* pointer; 9273e519524SHoward Hinnant typedef _Tp element_type; 9283e519524SHoward Hinnant typedef ptrdiff_t difference_type; 9293e519524SHoward Hinnant 9303e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 9313e519524SHoward Hinnant template <class _Up> using rebind = _Up*; 9323e519524SHoward Hinnant#else 9333e519524SHoward Hinnant template <class _Up> struct rebind {typedef _Up* other;}; 9343e519524SHoward Hinnant#endif 9353e519524SHoward Hinnant 9363e519524SHoward Hinnantprivate: 9373e519524SHoward Hinnant struct __nat {}; 9383e519524SHoward Hinnantpublic: 939848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9403e519524SHoward Hinnant static pointer pointer_to(typename conditional<is_void<element_type>::value, 9413739fe79SHoward Hinnant __nat, element_type>::type& __r) _NOEXCEPT 942ce48a113SHoward Hinnant {return _VSTD::addressof(__r);} 9433e519524SHoward Hinnant}; 9443e519524SHoward Hinnant 9453e519524SHoward Hinnant// allocator_traits 9463e519524SHoward Hinnant 9473e519524SHoward Hinnantnamespace __has_pointer_type_imp 9483e519524SHoward Hinnant{ 9493e519524SHoward Hinnant template <class _Up> static __two test(...); 9503e519524SHoward Hinnant template <class _Up> static char test(typename _Up::pointer* = 0); 9513e519524SHoward Hinnant} 9523e519524SHoward Hinnant 9533e519524SHoward Hinnanttemplate <class _Tp> 9543e519524SHoward Hinnantstruct __has_pointer_type 9553e519524SHoward Hinnant : public integral_constant<bool, sizeof(__has_pointer_type_imp::test<_Tp>(0)) == 1> 9563e519524SHoward Hinnant{ 9573e519524SHoward Hinnant}; 9583e519524SHoward Hinnant 9593e519524SHoward Hinnantnamespace __pointer_type_imp 9603e519524SHoward Hinnant{ 9613e519524SHoward Hinnant 9623e519524SHoward Hinnanttemplate <class _Tp, class _Dp, bool = __has_pointer_type<_Dp>::value> 9633e519524SHoward Hinnantstruct __pointer_type 9643e519524SHoward Hinnant{ 9653e519524SHoward Hinnant typedef typename _Dp::pointer type; 9663e519524SHoward Hinnant}; 9673e519524SHoward Hinnant 9683e519524SHoward Hinnanttemplate <class _Tp, class _Dp> 9693e519524SHoward Hinnantstruct __pointer_type<_Tp, _Dp, false> 9703e519524SHoward Hinnant{ 9713e519524SHoward Hinnant typedef _Tp* type; 9723e519524SHoward Hinnant}; 9733e519524SHoward Hinnant 974a4a1ef1fSHoward Hinnant} // __pointer_type_imp 9753e519524SHoward Hinnant 9763e519524SHoward Hinnanttemplate <class _Tp, class _Dp> 9773e519524SHoward Hinnantstruct __pointer_type 9783e519524SHoward Hinnant{ 9793e519524SHoward Hinnant typedef typename __pointer_type_imp::__pointer_type<_Tp, typename remove_reference<_Dp>::type>::type type; 9803e519524SHoward Hinnant}; 9813e519524SHoward Hinnant 9823e519524SHoward Hinnanttemplate <class _Tp> 9833e519524SHoward Hinnantstruct __has_const_pointer 9843e519524SHoward Hinnant{ 9853e519524SHoward Hinnantprivate: 9863e519524SHoward Hinnant struct __two {char _; char __;}; 9873e519524SHoward Hinnant template <class _Up> static __two __test(...); 9883e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::const_pointer* = 0); 9893e519524SHoward Hinnantpublic: 9903e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 9913e519524SHoward Hinnant}; 9923e519524SHoward Hinnant 9933e519524SHoward Hinnanttemplate <class _Tp, class _Ptr, class _Alloc, bool = __has_const_pointer<_Alloc>::value> 9943e519524SHoward Hinnantstruct __const_pointer 9953e519524SHoward Hinnant{ 9963e519524SHoward Hinnant typedef typename _Alloc::const_pointer type; 9973e519524SHoward Hinnant}; 9983e519524SHoward Hinnant 9993e519524SHoward Hinnanttemplate <class _Tp, class _Ptr, class _Alloc> 10003e519524SHoward Hinnantstruct __const_pointer<_Tp, _Ptr, _Alloc, false> 10013e519524SHoward Hinnant{ 10023e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 10033e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<const _Tp> type; 10043e519524SHoward Hinnant#else 10053e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<const _Tp>::other type; 10063e519524SHoward Hinnant#endif 10073e519524SHoward Hinnant}; 10083e519524SHoward Hinnant 10093e519524SHoward Hinnanttemplate <class _Tp> 10103e519524SHoward Hinnantstruct __has_void_pointer 10113e519524SHoward Hinnant{ 10123e519524SHoward Hinnantprivate: 10133e519524SHoward Hinnant struct __two {char _; char __;}; 10143e519524SHoward Hinnant template <class _Up> static __two __test(...); 10153e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::void_pointer* = 0); 10163e519524SHoward Hinnantpublic: 10173e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 10183e519524SHoward Hinnant}; 10193e519524SHoward Hinnant 10203e519524SHoward Hinnanttemplate <class _Ptr, class _Alloc, bool = __has_void_pointer<_Alloc>::value> 10213e519524SHoward Hinnantstruct __void_pointer 10223e519524SHoward Hinnant{ 10233e519524SHoward Hinnant typedef typename _Alloc::void_pointer type; 10243e519524SHoward Hinnant}; 10253e519524SHoward Hinnant 10263e519524SHoward Hinnanttemplate <class _Ptr, class _Alloc> 10273e519524SHoward Hinnantstruct __void_pointer<_Ptr, _Alloc, false> 10283e519524SHoward Hinnant{ 10293e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 10303e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<void> type; 10313e519524SHoward Hinnant#else 10323e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<void>::other type; 10333e519524SHoward Hinnant#endif 10343e519524SHoward Hinnant}; 10353e519524SHoward Hinnant 10363e519524SHoward Hinnanttemplate <class _Tp> 10373e519524SHoward Hinnantstruct __has_const_void_pointer 10383e519524SHoward Hinnant{ 10393e519524SHoward Hinnantprivate: 10403e519524SHoward Hinnant struct __two {char _; char __;}; 10413e519524SHoward Hinnant template <class _Up> static __two __test(...); 10423e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::const_void_pointer* = 0); 10433e519524SHoward Hinnantpublic: 10443e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 10453e519524SHoward Hinnant}; 10463e519524SHoward Hinnant 10473e519524SHoward Hinnanttemplate <class _Ptr, class _Alloc, bool = __has_const_void_pointer<_Alloc>::value> 10483e519524SHoward Hinnantstruct __const_void_pointer 10493e519524SHoward Hinnant{ 10503e519524SHoward Hinnant typedef typename _Alloc::const_void_pointer type; 10513e519524SHoward Hinnant}; 10523e519524SHoward Hinnant 10533e519524SHoward Hinnanttemplate <class _Ptr, class _Alloc> 10543e519524SHoward Hinnantstruct __const_void_pointer<_Ptr, _Alloc, false> 10553e519524SHoward Hinnant{ 10563e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 10573e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<const void> type; 10583e519524SHoward Hinnant#else 10593e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<const void>::other type; 10603e519524SHoward Hinnant#endif 10613e519524SHoward Hinnant}; 10623e519524SHoward Hinnant 10633e519524SHoward Hinnanttemplate <class _T> 10643e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 10653e519524SHoward Hinnant_T* 10663739fe79SHoward Hinnant__to_raw_pointer(_T* __p) _NOEXCEPT 10673e519524SHoward Hinnant{ 10683e519524SHoward Hinnant return __p; 10693e519524SHoward Hinnant} 10703e519524SHoward Hinnant 10713e519524SHoward Hinnanttemplate <class _Pointer> 10723e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 10733e519524SHoward Hinnanttypename pointer_traits<_Pointer>::element_type* 10743739fe79SHoward Hinnant__to_raw_pointer(_Pointer __p) _NOEXCEPT 10753e519524SHoward Hinnant{ 1076ce48a113SHoward Hinnant return _VSTD::__to_raw_pointer(__p.operator->()); 10773e519524SHoward Hinnant} 10783e519524SHoward Hinnant 10793e519524SHoward Hinnanttemplate <class _Tp> 10803e519524SHoward Hinnantstruct __has_size_type 10813e519524SHoward Hinnant{ 10823e519524SHoward Hinnantprivate: 10833e519524SHoward Hinnant struct __two {char _; char __;}; 10843e519524SHoward Hinnant template <class _Up> static __two __test(...); 10853e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::size_type* = 0); 10863e519524SHoward Hinnantpublic: 10873e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 10883e519524SHoward Hinnant}; 10893e519524SHoward Hinnant 1090a4a1ef1fSHoward Hinnanttemplate <class _Alloc, class _DiffType, bool = __has_size_type<_Alloc>::value> 10913e519524SHoward Hinnantstruct __size_type 10923e519524SHoward Hinnant{ 1093a4a1ef1fSHoward Hinnant typedef typename make_unsigned<_DiffType>::type type; 10943e519524SHoward Hinnant}; 10953e519524SHoward Hinnant 1096a4a1ef1fSHoward Hinnanttemplate <class _Alloc, class _DiffType> 1097a4a1ef1fSHoward Hinnantstruct __size_type<_Alloc, _DiffType, true> 10983e519524SHoward Hinnant{ 10993e519524SHoward Hinnant typedef typename _Alloc::size_type type; 11003e519524SHoward Hinnant}; 11013e519524SHoward Hinnant 11023e519524SHoward Hinnanttemplate <class _Tp> 11033e519524SHoward Hinnantstruct __has_propagate_on_container_copy_assignment 11043e519524SHoward Hinnant{ 11053e519524SHoward Hinnantprivate: 11063e519524SHoward Hinnant struct __two {char _; char __;}; 11073e519524SHoward Hinnant template <class _Up> static __two __test(...); 11083e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::propagate_on_container_copy_assignment* = 0); 11093e519524SHoward Hinnantpublic: 11103e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 11113e519524SHoward Hinnant}; 11123e519524SHoward Hinnant 11133e519524SHoward Hinnanttemplate <class _Alloc, bool = __has_propagate_on_container_copy_assignment<_Alloc>::value> 11143e519524SHoward Hinnantstruct __propagate_on_container_copy_assignment 11153e519524SHoward Hinnant{ 11163e519524SHoward Hinnant typedef false_type type; 11173e519524SHoward Hinnant}; 11183e519524SHoward Hinnant 11193e519524SHoward Hinnanttemplate <class _Alloc> 11203e519524SHoward Hinnantstruct __propagate_on_container_copy_assignment<_Alloc, true> 11213e519524SHoward Hinnant{ 11223e519524SHoward Hinnant typedef typename _Alloc::propagate_on_container_copy_assignment type; 11233e519524SHoward Hinnant}; 11243e519524SHoward Hinnant 11253e519524SHoward Hinnanttemplate <class _Tp> 11263e519524SHoward Hinnantstruct __has_propagate_on_container_move_assignment 11273e519524SHoward Hinnant{ 11283e519524SHoward Hinnantprivate: 11293e519524SHoward Hinnant struct __two {char _; char __;}; 11303e519524SHoward Hinnant template <class _Up> static __two __test(...); 11313e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::propagate_on_container_move_assignment* = 0); 11323e519524SHoward Hinnantpublic: 11333e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 11343e519524SHoward Hinnant}; 11353e519524SHoward Hinnant 11363e519524SHoward Hinnanttemplate <class _Alloc, bool = __has_propagate_on_container_move_assignment<_Alloc>::value> 11373e519524SHoward Hinnantstruct __propagate_on_container_move_assignment 11383e519524SHoward Hinnant{ 11393e519524SHoward Hinnant typedef false_type type; 11403e519524SHoward Hinnant}; 11413e519524SHoward Hinnant 11423e519524SHoward Hinnanttemplate <class _Alloc> 11433e519524SHoward Hinnantstruct __propagate_on_container_move_assignment<_Alloc, true> 11443e519524SHoward Hinnant{ 11453e519524SHoward Hinnant typedef typename _Alloc::propagate_on_container_move_assignment type; 11463e519524SHoward Hinnant}; 11473e519524SHoward Hinnant 11483e519524SHoward Hinnanttemplate <class _Tp> 11493e519524SHoward Hinnantstruct __has_propagate_on_container_swap 11503e519524SHoward Hinnant{ 11513e519524SHoward Hinnantprivate: 11523e519524SHoward Hinnant struct __two {char _; char __;}; 11533e519524SHoward Hinnant template <class _Up> static __two __test(...); 11543e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::propagate_on_container_swap* = 0); 11553e519524SHoward Hinnantpublic: 11563e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 11573e519524SHoward Hinnant}; 11583e519524SHoward Hinnant 11593e519524SHoward Hinnanttemplate <class _Alloc, bool = __has_propagate_on_container_swap<_Alloc>::value> 11603e519524SHoward Hinnantstruct __propagate_on_container_swap 11613e519524SHoward Hinnant{ 11623e519524SHoward Hinnant typedef false_type type; 11633e519524SHoward Hinnant}; 11643e519524SHoward Hinnant 11653e519524SHoward Hinnanttemplate <class _Alloc> 11663e519524SHoward Hinnantstruct __propagate_on_container_swap<_Alloc, true> 11673e519524SHoward Hinnant{ 11683e519524SHoward Hinnant typedef typename _Alloc::propagate_on_container_swap type; 11693e519524SHoward Hinnant}; 11703e519524SHoward Hinnant 11713e519524SHoward Hinnanttemplate <class _Tp, class _Up, bool = __has_rebind<_Tp, _Up>::value> 11723e519524SHoward Hinnantstruct __has_rebind_other 11733e519524SHoward Hinnant{ 11743e519524SHoward Hinnantprivate: 11753e519524SHoward Hinnant struct __two {char _; char __;}; 11763e519524SHoward Hinnant template <class _Xp> static __two __test(...); 11773e519524SHoward Hinnant template <class _Xp> static char __test(typename _Xp::template rebind<_Up>::other* = 0); 11783e519524SHoward Hinnantpublic: 11793e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 11803e519524SHoward Hinnant}; 11813e519524SHoward Hinnant 11823e519524SHoward Hinnanttemplate <class _Tp, class _Up> 11833e519524SHoward Hinnantstruct __has_rebind_other<_Tp, _Up, false> 11843e519524SHoward Hinnant{ 11853e519524SHoward Hinnant static const bool value = false; 11863e519524SHoward Hinnant}; 11873e519524SHoward Hinnant 11883e519524SHoward Hinnanttemplate <class _Tp, class _Up, bool = __has_rebind_other<_Tp, _Up>::value> 11893e519524SHoward Hinnantstruct __allocator_traits_rebind 11903e519524SHoward Hinnant{ 11913e519524SHoward Hinnant typedef typename _Tp::template rebind<_Up>::other type; 11923e519524SHoward Hinnant}; 11933e519524SHoward Hinnant 11943e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 11953e519524SHoward Hinnant 11963e519524SHoward Hinnanttemplate <template <class, class...> class _Alloc, class _Tp, class ..._Args, class _Up> 11973e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _Args...>, _Up, true> 11983e519524SHoward Hinnant{ 11993e519524SHoward Hinnant typedef typename _Alloc<_Tp, _Args...>::template rebind<_Up>::other type; 12003e519524SHoward Hinnant}; 12013e519524SHoward Hinnant 12023e519524SHoward Hinnanttemplate <template <class, class...> class _Alloc, class _Tp, class ..._Args, class _Up> 12033e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _Args...>, _Up, false> 12043e519524SHoward Hinnant{ 12053e519524SHoward Hinnant typedef _Alloc<_Up, _Args...> type; 12063e519524SHoward Hinnant}; 12073e519524SHoward Hinnant 1208b3371f6fSHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 12093e519524SHoward Hinnant 12103e519524SHoward Hinnanttemplate <template <class> class _Alloc, class _Tp, class _Up> 12113e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp>, _Up, true> 12123e519524SHoward Hinnant{ 12133e519524SHoward Hinnant typedef typename _Alloc<_Tp>::template rebind<_Up>::other type; 12143e519524SHoward Hinnant}; 12153e519524SHoward Hinnant 12163e519524SHoward Hinnanttemplate <template <class> class _Alloc, class _Tp, class _Up> 12173e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp>, _Up, false> 12183e519524SHoward Hinnant{ 12193e519524SHoward Hinnant typedef _Alloc<_Up> type; 12203e519524SHoward Hinnant}; 12213e519524SHoward Hinnant 12223e519524SHoward Hinnanttemplate <template <class, class> class _Alloc, class _Tp, class _A0, class _Up> 12233e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0>, _Up, true> 12243e519524SHoward Hinnant{ 12253e519524SHoward Hinnant typedef typename _Alloc<_Tp, _A0>::template rebind<_Up>::other type; 12263e519524SHoward Hinnant}; 12273e519524SHoward Hinnant 12283e519524SHoward Hinnanttemplate <template <class, class> class _Alloc, class _Tp, class _A0, class _Up> 12293e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0>, _Up, false> 12303e519524SHoward Hinnant{ 12313e519524SHoward Hinnant typedef _Alloc<_Up, _A0> type; 12323e519524SHoward Hinnant}; 12333e519524SHoward Hinnant 12343e519524SHoward Hinnanttemplate <template <class, class, class> class _Alloc, class _Tp, class _A0, 12353e519524SHoward Hinnant class _A1, class _Up> 12363e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1>, _Up, true> 12373e519524SHoward Hinnant{ 12383e519524SHoward Hinnant typedef typename _Alloc<_Tp, _A0, _A1>::template rebind<_Up>::other type; 12393e519524SHoward Hinnant}; 12403e519524SHoward Hinnant 12413e519524SHoward Hinnanttemplate <template <class, class, class> class _Alloc, class _Tp, class _A0, 12423e519524SHoward Hinnant class _A1, class _Up> 12433e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1>, _Up, false> 12443e519524SHoward Hinnant{ 12453e519524SHoward Hinnant typedef _Alloc<_Up, _A0, _A1> type; 12463e519524SHoward Hinnant}; 12473e519524SHoward Hinnant 12483e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Alloc, class _Tp, class _A0, 12493e519524SHoward Hinnant class _A1, class _A2, class _Up> 12503e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1, _A2>, _Up, true> 12513e519524SHoward Hinnant{ 12523e519524SHoward Hinnant typedef typename _Alloc<_Tp, _A0, _A1, _A2>::template rebind<_Up>::other type; 12533e519524SHoward Hinnant}; 12543e519524SHoward Hinnant 12553e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Alloc, class _Tp, class _A0, 12563e519524SHoward Hinnant class _A1, class _A2, class _Up> 12573e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1, _A2>, _Up, false> 12583e519524SHoward Hinnant{ 12593e519524SHoward Hinnant typedef _Alloc<_Up, _A0, _A1, _A2> type; 12603e519524SHoward Hinnant}; 12613e519524SHoward Hinnant 1262b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 12633e519524SHoward Hinnant 12643e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_ADVANCED_SFINAE 12653e519524SHoward Hinnant 12663e519524SHoward Hinnanttemplate <class _Alloc, class _SizeType, class _ConstVoidPtr> 12673e519524SHoward Hinnantauto 12683e519524SHoward Hinnant__has_allocate_hint_test(_Alloc&& __a, _SizeType&& __sz, _ConstVoidPtr&& __p) 12693e519524SHoward Hinnant -> decltype(__a.allocate(__sz, __p), true_type()); 12703e519524SHoward Hinnant 12713e519524SHoward Hinnanttemplate <class _Alloc, class _SizeType, class _ConstVoidPtr> 12723e519524SHoward Hinnantauto 12733e519524SHoward Hinnant__has_allocate_hint_test(const _Alloc& __a, _SizeType&& __sz, _ConstVoidPtr&& __p) 12743e519524SHoward Hinnant -> false_type; 12753e519524SHoward Hinnant 12763e519524SHoward Hinnanttemplate <class _Alloc, class _SizeType, class _ConstVoidPtr> 12773e519524SHoward Hinnantstruct __has_allocate_hint 12783e519524SHoward Hinnant : integral_constant<bool, 12793e519524SHoward Hinnant is_same< 12803e519524SHoward Hinnant decltype(__has_allocate_hint_test(declval<_Alloc>(), 12813e519524SHoward Hinnant declval<_SizeType>(), 12823e519524SHoward Hinnant declval<_ConstVoidPtr>())), 12833e519524SHoward Hinnant true_type>::value> 12843e519524SHoward Hinnant{ 12853e519524SHoward Hinnant}; 12863e519524SHoward Hinnant 1287b3371f6fSHoward Hinnant#else // _LIBCPP_HAS_NO_ADVANCED_SFINAE 12883e519524SHoward Hinnant 12893e519524SHoward Hinnanttemplate <class _Alloc, class _SizeType, class _ConstVoidPtr> 12903e519524SHoward Hinnantstruct __has_allocate_hint 12913e519524SHoward Hinnant : true_type 12923e519524SHoward Hinnant{ 12933e519524SHoward Hinnant}; 12943e519524SHoward Hinnant 1295b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_ADVANCED_SFINAE 12963e519524SHoward Hinnant 1297*89bdcd7eSHoward Hinnant#if !defined(_LIBCPP_HAS_NO_ADVANCED_SFINAE) && !defined(_LIBCPP_HAS_NO_VARIADICS) 12983e519524SHoward Hinnant 12993e519524SHoward Hinnanttemplate <class _Alloc, class _Tp, class ..._Args> 1300ce48a113SHoward Hinnantdecltype(_VSTD::declval<_Alloc>().construct(_VSTD::declval<_Tp*>(), 1301ce48a113SHoward Hinnant _VSTD::declval<_Args>()...), 13023e519524SHoward Hinnant true_type()) 13033e519524SHoward Hinnant__has_construct_test(_Alloc&& __a, _Tp* __p, _Args&& ...__args); 13043e519524SHoward Hinnant 13053e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer, class ..._Args> 13063e519524SHoward Hinnantfalse_type 13073e519524SHoward Hinnant__has_construct_test(const _Alloc& __a, _Pointer&& __p, _Args&& ...__args); 13083e519524SHoward Hinnant 13093e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer, class ..._Args> 13103e519524SHoward Hinnantstruct __has_construct 13113e519524SHoward Hinnant : integral_constant<bool, 13123e519524SHoward Hinnant is_same< 13133e519524SHoward Hinnant decltype(__has_construct_test(declval<_Alloc>(), 13143e519524SHoward Hinnant declval<_Pointer>(), 13153e519524SHoward Hinnant declval<_Args>()...)), 13163e519524SHoward Hinnant true_type>::value> 13173e519524SHoward Hinnant{ 13183e519524SHoward Hinnant}; 13193e519524SHoward Hinnant 13203e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer> 13213e519524SHoward Hinnantauto 13223e519524SHoward Hinnant__has_destroy_test(_Alloc&& __a, _Pointer&& __p) 13233e519524SHoward Hinnant -> decltype(__a.destroy(__p), true_type()); 13243e519524SHoward Hinnant 13253e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer> 13263e519524SHoward Hinnantauto 13273e519524SHoward Hinnant__has_destroy_test(const _Alloc& __a, _Pointer&& __p) 13283e519524SHoward Hinnant -> false_type; 13293e519524SHoward Hinnant 13303e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer> 13313e519524SHoward Hinnantstruct __has_destroy 13323e519524SHoward Hinnant : integral_constant<bool, 13333e519524SHoward Hinnant is_same< 13343e519524SHoward Hinnant decltype(__has_destroy_test(declval<_Alloc>(), 13353e519524SHoward Hinnant declval<_Pointer>())), 13363e519524SHoward Hinnant true_type>::value> 13373e519524SHoward Hinnant{ 13383e519524SHoward Hinnant}; 13393e519524SHoward Hinnant 13403e519524SHoward Hinnanttemplate <class _Alloc> 13413e519524SHoward Hinnantauto 13423e519524SHoward Hinnant__has_max_size_test(_Alloc&& __a) 13433e519524SHoward Hinnant -> decltype(__a.max_size(), true_type()); 13443e519524SHoward Hinnant 13453e519524SHoward Hinnanttemplate <class _Alloc> 13463e519524SHoward Hinnantauto 13473e519524SHoward Hinnant__has_max_size_test(const volatile _Alloc& __a) 13483e519524SHoward Hinnant -> false_type; 13493e519524SHoward Hinnant 13503e519524SHoward Hinnanttemplate <class _Alloc> 13513e519524SHoward Hinnantstruct __has_max_size 13523e519524SHoward Hinnant : integral_constant<bool, 13533e519524SHoward Hinnant is_same< 13543e519524SHoward Hinnant decltype(__has_max_size_test(declval<_Alloc&>())), 13553e519524SHoward Hinnant true_type>::value> 13563e519524SHoward Hinnant{ 13573e519524SHoward Hinnant}; 13583e519524SHoward Hinnant 13593e519524SHoward Hinnanttemplate <class _Alloc> 13603e519524SHoward Hinnantauto 13613e519524SHoward Hinnant__has_select_on_container_copy_construction_test(_Alloc&& __a) 13623e519524SHoward Hinnant -> decltype(__a.select_on_container_copy_construction(), true_type()); 13633e519524SHoward Hinnant 13643e519524SHoward Hinnanttemplate <class _Alloc> 13653e519524SHoward Hinnantauto 13663e519524SHoward Hinnant__has_select_on_container_copy_construction_test(const volatile _Alloc& __a) 13673e519524SHoward Hinnant -> false_type; 13683e519524SHoward Hinnant 13693e519524SHoward Hinnanttemplate <class _Alloc> 13703e519524SHoward Hinnantstruct __has_select_on_container_copy_construction 13713e519524SHoward Hinnant : integral_constant<bool, 13723e519524SHoward Hinnant is_same< 13733e519524SHoward Hinnant decltype(__has_select_on_container_copy_construction_test(declval<_Alloc&>())), 13743e519524SHoward Hinnant true_type>::value> 13753e519524SHoward Hinnant{ 13763e519524SHoward Hinnant}; 13773e519524SHoward Hinnant 1378b3371f6fSHoward Hinnant#else // _LIBCPP_HAS_NO_ADVANCED_SFINAE 13793e519524SHoward Hinnant 13803e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 13813e519524SHoward Hinnant 13823e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer, class ..._Args> 13833e519524SHoward Hinnantstruct __has_construct 13843e519524SHoward Hinnant : false_type 13853e519524SHoward Hinnant{ 13863e519524SHoward Hinnant}; 13873e519524SHoward Hinnant 1388b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 13893e519524SHoward Hinnant 13903e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer> 13913e519524SHoward Hinnantstruct __has_destroy 13923e519524SHoward Hinnant : false_type 13933e519524SHoward Hinnant{ 13943e519524SHoward Hinnant}; 13953e519524SHoward Hinnant 13963e519524SHoward Hinnanttemplate <class _Alloc> 13973e519524SHoward Hinnantstruct __has_max_size 13983e519524SHoward Hinnant : true_type 13993e519524SHoward Hinnant{ 14003e519524SHoward Hinnant}; 14013e519524SHoward Hinnant 14023e519524SHoward Hinnanttemplate <class _Alloc> 14033e519524SHoward Hinnantstruct __has_select_on_container_copy_construction 14043e519524SHoward Hinnant : false_type 14053e519524SHoward Hinnant{ 14063e519524SHoward Hinnant}; 14073e519524SHoward Hinnant 1408b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_ADVANCED_SFINAE 14093e519524SHoward Hinnant 1410a4a1ef1fSHoward Hinnanttemplate <class _Alloc, class _Ptr, bool = __has_difference_type<_Alloc>::value> 1411a4a1ef1fSHoward Hinnantstruct __alloc_traits_difference_type 1412a4a1ef1fSHoward Hinnant{ 1413a4a1ef1fSHoward Hinnant typedef typename pointer_traits<_Ptr>::difference_type type; 1414a4a1ef1fSHoward Hinnant}; 1415a4a1ef1fSHoward Hinnant 1416a4a1ef1fSHoward Hinnanttemplate <class _Alloc, class _Ptr> 1417a4a1ef1fSHoward Hinnantstruct __alloc_traits_difference_type<_Alloc, _Ptr, true> 1418a4a1ef1fSHoward Hinnant{ 1419a4a1ef1fSHoward Hinnant typedef typename _Alloc::difference_type type; 1420a4a1ef1fSHoward Hinnant}; 1421a4a1ef1fSHoward Hinnant 14223e519524SHoward Hinnanttemplate <class _Alloc> 1423848a5374SHoward Hinnantstruct _LIBCPP_VISIBLE allocator_traits 14243e519524SHoward Hinnant{ 14253e519524SHoward Hinnant typedef _Alloc allocator_type; 14263e519524SHoward Hinnant typedef typename allocator_type::value_type value_type; 14273e519524SHoward Hinnant 14283e519524SHoward Hinnant typedef typename __pointer_type<value_type, allocator_type>::type pointer; 14293e519524SHoward Hinnant typedef typename __const_pointer<value_type, pointer, allocator_type>::type const_pointer; 14303e519524SHoward Hinnant typedef typename __void_pointer<pointer, allocator_type>::type void_pointer; 14313e519524SHoward Hinnant typedef typename __const_void_pointer<pointer, allocator_type>::type const_void_pointer; 14323e519524SHoward Hinnant 1433a4a1ef1fSHoward Hinnant typedef typename __alloc_traits_difference_type<allocator_type, pointer>::type difference_type; 1434a4a1ef1fSHoward Hinnant typedef typename __size_type<allocator_type, difference_type>::type size_type; 14353e519524SHoward Hinnant 14363e519524SHoward Hinnant typedef typename __propagate_on_container_copy_assignment<allocator_type>::type 14373e519524SHoward Hinnant propagate_on_container_copy_assignment; 14383e519524SHoward Hinnant typedef typename __propagate_on_container_move_assignment<allocator_type>::type 14393e519524SHoward Hinnant propagate_on_container_move_assignment; 14403e519524SHoward Hinnant typedef typename __propagate_on_container_swap<allocator_type>::type 14413e519524SHoward Hinnant propagate_on_container_swap; 14423e519524SHoward Hinnant 14433e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 14443e519524SHoward Hinnant template <class _Tp> using rebind_alloc = 1445f7384975SHoward Hinnant typename __allocator_traits_rebind<allocator_type, _Tp>::type; 14463e519524SHoward Hinnant template <class _Tp> using rebind_traits = allocator_traits<rebind_alloc<_Tp>>; 1447b3371f6fSHoward Hinnant#else // _LIBCPP_HAS_NO_TEMPLATE_ALIASES 14483e519524SHoward Hinnant template <class _Tp> struct rebind_alloc 14493e519524SHoward Hinnant {typedef typename __allocator_traits_rebind<allocator_type, _Tp>::type other;}; 14503e519524SHoward Hinnant template <class _Tp> struct rebind_traits 14513e519524SHoward Hinnant {typedef allocator_traits<typename rebind_alloc<_Tp>::other> other;}; 1452b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_TEMPLATE_ALIASES 14533e519524SHoward Hinnant 1454848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14553e519524SHoward Hinnant static pointer allocate(allocator_type& __a, size_type __n) 14563e519524SHoward Hinnant {return __a.allocate(__n);} 1457848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14583e519524SHoward Hinnant static pointer allocate(allocator_type& __a, size_type __n, const_void_pointer __hint) 14593e519524SHoward Hinnant {return allocate(__a, __n, __hint, 14603e519524SHoward Hinnant __has_allocate_hint<allocator_type, size_type, const_void_pointer>());} 14613e519524SHoward Hinnant 1462848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14633739fe79SHoward Hinnant static void deallocate(allocator_type& __a, pointer __p, size_type __n) _NOEXCEPT 14643e519524SHoward Hinnant {__a.deallocate(__p, __n);} 14653e519524SHoward Hinnant 14663e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 14673e519524SHoward Hinnant template <class _Tp, class... _Args> 1468848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14693e519524SHoward Hinnant static void construct(allocator_type& __a, _Tp* __p, _Args&&... __args) 14703e519524SHoward Hinnant {__construct(__has_construct<allocator_type, pointer, _Args...>(), 1471ce48a113SHoward Hinnant __a, __p, _VSTD::forward<_Args>(__args)...);} 1472b3371f6fSHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 14733e519524SHoward Hinnant template <class _Tp> 1474848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14753e519524SHoward Hinnant static void construct(allocator_type& __a, _Tp* __p) 14763e519524SHoward Hinnant { 14773e519524SHoward Hinnant ::new ((void*)__p) _Tp(); 14783e519524SHoward Hinnant } 14793e519524SHoward Hinnant template <class _Tp, class _A0> 1480848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14813e519524SHoward Hinnant static void construct(allocator_type& __a, _Tp* __p, const _A0& __a0) 14823e519524SHoward Hinnant { 14833e519524SHoward Hinnant ::new ((void*)__p) _Tp(__a0); 14843e519524SHoward Hinnant } 14853e519524SHoward Hinnant template <class _Tp, class _A0, class _A1> 1486848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14873e519524SHoward Hinnant static void construct(allocator_type& __a, _Tp* __p, const _A0& __a0, 14883e519524SHoward Hinnant const _A1& __a1) 14893e519524SHoward Hinnant { 14903e519524SHoward Hinnant ::new ((void*)__p) _Tp(__a0, __a1); 14913e519524SHoward Hinnant } 14923e519524SHoward Hinnant template <class _Tp, class _A0, class _A1, class _A2> 1493848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14943e519524SHoward Hinnant static void construct(allocator_type& __a, _Tp* __p, const _A0& __a0, 14953e519524SHoward Hinnant const _A1& __a1, const _A2& __a2) 14963e519524SHoward Hinnant { 14973e519524SHoward Hinnant ::new ((void*)__p) _Tp(__a0, __a1, __a2); 14983e519524SHoward Hinnant } 1499b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 15003e519524SHoward Hinnant 15013e519524SHoward Hinnant template <class _Tp> 1502848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15033e519524SHoward Hinnant static void destroy(allocator_type& __a, _Tp* __p) 15043e519524SHoward Hinnant {__destroy(__has_destroy<allocator_type, _Tp*>(), __a, __p);} 15053e519524SHoward Hinnant 1506848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15073e519524SHoward Hinnant static size_type max_size(const allocator_type& __a) 15083e519524SHoward Hinnant {return __max_size(__has_max_size<const allocator_type>(), __a);} 15093e519524SHoward Hinnant 1510848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15113e519524SHoward Hinnant static allocator_type 15123e519524SHoward Hinnant select_on_container_copy_construction(const allocator_type& __a) 15133e519524SHoward Hinnant {return select_on_container_copy_construction( 15143e519524SHoward Hinnant __has_select_on_container_copy_construction<const allocator_type>(), 15153e519524SHoward Hinnant __a);} 15163e519524SHoward Hinnant 15173e519524SHoward Hinnantprivate: 15183e519524SHoward Hinnant 1519848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15203e519524SHoward Hinnant static pointer allocate(allocator_type& __a, size_type __n, 15213e519524SHoward Hinnant const_void_pointer __hint, true_type) 15223e519524SHoward Hinnant {return __a.allocate(__n, __hint);} 1523848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15243e519524SHoward Hinnant static pointer allocate(allocator_type& __a, size_type __n, 15253e519524SHoward Hinnant const_void_pointer __hint, false_type) 15263e519524SHoward Hinnant {return __a.allocate(__n);} 15273e519524SHoward Hinnant 15283e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 15293e519524SHoward Hinnant template <class _Tp, class... _Args> 1530848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15313e519524SHoward Hinnant static void __construct(true_type, allocator_type& __a, _Tp* __p, _Args&&... __args) 1532ce48a113SHoward Hinnant {__a.construct(__p, _VSTD::forward<_Args>(__args)...);} 15333e519524SHoward Hinnant template <class _Tp, class... _Args> 1534848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15353e519524SHoward Hinnant static void __construct(false_type, allocator_type&, _Tp* __p, _Args&&... __args) 15363e519524SHoward Hinnant { 1537ce48a113SHoward Hinnant ::new ((void*)__p) _Tp(_VSTD::forward<_Args>(__args)...); 15383e519524SHoward Hinnant } 1539b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 15403e519524SHoward Hinnant 15413e519524SHoward Hinnant template <class _Tp> 1542848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15433e519524SHoward Hinnant static void __destroy(true_type, allocator_type& __a, _Tp* __p) 15443e519524SHoward Hinnant {__a.destroy(__p);} 15453e519524SHoward Hinnant template <class _Tp> 1546848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15473e519524SHoward Hinnant static void __destroy(false_type, allocator_type&, _Tp* __p) 15483e519524SHoward Hinnant { 15493e519524SHoward Hinnant __p->~_Tp(); 15503e519524SHoward Hinnant } 15513e519524SHoward Hinnant 1552848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15533e519524SHoward Hinnant static size_type __max_size(true_type, const allocator_type& __a) 15543e519524SHoward Hinnant {return __a.max_size();} 1555848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15563e519524SHoward Hinnant static size_type __max_size(false_type, const allocator_type&) 15573e519524SHoward Hinnant {return numeric_limits<size_type>::max();} 15583e519524SHoward Hinnant 1559848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15603e519524SHoward Hinnant static allocator_type 15613e519524SHoward Hinnant select_on_container_copy_construction(true_type, const allocator_type& __a) 15623e519524SHoward Hinnant {return __a.select_on_container_copy_construction();} 1563848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15643e519524SHoward Hinnant static allocator_type 15653e519524SHoward Hinnant select_on_container_copy_construction(false_type, const allocator_type& __a) 15663e519524SHoward Hinnant {return __a;} 15673e519524SHoward Hinnant}; 15683e519524SHoward Hinnant 15693e519524SHoward Hinnant// uses_allocator 15703e519524SHoward Hinnant 15713e519524SHoward Hinnanttemplate <class _Tp> 15723e519524SHoward Hinnantstruct __has_allocator_type 15733e519524SHoward Hinnant{ 15743e519524SHoward Hinnantprivate: 15753e519524SHoward Hinnant struct __two {char _; char __;}; 15763e519524SHoward Hinnant template <class _Up> static __two __test(...); 15773e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::allocator_type* = 0); 15783e519524SHoward Hinnantpublic: 15793e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 15803e519524SHoward Hinnant}; 15813e519524SHoward Hinnant 15823e519524SHoward Hinnanttemplate <class _Tp, class _Alloc, bool = __has_allocator_type<_Tp>::value> 15833e519524SHoward Hinnantstruct __uses_allocator 15843e519524SHoward Hinnant : public integral_constant<bool, 15853e519524SHoward Hinnant is_convertible<_Alloc, typename _Tp::allocator_type>::value> 15863e519524SHoward Hinnant{ 15873e519524SHoward Hinnant}; 15883e519524SHoward Hinnant 15893e519524SHoward Hinnanttemplate <class _Tp, class _Alloc> 15903e519524SHoward Hinnantstruct __uses_allocator<_Tp, _Alloc, false> 15913e519524SHoward Hinnant : public false_type 15923e519524SHoward Hinnant{ 15933e519524SHoward Hinnant}; 15943e519524SHoward Hinnant 15953e519524SHoward Hinnanttemplate <class _Tp, class _Alloc> 1596848a5374SHoward Hinnantstruct _LIBCPP_VISIBLE uses_allocator 15973e519524SHoward Hinnant : public __uses_allocator<_Tp, _Alloc> 15983e519524SHoward Hinnant{ 15993e519524SHoward Hinnant}; 16003e519524SHoward Hinnant 1601119cd0baSHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 16023e519524SHoward Hinnant 16033e519524SHoward Hinnant// uses-allocator construction 16043e519524SHoward Hinnant 16053e519524SHoward Hinnanttemplate <class _Tp, class _Alloc, class ..._Args> 16063e519524SHoward Hinnantstruct __uses_alloc_ctor_imp 16073e519524SHoward Hinnant{ 16083e519524SHoward Hinnant static const bool __ua = uses_allocator<_Tp, _Alloc>::value; 16093e519524SHoward Hinnant static const bool __ic = 16103e519524SHoward Hinnant is_constructible<_Tp, allocator_arg_t, _Alloc, _Args...>::value; 16113e519524SHoward Hinnant static const int value = __ua ? 2 - __ic : 0; 16123e519524SHoward Hinnant}; 16133e519524SHoward Hinnant 16143e519524SHoward Hinnanttemplate <class _Tp, class _Alloc, class ..._Args> 16153e519524SHoward Hinnantstruct __uses_alloc_ctor 16163e519524SHoward Hinnant : integral_constant<int, __uses_alloc_ctor_imp<_Tp, _Alloc, _Args...>::value> 16173e519524SHoward Hinnant {}; 16183e519524SHoward Hinnant 1619119cd0baSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 16203e519524SHoward Hinnant 16213e519524SHoward Hinnant// allocator 16223e519524SHoward Hinnant 16233e519524SHoward Hinnanttemplate <class _Tp> 1624f9cca3b7SHoward Hinnantclass _LIBCPP_VISIBLE allocator 16253e519524SHoward Hinnant{ 16263e519524SHoward Hinnantpublic: 16273e519524SHoward Hinnant typedef size_t size_type; 16283e519524SHoward Hinnant typedef ptrdiff_t difference_type; 16293e519524SHoward Hinnant typedef _Tp* pointer; 16303e519524SHoward Hinnant typedef const _Tp* const_pointer; 16313e519524SHoward Hinnant typedef _Tp& reference; 16323e519524SHoward Hinnant typedef const _Tp& const_reference; 16333e519524SHoward Hinnant typedef _Tp value_type; 16343e519524SHoward Hinnant 1635b58f59cdSHoward Hinnant typedef true_type propagate_on_container_move_assignment; 1636b58f59cdSHoward Hinnant 16373e519524SHoward Hinnant template <class _Up> struct rebind {typedef allocator<_Up> other;}; 16383e519524SHoward Hinnant 16393739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY allocator() _NOEXCEPT {} 16403739fe79SHoward Hinnant template <class _Up> _LIBCPP_INLINE_VISIBILITY allocator(const allocator<_Up>&) _NOEXCEPT {} 16413739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer address(reference __x) const _NOEXCEPT 1642ce48a113SHoward Hinnant {return _VSTD::addressof(__x);} 16433739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY const_pointer address(const_reference __x) const _NOEXCEPT 1644ce48a113SHoward Hinnant {return _VSTD::addressof(__x);} 16453e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer allocate(size_type __n, allocator<void>::const_pointer = 0) 16463e519524SHoward Hinnant {return static_cast<pointer>(::operator new(__n * sizeof(_Tp)));} 16473739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void deallocate(pointer __p, size_type) _NOEXCEPT 16483739fe79SHoward Hinnant {::operator delete((void*)__p);} 16493739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT 16503739fe79SHoward Hinnant {return size_type(~0) / sizeof(_Tp);} 16517609c9b6SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 16523e519524SHoward Hinnant template <class _Up, class... _Args> 16533e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16543e519524SHoward Hinnant void 16553e519524SHoward Hinnant construct(_Up* __p, _Args&&... __args) 16563e519524SHoward Hinnant { 1657ce48a113SHoward Hinnant ::new((void*)__p) _Up(_VSTD::forward<_Args>(__args)...); 16583e519524SHoward Hinnant } 16597609c9b6SHoward Hinnant#else // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 16603e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16613e519524SHoward Hinnant void 16623e519524SHoward Hinnant construct(pointer __p) 16633e519524SHoward Hinnant { 16643e519524SHoward Hinnant ::new((void*)__p) _Tp(); 16653e519524SHoward Hinnant } 1666f5799be4SMichael J. Spencer# if defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) 16673e519524SHoward Hinnant template <class _A0> 16683e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16693e519524SHoward Hinnant typename enable_if 16703e519524SHoward Hinnant < 16713e519524SHoward Hinnant !is_convertible<_A0, __rv<_A0> >::value, 16723e519524SHoward Hinnant void 16733e519524SHoward Hinnant >::type 16743e519524SHoward Hinnant construct(pointer __p, _A0& __a0) 16753e519524SHoward Hinnant { 16763e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0); 16773e519524SHoward Hinnant } 16783e519524SHoward Hinnant template <class _A0> 16793e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16803e519524SHoward Hinnant typename enable_if 16813e519524SHoward Hinnant < 16823e519524SHoward Hinnant !is_convertible<_A0, __rv<_A0> >::value, 16833e519524SHoward Hinnant void 16843e519524SHoward Hinnant >::type 16853e519524SHoward Hinnant construct(pointer __p, const _A0& __a0) 16863e519524SHoward Hinnant { 16873e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0); 16883e519524SHoward Hinnant } 16893e519524SHoward Hinnant template <class _A0> 16903e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16913e519524SHoward Hinnant typename enable_if 16923e519524SHoward Hinnant < 16933e519524SHoward Hinnant is_convertible<_A0, __rv<_A0> >::value, 16943e519524SHoward Hinnant void 16953e519524SHoward Hinnant >::type 16963e519524SHoward Hinnant construct(pointer __p, _A0 __a0) 16973e519524SHoward Hinnant { 1698ce48a113SHoward Hinnant ::new((void*)__p) _Tp(_VSTD::move(__a0)); 16993e519524SHoward Hinnant } 1700f5799be4SMichael J. Spencer# endif // defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) 17013e519524SHoward Hinnant template <class _A0, class _A1> 17023e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17033e519524SHoward Hinnant void 17043e519524SHoward Hinnant construct(pointer __p, _A0& __a0, _A1& __a1) 17053e519524SHoward Hinnant { 17063e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 17073e519524SHoward Hinnant } 17083e519524SHoward Hinnant template <class _A0, class _A1> 17093e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17103e519524SHoward Hinnant void 17113e519524SHoward Hinnant construct(pointer __p, const _A0& __a0, _A1& __a1) 17123e519524SHoward Hinnant { 17133e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 17143e519524SHoward Hinnant } 17153e519524SHoward Hinnant template <class _A0, class _A1> 17163e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17173e519524SHoward Hinnant void 17183e519524SHoward Hinnant construct(pointer __p, _A0& __a0, const _A1& __a1) 17193e519524SHoward Hinnant { 17203e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 17213e519524SHoward Hinnant } 17223e519524SHoward Hinnant template <class _A0, class _A1> 17233e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17243e519524SHoward Hinnant void 17253e519524SHoward Hinnant construct(pointer __p, const _A0& __a0, const _A1& __a1) 17263e519524SHoward Hinnant { 17273e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 17283e519524SHoward Hinnant } 17297609c9b6SHoward Hinnant#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 17303e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void destroy(pointer __p) {__p->~_Tp();} 17313e519524SHoward Hinnant}; 17323e519524SHoward Hinnant 17333e519524SHoward Hinnanttemplate <class _Tp, class _Up> 17343e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 17353739fe79SHoward Hinnantbool operator==(const allocator<_Tp>&, const allocator<_Up>&) _NOEXCEPT {return true;} 17363e519524SHoward Hinnant 17373e519524SHoward Hinnanttemplate <class _Tp, class _Up> 17383e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 17393739fe79SHoward Hinnantbool operator!=(const allocator<_Tp>&, const allocator<_Up>&) _NOEXCEPT {return false;} 17403e519524SHoward Hinnant 17413e519524SHoward Hinnanttemplate <class _OutputIterator, class _Tp> 1742848a5374SHoward Hinnantclass _LIBCPP_VISIBLE raw_storage_iterator 17433e519524SHoward Hinnant : public iterator<output_iterator_tag, 17443e519524SHoward Hinnant _Tp, // purposefully not C++03 17453e519524SHoward Hinnant ptrdiff_t, // purposefully not C++03 17463e519524SHoward Hinnant _Tp*, // purposefully not C++03 17473e519524SHoward Hinnant raw_storage_iterator<_OutputIterator, _Tp>&> // purposefully not C++03 17483e519524SHoward Hinnant{ 17493e519524SHoward Hinnantprivate: 17503e519524SHoward Hinnant _OutputIterator __x_; 17513e519524SHoward Hinnantpublic: 17523e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit raw_storage_iterator(_OutputIterator __x) : __x_(__x) {} 17533e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator*() {return *this;} 17543e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator=(const _Tp& __element) 17553e519524SHoward Hinnant {::new(&*__x_) _Tp(__element); return *this;} 17563e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator++() {++__x_; return *this;} 17573e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY raw_storage_iterator operator++(int) 17583e519524SHoward Hinnant {raw_storage_iterator __t(*this); ++__x_; return __t;} 17593e519524SHoward Hinnant}; 17603e519524SHoward Hinnant 17613e519524SHoward Hinnanttemplate <class _Tp> 17623e519524SHoward Hinnantpair<_Tp*, ptrdiff_t> 17633739fe79SHoward Hinnantget_temporary_buffer(ptrdiff_t __n) _NOEXCEPT 17643e519524SHoward Hinnant{ 17653e519524SHoward Hinnant pair<_Tp*, ptrdiff_t> __r(0, 0); 17663e519524SHoward Hinnant const ptrdiff_t __m = (~ptrdiff_t(0) ^ 17673e519524SHoward Hinnant ptrdiff_t(ptrdiff_t(1) << (sizeof(ptrdiff_t) * __CHAR_BIT__ - 1))) 17683e519524SHoward Hinnant / sizeof(_Tp); 17693e519524SHoward Hinnant if (__n > __m) 17703e519524SHoward Hinnant __n = __m; 17713e519524SHoward Hinnant while (__n > 0) 17723e519524SHoward Hinnant { 17733e519524SHoward Hinnant __r.first = static_cast<_Tp*>(::operator new(__n * sizeof(_Tp), nothrow)); 17743e519524SHoward Hinnant if (__r.first) 17753e519524SHoward Hinnant { 17763e519524SHoward Hinnant __r.second = __n; 17773e519524SHoward Hinnant break; 17783e519524SHoward Hinnant } 17793e519524SHoward Hinnant __n /= 2; 17803e519524SHoward Hinnant } 17813e519524SHoward Hinnant return __r; 17823e519524SHoward Hinnant} 17833e519524SHoward Hinnant 17843e519524SHoward Hinnanttemplate <class _Tp> 17853e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 17863739fe79SHoward Hinnantvoid return_temporary_buffer(_Tp* __p) _NOEXCEPT {::operator delete(__p);} 17873e519524SHoward Hinnant 17883e519524SHoward Hinnanttemplate <class _Tp> 17893e519524SHoward Hinnantstruct auto_ptr_ref 17903e519524SHoward Hinnant{ 17913e519524SHoward Hinnant _Tp* __ptr_; 17923e519524SHoward Hinnant}; 17933e519524SHoward Hinnant 17943e519524SHoward Hinnanttemplate<class _Tp> 1795848a5374SHoward Hinnantclass _LIBCPP_VISIBLE auto_ptr 17963e519524SHoward Hinnant{ 17973e519524SHoward Hinnantprivate: 17983e519524SHoward Hinnant _Tp* __ptr_; 17993e519524SHoward Hinnantpublic: 18003e519524SHoward Hinnant typedef _Tp element_type; 18013e519524SHoward Hinnant 18023e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit auto_ptr(_Tp* __p = 0) throw() : __ptr_(__p) {} 18033e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr& __p) throw() : __ptr_(__p.release()) {} 18043e519524SHoward Hinnant template<class _Up> _LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr<_Up>& __p) throw() 18053e519524SHoward Hinnant : __ptr_(__p.release()) {} 18063e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr& __p) throw() 18073e519524SHoward Hinnant {reset(__p.release()); return *this;} 18083e519524SHoward Hinnant template<class _Up> _LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr<_Up>& __p) throw() 18093e519524SHoward Hinnant {reset(__p.release()); return *this;} 18103e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr_ref<_Tp> __p) throw() 18113e519524SHoward Hinnant {reset(__p.__ptr_); return *this;} 18123e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY ~auto_ptr() throw() {delete __ptr_;} 18133e519524SHoward Hinnant 18143e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Tp& operator*() const throw() 18153e519524SHoward Hinnant {return *__ptr_;} 18163e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Tp* operator->() const throw() {return __ptr_;} 18173e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Tp* get() const throw() {return __ptr_;} 18183e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Tp* release() throw() 18193e519524SHoward Hinnant { 18203e519524SHoward Hinnant _Tp* __t = __ptr_; 18213e519524SHoward Hinnant __ptr_ = 0; 18223e519524SHoward Hinnant return __t; 18233e519524SHoward Hinnant } 18243e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void reset(_Tp* __p = 0) throw() 18253e519524SHoward Hinnant { 18263e519524SHoward Hinnant if (__ptr_ != __p) 18273e519524SHoward Hinnant delete __ptr_; 18283e519524SHoward Hinnant __ptr_ = __p; 18293e519524SHoward Hinnant } 18303e519524SHoward Hinnant 18313e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr_ref<_Tp> __p) throw() : __ptr_(__p.__ptr_) {} 18323e519524SHoward Hinnant template<class _Up> _LIBCPP_INLINE_VISIBILITY operator auto_ptr_ref<_Up>() throw() 18333e519524SHoward Hinnant {auto_ptr_ref<_Up> __t; __t.__ptr_ = release(); return __t;} 18343e519524SHoward Hinnant template<class _Up> _LIBCPP_INLINE_VISIBILITY operator auto_ptr<_Up>() throw() 18353e519524SHoward Hinnant {return auto_ptr<_Up>(release());} 18363e519524SHoward Hinnant}; 18373e519524SHoward Hinnant 18383e519524SHoward Hinnanttemplate <> 1839848a5374SHoward Hinnantclass _LIBCPP_VISIBLE auto_ptr<void> 18403e519524SHoward Hinnant{ 18413e519524SHoward Hinnantpublic: 18423e519524SHoward Hinnant typedef void element_type; 18433e519524SHoward Hinnant}; 18443e519524SHoward Hinnant 18453e519524SHoward Hinnanttemplate <class _T1, class _T2, bool = is_same<typename remove_cv<_T1>::type, 18463e519524SHoward Hinnant typename remove_cv<_T2>::type>::value, 18473e519524SHoward Hinnant bool = is_empty<_T1>::value, 18483e519524SHoward Hinnant bool = is_empty<_T2>::value> 18493e519524SHoward Hinnantstruct __libcpp_compressed_pair_switch; 18503e519524SHoward Hinnant 18513e519524SHoward Hinnanttemplate <class _T1, class _T2, bool IsSame> 18523e519524SHoward Hinnantstruct __libcpp_compressed_pair_switch<_T1, _T2, IsSame, false, false> {enum {value = 0};}; 18533e519524SHoward Hinnant 18543e519524SHoward Hinnanttemplate <class _T1, class _T2, bool IsSame> 18553e519524SHoward Hinnantstruct __libcpp_compressed_pair_switch<_T1, _T2, IsSame, true, false> {enum {value = 1};}; 18563e519524SHoward Hinnant 18573e519524SHoward Hinnanttemplate <class _T1, class _T2, bool IsSame> 18583e519524SHoward Hinnantstruct __libcpp_compressed_pair_switch<_T1, _T2, IsSame, false, true> {enum {value = 2};}; 18593e519524SHoward Hinnant 18603e519524SHoward Hinnanttemplate <class _T1, class _T2> 18613e519524SHoward Hinnantstruct __libcpp_compressed_pair_switch<_T1, _T2, false, true, true> {enum {value = 3};}; 18623e519524SHoward Hinnant 18633e519524SHoward Hinnanttemplate <class _T1, class _T2> 18643e519524SHoward Hinnantstruct __libcpp_compressed_pair_switch<_T1, _T2, true, true, true> {enum {value = 1};}; 18653e519524SHoward Hinnant 18663e519524SHoward Hinnanttemplate <class _T1, class _T2, unsigned = __libcpp_compressed_pair_switch<_T1, _T2>::value> 18673e519524SHoward Hinnantclass __libcpp_compressed_pair_imp; 18683e519524SHoward Hinnant 18693e519524SHoward Hinnanttemplate <class _T1, class _T2> 18703e519524SHoward Hinnantclass __libcpp_compressed_pair_imp<_T1, _T2, 0> 18713e519524SHoward Hinnant{ 18723e519524SHoward Hinnantprivate: 18733e519524SHoward Hinnant _T1 __first_; 18743e519524SHoward Hinnant _T2 __second_; 18753e519524SHoward Hinnantpublic: 18763e519524SHoward Hinnant typedef _T1 _T1_param; 18773e519524SHoward Hinnant typedef _T2 _T2_param; 18783e519524SHoward Hinnant 18793e519524SHoward Hinnant typedef typename remove_reference<_T1>::type& _T1_reference; 18803e519524SHoward Hinnant typedef typename remove_reference<_T2>::type& _T2_reference; 18813e519524SHoward Hinnant 18823e519524SHoward Hinnant typedef const typename remove_reference<_T1>::type& _T1_const_reference; 18833e519524SHoward Hinnant typedef const typename remove_reference<_T2>::type& _T2_const_reference; 18843e519524SHoward Hinnant 18853e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp() {} 18863e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T1_param __t1, int = 0) 1887ce48a113SHoward Hinnant : __first_(_VSTD::forward<_T1_param>(__t1)) {} 18883e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T2_param __t2, int* = 0) 1889ce48a113SHoward Hinnant : __second_(_VSTD::forward<_T2_param>(__t2)) {} 18903e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(_T1_param __t1, _T2_param __t2) 1891ce48a113SHoward Hinnant : __first_(_VSTD::forward<_T1_param>(__t1)), __second_(_VSTD::forward<_T2_param>(__t2)) {} 18923e519524SHoward Hinnant 18935a33687dSHoward Hinnant#ifdef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS 18945a33687dSHoward Hinnant 18955a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18965a33687dSHoward Hinnant __libcpp_compressed_pair_imp(const __libcpp_compressed_pair_imp& __p) 18975a33687dSHoward Hinnant _NOEXCEPT_(is_nothrow_copy_constructible<_T1>::value && 18985a33687dSHoward Hinnant is_nothrow_copy_constructible<_T2>::value) 18995a33687dSHoward Hinnant : __first_(__p.first()), 19005a33687dSHoward Hinnant __second_(__p.second()) {} 19015a33687dSHoward Hinnant 19025a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19035a33687dSHoward Hinnant __libcpp_compressed_pair_imp& operator=(const __libcpp_compressed_pair_imp& __p) 19045a33687dSHoward Hinnant _NOEXCEPT_(is_nothrow_copy_assignable<_T1>::value && 19055a33687dSHoward Hinnant is_nothrow_copy_assignable<_T2>::value) 19065a33687dSHoward Hinnant { 19075a33687dSHoward Hinnant __first_ = __p.first(); 19085a33687dSHoward Hinnant __second_ = __p.second(); 19095a33687dSHoward Hinnant return *this; 19105a33687dSHoward Hinnant } 19115a33687dSHoward Hinnant 19127609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 19135a33687dSHoward Hinnant 19145a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19155a33687dSHoward Hinnant __libcpp_compressed_pair_imp(__libcpp_compressed_pair_imp&& __p) 19163739fe79SHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<_T1>::value && 19173739fe79SHoward Hinnant is_nothrow_move_constructible<_T2>::value) 19185a33687dSHoward Hinnant : __first_(_VSTD::forward<_T1>(__p.first())), 19195a33687dSHoward Hinnant __second_(_VSTD::forward<_T2>(__p.second())) {} 19205a33687dSHoward Hinnant 19215a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19225a33687dSHoward Hinnant __libcpp_compressed_pair_imp& operator=(__libcpp_compressed_pair_imp&& __p) 19235a33687dSHoward Hinnant _NOEXCEPT_(is_nothrow_move_assignable<_T1>::value && 19245a33687dSHoward Hinnant is_nothrow_move_assignable<_T2>::value) 19255a33687dSHoward Hinnant { 19265a33687dSHoward Hinnant __first_ = _VSTD::forward<_T1>(__p.first()); 19275a33687dSHoward Hinnant __second_ = _VSTD::forward<_T2>(__p.second()); 19285a33687dSHoward Hinnant return *this; 19295a33687dSHoward Hinnant } 19305a33687dSHoward Hinnant 19317609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 19323e519524SHoward Hinnant 19335a33687dSHoward Hinnant#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS 19345a33687dSHoward Hinnant 19353739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return __first_;} 19363739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return __first_;} 19373e519524SHoward Hinnant 19383739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_reference second() _NOEXCEPT {return __second_;} 19393739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_const_reference second() const _NOEXCEPT {return __second_;} 19403e519524SHoward Hinnant 19413e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void swap(__libcpp_compressed_pair_imp& __x) 19423739fe79SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && 19433739fe79SHoward Hinnant __is_nothrow_swappable<_T1>::value) 19443e519524SHoward Hinnant { 1945ce48a113SHoward Hinnant using _VSTD::swap; 19463e519524SHoward Hinnant swap(__first_, __x.__first_); 19473e519524SHoward Hinnant swap(__second_, __x.__second_); 19483e519524SHoward Hinnant } 19493e519524SHoward Hinnant}; 19503e519524SHoward Hinnant 19513e519524SHoward Hinnanttemplate <class _T1, class _T2> 19523e519524SHoward Hinnantclass __libcpp_compressed_pair_imp<_T1, _T2, 1> 19533e519524SHoward Hinnant : private _T1 19543e519524SHoward Hinnant{ 19553e519524SHoward Hinnantprivate: 19563e519524SHoward Hinnant _T2 __second_; 19573e519524SHoward Hinnantpublic: 19583e519524SHoward Hinnant typedef _T1 _T1_param; 19593e519524SHoward Hinnant typedef _T2 _T2_param; 19603e519524SHoward Hinnant 19613e519524SHoward Hinnant typedef _T1& _T1_reference; 19623e519524SHoward Hinnant typedef typename remove_reference<_T2>::type& _T2_reference; 19633e519524SHoward Hinnant 19643e519524SHoward Hinnant typedef const _T1& _T1_const_reference; 19653e519524SHoward Hinnant typedef const typename remove_reference<_T2>::type& _T2_const_reference; 19663e519524SHoward Hinnant 19673e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp() {} 19683e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T1_param __t1, int = 0) 1969ce48a113SHoward Hinnant : _T1(_VSTD::forward<_T1_param>(__t1)) {} 19703e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T2_param __t2, int* = 0) 1971ce48a113SHoward Hinnant : __second_(_VSTD::forward<_T2_param>(__t2)) {} 19723e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(_T1_param __t1, _T2_param __t2) 1973ce48a113SHoward Hinnant : _T1(_VSTD::forward<_T1_param>(__t1)), __second_(_VSTD::forward<_T2_param>(__t2)) {} 19743e519524SHoward Hinnant 19755a33687dSHoward Hinnant#ifdef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS 19765a33687dSHoward Hinnant 19775a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19785a33687dSHoward Hinnant __libcpp_compressed_pair_imp(const __libcpp_compressed_pair_imp& __p) 19795a33687dSHoward Hinnant _NOEXCEPT_(is_nothrow_copy_constructible<_T1>::value && 19805a33687dSHoward Hinnant is_nothrow_copy_constructible<_T2>::value) 19815a33687dSHoward Hinnant : _T1(__p.first()), __second_(__p.second()) {} 19825a33687dSHoward Hinnant 19835a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19845a33687dSHoward Hinnant __libcpp_compressed_pair_imp& operator=(const __libcpp_compressed_pair_imp& __p) 19855a33687dSHoward Hinnant _NOEXCEPT_(is_nothrow_copy_assignable<_T1>::value && 19865a33687dSHoward Hinnant is_nothrow_copy_assignable<_T2>::value) 19875a33687dSHoward Hinnant { 19885a33687dSHoward Hinnant _T1::operator=(__p.first()); 19895a33687dSHoward Hinnant __second_ = __p.second(); 19905a33687dSHoward Hinnant return *this; 19915a33687dSHoward Hinnant } 19925a33687dSHoward Hinnant 19937609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 19945a33687dSHoward Hinnant 19955a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19965a33687dSHoward Hinnant __libcpp_compressed_pair_imp(__libcpp_compressed_pair_imp&& __p) 19973739fe79SHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<_T1>::value && 19983739fe79SHoward Hinnant is_nothrow_move_constructible<_T2>::value) 1999ce48a113SHoward Hinnant : _T1(_VSTD::move(__p.first())), __second_(_VSTD::forward<_T2>(__p.second())) {} 20005a33687dSHoward Hinnant 20015a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20025a33687dSHoward Hinnant __libcpp_compressed_pair_imp& operator=(__libcpp_compressed_pair_imp&& __p) 20035a33687dSHoward Hinnant _NOEXCEPT_(is_nothrow_move_assignable<_T1>::value && 20045a33687dSHoward Hinnant is_nothrow_move_assignable<_T2>::value) 20055a33687dSHoward Hinnant { 20065a33687dSHoward Hinnant _T1::operator=(_VSTD::move(__p.first())); 20075a33687dSHoward Hinnant __second_ = _VSTD::forward<_T2>(__p.second()); 20085a33687dSHoward Hinnant return *this; 20095a33687dSHoward Hinnant } 20105a33687dSHoward Hinnant 20117609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 20123e519524SHoward Hinnant 20135a33687dSHoward Hinnant#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS 20145a33687dSHoward Hinnant 20153739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return *this;} 20163739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return *this;} 20173e519524SHoward Hinnant 20183739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_reference second() _NOEXCEPT {return __second_;} 20193739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_const_reference second() const _NOEXCEPT {return __second_;} 20203e519524SHoward Hinnant 20213e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void swap(__libcpp_compressed_pair_imp& __x) 20223739fe79SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && 20233739fe79SHoward Hinnant __is_nothrow_swappable<_T1>::value) 20243e519524SHoward Hinnant { 2025ce48a113SHoward Hinnant using _VSTD::swap; 20263e519524SHoward Hinnant swap(__second_, __x.__second_); 20273e519524SHoward Hinnant } 20283e519524SHoward Hinnant}; 20293e519524SHoward Hinnant 20303e519524SHoward Hinnanttemplate <class _T1, class _T2> 20313e519524SHoward Hinnantclass __libcpp_compressed_pair_imp<_T1, _T2, 2> 20323e519524SHoward Hinnant : private _T2 20333e519524SHoward Hinnant{ 20343e519524SHoward Hinnantprivate: 20353e519524SHoward Hinnant _T1 __first_; 20363e519524SHoward Hinnantpublic: 20373e519524SHoward Hinnant typedef _T1 _T1_param; 20383e519524SHoward Hinnant typedef _T2 _T2_param; 20393e519524SHoward Hinnant 20403e519524SHoward Hinnant typedef typename remove_reference<_T1>::type& _T1_reference; 20413e519524SHoward Hinnant typedef _T2& _T2_reference; 20423e519524SHoward Hinnant 20433e519524SHoward Hinnant typedef const typename remove_reference<_T1>::type& _T1_const_reference; 20443e519524SHoward Hinnant typedef const _T2& _T2_const_reference; 20453e519524SHoward Hinnant 20463e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp() {} 20473e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T1_param __t1) 2048ce48a113SHoward Hinnant : __first_(_VSTD::forward<_T1_param>(__t1)) {} 20493e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T2_param __t2) 2050ce48a113SHoward Hinnant : _T2(_VSTD::forward<_T2_param>(__t2)) {} 20513e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(_T1_param __t1, _T2_param __t2) 20523739fe79SHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<_T1>::value && 20533739fe79SHoward Hinnant is_nothrow_move_constructible<_T2>::value) 2054ce48a113SHoward Hinnant : _T2(_VSTD::forward<_T2_param>(__t2)), __first_(_VSTD::forward<_T1_param>(__t1)) {} 20553e519524SHoward Hinnant 20565a33687dSHoward Hinnant#ifdef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS 20575a33687dSHoward Hinnant 20585a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20595a33687dSHoward Hinnant __libcpp_compressed_pair_imp(const __libcpp_compressed_pair_imp& __p) 20605a33687dSHoward Hinnant _NOEXCEPT_(is_nothrow_copy_constructible<_T1>::value && 20615a33687dSHoward Hinnant is_nothrow_copy_constructible<_T2>::value) 20625a33687dSHoward Hinnant : _T2(__p.second()), __first_(__p.first()) {} 20635a33687dSHoward Hinnant 20645a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20655a33687dSHoward Hinnant __libcpp_compressed_pair_imp& operator=(const __libcpp_compressed_pair_imp& __p) 20665a33687dSHoward Hinnant _NOEXCEPT_(is_nothrow_copy_assignable<_T1>::value && 20675a33687dSHoward Hinnant is_nothrow_copy_assignable<_T2>::value) 20685a33687dSHoward Hinnant { 20695a33687dSHoward Hinnant _T2::operator=(__p.second()); 20705a33687dSHoward Hinnant __first_ = __p.first(); 20715a33687dSHoward Hinnant return *this; 20725a33687dSHoward Hinnant } 20735a33687dSHoward Hinnant 20747609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 20755a33687dSHoward Hinnant 20765a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20773e519524SHoward Hinnant __libcpp_compressed_pair_imp(__libcpp_compressed_pair_imp&& __p) 20785a33687dSHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<_T1>::value && 20795a33687dSHoward Hinnant is_nothrow_move_constructible<_T2>::value) 2080ce48a113SHoward Hinnant : _T2(_VSTD::forward<_T2>(__p.second())), __first_(_VSTD::move(__p.first())) {} 20815a33687dSHoward Hinnant 20825a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20835a33687dSHoward Hinnant __libcpp_compressed_pair_imp& operator=(__libcpp_compressed_pair_imp&& __p) 20845a33687dSHoward Hinnant _NOEXCEPT_(is_nothrow_move_assignable<_T1>::value && 20855a33687dSHoward Hinnant is_nothrow_move_assignable<_T2>::value) 20865a33687dSHoward Hinnant { 20875a33687dSHoward Hinnant _T2::operator=(_VSTD::forward<_T2>(__p.second())); 20885a33687dSHoward Hinnant __first_ = _VSTD::move(__p.first()); 20895a33687dSHoward Hinnant return *this; 20905a33687dSHoward Hinnant } 20915a33687dSHoward Hinnant 20927609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 20933e519524SHoward Hinnant 20945a33687dSHoward Hinnant#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS 20955a33687dSHoward Hinnant 20963739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return __first_;} 20973739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return __first_;} 20983e519524SHoward Hinnant 20993739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_reference second() _NOEXCEPT {return *this;} 21003739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_const_reference second() const _NOEXCEPT {return *this;} 21013e519524SHoward Hinnant 21023e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void swap(__libcpp_compressed_pair_imp& __x) 21033739fe79SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && 21043739fe79SHoward Hinnant __is_nothrow_swappable<_T1>::value) 21053e519524SHoward Hinnant { 2106ce48a113SHoward Hinnant using _VSTD::swap; 21073e519524SHoward Hinnant swap(__first_, __x.__first_); 21083e519524SHoward Hinnant } 21093e519524SHoward Hinnant}; 21103e519524SHoward Hinnant 21113e519524SHoward Hinnanttemplate <class _T1, class _T2> 21123e519524SHoward Hinnantclass __libcpp_compressed_pair_imp<_T1, _T2, 3> 21133e519524SHoward Hinnant : private _T1, 21143e519524SHoward Hinnant private _T2 21153e519524SHoward Hinnant{ 21163e519524SHoward Hinnantpublic: 21173e519524SHoward Hinnant typedef _T1 _T1_param; 21183e519524SHoward Hinnant typedef _T2 _T2_param; 21193e519524SHoward Hinnant 21203e519524SHoward Hinnant typedef _T1& _T1_reference; 21213e519524SHoward Hinnant typedef _T2& _T2_reference; 21223e519524SHoward Hinnant 21233e519524SHoward Hinnant typedef const _T1& _T1_const_reference; 21243e519524SHoward Hinnant typedef const _T2& _T2_const_reference; 21253e519524SHoward Hinnant 21263e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp() {} 21273e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T1_param __t1) 2128ce48a113SHoward Hinnant : _T1(_VSTD::forward<_T1_param>(__t1)) {} 21293e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T2_param __t2) 2130ce48a113SHoward Hinnant : _T2(_VSTD::forward<_T2_param>(__t2)) {} 21313e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(_T1_param __t1, _T2_param __t2) 2132ce48a113SHoward Hinnant : _T1(_VSTD::forward<_T1_param>(__t1)), _T2(_VSTD::forward<_T2_param>(__t2)) {} 21333e519524SHoward Hinnant 21345a33687dSHoward Hinnant#ifdef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS 21355a33687dSHoward Hinnant 21365a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 21375a33687dSHoward Hinnant __libcpp_compressed_pair_imp(const __libcpp_compressed_pair_imp& __p) 21385a33687dSHoward Hinnant _NOEXCEPT_(is_nothrow_copy_constructible<_T1>::value && 21395a33687dSHoward Hinnant is_nothrow_copy_constructible<_T2>::value) 21405a33687dSHoward Hinnant : _T1(__p.first()), _T2(__p.second()) {} 21415a33687dSHoward Hinnant 21425a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 21435a33687dSHoward Hinnant __libcpp_compressed_pair_imp& operator=(const __libcpp_compressed_pair_imp& __p) 21445a33687dSHoward Hinnant _NOEXCEPT_(is_nothrow_copy_assignable<_T1>::value && 21455a33687dSHoward Hinnant is_nothrow_copy_assignable<_T2>::value) 21465a33687dSHoward Hinnant { 21475a33687dSHoward Hinnant _T1::operator=(__p.first()); 21485a33687dSHoward Hinnant _T2::operator=(__p.second()); 21495a33687dSHoward Hinnant return *this; 21505a33687dSHoward Hinnant } 21515a33687dSHoward Hinnant 21527609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 21535a33687dSHoward Hinnant 21545a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 21555a33687dSHoward Hinnant __libcpp_compressed_pair_imp(__libcpp_compressed_pair_imp&& __p) 21563739fe79SHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<_T1>::value && 21573739fe79SHoward Hinnant is_nothrow_move_constructible<_T2>::value) 2158ce48a113SHoward Hinnant : _T1(_VSTD::move(__p.first())), _T2(_VSTD::move(__p.second())) {} 21595a33687dSHoward Hinnant 21605a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 21615a33687dSHoward Hinnant __libcpp_compressed_pair_imp& operator=(__libcpp_compressed_pair_imp&& __p) 21625a33687dSHoward Hinnant _NOEXCEPT_(is_nothrow_move_assignable<_T1>::value && 21635a33687dSHoward Hinnant is_nothrow_move_assignable<_T2>::value) 21645a33687dSHoward Hinnant { 21655a33687dSHoward Hinnant _T1::operator=(_VSTD::move(__p.first())); 21665a33687dSHoward Hinnant _T2::operator=(_VSTD::move(__p.second())); 21675a33687dSHoward Hinnant return *this; 21685a33687dSHoward Hinnant } 21695a33687dSHoward Hinnant 21707609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 21713e519524SHoward Hinnant 21725a33687dSHoward Hinnant#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS 21735a33687dSHoward Hinnant 21743739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return *this;} 21753739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return *this;} 21763e519524SHoward Hinnant 21773739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_reference second() _NOEXCEPT {return *this;} 21783739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_const_reference second() const _NOEXCEPT {return *this;} 21793e519524SHoward Hinnant 21803e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void swap(__libcpp_compressed_pair_imp& __x) 21813739fe79SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && 21823739fe79SHoward Hinnant __is_nothrow_swappable<_T1>::value) 21833e519524SHoward Hinnant { 21843e519524SHoward Hinnant } 21853e519524SHoward Hinnant}; 21863e519524SHoward Hinnant 21873e519524SHoward Hinnanttemplate <class _T1, class _T2> 21883e519524SHoward Hinnantclass __compressed_pair 21893e519524SHoward Hinnant : private __libcpp_compressed_pair_imp<_T1, _T2> 21903e519524SHoward Hinnant{ 21913e519524SHoward Hinnant typedef __libcpp_compressed_pair_imp<_T1, _T2> base; 21923e519524SHoward Hinnantpublic: 21933e519524SHoward Hinnant typedef typename base::_T1_param _T1_param; 21943e519524SHoward Hinnant typedef typename base::_T2_param _T2_param; 21953e519524SHoward Hinnant 21963e519524SHoward Hinnant typedef typename base::_T1_reference _T1_reference; 21973e519524SHoward Hinnant typedef typename base::_T2_reference _T2_reference; 21983e519524SHoward Hinnant 21993e519524SHoward Hinnant typedef typename base::_T1_const_reference _T1_const_reference; 22003e519524SHoward Hinnant typedef typename base::_T2_const_reference _T2_const_reference; 22013e519524SHoward Hinnant 22023e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __compressed_pair() {} 22033e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __compressed_pair(_T1_param __t1, int = 0) 2204ce48a113SHoward Hinnant : base(_VSTD::forward<_T1_param>(__t1)) {} 22053e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __compressed_pair(_T2_param __t2, int* = 0) 2206ce48a113SHoward Hinnant : base(_VSTD::forward<_T2_param>(__t2)) {} 22073e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __compressed_pair(_T1_param __t1, _T2_param __t2) 2208ce48a113SHoward Hinnant : base(_VSTD::forward<_T1_param>(__t1), _VSTD::forward<_T2_param>(__t2)) {} 22093e519524SHoward Hinnant 22105a33687dSHoward Hinnant#ifdef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS 22115a33687dSHoward Hinnant 22125a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22135a33687dSHoward Hinnant __compressed_pair(const __compressed_pair& __p) 22145a33687dSHoward Hinnant _NOEXCEPT_(is_nothrow_copy_constructible<_T1>::value && 22155a33687dSHoward Hinnant is_nothrow_copy_constructible<_T2>::value) 22165a33687dSHoward Hinnant : base(__p) {} 22175a33687dSHoward Hinnant 22185a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22195a33687dSHoward Hinnant __compressed_pair& operator=(const __compressed_pair& __p) 22205a33687dSHoward Hinnant _NOEXCEPT_(is_nothrow_copy_assignable<_T1>::value && 22215a33687dSHoward Hinnant is_nothrow_copy_assignable<_T2>::value) 22225a33687dSHoward Hinnant { 22235a33687dSHoward Hinnant base::operator=(__p); 22245a33687dSHoward Hinnant return *this; 22255a33687dSHoward Hinnant } 22265a33687dSHoward Hinnant 22277609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 22285a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22293e519524SHoward Hinnant __compressed_pair(__compressed_pair&& __p) 22303739fe79SHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<_T1>::value && 22313739fe79SHoward Hinnant is_nothrow_move_constructible<_T2>::value) 2232ce48a113SHoward Hinnant : base(_VSTD::move(__p)) {} 22335a33687dSHoward Hinnant 22345a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22355a33687dSHoward Hinnant __compressed_pair& operator=(__compressed_pair&& __p) 22365a33687dSHoward Hinnant _NOEXCEPT_(is_nothrow_move_assignable<_T1>::value && 22375a33687dSHoward Hinnant is_nothrow_move_assignable<_T2>::value) 22385a33687dSHoward Hinnant { 22395a33687dSHoward Hinnant base::operator=(_VSTD::move(__p)); 22405a33687dSHoward Hinnant return *this; 22415a33687dSHoward Hinnant } 22427609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 22433e519524SHoward Hinnant 22445a33687dSHoward Hinnant#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS 22455a33687dSHoward Hinnant 22463739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return base::first();} 22473739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return base::first();} 22483e519524SHoward Hinnant 22493739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_reference second() _NOEXCEPT {return base::second();} 22503739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_const_reference second() const _NOEXCEPT {return base::second();} 22513e519524SHoward Hinnant 22523739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void swap(__compressed_pair& __x) 22533739fe79SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && 22543739fe79SHoward Hinnant __is_nothrow_swappable<_T1>::value) 22553739fe79SHoward Hinnant {base::swap(__x);} 22563e519524SHoward Hinnant}; 22573e519524SHoward Hinnant 22583e519524SHoward Hinnanttemplate <class _T1, class _T2> 22593e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 22603e519524SHoward Hinnantvoid 22613e519524SHoward Hinnantswap(__compressed_pair<_T1, _T2>& __x, __compressed_pair<_T1, _T2>& __y) 22623739fe79SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && 22633739fe79SHoward Hinnant __is_nothrow_swappable<_T1>::value) 22643e519524SHoward Hinnant {__x.swap(__y);} 22653e519524SHoward Hinnant 22663e519524SHoward Hinnanttemplate <class _Tp> 2267848a5374SHoward Hinnantstruct _LIBCPP_VISIBLE default_delete 22683e519524SHoward Hinnant{ 22693739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY default_delete() _NOEXCEPT {} 22703e519524SHoward Hinnant template <class _Up> 22713e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY default_delete(const default_delete<_Up>&, 22723739fe79SHoward Hinnant typename enable_if<is_convertible<_Up*, _Tp*>::value>::type* = 0) _NOEXCEPT {} 22733739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void operator() (_Tp* __ptr) const _NOEXCEPT 22743e519524SHoward Hinnant { 22753e519524SHoward Hinnant static_assert(sizeof(_Tp) > 0, "default_delete can not delete incomplete type"); 22763e519524SHoward Hinnant delete __ptr; 22773e519524SHoward Hinnant } 22783e519524SHoward Hinnant}; 22793e519524SHoward Hinnant 22803e519524SHoward Hinnanttemplate <class _Tp> 2281848a5374SHoward Hinnantstruct _LIBCPP_VISIBLE default_delete<_Tp[]> 22823e519524SHoward Hinnant{ 22833739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void operator() (_Tp* __ptr) const _NOEXCEPT 22843e519524SHoward Hinnant { 22853e519524SHoward Hinnant static_assert(sizeof(_Tp) > 0, "default_delete can not delete incomplete type"); 22863e519524SHoward Hinnant delete [] __ptr; 22873e519524SHoward Hinnant } 22883e519524SHoward Hinnantprivate: 22893e519524SHoward Hinnant template <class _Up> void operator() (_Up*) const; 22903e519524SHoward Hinnant}; 22913e519524SHoward Hinnant 22923e519524SHoward Hinnanttemplate <class _Tp, class _Dp = default_delete<_Tp> > 2293848a5374SHoward Hinnantclass _LIBCPP_VISIBLE unique_ptr 22943e519524SHoward Hinnant{ 22953e519524SHoward Hinnantpublic: 22963e519524SHoward Hinnant typedef _Tp element_type; 22973e519524SHoward Hinnant typedef _Dp deleter_type; 22983e519524SHoward Hinnant typedef typename __pointer_type<_Tp, deleter_type>::type pointer; 22993e519524SHoward Hinnantprivate: 23003e519524SHoward Hinnant __compressed_pair<pointer, deleter_type> __ptr_; 23013e519524SHoward Hinnant 23027609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 23033e519524SHoward Hinnant unique_ptr(const unique_ptr&); 23043e519524SHoward Hinnant unique_ptr& operator=(const unique_ptr&); 23053e519524SHoward Hinnant template <class _Up, class _Ep> 23063e519524SHoward Hinnant unique_ptr(const unique_ptr<_Up, _Ep>&); 23073e519524SHoward Hinnant template <class _Up, class _Ep> 23083e519524SHoward Hinnant unique_ptr& operator=(const unique_ptr<_Up, _Ep>&); 23097609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 23103e519524SHoward Hinnant unique_ptr(unique_ptr&); 23113e519524SHoward Hinnant template <class _Up, class _Ep> 23123e519524SHoward Hinnant unique_ptr(unique_ptr<_Up, _Ep>&); 23133e519524SHoward Hinnant unique_ptr& operator=(unique_ptr&); 23143e519524SHoward Hinnant template <class _Up, class _Ep> 23153e519524SHoward Hinnant unique_ptr& operator=(unique_ptr<_Up, _Ep>&); 23167609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 23173e519524SHoward Hinnant 23183e519524SHoward Hinnant struct __nat {int __for_bool_;}; 23193e519524SHoward Hinnant 23203e519524SHoward Hinnant typedef typename remove_reference<deleter_type>::type& _Dp_reference; 23213e519524SHoward Hinnant typedef const typename remove_reference<deleter_type>::type& _Dp_const_reference; 23223e519524SHoward Hinnantpublic: 23233739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr() _NOEXCEPT 23243e519524SHoward Hinnant : __ptr_(pointer()) 23253e519524SHoward Hinnant { 23263e519524SHoward Hinnant static_assert(!is_pointer<deleter_type>::value, 23273e519524SHoward Hinnant "unique_ptr constructed with null function pointer deleter"); 23283e519524SHoward Hinnant } 23293739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(nullptr_t) _NOEXCEPT 23303e519524SHoward Hinnant : __ptr_(pointer()) 23313e519524SHoward Hinnant { 23323e519524SHoward Hinnant static_assert(!is_pointer<deleter_type>::value, 23333e519524SHoward Hinnant "unique_ptr constructed with null function pointer deleter"); 23343e519524SHoward Hinnant } 23353739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit unique_ptr(pointer __p) _NOEXCEPT 2336ce48a113SHoward Hinnant : __ptr_(_VSTD::move(__p)) 23373e519524SHoward Hinnant { 23383e519524SHoward Hinnant static_assert(!is_pointer<deleter_type>::value, 23393e519524SHoward Hinnant "unique_ptr constructed with null function pointer deleter"); 23403e519524SHoward Hinnant } 23413e519524SHoward Hinnant 23427609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 23433e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(pointer __p, typename conditional< 23443e519524SHoward Hinnant is_reference<deleter_type>::value, 23453e519524SHoward Hinnant deleter_type, 23463e519524SHoward Hinnant typename add_lvalue_reference<const deleter_type>::type>::type __d) 23473739fe79SHoward Hinnant _NOEXCEPT 23483e519524SHoward Hinnant : __ptr_(__p, __d) {} 23493e519524SHoward Hinnant 23503e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(pointer __p, typename remove_reference<deleter_type>::type&& __d) 23513739fe79SHoward Hinnant _NOEXCEPT 2352ce48a113SHoward Hinnant : __ptr_(__p, _VSTD::move(__d)) 23533e519524SHoward Hinnant { 23543e519524SHoward Hinnant static_assert(!is_reference<deleter_type>::value, "rvalue deleter bound to reference"); 23553e519524SHoward Hinnant } 23563739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(unique_ptr&& __u) _NOEXCEPT 2357ce48a113SHoward Hinnant : __ptr_(__u.release(), _VSTD::forward<deleter_type>(__u.get_deleter())) {} 23583e519524SHoward Hinnant template <class _Up, class _Ep> 23593e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 23603e519524SHoward Hinnant unique_ptr(unique_ptr<_Up, _Ep>&& __u, 23613e519524SHoward Hinnant typename enable_if 23623e519524SHoward Hinnant < 23633e519524SHoward Hinnant !is_array<_Up>::value && 23643e519524SHoward Hinnant is_convertible<typename unique_ptr<_Up, _Ep>::pointer, pointer>::value && 23653e519524SHoward Hinnant is_convertible<_Ep, deleter_type>::value && 23663e519524SHoward Hinnant ( 23673e519524SHoward Hinnant !is_reference<deleter_type>::value || 23683e519524SHoward Hinnant is_same<deleter_type, _Ep>::value 23693e519524SHoward Hinnant ), 23703e519524SHoward Hinnant __nat 23713739fe79SHoward Hinnant >::type = __nat()) _NOEXCEPT 2372ce48a113SHoward Hinnant : __ptr_(__u.release(), _VSTD::forward<_Ep>(__u.get_deleter())) {} 23733e519524SHoward Hinnant 23743e519524SHoward Hinnant template <class _Up> 23753e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(auto_ptr<_Up>&& __p, 23763e519524SHoward Hinnant typename enable_if< 23773e519524SHoward Hinnant is_convertible<_Up*, _Tp*>::value && 23783e519524SHoward Hinnant is_same<_Dp, default_delete<_Tp> >::value, 23793e519524SHoward Hinnant __nat 23803739fe79SHoward Hinnant >::type = __nat()) _NOEXCEPT 23813e519524SHoward Hinnant : __ptr_(__p.release()) 23823e519524SHoward Hinnant { 23833e519524SHoward Hinnant } 23843e519524SHoward Hinnant 23853739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(unique_ptr&& __u) _NOEXCEPT 23863e519524SHoward Hinnant { 23873e519524SHoward Hinnant reset(__u.release()); 2388ce48a113SHoward Hinnant __ptr_.second() = _VSTD::forward<deleter_type>(__u.get_deleter()); 23893e519524SHoward Hinnant return *this; 23903e519524SHoward Hinnant } 23913e519524SHoward Hinnant 23923e519524SHoward Hinnant template <class _Up, class _Ep> 23933e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 23943e519524SHoward Hinnant typename enable_if 23953e519524SHoward Hinnant < 23963e519524SHoward Hinnant !is_array<_Up>::value, 23973e519524SHoward Hinnant unique_ptr& 23983e519524SHoward Hinnant >::type 23993739fe79SHoward Hinnant operator=(unique_ptr<_Up, _Ep>&& __u) _NOEXCEPT 24003e519524SHoward Hinnant { 24013e519524SHoward Hinnant reset(__u.release()); 2402ce48a113SHoward Hinnant __ptr_.second() = _VSTD::forward<_Ep>(__u.get_deleter()); 24033e519524SHoward Hinnant return *this; 24043e519524SHoward Hinnant } 24057609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 24063e519524SHoward Hinnant 24073e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY operator __rv<unique_ptr>() 24083e519524SHoward Hinnant { 24093e519524SHoward Hinnant return __rv<unique_ptr>(*this); 24103e519524SHoward Hinnant } 24113e519524SHoward Hinnant 24123e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(__rv<unique_ptr> __u) 2413ce48a113SHoward Hinnant : __ptr_(__u->release(), _VSTD::forward<deleter_type>(__u->get_deleter())) {} 24143e519524SHoward Hinnant 24153e519524SHoward Hinnant template <class _Up, class _Ep> 24163e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(unique_ptr<_Up, _Ep> __u) 24173e519524SHoward Hinnant { 24183e519524SHoward Hinnant reset(__u.release()); 2419ce48a113SHoward Hinnant __ptr_.second() = _VSTD::forward<deleter_type>(__u.get_deleter()); 24203e519524SHoward Hinnant return *this; 24213e519524SHoward Hinnant } 24223e519524SHoward Hinnant 24233e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(pointer __p, deleter_type __d) 2424ce48a113SHoward Hinnant : __ptr_(_VSTD::move(__p), _VSTD::move(__d)) {} 24253e519524SHoward Hinnant 24263e519524SHoward Hinnant template <class _Up> 24273e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 24283e519524SHoward Hinnant typename enable_if< 24293e519524SHoward Hinnant is_convertible<_Up*, _Tp*>::value && 24303e519524SHoward Hinnant is_same<_Dp, default_delete<_Tp> >::value, 24313e519524SHoward Hinnant unique_ptr& 24323e519524SHoward Hinnant >::type 24333e519524SHoward Hinnant operator=(auto_ptr<_Up> __p) 24343e519524SHoward Hinnant {reset(__p.release()); return *this;} 24353e519524SHoward Hinnant 24367609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 24373e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY ~unique_ptr() {reset();} 24383e519524SHoward Hinnant 24393739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(nullptr_t) _NOEXCEPT 24403e519524SHoward Hinnant { 24413e519524SHoward Hinnant reset(); 24423e519524SHoward Hinnant return *this; 24433e519524SHoward Hinnant } 24443e519524SHoward Hinnant 24453e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY typename add_lvalue_reference<_Tp>::type operator*() const 24463e519524SHoward Hinnant {return *__ptr_.first();} 24473739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer operator->() const _NOEXCEPT {return __ptr_.first();} 24483739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer get() const _NOEXCEPT {return __ptr_.first();} 24493739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Dp_reference get_deleter() _NOEXCEPT 24503739fe79SHoward Hinnant {return __ptr_.second();} 24513739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Dp_const_reference get_deleter() const _NOEXCEPT 24523739fe79SHoward Hinnant {return __ptr_.second();} 24533739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY operator int __nat::*() const 24543739fe79SHoward Hinnant _NOEXCEPT 24553739fe79SHoward Hinnant {return __ptr_.first() ? &__nat::__for_bool_ : 0;} 24563e519524SHoward Hinnant 24573739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer release() _NOEXCEPT 24583e519524SHoward Hinnant { 24593e519524SHoward Hinnant pointer __t = __ptr_.first(); 24603e519524SHoward Hinnant __ptr_.first() = pointer(); 24613e519524SHoward Hinnant return __t; 24623e519524SHoward Hinnant } 24633e519524SHoward Hinnant 24643739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void reset(pointer __p = pointer()) _NOEXCEPT 24653e519524SHoward Hinnant { 24663e519524SHoward Hinnant pointer __tmp = __ptr_.first(); 24673e519524SHoward Hinnant __ptr_.first() = __p; 24683e519524SHoward Hinnant if (__tmp) 24693e519524SHoward Hinnant __ptr_.second()(__tmp); 24703e519524SHoward Hinnant } 24713e519524SHoward Hinnant 24723739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void swap(unique_ptr& __u) _NOEXCEPT 24733739fe79SHoward Hinnant {__ptr_.swap(__u.__ptr_);} 24743e519524SHoward Hinnant}; 24753e519524SHoward Hinnant 24763e519524SHoward Hinnanttemplate <class _Tp, class _Dp> 2477848a5374SHoward Hinnantclass _LIBCPP_VISIBLE unique_ptr<_Tp[], _Dp> 24783e519524SHoward Hinnant{ 24793e519524SHoward Hinnantpublic: 24803e519524SHoward Hinnant typedef _Tp element_type; 24813e519524SHoward Hinnant typedef _Dp deleter_type; 24823e519524SHoward Hinnant typedef typename __pointer_type<_Tp, deleter_type>::type pointer; 24833e519524SHoward Hinnantprivate: 24843e519524SHoward Hinnant __compressed_pair<pointer, deleter_type> __ptr_; 24853e519524SHoward Hinnant 24867609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 24873e519524SHoward Hinnant unique_ptr(const unique_ptr&); 24883e519524SHoward Hinnant unique_ptr& operator=(const unique_ptr&); 24897609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 24903e519524SHoward Hinnant unique_ptr(unique_ptr&); 24913e519524SHoward Hinnant template <class _Up> 24923e519524SHoward Hinnant unique_ptr(unique_ptr<_Up>&); 24933e519524SHoward Hinnant unique_ptr& operator=(unique_ptr&); 24943e519524SHoward Hinnant template <class _Up> 24953e519524SHoward Hinnant unique_ptr& operator=(unique_ptr<_Up>&); 24967609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 24973e519524SHoward Hinnant 24983e519524SHoward Hinnant struct __nat {int __for_bool_;}; 24993e519524SHoward Hinnant 25003e519524SHoward Hinnant typedef typename remove_reference<deleter_type>::type& _Dp_reference; 25013e519524SHoward Hinnant typedef const typename remove_reference<deleter_type>::type& _Dp_const_reference; 25023e519524SHoward Hinnantpublic: 25033739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr() _NOEXCEPT 25043e519524SHoward Hinnant : __ptr_(pointer()) 25053e519524SHoward Hinnant { 25063e519524SHoward Hinnant static_assert(!is_pointer<deleter_type>::value, 25073e519524SHoward Hinnant "unique_ptr constructed with null function pointer deleter"); 25083e519524SHoward Hinnant } 25093739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(nullptr_t) _NOEXCEPT 25103e519524SHoward Hinnant : __ptr_(pointer()) 25113e519524SHoward Hinnant { 25123e519524SHoward Hinnant static_assert(!is_pointer<deleter_type>::value, 25133e519524SHoward Hinnant "unique_ptr constructed with null function pointer deleter"); 25143e519524SHoward Hinnant } 25157609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 25163e519524SHoward Hinnant template <class _P, 25173e519524SHoward Hinnant class = typename enable_if<is_same<_P, pointer>::value>::type 25183e519524SHoward Hinnant > 25193739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit unique_ptr(_P __p) _NOEXCEPT 25203e519524SHoward Hinnant : __ptr_(__p) 25213e519524SHoward Hinnant { 25223e519524SHoward Hinnant static_assert(!is_pointer<deleter_type>::value, 25233e519524SHoward Hinnant "unique_ptr constructed with null function pointer deleter"); 25243e519524SHoward Hinnant } 25253e519524SHoward Hinnant 25263e519524SHoward Hinnant template <class _P, 25273e519524SHoward Hinnant class = typename enable_if<is_same<_P, pointer>::value>::type 25283e519524SHoward Hinnant > 25293e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(_P __p, typename conditional< 25303e519524SHoward Hinnant is_reference<deleter_type>::value, 25313e519524SHoward Hinnant deleter_type, 25323e519524SHoward Hinnant typename add_lvalue_reference<const deleter_type>::type>::type __d) 25333739fe79SHoward Hinnant _NOEXCEPT 25343e519524SHoward Hinnant : __ptr_(__p, __d) {} 25353e519524SHoward Hinnant 25363e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(nullptr_t, typename conditional< 25373e519524SHoward Hinnant is_reference<deleter_type>::value, 25383e519524SHoward Hinnant deleter_type, 25393e519524SHoward Hinnant typename add_lvalue_reference<const deleter_type>::type>::type __d) 25403739fe79SHoward Hinnant _NOEXCEPT 25413e519524SHoward Hinnant : __ptr_(pointer(), __d) {} 25423e519524SHoward Hinnant 25433e519524SHoward Hinnant template <class _P, 25443e519524SHoward Hinnant class = typename enable_if<is_same<_P, pointer>::value || 25453e519524SHoward Hinnant is_same<_P, nullptr_t>::value>::type 25463e519524SHoward Hinnant > 25473e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(_P __p, typename remove_reference<deleter_type>::type&& __d) 25483739fe79SHoward Hinnant _NOEXCEPT 2549ce48a113SHoward Hinnant : __ptr_(__p, _VSTD::move(__d)) 25503e519524SHoward Hinnant { 25513e519524SHoward Hinnant static_assert(!is_reference<deleter_type>::value, "rvalue deleter bound to reference"); 25523e519524SHoward Hinnant } 25533e519524SHoward Hinnant 25543e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(nullptr_t, typename remove_reference<deleter_type>::type&& __d) 25553739fe79SHoward Hinnant _NOEXCEPT 2556ce48a113SHoward Hinnant : __ptr_(pointer(), _VSTD::move(__d)) 25573e519524SHoward Hinnant { 25583e519524SHoward Hinnant static_assert(!is_reference<deleter_type>::value, "rvalue deleter bound to reference"); 25593e519524SHoward Hinnant } 25603e519524SHoward Hinnant 25613739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(unique_ptr&& __u) _NOEXCEPT 2562ce48a113SHoward Hinnant : __ptr_(__u.release(), _VSTD::forward<deleter_type>(__u.get_deleter())) {} 25633e519524SHoward Hinnant 25643739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(unique_ptr&& __u) _NOEXCEPT 25653e519524SHoward Hinnant { 25663e519524SHoward Hinnant reset(__u.release()); 2567ce48a113SHoward Hinnant __ptr_.second() = _VSTD::forward<deleter_type>(__u.get_deleter()); 25683e519524SHoward Hinnant return *this; 25693e519524SHoward Hinnant } 25707609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 25713e519524SHoward Hinnant 25723e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit unique_ptr(pointer __p) 25733e519524SHoward Hinnant : __ptr_(__p) 25743e519524SHoward Hinnant { 25753e519524SHoward Hinnant static_assert(!is_pointer<deleter_type>::value, 25763e519524SHoward Hinnant "unique_ptr constructed with null function pointer deleter"); 25773e519524SHoward Hinnant } 25783e519524SHoward Hinnant 25793e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(pointer __p, deleter_type __d) 2580ce48a113SHoward Hinnant : __ptr_(__p, _VSTD::forward<deleter_type>(__d)) {} 25813e519524SHoward Hinnant 25823e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(nullptr_t, deleter_type __d) 2583ce48a113SHoward Hinnant : __ptr_(pointer(), _VSTD::forward<deleter_type>(__d)) {} 25843e519524SHoward Hinnant 25853e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY operator __rv<unique_ptr>() 25863e519524SHoward Hinnant { 25873e519524SHoward Hinnant return __rv<unique_ptr>(*this); 25883e519524SHoward Hinnant } 25893e519524SHoward Hinnant 25903e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(__rv<unique_ptr> __u) 2591ce48a113SHoward Hinnant : __ptr_(__u->release(), _VSTD::forward<deleter_type>(__u->get_deleter())) {} 25923e519524SHoward Hinnant 25933e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(__rv<unique_ptr> __u) 25943e519524SHoward Hinnant { 25953e519524SHoward Hinnant reset(__u->release()); 2596ce48a113SHoward Hinnant __ptr_.second() = _VSTD::forward<deleter_type>(__u->get_deleter()); 25973e519524SHoward Hinnant return *this; 25983e519524SHoward Hinnant } 25993e519524SHoward Hinnant 26007609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 26013e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY ~unique_ptr() {reset();} 26023e519524SHoward Hinnant 26033739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(nullptr_t) _NOEXCEPT 26043e519524SHoward Hinnant { 26053e519524SHoward Hinnant reset(); 26063e519524SHoward Hinnant return *this; 26073e519524SHoward Hinnant } 26083e519524SHoward Hinnant 26093e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY typename add_lvalue_reference<_Tp>::type operator[](size_t __i) const 26103e519524SHoward Hinnant {return __ptr_.first()[__i];} 26113739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer get() const _NOEXCEPT {return __ptr_.first();} 26123739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Dp_reference get_deleter() _NOEXCEPT 26133739fe79SHoward Hinnant {return __ptr_.second();} 26143739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Dp_const_reference get_deleter() const _NOEXCEPT 26153739fe79SHoward Hinnant {return __ptr_.second();} 26163739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY operator int __nat::*() const _NOEXCEPT 26173739fe79SHoward Hinnant {return __ptr_.first() ? &__nat::__for_bool_ : 0;} 26183e519524SHoward Hinnant 26193739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer release() _NOEXCEPT 26203e519524SHoward Hinnant { 26213e519524SHoward Hinnant pointer __t = __ptr_.first(); 26223e519524SHoward Hinnant __ptr_.first() = pointer(); 26233e519524SHoward Hinnant return __t; 26243e519524SHoward Hinnant } 26253e519524SHoward Hinnant 26267609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 26273e519524SHoward Hinnant template <class _P, 26283e519524SHoward Hinnant class = typename enable_if<is_same<_P, pointer>::value>::type 26293e519524SHoward Hinnant > 26303739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void reset(_P __p) _NOEXCEPT 26313e519524SHoward Hinnant { 26323e519524SHoward Hinnant pointer __tmp = __ptr_.first(); 26333e519524SHoward Hinnant __ptr_.first() = __p; 26343e519524SHoward Hinnant if (__tmp) 26353e519524SHoward Hinnant __ptr_.second()(__tmp); 26363e519524SHoward Hinnant } 26373739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void reset(nullptr_t) _NOEXCEPT 26383e519524SHoward Hinnant { 26393e519524SHoward Hinnant pointer __tmp = __ptr_.first(); 26403e519524SHoward Hinnant __ptr_.first() = nullptr; 26413e519524SHoward Hinnant if (__tmp) 26423e519524SHoward Hinnant __ptr_.second()(__tmp); 26433e519524SHoward Hinnant } 26443739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void reset() _NOEXCEPT 26453e519524SHoward Hinnant { 26463e519524SHoward Hinnant pointer __tmp = __ptr_.first(); 26473e519524SHoward Hinnant __ptr_.first() = nullptr; 26483e519524SHoward Hinnant if (__tmp) 26493e519524SHoward Hinnant __ptr_.second()(__tmp); 26503e519524SHoward Hinnant } 26517609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 26523e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void reset(pointer __p = pointer()) 26533e519524SHoward Hinnant { 26543e519524SHoward Hinnant pointer __tmp = __ptr_.first(); 26553e519524SHoward Hinnant __ptr_.first() = __p; 26563e519524SHoward Hinnant if (__tmp) 26573e519524SHoward Hinnant __ptr_.second()(__tmp); 26583e519524SHoward Hinnant } 26597609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 26603e519524SHoward Hinnant 26613e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void swap(unique_ptr& __u) {__ptr_.swap(__u.__ptr_);} 26623e519524SHoward Hinnantprivate: 26633e519524SHoward Hinnant 26647609c9b6SHoward Hinnant#ifdef _LIBCPP_HAS_NO_RVALUE_REFERENCES 26653e519524SHoward Hinnant template <class _Up> 26663e519524SHoward Hinnant explicit unique_ptr(_Up); 26673e519524SHoward Hinnant template <class _Up> 26683e519524SHoward Hinnant unique_ptr(_Up __u, 26693e519524SHoward Hinnant typename conditional< 26703e519524SHoward Hinnant is_reference<deleter_type>::value, 26713e519524SHoward Hinnant deleter_type, 26723e519524SHoward Hinnant typename add_lvalue_reference<const deleter_type>::type>::type, 26733e519524SHoward Hinnant typename enable_if 26743e519524SHoward Hinnant < 26753e519524SHoward Hinnant is_convertible<_Up, pointer>::value, 26763e519524SHoward Hinnant __nat 26773e519524SHoward Hinnant >::type = __nat()); 26787609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 26793e519524SHoward Hinnant}; 26803e519524SHoward Hinnant 26813e519524SHoward Hinnanttemplate <class _Tp, class _Dp> 26823e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 26833e519524SHoward Hinnantvoid 26843739fe79SHoward Hinnantswap(unique_ptr<_Tp, _Dp>& __x, unique_ptr<_Tp, _Dp>& __y) _NOEXCEPT {__x.swap(__y);} 26853e519524SHoward Hinnant 26863e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 26873e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 26883e519524SHoward Hinnantbool 26893e519524SHoward Hinnantoperator==(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return __x.get() == __y.get();} 26903e519524SHoward Hinnant 26913e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 26923e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 26933e519524SHoward Hinnantbool 26943e519524SHoward Hinnantoperator!=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__x == __y);} 26953e519524SHoward Hinnant 26963e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 26973e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 26983e519524SHoward Hinnantbool 26993e519524SHoward Hinnantoperator< (const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return __x.get() < __y.get();} 27003e519524SHoward Hinnant 27013e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 27023e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 27033e519524SHoward Hinnantbool 27043e519524SHoward Hinnantoperator> (const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return __y < __x;} 27053e519524SHoward Hinnant 27063e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 27073e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 27083e519524SHoward Hinnantbool 27093e519524SHoward Hinnantoperator<=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__y < __x);} 27103e519524SHoward Hinnant 27113e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 27123e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 27133e519524SHoward Hinnantbool 27143e519524SHoward Hinnantoperator>=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__x < __y);} 27153e519524SHoward Hinnant 2716ce53420eSHoward Hinnanttemplate <class _Tp> struct hash; 2717d1803b6cSHoward Hinnant 2718d1803b6cSHoward Hinnanttemplate<class _Tp> 2719848a5374SHoward Hinnantstruct _LIBCPP_VISIBLE hash<_Tp*> 2720d1803b6cSHoward Hinnant : public unary_function<_Tp*, size_t> 2721d1803b6cSHoward Hinnant{ 2722848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 27233739fe79SHoward Hinnant size_t operator()(_Tp* __v) const _NOEXCEPT 2724d1803b6cSHoward Hinnant { 2725d1803b6cSHoward Hinnant const size_t* const __p = reinterpret_cast<const size_t*>(&__v); 2726d1803b6cSHoward Hinnant return *__p; 2727d1803b6cSHoward Hinnant } 2728d1803b6cSHoward Hinnant}; 2729d1803b6cSHoward Hinnant 2730d1803b6cSHoward Hinnanttemplate <class _Tp, class _Dp> 2731848a5374SHoward Hinnantstruct _LIBCPP_VISIBLE hash<unique_ptr<_Tp, _Dp> > 2732d1803b6cSHoward Hinnant{ 2733d1803b6cSHoward Hinnant typedef unique_ptr<_Tp, _Dp> argument_type; 2734d1803b6cSHoward Hinnant typedef size_t result_type; 2735848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 27363739fe79SHoward Hinnant result_type operator()(const argument_type& __ptr) const _NOEXCEPT 2737d1803b6cSHoward Hinnant { 2738d1803b6cSHoward Hinnant typedef typename argument_type::pointer pointer; 2739d1803b6cSHoward Hinnant return hash<pointer>()(__ptr.get()); 2740d1803b6cSHoward Hinnant } 2741d1803b6cSHoward Hinnant}; 2742d1803b6cSHoward Hinnant 27433e519524SHoward Hinnantstruct __destruct_n 27443e519524SHoward Hinnant{ 27453e519524SHoward Hinnantprivate: 27463e519524SHoward Hinnant size_t size; 27473e519524SHoward Hinnant 27483e519524SHoward Hinnant template <class _Tp> 27493739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __process(_Tp* __p, false_type) _NOEXCEPT 27503e519524SHoward Hinnant {for (size_t __i = 0; __i < size; ++__i, ++__p) __p->~_Tp();} 27513e519524SHoward Hinnant 27523e519524SHoward Hinnant template <class _Tp> 27533739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __process(_Tp*, true_type) _NOEXCEPT 27543e519524SHoward Hinnant {} 27553e519524SHoward Hinnant 27563739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __incr(false_type) _NOEXCEPT 27573e519524SHoward Hinnant {++size;} 27583739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __incr(true_type) _NOEXCEPT 27593e519524SHoward Hinnant {} 27603e519524SHoward Hinnant 27613739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __set(size_t __s, false_type) _NOEXCEPT 27623e519524SHoward Hinnant {size = __s;} 27633739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __set(size_t, true_type) _NOEXCEPT 27643e519524SHoward Hinnant {} 27653e519524SHoward Hinnantpublic: 27663739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __destruct_n(size_t __s) _NOEXCEPT 27673739fe79SHoward Hinnant : size(__s) {} 27683e519524SHoward Hinnant 27693e519524SHoward Hinnant template <class _Tp> 27703739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __incr(_Tp*) _NOEXCEPT 2771ca740483SHoward Hinnant {__incr(integral_constant<bool, is_trivially_destructible<_Tp>::value>());} 27723e519524SHoward Hinnant 27733e519524SHoward Hinnant template <class _Tp> 27743739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __set(size_t __s, _Tp*) _NOEXCEPT 2775ca740483SHoward Hinnant {__set(__s, integral_constant<bool, is_trivially_destructible<_Tp>::value>());} 27763e519524SHoward Hinnant 27773e519524SHoward Hinnant template <class _Tp> 27783739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __p) _NOEXCEPT 2779ca740483SHoward Hinnant {__process(__p, integral_constant<bool, is_trivially_destructible<_Tp>::value>());} 27803e519524SHoward Hinnant}; 27813e519524SHoward Hinnant 27823e519524SHoward Hinnanttemplate <class _Alloc> 27833e519524SHoward Hinnantclass __allocator_destructor 27843e519524SHoward Hinnant{ 27853e519524SHoward Hinnant typedef allocator_traits<_Alloc> __alloc_traits; 27863e519524SHoward Hinnantpublic: 27873e519524SHoward Hinnant typedef typename __alloc_traits::pointer pointer; 27883e519524SHoward Hinnant typedef typename __alloc_traits::size_type size_type; 27893e519524SHoward Hinnantprivate: 27903e519524SHoward Hinnant _Alloc& __alloc_; 27913e519524SHoward Hinnant size_type __s_; 27923e519524SHoward Hinnantpublic: 27933e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __allocator_destructor(_Alloc& __a, size_type __s) 27943739fe79SHoward Hinnant _NOEXCEPT 27953e519524SHoward Hinnant : __alloc_(__a), __s_(__s) {} 2796848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 27973739fe79SHoward Hinnant void operator()(pointer __p) _NOEXCEPT 27983739fe79SHoward Hinnant {__alloc_traits::deallocate(__alloc_, __p, __s_);} 27993e519524SHoward Hinnant}; 28003e519524SHoward Hinnant 28013e519524SHoward Hinnanttemplate <class _InputIterator, class _ForwardIterator> 28023e519524SHoward Hinnant_ForwardIterator 28033e519524SHoward Hinnantuninitialized_copy(_InputIterator __f, _InputIterator __l, _ForwardIterator __r) 28043e519524SHoward Hinnant{ 28053e519524SHoward Hinnant __destruct_n __d(0); 28063e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 28073e519524SHoward Hinnant unique_ptr<value_type, __destruct_n&> __h(&*__r, __d); 28083e519524SHoward Hinnant for (; __f != __l; ++__f, ++__r, __d.__incr((value_type*)0)) 28093e519524SHoward Hinnant ::new(&*__r) value_type(*__f); 28103e519524SHoward Hinnant __h.release(); 28113e519524SHoward Hinnant return __r; 28123e519524SHoward Hinnant} 28133e519524SHoward Hinnant 28143e519524SHoward Hinnanttemplate <class _InputIterator, class _Size, class _ForwardIterator> 28153e519524SHoward Hinnant_ForwardIterator 28163e519524SHoward Hinnantuninitialized_copy_n(_InputIterator __f, _Size __n, _ForwardIterator __r) 28173e519524SHoward Hinnant{ 28183e519524SHoward Hinnant __destruct_n __d(0); 28193e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 28203e519524SHoward Hinnant unique_ptr<value_type, __destruct_n&> __h(&*__r, __d); 28213e519524SHoward Hinnant for (; __n > 0; ++__f, ++__r, __d.__incr((value_type*)0), --__n) 28223e519524SHoward Hinnant ::new(&*__r) value_type(*__f); 28233e519524SHoward Hinnant __h.release(); 28243e519524SHoward Hinnant return __r; 28253e519524SHoward Hinnant} 28263e519524SHoward Hinnant 28273e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Tp> 28283e519524SHoward Hinnantvoid 28293e519524SHoward Hinnantuninitialized_fill(_ForwardIterator __f, _ForwardIterator __l, const _Tp& __x) 28303e519524SHoward Hinnant{ 28313e519524SHoward Hinnant __destruct_n __d(0); 28323e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 28333e519524SHoward Hinnant unique_ptr<value_type, __destruct_n&> __h(&*__f, __d); 28343e519524SHoward Hinnant for (; __f != __l; ++__f, __d.__incr((value_type*)0)) 28353e519524SHoward Hinnant ::new(&*__f) value_type(__x); 28363e519524SHoward Hinnant __h.release(); 28373e519524SHoward Hinnant} 28383e519524SHoward Hinnant 28393e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Size, class _Tp> 284048d05bd2SHoward Hinnant_ForwardIterator 28413e519524SHoward Hinnantuninitialized_fill_n(_ForwardIterator __f, _Size __n, const _Tp& __x) 28423e519524SHoward Hinnant{ 28433e519524SHoward Hinnant __destruct_n __d(0); 28443e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 28453e519524SHoward Hinnant unique_ptr<value_type, __destruct_n&> __h(&*__f, __d); 28463e519524SHoward Hinnant for (; __n > 0; ++__f, --__n, __d.__incr((value_type*)0)) 28473e519524SHoward Hinnant ::new(&*__f) value_type(__x); 28483e519524SHoward Hinnant __h.release(); 284948d05bd2SHoward Hinnant return __f; 28503e519524SHoward Hinnant} 28513e519524SHoward Hinnant 2852848a5374SHoward Hinnantclass _LIBCPP_EXCEPTION_ABI bad_weak_ptr 28533e519524SHoward Hinnant : public std::exception 28543e519524SHoward Hinnant{ 28553e519524SHoward Hinnantpublic: 28563739fe79SHoward Hinnant virtual ~bad_weak_ptr() _NOEXCEPT; 28573739fe79SHoward Hinnant virtual const char* what() const _NOEXCEPT; 28583e519524SHoward Hinnant}; 28593e519524SHoward Hinnant 28603e519524SHoward Hinnanttemplate<class _Tp> class weak_ptr; 28613e519524SHoward Hinnant 28623e519524SHoward Hinnantclass __shared_count 28633e519524SHoward Hinnant{ 28643e519524SHoward Hinnant __shared_count(const __shared_count&); 28653e519524SHoward Hinnant __shared_count& operator=(const __shared_count&); 28663e519524SHoward Hinnant 28673e519524SHoward Hinnantprotected: 28683e519524SHoward Hinnant long __shared_owners_; 28693e519524SHoward Hinnant virtual ~__shared_count(); 28703e519524SHoward Hinnantprivate: 28713739fe79SHoward Hinnant virtual void __on_zero_shared() _NOEXCEPT = 0; 28723e519524SHoward Hinnant 28733e519524SHoward Hinnantpublic: 2874848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 28753739fe79SHoward Hinnant explicit __shared_count(long __refs = 0) _NOEXCEPT 28763e519524SHoward Hinnant : __shared_owners_(__refs) {} 28773e519524SHoward Hinnant 28783739fe79SHoward Hinnant void __add_shared() _NOEXCEPT; 28793739fe79SHoward Hinnant bool __release_shared() _NOEXCEPT; 2880848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 28813739fe79SHoward Hinnant long use_count() const _NOEXCEPT {return __shared_owners_ + 1;} 28823e519524SHoward Hinnant}; 28833e519524SHoward Hinnant 28843e519524SHoward Hinnantclass __shared_weak_count 28853e519524SHoward Hinnant : private __shared_count 28863e519524SHoward Hinnant{ 28873e519524SHoward Hinnant long __shared_weak_owners_; 28883e519524SHoward Hinnant 28893e519524SHoward Hinnantpublic: 2890848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 28913739fe79SHoward Hinnant explicit __shared_weak_count(long __refs = 0) _NOEXCEPT 28923e519524SHoward Hinnant : __shared_count(__refs), 28933e519524SHoward Hinnant __shared_weak_owners_(__refs) {} 28943e519524SHoward Hinnantprotected: 28953e519524SHoward Hinnant virtual ~__shared_weak_count(); 28963e519524SHoward Hinnant 28973e519524SHoward Hinnantpublic: 28983739fe79SHoward Hinnant void __add_shared() _NOEXCEPT; 28993739fe79SHoward Hinnant void __add_weak() _NOEXCEPT; 29003739fe79SHoward Hinnant void __release_shared() _NOEXCEPT; 29013739fe79SHoward Hinnant void __release_weak() _NOEXCEPT; 2902848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 29033739fe79SHoward Hinnant long use_count() const _NOEXCEPT {return __shared_count::use_count();} 29043739fe79SHoward Hinnant __shared_weak_count* lock() _NOEXCEPT; 29053e519524SHoward Hinnant 290654b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI 29073739fe79SHoward Hinnant virtual const void* __get_deleter(const type_info&) const _NOEXCEPT; 290854b409fdSHoward Hinnant#endif 29093e519524SHoward Hinnantprivate: 29103739fe79SHoward Hinnant virtual void __on_zero_shared_weak() _NOEXCEPT = 0; 29113e519524SHoward Hinnant}; 29123e519524SHoward Hinnant 29133e519524SHoward Hinnanttemplate <class _Tp, class _Dp, class _Alloc> 29143e519524SHoward Hinnantclass __shared_ptr_pointer 29153e519524SHoward Hinnant : public __shared_weak_count 29163e519524SHoward Hinnant{ 29173e519524SHoward Hinnant __compressed_pair<__compressed_pair<_Tp, _Dp>, _Alloc> __data_; 29183e519524SHoward Hinnantpublic: 2919848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 29203e519524SHoward Hinnant __shared_ptr_pointer(_Tp __p, _Dp __d, _Alloc __a) 2921ce48a113SHoward Hinnant : __data_(__compressed_pair<_Tp, _Dp>(__p, _VSTD::move(__d)), _VSTD::move(__a)) {} 29223e519524SHoward Hinnant 292354b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI 29243739fe79SHoward Hinnant virtual const void* __get_deleter(const type_info&) const _NOEXCEPT; 292554b409fdSHoward Hinnant#endif 29263e519524SHoward Hinnant 29273e519524SHoward Hinnantprivate: 29283739fe79SHoward Hinnant virtual void __on_zero_shared() _NOEXCEPT; 29293739fe79SHoward Hinnant virtual void __on_zero_shared_weak() _NOEXCEPT; 29303e519524SHoward Hinnant}; 29313e519524SHoward Hinnant 293254b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI 293354b409fdSHoward Hinnant 29343e519524SHoward Hinnanttemplate <class _Tp, class _Dp, class _Alloc> 29353e519524SHoward Hinnantconst void* 29363739fe79SHoward Hinnant__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__get_deleter(const type_info& __t) const _NOEXCEPT 29373e519524SHoward Hinnant{ 29383e519524SHoward Hinnant return __t == typeid(_Dp) ? &__data_.first().second() : 0; 29393e519524SHoward Hinnant} 29403e519524SHoward Hinnant 2941b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_RTTI 294254b409fdSHoward Hinnant 29433e519524SHoward Hinnanttemplate <class _Tp, class _Dp, class _Alloc> 29443e519524SHoward Hinnantvoid 29453739fe79SHoward Hinnant__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__on_zero_shared() _NOEXCEPT 29463e519524SHoward Hinnant{ 29473e519524SHoward Hinnant __data_.first().second()(__data_.first().first()); 29483e519524SHoward Hinnant __data_.first().second().~_Dp(); 29493e519524SHoward Hinnant} 29503e519524SHoward Hinnant 29513e519524SHoward Hinnanttemplate <class _Tp, class _Dp, class _Alloc> 29523e519524SHoward Hinnantvoid 29533739fe79SHoward Hinnant__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__on_zero_shared_weak() _NOEXCEPT 29543e519524SHoward Hinnant{ 29553e519524SHoward Hinnant typename _Alloc::template rebind<__shared_ptr_pointer>::other __a(__data_.second()); 29563e519524SHoward Hinnant __data_.second().~_Alloc(); 29573e519524SHoward Hinnant __a.deallocate(this, 1); 29583e519524SHoward Hinnant} 29593e519524SHoward Hinnant 29603e519524SHoward Hinnanttemplate <class _Tp, class _Alloc> 29613e519524SHoward Hinnantclass __shared_ptr_emplace 29623e519524SHoward Hinnant : public __shared_weak_count 29633e519524SHoward Hinnant{ 29643e519524SHoward Hinnant __compressed_pair<_Alloc, _Tp> __data_; 29653e519524SHoward Hinnantpublic: 29663e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 29673e519524SHoward Hinnant 2968848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 29693e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a) 2970ce48a113SHoward Hinnant : __data_(_VSTD::move(__a)) {} 29713e519524SHoward Hinnant 29723e519524SHoward Hinnant template <class ..._Args> 2973848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 29743e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a, _Args&& ...__args) 2975ce48a113SHoward Hinnant : __data_(_VSTD::move(__a), _Tp(_VSTD::forward<_Args>(__args)...)) {} 29763e519524SHoward Hinnant 29773e519524SHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 29783e519524SHoward Hinnant 2979848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 29803e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a) 29813e519524SHoward Hinnant : __data_(__a) {} 29823e519524SHoward Hinnant 29833e519524SHoward Hinnant template <class _A0> 2984848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 29853e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a, _A0& __a0) 29863e519524SHoward Hinnant : __data_(__a, _Tp(__a0)) {} 29873e519524SHoward Hinnant 29883e519524SHoward Hinnant template <class _A0, class _A1> 2989848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 29903e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a, _A0& __a0, _A1& __a1) 29913e519524SHoward Hinnant : __data_(__a, _Tp(__a0, __a1)) {} 29923e519524SHoward Hinnant 29933e519524SHoward Hinnant template <class _A0, class _A1, class _A2> 2994848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 29953e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a, _A0& __a0, _A1& __a1, _A2& __a2) 29963e519524SHoward Hinnant : __data_(__a, _Tp(__a0, __a1, __a2)) {} 29973e519524SHoward Hinnant 29983e519524SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 29993e519524SHoward Hinnant 30003e519524SHoward Hinnantprivate: 30013739fe79SHoward Hinnant virtual void __on_zero_shared() _NOEXCEPT; 30023739fe79SHoward Hinnant virtual void __on_zero_shared_weak() _NOEXCEPT; 30033e519524SHoward Hinnantpublic: 3004848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 30053739fe79SHoward Hinnant _Tp* get() _NOEXCEPT {return &__data_.second();} 30063e519524SHoward Hinnant}; 30073e519524SHoward Hinnant 30083e519524SHoward Hinnanttemplate <class _Tp, class _Alloc> 30093e519524SHoward Hinnantvoid 30103739fe79SHoward Hinnant__shared_ptr_emplace<_Tp, _Alloc>::__on_zero_shared() _NOEXCEPT 30113e519524SHoward Hinnant{ 30123e519524SHoward Hinnant __data_.second().~_Tp(); 30133e519524SHoward Hinnant} 30143e519524SHoward Hinnant 30153e519524SHoward Hinnanttemplate <class _Tp, class _Alloc> 30163e519524SHoward Hinnantvoid 30173739fe79SHoward Hinnant__shared_ptr_emplace<_Tp, _Alloc>::__on_zero_shared_weak() _NOEXCEPT 30183e519524SHoward Hinnant{ 30193e519524SHoward Hinnant typename _Alloc::template rebind<__shared_ptr_emplace>::other __a(__data_.first()); 30203e519524SHoward Hinnant __data_.first().~_Alloc(); 30213e519524SHoward Hinnant __a.deallocate(this, 1); 30223e519524SHoward Hinnant} 30233e519524SHoward Hinnant 30243e519524SHoward Hinnanttemplate<class _Tp> class enable_shared_from_this; 30253e519524SHoward Hinnant 30263e519524SHoward Hinnanttemplate<class _Tp> 3027848a5374SHoward Hinnantclass _LIBCPP_VISIBLE shared_ptr 30283e519524SHoward Hinnant{ 30293e519524SHoward Hinnantpublic: 30303e519524SHoward Hinnant typedef _Tp element_type; 30313e519524SHoward Hinnantprivate: 30323e519524SHoward Hinnant element_type* __ptr_; 30333e519524SHoward Hinnant __shared_weak_count* __cntrl_; 30343e519524SHoward Hinnant 30353e519524SHoward Hinnant struct __nat {int __for_bool_;}; 30363e519524SHoward Hinnantpublic: 30373739fe79SHoward Hinnant shared_ptr() _NOEXCEPT; 30383739fe79SHoward Hinnant shared_ptr(nullptr_t) _NOEXCEPT; 30393e519524SHoward Hinnant template<class _Yp> explicit shared_ptr(_Yp* __p); 30403e519524SHoward Hinnant template<class _Yp, class _Dp> shared_ptr(_Yp* __p, _Dp __d); 30413e519524SHoward Hinnant template<class _Yp, class _Dp, class _Alloc> shared_ptr(_Yp* __p, _Dp __d, _Alloc __a); 30423e519524SHoward Hinnant template <class _Dp> shared_ptr(nullptr_t __p, _Dp __d); 30433e519524SHoward Hinnant template <class _Dp, class _Alloc> shared_ptr(nullptr_t __p, _Dp __d, _Alloc __a); 30443739fe79SHoward Hinnant template<class _Yp> shared_ptr(const shared_ptr<_Yp>& __r, element_type* __p) _NOEXCEPT; 30453739fe79SHoward Hinnant shared_ptr(const shared_ptr& __r) _NOEXCEPT; 30463e519524SHoward Hinnant template<class _Yp> 30473e519524SHoward Hinnant shared_ptr(const shared_ptr<_Yp>& __r, 30483739fe79SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type = __nat()) 30493739fe79SHoward Hinnant _NOEXCEPT; 30507609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 30513739fe79SHoward Hinnant shared_ptr(shared_ptr&& __r) _NOEXCEPT; 30523e519524SHoward Hinnant template<class _Yp> shared_ptr(shared_ptr<_Yp>&& __r, 30533739fe79SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type = __nat()) 30543739fe79SHoward Hinnant _NOEXCEPT; 30557609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 30563e519524SHoward Hinnant template<class _Yp> explicit shared_ptr(const weak_ptr<_Yp>& __r, 30573e519524SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type= __nat()); 30587609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 30593e519524SHoward Hinnant template<class _Yp> shared_ptr(auto_ptr<_Yp>&& __r); 3060b3371f6fSHoward Hinnant#else 3061b3371f6fSHoward Hinnant template<class _Yp> shared_ptr(auto_ptr<_Yp> __r); 30623e519524SHoward Hinnant#endif 30637609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 30643e519524SHoward Hinnantprivate: 30653e519524SHoward Hinnant template <class _Yp, class _Dp> shared_ptr(const unique_ptr<_Yp, _Dp>& __r);// = delete; 30663e519524SHoward Hinnantpublic: 30673e519524SHoward Hinnant template <class _Yp, class _Dp> shared_ptr(unique_ptr<_Yp, _Dp>&&, 30683e519524SHoward Hinnant typename enable_if<!is_lvalue_reference<_Dp>::value, __nat>::type = __nat()); 30693e519524SHoward Hinnant template <class _Yp, class _Dp> shared_ptr(unique_ptr<_Yp, _Dp>&&, 30703e519524SHoward Hinnant typename enable_if<is_lvalue_reference<_Dp>::value, __nat>::type = __nat()); 30717609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 30723e519524SHoward Hinnant template <class _Yp, class _Dp> shared_ptr(unique_ptr<_Yp, _Dp>, 30733e519524SHoward Hinnant typename enable_if<!is_lvalue_reference<_Dp>::value, __nat>::type = __nat()); 30743e519524SHoward Hinnant template <class _Yp, class _Dp> shared_ptr(unique_ptr<_Yp, _Dp>, 30753e519524SHoward Hinnant typename enable_if<is_lvalue_reference<_Dp>::value, __nat>::type = __nat()); 30767609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 30773e519524SHoward Hinnant 30783e519524SHoward Hinnant ~shared_ptr(); 30793e519524SHoward Hinnant 30803739fe79SHoward Hinnant shared_ptr& operator=(const shared_ptr& __r) _NOEXCEPT; 30813739fe79SHoward Hinnant template<class _Yp> shared_ptr& operator=(const shared_ptr<_Yp>& __r) _NOEXCEPT; 30827609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 30833739fe79SHoward Hinnant shared_ptr& operator=(shared_ptr&& __r) _NOEXCEPT; 30843e519524SHoward Hinnant template<class _Yp> shared_ptr& operator=(shared_ptr<_Yp>&& __r); 30853e519524SHoward Hinnant template<class _Yp> shared_ptr& operator=(auto_ptr<_Yp>&& __r); 30867609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 30879f1102b7SHoward Hinnant template<class _Yp> shared_ptr& operator=(auto_ptr<_Yp> __r); 30883e519524SHoward Hinnant#endif 30897609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 30903e519524SHoward Hinnantprivate: 30913e519524SHoward Hinnant template <class _Yp, class _Dp> shared_ptr& operator=(const unique_ptr<_Yp, _Dp>& __r);// = delete; 30923e519524SHoward Hinnantpublic: 30933e519524SHoward Hinnant template <class _Yp, class _Dp> shared_ptr& operator=(unique_ptr<_Yp, _Dp>&& __r); 30947609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 30953e519524SHoward Hinnant template <class _Yp, class _Dp> shared_ptr& operator=(unique_ptr<_Yp, _Dp> __r); 30963e519524SHoward Hinnant#endif 30973e519524SHoward Hinnant 30983739fe79SHoward Hinnant void swap(shared_ptr& __r) _NOEXCEPT; 30993739fe79SHoward Hinnant void reset() _NOEXCEPT; 31003739fe79SHoward Hinnant template<class _Yp> void reset(_Yp* __p) _NOEXCEPT; 31013e519524SHoward Hinnant template<class _Yp, class _Dp> void reset(_Yp* __p, _Dp __d); 31023e519524SHoward Hinnant template<class _Yp, class _Dp, class _Alloc> void reset(_Yp* __p, _Dp __d, _Alloc __a); 31033e519524SHoward Hinnant 3104848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 31053739fe79SHoward Hinnant element_type* get() const _NOEXCEPT {return __ptr_;} 3106848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 31073739fe79SHoward Hinnant typename add_lvalue_reference<element_type>::type operator*() const _NOEXCEPT 31083739fe79SHoward Hinnant {return *__ptr_;} 3109848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 31103739fe79SHoward Hinnant element_type* operator->() const _NOEXCEPT {return __ptr_;} 3111848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 31123739fe79SHoward Hinnant long use_count() const _NOEXCEPT {return __cntrl_ ? __cntrl_->use_count() : 0;} 3113848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 31143739fe79SHoward Hinnant bool unique() const _NOEXCEPT {return use_count() == 1;} 3115848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 31163739fe79SHoward Hinnant /*explicit*/ operator bool() const _NOEXCEPT {return get() != 0;} 3117848a5374SHoward Hinnant template <class _U> 3118848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 3119848a5374SHoward Hinnant bool owner_before(shared_ptr<_U> const& __p) const 31203e519524SHoward Hinnant {return __cntrl_ < __p.__cntrl_;} 3121848a5374SHoward Hinnant template <class _U> 3122848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 3123848a5374SHoward Hinnant bool owner_before(weak_ptr<_U> const& __p) const 31243e519524SHoward Hinnant {return __cntrl_ < __p.__cntrl_;} 31253e519524SHoward Hinnant 312654b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI 31273e519524SHoward Hinnant template <class _Dp> 3128848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 31293739fe79SHoward Hinnant _Dp* __get_deleter() const _NOEXCEPT 31303e519524SHoward Hinnant {return (_Dp*)(__cntrl_ ? __cntrl_->__get_deleter(typeid(_Dp)) : 0);} 3131b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_RTTI 31323e519524SHoward Hinnant 31333e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 31343e519524SHoward Hinnant 31353e519524SHoward Hinnant template<class ..._Args> 31363e519524SHoward Hinnant static 31373e519524SHoward Hinnant shared_ptr<_Tp> 31383e519524SHoward Hinnant make_shared(_Args&& ...__args); 31393e519524SHoward Hinnant 31403e519524SHoward Hinnant template<class _Alloc, class ..._Args> 31413e519524SHoward Hinnant static 31423e519524SHoward Hinnant shared_ptr<_Tp> 31433e519524SHoward Hinnant allocate_shared(const _Alloc& __a, _Args&& ...__args); 31443e519524SHoward Hinnant 31453e519524SHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 31463e519524SHoward Hinnant 31473e519524SHoward Hinnant static shared_ptr<_Tp> make_shared(); 31483e519524SHoward Hinnant 31493e519524SHoward Hinnant template<class _A0> 31503e519524SHoward Hinnant static shared_ptr<_Tp> make_shared(_A0&); 31513e519524SHoward Hinnant 31523e519524SHoward Hinnant template<class _A0, class _A1> 31533e519524SHoward Hinnant static shared_ptr<_Tp> make_shared(_A0&, _A1&); 31543e519524SHoward Hinnant 31553e519524SHoward Hinnant template<class _A0, class _A1, class _A2> 31563e519524SHoward Hinnant static shared_ptr<_Tp> make_shared(_A0&, _A1&, _A2&); 31573e519524SHoward Hinnant 31583e519524SHoward Hinnant template<class _Alloc> 31593e519524SHoward Hinnant static shared_ptr<_Tp> 31603e519524SHoward Hinnant allocate_shared(const _Alloc& __a); 31613e519524SHoward Hinnant 31623e519524SHoward Hinnant template<class _Alloc, class _A0> 31633e519524SHoward Hinnant static shared_ptr<_Tp> 31643e519524SHoward Hinnant allocate_shared(const _Alloc& __a, _A0& __a0); 31653e519524SHoward Hinnant 31663e519524SHoward Hinnant template<class _Alloc, class _A0, class _A1> 31673e519524SHoward Hinnant static shared_ptr<_Tp> 31683e519524SHoward Hinnant allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1); 31693e519524SHoward Hinnant 31703e519524SHoward Hinnant template<class _Alloc, class _A0, class _A1, class _A2> 31713e519524SHoward Hinnant static shared_ptr<_Tp> 31723e519524SHoward Hinnant allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1, _A2& __a2); 31733e519524SHoward Hinnant 31743e519524SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 31753e519524SHoward Hinnant 31763e519524SHoward Hinnantprivate: 31773e519524SHoward Hinnant 31783e519524SHoward Hinnant template <class _Yp> 3179848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 31803e519524SHoward Hinnant void 31813739fe79SHoward Hinnant __enable_weak_this(const enable_shared_from_this<_Yp>* __e) _NOEXCEPT 31823e519524SHoward Hinnant { 31833e519524SHoward Hinnant if (__e) 31843e519524SHoward Hinnant __e->__weak_this_ = *this; 31853e519524SHoward Hinnant } 31863e519524SHoward Hinnant 3187848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 31883739fe79SHoward Hinnant void __enable_weak_this(const void*) _NOEXCEPT {} 31893e519524SHoward Hinnant 3190848a5374SHoward Hinnant template <class _Up> friend class _LIBCPP_VISIBLE shared_ptr; 3191848a5374SHoward Hinnant template <class _Up> friend class _LIBCPP_VISIBLE weak_ptr; 31923e519524SHoward Hinnant}; 31933e519524SHoward Hinnant 31943e519524SHoward Hinnanttemplate<class _Tp> 31953e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 31963739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr() _NOEXCEPT 31973e519524SHoward Hinnant : __ptr_(0), 31983e519524SHoward Hinnant __cntrl_(0) 31993e519524SHoward Hinnant{ 32003e519524SHoward Hinnant} 32013e519524SHoward Hinnant 32023e519524SHoward Hinnanttemplate<class _Tp> 32033e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 32043739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr(nullptr_t) _NOEXCEPT 32053e519524SHoward Hinnant : __ptr_(0), 32063e519524SHoward Hinnant __cntrl_(0) 32073e519524SHoward Hinnant{ 32083e519524SHoward Hinnant} 32093e519524SHoward Hinnant 32103e519524SHoward Hinnanttemplate<class _Tp> 32113e519524SHoward Hinnanttemplate<class _Yp> 32123e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(_Yp* __p) 32133e519524SHoward Hinnant : __ptr_(__p) 32143e519524SHoward Hinnant{ 32153e519524SHoward Hinnant unique_ptr<_Yp> __hold(__p); 32163e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, default_delete<_Yp>, allocator<_Yp> > _CntrlBlk; 32173e519524SHoward Hinnant __cntrl_ = new _CntrlBlk(__p, default_delete<_Yp>(), allocator<_Yp>()); 32183e519524SHoward Hinnant __hold.release(); 32193e519524SHoward Hinnant __enable_weak_this(__p); 32203e519524SHoward Hinnant} 32213e519524SHoward Hinnant 32223e519524SHoward Hinnanttemplate<class _Tp> 32233e519524SHoward Hinnanttemplate<class _Yp, class _Dp> 32243e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(_Yp* __p, _Dp __d) 32253e519524SHoward Hinnant : __ptr_(__p) 32263e519524SHoward Hinnant{ 32273e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 32283e519524SHoward Hinnant try 32293e519524SHoward Hinnant { 3230b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 32313e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, _Dp, allocator<_Yp> > _CntrlBlk; 32323e519524SHoward Hinnant __cntrl_ = new _CntrlBlk(__p, __d, allocator<_Yp>()); 32333e519524SHoward Hinnant __enable_weak_this(__p); 32343e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 32353e519524SHoward Hinnant } 32363e519524SHoward Hinnant catch (...) 32373e519524SHoward Hinnant { 32383e519524SHoward Hinnant __d(__p); 32393e519524SHoward Hinnant throw; 32403e519524SHoward Hinnant } 3241b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 32423e519524SHoward Hinnant} 32433e519524SHoward Hinnant 32443e519524SHoward Hinnanttemplate<class _Tp> 32453e519524SHoward Hinnanttemplate<class _Dp> 32463e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(nullptr_t __p, _Dp __d) 32473e519524SHoward Hinnant : __ptr_(0) 32483e519524SHoward Hinnant{ 32493e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 32503e519524SHoward Hinnant try 32513e519524SHoward Hinnant { 3252b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 32533e519524SHoward Hinnant typedef __shared_ptr_pointer<nullptr_t, _Dp, allocator<_Tp> > _CntrlBlk; 32543e519524SHoward Hinnant __cntrl_ = new _CntrlBlk(__p, __d, allocator<_Tp>()); 32553e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 32563e519524SHoward Hinnant } 32573e519524SHoward Hinnant catch (...) 32583e519524SHoward Hinnant { 32593e519524SHoward Hinnant __d(__p); 32603e519524SHoward Hinnant throw; 32613e519524SHoward Hinnant } 3262b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 32633e519524SHoward Hinnant} 32643e519524SHoward Hinnant 32653e519524SHoward Hinnanttemplate<class _Tp> 32663e519524SHoward Hinnanttemplate<class _Yp, class _Dp, class _Alloc> 32673e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(_Yp* __p, _Dp __d, _Alloc __a) 32683e519524SHoward Hinnant : __ptr_(__p) 32693e519524SHoward Hinnant{ 32703e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 32713e519524SHoward Hinnant try 32723e519524SHoward Hinnant { 3273b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 32743e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, _Dp, _Alloc> _CntrlBlk; 32753e519524SHoward Hinnant typedef typename _Alloc::template rebind<_CntrlBlk>::other _A2; 32763e519524SHoward Hinnant typedef __allocator_destructor<_A2> _D2; 32773e519524SHoward Hinnant _A2 __a2(__a); 32783e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); 32793e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__p, __d, __a); 32803e519524SHoward Hinnant __cntrl_ = __hold2.release(); 32813e519524SHoward Hinnant __enable_weak_this(__p); 32823e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 32833e519524SHoward Hinnant } 32843e519524SHoward Hinnant catch (...) 32853e519524SHoward Hinnant { 32863e519524SHoward Hinnant __d(__p); 32873e519524SHoward Hinnant throw; 32883e519524SHoward Hinnant } 3289b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 32903e519524SHoward Hinnant} 32913e519524SHoward Hinnant 32923e519524SHoward Hinnanttemplate<class _Tp> 32933e519524SHoward Hinnanttemplate<class _Dp, class _Alloc> 32943e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(nullptr_t __p, _Dp __d, _Alloc __a) 32953e519524SHoward Hinnant : __ptr_(0) 32963e519524SHoward Hinnant{ 32973e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 32983e519524SHoward Hinnant try 32993e519524SHoward Hinnant { 3300b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 33013e519524SHoward Hinnant typedef __shared_ptr_pointer<nullptr_t, _Dp, _Alloc> _CntrlBlk; 33023e519524SHoward Hinnant typedef typename _Alloc::template rebind<_CntrlBlk>::other _A2; 33033e519524SHoward Hinnant typedef __allocator_destructor<_A2> _D2; 33043e519524SHoward Hinnant _A2 __a2(__a); 33053e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); 33063e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__p, __d, __a); 33073e519524SHoward Hinnant __cntrl_ = __hold2.release(); 33083e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 33093e519524SHoward Hinnant } 33103e519524SHoward Hinnant catch (...) 33113e519524SHoward Hinnant { 33123e519524SHoward Hinnant __d(__p); 33133e519524SHoward Hinnant throw; 33143e519524SHoward Hinnant } 3315b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 33163e519524SHoward Hinnant} 33173e519524SHoward Hinnant 33183e519524SHoward Hinnanttemplate<class _Tp> 33193e519524SHoward Hinnanttemplate<class _Yp> 33203e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 33213739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr(const shared_ptr<_Yp>& __r, element_type *__p) _NOEXCEPT 33223e519524SHoward Hinnant : __ptr_(__p), 33233e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 33243e519524SHoward Hinnant{ 33253e519524SHoward Hinnant if (__cntrl_) 33263e519524SHoward Hinnant __cntrl_->__add_shared(); 33273e519524SHoward Hinnant} 33283e519524SHoward Hinnant 33293e519524SHoward Hinnanttemplate<class _Tp> 33303e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 33313739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr(const shared_ptr& __r) _NOEXCEPT 33323e519524SHoward Hinnant : __ptr_(__r.__ptr_), 33333e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 33343e519524SHoward Hinnant{ 33353e519524SHoward Hinnant if (__cntrl_) 33363e519524SHoward Hinnant __cntrl_->__add_shared(); 33373e519524SHoward Hinnant} 33383e519524SHoward Hinnant 33393e519524SHoward Hinnanttemplate<class _Tp> 33403e519524SHoward Hinnanttemplate<class _Yp> 33413e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 33423e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(const shared_ptr<_Yp>& __r, 33433e519524SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type) 33443739fe79SHoward Hinnant _NOEXCEPT 33453e519524SHoward Hinnant : __ptr_(__r.__ptr_), 33463e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 33473e519524SHoward Hinnant{ 33483e519524SHoward Hinnant if (__cntrl_) 33493e519524SHoward Hinnant __cntrl_->__add_shared(); 33503e519524SHoward Hinnant} 33513e519524SHoward Hinnant 33527609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 33533e519524SHoward Hinnant 33543e519524SHoward Hinnanttemplate<class _Tp> 33553e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 33563739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr(shared_ptr&& __r) _NOEXCEPT 33573e519524SHoward Hinnant : __ptr_(__r.__ptr_), 33583e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 33593e519524SHoward Hinnant{ 33603e519524SHoward Hinnant __r.__ptr_ = 0; 33613e519524SHoward Hinnant __r.__cntrl_ = 0; 33623e519524SHoward Hinnant} 33633e519524SHoward Hinnant 33643e519524SHoward Hinnanttemplate<class _Tp> 33653e519524SHoward Hinnanttemplate<class _Yp> 33663e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 33673e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(shared_ptr<_Yp>&& __r, 33683e519524SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type) 33693739fe79SHoward Hinnant _NOEXCEPT 33703e519524SHoward Hinnant : __ptr_(__r.__ptr_), 33713e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 33723e519524SHoward Hinnant{ 33733e519524SHoward Hinnant __r.__ptr_ = 0; 33743e519524SHoward Hinnant __r.__cntrl_ = 0; 33753e519524SHoward Hinnant} 33763e519524SHoward Hinnant 33777609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 33783e519524SHoward Hinnant 33793e519524SHoward Hinnanttemplate<class _Tp> 33803e519524SHoward Hinnanttemplate<class _Yp> 33817609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 33823e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(auto_ptr<_Yp>&& __r) 33833e519524SHoward Hinnant#else 33849f1102b7SHoward Hinnantshared_ptr<_Tp>::shared_ptr(auto_ptr<_Yp> __r) 33853e519524SHoward Hinnant#endif 33863e519524SHoward Hinnant : __ptr_(__r.get()) 33873e519524SHoward Hinnant{ 33883e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, default_delete<_Yp>, allocator<_Yp> > _CntrlBlk; 33893e519524SHoward Hinnant __cntrl_ = new _CntrlBlk(__r.get(), default_delete<_Yp>(), allocator<_Yp>()); 33903e519524SHoward Hinnant __enable_weak_this(__r.get()); 33913e519524SHoward Hinnant __r.release(); 33923e519524SHoward Hinnant} 33933e519524SHoward Hinnant 33943e519524SHoward Hinnanttemplate<class _Tp> 33953e519524SHoward Hinnanttemplate <class _Yp, class _Dp> 33967609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 33973e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp>&& __r, 33983e519524SHoward Hinnant#else 33993e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp> __r, 34003e519524SHoward Hinnant#endif 34013e519524SHoward Hinnant typename enable_if<!is_lvalue_reference<_Dp>::value, __nat>::type) 34023e519524SHoward Hinnant : __ptr_(__r.get()) 34033e519524SHoward Hinnant{ 34043e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, _Dp, allocator<_Yp> > _CntrlBlk; 34053e519524SHoward Hinnant __cntrl_ = new _CntrlBlk(__r.get(), __r.get_deleter(), allocator<_Yp>()); 34063e519524SHoward Hinnant __enable_weak_this(__r.get()); 34073e519524SHoward Hinnant __r.release(); 34083e519524SHoward Hinnant} 34093e519524SHoward Hinnant 34103e519524SHoward Hinnanttemplate<class _Tp> 34113e519524SHoward Hinnanttemplate <class _Yp, class _Dp> 34127609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 34133e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp>&& __r, 34143e519524SHoward Hinnant#else 34153e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp> __r, 34163e519524SHoward Hinnant#endif 34173e519524SHoward Hinnant typename enable_if<is_lvalue_reference<_Dp>::value, __nat>::type) 34183e519524SHoward Hinnant : __ptr_(__r.get()) 34193e519524SHoward Hinnant{ 34203e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, 34213e519524SHoward Hinnant reference_wrapper<typename remove_reference<_Dp>::type>, 34223e519524SHoward Hinnant allocator<_Yp> > _CntrlBlk; 34233e519524SHoward Hinnant __cntrl_ = new _CntrlBlk(__r.get(), ref(__r.get_deleter()), allocator<_Yp>()); 34243e519524SHoward Hinnant __enable_weak_this(__r.get()); 34253e519524SHoward Hinnant __r.release(); 34263e519524SHoward Hinnant} 34273e519524SHoward Hinnant 34283e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 34293e519524SHoward Hinnant 34303e519524SHoward Hinnanttemplate<class _Tp> 34313e519524SHoward Hinnanttemplate<class ..._Args> 34323e519524SHoward Hinnantshared_ptr<_Tp> 34333e519524SHoward Hinnantshared_ptr<_Tp>::make_shared(_Args&& ...__args) 34343e519524SHoward Hinnant{ 34353e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 34363e519524SHoward Hinnant typedef allocator<_CntrlBlk> _A2; 34373e519524SHoward Hinnant typedef __allocator_destructor<_A2> _D2; 34383e519524SHoward Hinnant _A2 __a2; 34393e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); 3440ce48a113SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__a2, _VSTD::forward<_Args>(__args)...); 34413e519524SHoward Hinnant shared_ptr<_Tp> __r; 34423e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 34433e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 34443e519524SHoward Hinnant __r.__enable_weak_this(__r.__ptr_); 34453e519524SHoward Hinnant return __r; 34463e519524SHoward Hinnant} 34473e519524SHoward Hinnant 34483e519524SHoward Hinnanttemplate<class _Tp> 34493e519524SHoward Hinnanttemplate<class _Alloc, class ..._Args> 34503e519524SHoward Hinnantshared_ptr<_Tp> 34513e519524SHoward Hinnantshared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _Args&& ...__args) 34523e519524SHoward Hinnant{ 34533e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 34543e519524SHoward Hinnant typedef typename _Alloc::template rebind<_CntrlBlk>::other _A2; 34553e519524SHoward Hinnant typedef __allocator_destructor<_A2> _D2; 34563e519524SHoward Hinnant _A2 __a2(__a); 34573e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); 3458ce48a113SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__a, _VSTD::forward<_Args>(__args)...); 34593e519524SHoward Hinnant shared_ptr<_Tp> __r; 34603e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 34613e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 34623e519524SHoward Hinnant __r.__enable_weak_this(__r.__ptr_); 34633e519524SHoward Hinnant return __r; 34643e519524SHoward Hinnant} 34653e519524SHoward Hinnant 34663e519524SHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 34673e519524SHoward Hinnant 34683e519524SHoward Hinnanttemplate<class _Tp> 34693e519524SHoward Hinnantshared_ptr<_Tp> 34703e519524SHoward Hinnantshared_ptr<_Tp>::make_shared() 34713e519524SHoward Hinnant{ 34723e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 34733e519524SHoward Hinnant typedef allocator<_CntrlBlk> _Alloc2; 34743e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 34753e519524SHoward Hinnant _Alloc2 __alloc2; 34763e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 34773e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__alloc2); 34783e519524SHoward Hinnant shared_ptr<_Tp> __r; 34793e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 34803e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 34813e519524SHoward Hinnant __r.__enable_weak_this(__r.__ptr_); 34823e519524SHoward Hinnant return __r; 34833e519524SHoward Hinnant} 34843e519524SHoward Hinnant 34853e519524SHoward Hinnanttemplate<class _Tp> 34863e519524SHoward Hinnanttemplate<class _A0> 34873e519524SHoward Hinnantshared_ptr<_Tp> 34883e519524SHoward Hinnantshared_ptr<_Tp>::make_shared(_A0& __a0) 34893e519524SHoward Hinnant{ 34903e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 34913e519524SHoward Hinnant typedef allocator<_CntrlBlk> _Alloc2; 34923e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 34933e519524SHoward Hinnant _Alloc2 __alloc2; 34943e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 34953e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__alloc2, __a0); 34963e519524SHoward Hinnant shared_ptr<_Tp> __r; 34973e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 34983e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 34993e519524SHoward Hinnant __r.__enable_weak_this(__r.__ptr_); 35003e519524SHoward Hinnant return __r; 35013e519524SHoward Hinnant} 35023e519524SHoward Hinnant 35033e519524SHoward Hinnanttemplate<class _Tp> 35043e519524SHoward Hinnanttemplate<class _A0, class _A1> 35053e519524SHoward Hinnantshared_ptr<_Tp> 35063e519524SHoward Hinnantshared_ptr<_Tp>::make_shared(_A0& __a0, _A1& __a1) 35073e519524SHoward Hinnant{ 35083e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 35093e519524SHoward Hinnant typedef allocator<_CntrlBlk> _Alloc2; 35103e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 35113e519524SHoward Hinnant _Alloc2 __alloc2; 35123e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 35133e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__alloc2, __a0, __a1); 35143e519524SHoward Hinnant shared_ptr<_Tp> __r; 35153e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 35163e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 35173e519524SHoward Hinnant __r.__enable_weak_this(__r.__ptr_); 35183e519524SHoward Hinnant return __r; 35193e519524SHoward Hinnant} 35203e519524SHoward Hinnant 35213e519524SHoward Hinnanttemplate<class _Tp> 35223e519524SHoward Hinnanttemplate<class _A0, class _A1, class _A2> 35233e519524SHoward Hinnantshared_ptr<_Tp> 35243e519524SHoward Hinnantshared_ptr<_Tp>::make_shared(_A0& __a0, _A1& __a1, _A2& __a2) 35253e519524SHoward Hinnant{ 35263e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 35273e519524SHoward Hinnant typedef allocator<_CntrlBlk> _Alloc2; 35283e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 35293e519524SHoward Hinnant _Alloc2 __alloc2; 35303e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 35313e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__alloc2, __a0, __a1, __a2); 35323e519524SHoward Hinnant shared_ptr<_Tp> __r; 35333e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 35343e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 35353e519524SHoward Hinnant __r.__enable_weak_this(__r.__ptr_); 35363e519524SHoward Hinnant return __r; 35373e519524SHoward Hinnant} 35383e519524SHoward Hinnant 35393e519524SHoward Hinnanttemplate<class _Tp> 35403e519524SHoward Hinnanttemplate<class _Alloc> 35413e519524SHoward Hinnantshared_ptr<_Tp> 35423e519524SHoward Hinnantshared_ptr<_Tp>::allocate_shared(const _Alloc& __a) 35433e519524SHoward Hinnant{ 35443e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 35453e519524SHoward Hinnant typedef typename _Alloc::template rebind<_CntrlBlk>::other _Alloc2; 35463e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 35473e519524SHoward Hinnant _Alloc2 __alloc2(__a); 35483e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 35493e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__a); 35503e519524SHoward Hinnant shared_ptr<_Tp> __r; 35513e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 35523e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 35533e519524SHoward Hinnant __r.__enable_weak_this(__r.__ptr_); 35543e519524SHoward Hinnant return __r; 35553e519524SHoward Hinnant} 35563e519524SHoward Hinnant 35573e519524SHoward Hinnanttemplate<class _Tp> 35583e519524SHoward Hinnanttemplate<class _Alloc, class _A0> 35593e519524SHoward Hinnantshared_ptr<_Tp> 35603e519524SHoward Hinnantshared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _A0& __a0) 35613e519524SHoward Hinnant{ 35623e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 35633e519524SHoward Hinnant typedef typename _Alloc::template rebind<_CntrlBlk>::other _Alloc2; 35643e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 35653e519524SHoward Hinnant _Alloc2 __alloc2(__a); 35663e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 35673e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__a, __a0); 35683e519524SHoward Hinnant shared_ptr<_Tp> __r; 35693e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 35703e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 35713e519524SHoward Hinnant __r.__enable_weak_this(__r.__ptr_); 35723e519524SHoward Hinnant return __r; 35733e519524SHoward Hinnant} 35743e519524SHoward Hinnant 35753e519524SHoward Hinnanttemplate<class _Tp> 35763e519524SHoward Hinnanttemplate<class _Alloc, class _A0, class _A1> 35773e519524SHoward Hinnantshared_ptr<_Tp> 35783e519524SHoward Hinnantshared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1) 35793e519524SHoward Hinnant{ 35803e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 35813e519524SHoward Hinnant typedef typename _Alloc::template rebind<_CntrlBlk>::other _Alloc2; 35823e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 35833e519524SHoward Hinnant _Alloc2 __alloc2(__a); 35843e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 35853e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__a, __a0, __a1); 35863e519524SHoward Hinnant shared_ptr<_Tp> __r; 35873e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 35883e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 35893e519524SHoward Hinnant __r.__enable_weak_this(__r.__ptr_); 35903e519524SHoward Hinnant return __r; 35913e519524SHoward Hinnant} 35923e519524SHoward Hinnant 35933e519524SHoward Hinnanttemplate<class _Tp> 35943e519524SHoward Hinnanttemplate<class _Alloc, class _A0, class _A1, class _A2> 35953e519524SHoward Hinnantshared_ptr<_Tp> 35963e519524SHoward Hinnantshared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1, _A2& __a2) 35973e519524SHoward Hinnant{ 35983e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 35993e519524SHoward Hinnant typedef typename _Alloc::template rebind<_CntrlBlk>::other _Alloc2; 36003e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 36013e519524SHoward Hinnant _Alloc2 __alloc2(__a); 36023e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 36033e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__a, __a0, __a1, __a2); 36043e519524SHoward Hinnant shared_ptr<_Tp> __r; 36053e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 36063e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 36073e519524SHoward Hinnant __r.__enable_weak_this(__r.__ptr_); 36083e519524SHoward Hinnant return __r; 36093e519524SHoward Hinnant} 36103e519524SHoward Hinnant 36113e519524SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 36123e519524SHoward Hinnant 36133e519524SHoward Hinnanttemplate<class _Tp> 36143e519524SHoward Hinnantshared_ptr<_Tp>::~shared_ptr() 36153e519524SHoward Hinnant{ 36163e519524SHoward Hinnant if (__cntrl_) 36173e519524SHoward Hinnant __cntrl_->__release_shared(); 36183e519524SHoward Hinnant} 36193e519524SHoward Hinnant 36203e519524SHoward Hinnanttemplate<class _Tp> 36213e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 36223e519524SHoward Hinnantshared_ptr<_Tp>& 36233739fe79SHoward Hinnantshared_ptr<_Tp>::operator=(const shared_ptr& __r) _NOEXCEPT 36243e519524SHoward Hinnant{ 36253e519524SHoward Hinnant shared_ptr(__r).swap(*this); 36263e519524SHoward Hinnant return *this; 36273e519524SHoward Hinnant} 36283e519524SHoward Hinnant 36293e519524SHoward Hinnanttemplate<class _Tp> 36303e519524SHoward Hinnanttemplate<class _Yp> 36313e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 36323e519524SHoward Hinnantshared_ptr<_Tp>& 36333739fe79SHoward Hinnantshared_ptr<_Tp>::operator=(const shared_ptr<_Yp>& __r) _NOEXCEPT 36343e519524SHoward Hinnant{ 36353e519524SHoward Hinnant shared_ptr(__r).swap(*this); 36363e519524SHoward Hinnant return *this; 36373e519524SHoward Hinnant} 36383e519524SHoward Hinnant 36397609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 36403e519524SHoward Hinnant 36413e519524SHoward Hinnanttemplate<class _Tp> 36423e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 36433e519524SHoward Hinnantshared_ptr<_Tp>& 36443739fe79SHoward Hinnantshared_ptr<_Tp>::operator=(shared_ptr&& __r) _NOEXCEPT 36453e519524SHoward Hinnant{ 3646ce48a113SHoward Hinnant shared_ptr(_VSTD::move(__r)).swap(*this); 36473e519524SHoward Hinnant return *this; 36483e519524SHoward Hinnant} 36493e519524SHoward Hinnant 36503e519524SHoward Hinnanttemplate<class _Tp> 36513e519524SHoward Hinnanttemplate<class _Yp> 36523e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 36533e519524SHoward Hinnantshared_ptr<_Tp>& 36543e519524SHoward Hinnantshared_ptr<_Tp>::operator=(shared_ptr<_Yp>&& __r) 36553e519524SHoward Hinnant{ 3656ce48a113SHoward Hinnant shared_ptr(_VSTD::move(__r)).swap(*this); 36573e519524SHoward Hinnant return *this; 36583e519524SHoward Hinnant} 36593e519524SHoward Hinnant 36603e519524SHoward Hinnanttemplate<class _Tp> 36613e519524SHoward Hinnanttemplate<class _Yp> 36623e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 36633e519524SHoward Hinnantshared_ptr<_Tp>& 36643e519524SHoward Hinnantshared_ptr<_Tp>::operator=(auto_ptr<_Yp>&& __r) 36653e519524SHoward Hinnant{ 3666ce48a113SHoward Hinnant shared_ptr(_VSTD::move(__r)).swap(*this); 36673e519524SHoward Hinnant return *this; 36683e519524SHoward Hinnant} 36693e519524SHoward Hinnant 36703e519524SHoward Hinnanttemplate<class _Tp> 36713e519524SHoward Hinnanttemplate <class _Yp, class _Dp> 36723e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 36733e519524SHoward Hinnantshared_ptr<_Tp>& 36743e519524SHoward Hinnantshared_ptr<_Tp>::operator=(unique_ptr<_Yp, _Dp>&& __r) 36753e519524SHoward Hinnant{ 3676ce48a113SHoward Hinnant shared_ptr(_VSTD::move(__r)).swap(*this); 36773e519524SHoward Hinnant return *this; 36783e519524SHoward Hinnant} 36793e519524SHoward Hinnant 36807609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 36813e519524SHoward Hinnant 36823e519524SHoward Hinnanttemplate<class _Tp> 36833e519524SHoward Hinnanttemplate<class _Yp> 36843e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 36853e519524SHoward Hinnantshared_ptr<_Tp>& 3686b3371f6fSHoward Hinnantshared_ptr<_Tp>::operator=(auto_ptr<_Yp> __r) 36873e519524SHoward Hinnant{ 36883e519524SHoward Hinnant shared_ptr(__r).swap(*this); 36893e519524SHoward Hinnant return *this; 36903e519524SHoward Hinnant} 36913e519524SHoward Hinnant 36923e519524SHoward Hinnanttemplate<class _Tp> 36933e519524SHoward Hinnanttemplate <class _Yp, class _Dp> 36943e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 36953e519524SHoward Hinnantshared_ptr<_Tp>& 36963e519524SHoward Hinnantshared_ptr<_Tp>::operator=(unique_ptr<_Yp, _Dp> __r) 36973e519524SHoward Hinnant{ 3698ce48a113SHoward Hinnant shared_ptr(_VSTD::move(__r)).swap(*this); 36993e519524SHoward Hinnant return *this; 37003e519524SHoward Hinnant} 37013e519524SHoward Hinnant 37027609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 37033e519524SHoward Hinnant 37043e519524SHoward Hinnanttemplate<class _Tp> 37053e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 37063e519524SHoward Hinnantvoid 37073739fe79SHoward Hinnantshared_ptr<_Tp>::swap(shared_ptr& __r) _NOEXCEPT 37083e519524SHoward Hinnant{ 3709ce48a113SHoward Hinnant _VSTD::swap(__ptr_, __r.__ptr_); 3710ce48a113SHoward Hinnant _VSTD::swap(__cntrl_, __r.__cntrl_); 37113e519524SHoward Hinnant} 37123e519524SHoward Hinnant 37133e519524SHoward Hinnanttemplate<class _Tp> 37143e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 37153e519524SHoward Hinnantvoid 37163739fe79SHoward Hinnantshared_ptr<_Tp>::reset() _NOEXCEPT 37173e519524SHoward Hinnant{ 37183e519524SHoward Hinnant shared_ptr().swap(*this); 37193e519524SHoward Hinnant} 37203e519524SHoward Hinnant 37213e519524SHoward Hinnanttemplate<class _Tp> 37223e519524SHoward Hinnanttemplate<class _Yp> 37233e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 37243e519524SHoward Hinnantvoid 37253e519524SHoward Hinnantshared_ptr<_Tp>::reset(_Yp* __p) 37263e519524SHoward Hinnant{ 37273e519524SHoward Hinnant shared_ptr(__p).swap(*this); 37283e519524SHoward Hinnant} 37293e519524SHoward Hinnant 37303e519524SHoward Hinnanttemplate<class _Tp> 37313e519524SHoward Hinnanttemplate<class _Yp, class _Dp> 37323e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 37333e519524SHoward Hinnantvoid 37343e519524SHoward Hinnantshared_ptr<_Tp>::reset(_Yp* __p, _Dp __d) 37353e519524SHoward Hinnant{ 37363e519524SHoward Hinnant shared_ptr(__p, __d).swap(*this); 37373e519524SHoward Hinnant} 37383e519524SHoward Hinnant 37393e519524SHoward Hinnanttemplate<class _Tp> 37403e519524SHoward Hinnanttemplate<class _Yp, class _Dp, class _Alloc> 37413e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 37423e519524SHoward Hinnantvoid 37433e519524SHoward Hinnantshared_ptr<_Tp>::reset(_Yp* __p, _Dp __d, _Alloc __a) 37443e519524SHoward Hinnant{ 37453e519524SHoward Hinnant shared_ptr(__p, __d, __a).swap(*this); 37463e519524SHoward Hinnant} 37473e519524SHoward Hinnant 37483e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 37493e519524SHoward Hinnant 37503e519524SHoward Hinnanttemplate<class _Tp, class ..._Args> 37513e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 37523e519524SHoward Hinnantshared_ptr<_Tp> 37533e519524SHoward Hinnantmake_shared(_Args&& ...__args) 37543e519524SHoward Hinnant{ 3755ce48a113SHoward Hinnant return shared_ptr<_Tp>::make_shared(_VSTD::forward<_Args>(__args)...); 37563e519524SHoward Hinnant} 37573e519524SHoward Hinnant 37583e519524SHoward Hinnanttemplate<class _Tp, class _Alloc, class ..._Args> 37593e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 37603e519524SHoward Hinnantshared_ptr<_Tp> 37613e519524SHoward Hinnantallocate_shared(const _Alloc& __a, _Args&& ...__args) 37623e519524SHoward Hinnant{ 3763ce48a113SHoward Hinnant return shared_ptr<_Tp>::allocate_shared(__a, _VSTD::forward<_Args>(__args)...); 37643e519524SHoward Hinnant} 37653e519524SHoward Hinnant 37663e519524SHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 37673e519524SHoward Hinnant 37683e519524SHoward Hinnanttemplate<class _Tp> 37693e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 37703e519524SHoward Hinnantshared_ptr<_Tp> 37713e519524SHoward Hinnantmake_shared() 37723e519524SHoward Hinnant{ 37733e519524SHoward Hinnant return shared_ptr<_Tp>::make_shared(); 37743e519524SHoward Hinnant} 37753e519524SHoward Hinnant 37763e519524SHoward Hinnanttemplate<class _Tp, class _A0> 37773e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 37783e519524SHoward Hinnantshared_ptr<_Tp> 37793e519524SHoward Hinnantmake_shared(_A0& __a0) 37803e519524SHoward Hinnant{ 37813e519524SHoward Hinnant return shared_ptr<_Tp>::make_shared(__a0); 37823e519524SHoward Hinnant} 37833e519524SHoward Hinnant 37843e519524SHoward Hinnanttemplate<class _Tp, class _A0, class _A1> 37853e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 37863e519524SHoward Hinnantshared_ptr<_Tp> 37873e519524SHoward Hinnantmake_shared(_A0& __a0, _A1& __a1) 37883e519524SHoward Hinnant{ 37893e519524SHoward Hinnant return shared_ptr<_Tp>::make_shared(__a0, __a1); 37903e519524SHoward Hinnant} 37913e519524SHoward Hinnant 37923e519524SHoward Hinnanttemplate<class _Tp, class _A0, class _A1, class _A2> 37933e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 37943e519524SHoward Hinnantshared_ptr<_Tp> 37953e519524SHoward Hinnantmake_shared(_A0& __a0, _A1& __a1, _A2& __a2) 37963e519524SHoward Hinnant{ 37973e519524SHoward Hinnant return shared_ptr<_Tp>::make_shared(__a0, __a1, __a2); 37983e519524SHoward Hinnant} 37993e519524SHoward Hinnant 38003e519524SHoward Hinnanttemplate<class _Tp, class _Alloc> 38013e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 38023e519524SHoward Hinnantshared_ptr<_Tp> 38033e519524SHoward Hinnantallocate_shared(const _Alloc& __a) 38043e519524SHoward Hinnant{ 38053e519524SHoward Hinnant return shared_ptr<_Tp>::allocate_shared(__a); 38063e519524SHoward Hinnant} 38073e519524SHoward Hinnant 38083e519524SHoward Hinnanttemplate<class _Tp, class _Alloc, class _A0> 38093e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 38103e519524SHoward Hinnantshared_ptr<_Tp> 38113e519524SHoward Hinnantallocate_shared(const _Alloc& __a, _A0& __a0) 38123e519524SHoward Hinnant{ 38133e519524SHoward Hinnant return shared_ptr<_Tp>::allocate_shared(__a, __a0); 38143e519524SHoward Hinnant} 38153e519524SHoward Hinnant 38163e519524SHoward Hinnanttemplate<class _Tp, class _Alloc, class _A0, class _A1> 38173e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 38183e519524SHoward Hinnantshared_ptr<_Tp> 38193e519524SHoward Hinnantallocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1) 38203e519524SHoward Hinnant{ 38213e519524SHoward Hinnant return shared_ptr<_Tp>::allocate_shared(__a, __a0, __a1); 38223e519524SHoward Hinnant} 38233e519524SHoward Hinnant 38243e519524SHoward Hinnanttemplate<class _Tp, class _Alloc, class _A0, class _A1, class _A2> 38253e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 38263e519524SHoward Hinnantshared_ptr<_Tp> 38273e519524SHoward Hinnantallocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1, _A2& __a2) 38283e519524SHoward Hinnant{ 38293e519524SHoward Hinnant return shared_ptr<_Tp>::allocate_shared(__a, __a0, __a1, __a2); 38303e519524SHoward Hinnant} 38313e519524SHoward Hinnant 38323e519524SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 38333e519524SHoward Hinnant 38343e519524SHoward Hinnanttemplate<class _Tp, class _Up> 38353e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 38363e519524SHoward Hinnantbool 38373739fe79SHoward Hinnantoperator==(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 38383e519524SHoward Hinnant{ 38393e519524SHoward Hinnant return __x.get() == __y.get(); 38403e519524SHoward Hinnant} 38413e519524SHoward Hinnant 38423e519524SHoward Hinnanttemplate<class _Tp, class _Up> 38433e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 38443e519524SHoward Hinnantbool 38453739fe79SHoward Hinnantoperator!=(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 38463e519524SHoward Hinnant{ 38473e519524SHoward Hinnant return !(__x == __y); 38483e519524SHoward Hinnant} 38493e519524SHoward Hinnant 38503e519524SHoward Hinnanttemplate<class _Tp, class _Up> 38513e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 38523e519524SHoward Hinnantbool 38533739fe79SHoward Hinnantoperator<(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 38543e519524SHoward Hinnant{ 38553e519524SHoward Hinnant return __x.get() < __y.get(); 38563e519524SHoward Hinnant} 38573e519524SHoward Hinnant 38583e519524SHoward Hinnanttemplate<class _Tp> 38593e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 38603e519524SHoward Hinnantvoid 38613739fe79SHoward Hinnantswap(shared_ptr<_Tp>& __x, shared_ptr<_Tp>& __y) _NOEXCEPT 38623e519524SHoward Hinnant{ 38633e519524SHoward Hinnant __x.swap(__y); 38643e519524SHoward Hinnant} 38653e519524SHoward Hinnant 38663e519524SHoward Hinnanttemplate<class _Tp, class _Up> 38673e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 38683e519524SHoward Hinnantshared_ptr<_Tp> 38693739fe79SHoward Hinnantstatic_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT 38703e519524SHoward Hinnant{ 38713e519524SHoward Hinnant return shared_ptr<_Tp>(__r, static_cast<_Tp*>(__r.get())); 38723e519524SHoward Hinnant} 38733e519524SHoward Hinnant 38743e519524SHoward Hinnanttemplate<class _Tp, class _Up> 38753e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 38763e519524SHoward Hinnantshared_ptr<_Tp> 38773739fe79SHoward Hinnantdynamic_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT 38783e519524SHoward Hinnant{ 38793e519524SHoward Hinnant _Tp* __p = dynamic_cast<_Tp*>(__r.get()); 38803e519524SHoward Hinnant return __p ? shared_ptr<_Tp>(__r, __p) : shared_ptr<_Tp>(); 38813e519524SHoward Hinnant} 38823e519524SHoward Hinnant 38833e519524SHoward Hinnanttemplate<class _Tp, class _Up> 38843e519524SHoward Hinnantshared_ptr<_Tp> 38853739fe79SHoward Hinnantconst_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT 38863e519524SHoward Hinnant{ 38873e519524SHoward Hinnant return shared_ptr<_Tp>(__r, const_cast<_Tp*>(__r.get())); 38883e519524SHoward Hinnant} 38893e519524SHoward Hinnant 389054b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI 389154b409fdSHoward Hinnant 38923e519524SHoward Hinnanttemplate<class _Dp, class _Tp> 38933e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 38943e519524SHoward Hinnant_Dp* 38953739fe79SHoward Hinnantget_deleter(const shared_ptr<_Tp>& __p) _NOEXCEPT 38963e519524SHoward Hinnant{ 38973e519524SHoward Hinnant return __p.template __get_deleter<_Dp>(); 38983e519524SHoward Hinnant} 38993e519524SHoward Hinnant 3900b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_RTTI 390154b409fdSHoward Hinnant 39023e519524SHoward Hinnanttemplate<class _Tp> 3903848a5374SHoward Hinnantclass _LIBCPP_VISIBLE weak_ptr 39043e519524SHoward Hinnant{ 39053e519524SHoward Hinnantpublic: 39063e519524SHoward Hinnant typedef _Tp element_type; 39073e519524SHoward Hinnantprivate: 39083e519524SHoward Hinnant element_type* __ptr_; 39093e519524SHoward Hinnant __shared_weak_count* __cntrl_; 39103e519524SHoward Hinnant 39113e519524SHoward Hinnantpublic: 39123739fe79SHoward Hinnant weak_ptr() _NOEXCEPT; 39133e519524SHoward Hinnant template<class _Yp> weak_ptr(shared_ptr<_Yp> const& __r, 39143739fe79SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0) 39153739fe79SHoward Hinnant _NOEXCEPT; 39163739fe79SHoward Hinnant weak_ptr(weak_ptr const& __r) _NOEXCEPT; 39173e519524SHoward Hinnant template<class _Yp> weak_ptr(weak_ptr<_Yp> const& __r, 39183739fe79SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0) 39193739fe79SHoward Hinnant _NOEXCEPT; 39203e519524SHoward Hinnant 39213e519524SHoward Hinnant ~weak_ptr(); 39223e519524SHoward Hinnant 39233739fe79SHoward Hinnant weak_ptr& operator=(weak_ptr const& __r) _NOEXCEPT; 39243739fe79SHoward Hinnant template<class _Yp> weak_ptr& operator=(weak_ptr<_Yp> const& __r) _NOEXCEPT; 39253739fe79SHoward Hinnant template<class _Yp> weak_ptr& operator=(shared_ptr<_Yp> const& __r) _NOEXCEPT; 39263e519524SHoward Hinnant 39273739fe79SHoward Hinnant void swap(weak_ptr& __r) _NOEXCEPT; 39283739fe79SHoward Hinnant void reset() _NOEXCEPT; 39293e519524SHoward Hinnant 3930848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 39313739fe79SHoward Hinnant long use_count() const _NOEXCEPT 39323739fe79SHoward Hinnant {return __cntrl_ ? __cntrl_->use_count() : 0;} 3933848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 39343739fe79SHoward Hinnant bool expired() const _NOEXCEPT 39353739fe79SHoward Hinnant {return __cntrl_ == 0 || __cntrl_->use_count() == 0;} 39363739fe79SHoward Hinnant shared_ptr<_Tp> lock() const _NOEXCEPT; 3937848a5374SHoward Hinnant template<class _Up> 3938848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 3939848a5374SHoward Hinnant bool owner_before(const shared_ptr<_Up>& __r) const 39403e519524SHoward Hinnant {return __cntrl_ < __r.__cntrl_;} 3941848a5374SHoward Hinnant template<class _Up> 3942848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 3943848a5374SHoward Hinnant bool owner_before(const weak_ptr<_Up>& __r) const 39443e519524SHoward Hinnant {return __cntrl_ < __r.__cntrl_;} 39453e519524SHoward Hinnant 3946848a5374SHoward Hinnant template <class _Up> friend class _LIBCPP_VISIBLE weak_ptr; 3947848a5374SHoward Hinnant template <class _Up> friend class _LIBCPP_VISIBLE shared_ptr; 39483e519524SHoward Hinnant}; 39493e519524SHoward Hinnant 39503e519524SHoward Hinnanttemplate<class _Tp> 39513e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 39523739fe79SHoward Hinnantweak_ptr<_Tp>::weak_ptr() _NOEXCEPT 39533e519524SHoward Hinnant : __ptr_(0), 39543e519524SHoward Hinnant __cntrl_(0) 39553e519524SHoward Hinnant{ 39563e519524SHoward Hinnant} 39573e519524SHoward Hinnant 39583e519524SHoward Hinnanttemplate<class _Tp> 39593e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 39603739fe79SHoward Hinnantweak_ptr<_Tp>::weak_ptr(weak_ptr const& __r) _NOEXCEPT 39613e519524SHoward Hinnant : __ptr_(__r.__ptr_), 39623e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 39633e519524SHoward Hinnant{ 39643e519524SHoward Hinnant if (__cntrl_) 39653e519524SHoward Hinnant __cntrl_->__add_weak(); 39663e519524SHoward Hinnant} 39673e519524SHoward Hinnant 39683e519524SHoward Hinnanttemplate<class _Tp> 39693e519524SHoward Hinnanttemplate<class _Yp> 39703e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 39713e519524SHoward Hinnantweak_ptr<_Tp>::weak_ptr(shared_ptr<_Yp> const& __r, 39725eb6bdfaSHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type) 39733739fe79SHoward Hinnant _NOEXCEPT 39743e519524SHoward Hinnant : __ptr_(__r.__ptr_), 39753e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 39763e519524SHoward Hinnant{ 39773e519524SHoward Hinnant if (__cntrl_) 39783e519524SHoward Hinnant __cntrl_->__add_weak(); 39793e519524SHoward Hinnant} 39803e519524SHoward Hinnant 39813e519524SHoward Hinnanttemplate<class _Tp> 39823e519524SHoward Hinnanttemplate<class _Yp> 39833e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 39843e519524SHoward Hinnantweak_ptr<_Tp>::weak_ptr(weak_ptr<_Yp> const& __r, 39855eb6bdfaSHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type) 39863739fe79SHoward Hinnant _NOEXCEPT 39873e519524SHoward Hinnant : __ptr_(__r.__ptr_), 39883e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 39893e519524SHoward Hinnant{ 39903e519524SHoward Hinnant if (__cntrl_) 39913e519524SHoward Hinnant __cntrl_->__add_weak(); 39923e519524SHoward Hinnant} 39933e519524SHoward Hinnant 39943e519524SHoward Hinnanttemplate<class _Tp> 39953e519524SHoward Hinnantweak_ptr<_Tp>::~weak_ptr() 39963e519524SHoward Hinnant{ 39973e519524SHoward Hinnant if (__cntrl_) 39983e519524SHoward Hinnant __cntrl_->__release_weak(); 39993e519524SHoward Hinnant} 40003e519524SHoward Hinnant 40013e519524SHoward Hinnanttemplate<class _Tp> 40023e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 40033e519524SHoward Hinnantweak_ptr<_Tp>& 40043739fe79SHoward Hinnantweak_ptr<_Tp>::operator=(weak_ptr const& __r) _NOEXCEPT 40053e519524SHoward Hinnant{ 40063e519524SHoward Hinnant weak_ptr(__r).swap(*this); 40073e519524SHoward Hinnant return *this; 40083e519524SHoward Hinnant} 40093e519524SHoward Hinnant 40103e519524SHoward Hinnanttemplate<class _Tp> 40113e519524SHoward Hinnanttemplate<class _Yp> 40123e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 40133e519524SHoward Hinnantweak_ptr<_Tp>& 40143739fe79SHoward Hinnantweak_ptr<_Tp>::operator=(weak_ptr<_Yp> const& __r) _NOEXCEPT 40153e519524SHoward Hinnant{ 40163e519524SHoward Hinnant weak_ptr(__r).swap(*this); 40173e519524SHoward Hinnant return *this; 40183e519524SHoward Hinnant} 40193e519524SHoward Hinnant 40203e519524SHoward Hinnanttemplate<class _Tp> 40213e519524SHoward Hinnanttemplate<class _Yp> 40223e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 40233e519524SHoward Hinnantweak_ptr<_Tp>& 40243739fe79SHoward Hinnantweak_ptr<_Tp>::operator=(shared_ptr<_Yp> const& __r) _NOEXCEPT 40253e519524SHoward Hinnant{ 40263e519524SHoward Hinnant weak_ptr(__r).swap(*this); 40273e519524SHoward Hinnant return *this; 40283e519524SHoward Hinnant} 40293e519524SHoward Hinnant 40303e519524SHoward Hinnanttemplate<class _Tp> 40313e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 40323e519524SHoward Hinnantvoid 40333739fe79SHoward Hinnantweak_ptr<_Tp>::swap(weak_ptr& __r) _NOEXCEPT 40343e519524SHoward Hinnant{ 4035ce48a113SHoward Hinnant _VSTD::swap(__ptr_, __r.__ptr_); 4036ce48a113SHoward Hinnant _VSTD::swap(__cntrl_, __r.__cntrl_); 40373e519524SHoward Hinnant} 40383e519524SHoward Hinnant 40393e519524SHoward Hinnanttemplate<class _Tp> 40403e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 40413e519524SHoward Hinnantvoid 40423739fe79SHoward Hinnantswap(weak_ptr<_Tp>& __x, weak_ptr<_Tp>& __y) _NOEXCEPT 40433e519524SHoward Hinnant{ 40443e519524SHoward Hinnant __x.swap(__y); 40453e519524SHoward Hinnant} 40463e519524SHoward Hinnant 40473e519524SHoward Hinnanttemplate<class _Tp> 40483e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 40493e519524SHoward Hinnantvoid 40503739fe79SHoward Hinnantweak_ptr<_Tp>::reset() _NOEXCEPT 40513e519524SHoward Hinnant{ 40523e519524SHoward Hinnant weak_ptr().swap(*this); 40533e519524SHoward Hinnant} 40543e519524SHoward Hinnant 40553e519524SHoward Hinnanttemplate<class _Tp> 40563e519524SHoward Hinnanttemplate<class _Yp> 40573e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(const weak_ptr<_Yp>& __r, 40583e519524SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type) 40593e519524SHoward Hinnant : __ptr_(__r.__ptr_), 40603e519524SHoward Hinnant __cntrl_(__r.__cntrl_ ? __r.__cntrl_->lock() : __r.__cntrl_) 40613e519524SHoward Hinnant{ 40623e519524SHoward Hinnant if (__cntrl_ == 0) 40633e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 40643e519524SHoward Hinnant throw bad_weak_ptr(); 40653e519524SHoward Hinnant#else 40663e519524SHoward Hinnant assert(!"bad_weak_ptr"); 40673e519524SHoward Hinnant#endif 40683e519524SHoward Hinnant} 40693e519524SHoward Hinnant 40703e519524SHoward Hinnanttemplate<class _Tp> 40713e519524SHoward Hinnantshared_ptr<_Tp> 40723739fe79SHoward Hinnantweak_ptr<_Tp>::lock() const _NOEXCEPT 40733e519524SHoward Hinnant{ 40743e519524SHoward Hinnant shared_ptr<_Tp> __r; 40753e519524SHoward Hinnant __r.__cntrl_ = __cntrl_ ? __cntrl_->lock() : __cntrl_; 40763e519524SHoward Hinnant if (__r.__cntrl_) 40773e519524SHoward Hinnant __r.__ptr_ = __ptr_; 40783e519524SHoward Hinnant return __r; 40793e519524SHoward Hinnant} 40803e519524SHoward Hinnant 40813e519524SHoward Hinnanttemplate <class _Tp> struct owner_less; 40823e519524SHoward Hinnant 40833e519524SHoward Hinnanttemplate <class _Tp> 4084848a5374SHoward Hinnantstruct _LIBCPP_VISIBLE owner_less<shared_ptr<_Tp> > 40853e519524SHoward Hinnant : binary_function<shared_ptr<_Tp>, shared_ptr<_Tp>, bool> 40863e519524SHoward Hinnant{ 40873e519524SHoward Hinnant typedef bool result_type; 4088848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 40893e519524SHoward Hinnant bool operator()(shared_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const 40903e519524SHoward Hinnant {return __x.owner_before(__y);} 4091848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 40923e519524SHoward Hinnant bool operator()(shared_ptr<_Tp> const& __x, weak_ptr<_Tp> const& __y) const 40933e519524SHoward Hinnant {return __x.owner_before(__y);} 4094848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 40953e519524SHoward Hinnant bool operator()( weak_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const 40963e519524SHoward Hinnant {return __x.owner_before(__y);} 40973e519524SHoward Hinnant}; 40983e519524SHoward Hinnant 40993e519524SHoward Hinnanttemplate <class _Tp> 4100848a5374SHoward Hinnantstruct _LIBCPP_VISIBLE owner_less<weak_ptr<_Tp> > 41013e519524SHoward Hinnant : binary_function<weak_ptr<_Tp>, weak_ptr<_Tp>, bool> 41023e519524SHoward Hinnant{ 41033e519524SHoward Hinnant typedef bool result_type; 4104848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 41053e519524SHoward Hinnant bool operator()( weak_ptr<_Tp> const& __x, weak_ptr<_Tp> const& __y) const 41063e519524SHoward Hinnant {return __x.owner_before(__y);} 4107848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 41083e519524SHoward Hinnant bool operator()(shared_ptr<_Tp> const& __x, weak_ptr<_Tp> const& __y) const 41093e519524SHoward Hinnant {return __x.owner_before(__y);} 4110848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 41113e519524SHoward Hinnant bool operator()( weak_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const 41123e519524SHoward Hinnant {return __x.owner_before(__y);} 41133e519524SHoward Hinnant}; 41143e519524SHoward Hinnant 41153e519524SHoward Hinnanttemplate<class _Tp> 4116848a5374SHoward Hinnantclass _LIBCPP_VISIBLE enable_shared_from_this 41173e519524SHoward Hinnant{ 41183e519524SHoward Hinnant mutable weak_ptr<_Tp> __weak_this_; 41193e519524SHoward Hinnantprotected: 4120848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 41213739fe79SHoward Hinnant enable_shared_from_this() _NOEXCEPT {} 4122848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 41233739fe79SHoward Hinnant enable_shared_from_this(enable_shared_from_this const&) _NOEXCEPT {} 4124848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 41253739fe79SHoward Hinnant enable_shared_from_this& operator=(enable_shared_from_this const&) _NOEXCEPT 41263739fe79SHoward Hinnant {return *this;} 4127848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 41283e519524SHoward Hinnant ~enable_shared_from_this() {} 41293e519524SHoward Hinnantpublic: 4130848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 41313739fe79SHoward Hinnant shared_ptr<_Tp> shared_from_this() 41323739fe79SHoward Hinnant {return shared_ptr<_Tp>(__weak_this_);} 4133848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 41343739fe79SHoward Hinnant shared_ptr<_Tp const> shared_from_this() const 41353739fe79SHoward Hinnant {return shared_ptr<const _Tp>(__weak_this_);} 41363e519524SHoward Hinnant 41373e519524SHoward Hinnant template <class _Up> friend class shared_ptr; 41383e519524SHoward Hinnant}; 41393e519524SHoward Hinnant 4140d1803b6cSHoward Hinnanttemplate <class _Tp> 4141848a5374SHoward Hinnantstruct _LIBCPP_VISIBLE hash<shared_ptr<_Tp> > 4142d1803b6cSHoward Hinnant{ 4143d1803b6cSHoward Hinnant typedef shared_ptr<_Tp> argument_type; 4144d1803b6cSHoward Hinnant typedef size_t result_type; 4145848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 41463739fe79SHoward Hinnant result_type operator()(const argument_type& __ptr) const _NOEXCEPT 4147d1803b6cSHoward Hinnant { 4148d1803b6cSHoward Hinnant return hash<_Tp*>()(__ptr.get()); 4149d1803b6cSHoward Hinnant } 4150d1803b6cSHoward Hinnant}; 4151d1803b6cSHoward Hinnant 4152e3163f5aSHoward Hinnanttemplate<class _CharT, class _Traits, class _Y> 4153e3163f5aSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 4154e3163f5aSHoward Hinnantbasic_ostream<_CharT, _Traits>& 4155e3163f5aSHoward Hinnantoperator<<(basic_ostream<_CharT, _Traits>& __os, shared_ptr<_Y> const& __p); 4156e3163f5aSHoward Hinnant 41573e519524SHoward Hinnant//enum class 4158848a5374SHoward Hinnantstruct _LIBCPP_VISIBLE pointer_safety 41593e519524SHoward Hinnant{ 41603e519524SHoward Hinnant enum _ 41613e519524SHoward Hinnant { 41623e519524SHoward Hinnant relaxed, 41633e519524SHoward Hinnant preferred, 41643e519524SHoward Hinnant strict 41653e519524SHoward Hinnant }; 41663e519524SHoward Hinnant 41673e519524SHoward Hinnant _ __v_; 41683e519524SHoward Hinnant 4169848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 41703e519524SHoward Hinnant pointer_safety(_ __v) : __v_(__v) {} 4171848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 41723e519524SHoward Hinnant operator int() const {return __v_;} 41733e519524SHoward Hinnant}; 41743e519524SHoward Hinnant 41753e519524SHoward Hinnantvoid declare_reachable(void* __p); 41763e519524SHoward Hinnantvoid declare_no_pointers(char* __p, size_t __n); 41773e519524SHoward Hinnantvoid undeclare_no_pointers(char* __p, size_t __n); 41783739fe79SHoward Hinnantpointer_safety get_pointer_safety() _NOEXCEPT; 4179ce53420eSHoward Hinnantvoid* __undeclare_reachable(void* __p); 41803e519524SHoward Hinnant 41813e519524SHoward Hinnanttemplate <class _Tp> 41823e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 41833e519524SHoward Hinnant_Tp* 41843e519524SHoward Hinnantundeclare_reachable(_Tp* __p) 41853e519524SHoward Hinnant{ 41863e519524SHoward Hinnant return static_cast<_Tp*>(__undeclare_reachable(__p)); 41873e519524SHoward Hinnant} 41883e519524SHoward Hinnant 4189ce53420eSHoward Hinnantvoid* align(size_t __align, size_t __sz, void*& __ptr, size_t& __space); 41903e519524SHoward Hinnant 41913e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD 41923e519524SHoward Hinnant 41933e519524SHoward Hinnant#endif // _LIBCPP_MEMORY 4194