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> 599a87b5e34SHoward Hinnant#include <tuple> 6009741d6c9SHoward Hinnant#include <cstring> 6013e519524SHoward Hinnant#if defined(_LIBCPP_NO_EXCEPTIONS) 6023e519524SHoward Hinnant #include <cassert> 6033e519524SHoward Hinnant#endif 6043e519524SHoward Hinnant 605ab4f4382SHoward Hinnant#include <__undef_min_max> 606ab4f4382SHoward Hinnant 607073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 6083e519524SHoward Hinnant#pragma GCC system_header 609073458b1SHoward Hinnant#endif 6103e519524SHoward Hinnant 6113e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 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 67621fa1887SHoward Hinnanttemplate <> 67721fa1887SHoward Hinnantclass _LIBCPP_VISIBLE allocator<const void> 67821fa1887SHoward Hinnant{ 67921fa1887SHoward Hinnantpublic: 68021fa1887SHoward Hinnant typedef const void* pointer; 68121fa1887SHoward Hinnant typedef const void* const_pointer; 68221fa1887SHoward Hinnant typedef const void value_type; 68321fa1887SHoward Hinnant 68421fa1887SHoward Hinnant template <class _Up> struct rebind {typedef allocator<_Up> other;}; 68521fa1887SHoward Hinnant}; 68621fa1887SHoward Hinnant 6873e519524SHoward Hinnant// pointer_traits 6883e519524SHoward Hinnant 6893e519524SHoward Hinnanttemplate <class _Tp> 6903e519524SHoward Hinnantstruct __has_element_type 6913e519524SHoward Hinnant{ 6923e519524SHoward Hinnantprivate: 6933e519524SHoward Hinnant struct __two {char _; char __;}; 6943e519524SHoward Hinnant template <class _Up> static __two __test(...); 6953e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::element_type* = 0); 6963e519524SHoward Hinnantpublic: 6973e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 6983e519524SHoward Hinnant}; 6993e519524SHoward Hinnant 7003e519524SHoward Hinnanttemplate <class _Ptr, bool = __has_element_type<_Ptr>::value> 7013e519524SHoward Hinnantstruct __pointer_traits_element_type; 7023e519524SHoward Hinnant 7033e519524SHoward Hinnanttemplate <class _Ptr> 7043e519524SHoward Hinnantstruct __pointer_traits_element_type<_Ptr, true> 7053e519524SHoward Hinnant{ 7063e519524SHoward Hinnant typedef typename _Ptr::element_type type; 7073e519524SHoward Hinnant}; 7083e519524SHoward Hinnant 7093e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 7103e519524SHoward Hinnant 7113e519524SHoward Hinnanttemplate <template <class, class...> class _Sp, class _Tp, class ..._Args> 7123e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _Args...>, true> 7133e519524SHoward Hinnant{ 7143e519524SHoward Hinnant typedef typename _Sp<_Tp, _Args...>::element_type type; 7153e519524SHoward Hinnant}; 7163e519524SHoward Hinnant 7173e519524SHoward Hinnanttemplate <template <class, class...> class _Sp, class _Tp, class ..._Args> 7183e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _Args...>, false> 7193e519524SHoward Hinnant{ 7203e519524SHoward Hinnant typedef _Tp type; 7213e519524SHoward Hinnant}; 7223e519524SHoward Hinnant 723b3371f6fSHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 7243e519524SHoward Hinnant 7253e519524SHoward Hinnanttemplate <template <class> class _Sp, class _Tp> 7263e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp>, true> 7273e519524SHoward Hinnant{ 7283e519524SHoward Hinnant typedef typename _Sp<_Tp>::element_type type; 7293e519524SHoward Hinnant}; 7303e519524SHoward Hinnant 7313e519524SHoward Hinnanttemplate <template <class> class _Sp, class _Tp> 7323e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp>, false> 7333e519524SHoward Hinnant{ 7343e519524SHoward Hinnant typedef _Tp type; 7353e519524SHoward Hinnant}; 7363e519524SHoward Hinnant 7373e519524SHoward Hinnanttemplate <template <class, class> class _Sp, class _Tp, class _A0> 7383e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0>, true> 7393e519524SHoward Hinnant{ 7403e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0>::element_type type; 7413e519524SHoward Hinnant}; 7423e519524SHoward Hinnant 7433e519524SHoward Hinnanttemplate <template <class, class> class _Sp, class _Tp, class _A0> 7443e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0>, false> 7453e519524SHoward Hinnant{ 7463e519524SHoward Hinnant typedef _Tp type; 7473e519524SHoward Hinnant}; 7483e519524SHoward Hinnant 7493e519524SHoward Hinnanttemplate <template <class, class, class> class _Sp, class _Tp, class _A0, class _A1> 7503e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1>, true> 7513e519524SHoward Hinnant{ 7523e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1>::element_type type; 7533e519524SHoward Hinnant}; 7543e519524SHoward Hinnant 7553e519524SHoward Hinnanttemplate <template <class, class, class> class _Sp, class _Tp, class _A0, class _A1> 7563e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1>, false> 7573e519524SHoward Hinnant{ 7583e519524SHoward Hinnant typedef _Tp type; 7593e519524SHoward Hinnant}; 7603e519524SHoward Hinnant 7613e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Sp, class _Tp, class _A0, 7623e519524SHoward Hinnant class _A1, class _A2> 7633e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1, _A2>, true> 7643e519524SHoward Hinnant{ 7653e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1, _A2>::element_type type; 7663e519524SHoward Hinnant}; 7673e519524SHoward Hinnant 7683e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Sp, class _Tp, class _A0, 7693e519524SHoward Hinnant class _A1, class _A2> 7703e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1, _A2>, false> 7713e519524SHoward Hinnant{ 7723e519524SHoward Hinnant typedef _Tp type; 7733e519524SHoward Hinnant}; 7743e519524SHoward Hinnant 775b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 7763e519524SHoward Hinnant 7773e519524SHoward Hinnanttemplate <class _Tp> 7783e519524SHoward Hinnantstruct __has_difference_type 7793e519524SHoward Hinnant{ 7803e519524SHoward Hinnantprivate: 7813e519524SHoward Hinnant struct __two {char _; char __;}; 7823e519524SHoward Hinnant template <class _Up> static __two __test(...); 7833e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::difference_type* = 0); 7843e519524SHoward Hinnantpublic: 7853e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 7863e519524SHoward Hinnant}; 7873e519524SHoward Hinnant 7883e519524SHoward Hinnanttemplate <class _Ptr, bool = __has_difference_type<_Ptr>::value> 7893e519524SHoward Hinnantstruct __pointer_traits_difference_type 7903e519524SHoward Hinnant{ 7913e519524SHoward Hinnant typedef ptrdiff_t type; 7923e519524SHoward Hinnant}; 7933e519524SHoward Hinnant 7943e519524SHoward Hinnanttemplate <class _Ptr> 7953e519524SHoward Hinnantstruct __pointer_traits_difference_type<_Ptr, true> 7963e519524SHoward Hinnant{ 7973e519524SHoward Hinnant typedef typename _Ptr::difference_type type; 7983e519524SHoward Hinnant}; 7993e519524SHoward Hinnant 8003e519524SHoward Hinnanttemplate <class _Tp, class _Up> 8013e519524SHoward Hinnantstruct __has_rebind 8023e519524SHoward Hinnant{ 8033e519524SHoward Hinnantprivate: 8043e519524SHoward Hinnant struct __two {char _; char __;}; 8053e519524SHoward Hinnant template <class _Xp> static __two __test(...); 8063e519524SHoward Hinnant template <class _Xp> static char __test(typename _Xp::template rebind<_Up>* = 0); 8073e519524SHoward Hinnantpublic: 8083e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 8093e519524SHoward Hinnant}; 8103e519524SHoward Hinnant 8113e519524SHoward Hinnanttemplate <class _Tp, class _Up, bool = __has_rebind<_Tp, _Up>::value> 8123e519524SHoward Hinnantstruct __pointer_traits_rebind 8133e519524SHoward Hinnant{ 8143e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 8153e519524SHoward Hinnant typedef typename _Tp::template rebind<_Up> type; 8163e519524SHoward Hinnant#else 8173e519524SHoward Hinnant typedef typename _Tp::template rebind<_Up>::other type; 8183e519524SHoward Hinnant#endif 8193e519524SHoward Hinnant}; 8203e519524SHoward Hinnant 8213e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 8223e519524SHoward Hinnant 8233e519524SHoward Hinnanttemplate <template <class, class...> class _Sp, class _Tp, class ..._Args, class _Up> 8243e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _Args...>, _Up, true> 8253e519524SHoward Hinnant{ 8263e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 8273e519524SHoward Hinnant typedef typename _Sp<_Tp, _Args...>::template rebind<_Up> type; 8283e519524SHoward Hinnant#else 8293e519524SHoward Hinnant typedef typename _Sp<_Tp, _Args...>::template rebind<_Up>::other type; 8303e519524SHoward Hinnant#endif 8313e519524SHoward Hinnant}; 8323e519524SHoward Hinnant 8333e519524SHoward Hinnanttemplate <template <class, class...> class _Sp, class _Tp, class ..._Args, class _Up> 8343e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _Args...>, _Up, false> 8353e519524SHoward Hinnant{ 8363e519524SHoward Hinnant typedef _Sp<_Up, _Args...> type; 8373e519524SHoward Hinnant}; 8383e519524SHoward Hinnant 839b3371f6fSHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 8403e519524SHoward Hinnant 8413e519524SHoward Hinnanttemplate <template <class> class _Sp, class _Tp, class _Up> 8423e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp>, _Up, true> 8433e519524SHoward Hinnant{ 8443e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 8453e519524SHoward Hinnant typedef typename _Sp<_Tp>::template rebind<_Up> type; 8463e519524SHoward Hinnant#else 8473e519524SHoward Hinnant typedef typename _Sp<_Tp>::template rebind<_Up>::other type; 8483e519524SHoward Hinnant#endif 8493e519524SHoward Hinnant}; 8503e519524SHoward Hinnant 8513e519524SHoward Hinnanttemplate <template <class> class _Sp, class _Tp, class _Up> 8523e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp>, _Up, false> 8533e519524SHoward Hinnant{ 8543e519524SHoward Hinnant typedef _Sp<_Up> type; 8553e519524SHoward Hinnant}; 8563e519524SHoward Hinnant 8573e519524SHoward Hinnanttemplate <template <class, class> class _Sp, class _Tp, class _A0, class _Up> 8583e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0>, _Up, true> 8593e519524SHoward Hinnant{ 8603e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 8613e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0>::template rebind<_Up> type; 8623e519524SHoward Hinnant#else 8633e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0>::template rebind<_Up>::other type; 8643e519524SHoward Hinnant#endif 8653e519524SHoward Hinnant}; 8663e519524SHoward Hinnant 8673e519524SHoward Hinnanttemplate <template <class, class> class _Sp, class _Tp, class _A0, class _Up> 8683e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0>, _Up, false> 8693e519524SHoward Hinnant{ 8703e519524SHoward Hinnant typedef _Sp<_Up, _A0> type; 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, true> 8763e519524SHoward Hinnant{ 8773e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 8783e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1>::template rebind<_Up> type; 8793e519524SHoward Hinnant#else 8803e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1>::template rebind<_Up>::other type; 8813e519524SHoward Hinnant#endif 8823e519524SHoward Hinnant}; 8833e519524SHoward Hinnant 8843e519524SHoward Hinnanttemplate <template <class, class, class> class _Sp, class _Tp, class _A0, 8853e519524SHoward Hinnant class _A1, class _Up> 8863e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1>, _Up, false> 8873e519524SHoward Hinnant{ 8883e519524SHoward Hinnant typedef _Sp<_Up, _A0, _A1> type; 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, true> 8943e519524SHoward Hinnant{ 8953e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 8963e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1, _A2>::template rebind<_Up> type; 8973e519524SHoward Hinnant#else 8983e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1, _A2>::template rebind<_Up>::other type; 8993e519524SHoward Hinnant#endif 9003e519524SHoward Hinnant}; 9013e519524SHoward Hinnant 9023e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Sp, class _Tp, class _A0, 9033e519524SHoward Hinnant class _A1, class _A2, class _Up> 9043e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1, _A2>, _Up, false> 9053e519524SHoward Hinnant{ 9063e519524SHoward Hinnant typedef _Sp<_Up, _A0, _A1, _A2> type; 9073e519524SHoward Hinnant}; 9083e519524SHoward Hinnant 909b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 9103e519524SHoward Hinnant 9113e519524SHoward Hinnanttemplate <class _Ptr> 912848a5374SHoward Hinnantstruct _LIBCPP_VISIBLE pointer_traits 9133e519524SHoward Hinnant{ 9143e519524SHoward Hinnant typedef _Ptr pointer; 9153e519524SHoward Hinnant typedef typename __pointer_traits_element_type<pointer>::type element_type; 9163e519524SHoward Hinnant typedef typename __pointer_traits_difference_type<pointer>::type difference_type; 9173e519524SHoward Hinnant 9183e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 919f7384975SHoward Hinnant template <class _Up> using rebind = typename __pointer_traits_rebind<pointer, _Up>::type; 9203e519524SHoward Hinnant#else 9213e519524SHoward Hinnant template <class _Up> struct rebind 9223e519524SHoward Hinnant {typedef typename __pointer_traits_rebind<pointer, _Up>::type other;}; 923b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_TEMPLATE_ALIASES 9243e519524SHoward Hinnant 9253e519524SHoward Hinnantprivate: 9263e519524SHoward Hinnant struct __nat {}; 9273e519524SHoward Hinnantpublic: 928848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9293e519524SHoward Hinnant static pointer pointer_to(typename conditional<is_void<element_type>::value, 9303e519524SHoward Hinnant __nat, element_type>::type& __r) 9313e519524SHoward Hinnant {return pointer::pointer_to(__r);} 9323e519524SHoward Hinnant}; 9333e519524SHoward Hinnant 9343e519524SHoward Hinnanttemplate <class _Tp> 935848a5374SHoward Hinnantstruct _LIBCPP_VISIBLE pointer_traits<_Tp*> 9363e519524SHoward Hinnant{ 9373e519524SHoward Hinnant typedef _Tp* pointer; 9383e519524SHoward Hinnant typedef _Tp element_type; 9393e519524SHoward Hinnant typedef ptrdiff_t difference_type; 9403e519524SHoward Hinnant 9413e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 9423e519524SHoward Hinnant template <class _Up> using rebind = _Up*; 9433e519524SHoward Hinnant#else 9443e519524SHoward Hinnant template <class _Up> struct rebind {typedef _Up* other;}; 9453e519524SHoward Hinnant#endif 9463e519524SHoward Hinnant 9473e519524SHoward Hinnantprivate: 9483e519524SHoward Hinnant struct __nat {}; 9493e519524SHoward Hinnantpublic: 950848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9513e519524SHoward Hinnant static pointer pointer_to(typename conditional<is_void<element_type>::value, 9523739fe79SHoward Hinnant __nat, element_type>::type& __r) _NOEXCEPT 953ce48a113SHoward Hinnant {return _VSTD::addressof(__r);} 9543e519524SHoward Hinnant}; 9553e519524SHoward Hinnant 9563e519524SHoward Hinnant// allocator_traits 9573e519524SHoward Hinnant 9583e519524SHoward Hinnantnamespace __has_pointer_type_imp 9593e519524SHoward Hinnant{ 9603e519524SHoward Hinnant template <class _Up> static __two test(...); 9613e519524SHoward Hinnant template <class _Up> static char test(typename _Up::pointer* = 0); 9623e519524SHoward Hinnant} 9633e519524SHoward Hinnant 9643e519524SHoward Hinnanttemplate <class _Tp> 9653e519524SHoward Hinnantstruct __has_pointer_type 9663e519524SHoward Hinnant : public integral_constant<bool, sizeof(__has_pointer_type_imp::test<_Tp>(0)) == 1> 9673e519524SHoward Hinnant{ 9683e519524SHoward Hinnant}; 9693e519524SHoward Hinnant 9703e519524SHoward Hinnantnamespace __pointer_type_imp 9713e519524SHoward Hinnant{ 9723e519524SHoward Hinnant 9733e519524SHoward Hinnanttemplate <class _Tp, class _Dp, bool = __has_pointer_type<_Dp>::value> 9743e519524SHoward Hinnantstruct __pointer_type 9753e519524SHoward Hinnant{ 9763e519524SHoward Hinnant typedef typename _Dp::pointer type; 9773e519524SHoward Hinnant}; 9783e519524SHoward Hinnant 9793e519524SHoward Hinnanttemplate <class _Tp, class _Dp> 9803e519524SHoward Hinnantstruct __pointer_type<_Tp, _Dp, false> 9813e519524SHoward Hinnant{ 9823e519524SHoward Hinnant typedef _Tp* type; 9833e519524SHoward Hinnant}; 9843e519524SHoward Hinnant 985a4a1ef1fSHoward Hinnant} // __pointer_type_imp 9863e519524SHoward Hinnant 9873e519524SHoward Hinnanttemplate <class _Tp, class _Dp> 9883e519524SHoward Hinnantstruct __pointer_type 9893e519524SHoward Hinnant{ 9903e519524SHoward Hinnant typedef typename __pointer_type_imp::__pointer_type<_Tp, typename remove_reference<_Dp>::type>::type type; 9913e519524SHoward Hinnant}; 9923e519524SHoward Hinnant 9933e519524SHoward Hinnanttemplate <class _Tp> 9943e519524SHoward Hinnantstruct __has_const_pointer 9953e519524SHoward Hinnant{ 9963e519524SHoward Hinnantprivate: 9973e519524SHoward Hinnant struct __two {char _; char __;}; 9983e519524SHoward Hinnant template <class _Up> static __two __test(...); 9993e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::const_pointer* = 0); 10003e519524SHoward Hinnantpublic: 10013e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 10023e519524SHoward Hinnant}; 10033e519524SHoward Hinnant 10043e519524SHoward Hinnanttemplate <class _Tp, class _Ptr, class _Alloc, bool = __has_const_pointer<_Alloc>::value> 10053e519524SHoward Hinnantstruct __const_pointer 10063e519524SHoward Hinnant{ 10073e519524SHoward Hinnant typedef typename _Alloc::const_pointer type; 10083e519524SHoward Hinnant}; 10093e519524SHoward Hinnant 10103e519524SHoward Hinnanttemplate <class _Tp, class _Ptr, class _Alloc> 10113e519524SHoward Hinnantstruct __const_pointer<_Tp, _Ptr, _Alloc, false> 10123e519524SHoward Hinnant{ 10133e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 10143e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<const _Tp> type; 10153e519524SHoward Hinnant#else 10163e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<const _Tp>::other type; 10173e519524SHoward Hinnant#endif 10183e519524SHoward Hinnant}; 10193e519524SHoward Hinnant 10203e519524SHoward Hinnanttemplate <class _Tp> 10213e519524SHoward Hinnantstruct __has_void_pointer 10223e519524SHoward Hinnant{ 10233e519524SHoward Hinnantprivate: 10243e519524SHoward Hinnant struct __two {char _; char __;}; 10253e519524SHoward Hinnant template <class _Up> static __two __test(...); 10263e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::void_pointer* = 0); 10273e519524SHoward Hinnantpublic: 10283e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 10293e519524SHoward Hinnant}; 10303e519524SHoward Hinnant 10313e519524SHoward Hinnanttemplate <class _Ptr, class _Alloc, bool = __has_void_pointer<_Alloc>::value> 10323e519524SHoward Hinnantstruct __void_pointer 10333e519524SHoward Hinnant{ 10343e519524SHoward Hinnant typedef typename _Alloc::void_pointer type; 10353e519524SHoward Hinnant}; 10363e519524SHoward Hinnant 10373e519524SHoward Hinnanttemplate <class _Ptr, class _Alloc> 10383e519524SHoward Hinnantstruct __void_pointer<_Ptr, _Alloc, false> 10393e519524SHoward Hinnant{ 10403e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 10413e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<void> type; 10423e519524SHoward Hinnant#else 10433e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<void>::other type; 10443e519524SHoward Hinnant#endif 10453e519524SHoward Hinnant}; 10463e519524SHoward Hinnant 10473e519524SHoward Hinnanttemplate <class _Tp> 10483e519524SHoward Hinnantstruct __has_const_void_pointer 10493e519524SHoward Hinnant{ 10503e519524SHoward Hinnantprivate: 10513e519524SHoward Hinnant struct __two {char _; char __;}; 10523e519524SHoward Hinnant template <class _Up> static __two __test(...); 10533e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::const_void_pointer* = 0); 10543e519524SHoward Hinnantpublic: 10553e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 10563e519524SHoward Hinnant}; 10573e519524SHoward Hinnant 10583e519524SHoward Hinnanttemplate <class _Ptr, class _Alloc, bool = __has_const_void_pointer<_Alloc>::value> 10593e519524SHoward Hinnantstruct __const_void_pointer 10603e519524SHoward Hinnant{ 10613e519524SHoward Hinnant typedef typename _Alloc::const_void_pointer type; 10623e519524SHoward Hinnant}; 10633e519524SHoward Hinnant 10643e519524SHoward Hinnanttemplate <class _Ptr, class _Alloc> 10653e519524SHoward Hinnantstruct __const_void_pointer<_Ptr, _Alloc, false> 10663e519524SHoward Hinnant{ 10673e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 10683e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<const void> type; 10693e519524SHoward Hinnant#else 10703e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<const void>::other type; 10713e519524SHoward Hinnant#endif 10723e519524SHoward Hinnant}; 10733e519524SHoward Hinnant 1074c003db1fSHoward Hinnanttemplate <class _Tp> 10753e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1076c003db1fSHoward Hinnant_Tp* 1077c003db1fSHoward Hinnant__to_raw_pointer(_Tp* __p) _NOEXCEPT 10783e519524SHoward Hinnant{ 10793e519524SHoward Hinnant return __p; 10803e519524SHoward Hinnant} 10813e519524SHoward Hinnant 10823e519524SHoward Hinnanttemplate <class _Pointer> 10833e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 10843e519524SHoward Hinnanttypename pointer_traits<_Pointer>::element_type* 10853739fe79SHoward Hinnant__to_raw_pointer(_Pointer __p) _NOEXCEPT 10863e519524SHoward Hinnant{ 1087ce48a113SHoward Hinnant return _VSTD::__to_raw_pointer(__p.operator->()); 10883e519524SHoward Hinnant} 10893e519524SHoward Hinnant 10903e519524SHoward Hinnanttemplate <class _Tp> 10913e519524SHoward Hinnantstruct __has_size_type 10923e519524SHoward Hinnant{ 10933e519524SHoward Hinnantprivate: 10943e519524SHoward Hinnant struct __two {char _; char __;}; 10953e519524SHoward Hinnant template <class _Up> static __two __test(...); 10963e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::size_type* = 0); 10973e519524SHoward Hinnantpublic: 10983e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 10993e519524SHoward Hinnant}; 11003e519524SHoward Hinnant 1101a4a1ef1fSHoward Hinnanttemplate <class _Alloc, class _DiffType, bool = __has_size_type<_Alloc>::value> 11023e519524SHoward Hinnantstruct __size_type 11033e519524SHoward Hinnant{ 1104a4a1ef1fSHoward Hinnant typedef typename make_unsigned<_DiffType>::type type; 11053e519524SHoward Hinnant}; 11063e519524SHoward Hinnant 1107a4a1ef1fSHoward Hinnanttemplate <class _Alloc, class _DiffType> 1108a4a1ef1fSHoward Hinnantstruct __size_type<_Alloc, _DiffType, true> 11093e519524SHoward Hinnant{ 11103e519524SHoward Hinnant typedef typename _Alloc::size_type type; 11113e519524SHoward Hinnant}; 11123e519524SHoward Hinnant 11133e519524SHoward Hinnanttemplate <class _Tp> 11143e519524SHoward Hinnantstruct __has_propagate_on_container_copy_assignment 11153e519524SHoward Hinnant{ 11163e519524SHoward Hinnantprivate: 11173e519524SHoward Hinnant struct __two {char _; char __;}; 11183e519524SHoward Hinnant template <class _Up> static __two __test(...); 11193e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::propagate_on_container_copy_assignment* = 0); 11203e519524SHoward Hinnantpublic: 11213e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 11223e519524SHoward Hinnant}; 11233e519524SHoward Hinnant 11243e519524SHoward Hinnanttemplate <class _Alloc, bool = __has_propagate_on_container_copy_assignment<_Alloc>::value> 11253e519524SHoward Hinnantstruct __propagate_on_container_copy_assignment 11263e519524SHoward Hinnant{ 11273e519524SHoward Hinnant typedef false_type type; 11283e519524SHoward Hinnant}; 11293e519524SHoward Hinnant 11303e519524SHoward Hinnanttemplate <class _Alloc> 11313e519524SHoward Hinnantstruct __propagate_on_container_copy_assignment<_Alloc, true> 11323e519524SHoward Hinnant{ 11333e519524SHoward Hinnant typedef typename _Alloc::propagate_on_container_copy_assignment type; 11343e519524SHoward Hinnant}; 11353e519524SHoward Hinnant 11363e519524SHoward Hinnanttemplate <class _Tp> 11373e519524SHoward Hinnantstruct __has_propagate_on_container_move_assignment 11383e519524SHoward Hinnant{ 11393e519524SHoward Hinnantprivate: 11403e519524SHoward Hinnant struct __two {char _; char __;}; 11413e519524SHoward Hinnant template <class _Up> static __two __test(...); 11423e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::propagate_on_container_move_assignment* = 0); 11433e519524SHoward Hinnantpublic: 11443e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 11453e519524SHoward Hinnant}; 11463e519524SHoward Hinnant 11473e519524SHoward Hinnanttemplate <class _Alloc, bool = __has_propagate_on_container_move_assignment<_Alloc>::value> 11483e519524SHoward Hinnantstruct __propagate_on_container_move_assignment 11493e519524SHoward Hinnant{ 11503e519524SHoward Hinnant typedef false_type type; 11513e519524SHoward Hinnant}; 11523e519524SHoward Hinnant 11533e519524SHoward Hinnanttemplate <class _Alloc> 11543e519524SHoward Hinnantstruct __propagate_on_container_move_assignment<_Alloc, true> 11553e519524SHoward Hinnant{ 11563e519524SHoward Hinnant typedef typename _Alloc::propagate_on_container_move_assignment type; 11573e519524SHoward Hinnant}; 11583e519524SHoward Hinnant 11593e519524SHoward Hinnanttemplate <class _Tp> 11603e519524SHoward Hinnantstruct __has_propagate_on_container_swap 11613e519524SHoward Hinnant{ 11623e519524SHoward Hinnantprivate: 11633e519524SHoward Hinnant struct __two {char _; char __;}; 11643e519524SHoward Hinnant template <class _Up> static __two __test(...); 11653e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::propagate_on_container_swap* = 0); 11663e519524SHoward Hinnantpublic: 11673e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 11683e519524SHoward Hinnant}; 11693e519524SHoward Hinnant 11703e519524SHoward Hinnanttemplate <class _Alloc, bool = __has_propagate_on_container_swap<_Alloc>::value> 11713e519524SHoward Hinnantstruct __propagate_on_container_swap 11723e519524SHoward Hinnant{ 11733e519524SHoward Hinnant typedef false_type type; 11743e519524SHoward Hinnant}; 11753e519524SHoward Hinnant 11763e519524SHoward Hinnanttemplate <class _Alloc> 11773e519524SHoward Hinnantstruct __propagate_on_container_swap<_Alloc, true> 11783e519524SHoward Hinnant{ 11793e519524SHoward Hinnant typedef typename _Alloc::propagate_on_container_swap type; 11803e519524SHoward Hinnant}; 11813e519524SHoward Hinnant 11823e519524SHoward Hinnanttemplate <class _Tp, class _Up, bool = __has_rebind<_Tp, _Up>::value> 11833e519524SHoward Hinnantstruct __has_rebind_other 11843e519524SHoward Hinnant{ 11853e519524SHoward Hinnantprivate: 11863e519524SHoward Hinnant struct __two {char _; char __;}; 11873e519524SHoward Hinnant template <class _Xp> static __two __test(...); 11883e519524SHoward Hinnant template <class _Xp> static char __test(typename _Xp::template rebind<_Up>::other* = 0); 11893e519524SHoward Hinnantpublic: 11903e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 11913e519524SHoward Hinnant}; 11923e519524SHoward Hinnant 11933e519524SHoward Hinnanttemplate <class _Tp, class _Up> 11943e519524SHoward Hinnantstruct __has_rebind_other<_Tp, _Up, false> 11953e519524SHoward Hinnant{ 11963e519524SHoward Hinnant static const bool value = false; 11973e519524SHoward Hinnant}; 11983e519524SHoward Hinnant 11993e519524SHoward Hinnanttemplate <class _Tp, class _Up, bool = __has_rebind_other<_Tp, _Up>::value> 12003e519524SHoward Hinnantstruct __allocator_traits_rebind 12013e519524SHoward Hinnant{ 12023e519524SHoward Hinnant typedef typename _Tp::template rebind<_Up>::other type; 12033e519524SHoward Hinnant}; 12043e519524SHoward Hinnant 12053e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 12063e519524SHoward Hinnant 12073e519524SHoward Hinnanttemplate <template <class, class...> class _Alloc, class _Tp, class ..._Args, class _Up> 12083e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _Args...>, _Up, true> 12093e519524SHoward Hinnant{ 12103e519524SHoward Hinnant typedef typename _Alloc<_Tp, _Args...>::template rebind<_Up>::other type; 12113e519524SHoward Hinnant}; 12123e519524SHoward Hinnant 12133e519524SHoward Hinnanttemplate <template <class, class...> class _Alloc, class _Tp, class ..._Args, class _Up> 12143e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _Args...>, _Up, false> 12153e519524SHoward Hinnant{ 12163e519524SHoward Hinnant typedef _Alloc<_Up, _Args...> type; 12173e519524SHoward Hinnant}; 12183e519524SHoward Hinnant 1219b3371f6fSHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 12203e519524SHoward Hinnant 12213e519524SHoward Hinnanttemplate <template <class> class _Alloc, class _Tp, class _Up> 12223e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp>, _Up, true> 12233e519524SHoward Hinnant{ 12243e519524SHoward Hinnant typedef typename _Alloc<_Tp>::template rebind<_Up>::other type; 12253e519524SHoward Hinnant}; 12263e519524SHoward Hinnant 12273e519524SHoward Hinnanttemplate <template <class> class _Alloc, class _Tp, class _Up> 12283e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp>, _Up, false> 12293e519524SHoward Hinnant{ 12303e519524SHoward Hinnant typedef _Alloc<_Up> type; 12313e519524SHoward Hinnant}; 12323e519524SHoward Hinnant 12333e519524SHoward Hinnanttemplate <template <class, class> class _Alloc, class _Tp, class _A0, class _Up> 12343e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0>, _Up, true> 12353e519524SHoward Hinnant{ 12363e519524SHoward Hinnant typedef typename _Alloc<_Tp, _A0>::template rebind<_Up>::other type; 12373e519524SHoward Hinnant}; 12383e519524SHoward Hinnant 12393e519524SHoward Hinnanttemplate <template <class, class> class _Alloc, class _Tp, class _A0, class _Up> 12403e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0>, _Up, false> 12413e519524SHoward Hinnant{ 12423e519524SHoward Hinnant typedef _Alloc<_Up, _A0> type; 12433e519524SHoward Hinnant}; 12443e519524SHoward Hinnant 12453e519524SHoward Hinnanttemplate <template <class, class, class> class _Alloc, class _Tp, class _A0, 12463e519524SHoward Hinnant class _A1, class _Up> 12473e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1>, _Up, true> 12483e519524SHoward Hinnant{ 12493e519524SHoward Hinnant typedef typename _Alloc<_Tp, _A0, _A1>::template rebind<_Up>::other type; 12503e519524SHoward Hinnant}; 12513e519524SHoward Hinnant 12523e519524SHoward Hinnanttemplate <template <class, class, class> class _Alloc, class _Tp, class _A0, 12533e519524SHoward Hinnant class _A1, class _Up> 12543e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1>, _Up, false> 12553e519524SHoward Hinnant{ 12563e519524SHoward Hinnant typedef _Alloc<_Up, _A0, _A1> type; 12573e519524SHoward Hinnant}; 12583e519524SHoward Hinnant 12593e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Alloc, class _Tp, class _A0, 12603e519524SHoward Hinnant class _A1, class _A2, class _Up> 12613e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1, _A2>, _Up, true> 12623e519524SHoward Hinnant{ 12633e519524SHoward Hinnant typedef typename _Alloc<_Tp, _A0, _A1, _A2>::template rebind<_Up>::other type; 12643e519524SHoward Hinnant}; 12653e519524SHoward Hinnant 12663e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Alloc, class _Tp, class _A0, 12673e519524SHoward Hinnant class _A1, class _A2, class _Up> 12683e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1, _A2>, _Up, false> 12693e519524SHoward Hinnant{ 12703e519524SHoward Hinnant typedef _Alloc<_Up, _A0, _A1, _A2> type; 12713e519524SHoward Hinnant}; 12723e519524SHoward Hinnant 1273b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 12743e519524SHoward Hinnant 12753e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_ADVANCED_SFINAE 12763e519524SHoward Hinnant 12773e519524SHoward Hinnanttemplate <class _Alloc, class _SizeType, class _ConstVoidPtr> 12783e519524SHoward Hinnantauto 12793e519524SHoward Hinnant__has_allocate_hint_test(_Alloc&& __a, _SizeType&& __sz, _ConstVoidPtr&& __p) 12803e519524SHoward Hinnant -> decltype(__a.allocate(__sz, __p), true_type()); 12813e519524SHoward Hinnant 12823e519524SHoward Hinnanttemplate <class _Alloc, class _SizeType, class _ConstVoidPtr> 12833e519524SHoward Hinnantauto 12843e519524SHoward Hinnant__has_allocate_hint_test(const _Alloc& __a, _SizeType&& __sz, _ConstVoidPtr&& __p) 12853e519524SHoward Hinnant -> false_type; 12863e519524SHoward Hinnant 12873e519524SHoward Hinnanttemplate <class _Alloc, class _SizeType, class _ConstVoidPtr> 12883e519524SHoward Hinnantstruct __has_allocate_hint 12893e519524SHoward Hinnant : integral_constant<bool, 12903e519524SHoward Hinnant is_same< 12913e519524SHoward Hinnant decltype(__has_allocate_hint_test(declval<_Alloc>(), 12923e519524SHoward Hinnant declval<_SizeType>(), 12933e519524SHoward Hinnant declval<_ConstVoidPtr>())), 12943e519524SHoward Hinnant true_type>::value> 12953e519524SHoward Hinnant{ 12963e519524SHoward Hinnant}; 12973e519524SHoward Hinnant 1298b3371f6fSHoward Hinnant#else // _LIBCPP_HAS_NO_ADVANCED_SFINAE 12993e519524SHoward Hinnant 13003e519524SHoward Hinnanttemplate <class _Alloc, class _SizeType, class _ConstVoidPtr> 13013e519524SHoward Hinnantstruct __has_allocate_hint 13023e519524SHoward Hinnant : true_type 13033e519524SHoward Hinnant{ 13043e519524SHoward Hinnant}; 13053e519524SHoward Hinnant 1306b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_ADVANCED_SFINAE 13073e519524SHoward Hinnant 130889bdcd7eSHoward Hinnant#if !defined(_LIBCPP_HAS_NO_ADVANCED_SFINAE) && !defined(_LIBCPP_HAS_NO_VARIADICS) 13093e519524SHoward Hinnant 13103e519524SHoward Hinnanttemplate <class _Alloc, class _Tp, class ..._Args> 1311ce48a113SHoward Hinnantdecltype(_VSTD::declval<_Alloc>().construct(_VSTD::declval<_Tp*>(), 1312ce48a113SHoward Hinnant _VSTD::declval<_Args>()...), 13133e519524SHoward Hinnant true_type()) 13143e519524SHoward Hinnant__has_construct_test(_Alloc&& __a, _Tp* __p, _Args&& ...__args); 13153e519524SHoward Hinnant 13163e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer, class ..._Args> 13173e519524SHoward Hinnantfalse_type 13183e519524SHoward Hinnant__has_construct_test(const _Alloc& __a, _Pointer&& __p, _Args&& ...__args); 13193e519524SHoward Hinnant 13203e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer, class ..._Args> 13213e519524SHoward Hinnantstruct __has_construct 13223e519524SHoward Hinnant : integral_constant<bool, 13233e519524SHoward Hinnant is_same< 13243e519524SHoward Hinnant decltype(__has_construct_test(declval<_Alloc>(), 13253e519524SHoward Hinnant declval<_Pointer>(), 13263e519524SHoward Hinnant declval<_Args>()...)), 13273e519524SHoward Hinnant true_type>::value> 13283e519524SHoward Hinnant{ 13293e519524SHoward Hinnant}; 13303e519524SHoward Hinnant 13313e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer> 13323e519524SHoward Hinnantauto 13333e519524SHoward Hinnant__has_destroy_test(_Alloc&& __a, _Pointer&& __p) 13343e519524SHoward Hinnant -> decltype(__a.destroy(__p), true_type()); 13353e519524SHoward Hinnant 13363e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer> 13373e519524SHoward Hinnantauto 13383e519524SHoward Hinnant__has_destroy_test(const _Alloc& __a, _Pointer&& __p) 13393e519524SHoward Hinnant -> false_type; 13403e519524SHoward Hinnant 13413e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer> 13423e519524SHoward Hinnantstruct __has_destroy 13433e519524SHoward Hinnant : integral_constant<bool, 13443e519524SHoward Hinnant is_same< 13453e519524SHoward Hinnant decltype(__has_destroy_test(declval<_Alloc>(), 13463e519524SHoward Hinnant declval<_Pointer>())), 13473e519524SHoward Hinnant true_type>::value> 13483e519524SHoward Hinnant{ 13493e519524SHoward Hinnant}; 13503e519524SHoward Hinnant 13513e519524SHoward Hinnanttemplate <class _Alloc> 13523e519524SHoward Hinnantauto 13533e519524SHoward Hinnant__has_max_size_test(_Alloc&& __a) 13543e519524SHoward Hinnant -> decltype(__a.max_size(), true_type()); 13553e519524SHoward Hinnant 13563e519524SHoward Hinnanttemplate <class _Alloc> 13573e519524SHoward Hinnantauto 13583e519524SHoward Hinnant__has_max_size_test(const volatile _Alloc& __a) 13593e519524SHoward Hinnant -> false_type; 13603e519524SHoward Hinnant 13613e519524SHoward Hinnanttemplate <class _Alloc> 13623e519524SHoward Hinnantstruct __has_max_size 13633e519524SHoward Hinnant : integral_constant<bool, 13643e519524SHoward Hinnant is_same< 13653e519524SHoward Hinnant decltype(__has_max_size_test(declval<_Alloc&>())), 13663e519524SHoward Hinnant true_type>::value> 13673e519524SHoward Hinnant{ 13683e519524SHoward Hinnant}; 13693e519524SHoward Hinnant 13703e519524SHoward Hinnanttemplate <class _Alloc> 13713e519524SHoward Hinnantauto 13723e519524SHoward Hinnant__has_select_on_container_copy_construction_test(_Alloc&& __a) 13733e519524SHoward Hinnant -> decltype(__a.select_on_container_copy_construction(), true_type()); 13743e519524SHoward Hinnant 13753e519524SHoward Hinnanttemplate <class _Alloc> 13763e519524SHoward Hinnantauto 13773e519524SHoward Hinnant__has_select_on_container_copy_construction_test(const volatile _Alloc& __a) 13783e519524SHoward Hinnant -> false_type; 13793e519524SHoward Hinnant 13803e519524SHoward Hinnanttemplate <class _Alloc> 13813e519524SHoward Hinnantstruct __has_select_on_container_copy_construction 13823e519524SHoward Hinnant : integral_constant<bool, 13833e519524SHoward Hinnant is_same< 13843e519524SHoward Hinnant decltype(__has_select_on_container_copy_construction_test(declval<_Alloc&>())), 13853e519524SHoward Hinnant true_type>::value> 13863e519524SHoward Hinnant{ 13873e519524SHoward Hinnant}; 13883e519524SHoward Hinnant 1389b3371f6fSHoward Hinnant#else // _LIBCPP_HAS_NO_ADVANCED_SFINAE 13903e519524SHoward Hinnant 13913e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 13923e519524SHoward Hinnant 13933e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer, class ..._Args> 13943e519524SHoward Hinnantstruct __has_construct 13953e519524SHoward Hinnant : false_type 13963e519524SHoward Hinnant{ 13973e519524SHoward Hinnant}; 13983e519524SHoward Hinnant 13999741d6c9SHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 14009741d6c9SHoward Hinnant 14019741d6c9SHoward Hinnanttemplate <class _Alloc, class _Pointer, class _Args> 14029741d6c9SHoward Hinnantstruct __has_construct 14039741d6c9SHoward Hinnant : false_type 14049741d6c9SHoward Hinnant{ 14059741d6c9SHoward Hinnant}; 14069741d6c9SHoward Hinnant 1407b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 14083e519524SHoward Hinnant 14093e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer> 14103e519524SHoward Hinnantstruct __has_destroy 14113e519524SHoward Hinnant : false_type 14123e519524SHoward Hinnant{ 14133e519524SHoward Hinnant}; 14143e519524SHoward Hinnant 14153e519524SHoward Hinnanttemplate <class _Alloc> 14163e519524SHoward Hinnantstruct __has_max_size 14173e519524SHoward Hinnant : true_type 14183e519524SHoward Hinnant{ 14193e519524SHoward Hinnant}; 14203e519524SHoward Hinnant 14213e519524SHoward Hinnanttemplate <class _Alloc> 14223e519524SHoward Hinnantstruct __has_select_on_container_copy_construction 14233e519524SHoward Hinnant : false_type 14243e519524SHoward Hinnant{ 14253e519524SHoward Hinnant}; 14263e519524SHoward Hinnant 1427b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_ADVANCED_SFINAE 14283e519524SHoward Hinnant 1429a4a1ef1fSHoward Hinnanttemplate <class _Alloc, class _Ptr, bool = __has_difference_type<_Alloc>::value> 1430a4a1ef1fSHoward Hinnantstruct __alloc_traits_difference_type 1431a4a1ef1fSHoward Hinnant{ 1432a4a1ef1fSHoward Hinnant typedef typename pointer_traits<_Ptr>::difference_type type; 1433a4a1ef1fSHoward Hinnant}; 1434a4a1ef1fSHoward Hinnant 1435a4a1ef1fSHoward Hinnanttemplate <class _Alloc, class _Ptr> 1436a4a1ef1fSHoward Hinnantstruct __alloc_traits_difference_type<_Alloc, _Ptr, true> 1437a4a1ef1fSHoward Hinnant{ 1438a4a1ef1fSHoward Hinnant typedef typename _Alloc::difference_type type; 1439a4a1ef1fSHoward Hinnant}; 1440a4a1ef1fSHoward Hinnant 14413e519524SHoward Hinnanttemplate <class _Alloc> 1442848a5374SHoward Hinnantstruct _LIBCPP_VISIBLE allocator_traits 14433e519524SHoward Hinnant{ 14443e519524SHoward Hinnant typedef _Alloc allocator_type; 14453e519524SHoward Hinnant typedef typename allocator_type::value_type value_type; 14463e519524SHoward Hinnant 14473e519524SHoward Hinnant typedef typename __pointer_type<value_type, allocator_type>::type pointer; 14483e519524SHoward Hinnant typedef typename __const_pointer<value_type, pointer, allocator_type>::type const_pointer; 14493e519524SHoward Hinnant typedef typename __void_pointer<pointer, allocator_type>::type void_pointer; 14503e519524SHoward Hinnant typedef typename __const_void_pointer<pointer, allocator_type>::type const_void_pointer; 14513e519524SHoward Hinnant 1452a4a1ef1fSHoward Hinnant typedef typename __alloc_traits_difference_type<allocator_type, pointer>::type difference_type; 1453a4a1ef1fSHoward Hinnant typedef typename __size_type<allocator_type, difference_type>::type size_type; 14543e519524SHoward Hinnant 14553e519524SHoward Hinnant typedef typename __propagate_on_container_copy_assignment<allocator_type>::type 14563e519524SHoward Hinnant propagate_on_container_copy_assignment; 14573e519524SHoward Hinnant typedef typename __propagate_on_container_move_assignment<allocator_type>::type 14583e519524SHoward Hinnant propagate_on_container_move_assignment; 14593e519524SHoward Hinnant typedef typename __propagate_on_container_swap<allocator_type>::type 14603e519524SHoward Hinnant propagate_on_container_swap; 14613e519524SHoward Hinnant 14623e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 14633e519524SHoward Hinnant template <class _Tp> using rebind_alloc = 1464f7384975SHoward Hinnant typename __allocator_traits_rebind<allocator_type, _Tp>::type; 14653e519524SHoward Hinnant template <class _Tp> using rebind_traits = allocator_traits<rebind_alloc<_Tp>>; 1466b3371f6fSHoward Hinnant#else // _LIBCPP_HAS_NO_TEMPLATE_ALIASES 14673e519524SHoward Hinnant template <class _Tp> struct rebind_alloc 14683e519524SHoward Hinnant {typedef typename __allocator_traits_rebind<allocator_type, _Tp>::type other;}; 14693e519524SHoward Hinnant template <class _Tp> struct rebind_traits 14703e519524SHoward Hinnant {typedef allocator_traits<typename rebind_alloc<_Tp>::other> other;}; 1471b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_TEMPLATE_ALIASES 14723e519524SHoward Hinnant 1473848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14743e519524SHoward Hinnant static pointer allocate(allocator_type& __a, size_type __n) 14753e519524SHoward Hinnant {return __a.allocate(__n);} 1476848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14773e519524SHoward Hinnant static pointer allocate(allocator_type& __a, size_type __n, const_void_pointer __hint) 14783e519524SHoward Hinnant {return allocate(__a, __n, __hint, 14793e519524SHoward Hinnant __has_allocate_hint<allocator_type, size_type, const_void_pointer>());} 14803e519524SHoward Hinnant 1481848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14823739fe79SHoward Hinnant static void deallocate(allocator_type& __a, pointer __p, size_type __n) _NOEXCEPT 14833e519524SHoward Hinnant {__a.deallocate(__p, __n);} 14843e519524SHoward Hinnant 14853e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 14863e519524SHoward Hinnant template <class _Tp, class... _Args> 1487848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14883e519524SHoward Hinnant static void construct(allocator_type& __a, _Tp* __p, _Args&&... __args) 14893e519524SHoward Hinnant {__construct(__has_construct<allocator_type, pointer, _Args...>(), 1490ce48a113SHoward Hinnant __a, __p, _VSTD::forward<_Args>(__args)...);} 1491b3371f6fSHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 14923e519524SHoward Hinnant template <class _Tp> 1493848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14943e519524SHoward Hinnant static void construct(allocator_type& __a, _Tp* __p) 14953e519524SHoward Hinnant { 14963e519524SHoward Hinnant ::new ((void*)__p) _Tp(); 14973e519524SHoward Hinnant } 14983e519524SHoward Hinnant template <class _Tp, class _A0> 1499848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15003e519524SHoward Hinnant static void construct(allocator_type& __a, _Tp* __p, const _A0& __a0) 15013e519524SHoward Hinnant { 15023e519524SHoward Hinnant ::new ((void*)__p) _Tp(__a0); 15033e519524SHoward Hinnant } 15043e519524SHoward Hinnant template <class _Tp, class _A0, class _A1> 1505848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15063e519524SHoward Hinnant static void construct(allocator_type& __a, _Tp* __p, const _A0& __a0, 15073e519524SHoward Hinnant const _A1& __a1) 15083e519524SHoward Hinnant { 15093e519524SHoward Hinnant ::new ((void*)__p) _Tp(__a0, __a1); 15103e519524SHoward Hinnant } 15113e519524SHoward Hinnant template <class _Tp, class _A0, class _A1, class _A2> 1512848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15133e519524SHoward Hinnant static void construct(allocator_type& __a, _Tp* __p, const _A0& __a0, 15143e519524SHoward Hinnant const _A1& __a1, const _A2& __a2) 15153e519524SHoward Hinnant { 15163e519524SHoward Hinnant ::new ((void*)__p) _Tp(__a0, __a1, __a2); 15173e519524SHoward Hinnant } 1518b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 15193e519524SHoward Hinnant 15203e519524SHoward Hinnant template <class _Tp> 1521848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15223e519524SHoward Hinnant static void destroy(allocator_type& __a, _Tp* __p) 15233e519524SHoward Hinnant {__destroy(__has_destroy<allocator_type, _Tp*>(), __a, __p);} 15243e519524SHoward Hinnant 1525848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15263e519524SHoward Hinnant static size_type max_size(const allocator_type& __a) 15273e519524SHoward Hinnant {return __max_size(__has_max_size<const allocator_type>(), __a);} 15283e519524SHoward Hinnant 1529848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15303e519524SHoward Hinnant static allocator_type 15313e519524SHoward Hinnant select_on_container_copy_construction(const allocator_type& __a) 15323e519524SHoward Hinnant {return select_on_container_copy_construction( 15333e519524SHoward Hinnant __has_select_on_container_copy_construction<const allocator_type>(), 15343e519524SHoward Hinnant __a);} 15353e519524SHoward Hinnant 15369741d6c9SHoward Hinnant template <class _Ptr> 15379741d6c9SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15389741d6c9SHoward Hinnant static 15399741d6c9SHoward Hinnant void 15409741d6c9SHoward Hinnant __construct_forward(allocator_type& __a, _Ptr __begin1, _Ptr __end1, _Ptr& __begin2) 15419741d6c9SHoward Hinnant { 15429741d6c9SHoward Hinnant for (; __begin1 != __end1; ++__begin1, ++__begin2) 15439741d6c9SHoward Hinnant construct(__a, _VSTD::__to_raw_pointer(__begin2), _VSTD::move_if_noexcept(*__begin1)); 15449741d6c9SHoward Hinnant } 15459741d6c9SHoward Hinnant 15469741d6c9SHoward Hinnant template <class _Tp> 15479741d6c9SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15489741d6c9SHoward Hinnant static 15499741d6c9SHoward Hinnant typename enable_if 15509741d6c9SHoward Hinnant < 15519741d6c9SHoward Hinnant (is_same<allocator_type, allocator<_Tp> >::value 15529741d6c9SHoward Hinnant || !__has_construct<allocator_type, _Tp*, _Tp>::value) && 15539741d6c9SHoward Hinnant is_trivially_move_constructible<_Tp>::value, 15549741d6c9SHoward Hinnant void 15559741d6c9SHoward Hinnant >::type 15569741d6c9SHoward Hinnant __construct_forward(allocator_type& __a, _Tp* __begin1, _Tp* __end1, _Tp*& __begin2) 15579741d6c9SHoward Hinnant { 15589741d6c9SHoward Hinnant ptrdiff_t _Np = __end1 - __begin1; 15599741d6c9SHoward Hinnant _VSTD::memcpy(__begin2, __begin1, _Np * sizeof(_Tp)); 15609741d6c9SHoward Hinnant __begin2 += _Np; 15619741d6c9SHoward Hinnant } 15629741d6c9SHoward Hinnant 15639741d6c9SHoward Hinnant template <class _Ptr> 15649741d6c9SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15659741d6c9SHoward Hinnant static 15669741d6c9SHoward Hinnant void 15679741d6c9SHoward Hinnant __construct_backward(allocator_type& __a, _Ptr __begin1, _Ptr __end1, _Ptr& __end2) 15689741d6c9SHoward Hinnant { 15699741d6c9SHoward Hinnant while (__end1 != __begin1) 15709741d6c9SHoward Hinnant construct(__a, _VSTD::__to_raw_pointer(--__end2), _VSTD::move_if_noexcept(*--__end1)); 15719741d6c9SHoward Hinnant } 15729741d6c9SHoward Hinnant 15739741d6c9SHoward Hinnant template <class _Tp> 15749741d6c9SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15759741d6c9SHoward Hinnant static 15769741d6c9SHoward Hinnant typename enable_if 15779741d6c9SHoward Hinnant < 15789741d6c9SHoward Hinnant (is_same<allocator_type, allocator<_Tp> >::value 15799741d6c9SHoward Hinnant || !__has_construct<allocator_type, _Tp*, _Tp>::value) && 15809741d6c9SHoward Hinnant is_trivially_move_constructible<_Tp>::value, 15819741d6c9SHoward Hinnant void 15829741d6c9SHoward Hinnant >::type 15839741d6c9SHoward Hinnant __construct_backward(allocator_type& __a, _Tp* __begin1, _Tp* __end1, _Tp*& __end2) 15849741d6c9SHoward Hinnant { 15859741d6c9SHoward Hinnant ptrdiff_t _Np = __end1 - __begin1; 15869741d6c9SHoward Hinnant __end2 -= _Np; 15879741d6c9SHoward Hinnant _VSTD::memcpy(__end2, __begin1, _Np * sizeof(_Tp)); 15889741d6c9SHoward Hinnant } 15899741d6c9SHoward Hinnant 15903e519524SHoward Hinnantprivate: 15913e519524SHoward Hinnant 1592848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15933e519524SHoward Hinnant static pointer allocate(allocator_type& __a, size_type __n, 15943e519524SHoward Hinnant const_void_pointer __hint, true_type) 15953e519524SHoward Hinnant {return __a.allocate(__n, __hint);} 1596848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15973e519524SHoward Hinnant static pointer allocate(allocator_type& __a, size_type __n, 1598c206366fSHoward Hinnant const_void_pointer, false_type) 15993e519524SHoward Hinnant {return __a.allocate(__n);} 16003e519524SHoward Hinnant 16013e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 16023e519524SHoward Hinnant template <class _Tp, class... _Args> 1603848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16043e519524SHoward Hinnant static void __construct(true_type, allocator_type& __a, _Tp* __p, _Args&&... __args) 1605ce48a113SHoward Hinnant {__a.construct(__p, _VSTD::forward<_Args>(__args)...);} 16063e519524SHoward Hinnant template <class _Tp, class... _Args> 1607848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16083e519524SHoward Hinnant static void __construct(false_type, allocator_type&, _Tp* __p, _Args&&... __args) 16093e519524SHoward Hinnant { 1610ce48a113SHoward Hinnant ::new ((void*)__p) _Tp(_VSTD::forward<_Args>(__args)...); 16113e519524SHoward Hinnant } 1612b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 16133e519524SHoward Hinnant 16143e519524SHoward Hinnant template <class _Tp> 1615848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16163e519524SHoward Hinnant static void __destroy(true_type, allocator_type& __a, _Tp* __p) 16173e519524SHoward Hinnant {__a.destroy(__p);} 16183e519524SHoward Hinnant template <class _Tp> 1619848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16203e519524SHoward Hinnant static void __destroy(false_type, allocator_type&, _Tp* __p) 16213e519524SHoward Hinnant { 16223e519524SHoward Hinnant __p->~_Tp(); 16233e519524SHoward Hinnant } 16243e519524SHoward Hinnant 1625848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16263e519524SHoward Hinnant static size_type __max_size(true_type, const allocator_type& __a) 16273e519524SHoward Hinnant {return __a.max_size();} 1628848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16293e519524SHoward Hinnant static size_type __max_size(false_type, const allocator_type&) 16303e519524SHoward Hinnant {return numeric_limits<size_type>::max();} 16313e519524SHoward Hinnant 1632848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16333e519524SHoward Hinnant static allocator_type 16343e519524SHoward Hinnant select_on_container_copy_construction(true_type, const allocator_type& __a) 16353e519524SHoward Hinnant {return __a.select_on_container_copy_construction();} 1636848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16373e519524SHoward Hinnant static allocator_type 16383e519524SHoward Hinnant select_on_container_copy_construction(false_type, const allocator_type& __a) 16393e519524SHoward Hinnant {return __a;} 16403e519524SHoward Hinnant}; 16413e519524SHoward Hinnant 16423e519524SHoward Hinnant// allocator 16433e519524SHoward Hinnant 16443e519524SHoward Hinnanttemplate <class _Tp> 1645f9cca3b7SHoward Hinnantclass _LIBCPP_VISIBLE allocator 16463e519524SHoward Hinnant{ 16473e519524SHoward Hinnantpublic: 16483e519524SHoward Hinnant typedef size_t size_type; 16493e519524SHoward Hinnant typedef ptrdiff_t difference_type; 16503e519524SHoward Hinnant typedef _Tp* pointer; 16513e519524SHoward Hinnant typedef const _Tp* const_pointer; 16523e519524SHoward Hinnant typedef _Tp& reference; 16533e519524SHoward Hinnant typedef const _Tp& const_reference; 16543e519524SHoward Hinnant typedef _Tp value_type; 16553e519524SHoward Hinnant 1656b58f59cdSHoward Hinnant typedef true_type propagate_on_container_move_assignment; 1657b58f59cdSHoward Hinnant 16583e519524SHoward Hinnant template <class _Up> struct rebind {typedef allocator<_Up> other;}; 16593e519524SHoward Hinnant 16603739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY allocator() _NOEXCEPT {} 16613739fe79SHoward Hinnant template <class _Up> _LIBCPP_INLINE_VISIBILITY allocator(const allocator<_Up>&) _NOEXCEPT {} 16623739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer address(reference __x) const _NOEXCEPT 1663ce48a113SHoward Hinnant {return _VSTD::addressof(__x);} 16643739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY const_pointer address(const_reference __x) const _NOEXCEPT 1665ce48a113SHoward Hinnant {return _VSTD::addressof(__x);} 16663e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer allocate(size_type __n, allocator<void>::const_pointer = 0) 16673e519524SHoward Hinnant {return static_cast<pointer>(::operator new(__n * sizeof(_Tp)));} 16683739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void deallocate(pointer __p, size_type) _NOEXCEPT 16693739fe79SHoward Hinnant {::operator delete((void*)__p);} 16703739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT 16713739fe79SHoward Hinnant {return size_type(~0) / sizeof(_Tp);} 16727609c9b6SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 16733e519524SHoward Hinnant template <class _Up, class... _Args> 16743e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16753e519524SHoward Hinnant void 16763e519524SHoward Hinnant construct(_Up* __p, _Args&&... __args) 16773e519524SHoward Hinnant { 1678ce48a113SHoward Hinnant ::new((void*)__p) _Up(_VSTD::forward<_Args>(__args)...); 16793e519524SHoward Hinnant } 16807609c9b6SHoward Hinnant#else // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 16813e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16823e519524SHoward Hinnant void 16833e519524SHoward Hinnant construct(pointer __p) 16843e519524SHoward Hinnant { 16853e519524SHoward Hinnant ::new((void*)__p) _Tp(); 16863e519524SHoward Hinnant } 1687f5799be4SMichael J. Spencer# if defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) 1688bff1bfc6SHoward Hinnant 16893e519524SHoward Hinnant template <class _A0> 16903e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16913e519524SHoward Hinnant void 16923e519524SHoward Hinnant construct(pointer __p, _A0& __a0) 16933e519524SHoward Hinnant { 16943e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0); 16953e519524SHoward Hinnant } 16963e519524SHoward Hinnant template <class _A0> 16973e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16983e519524SHoward Hinnant void 16993e519524SHoward Hinnant construct(pointer __p, const _A0& __a0) 17003e519524SHoward Hinnant { 17013e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0); 17023e519524SHoward Hinnant } 1703f5799be4SMichael J. Spencer# endif // defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) 17043e519524SHoward Hinnant template <class _A0, class _A1> 17053e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17063e519524SHoward Hinnant void 17073e519524SHoward Hinnant construct(pointer __p, _A0& __a0, _A1& __a1) 17083e519524SHoward Hinnant { 17093e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 17103e519524SHoward Hinnant } 17113e519524SHoward Hinnant template <class _A0, class _A1> 17123e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17133e519524SHoward Hinnant void 17143e519524SHoward Hinnant construct(pointer __p, const _A0& __a0, _A1& __a1) 17153e519524SHoward Hinnant { 17163e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 17173e519524SHoward Hinnant } 17183e519524SHoward Hinnant template <class _A0, class _A1> 17193e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17203e519524SHoward Hinnant void 17213e519524SHoward Hinnant construct(pointer __p, _A0& __a0, const _A1& __a1) 17223e519524SHoward Hinnant { 17233e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 17243e519524SHoward Hinnant } 17253e519524SHoward Hinnant template <class _A0, class _A1> 17263e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17273e519524SHoward Hinnant void 17283e519524SHoward Hinnant construct(pointer __p, const _A0& __a0, const _A1& __a1) 17293e519524SHoward Hinnant { 17303e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 17313e519524SHoward Hinnant } 17327609c9b6SHoward Hinnant#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 17333e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void destroy(pointer __p) {__p->~_Tp();} 17343e519524SHoward Hinnant}; 17353e519524SHoward Hinnant 17368e25104bSHoward Hinnanttemplate <class _Tp> 17378e25104bSHoward Hinnantclass _LIBCPP_VISIBLE allocator<const _Tp> 17388e25104bSHoward Hinnant{ 17398e25104bSHoward Hinnantpublic: 17408e25104bSHoward Hinnant typedef size_t size_type; 17418e25104bSHoward Hinnant typedef ptrdiff_t difference_type; 17428e25104bSHoward Hinnant typedef const _Tp* pointer; 17438e25104bSHoward Hinnant typedef const _Tp* const_pointer; 17448e25104bSHoward Hinnant typedef const _Tp& reference; 17458e25104bSHoward Hinnant typedef const _Tp& const_reference; 17468e25104bSHoward Hinnant typedef _Tp value_type; 17478e25104bSHoward Hinnant 17488e25104bSHoward Hinnant typedef true_type propagate_on_container_move_assignment; 17498e25104bSHoward Hinnant 17508e25104bSHoward Hinnant template <class _Up> struct rebind {typedef allocator<_Up> other;}; 17518e25104bSHoward Hinnant 17528e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY allocator() _NOEXCEPT {} 17538e25104bSHoward Hinnant template <class _Up> _LIBCPP_INLINE_VISIBILITY allocator(const allocator<_Up>&) _NOEXCEPT {} 17548e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY const_pointer address(const_reference __x) const _NOEXCEPT 17558e25104bSHoward Hinnant {return _VSTD::addressof(__x);} 17568e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer allocate(size_type __n, allocator<void>::const_pointer = 0) 17578e25104bSHoward Hinnant {return static_cast<pointer>(::operator new(__n * sizeof(_Tp)));} 17588e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY void deallocate(pointer __p, size_type) _NOEXCEPT 17598e25104bSHoward Hinnant {::operator delete((void*)__p);} 17608e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT 17618e25104bSHoward Hinnant {return size_type(~0) / sizeof(_Tp);} 17628e25104bSHoward Hinnant#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 17638e25104bSHoward Hinnant template <class _Up, class... _Args> 17648e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17658e25104bSHoward Hinnant void 17668e25104bSHoward Hinnant construct(_Up* __p, _Args&&... __args) 17678e25104bSHoward Hinnant { 17688e25104bSHoward Hinnant ::new((void*)__p) _Up(_VSTD::forward<_Args>(__args)...); 17698e25104bSHoward Hinnant } 17708e25104bSHoward Hinnant#else // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 17718e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17728e25104bSHoward Hinnant void 17738e25104bSHoward Hinnant construct(pointer __p) 17748e25104bSHoward Hinnant { 17758e25104bSHoward Hinnant ::new((void*)__p) _Tp(); 17768e25104bSHoward Hinnant } 17778e25104bSHoward Hinnant# if defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) 1778bff1bfc6SHoward Hinnant 17798e25104bSHoward Hinnant template <class _A0> 17808e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17818e25104bSHoward Hinnant void 17828e25104bSHoward Hinnant construct(pointer __p, _A0& __a0) 17838e25104bSHoward Hinnant { 17848e25104bSHoward Hinnant ::new((void*)__p) _Tp(__a0); 17858e25104bSHoward Hinnant } 17868e25104bSHoward Hinnant template <class _A0> 17878e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17888e25104bSHoward Hinnant void 17898e25104bSHoward Hinnant construct(pointer __p, const _A0& __a0) 17908e25104bSHoward Hinnant { 17918e25104bSHoward Hinnant ::new((void*)__p) _Tp(__a0); 17928e25104bSHoward Hinnant } 17938e25104bSHoward Hinnant# endif // defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) 17948e25104bSHoward Hinnant template <class _A0, class _A1> 17958e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17968e25104bSHoward Hinnant void 17978e25104bSHoward Hinnant construct(pointer __p, _A0& __a0, _A1& __a1) 17988e25104bSHoward Hinnant { 17998e25104bSHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 18008e25104bSHoward Hinnant } 18018e25104bSHoward Hinnant template <class _A0, class _A1> 18028e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18038e25104bSHoward Hinnant void 18048e25104bSHoward Hinnant construct(pointer __p, const _A0& __a0, _A1& __a1) 18058e25104bSHoward Hinnant { 18068e25104bSHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 18078e25104bSHoward Hinnant } 18088e25104bSHoward Hinnant template <class _A0, class _A1> 18098e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18108e25104bSHoward Hinnant void 18118e25104bSHoward Hinnant construct(pointer __p, _A0& __a0, const _A1& __a1) 18128e25104bSHoward Hinnant { 18138e25104bSHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 18148e25104bSHoward Hinnant } 18158e25104bSHoward Hinnant template <class _A0, class _A1> 18168e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18178e25104bSHoward Hinnant void 18188e25104bSHoward Hinnant construct(pointer __p, const _A0& __a0, const _A1& __a1) 18198e25104bSHoward Hinnant { 18208e25104bSHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 18218e25104bSHoward Hinnant } 18228e25104bSHoward Hinnant#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 18238e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY void destroy(pointer __p) {__p->~_Tp();} 18248e25104bSHoward Hinnant}; 18258e25104bSHoward Hinnant 18263e519524SHoward Hinnanttemplate <class _Tp, class _Up> 18273e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 18283739fe79SHoward Hinnantbool operator==(const allocator<_Tp>&, const allocator<_Up>&) _NOEXCEPT {return true;} 18293e519524SHoward Hinnant 18303e519524SHoward Hinnanttemplate <class _Tp, class _Up> 18313e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 18323739fe79SHoward Hinnantbool operator!=(const allocator<_Tp>&, const allocator<_Up>&) _NOEXCEPT {return false;} 18333e519524SHoward Hinnant 18343e519524SHoward Hinnanttemplate <class _OutputIterator, class _Tp> 1835848a5374SHoward Hinnantclass _LIBCPP_VISIBLE raw_storage_iterator 18363e519524SHoward Hinnant : public iterator<output_iterator_tag, 18373e519524SHoward Hinnant _Tp, // purposefully not C++03 18383e519524SHoward Hinnant ptrdiff_t, // purposefully not C++03 18393e519524SHoward Hinnant _Tp*, // purposefully not C++03 18403e519524SHoward Hinnant raw_storage_iterator<_OutputIterator, _Tp>&> // purposefully not C++03 18413e519524SHoward Hinnant{ 18423e519524SHoward Hinnantprivate: 18433e519524SHoward Hinnant _OutputIterator __x_; 18443e519524SHoward Hinnantpublic: 18453e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit raw_storage_iterator(_OutputIterator __x) : __x_(__x) {} 18463e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator*() {return *this;} 18473e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator=(const _Tp& __element) 18483e519524SHoward Hinnant {::new(&*__x_) _Tp(__element); return *this;} 18493e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator++() {++__x_; return *this;} 18503e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY raw_storage_iterator operator++(int) 18513e519524SHoward Hinnant {raw_storage_iterator __t(*this); ++__x_; return __t;} 18523e519524SHoward Hinnant}; 18533e519524SHoward Hinnant 18543e519524SHoward Hinnanttemplate <class _Tp> 18553e519524SHoward Hinnantpair<_Tp*, ptrdiff_t> 18563739fe79SHoward Hinnantget_temporary_buffer(ptrdiff_t __n) _NOEXCEPT 18573e519524SHoward Hinnant{ 18583e519524SHoward Hinnant pair<_Tp*, ptrdiff_t> __r(0, 0); 18593e519524SHoward Hinnant const ptrdiff_t __m = (~ptrdiff_t(0) ^ 18603e519524SHoward Hinnant ptrdiff_t(ptrdiff_t(1) << (sizeof(ptrdiff_t) * __CHAR_BIT__ - 1))) 18613e519524SHoward Hinnant / sizeof(_Tp); 18623e519524SHoward Hinnant if (__n > __m) 18633e519524SHoward Hinnant __n = __m; 18643e519524SHoward Hinnant while (__n > 0) 18653e519524SHoward Hinnant { 18663e519524SHoward Hinnant __r.first = static_cast<_Tp*>(::operator new(__n * sizeof(_Tp), nothrow)); 18673e519524SHoward Hinnant if (__r.first) 18683e519524SHoward Hinnant { 18693e519524SHoward Hinnant __r.second = __n; 18703e519524SHoward Hinnant break; 18713e519524SHoward Hinnant } 18723e519524SHoward Hinnant __n /= 2; 18733e519524SHoward Hinnant } 18743e519524SHoward Hinnant return __r; 18753e519524SHoward Hinnant} 18763e519524SHoward Hinnant 18773e519524SHoward Hinnanttemplate <class _Tp> 18783e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 18793739fe79SHoward Hinnantvoid return_temporary_buffer(_Tp* __p) _NOEXCEPT {::operator delete(__p);} 18803e519524SHoward Hinnant 18813e519524SHoward Hinnanttemplate <class _Tp> 18823e519524SHoward Hinnantstruct auto_ptr_ref 18833e519524SHoward Hinnant{ 18843e519524SHoward Hinnant _Tp* __ptr_; 18853e519524SHoward Hinnant}; 18863e519524SHoward Hinnant 18873e519524SHoward Hinnanttemplate<class _Tp> 1888848a5374SHoward Hinnantclass _LIBCPP_VISIBLE auto_ptr 18893e519524SHoward Hinnant{ 18903e519524SHoward Hinnantprivate: 18913e519524SHoward Hinnant _Tp* __ptr_; 18923e519524SHoward Hinnantpublic: 18933e519524SHoward Hinnant typedef _Tp element_type; 18943e519524SHoward Hinnant 18953e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit auto_ptr(_Tp* __p = 0) throw() : __ptr_(__p) {} 18963e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr& __p) throw() : __ptr_(__p.release()) {} 18973e519524SHoward Hinnant template<class _Up> _LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr<_Up>& __p) throw() 18983e519524SHoward Hinnant : __ptr_(__p.release()) {} 18993e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr& __p) throw() 19003e519524SHoward Hinnant {reset(__p.release()); return *this;} 19013e519524SHoward Hinnant template<class _Up> _LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr<_Up>& __p) throw() 19023e519524SHoward Hinnant {reset(__p.release()); return *this;} 19033e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr_ref<_Tp> __p) throw() 19043e519524SHoward Hinnant {reset(__p.__ptr_); return *this;} 19053e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY ~auto_ptr() throw() {delete __ptr_;} 19063e519524SHoward Hinnant 19073e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Tp& operator*() const throw() 19083e519524SHoward Hinnant {return *__ptr_;} 19093e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Tp* operator->() const throw() {return __ptr_;} 19103e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Tp* get() const throw() {return __ptr_;} 19113e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Tp* release() throw() 19123e519524SHoward Hinnant { 19133e519524SHoward Hinnant _Tp* __t = __ptr_; 19143e519524SHoward Hinnant __ptr_ = 0; 19153e519524SHoward Hinnant return __t; 19163e519524SHoward Hinnant } 19173e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void reset(_Tp* __p = 0) throw() 19183e519524SHoward Hinnant { 19193e519524SHoward Hinnant if (__ptr_ != __p) 19203e519524SHoward Hinnant delete __ptr_; 19213e519524SHoward Hinnant __ptr_ = __p; 19223e519524SHoward Hinnant } 19233e519524SHoward Hinnant 19243e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr_ref<_Tp> __p) throw() : __ptr_(__p.__ptr_) {} 19253e519524SHoward Hinnant template<class _Up> _LIBCPP_INLINE_VISIBILITY operator auto_ptr_ref<_Up>() throw() 19263e519524SHoward Hinnant {auto_ptr_ref<_Up> __t; __t.__ptr_ = release(); return __t;} 19273e519524SHoward Hinnant template<class _Up> _LIBCPP_INLINE_VISIBILITY operator auto_ptr<_Up>() throw() 19283e519524SHoward Hinnant {return auto_ptr<_Up>(release());} 19293e519524SHoward Hinnant}; 19303e519524SHoward Hinnant 19313e519524SHoward Hinnanttemplate <> 1932848a5374SHoward Hinnantclass _LIBCPP_VISIBLE auto_ptr<void> 19333e519524SHoward Hinnant{ 19343e519524SHoward Hinnantpublic: 19353e519524SHoward Hinnant typedef void element_type; 19363e519524SHoward Hinnant}; 19373e519524SHoward Hinnant 19383e519524SHoward Hinnanttemplate <class _T1, class _T2, bool = is_same<typename remove_cv<_T1>::type, 19393e519524SHoward Hinnant typename remove_cv<_T2>::type>::value, 194042b8bb50SHoward Hinnant bool = is_empty<_T1>::value 194142b8bb50SHoward Hinnant#if __has_feature(is_final) 194242b8bb50SHoward Hinnant && !__is_final(_T1) 194342b8bb50SHoward Hinnant#endif 194442b8bb50SHoward Hinnant , 194542b8bb50SHoward Hinnant bool = is_empty<_T2>::value 194642b8bb50SHoward Hinnant#if __has_feature(is_final) 194742b8bb50SHoward Hinnant && !__is_final(_T2) 194842b8bb50SHoward Hinnant#endif 194942b8bb50SHoward Hinnant > 19503e519524SHoward Hinnantstruct __libcpp_compressed_pair_switch; 19513e519524SHoward Hinnant 19523e519524SHoward Hinnanttemplate <class _T1, class _T2, bool IsSame> 19533e519524SHoward Hinnantstruct __libcpp_compressed_pair_switch<_T1, _T2, IsSame, false, false> {enum {value = 0};}; 19543e519524SHoward Hinnant 19553e519524SHoward Hinnanttemplate <class _T1, class _T2, bool IsSame> 19563e519524SHoward Hinnantstruct __libcpp_compressed_pair_switch<_T1, _T2, IsSame, true, false> {enum {value = 1};}; 19573e519524SHoward Hinnant 19583e519524SHoward Hinnanttemplate <class _T1, class _T2, bool IsSame> 19593e519524SHoward Hinnantstruct __libcpp_compressed_pair_switch<_T1, _T2, IsSame, false, true> {enum {value = 2};}; 19603e519524SHoward Hinnant 19613e519524SHoward Hinnanttemplate <class _T1, class _T2> 19623e519524SHoward Hinnantstruct __libcpp_compressed_pair_switch<_T1, _T2, false, true, true> {enum {value = 3};}; 19633e519524SHoward Hinnant 19643e519524SHoward Hinnanttemplate <class _T1, class _T2> 19653e519524SHoward Hinnantstruct __libcpp_compressed_pair_switch<_T1, _T2, true, true, true> {enum {value = 1};}; 19663e519524SHoward Hinnant 19673e519524SHoward Hinnanttemplate <class _T1, class _T2, unsigned = __libcpp_compressed_pair_switch<_T1, _T2>::value> 19683e519524SHoward Hinnantclass __libcpp_compressed_pair_imp; 19693e519524SHoward Hinnant 19703e519524SHoward Hinnanttemplate <class _T1, class _T2> 19713e519524SHoward Hinnantclass __libcpp_compressed_pair_imp<_T1, _T2, 0> 19723e519524SHoward Hinnant{ 19733e519524SHoward Hinnantprivate: 19743e519524SHoward Hinnant _T1 __first_; 19753e519524SHoward Hinnant _T2 __second_; 19763e519524SHoward Hinnantpublic: 19773e519524SHoward Hinnant typedef _T1 _T1_param; 19783e519524SHoward Hinnant typedef _T2 _T2_param; 19793e519524SHoward Hinnant 19803e519524SHoward Hinnant typedef typename remove_reference<_T1>::type& _T1_reference; 19813e519524SHoward Hinnant typedef typename remove_reference<_T2>::type& _T2_reference; 19823e519524SHoward Hinnant 19833e519524SHoward Hinnant typedef const typename remove_reference<_T1>::type& _T1_const_reference; 19843e519524SHoward Hinnant typedef const typename remove_reference<_T2>::type& _T2_const_reference; 19853e519524SHoward Hinnant 19863e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp() {} 19878e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T1_param __t1) 1988ce48a113SHoward Hinnant : __first_(_VSTD::forward<_T1_param>(__t1)) {} 19898e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T2_param __t2) 1990ce48a113SHoward Hinnant : __second_(_VSTD::forward<_T2_param>(__t2)) {} 19913e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(_T1_param __t1, _T2_param __t2) 1992ce48a113SHoward Hinnant : __first_(_VSTD::forward<_T1_param>(__t1)), __second_(_VSTD::forward<_T2_param>(__t2)) {} 19933e519524SHoward Hinnant 19945a33687dSHoward Hinnant#ifdef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS 19955a33687dSHoward Hinnant 19965a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19975a33687dSHoward Hinnant __libcpp_compressed_pair_imp(const __libcpp_compressed_pair_imp& __p) 19985a33687dSHoward Hinnant _NOEXCEPT_(is_nothrow_copy_constructible<_T1>::value && 19995a33687dSHoward Hinnant is_nothrow_copy_constructible<_T2>::value) 20005a33687dSHoward Hinnant : __first_(__p.first()), 20015a33687dSHoward Hinnant __second_(__p.second()) {} 20025a33687dSHoward Hinnant 20035a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20045a33687dSHoward Hinnant __libcpp_compressed_pair_imp& operator=(const __libcpp_compressed_pair_imp& __p) 20055a33687dSHoward Hinnant _NOEXCEPT_(is_nothrow_copy_assignable<_T1>::value && 20065a33687dSHoward Hinnant is_nothrow_copy_assignable<_T2>::value) 20075a33687dSHoward Hinnant { 20085a33687dSHoward Hinnant __first_ = __p.first(); 20095a33687dSHoward Hinnant __second_ = __p.second(); 20105a33687dSHoward Hinnant return *this; 20115a33687dSHoward Hinnant } 20125a33687dSHoward Hinnant 20137609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 20145a33687dSHoward Hinnant 20155a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20165a33687dSHoward Hinnant __libcpp_compressed_pair_imp(__libcpp_compressed_pair_imp&& __p) 20173739fe79SHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<_T1>::value && 20183739fe79SHoward Hinnant is_nothrow_move_constructible<_T2>::value) 20195a33687dSHoward Hinnant : __first_(_VSTD::forward<_T1>(__p.first())), 20205a33687dSHoward Hinnant __second_(_VSTD::forward<_T2>(__p.second())) {} 20215a33687dSHoward Hinnant 20225a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20235a33687dSHoward Hinnant __libcpp_compressed_pair_imp& operator=(__libcpp_compressed_pair_imp&& __p) 20245a33687dSHoward Hinnant _NOEXCEPT_(is_nothrow_move_assignable<_T1>::value && 20255a33687dSHoward Hinnant is_nothrow_move_assignable<_T2>::value) 20265a33687dSHoward Hinnant { 20275a33687dSHoward Hinnant __first_ = _VSTD::forward<_T1>(__p.first()); 20285a33687dSHoward Hinnant __second_ = _VSTD::forward<_T2>(__p.second()); 20295a33687dSHoward Hinnant return *this; 20305a33687dSHoward Hinnant } 20315a33687dSHoward Hinnant 2032a87b5e34SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 2033a87b5e34SHoward Hinnant 2034a87b5e34SHoward Hinnant template <class... _Args1, class... _Args2, size_t... _I1, size_t... _I2> 2035a87b5e34SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2036a87b5e34SHoward Hinnant __libcpp_compressed_pair_imp(piecewise_construct_t __pc, 2037a87b5e34SHoward Hinnant tuple<_Args1...> __first_args, 2038a87b5e34SHoward Hinnant tuple<_Args2...> __second_args, 2039a87b5e34SHoward Hinnant __tuple_indices<_I1...>, 2040a87b5e34SHoward Hinnant __tuple_indices<_I2...>) 2041a87b5e34SHoward Hinnant : __first_(_VSTD::forward<_Args1>(get<_I1>(__first_args))...), 2042a87b5e34SHoward Hinnant __second_(_VSTD::forward<_Args2>(get<_I2>(__second_args))...) 2043a87b5e34SHoward Hinnant {} 2044a87b5e34SHoward Hinnant 2045a87b5e34SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 2046a87b5e34SHoward Hinnant 20477609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 20483e519524SHoward Hinnant 20495a33687dSHoward Hinnant#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS 20505a33687dSHoward Hinnant 20513739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return __first_;} 20523739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return __first_;} 20533e519524SHoward Hinnant 20543739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_reference second() _NOEXCEPT {return __second_;} 20553739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_const_reference second() const _NOEXCEPT {return __second_;} 20563e519524SHoward Hinnant 20573e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void swap(__libcpp_compressed_pair_imp& __x) 20583739fe79SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && 20593739fe79SHoward Hinnant __is_nothrow_swappable<_T1>::value) 20603e519524SHoward Hinnant { 2061ce48a113SHoward Hinnant using _VSTD::swap; 20623e519524SHoward Hinnant swap(__first_, __x.__first_); 20633e519524SHoward Hinnant swap(__second_, __x.__second_); 20643e519524SHoward Hinnant } 20653e519524SHoward Hinnant}; 20663e519524SHoward Hinnant 20673e519524SHoward Hinnanttemplate <class _T1, class _T2> 20683e519524SHoward Hinnantclass __libcpp_compressed_pair_imp<_T1, _T2, 1> 20693e519524SHoward Hinnant : private _T1 20703e519524SHoward Hinnant{ 20713e519524SHoward Hinnantprivate: 20723e519524SHoward Hinnant _T2 __second_; 20733e519524SHoward Hinnantpublic: 20743e519524SHoward Hinnant typedef _T1 _T1_param; 20753e519524SHoward Hinnant typedef _T2 _T2_param; 20763e519524SHoward Hinnant 20773e519524SHoward Hinnant typedef _T1& _T1_reference; 20783e519524SHoward Hinnant typedef typename remove_reference<_T2>::type& _T2_reference; 20793e519524SHoward Hinnant 20803e519524SHoward Hinnant typedef const _T1& _T1_const_reference; 20813e519524SHoward Hinnant typedef const typename remove_reference<_T2>::type& _T2_const_reference; 20823e519524SHoward Hinnant 20833e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp() {} 20848e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T1_param __t1) 2085ce48a113SHoward Hinnant : _T1(_VSTD::forward<_T1_param>(__t1)) {} 20868e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T2_param __t2) 2087ce48a113SHoward Hinnant : __second_(_VSTD::forward<_T2_param>(__t2)) {} 20883e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(_T1_param __t1, _T2_param __t2) 2089ce48a113SHoward Hinnant : _T1(_VSTD::forward<_T1_param>(__t1)), __second_(_VSTD::forward<_T2_param>(__t2)) {} 20903e519524SHoward Hinnant 20915a33687dSHoward Hinnant#ifdef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS 20925a33687dSHoward Hinnant 20935a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20945a33687dSHoward Hinnant __libcpp_compressed_pair_imp(const __libcpp_compressed_pair_imp& __p) 20955a33687dSHoward Hinnant _NOEXCEPT_(is_nothrow_copy_constructible<_T1>::value && 20965a33687dSHoward Hinnant is_nothrow_copy_constructible<_T2>::value) 20975a33687dSHoward Hinnant : _T1(__p.first()), __second_(__p.second()) {} 20985a33687dSHoward Hinnant 20995a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 21005a33687dSHoward Hinnant __libcpp_compressed_pair_imp& operator=(const __libcpp_compressed_pair_imp& __p) 21015a33687dSHoward Hinnant _NOEXCEPT_(is_nothrow_copy_assignable<_T1>::value && 21025a33687dSHoward Hinnant is_nothrow_copy_assignable<_T2>::value) 21035a33687dSHoward Hinnant { 21045a33687dSHoward Hinnant _T1::operator=(__p.first()); 21055a33687dSHoward Hinnant __second_ = __p.second(); 21065a33687dSHoward Hinnant return *this; 21075a33687dSHoward Hinnant } 21085a33687dSHoward Hinnant 21097609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 21105a33687dSHoward Hinnant 21115a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 21125a33687dSHoward Hinnant __libcpp_compressed_pair_imp(__libcpp_compressed_pair_imp&& __p) 21133739fe79SHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<_T1>::value && 21143739fe79SHoward Hinnant is_nothrow_move_constructible<_T2>::value) 2115ce48a113SHoward Hinnant : _T1(_VSTD::move(__p.first())), __second_(_VSTD::forward<_T2>(__p.second())) {} 21165a33687dSHoward Hinnant 21175a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 21185a33687dSHoward Hinnant __libcpp_compressed_pair_imp& operator=(__libcpp_compressed_pair_imp&& __p) 21195a33687dSHoward Hinnant _NOEXCEPT_(is_nothrow_move_assignable<_T1>::value && 21205a33687dSHoward Hinnant is_nothrow_move_assignable<_T2>::value) 21215a33687dSHoward Hinnant { 21225a33687dSHoward Hinnant _T1::operator=(_VSTD::move(__p.first())); 21235a33687dSHoward Hinnant __second_ = _VSTD::forward<_T2>(__p.second()); 21245a33687dSHoward Hinnant return *this; 21255a33687dSHoward Hinnant } 21265a33687dSHoward Hinnant 2127a87b5e34SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 2128a87b5e34SHoward Hinnant 2129a87b5e34SHoward Hinnant template <class... _Args1, class... _Args2, size_t... _I1, size_t... _I2> 2130a87b5e34SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2131a87b5e34SHoward Hinnant __libcpp_compressed_pair_imp(piecewise_construct_t __pc, 2132a87b5e34SHoward Hinnant tuple<_Args1...> __first_args, 2133a87b5e34SHoward Hinnant tuple<_Args2...> __second_args, 2134a87b5e34SHoward Hinnant __tuple_indices<_I1...>, 2135a87b5e34SHoward Hinnant __tuple_indices<_I2...>) 2136a87b5e34SHoward Hinnant : _T1(_VSTD::forward<_Args1>(get<_I1>(__first_args))...), 2137a87b5e34SHoward Hinnant __second_(_VSTD::forward<_Args2>(get<_I2>(__second_args))...) 2138a87b5e34SHoward Hinnant {} 2139a87b5e34SHoward Hinnant 2140a87b5e34SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 2141a87b5e34SHoward Hinnant 21427609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 21433e519524SHoward Hinnant 21445a33687dSHoward Hinnant#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS 21455a33687dSHoward Hinnant 21463739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return *this;} 21473739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return *this;} 21483e519524SHoward Hinnant 21493739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_reference second() _NOEXCEPT {return __second_;} 21503739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_const_reference second() const _NOEXCEPT {return __second_;} 21513e519524SHoward Hinnant 21523e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void swap(__libcpp_compressed_pair_imp& __x) 21533739fe79SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && 21543739fe79SHoward Hinnant __is_nothrow_swappable<_T1>::value) 21553e519524SHoward Hinnant { 2156ce48a113SHoward Hinnant using _VSTD::swap; 21573e519524SHoward Hinnant swap(__second_, __x.__second_); 21583e519524SHoward Hinnant } 21593e519524SHoward Hinnant}; 21603e519524SHoward Hinnant 21613e519524SHoward Hinnanttemplate <class _T1, class _T2> 21623e519524SHoward Hinnantclass __libcpp_compressed_pair_imp<_T1, _T2, 2> 21633e519524SHoward Hinnant : private _T2 21643e519524SHoward Hinnant{ 21653e519524SHoward Hinnantprivate: 21663e519524SHoward Hinnant _T1 __first_; 21673e519524SHoward Hinnantpublic: 21683e519524SHoward Hinnant typedef _T1 _T1_param; 21693e519524SHoward Hinnant typedef _T2 _T2_param; 21703e519524SHoward Hinnant 21713e519524SHoward Hinnant typedef typename remove_reference<_T1>::type& _T1_reference; 21723e519524SHoward Hinnant typedef _T2& _T2_reference; 21733e519524SHoward Hinnant 21743e519524SHoward Hinnant typedef const typename remove_reference<_T1>::type& _T1_const_reference; 21753e519524SHoward Hinnant typedef const _T2& _T2_const_reference; 21763e519524SHoward Hinnant 21773e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp() {} 21783e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T1_param __t1) 2179ce48a113SHoward Hinnant : __first_(_VSTD::forward<_T1_param>(__t1)) {} 21803e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T2_param __t2) 2181ce48a113SHoward Hinnant : _T2(_VSTD::forward<_T2_param>(__t2)) {} 21823e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(_T1_param __t1, _T2_param __t2) 21833739fe79SHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<_T1>::value && 21843739fe79SHoward Hinnant is_nothrow_move_constructible<_T2>::value) 2185ce48a113SHoward Hinnant : _T2(_VSTD::forward<_T2_param>(__t2)), __first_(_VSTD::forward<_T1_param>(__t1)) {} 21863e519524SHoward Hinnant 21875a33687dSHoward Hinnant#ifdef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS 21885a33687dSHoward Hinnant 21895a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 21905a33687dSHoward Hinnant __libcpp_compressed_pair_imp(const __libcpp_compressed_pair_imp& __p) 21915a33687dSHoward Hinnant _NOEXCEPT_(is_nothrow_copy_constructible<_T1>::value && 21925a33687dSHoward Hinnant is_nothrow_copy_constructible<_T2>::value) 21935a33687dSHoward Hinnant : _T2(__p.second()), __first_(__p.first()) {} 21945a33687dSHoward Hinnant 21955a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 21965a33687dSHoward Hinnant __libcpp_compressed_pair_imp& operator=(const __libcpp_compressed_pair_imp& __p) 21975a33687dSHoward Hinnant _NOEXCEPT_(is_nothrow_copy_assignable<_T1>::value && 21985a33687dSHoward Hinnant is_nothrow_copy_assignable<_T2>::value) 21995a33687dSHoward Hinnant { 22005a33687dSHoward Hinnant _T2::operator=(__p.second()); 22015a33687dSHoward Hinnant __first_ = __p.first(); 22025a33687dSHoward Hinnant return *this; 22035a33687dSHoward Hinnant } 22045a33687dSHoward Hinnant 22057609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 22065a33687dSHoward Hinnant 22075a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22083e519524SHoward Hinnant __libcpp_compressed_pair_imp(__libcpp_compressed_pair_imp&& __p) 22095a33687dSHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<_T1>::value && 22105a33687dSHoward Hinnant is_nothrow_move_constructible<_T2>::value) 2211ce48a113SHoward Hinnant : _T2(_VSTD::forward<_T2>(__p.second())), __first_(_VSTD::move(__p.first())) {} 22125a33687dSHoward Hinnant 22135a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22145a33687dSHoward Hinnant __libcpp_compressed_pair_imp& operator=(__libcpp_compressed_pair_imp&& __p) 22155a33687dSHoward Hinnant _NOEXCEPT_(is_nothrow_move_assignable<_T1>::value && 22165a33687dSHoward Hinnant is_nothrow_move_assignable<_T2>::value) 22175a33687dSHoward Hinnant { 22185a33687dSHoward Hinnant _T2::operator=(_VSTD::forward<_T2>(__p.second())); 22195a33687dSHoward Hinnant __first_ = _VSTD::move(__p.first()); 22205a33687dSHoward Hinnant return *this; 22215a33687dSHoward Hinnant } 22225a33687dSHoward Hinnant 2223a87b5e34SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 2224a87b5e34SHoward Hinnant 2225a87b5e34SHoward Hinnant template <class... _Args1, class... _Args2, size_t... _I1, size_t... _I2> 2226a87b5e34SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2227a87b5e34SHoward Hinnant __libcpp_compressed_pair_imp(piecewise_construct_t __pc, 2228a87b5e34SHoward Hinnant tuple<_Args1...> __first_args, 2229a87b5e34SHoward Hinnant tuple<_Args2...> __second_args, 2230a87b5e34SHoward Hinnant __tuple_indices<_I1...>, 2231a87b5e34SHoward Hinnant __tuple_indices<_I2...>) 2232a87b5e34SHoward Hinnant : _T2(_VSTD::forward<_Args2>(get<_I2>(__second_args))...), 2233a87b5e34SHoward Hinnant __first_(_VSTD::forward<_Args1>(get<_I1>(__first_args))...) 2234a87b5e34SHoward Hinnant 2235a87b5e34SHoward Hinnant {} 2236a87b5e34SHoward Hinnant 2237a87b5e34SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 2238a87b5e34SHoward Hinnant 22397609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 22403e519524SHoward Hinnant 22415a33687dSHoward Hinnant#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS 22425a33687dSHoward Hinnant 22433739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return __first_;} 22443739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return __first_;} 22453e519524SHoward Hinnant 22463739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_reference second() _NOEXCEPT {return *this;} 22473739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_const_reference second() const _NOEXCEPT {return *this;} 22483e519524SHoward Hinnant 22493e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void swap(__libcpp_compressed_pair_imp& __x) 22503739fe79SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && 22513739fe79SHoward Hinnant __is_nothrow_swappable<_T1>::value) 22523e519524SHoward Hinnant { 2253ce48a113SHoward Hinnant using _VSTD::swap; 22543e519524SHoward Hinnant swap(__first_, __x.__first_); 22553e519524SHoward Hinnant } 22563e519524SHoward Hinnant}; 22573e519524SHoward Hinnant 22583e519524SHoward Hinnanttemplate <class _T1, class _T2> 22593e519524SHoward Hinnantclass __libcpp_compressed_pair_imp<_T1, _T2, 3> 22603e519524SHoward Hinnant : private _T1, 22613e519524SHoward Hinnant private _T2 22623e519524SHoward Hinnant{ 22633e519524SHoward Hinnantpublic: 22643e519524SHoward Hinnant typedef _T1 _T1_param; 22653e519524SHoward Hinnant typedef _T2 _T2_param; 22663e519524SHoward Hinnant 22673e519524SHoward Hinnant typedef _T1& _T1_reference; 22683e519524SHoward Hinnant typedef _T2& _T2_reference; 22693e519524SHoward Hinnant 22703e519524SHoward Hinnant typedef const _T1& _T1_const_reference; 22713e519524SHoward Hinnant typedef const _T2& _T2_const_reference; 22723e519524SHoward Hinnant 22733e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp() {} 22743e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T1_param __t1) 2275ce48a113SHoward Hinnant : _T1(_VSTD::forward<_T1_param>(__t1)) {} 22763e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T2_param __t2) 2277ce48a113SHoward Hinnant : _T2(_VSTD::forward<_T2_param>(__t2)) {} 22783e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(_T1_param __t1, _T2_param __t2) 2279ce48a113SHoward Hinnant : _T1(_VSTD::forward<_T1_param>(__t1)), _T2(_VSTD::forward<_T2_param>(__t2)) {} 22803e519524SHoward Hinnant 22815a33687dSHoward Hinnant#ifdef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS 22825a33687dSHoward Hinnant 22835a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22845a33687dSHoward Hinnant __libcpp_compressed_pair_imp(const __libcpp_compressed_pair_imp& __p) 22855a33687dSHoward Hinnant _NOEXCEPT_(is_nothrow_copy_constructible<_T1>::value && 22865a33687dSHoward Hinnant is_nothrow_copy_constructible<_T2>::value) 22875a33687dSHoward Hinnant : _T1(__p.first()), _T2(__p.second()) {} 22885a33687dSHoward Hinnant 22895a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22905a33687dSHoward Hinnant __libcpp_compressed_pair_imp& operator=(const __libcpp_compressed_pair_imp& __p) 22915a33687dSHoward Hinnant _NOEXCEPT_(is_nothrow_copy_assignable<_T1>::value && 22925a33687dSHoward Hinnant is_nothrow_copy_assignable<_T2>::value) 22935a33687dSHoward Hinnant { 22945a33687dSHoward Hinnant _T1::operator=(__p.first()); 22955a33687dSHoward Hinnant _T2::operator=(__p.second()); 22965a33687dSHoward Hinnant return *this; 22975a33687dSHoward Hinnant } 22985a33687dSHoward Hinnant 22997609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 23005a33687dSHoward Hinnant 23015a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 23025a33687dSHoward Hinnant __libcpp_compressed_pair_imp(__libcpp_compressed_pair_imp&& __p) 23033739fe79SHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<_T1>::value && 23043739fe79SHoward Hinnant is_nothrow_move_constructible<_T2>::value) 2305ce48a113SHoward Hinnant : _T1(_VSTD::move(__p.first())), _T2(_VSTD::move(__p.second())) {} 23065a33687dSHoward Hinnant 23075a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 23085a33687dSHoward Hinnant __libcpp_compressed_pair_imp& operator=(__libcpp_compressed_pair_imp&& __p) 23095a33687dSHoward Hinnant _NOEXCEPT_(is_nothrow_move_assignable<_T1>::value && 23105a33687dSHoward Hinnant is_nothrow_move_assignable<_T2>::value) 23115a33687dSHoward Hinnant { 23125a33687dSHoward Hinnant _T1::operator=(_VSTD::move(__p.first())); 23135a33687dSHoward Hinnant _T2::operator=(_VSTD::move(__p.second())); 23145a33687dSHoward Hinnant return *this; 23155a33687dSHoward Hinnant } 23165a33687dSHoward Hinnant 2317a87b5e34SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 2318a87b5e34SHoward Hinnant 2319a87b5e34SHoward Hinnant template <class... _Args1, class... _Args2, size_t... _I1, size_t... _I2> 2320a87b5e34SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2321a87b5e34SHoward Hinnant __libcpp_compressed_pair_imp(piecewise_construct_t __pc, 2322a87b5e34SHoward Hinnant tuple<_Args1...> __first_args, 2323a87b5e34SHoward Hinnant tuple<_Args2...> __second_args, 2324a87b5e34SHoward Hinnant __tuple_indices<_I1...>, 2325a87b5e34SHoward Hinnant __tuple_indices<_I2...>) 2326a87b5e34SHoward Hinnant : _T1(_VSTD::forward<_Args1>(get<_I1>(__first_args))...), 2327a87b5e34SHoward Hinnant _T2(_VSTD::forward<_Args2>(get<_I2>(__second_args))...) 2328a87b5e34SHoward Hinnant {} 2329a87b5e34SHoward Hinnant 2330a87b5e34SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 2331a87b5e34SHoward Hinnant 23327609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 23333e519524SHoward Hinnant 23345a33687dSHoward Hinnant#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS 23355a33687dSHoward Hinnant 23363739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return *this;} 23373739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return *this;} 23383e519524SHoward Hinnant 23393739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_reference second() _NOEXCEPT {return *this;} 23403739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_const_reference second() const _NOEXCEPT {return *this;} 23413e519524SHoward Hinnant 2342c206366fSHoward Hinnant _LIBCPP_INLINE_VISIBILITY void swap(__libcpp_compressed_pair_imp&) 23433739fe79SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && 23443739fe79SHoward Hinnant __is_nothrow_swappable<_T1>::value) 23453e519524SHoward Hinnant { 23463e519524SHoward Hinnant } 23473e519524SHoward Hinnant}; 23483e519524SHoward Hinnant 23493e519524SHoward Hinnanttemplate <class _T1, class _T2> 23503e519524SHoward Hinnantclass __compressed_pair 23513e519524SHoward Hinnant : private __libcpp_compressed_pair_imp<_T1, _T2> 23523e519524SHoward Hinnant{ 23533e519524SHoward Hinnant typedef __libcpp_compressed_pair_imp<_T1, _T2> base; 23543e519524SHoward Hinnantpublic: 23553e519524SHoward Hinnant typedef typename base::_T1_param _T1_param; 23563e519524SHoward Hinnant typedef typename base::_T2_param _T2_param; 23573e519524SHoward Hinnant 23583e519524SHoward Hinnant typedef typename base::_T1_reference _T1_reference; 23593e519524SHoward Hinnant typedef typename base::_T2_reference _T2_reference; 23603e519524SHoward Hinnant 23613e519524SHoward Hinnant typedef typename base::_T1_const_reference _T1_const_reference; 23623e519524SHoward Hinnant typedef typename base::_T2_const_reference _T2_const_reference; 23633e519524SHoward Hinnant 23643e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __compressed_pair() {} 23658e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __compressed_pair(_T1_param __t1) 2366ce48a113SHoward Hinnant : base(_VSTD::forward<_T1_param>(__t1)) {} 23678e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __compressed_pair(_T2_param __t2) 2368ce48a113SHoward Hinnant : base(_VSTD::forward<_T2_param>(__t2)) {} 23693e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __compressed_pair(_T1_param __t1, _T2_param __t2) 2370ce48a113SHoward Hinnant : base(_VSTD::forward<_T1_param>(__t1), _VSTD::forward<_T2_param>(__t2)) {} 23713e519524SHoward Hinnant 23725a33687dSHoward Hinnant#ifdef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS 23735a33687dSHoward Hinnant 23745a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 23755a33687dSHoward Hinnant __compressed_pair(const __compressed_pair& __p) 23765a33687dSHoward Hinnant _NOEXCEPT_(is_nothrow_copy_constructible<_T1>::value && 23775a33687dSHoward Hinnant is_nothrow_copy_constructible<_T2>::value) 23785a33687dSHoward Hinnant : base(__p) {} 23795a33687dSHoward Hinnant 23805a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 23815a33687dSHoward Hinnant __compressed_pair& operator=(const __compressed_pair& __p) 23825a33687dSHoward Hinnant _NOEXCEPT_(is_nothrow_copy_assignable<_T1>::value && 23835a33687dSHoward Hinnant is_nothrow_copy_assignable<_T2>::value) 23845a33687dSHoward Hinnant { 23855a33687dSHoward Hinnant base::operator=(__p); 23865a33687dSHoward Hinnant return *this; 23875a33687dSHoward Hinnant } 23885a33687dSHoward Hinnant 23897609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 23905a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 23913e519524SHoward Hinnant __compressed_pair(__compressed_pair&& __p) 23923739fe79SHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<_T1>::value && 23933739fe79SHoward Hinnant is_nothrow_move_constructible<_T2>::value) 2394ce48a113SHoward Hinnant : base(_VSTD::move(__p)) {} 23955a33687dSHoward Hinnant 23965a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 23975a33687dSHoward Hinnant __compressed_pair& operator=(__compressed_pair&& __p) 23985a33687dSHoward Hinnant _NOEXCEPT_(is_nothrow_move_assignable<_T1>::value && 23995a33687dSHoward Hinnant is_nothrow_move_assignable<_T2>::value) 24005a33687dSHoward Hinnant { 24015a33687dSHoward Hinnant base::operator=(_VSTD::move(__p)); 24025a33687dSHoward Hinnant return *this; 24035a33687dSHoward Hinnant } 2404a87b5e34SHoward Hinnant 2405a87b5e34SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 2406a87b5e34SHoward Hinnant 2407a87b5e34SHoward Hinnant template <class... _Args1, class... _Args2> 2408a87b5e34SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2409a87b5e34SHoward Hinnant __compressed_pair(piecewise_construct_t __pc, tuple<_Args1...> __first_args, 2410a87b5e34SHoward Hinnant tuple<_Args2...> __second_args) 24118e25104bSHoward Hinnant : base(__pc, _VSTD::move(__first_args), _VSTD::move(__second_args), 2412a87b5e34SHoward Hinnant typename __make_tuple_indices<sizeof...(_Args1)>::type(), 2413a87b5e34SHoward Hinnant typename __make_tuple_indices<sizeof...(_Args2) >::type()) 2414a87b5e34SHoward Hinnant {} 2415a87b5e34SHoward Hinnant 2416a87b5e34SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 2417a87b5e34SHoward Hinnant 24187609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 24193e519524SHoward Hinnant 24205a33687dSHoward Hinnant#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS 24215a33687dSHoward Hinnant 24223739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return base::first();} 24233739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return base::first();} 24243e519524SHoward Hinnant 24253739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_reference second() _NOEXCEPT {return base::second();} 24263739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_const_reference second() const _NOEXCEPT {return base::second();} 24273e519524SHoward Hinnant 24283739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void swap(__compressed_pair& __x) 24293739fe79SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && 24303739fe79SHoward Hinnant __is_nothrow_swappable<_T1>::value) 24313739fe79SHoward Hinnant {base::swap(__x);} 24323e519524SHoward Hinnant}; 24333e519524SHoward Hinnant 24343e519524SHoward Hinnanttemplate <class _T1, class _T2> 24353e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 24363e519524SHoward Hinnantvoid 24373e519524SHoward Hinnantswap(__compressed_pair<_T1, _T2>& __x, __compressed_pair<_T1, _T2>& __y) 24383739fe79SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && 24393739fe79SHoward Hinnant __is_nothrow_swappable<_T1>::value) 24403e519524SHoward Hinnant {__x.swap(__y);} 24413e519524SHoward Hinnant 24428e25104bSHoward Hinnant// __same_or_less_cv_qualified 24438e25104bSHoward Hinnant 24448e25104bSHoward Hinnanttemplate <class _Ptr1, class _Ptr2, 24458e25104bSHoward Hinnant bool = is_same<typename remove_cv<typename pointer_traits<_Ptr1>::element_type>::type, 24468e25104bSHoward Hinnant typename remove_cv<typename pointer_traits<_Ptr2>::element_type>::type 24478e25104bSHoward Hinnant >::value 24488e25104bSHoward Hinnant > 24498e25104bSHoward Hinnantstruct __same_or_less_cv_qualified_imp 24508e25104bSHoward Hinnant : is_convertible<_Ptr1, _Ptr2> {}; 24518e25104bSHoward Hinnant 24528e25104bSHoward Hinnanttemplate <class _Ptr1, class _Ptr2> 24538e25104bSHoward Hinnantstruct __same_or_less_cv_qualified_imp<_Ptr1, _Ptr2, false> 24548e25104bSHoward Hinnant : false_type {}; 24558e25104bSHoward Hinnant 24568e25104bSHoward Hinnanttemplate <class _Ptr1, class _Ptr2, bool = is_scalar<_Ptr1>::value && 24578e25104bSHoward Hinnant !is_pointer<_Ptr1>::value> 24588e25104bSHoward Hinnantstruct __same_or_less_cv_qualified 24598e25104bSHoward Hinnant : __same_or_less_cv_qualified_imp<_Ptr1, _Ptr2> {}; 24608e25104bSHoward Hinnant 24618e25104bSHoward Hinnanttemplate <class _Ptr1, class _Ptr2> 24628e25104bSHoward Hinnantstruct __same_or_less_cv_qualified<_Ptr1, _Ptr2, true> 24638e25104bSHoward Hinnant : false_type {}; 24648e25104bSHoward Hinnant 24658e25104bSHoward Hinnant// default_delete 24668e25104bSHoward Hinnant 24673e519524SHoward Hinnanttemplate <class _Tp> 2468848a5374SHoward Hinnantstruct _LIBCPP_VISIBLE default_delete 24693e519524SHoward Hinnant{ 2470*c0937e8aSHoward Hinnant#ifndef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS 2471*c0937e8aSHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR default_delete() _NOEXCEPT = default; 2472*c0937e8aSHoward Hinnant#else 2473*c0937e8aSHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR default_delete() _NOEXCEPT {} 2474*c0937e8aSHoward Hinnant#endif 24753e519524SHoward Hinnant template <class _Up> 24763e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY default_delete(const default_delete<_Up>&, 24773739fe79SHoward Hinnant typename enable_if<is_convertible<_Up*, _Tp*>::value>::type* = 0) _NOEXCEPT {} 24783739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void operator() (_Tp* __ptr) const _NOEXCEPT 24793e519524SHoward Hinnant { 24803e519524SHoward Hinnant static_assert(sizeof(_Tp) > 0, "default_delete can not delete incomplete type"); 24813e519524SHoward Hinnant delete __ptr; 24823e519524SHoward Hinnant } 24833e519524SHoward Hinnant}; 24843e519524SHoward Hinnant 24853e519524SHoward Hinnanttemplate <class _Tp> 2486848a5374SHoward Hinnantstruct _LIBCPP_VISIBLE default_delete<_Tp[]> 24873e519524SHoward Hinnant{ 2488e4097ad7SHoward Hinnantpublic: 2489*c0937e8aSHoward Hinnant#ifndef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS 2490*c0937e8aSHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR default_delete() _NOEXCEPT = default; 2491*c0937e8aSHoward Hinnant#else 2492*c0937e8aSHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR default_delete() _NOEXCEPT {} 2493*c0937e8aSHoward Hinnant#endif 2494e4097ad7SHoward Hinnant template <class _Up> 2495e4097ad7SHoward Hinnant _LIBCPP_INLINE_VISIBILITY default_delete(const default_delete<_Up[]>&, 24968e25104bSHoward Hinnant typename enable_if<__same_or_less_cv_qualified<_Up*, _Tp*>::value>::type* = 0) _NOEXCEPT {} 2497e4097ad7SHoward Hinnant template <class _Up> 2498e4097ad7SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2499e4097ad7SHoward Hinnant void operator() (_Up* __ptr, 25008e25104bSHoward Hinnant typename enable_if<__same_or_less_cv_qualified<_Up*, _Tp*>::value>::type* = 0) const _NOEXCEPT 25013e519524SHoward Hinnant { 25023e519524SHoward Hinnant static_assert(sizeof(_Tp) > 0, "default_delete can not delete incomplete type"); 25033e519524SHoward Hinnant delete [] __ptr; 25043e519524SHoward Hinnant } 25053e519524SHoward Hinnant}; 25063e519524SHoward Hinnant 25073e519524SHoward Hinnanttemplate <class _Tp, class _Dp = default_delete<_Tp> > 2508848a5374SHoward Hinnantclass _LIBCPP_VISIBLE unique_ptr 25093e519524SHoward Hinnant{ 25103e519524SHoward Hinnantpublic: 25113e519524SHoward Hinnant typedef _Tp element_type; 25123e519524SHoward Hinnant typedef _Dp deleter_type; 25133e519524SHoward Hinnant typedef typename __pointer_type<_Tp, deleter_type>::type pointer; 25143e519524SHoward Hinnantprivate: 25153e519524SHoward Hinnant __compressed_pair<pointer, deleter_type> __ptr_; 25163e519524SHoward Hinnant 25178e25104bSHoward Hinnant#ifdef _LIBCPP_HAS_NO_RVALUE_REFERENCES 25183e519524SHoward Hinnant unique_ptr(unique_ptr&); 25193e519524SHoward Hinnant template <class _Up, class _Ep> 25203e519524SHoward Hinnant unique_ptr(unique_ptr<_Up, _Ep>&); 25213e519524SHoward Hinnant unique_ptr& operator=(unique_ptr&); 25223e519524SHoward Hinnant template <class _Up, class _Ep> 25233e519524SHoward Hinnant unique_ptr& operator=(unique_ptr<_Up, _Ep>&); 25247609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 25253e519524SHoward Hinnant 25263e519524SHoward Hinnant struct __nat {int __for_bool_;}; 25273e519524SHoward Hinnant 25283e519524SHoward Hinnant typedef typename remove_reference<deleter_type>::type& _Dp_reference; 25293e519524SHoward Hinnant typedef const typename remove_reference<deleter_type>::type& _Dp_const_reference; 25303e519524SHoward Hinnantpublic: 2531*c0937e8aSHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR unique_ptr() _NOEXCEPT 25323e519524SHoward Hinnant : __ptr_(pointer()) 25333e519524SHoward Hinnant { 25343e519524SHoward Hinnant static_assert(!is_pointer<deleter_type>::value, 25353e519524SHoward Hinnant "unique_ptr constructed with null function pointer deleter"); 25363e519524SHoward Hinnant } 2537*c0937e8aSHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR unique_ptr(nullptr_t) _NOEXCEPT 25383e519524SHoward Hinnant : __ptr_(pointer()) 25393e519524SHoward Hinnant { 25403e519524SHoward Hinnant static_assert(!is_pointer<deleter_type>::value, 25413e519524SHoward Hinnant "unique_ptr constructed with null function pointer deleter"); 25423e519524SHoward Hinnant } 25433739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit unique_ptr(pointer __p) _NOEXCEPT 2544ce48a113SHoward Hinnant : __ptr_(_VSTD::move(__p)) 25453e519524SHoward Hinnant { 25463e519524SHoward Hinnant static_assert(!is_pointer<deleter_type>::value, 25473e519524SHoward Hinnant "unique_ptr constructed with null function pointer deleter"); 25483e519524SHoward Hinnant } 25493e519524SHoward Hinnant 25507609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 25513e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(pointer __p, typename conditional< 25523e519524SHoward Hinnant is_reference<deleter_type>::value, 25533e519524SHoward Hinnant deleter_type, 25543e519524SHoward Hinnant typename add_lvalue_reference<const deleter_type>::type>::type __d) 25553739fe79SHoward Hinnant _NOEXCEPT 25563e519524SHoward Hinnant : __ptr_(__p, __d) {} 25573e519524SHoward Hinnant 25583e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(pointer __p, typename remove_reference<deleter_type>::type&& __d) 25593739fe79SHoward Hinnant _NOEXCEPT 2560ce48a113SHoward Hinnant : __ptr_(__p, _VSTD::move(__d)) 25613e519524SHoward Hinnant { 25623e519524SHoward Hinnant static_assert(!is_reference<deleter_type>::value, "rvalue deleter bound to reference"); 25633e519524SHoward Hinnant } 25643739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(unique_ptr&& __u) _NOEXCEPT 2565ce48a113SHoward Hinnant : __ptr_(__u.release(), _VSTD::forward<deleter_type>(__u.get_deleter())) {} 25663e519524SHoward Hinnant template <class _Up, class _Ep> 25673e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 25683e519524SHoward Hinnant unique_ptr(unique_ptr<_Up, _Ep>&& __u, 25693e519524SHoward Hinnant typename enable_if 25703e519524SHoward Hinnant < 25713e519524SHoward Hinnant !is_array<_Up>::value && 25723e519524SHoward Hinnant is_convertible<typename unique_ptr<_Up, _Ep>::pointer, pointer>::value && 25733e519524SHoward Hinnant is_convertible<_Ep, deleter_type>::value && 25743e519524SHoward Hinnant ( 25753e519524SHoward Hinnant !is_reference<deleter_type>::value || 25763e519524SHoward Hinnant is_same<deleter_type, _Ep>::value 25773e519524SHoward Hinnant ), 25783e519524SHoward Hinnant __nat 25793739fe79SHoward Hinnant >::type = __nat()) _NOEXCEPT 2580ce48a113SHoward Hinnant : __ptr_(__u.release(), _VSTD::forward<_Ep>(__u.get_deleter())) {} 25813e519524SHoward Hinnant 25823e519524SHoward Hinnant template <class _Up> 25833e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(auto_ptr<_Up>&& __p, 25843e519524SHoward Hinnant typename enable_if< 25853e519524SHoward Hinnant is_convertible<_Up*, _Tp*>::value && 25863e519524SHoward Hinnant is_same<_Dp, default_delete<_Tp> >::value, 25873e519524SHoward Hinnant __nat 25883739fe79SHoward Hinnant >::type = __nat()) _NOEXCEPT 25893e519524SHoward Hinnant : __ptr_(__p.release()) 25903e519524SHoward Hinnant { 25913e519524SHoward Hinnant } 25923e519524SHoward Hinnant 25933739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(unique_ptr&& __u) _NOEXCEPT 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 26003e519524SHoward Hinnant template <class _Up, class _Ep> 26013e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 26023e519524SHoward Hinnant typename enable_if 26033e519524SHoward Hinnant < 26048e25104bSHoward Hinnant !is_array<_Up>::value && 26058e25104bSHoward Hinnant is_convertible<typename unique_ptr<_Up, _Ep>::pointer, pointer>::value && 26068e25104bSHoward Hinnant is_assignable<deleter_type&, _Ep&&>::value, 26073e519524SHoward Hinnant unique_ptr& 26083e519524SHoward Hinnant >::type 26093739fe79SHoward Hinnant operator=(unique_ptr<_Up, _Ep>&& __u) _NOEXCEPT 26103e519524SHoward Hinnant { 26113e519524SHoward Hinnant reset(__u.release()); 2612ce48a113SHoward Hinnant __ptr_.second() = _VSTD::forward<_Ep>(__u.get_deleter()); 26133e519524SHoward Hinnant return *this; 26143e519524SHoward Hinnant } 26157609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 26163e519524SHoward Hinnant 26173e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY operator __rv<unique_ptr>() 26183e519524SHoward Hinnant { 26193e519524SHoward Hinnant return __rv<unique_ptr>(*this); 26203e519524SHoward Hinnant } 26213e519524SHoward Hinnant 26223e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(__rv<unique_ptr> __u) 2623ce48a113SHoward Hinnant : __ptr_(__u->release(), _VSTD::forward<deleter_type>(__u->get_deleter())) {} 26243e519524SHoward Hinnant 26253e519524SHoward Hinnant template <class _Up, class _Ep> 26263e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(unique_ptr<_Up, _Ep> __u) 26273e519524SHoward Hinnant { 26283e519524SHoward Hinnant reset(__u.release()); 2629ce48a113SHoward Hinnant __ptr_.second() = _VSTD::forward<deleter_type>(__u.get_deleter()); 26303e519524SHoward Hinnant return *this; 26313e519524SHoward Hinnant } 26323e519524SHoward Hinnant 26333e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(pointer __p, deleter_type __d) 2634ce48a113SHoward Hinnant : __ptr_(_VSTD::move(__p), _VSTD::move(__d)) {} 26353e519524SHoward Hinnant 26363e519524SHoward Hinnant template <class _Up> 26373e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 26383e519524SHoward Hinnant typename enable_if< 26393e519524SHoward Hinnant is_convertible<_Up*, _Tp*>::value && 26403e519524SHoward Hinnant is_same<_Dp, default_delete<_Tp> >::value, 26413e519524SHoward Hinnant unique_ptr& 26423e519524SHoward Hinnant >::type 26433e519524SHoward Hinnant operator=(auto_ptr<_Up> __p) 26443e519524SHoward Hinnant {reset(__p.release()); return *this;} 26453e519524SHoward Hinnant 26467609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 26473e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY ~unique_ptr() {reset();} 26483e519524SHoward Hinnant 26493739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(nullptr_t) _NOEXCEPT 26503e519524SHoward Hinnant { 26513e519524SHoward Hinnant reset(); 26523e519524SHoward Hinnant return *this; 26533e519524SHoward Hinnant } 26543e519524SHoward Hinnant 26553e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY typename add_lvalue_reference<_Tp>::type operator*() const 26563e519524SHoward Hinnant {return *__ptr_.first();} 26573739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer operator->() const _NOEXCEPT {return __ptr_.first();} 26583739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer get() const _NOEXCEPT {return __ptr_.first();} 26593739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Dp_reference get_deleter() _NOEXCEPT 26603739fe79SHoward Hinnant {return __ptr_.second();} 26613739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Dp_const_reference get_deleter() const _NOEXCEPT 26623739fe79SHoward Hinnant {return __ptr_.second();} 2663f2f2d8b9SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2664f2f2d8b9SHoward Hinnant _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT 2665f2f2d8b9SHoward Hinnant {return __ptr_.first() != nullptr;} 26663e519524SHoward Hinnant 26673739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer release() _NOEXCEPT 26683e519524SHoward Hinnant { 26693e519524SHoward Hinnant pointer __t = __ptr_.first(); 26703e519524SHoward Hinnant __ptr_.first() = pointer(); 26713e519524SHoward Hinnant return __t; 26723e519524SHoward Hinnant } 26733e519524SHoward Hinnant 26743739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void reset(pointer __p = pointer()) _NOEXCEPT 26753e519524SHoward Hinnant { 26763e519524SHoward Hinnant pointer __tmp = __ptr_.first(); 26773e519524SHoward Hinnant __ptr_.first() = __p; 26783e519524SHoward Hinnant if (__tmp) 26793e519524SHoward Hinnant __ptr_.second()(__tmp); 26803e519524SHoward Hinnant } 26813e519524SHoward Hinnant 26823739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void swap(unique_ptr& __u) _NOEXCEPT 26833739fe79SHoward Hinnant {__ptr_.swap(__u.__ptr_);} 26843e519524SHoward Hinnant}; 26853e519524SHoward Hinnant 26863e519524SHoward Hinnanttemplate <class _Tp, class _Dp> 2687848a5374SHoward Hinnantclass _LIBCPP_VISIBLE unique_ptr<_Tp[], _Dp> 26883e519524SHoward Hinnant{ 26893e519524SHoward Hinnantpublic: 26903e519524SHoward Hinnant typedef _Tp element_type; 26913e519524SHoward Hinnant typedef _Dp deleter_type; 26923e519524SHoward Hinnant typedef typename __pointer_type<_Tp, deleter_type>::type pointer; 26933e519524SHoward Hinnantprivate: 26943e519524SHoward Hinnant __compressed_pair<pointer, deleter_type> __ptr_; 26953e519524SHoward Hinnant 26968e25104bSHoward Hinnant#ifdef _LIBCPP_HAS_NO_RVALUE_REFERENCES 26973e519524SHoward Hinnant unique_ptr(unique_ptr&); 26983e519524SHoward Hinnant template <class _Up> 26993e519524SHoward Hinnant unique_ptr(unique_ptr<_Up>&); 27003e519524SHoward Hinnant unique_ptr& operator=(unique_ptr&); 27013e519524SHoward Hinnant template <class _Up> 27023e519524SHoward Hinnant unique_ptr& operator=(unique_ptr<_Up>&); 27037609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 27043e519524SHoward Hinnant 27053e519524SHoward Hinnant struct __nat {int __for_bool_;}; 27063e519524SHoward Hinnant 27073e519524SHoward Hinnant typedef typename remove_reference<deleter_type>::type& _Dp_reference; 27083e519524SHoward Hinnant typedef const typename remove_reference<deleter_type>::type& _Dp_const_reference; 27093e519524SHoward Hinnantpublic: 2710*c0937e8aSHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR unique_ptr() _NOEXCEPT 27113e519524SHoward Hinnant : __ptr_(pointer()) 27123e519524SHoward Hinnant { 27133e519524SHoward Hinnant static_assert(!is_pointer<deleter_type>::value, 27143e519524SHoward Hinnant "unique_ptr constructed with null function pointer deleter"); 27153e519524SHoward Hinnant } 2716*c0937e8aSHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR unique_ptr(nullptr_t) _NOEXCEPT 27173e519524SHoward Hinnant : __ptr_(pointer()) 27183e519524SHoward Hinnant { 27193e519524SHoward Hinnant static_assert(!is_pointer<deleter_type>::value, 27203e519524SHoward Hinnant "unique_ptr constructed with null function pointer deleter"); 27213e519524SHoward Hinnant } 27227609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 2723c003db1fSHoward Hinnant template <class _Pp, 27248e25104bSHoward Hinnant class = typename enable_if<__same_or_less_cv_qualified<_Pp, pointer>::value>::type 27253e519524SHoward Hinnant > 2726c003db1fSHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit unique_ptr(_Pp __p) _NOEXCEPT 27273e519524SHoward Hinnant : __ptr_(__p) 27283e519524SHoward Hinnant { 27293e519524SHoward Hinnant static_assert(!is_pointer<deleter_type>::value, 27303e519524SHoward Hinnant "unique_ptr constructed with null function pointer deleter"); 27313e519524SHoward Hinnant } 27323e519524SHoward Hinnant 2733c003db1fSHoward Hinnant template <class _Pp, 27348e25104bSHoward Hinnant class = typename enable_if<__same_or_less_cv_qualified<_Pp, pointer>::value>::type 27353e519524SHoward Hinnant > 2736c003db1fSHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(_Pp __p, typename conditional< 27373e519524SHoward Hinnant is_reference<deleter_type>::value, 27383e519524SHoward Hinnant deleter_type, 27393e519524SHoward Hinnant typename add_lvalue_reference<const deleter_type>::type>::type __d) 27403739fe79SHoward Hinnant _NOEXCEPT 27413e519524SHoward Hinnant : __ptr_(__p, __d) {} 27423e519524SHoward Hinnant 27433e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(nullptr_t, typename conditional< 27443e519524SHoward Hinnant is_reference<deleter_type>::value, 27453e519524SHoward Hinnant deleter_type, 27463e519524SHoward Hinnant typename add_lvalue_reference<const deleter_type>::type>::type __d) 27473739fe79SHoward Hinnant _NOEXCEPT 27483e519524SHoward Hinnant : __ptr_(pointer(), __d) {} 27493e519524SHoward Hinnant 2750c003db1fSHoward Hinnant template <class _Pp, 27518e25104bSHoward Hinnant class = typename enable_if<__same_or_less_cv_qualified<_Pp, pointer>::value>::type 27523e519524SHoward Hinnant > 2753c003db1fSHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(_Pp __p, typename remove_reference<deleter_type>::type&& __d) 27543739fe79SHoward Hinnant _NOEXCEPT 2755ce48a113SHoward Hinnant : __ptr_(__p, _VSTD::move(__d)) 27563e519524SHoward Hinnant { 27573e519524SHoward Hinnant static_assert(!is_reference<deleter_type>::value, "rvalue deleter bound to reference"); 27583e519524SHoward Hinnant } 27593e519524SHoward Hinnant 27603e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(nullptr_t, typename remove_reference<deleter_type>::type&& __d) 27613739fe79SHoward Hinnant _NOEXCEPT 2762ce48a113SHoward Hinnant : __ptr_(pointer(), _VSTD::move(__d)) 27633e519524SHoward Hinnant { 27643e519524SHoward Hinnant static_assert(!is_reference<deleter_type>::value, "rvalue deleter bound to reference"); 27653e519524SHoward Hinnant } 27663e519524SHoward Hinnant 27673739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(unique_ptr&& __u) _NOEXCEPT 2768ce48a113SHoward Hinnant : __ptr_(__u.release(), _VSTD::forward<deleter_type>(__u.get_deleter())) {} 27693e519524SHoward Hinnant 27703739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(unique_ptr&& __u) _NOEXCEPT 27713e519524SHoward Hinnant { 27723e519524SHoward Hinnant reset(__u.release()); 2773ce48a113SHoward Hinnant __ptr_.second() = _VSTD::forward<deleter_type>(__u.get_deleter()); 27743e519524SHoward Hinnant return *this; 27753e519524SHoward Hinnant } 2776e4097ad7SHoward Hinnant 2777e4097ad7SHoward Hinnant template <class _Up, class _Ep> 2778e4097ad7SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2779e4097ad7SHoward Hinnant unique_ptr(unique_ptr<_Up, _Ep>&& __u, 2780e4097ad7SHoward Hinnant typename enable_if 2781e4097ad7SHoward Hinnant < 2782e4097ad7SHoward Hinnant is_array<_Up>::value && 27838e25104bSHoward Hinnant __same_or_less_cv_qualified<typename unique_ptr<_Up, _Ep>::pointer, pointer>::value 2784e4097ad7SHoward Hinnant && is_convertible<_Ep, deleter_type>::value && 2785e4097ad7SHoward Hinnant ( 2786e4097ad7SHoward Hinnant !is_reference<deleter_type>::value || 2787e4097ad7SHoward Hinnant is_same<deleter_type, _Ep>::value 2788e4097ad7SHoward Hinnant ), 2789e4097ad7SHoward Hinnant __nat 2790e4097ad7SHoward Hinnant >::type = __nat() 2791e4097ad7SHoward Hinnant ) _NOEXCEPT 2792e4097ad7SHoward Hinnant : __ptr_(__u.release(), _VSTD::forward<deleter_type>(__u.get_deleter())) {} 2793e4097ad7SHoward Hinnant 2794e4097ad7SHoward Hinnant 2795e4097ad7SHoward Hinnant template <class _Up, class _Ep> 2796e4097ad7SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2797e4097ad7SHoward Hinnant typename enable_if 2798e4097ad7SHoward Hinnant < 2799e4097ad7SHoward Hinnant is_array<_Up>::value && 28008e25104bSHoward Hinnant __same_or_less_cv_qualified<typename unique_ptr<_Up, _Ep>::pointer, pointer>::value && 28018e25104bSHoward Hinnant is_assignable<deleter_type&, _Ep&&>::value, 2802e4097ad7SHoward Hinnant unique_ptr& 2803e4097ad7SHoward Hinnant >::type 2804e4097ad7SHoward Hinnant operator=(unique_ptr<_Up, _Ep>&& __u) _NOEXCEPT 2805e4097ad7SHoward Hinnant { 2806e4097ad7SHoward Hinnant reset(__u.release()); 2807e4097ad7SHoward Hinnant __ptr_.second() = _VSTD::forward<_Ep>(__u.get_deleter()); 2808e4097ad7SHoward Hinnant return *this; 2809e4097ad7SHoward Hinnant } 28107609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 28113e519524SHoward Hinnant 28123e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit unique_ptr(pointer __p) 28133e519524SHoward Hinnant : __ptr_(__p) 28143e519524SHoward Hinnant { 28153e519524SHoward Hinnant static_assert(!is_pointer<deleter_type>::value, 28163e519524SHoward Hinnant "unique_ptr constructed with null function pointer deleter"); 28173e519524SHoward Hinnant } 28183e519524SHoward Hinnant 28193e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(pointer __p, deleter_type __d) 2820ce48a113SHoward Hinnant : __ptr_(__p, _VSTD::forward<deleter_type>(__d)) {} 28213e519524SHoward Hinnant 28223e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(nullptr_t, deleter_type __d) 2823ce48a113SHoward Hinnant : __ptr_(pointer(), _VSTD::forward<deleter_type>(__d)) {} 28243e519524SHoward Hinnant 28253e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY operator __rv<unique_ptr>() 28263e519524SHoward Hinnant { 28273e519524SHoward Hinnant return __rv<unique_ptr>(*this); 28283e519524SHoward Hinnant } 28293e519524SHoward Hinnant 28303e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(__rv<unique_ptr> __u) 2831ce48a113SHoward Hinnant : __ptr_(__u->release(), _VSTD::forward<deleter_type>(__u->get_deleter())) {} 28323e519524SHoward Hinnant 28333e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(__rv<unique_ptr> __u) 28343e519524SHoward Hinnant { 28353e519524SHoward Hinnant reset(__u->release()); 2836ce48a113SHoward Hinnant __ptr_.second() = _VSTD::forward<deleter_type>(__u->get_deleter()); 28373e519524SHoward Hinnant return *this; 28383e519524SHoward Hinnant } 28393e519524SHoward Hinnant 28407609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 28413e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY ~unique_ptr() {reset();} 28423e519524SHoward Hinnant 28433739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(nullptr_t) _NOEXCEPT 28443e519524SHoward Hinnant { 28453e519524SHoward Hinnant reset(); 28463e519524SHoward Hinnant return *this; 28473e519524SHoward Hinnant } 28483e519524SHoward Hinnant 28493e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY typename add_lvalue_reference<_Tp>::type operator[](size_t __i) const 28503e519524SHoward Hinnant {return __ptr_.first()[__i];} 28513739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer get() const _NOEXCEPT {return __ptr_.first();} 28523739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Dp_reference get_deleter() _NOEXCEPT 28533739fe79SHoward Hinnant {return __ptr_.second();} 28543739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Dp_const_reference get_deleter() const _NOEXCEPT 28553739fe79SHoward Hinnant {return __ptr_.second();} 2856f2f2d8b9SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2857f2f2d8b9SHoward Hinnant _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT 2858f2f2d8b9SHoward Hinnant {return __ptr_.first() != nullptr;} 28593e519524SHoward Hinnant 28603739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer release() _NOEXCEPT 28613e519524SHoward Hinnant { 28623e519524SHoward Hinnant pointer __t = __ptr_.first(); 28633e519524SHoward Hinnant __ptr_.first() = pointer(); 28643e519524SHoward Hinnant return __t; 28653e519524SHoward Hinnant } 28663e519524SHoward Hinnant 28677609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 2868c003db1fSHoward Hinnant template <class _Pp, 28698e25104bSHoward Hinnant class = typename enable_if<__same_or_less_cv_qualified<_Pp, pointer>::value>::type 28703e519524SHoward Hinnant > 2871c003db1fSHoward Hinnant _LIBCPP_INLINE_VISIBILITY void reset(_Pp __p) _NOEXCEPT 28723e519524SHoward Hinnant { 28733e519524SHoward Hinnant pointer __tmp = __ptr_.first(); 28743e519524SHoward Hinnant __ptr_.first() = __p; 28753e519524SHoward Hinnant if (__tmp) 28763e519524SHoward Hinnant __ptr_.second()(__tmp); 28773e519524SHoward Hinnant } 28783739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void reset(nullptr_t) _NOEXCEPT 28793e519524SHoward Hinnant { 28803e519524SHoward Hinnant pointer __tmp = __ptr_.first(); 28813e519524SHoward Hinnant __ptr_.first() = nullptr; 28823e519524SHoward Hinnant if (__tmp) 28833e519524SHoward Hinnant __ptr_.second()(__tmp); 28843e519524SHoward Hinnant } 28853739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void reset() _NOEXCEPT 28863e519524SHoward Hinnant { 28873e519524SHoward Hinnant pointer __tmp = __ptr_.first(); 28883e519524SHoward Hinnant __ptr_.first() = nullptr; 28893e519524SHoward Hinnant if (__tmp) 28903e519524SHoward Hinnant __ptr_.second()(__tmp); 28913e519524SHoward Hinnant } 28927609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 28933e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void reset(pointer __p = pointer()) 28943e519524SHoward Hinnant { 28953e519524SHoward Hinnant pointer __tmp = __ptr_.first(); 28963e519524SHoward Hinnant __ptr_.first() = __p; 28973e519524SHoward Hinnant if (__tmp) 28983e519524SHoward Hinnant __ptr_.second()(__tmp); 28993e519524SHoward Hinnant } 29007609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 29013e519524SHoward Hinnant 29023e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void swap(unique_ptr& __u) {__ptr_.swap(__u.__ptr_);} 29033e519524SHoward Hinnantprivate: 29043e519524SHoward Hinnant 29057609c9b6SHoward Hinnant#ifdef _LIBCPP_HAS_NO_RVALUE_REFERENCES 29063e519524SHoward Hinnant template <class _Up> 29073e519524SHoward Hinnant explicit unique_ptr(_Up); 29083e519524SHoward Hinnant template <class _Up> 29093e519524SHoward Hinnant unique_ptr(_Up __u, 29103e519524SHoward Hinnant typename conditional< 29113e519524SHoward Hinnant is_reference<deleter_type>::value, 29123e519524SHoward Hinnant deleter_type, 29133e519524SHoward Hinnant typename add_lvalue_reference<const deleter_type>::type>::type, 29143e519524SHoward Hinnant typename enable_if 29153e519524SHoward Hinnant < 29163e519524SHoward Hinnant is_convertible<_Up, pointer>::value, 29173e519524SHoward Hinnant __nat 29183e519524SHoward Hinnant >::type = __nat()); 29197609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 29203e519524SHoward Hinnant}; 29213e519524SHoward Hinnant 29223e519524SHoward Hinnanttemplate <class _Tp, class _Dp> 29233e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 29243e519524SHoward Hinnantvoid 29253739fe79SHoward Hinnantswap(unique_ptr<_Tp, _Dp>& __x, unique_ptr<_Tp, _Dp>& __y) _NOEXCEPT {__x.swap(__y);} 29263e519524SHoward Hinnant 29273e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 29283e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 29293e519524SHoward Hinnantbool 29303e519524SHoward Hinnantoperator==(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return __x.get() == __y.get();} 29313e519524SHoward Hinnant 29323e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 29333e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 29343e519524SHoward Hinnantbool 29353e519524SHoward Hinnantoperator!=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__x == __y);} 29363e519524SHoward Hinnant 29373e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 29383e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 29393e519524SHoward Hinnantbool 294067f39647SHoward Hinnantoperator< (const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) 294167f39647SHoward Hinnant{ 294267f39647SHoward Hinnant typedef typename unique_ptr<_T1, _D1>::pointer _P1; 294367f39647SHoward Hinnant typedef typename unique_ptr<_T2, _D2>::pointer _P2; 294467f39647SHoward Hinnant typedef typename common_type<_P1, _P2>::type _V; 294567f39647SHoward Hinnant return less<_V>()(__x.get(), __y.get()); 294667f39647SHoward Hinnant} 29473e519524SHoward Hinnant 29483e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 29493e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 29503e519524SHoward Hinnantbool 29513e519524SHoward Hinnantoperator> (const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return __y < __x;} 29523e519524SHoward Hinnant 29533e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 29543e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 29553e519524SHoward Hinnantbool 29563e519524SHoward Hinnantoperator<=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__y < __x);} 29573e519524SHoward Hinnant 29583e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 29593e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 29603e519524SHoward Hinnantbool 29613e519524SHoward Hinnantoperator>=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__x < __y);} 29623e519524SHoward Hinnant 296367f39647SHoward Hinnanttemplate <class _T1, class _D1> 296467f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 296567f39647SHoward Hinnantbool 2966*c0937e8aSHoward Hinnantoperator==(const unique_ptr<_T1, _D1>& __x, nullptr_t) _NOEXCEPT 296767f39647SHoward Hinnant{ 296867f39647SHoward Hinnant return !__x; 296967f39647SHoward Hinnant} 297067f39647SHoward Hinnant 297167f39647SHoward Hinnanttemplate <class _T1, class _D1> 297267f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 297367f39647SHoward Hinnantbool 2974*c0937e8aSHoward Hinnantoperator==(nullptr_t, const unique_ptr<_T1, _D1>& __x) _NOEXCEPT 297567f39647SHoward Hinnant{ 297667f39647SHoward Hinnant return !__x; 297767f39647SHoward Hinnant} 297867f39647SHoward Hinnant 297967f39647SHoward Hinnanttemplate <class _T1, class _D1> 298067f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 298167f39647SHoward Hinnantbool 2982*c0937e8aSHoward Hinnantoperator!=(const unique_ptr<_T1, _D1>& __x, nullptr_t) _NOEXCEPT 298367f39647SHoward Hinnant{ 298467f39647SHoward Hinnant return static_cast<bool>(__x); 298567f39647SHoward Hinnant} 298667f39647SHoward Hinnant 298767f39647SHoward Hinnanttemplate <class _T1, class _D1> 298867f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 298967f39647SHoward Hinnantbool 2990*c0937e8aSHoward Hinnantoperator!=(nullptr_t, const unique_ptr<_T1, _D1>& __x) _NOEXCEPT 299167f39647SHoward Hinnant{ 299267f39647SHoward Hinnant return static_cast<bool>(__x); 299367f39647SHoward Hinnant} 299467f39647SHoward Hinnant 299567f39647SHoward Hinnanttemplate <class _T1, class _D1> 299667f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 299767f39647SHoward Hinnantbool 299867f39647SHoward Hinnantoperator<(const unique_ptr<_T1, _D1>& __x, nullptr_t) 299967f39647SHoward Hinnant{ 300067f39647SHoward Hinnant typedef typename unique_ptr<_T1, _D1>::pointer _P1; 300167f39647SHoward Hinnant return less<_P1>()(__x.get(), nullptr); 300267f39647SHoward Hinnant} 300367f39647SHoward Hinnant 300467f39647SHoward Hinnanttemplate <class _T1, class _D1> 300567f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 300667f39647SHoward Hinnantbool 300767f39647SHoward Hinnantoperator<(nullptr_t, const unique_ptr<_T1, _D1>& __x) 300867f39647SHoward Hinnant{ 300967f39647SHoward Hinnant typedef typename unique_ptr<_T1, _D1>::pointer _P1; 301067f39647SHoward Hinnant return less<_P1>()(nullptr, __x.get()); 301167f39647SHoward Hinnant} 301267f39647SHoward Hinnant 301367f39647SHoward Hinnanttemplate <class _T1, class _D1> 301467f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 301567f39647SHoward Hinnantbool 301667f39647SHoward Hinnantoperator>(const unique_ptr<_T1, _D1>& __x, nullptr_t) 301767f39647SHoward Hinnant{ 301867f39647SHoward Hinnant return nullptr < __x; 301967f39647SHoward Hinnant} 302067f39647SHoward Hinnant 302167f39647SHoward Hinnanttemplate <class _T1, class _D1> 302267f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 302367f39647SHoward Hinnantbool 302467f39647SHoward Hinnantoperator>(nullptr_t, const unique_ptr<_T1, _D1>& __x) 302567f39647SHoward Hinnant{ 302667f39647SHoward Hinnant return __x < nullptr; 302767f39647SHoward Hinnant} 302867f39647SHoward Hinnant 302967f39647SHoward Hinnanttemplate <class _T1, class _D1> 303067f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 303167f39647SHoward Hinnantbool 303267f39647SHoward Hinnantoperator<=(const unique_ptr<_T1, _D1>& __x, nullptr_t) 303367f39647SHoward Hinnant{ 303467f39647SHoward Hinnant return !(nullptr < __x); 303567f39647SHoward Hinnant} 303667f39647SHoward Hinnant 303767f39647SHoward Hinnanttemplate <class _T1, class _D1> 303867f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 303967f39647SHoward Hinnantbool 304067f39647SHoward Hinnantoperator<=(nullptr_t, const unique_ptr<_T1, _D1>& __x) 304167f39647SHoward Hinnant{ 304267f39647SHoward Hinnant return !(__x < nullptr); 304367f39647SHoward Hinnant} 304467f39647SHoward Hinnant 304567f39647SHoward Hinnanttemplate <class _T1, class _D1> 304667f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 304767f39647SHoward Hinnantbool 304867f39647SHoward Hinnantoperator>=(const unique_ptr<_T1, _D1>& __x, nullptr_t) 304967f39647SHoward Hinnant{ 305067f39647SHoward Hinnant return !(__x < nullptr); 305167f39647SHoward Hinnant} 305267f39647SHoward Hinnant 305367f39647SHoward Hinnanttemplate <class _T1, class _D1> 305467f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 305567f39647SHoward Hinnantbool 305667f39647SHoward Hinnantoperator>=(nullptr_t, const unique_ptr<_T1, _D1>& __x) 305767f39647SHoward Hinnant{ 305867f39647SHoward Hinnant return !(nullptr < __x); 305967f39647SHoward Hinnant} 306067f39647SHoward Hinnant 3061bff1bfc6SHoward Hinnant#ifdef _LIBCPP_HAS_NO_RVALUE_REFERENCES 3062bff1bfc6SHoward Hinnant 3063bff1bfc6SHoward Hinnanttemplate <class _Tp, class _Dp> 3064bff1bfc6SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 3065bff1bfc6SHoward Hinnantunique_ptr<_Tp, _Dp> 3066bff1bfc6SHoward Hinnantmove(unique_ptr<_Tp, _Dp>& __t) 3067bff1bfc6SHoward Hinnant{ 3068bff1bfc6SHoward Hinnant return unique_ptr<_Tp, _Dp>(__rv<unique_ptr<_Tp, _Dp> >(__t)); 3069bff1bfc6SHoward Hinnant} 3070bff1bfc6SHoward Hinnant 3071bff1bfc6SHoward Hinnant#endif 3072bff1bfc6SHoward Hinnant 3073ce53420eSHoward Hinnanttemplate <class _Tp> struct hash; 3074d1803b6cSHoward Hinnant 307553d2fb0aSHoward Hinnant// We use murmur2 when size_t is 32 bits, and cityhash64 when size_t 307653d2fb0aSHoward Hinnant// is 64 bits. This is because cityhash64 uses 64bit x 64bit 307753d2fb0aSHoward Hinnant// multiplication, which can be very slow on 32-bit systems. 3078f3d14a65SHoward Hinnanttemplate <class _Size, size_t = sizeof(_Size)*__CHAR_BIT__> 307953d2fb0aSHoward Hinnantstruct __murmur2_or_cityhash; 3080f3d14a65SHoward Hinnant 3081f3d14a65SHoward Hinnanttemplate <class _Size> 308253d2fb0aSHoward Hinnantstruct __murmur2_or_cityhash<_Size, 32> 3083f3d14a65SHoward Hinnant{ 3084f3d14a65SHoward Hinnant _Size operator()(const void* __key, _Size __len); 3085f3d14a65SHoward Hinnant}; 3086f3d14a65SHoward Hinnant 308753d2fb0aSHoward Hinnant// murmur2 3088f3d14a65SHoward Hinnanttemplate <class _Size> 3089f3d14a65SHoward Hinnant_Size 309053d2fb0aSHoward Hinnant__murmur2_or_cityhash<_Size, 32>::operator()(const void* __key, _Size __len) 3091f3d14a65SHoward Hinnant{ 3092f3d14a65SHoward Hinnant const _Size __m = 0x5bd1e995; 3093f3d14a65SHoward Hinnant const _Size __r = 24; 3094f3d14a65SHoward Hinnant _Size __h = __len; 3095f3d14a65SHoward Hinnant const unsigned char* __data = static_cast<const unsigned char*>(__key); 3096f3d14a65SHoward Hinnant for (; __len >= 4; __data += 4, __len -= 4) 3097f3d14a65SHoward Hinnant { 3098f3d14a65SHoward Hinnant _Size __k = *(const _Size*)__data; 3099f3d14a65SHoward Hinnant __k *= __m; 3100f3d14a65SHoward Hinnant __k ^= __k >> __r; 3101f3d14a65SHoward Hinnant __k *= __m; 3102f3d14a65SHoward Hinnant __h *= __m; 3103f3d14a65SHoward Hinnant __h ^= __k; 3104f3d14a65SHoward Hinnant } 3105f3d14a65SHoward Hinnant switch (__len) 3106f3d14a65SHoward Hinnant { 3107f3d14a65SHoward Hinnant case 3: 3108f3d14a65SHoward Hinnant __h ^= __data[2] << 16; 3109f3d14a65SHoward Hinnant case 2: 3110f3d14a65SHoward Hinnant __h ^= __data[1] << 8; 3111f3d14a65SHoward Hinnant case 1: 3112f3d14a65SHoward Hinnant __h ^= __data[0]; 3113f3d14a65SHoward Hinnant __h *= __m; 3114f3d14a65SHoward Hinnant } 3115f3d14a65SHoward Hinnant __h ^= __h >> 13; 3116f3d14a65SHoward Hinnant __h *= __m; 3117f3d14a65SHoward Hinnant __h ^= __h >> 15; 3118f3d14a65SHoward Hinnant return __h; 3119f3d14a65SHoward Hinnant} 3120f3d14a65SHoward Hinnant 3121f3d14a65SHoward Hinnanttemplate <class _Size> 312253d2fb0aSHoward Hinnantstruct __murmur2_or_cityhash<_Size, 64> 3123f3d14a65SHoward Hinnant{ 3124f3d14a65SHoward Hinnant _Size operator()(const void* __key, _Size __len); 312553d2fb0aSHoward Hinnant 312653d2fb0aSHoward Hinnant private: 312753d2fb0aSHoward Hinnant // Some primes between 2^63 and 2^64. 312853d2fb0aSHoward Hinnant static const _Size __k0 = 0xc3a5c85c97cb3127ULL; 312953d2fb0aSHoward Hinnant static const _Size __k1 = 0xb492b66fbe98f273ULL; 313053d2fb0aSHoward Hinnant static const _Size __k2 = 0x9ae16a3b2f90404fULL; 313153d2fb0aSHoward Hinnant static const _Size __k3 = 0xc949d7c7509e6557ULL; 313253d2fb0aSHoward Hinnant 313353d2fb0aSHoward Hinnant static _Size __rotate(_Size __val, int __shift) { 313453d2fb0aSHoward Hinnant return __shift == 0 ? __val : ((__val >> __shift) | (__val << (64 - __shift))); 313553d2fb0aSHoward Hinnant } 313653d2fb0aSHoward Hinnant 313753d2fb0aSHoward Hinnant static _Size __rotate_by_at_least_1(_Size __val, int __shift) { 313853d2fb0aSHoward Hinnant return (__val >> __shift) | (__val << (64 - __shift)); 313953d2fb0aSHoward Hinnant } 314053d2fb0aSHoward Hinnant 314153d2fb0aSHoward Hinnant static _Size __shift_mix(_Size __val) { 314253d2fb0aSHoward Hinnant return __val ^ (__val >> 47); 314353d2fb0aSHoward Hinnant } 314453d2fb0aSHoward Hinnant 314553d2fb0aSHoward Hinnant static _Size __hash_len_16(_Size __u, _Size __v) { 314653d2fb0aSHoward Hinnant const _Size __mul = 0x9ddfea08eb382d69ULL; 314753d2fb0aSHoward Hinnant _Size __a = (__u ^ __v) * __mul; 314853d2fb0aSHoward Hinnant __a ^= (__a >> 47); 314953d2fb0aSHoward Hinnant _Size __b = (__v ^ __a) * __mul; 315053d2fb0aSHoward Hinnant __b ^= (__b >> 47); 315153d2fb0aSHoward Hinnant __b *= __mul; 315253d2fb0aSHoward Hinnant return __b; 315353d2fb0aSHoward Hinnant } 315453d2fb0aSHoward Hinnant 315553d2fb0aSHoward Hinnant static _Size __hash_len_0_to_16(const char* __s, _Size __len) { 315653d2fb0aSHoward Hinnant if (__len > 8) { 315753d2fb0aSHoward Hinnant const _Size __a = *(const _Size*)__s; 315853d2fb0aSHoward Hinnant const _Size __b = *(const _Size*)(__s + __len - 8); 315953d2fb0aSHoward Hinnant return __hash_len_16(__a, __rotate_by_at_least_1(__b + __len, __len)) ^ __b; 316053d2fb0aSHoward Hinnant } 316153d2fb0aSHoward Hinnant if (__len >= 4) { 316253d2fb0aSHoward Hinnant const uint32_t __a = *(const uint32_t*)(__s); 316353d2fb0aSHoward Hinnant const uint32_t __b = *(const uint32_t*)(__s + __len - 4); 316453d2fb0aSHoward Hinnant return __hash_len_16(__len + (__a << 3), __b); 316553d2fb0aSHoward Hinnant } 316653d2fb0aSHoward Hinnant if (__len > 0) { 316753d2fb0aSHoward Hinnant const unsigned char __a = __s[0]; 316853d2fb0aSHoward Hinnant const unsigned char __b = __s[__len >> 1]; 316953d2fb0aSHoward Hinnant const unsigned char __c = __s[__len - 1]; 317053d2fb0aSHoward Hinnant const uint32_t __y = static_cast<uint32_t>(__a) + 317153d2fb0aSHoward Hinnant (static_cast<uint32_t>(__b) << 8); 317253d2fb0aSHoward Hinnant const uint32_t __z = __len + (static_cast<uint32_t>(__c) << 2); 317353d2fb0aSHoward Hinnant return __shift_mix(__y * __k2 ^ __z * __k3) * __k2; 317453d2fb0aSHoward Hinnant } 317553d2fb0aSHoward Hinnant return __k2; 317653d2fb0aSHoward Hinnant } 317753d2fb0aSHoward Hinnant 317853d2fb0aSHoward Hinnant static _Size __hash_len_17_to_32(const char *__s, _Size __len) { 317953d2fb0aSHoward Hinnant const _Size __a = *(const _Size*)(__s) * __k1; 318053d2fb0aSHoward Hinnant const _Size __b = *(const _Size*)(__s + 8); 318153d2fb0aSHoward Hinnant const _Size __c = *(const _Size*)(__s + __len - 8) * __k2; 318253d2fb0aSHoward Hinnant const _Size __d = *(const _Size*)(__s + __len - 16) * __k0; 318353d2fb0aSHoward Hinnant return __hash_len_16(__rotate(__a - __b, 43) + __rotate(__c, 30) + __d, 318453d2fb0aSHoward Hinnant __a + __rotate(__b ^ __k3, 20) - __c + __len); 318553d2fb0aSHoward Hinnant } 318653d2fb0aSHoward Hinnant 318753d2fb0aSHoward Hinnant // Return a 16-byte hash for 48 bytes. Quick and dirty. 318853d2fb0aSHoward Hinnant // Callers do best to use "random-looking" values for a and b. 318953d2fb0aSHoward Hinnant static pair<_Size, _Size> __weak_hash_len_32_with_seeds( 319053d2fb0aSHoward Hinnant _Size __w, _Size __x, _Size __y, _Size __z, _Size __a, _Size __b) { 319153d2fb0aSHoward Hinnant __a += __w; 319253d2fb0aSHoward Hinnant __b = __rotate(__b + __a + __z, 21); 319353d2fb0aSHoward Hinnant const _Size __c = __a; 319453d2fb0aSHoward Hinnant __a += __x; 319553d2fb0aSHoward Hinnant __a += __y; 319653d2fb0aSHoward Hinnant __b += __rotate(__a, 44); 319753d2fb0aSHoward Hinnant return pair<_Size, _Size>(__a + __z, __b + __c); 319853d2fb0aSHoward Hinnant } 319953d2fb0aSHoward Hinnant 320053d2fb0aSHoward Hinnant // Return a 16-byte hash for s[0] ... s[31], a, and b. Quick and dirty. 320153d2fb0aSHoward Hinnant static pair<_Size, _Size> __weak_hash_len_32_with_seeds( 320253d2fb0aSHoward Hinnant const char* __s, _Size __a, _Size __b) { 320353d2fb0aSHoward Hinnant return __weak_hash_len_32_with_seeds(*(const _Size*)(__s), 320453d2fb0aSHoward Hinnant *(const _Size*)(__s + 8), 320553d2fb0aSHoward Hinnant *(const _Size*)(__s + 16), 320653d2fb0aSHoward Hinnant *(const _Size*)(__s + 24), 320753d2fb0aSHoward Hinnant __a, 320853d2fb0aSHoward Hinnant __b); 320953d2fb0aSHoward Hinnant } 321053d2fb0aSHoward Hinnant 321153d2fb0aSHoward Hinnant // Return an 8-byte hash for 33 to 64 bytes. 321253d2fb0aSHoward Hinnant static _Size __hash_len_33_to_64(const char *__s, size_t __len) { 321353d2fb0aSHoward Hinnant _Size __z = *(const _Size*)(__s + 24); 321453d2fb0aSHoward Hinnant _Size __a = *(const _Size*)(__s) + 321553d2fb0aSHoward Hinnant (__len + *(const _Size*)(__s + __len - 16)) * __k0; 321653d2fb0aSHoward Hinnant _Size __b = __rotate(__a + __z, 52); 321753d2fb0aSHoward Hinnant _Size __c = __rotate(__a, 37); 321853d2fb0aSHoward Hinnant __a += *(const _Size*)(__s + 8); 321953d2fb0aSHoward Hinnant __c += __rotate(__a, 7); 322053d2fb0aSHoward Hinnant __a += *(const _Size*)(__s + 16); 322153d2fb0aSHoward Hinnant _Size __vf = __a + __z; 322253d2fb0aSHoward Hinnant _Size __vs = __b + __rotate(__a, 31) + __c; 322353d2fb0aSHoward Hinnant __a = *(const _Size*)(__s + 16) + *(const _Size*)(__s + __len - 32); 322453d2fb0aSHoward Hinnant __z += *(const _Size*)(__s + __len - 8); 322553d2fb0aSHoward Hinnant __b = __rotate(__a + __z, 52); 322653d2fb0aSHoward Hinnant __c = __rotate(__a, 37); 322753d2fb0aSHoward Hinnant __a += *(const _Size*)(__s + __len - 24); 322853d2fb0aSHoward Hinnant __c += __rotate(__a, 7); 322953d2fb0aSHoward Hinnant __a += *(const _Size*)(__s + __len - 16); 323053d2fb0aSHoward Hinnant _Size __wf = __a + __z; 323153d2fb0aSHoward Hinnant _Size __ws = __b + __rotate(__a, 31) + __c; 323253d2fb0aSHoward Hinnant _Size __r = __shift_mix((__vf + __ws) * __k2 + (__wf + __vs) * __k0); 323353d2fb0aSHoward Hinnant return __shift_mix(__r * __k0 + __vs) * __k2; 323453d2fb0aSHoward Hinnant } 3235f3d14a65SHoward Hinnant}; 3236f3d14a65SHoward Hinnant 323753d2fb0aSHoward Hinnant// cityhash64 3238f3d14a65SHoward Hinnanttemplate <class _Size> 3239f3d14a65SHoward Hinnant_Size 324053d2fb0aSHoward Hinnant__murmur2_or_cityhash<_Size, 64>::operator()(const void* __key, _Size __len) 3241f3d14a65SHoward Hinnant{ 324253d2fb0aSHoward Hinnant const char* __s = static_cast<const char*>(__key); 324353d2fb0aSHoward Hinnant if (__len <= 32) { 324453d2fb0aSHoward Hinnant if (__len <= 16) { 324553d2fb0aSHoward Hinnant return __hash_len_0_to_16(__s, __len); 324653d2fb0aSHoward Hinnant } else { 324753d2fb0aSHoward Hinnant return __hash_len_17_to_32(__s, __len); 3248f3d14a65SHoward Hinnant } 324953d2fb0aSHoward Hinnant } else if (__len <= 64) { 325053d2fb0aSHoward Hinnant return __hash_len_33_to_64(__s, __len); 3251f3d14a65SHoward Hinnant } 325253d2fb0aSHoward Hinnant 325353d2fb0aSHoward Hinnant // For strings over 64 bytes we hash the end first, and then as we 325453d2fb0aSHoward Hinnant // loop we keep 56 bytes of state: v, w, x, y, and z. 325553d2fb0aSHoward Hinnant _Size __x = *(const _Size*)(__s + __len - 40); 325653d2fb0aSHoward Hinnant _Size __y = *(const _Size*)(__s + __len - 16) + 325753d2fb0aSHoward Hinnant *(const _Size*)(__s + __len - 56); 325853d2fb0aSHoward Hinnant _Size __z = __hash_len_16(*(const _Size*)(__s + __len - 48) + __len, 325953d2fb0aSHoward Hinnant *(const _Size*)(__s + __len - 24)); 326053d2fb0aSHoward Hinnant pair<_Size, _Size> __v = __weak_hash_len_32_with_seeds(__s + __len - 64, __len, __z); 326153d2fb0aSHoward Hinnant pair<_Size, _Size> __w = __weak_hash_len_32_with_seeds(__s + __len - 32, __y + __k1, __x); 326253d2fb0aSHoward Hinnant __x = __x * __k1 + *(const _Size*)(__s); 326353d2fb0aSHoward Hinnant 326453d2fb0aSHoward Hinnant // Decrease len to the nearest multiple of 64, and operate on 64-byte chunks. 326553d2fb0aSHoward Hinnant __len = (__len - 1) & ~static_cast<_Size>(63); 326653d2fb0aSHoward Hinnant do { 326753d2fb0aSHoward Hinnant __x = __rotate(__x + __y + __v.first + *(const _Size*)(__s + 8), 37) * __k1; 326853d2fb0aSHoward Hinnant __y = __rotate(__y + __v.second + *(const _Size*)(__s + 48), 42) * __k1; 326953d2fb0aSHoward Hinnant __x ^= __w.second; 327053d2fb0aSHoward Hinnant __y += __v.first + *(const _Size*)(__s + 40); 327153d2fb0aSHoward Hinnant __z = __rotate(__z + __w.first, 33) * __k1; 327253d2fb0aSHoward Hinnant __v = __weak_hash_len_32_with_seeds(__s, __v.second * __k1, __x + __w.first); 327353d2fb0aSHoward Hinnant __w = __weak_hash_len_32_with_seeds(__s + 32, __z + __w.second, 327453d2fb0aSHoward Hinnant __y + *(const _Size*)(__s + 16)); 327553d2fb0aSHoward Hinnant std::swap(__z, __x); 327653d2fb0aSHoward Hinnant __s += 64; 327753d2fb0aSHoward Hinnant __len -= 64; 327853d2fb0aSHoward Hinnant } while (__len != 0); 327953d2fb0aSHoward Hinnant return __hash_len_16( 328053d2fb0aSHoward Hinnant __hash_len_16(__v.first, __w.first) + __shift_mix(__y) * __k1 + __z, 328153d2fb0aSHoward Hinnant __hash_len_16(__v.second, __w.second) + __x); 3282f3d14a65SHoward Hinnant} 3283f3d14a65SHoward Hinnant 32849b0cd149SHoward Hinnanttemplate <class _Tp, size_t = sizeof(_Tp) / sizeof(size_t)> 32859b0cd149SHoward Hinnantstruct __scalar_hash; 32869b0cd149SHoward Hinnant 3287d1803b6cSHoward Hinnanttemplate <class _Tp> 32889b0cd149SHoward Hinnantstruct __scalar_hash<_Tp, 0> 32899b0cd149SHoward Hinnant : public unary_function<_Tp, size_t> 3290d1803b6cSHoward Hinnant{ 3291848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 32929b0cd149SHoward Hinnant size_t operator()(_Tp __v) const _NOEXCEPT 3293d1803b6cSHoward Hinnant { 32949b0cd149SHoward Hinnant union 32959b0cd149SHoward Hinnant { 32969b0cd149SHoward Hinnant _Tp __t; 32979b0cd149SHoward Hinnant size_t __a; 32989b0cd149SHoward Hinnant } __u; 32999b0cd149SHoward Hinnant __u.__a = 0; 33009b0cd149SHoward Hinnant __u.__t = __v; 33019b0cd149SHoward Hinnant return __u.__a; 3302d1803b6cSHoward Hinnant } 3303d1803b6cSHoward Hinnant}; 3304d1803b6cSHoward Hinnant 33059b0cd149SHoward Hinnanttemplate <class _Tp> 33069b0cd149SHoward Hinnantstruct __scalar_hash<_Tp, 1> 33079b0cd149SHoward Hinnant : public unary_function<_Tp, size_t> 33089b0cd149SHoward Hinnant{ 33099b0cd149SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 33109b0cd149SHoward Hinnant size_t operator()(_Tp __v) const _NOEXCEPT 33119b0cd149SHoward Hinnant { 33129b0cd149SHoward Hinnant union 33139b0cd149SHoward Hinnant { 33149b0cd149SHoward Hinnant _Tp __t; 33159b0cd149SHoward Hinnant size_t __a; 33169b0cd149SHoward Hinnant } __u; 33179b0cd149SHoward Hinnant __u.__t = __v; 33189b0cd149SHoward Hinnant return __u.__a; 33199b0cd149SHoward Hinnant } 33209b0cd149SHoward Hinnant}; 33219b0cd149SHoward Hinnant 33229b0cd149SHoward Hinnanttemplate <class _Tp> 33239b0cd149SHoward Hinnantstruct __scalar_hash<_Tp, 2> 33249b0cd149SHoward Hinnant : public unary_function<_Tp, size_t> 33259b0cd149SHoward Hinnant{ 33269b0cd149SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 33279b0cd149SHoward Hinnant size_t operator()(_Tp __v) const _NOEXCEPT 33289b0cd149SHoward Hinnant { 33299b0cd149SHoward Hinnant union 33309b0cd149SHoward Hinnant { 33319b0cd149SHoward Hinnant _Tp __t; 33329b0cd149SHoward Hinnant struct 33339b0cd149SHoward Hinnant { 33349b0cd149SHoward Hinnant size_t __a; 33359b0cd149SHoward Hinnant size_t __b; 33369b0cd149SHoward Hinnant }; 33379b0cd149SHoward Hinnant } __u; 33389b0cd149SHoward Hinnant __u.__t = __v; 333953d2fb0aSHoward Hinnant return __murmur2_or_cityhash<size_t>()(&__u, sizeof(__u)); 33409b0cd149SHoward Hinnant } 33419b0cd149SHoward Hinnant}; 33429b0cd149SHoward Hinnant 33439b0cd149SHoward Hinnanttemplate <class _Tp> 33449b0cd149SHoward Hinnantstruct __scalar_hash<_Tp, 3> 33459b0cd149SHoward Hinnant : public unary_function<_Tp, size_t> 33469b0cd149SHoward Hinnant{ 33479b0cd149SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 33489b0cd149SHoward Hinnant size_t operator()(_Tp __v) const _NOEXCEPT 33499b0cd149SHoward Hinnant { 33509b0cd149SHoward Hinnant union 33519b0cd149SHoward Hinnant { 33529b0cd149SHoward Hinnant _Tp __t; 33539b0cd149SHoward Hinnant struct 33549b0cd149SHoward Hinnant { 33559b0cd149SHoward Hinnant size_t __a; 33569b0cd149SHoward Hinnant size_t __b; 33579b0cd149SHoward Hinnant size_t __c; 33589b0cd149SHoward Hinnant }; 33599b0cd149SHoward Hinnant } __u; 33609b0cd149SHoward Hinnant __u.__t = __v; 336153d2fb0aSHoward Hinnant return __murmur2_or_cityhash<size_t>()(&__u, sizeof(__u)); 33629b0cd149SHoward Hinnant } 33639b0cd149SHoward Hinnant}; 33649b0cd149SHoward Hinnant 33659b0cd149SHoward Hinnanttemplate <class _Tp> 33669b0cd149SHoward Hinnantstruct __scalar_hash<_Tp, 4> 33679b0cd149SHoward Hinnant : public unary_function<_Tp, size_t> 33689b0cd149SHoward Hinnant{ 33699b0cd149SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 33709b0cd149SHoward Hinnant size_t operator()(_Tp __v) const _NOEXCEPT 33719b0cd149SHoward Hinnant { 33729b0cd149SHoward Hinnant union 33739b0cd149SHoward Hinnant { 33749b0cd149SHoward Hinnant _Tp __t; 33759b0cd149SHoward Hinnant struct 33769b0cd149SHoward Hinnant { 33779b0cd149SHoward Hinnant size_t __a; 33789b0cd149SHoward Hinnant size_t __b; 33799b0cd149SHoward Hinnant size_t __c; 33809b0cd149SHoward Hinnant size_t __d; 33819b0cd149SHoward Hinnant }; 33829b0cd149SHoward Hinnant } __u; 33839b0cd149SHoward Hinnant __u.__t = __v; 338453d2fb0aSHoward Hinnant return __murmur2_or_cityhash<size_t>()(&__u, sizeof(__u)); 33859b0cd149SHoward Hinnant } 33869b0cd149SHoward Hinnant}; 33879b0cd149SHoward Hinnant 33889b0cd149SHoward Hinnanttemplate<class _Tp> 33899b0cd149SHoward Hinnantstruct _LIBCPP_VISIBLE hash<_Tp*> 33909b0cd149SHoward Hinnant : public __scalar_hash<_Tp*> 33919b0cd149SHoward Hinnant{ 33929b0cd149SHoward Hinnant}; 33939b0cd149SHoward Hinnant 3394d1803b6cSHoward Hinnanttemplate <class _Tp, class _Dp> 3395848a5374SHoward Hinnantstruct _LIBCPP_VISIBLE hash<unique_ptr<_Tp, _Dp> > 3396d1803b6cSHoward Hinnant{ 3397d1803b6cSHoward Hinnant typedef unique_ptr<_Tp, _Dp> argument_type; 3398d1803b6cSHoward Hinnant typedef size_t result_type; 3399848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 34003739fe79SHoward Hinnant result_type operator()(const argument_type& __ptr) const _NOEXCEPT 3401d1803b6cSHoward Hinnant { 3402d1803b6cSHoward Hinnant typedef typename argument_type::pointer pointer; 3403d1803b6cSHoward Hinnant return hash<pointer>()(__ptr.get()); 3404d1803b6cSHoward Hinnant } 3405d1803b6cSHoward Hinnant}; 3406d1803b6cSHoward Hinnant 34073e519524SHoward Hinnantstruct __destruct_n 34083e519524SHoward Hinnant{ 34093e519524SHoward Hinnantprivate: 34103e519524SHoward Hinnant size_t size; 34113e519524SHoward Hinnant 34123e519524SHoward Hinnant template <class _Tp> 34133739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __process(_Tp* __p, false_type) _NOEXCEPT 34143e519524SHoward Hinnant {for (size_t __i = 0; __i < size; ++__i, ++__p) __p->~_Tp();} 34153e519524SHoward Hinnant 34163e519524SHoward Hinnant template <class _Tp> 34173739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __process(_Tp*, true_type) _NOEXCEPT 34183e519524SHoward Hinnant {} 34193e519524SHoward Hinnant 34203739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __incr(false_type) _NOEXCEPT 34213e519524SHoward Hinnant {++size;} 34223739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __incr(true_type) _NOEXCEPT 34233e519524SHoward Hinnant {} 34243e519524SHoward Hinnant 34253739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __set(size_t __s, false_type) _NOEXCEPT 34263e519524SHoward Hinnant {size = __s;} 34273739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __set(size_t, true_type) _NOEXCEPT 34283e519524SHoward Hinnant {} 34293e519524SHoward Hinnantpublic: 34303739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __destruct_n(size_t __s) _NOEXCEPT 34313739fe79SHoward Hinnant : size(__s) {} 34323e519524SHoward Hinnant 34333e519524SHoward Hinnant template <class _Tp> 34343739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __incr(_Tp*) _NOEXCEPT 3435ca740483SHoward Hinnant {__incr(integral_constant<bool, is_trivially_destructible<_Tp>::value>());} 34363e519524SHoward Hinnant 34373e519524SHoward Hinnant template <class _Tp> 34383739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __set(size_t __s, _Tp*) _NOEXCEPT 3439ca740483SHoward Hinnant {__set(__s, integral_constant<bool, is_trivially_destructible<_Tp>::value>());} 34403e519524SHoward Hinnant 34413e519524SHoward Hinnant template <class _Tp> 34423739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __p) _NOEXCEPT 3443ca740483SHoward Hinnant {__process(__p, integral_constant<bool, is_trivially_destructible<_Tp>::value>());} 34443e519524SHoward Hinnant}; 34453e519524SHoward Hinnant 34463e519524SHoward Hinnanttemplate <class _Alloc> 34473e519524SHoward Hinnantclass __allocator_destructor 34483e519524SHoward Hinnant{ 34493e519524SHoward Hinnant typedef allocator_traits<_Alloc> __alloc_traits; 34503e519524SHoward Hinnantpublic: 34513e519524SHoward Hinnant typedef typename __alloc_traits::pointer pointer; 34523e519524SHoward Hinnant typedef typename __alloc_traits::size_type size_type; 34533e519524SHoward Hinnantprivate: 34543e519524SHoward Hinnant _Alloc& __alloc_; 34553e519524SHoward Hinnant size_type __s_; 34563e519524SHoward Hinnantpublic: 34573e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __allocator_destructor(_Alloc& __a, size_type __s) 34583739fe79SHoward Hinnant _NOEXCEPT 34593e519524SHoward Hinnant : __alloc_(__a), __s_(__s) {} 3460848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 34613739fe79SHoward Hinnant void operator()(pointer __p) _NOEXCEPT 34623739fe79SHoward Hinnant {__alloc_traits::deallocate(__alloc_, __p, __s_);} 34633e519524SHoward Hinnant}; 34643e519524SHoward Hinnant 34653e519524SHoward Hinnanttemplate <class _InputIterator, class _ForwardIterator> 34663e519524SHoward Hinnant_ForwardIterator 34673e519524SHoward Hinnantuninitialized_copy(_InputIterator __f, _InputIterator __l, _ForwardIterator __r) 34683e519524SHoward Hinnant{ 34693e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 3470b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3471b34b4819SHoward Hinnant _ForwardIterator __s = __r; 3472b34b4819SHoward Hinnant try 3473b34b4819SHoward Hinnant { 3474b34b4819SHoward Hinnant#endif 3475b34b4819SHoward Hinnant for (; __f != __l; ++__f, ++__r) 34763e519524SHoward Hinnant ::new(&*__r) value_type(*__f); 3477b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3478b34b4819SHoward Hinnant } 3479b34b4819SHoward Hinnant catch (...) 3480b34b4819SHoward Hinnant { 3481b34b4819SHoward Hinnant for (; __s != __r; ++__s) 3482b34b4819SHoward Hinnant __s->~value_type(); 3483b34b4819SHoward Hinnant throw; 3484b34b4819SHoward Hinnant } 3485b34b4819SHoward Hinnant#endif 34863e519524SHoward Hinnant return __r; 34873e519524SHoward Hinnant} 34883e519524SHoward Hinnant 34893e519524SHoward Hinnanttemplate <class _InputIterator, class _Size, class _ForwardIterator> 34903e519524SHoward Hinnant_ForwardIterator 34913e519524SHoward Hinnantuninitialized_copy_n(_InputIterator __f, _Size __n, _ForwardIterator __r) 34923e519524SHoward Hinnant{ 34933e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 3494b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3495b34b4819SHoward Hinnant _ForwardIterator __s = __r; 3496b34b4819SHoward Hinnant try 3497b34b4819SHoward Hinnant { 3498b34b4819SHoward Hinnant#endif 3499b34b4819SHoward Hinnant for (; __n > 0; ++__f, ++__r, --__n) 35003e519524SHoward Hinnant ::new(&*__r) value_type(*__f); 3501b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3502b34b4819SHoward Hinnant } 3503b34b4819SHoward Hinnant catch (...) 3504b34b4819SHoward Hinnant { 3505b34b4819SHoward Hinnant for (; __s != __r; ++__s) 3506b34b4819SHoward Hinnant __s->~value_type(); 3507b34b4819SHoward Hinnant throw; 3508b34b4819SHoward Hinnant } 3509b34b4819SHoward Hinnant#endif 35103e519524SHoward Hinnant return __r; 35113e519524SHoward Hinnant} 35123e519524SHoward Hinnant 35133e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Tp> 35143e519524SHoward Hinnantvoid 35153e519524SHoward Hinnantuninitialized_fill(_ForwardIterator __f, _ForwardIterator __l, const _Tp& __x) 35163e519524SHoward Hinnant{ 35173e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 3518b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3519b34b4819SHoward Hinnant _ForwardIterator __s = __f; 3520b34b4819SHoward Hinnant try 3521b34b4819SHoward Hinnant { 3522b34b4819SHoward Hinnant#endif 3523b34b4819SHoward Hinnant for (; __f != __l; ++__f) 35243e519524SHoward Hinnant ::new(&*__f) value_type(__x); 3525b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3526b34b4819SHoward Hinnant } 3527b34b4819SHoward Hinnant catch (...) 3528b34b4819SHoward Hinnant { 3529b34b4819SHoward Hinnant for (; __s != __f; ++__s) 3530b34b4819SHoward Hinnant __s->~value_type(); 3531b34b4819SHoward Hinnant throw; 3532b34b4819SHoward Hinnant } 3533b34b4819SHoward Hinnant#endif 35343e519524SHoward Hinnant} 35353e519524SHoward Hinnant 35363e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Size, class _Tp> 353748d05bd2SHoward Hinnant_ForwardIterator 35383e519524SHoward Hinnantuninitialized_fill_n(_ForwardIterator __f, _Size __n, const _Tp& __x) 35393e519524SHoward Hinnant{ 35403e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 3541b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3542b34b4819SHoward Hinnant _ForwardIterator __s = __f; 3543b34b4819SHoward Hinnant try 3544b34b4819SHoward Hinnant { 3545b34b4819SHoward Hinnant#endif 3546b34b4819SHoward Hinnant for (; __n > 0; ++__f, --__n) 35473e519524SHoward Hinnant ::new(&*__f) value_type(__x); 3548b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3549b34b4819SHoward Hinnant } 3550b34b4819SHoward Hinnant catch (...) 3551b34b4819SHoward Hinnant { 3552b34b4819SHoward Hinnant for (; __s != __f; ++__s) 3553b34b4819SHoward Hinnant __s->~value_type(); 3554b34b4819SHoward Hinnant throw; 3555b34b4819SHoward Hinnant } 3556b34b4819SHoward Hinnant#endif 355748d05bd2SHoward Hinnant return __f; 35583e519524SHoward Hinnant} 35593e519524SHoward Hinnant 3560848a5374SHoward Hinnantclass _LIBCPP_EXCEPTION_ABI bad_weak_ptr 35613e519524SHoward Hinnant : public std::exception 35623e519524SHoward Hinnant{ 35633e519524SHoward Hinnantpublic: 35643739fe79SHoward Hinnant virtual ~bad_weak_ptr() _NOEXCEPT; 35653739fe79SHoward Hinnant virtual const char* what() const _NOEXCEPT; 35663e519524SHoward Hinnant}; 35673e519524SHoward Hinnant 35683e519524SHoward Hinnanttemplate<class _Tp> class weak_ptr; 35693e519524SHoward Hinnant 35703e519524SHoward Hinnantclass __shared_count 35713e519524SHoward Hinnant{ 35723e519524SHoward Hinnant __shared_count(const __shared_count&); 35733e519524SHoward Hinnant __shared_count& operator=(const __shared_count&); 35743e519524SHoward Hinnant 35753e519524SHoward Hinnantprotected: 35763e519524SHoward Hinnant long __shared_owners_; 35773e519524SHoward Hinnant virtual ~__shared_count(); 35783e519524SHoward Hinnantprivate: 35793739fe79SHoward Hinnant virtual void __on_zero_shared() _NOEXCEPT = 0; 35803e519524SHoward Hinnant 35813e519524SHoward Hinnantpublic: 3582848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 35833739fe79SHoward Hinnant explicit __shared_count(long __refs = 0) _NOEXCEPT 35843e519524SHoward Hinnant : __shared_owners_(__refs) {} 35853e519524SHoward Hinnant 35863739fe79SHoward Hinnant void __add_shared() _NOEXCEPT; 35873739fe79SHoward Hinnant bool __release_shared() _NOEXCEPT; 3588848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 35893739fe79SHoward Hinnant long use_count() const _NOEXCEPT {return __shared_owners_ + 1;} 35903e519524SHoward Hinnant}; 35913e519524SHoward Hinnant 35923e519524SHoward Hinnantclass __shared_weak_count 35933e519524SHoward Hinnant : private __shared_count 35943e519524SHoward Hinnant{ 35953e519524SHoward Hinnant long __shared_weak_owners_; 35963e519524SHoward Hinnant 35973e519524SHoward Hinnantpublic: 3598848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 35993739fe79SHoward Hinnant explicit __shared_weak_count(long __refs = 0) _NOEXCEPT 36003e519524SHoward Hinnant : __shared_count(__refs), 36013e519524SHoward Hinnant __shared_weak_owners_(__refs) {} 36023e519524SHoward Hinnantprotected: 36033e519524SHoward Hinnant virtual ~__shared_weak_count(); 36043e519524SHoward Hinnant 36053e519524SHoward Hinnantpublic: 36063739fe79SHoward Hinnant void __add_shared() _NOEXCEPT; 36073739fe79SHoward Hinnant void __add_weak() _NOEXCEPT; 36083739fe79SHoward Hinnant void __release_shared() _NOEXCEPT; 36093739fe79SHoward Hinnant void __release_weak() _NOEXCEPT; 3610848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 36113739fe79SHoward Hinnant long use_count() const _NOEXCEPT {return __shared_count::use_count();} 36123739fe79SHoward Hinnant __shared_weak_count* lock() _NOEXCEPT; 36133e519524SHoward Hinnant 3614ed81e910SHoward Hinnant // purposefully not protected with #ifndef _LIBCPP_NO_RTTI because doing so 3615ed81e910SHoward Hinnant // breaks ABI for those clients who need to compile their projects with 3616ed81e910SHoward Hinnant // -fno-rtti and yet link against a libc++.dylib compiled without -fno-rtti. 36173739fe79SHoward Hinnant virtual const void* __get_deleter(const type_info&) const _NOEXCEPT; 36183e519524SHoward Hinnantprivate: 36193739fe79SHoward Hinnant virtual void __on_zero_shared_weak() _NOEXCEPT = 0; 36203e519524SHoward Hinnant}; 36213e519524SHoward Hinnant 36223e519524SHoward Hinnanttemplate <class _Tp, class _Dp, class _Alloc> 36233e519524SHoward Hinnantclass __shared_ptr_pointer 36243e519524SHoward Hinnant : public __shared_weak_count 36253e519524SHoward Hinnant{ 36263e519524SHoward Hinnant __compressed_pair<__compressed_pair<_Tp, _Dp>, _Alloc> __data_; 36273e519524SHoward Hinnantpublic: 3628848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 36293e519524SHoward Hinnant __shared_ptr_pointer(_Tp __p, _Dp __d, _Alloc __a) 3630ce48a113SHoward Hinnant : __data_(__compressed_pair<_Tp, _Dp>(__p, _VSTD::move(__d)), _VSTD::move(__a)) {} 36313e519524SHoward Hinnant 363254b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI 36333739fe79SHoward Hinnant virtual const void* __get_deleter(const type_info&) const _NOEXCEPT; 363454b409fdSHoward Hinnant#endif 36353e519524SHoward Hinnant 36363e519524SHoward Hinnantprivate: 36373739fe79SHoward Hinnant virtual void __on_zero_shared() _NOEXCEPT; 36383739fe79SHoward Hinnant virtual void __on_zero_shared_weak() _NOEXCEPT; 36393e519524SHoward Hinnant}; 36403e519524SHoward Hinnant 364154b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI 364254b409fdSHoward Hinnant 36433e519524SHoward Hinnanttemplate <class _Tp, class _Dp, class _Alloc> 36443e519524SHoward Hinnantconst void* 36453739fe79SHoward Hinnant__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__get_deleter(const type_info& __t) const _NOEXCEPT 36463e519524SHoward Hinnant{ 36473e519524SHoward Hinnant return __t == typeid(_Dp) ? &__data_.first().second() : 0; 36483e519524SHoward Hinnant} 36493e519524SHoward Hinnant 3650b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_RTTI 365154b409fdSHoward Hinnant 36523e519524SHoward Hinnanttemplate <class _Tp, class _Dp, class _Alloc> 36533e519524SHoward Hinnantvoid 36543739fe79SHoward Hinnant__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__on_zero_shared() _NOEXCEPT 36553e519524SHoward Hinnant{ 36563e519524SHoward Hinnant __data_.first().second()(__data_.first().first()); 36573e519524SHoward Hinnant __data_.first().second().~_Dp(); 36583e519524SHoward Hinnant} 36593e519524SHoward Hinnant 36603e519524SHoward Hinnanttemplate <class _Tp, class _Dp, class _Alloc> 36613e519524SHoward Hinnantvoid 36623739fe79SHoward Hinnant__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__on_zero_shared_weak() _NOEXCEPT 36633e519524SHoward Hinnant{ 36643e519524SHoward Hinnant typename _Alloc::template rebind<__shared_ptr_pointer>::other __a(__data_.second()); 36653e519524SHoward Hinnant __data_.second().~_Alloc(); 36663e519524SHoward Hinnant __a.deallocate(this, 1); 36673e519524SHoward Hinnant} 36683e519524SHoward Hinnant 36693e519524SHoward Hinnanttemplate <class _Tp, class _Alloc> 36703e519524SHoward Hinnantclass __shared_ptr_emplace 36713e519524SHoward Hinnant : public __shared_weak_count 36723e519524SHoward Hinnant{ 36733e519524SHoward Hinnant __compressed_pair<_Alloc, _Tp> __data_; 36743e519524SHoward Hinnantpublic: 36753e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 36763e519524SHoward Hinnant 3677848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 36783e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a) 3679ce48a113SHoward Hinnant : __data_(_VSTD::move(__a)) {} 36803e519524SHoward Hinnant 36813e519524SHoward Hinnant template <class ..._Args> 3682848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 36833e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a, _Args&& ...__args) 3684a87b5e34SHoward Hinnant : __data_(piecewise_construct, _VSTD::forward_as_tuple(__a), 3685a87b5e34SHoward Hinnant _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)) {} 36863e519524SHoward Hinnant 36873e519524SHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 36883e519524SHoward Hinnant 3689848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 36903e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a) 36913e519524SHoward Hinnant : __data_(__a) {} 36923e519524SHoward Hinnant 36933e519524SHoward Hinnant template <class _A0> 3694848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 36953e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a, _A0& __a0) 36963e519524SHoward Hinnant : __data_(__a, _Tp(__a0)) {} 36973e519524SHoward Hinnant 36983e519524SHoward Hinnant template <class _A0, class _A1> 3699848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 37003e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a, _A0& __a0, _A1& __a1) 37013e519524SHoward Hinnant : __data_(__a, _Tp(__a0, __a1)) {} 37023e519524SHoward Hinnant 37033e519524SHoward Hinnant template <class _A0, class _A1, class _A2> 3704848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 37053e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a, _A0& __a0, _A1& __a1, _A2& __a2) 37063e519524SHoward Hinnant : __data_(__a, _Tp(__a0, __a1, __a2)) {} 37073e519524SHoward Hinnant 37083e519524SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 37093e519524SHoward Hinnant 37103e519524SHoward Hinnantprivate: 37113739fe79SHoward Hinnant virtual void __on_zero_shared() _NOEXCEPT; 37123739fe79SHoward Hinnant virtual void __on_zero_shared_weak() _NOEXCEPT; 37133e519524SHoward Hinnantpublic: 3714848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 37153739fe79SHoward Hinnant _Tp* get() _NOEXCEPT {return &__data_.second();} 37163e519524SHoward Hinnant}; 37173e519524SHoward Hinnant 37183e519524SHoward Hinnanttemplate <class _Tp, class _Alloc> 37193e519524SHoward Hinnantvoid 37203739fe79SHoward Hinnant__shared_ptr_emplace<_Tp, _Alloc>::__on_zero_shared() _NOEXCEPT 37213e519524SHoward Hinnant{ 37223e519524SHoward Hinnant __data_.second().~_Tp(); 37233e519524SHoward Hinnant} 37243e519524SHoward Hinnant 37253e519524SHoward Hinnanttemplate <class _Tp, class _Alloc> 37263e519524SHoward Hinnantvoid 37273739fe79SHoward Hinnant__shared_ptr_emplace<_Tp, _Alloc>::__on_zero_shared_weak() _NOEXCEPT 37283e519524SHoward Hinnant{ 37293e519524SHoward Hinnant typename _Alloc::template rebind<__shared_ptr_emplace>::other __a(__data_.first()); 37303e519524SHoward Hinnant __data_.first().~_Alloc(); 37313e519524SHoward Hinnant __a.deallocate(this, 1); 37323e519524SHoward Hinnant} 37333e519524SHoward Hinnant 37343e519524SHoward Hinnanttemplate<class _Tp> class enable_shared_from_this; 37353e519524SHoward Hinnant 37363e519524SHoward Hinnanttemplate<class _Tp> 3737848a5374SHoward Hinnantclass _LIBCPP_VISIBLE shared_ptr 37383e519524SHoward Hinnant{ 37393e519524SHoward Hinnantpublic: 37403e519524SHoward Hinnant typedef _Tp element_type; 37413e519524SHoward Hinnantprivate: 37423e519524SHoward Hinnant element_type* __ptr_; 37433e519524SHoward Hinnant __shared_weak_count* __cntrl_; 37443e519524SHoward Hinnant 37453e519524SHoward Hinnant struct __nat {int __for_bool_;}; 37463e519524SHoward Hinnantpublic: 3747*c0937e8aSHoward Hinnant _LIBCPP_CONSTEXPR shared_ptr() _NOEXCEPT; 3748*c0937e8aSHoward Hinnant _LIBCPP_CONSTEXPR shared_ptr(nullptr_t) _NOEXCEPT; 37498e25104bSHoward Hinnant template<class _Yp, 37508e25104bSHoward Hinnant class = typename enable_if 37518e25104bSHoward Hinnant < 37528e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value 37538e25104bSHoward Hinnant >::type 37548e25104bSHoward Hinnant > 37558e25104bSHoward Hinnant explicit shared_ptr(_Yp* __p); 37568e25104bSHoward Hinnant template<class _Yp, class _Dp, 37578e25104bSHoward Hinnant class = typename enable_if 37588e25104bSHoward Hinnant < 37598e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value 37608e25104bSHoward Hinnant >::type 37618e25104bSHoward Hinnant > 37628e25104bSHoward Hinnant shared_ptr(_Yp* __p, _Dp __d); 37638e25104bSHoward Hinnant template<class _Yp, class _Dp, class _Alloc, 37648e25104bSHoward Hinnant class = typename enable_if 37658e25104bSHoward Hinnant < 37668e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value 37678e25104bSHoward Hinnant >::type 37688e25104bSHoward Hinnant > 37698e25104bSHoward Hinnant shared_ptr(_Yp* __p, _Dp __d, _Alloc __a); 37703e519524SHoward Hinnant template <class _Dp> shared_ptr(nullptr_t __p, _Dp __d); 37713e519524SHoward Hinnant template <class _Dp, class _Alloc> shared_ptr(nullptr_t __p, _Dp __d, _Alloc __a); 37723739fe79SHoward Hinnant template<class _Yp> shared_ptr(const shared_ptr<_Yp>& __r, element_type* __p) _NOEXCEPT; 37733739fe79SHoward Hinnant shared_ptr(const shared_ptr& __r) _NOEXCEPT; 37743e519524SHoward Hinnant template<class _Yp> 37753e519524SHoward Hinnant shared_ptr(const shared_ptr<_Yp>& __r, 37763739fe79SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type = __nat()) 37773739fe79SHoward Hinnant _NOEXCEPT; 37787609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 37793739fe79SHoward Hinnant shared_ptr(shared_ptr&& __r) _NOEXCEPT; 37803e519524SHoward Hinnant template<class _Yp> shared_ptr(shared_ptr<_Yp>&& __r, 37813739fe79SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type = __nat()) 37823739fe79SHoward Hinnant _NOEXCEPT; 37837609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 37843e519524SHoward Hinnant template<class _Yp> explicit shared_ptr(const weak_ptr<_Yp>& __r, 37853e519524SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type= __nat()); 37867609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 37878e25104bSHoward Hinnant template<class _Yp, 37888e25104bSHoward Hinnant class = typename enable_if 37898e25104bSHoward Hinnant < 37908e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value 37918e25104bSHoward Hinnant >::type 37928e25104bSHoward Hinnant > 37938e25104bSHoward Hinnant shared_ptr(auto_ptr<_Yp>&& __r); 3794b3371f6fSHoward Hinnant#else 37958e25104bSHoward Hinnant template<class _Yp, 37968e25104bSHoward Hinnant class = typename enable_if 37978e25104bSHoward Hinnant < 37988e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value 37998e25104bSHoward Hinnant >::type 38008e25104bSHoward Hinnant > 38018e25104bSHoward Hinnant shared_ptr(auto_ptr<_Yp> __r); 38023e519524SHoward Hinnant#endif 38037609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 38048e25104bSHoward Hinnant template <class _Yp, class _Dp, 38058e25104bSHoward Hinnant class = typename enable_if 38068e25104bSHoward Hinnant < 38078e25104bSHoward Hinnant !is_array<_Yp>::value && 38088e25104bSHoward Hinnant is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value 38098e25104bSHoward Hinnant >::type 38108e25104bSHoward Hinnant > 38118e25104bSHoward Hinnant shared_ptr(unique_ptr<_Yp, _Dp>&&, 38123e519524SHoward Hinnant typename enable_if<!is_lvalue_reference<_Dp>::value, __nat>::type = __nat()); 38138e25104bSHoward Hinnant template <class _Yp, class _Dp, 38148e25104bSHoward Hinnant class = typename enable_if 38158e25104bSHoward Hinnant < 38168e25104bSHoward Hinnant !is_array<_Yp>::value && 38178e25104bSHoward Hinnant is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value 38188e25104bSHoward Hinnant >::type 38198e25104bSHoward Hinnant > 38208e25104bSHoward Hinnant shared_ptr(unique_ptr<_Yp, _Dp>&&, 38213e519524SHoward Hinnant typename enable_if<is_lvalue_reference<_Dp>::value, __nat>::type = __nat()); 38227609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 38238e25104bSHoward Hinnant template <class _Yp, class _Dp, 38248e25104bSHoward Hinnant class = typename enable_if 38258e25104bSHoward Hinnant < 38268e25104bSHoward Hinnant !is_array<_Yp>::value && 38278e25104bSHoward Hinnant is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value 38288e25104bSHoward Hinnant >::type 38298e25104bSHoward Hinnant > shared_ptr(unique_ptr<_Yp, _Dp>, 38303e519524SHoward Hinnant typename enable_if<!is_lvalue_reference<_Dp>::value, __nat>::type = __nat()); 38318e25104bSHoward Hinnant template <class _Yp, class _Dp, 38328e25104bSHoward Hinnant class = typename enable_if 38338e25104bSHoward Hinnant < 38348e25104bSHoward Hinnant !is_array<_Yp>::value && 38358e25104bSHoward Hinnant is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value 38368e25104bSHoward Hinnant >::type 38378e25104bSHoward Hinnant > 38388e25104bSHoward Hinnant shared_ptr(unique_ptr<_Yp, _Dp>, 38393e519524SHoward Hinnant typename enable_if<is_lvalue_reference<_Dp>::value, __nat>::type = __nat()); 38407609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 38413e519524SHoward Hinnant 38423e519524SHoward Hinnant ~shared_ptr(); 38433e519524SHoward Hinnant 38443739fe79SHoward Hinnant shared_ptr& operator=(const shared_ptr& __r) _NOEXCEPT; 38458e25104bSHoward Hinnant template<class _Yp> 38468e25104bSHoward Hinnant typename enable_if 38478e25104bSHoward Hinnant < 38488e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 38498e25104bSHoward Hinnant shared_ptr& 38508e25104bSHoward Hinnant >::type 38518e25104bSHoward Hinnant operator=(const shared_ptr<_Yp>& __r) _NOEXCEPT; 38527609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 38533739fe79SHoward Hinnant shared_ptr& operator=(shared_ptr&& __r) _NOEXCEPT; 38548e25104bSHoward Hinnant template<class _Yp> 38558e25104bSHoward Hinnant typename enable_if 38568e25104bSHoward Hinnant < 38578e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 38588e25104bSHoward Hinnant shared_ptr<_Tp>& 38598e25104bSHoward Hinnant >::type 38608e25104bSHoward Hinnant operator=(shared_ptr<_Yp>&& __r); 38618e25104bSHoward Hinnant template<class _Yp> 38628e25104bSHoward Hinnant typename enable_if 38638e25104bSHoward Hinnant < 38648e25104bSHoward Hinnant !is_array<_Yp>::value && 38658e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 38668e25104bSHoward Hinnant shared_ptr& 38678e25104bSHoward Hinnant >::type 38688e25104bSHoward Hinnant operator=(auto_ptr<_Yp>&& __r); 38697609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 38708e25104bSHoward Hinnant template<class _Yp> 38718e25104bSHoward Hinnant typename enable_if 38728e25104bSHoward Hinnant < 38738e25104bSHoward Hinnant !is_array<_Yp>::value && 38748e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 38758e25104bSHoward Hinnant shared_ptr& 38768e25104bSHoward Hinnant >::type 38778e25104bSHoward Hinnant operator=(auto_ptr<_Yp> __r); 38783e519524SHoward Hinnant#endif 38798e25104bSHoward Hinnant template <class _Yp, class _Dp> 38808e25104bSHoward Hinnant typename enable_if 38818e25104bSHoward Hinnant < 38828e25104bSHoward Hinnant !is_array<_Yp>::value && 38838e25104bSHoward Hinnant is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 38848e25104bSHoward Hinnant shared_ptr& 38858e25104bSHoward Hinnant >::type 38867609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 38878e25104bSHoward Hinnant operator=(unique_ptr<_Yp, _Dp>&& __r); 38887609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 38898e25104bSHoward Hinnant operator=(unique_ptr<_Yp, _Dp> __r); 38903e519524SHoward Hinnant#endif 38913e519524SHoward Hinnant 38923739fe79SHoward Hinnant void swap(shared_ptr& __r) _NOEXCEPT; 38933739fe79SHoward Hinnant void reset() _NOEXCEPT; 38948e25104bSHoward Hinnant template<class _Yp> 38958e25104bSHoward Hinnant typename enable_if 38968e25104bSHoward Hinnant < 38978e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 38988e25104bSHoward Hinnant void 38998e25104bSHoward Hinnant >::type 39008e25104bSHoward Hinnant reset(_Yp* __p); 39018e25104bSHoward Hinnant template<class _Yp, class _Dp> 39028e25104bSHoward Hinnant typename enable_if 39038e25104bSHoward Hinnant < 39048e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 39058e25104bSHoward Hinnant void 39068e25104bSHoward Hinnant >::type 39078e25104bSHoward Hinnant reset(_Yp* __p, _Dp __d); 39088e25104bSHoward Hinnant template<class _Yp, class _Dp, class _Alloc> 39098e25104bSHoward Hinnant typename enable_if 39108e25104bSHoward Hinnant < 39118e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 39128e25104bSHoward Hinnant void 39138e25104bSHoward Hinnant >::type 39148e25104bSHoward Hinnant reset(_Yp* __p, _Dp __d, _Alloc __a); 39153e519524SHoward Hinnant 3916848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 39173739fe79SHoward Hinnant element_type* get() const _NOEXCEPT {return __ptr_;} 3918848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 39193739fe79SHoward Hinnant typename add_lvalue_reference<element_type>::type operator*() const _NOEXCEPT 39203739fe79SHoward Hinnant {return *__ptr_;} 3921848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 39223739fe79SHoward Hinnant element_type* operator->() const _NOEXCEPT {return __ptr_;} 3923848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 39243739fe79SHoward Hinnant long use_count() const _NOEXCEPT {return __cntrl_ ? __cntrl_->use_count() : 0;} 3925848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 39263739fe79SHoward Hinnant bool unique() const _NOEXCEPT {return use_count() == 1;} 3927848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 3928f2f2d8b9SHoward Hinnant _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT {return get() != 0;} 3929c003db1fSHoward Hinnant template <class _Up> 3930848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 3931c003db1fSHoward Hinnant bool owner_before(shared_ptr<_Up> const& __p) const 39323e519524SHoward Hinnant {return __cntrl_ < __p.__cntrl_;} 3933c003db1fSHoward Hinnant template <class _Up> 3934848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 3935c003db1fSHoward Hinnant bool owner_before(weak_ptr<_Up> const& __p) const 39363e519524SHoward Hinnant {return __cntrl_ < __p.__cntrl_;} 39373e519524SHoward Hinnant 393854b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI 39393e519524SHoward Hinnant template <class _Dp> 3940848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 39413739fe79SHoward Hinnant _Dp* __get_deleter() const _NOEXCEPT 39423e519524SHoward Hinnant {return (_Dp*)(__cntrl_ ? __cntrl_->__get_deleter(typeid(_Dp)) : 0);} 3943b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_RTTI 39443e519524SHoward Hinnant 39453e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 39463e519524SHoward Hinnant 39473e519524SHoward Hinnant template<class ..._Args> 39483e519524SHoward Hinnant static 39493e519524SHoward Hinnant shared_ptr<_Tp> 39503e519524SHoward Hinnant make_shared(_Args&& ...__args); 39513e519524SHoward Hinnant 39523e519524SHoward Hinnant template<class _Alloc, class ..._Args> 39533e519524SHoward Hinnant static 39543e519524SHoward Hinnant shared_ptr<_Tp> 39553e519524SHoward Hinnant allocate_shared(const _Alloc& __a, _Args&& ...__args); 39563e519524SHoward Hinnant 39573e519524SHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 39583e519524SHoward Hinnant 39593e519524SHoward Hinnant static shared_ptr<_Tp> make_shared(); 39603e519524SHoward Hinnant 39613e519524SHoward Hinnant template<class _A0> 39623e519524SHoward Hinnant static shared_ptr<_Tp> make_shared(_A0&); 39633e519524SHoward Hinnant 39643e519524SHoward Hinnant template<class _A0, class _A1> 39653e519524SHoward Hinnant static shared_ptr<_Tp> make_shared(_A0&, _A1&); 39663e519524SHoward Hinnant 39673e519524SHoward Hinnant template<class _A0, class _A1, class _A2> 39683e519524SHoward Hinnant static shared_ptr<_Tp> make_shared(_A0&, _A1&, _A2&); 39693e519524SHoward Hinnant 39703e519524SHoward Hinnant template<class _Alloc> 39713e519524SHoward Hinnant static shared_ptr<_Tp> 39723e519524SHoward Hinnant allocate_shared(const _Alloc& __a); 39733e519524SHoward Hinnant 39743e519524SHoward Hinnant template<class _Alloc, class _A0> 39753e519524SHoward Hinnant static shared_ptr<_Tp> 39763e519524SHoward Hinnant allocate_shared(const _Alloc& __a, _A0& __a0); 39773e519524SHoward Hinnant 39783e519524SHoward Hinnant template<class _Alloc, class _A0, class _A1> 39793e519524SHoward Hinnant static shared_ptr<_Tp> 39803e519524SHoward Hinnant allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1); 39813e519524SHoward Hinnant 39823e519524SHoward Hinnant template<class _Alloc, class _A0, class _A1, class _A2> 39833e519524SHoward Hinnant static shared_ptr<_Tp> 39843e519524SHoward Hinnant allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1, _A2& __a2); 39853e519524SHoward Hinnant 39863e519524SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 39873e519524SHoward Hinnant 39883e519524SHoward Hinnantprivate: 39893e519524SHoward Hinnant 39903e519524SHoward Hinnant template <class _Yp> 3991848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 39923e519524SHoward Hinnant void 39933739fe79SHoward Hinnant __enable_weak_this(const enable_shared_from_this<_Yp>* __e) _NOEXCEPT 39943e519524SHoward Hinnant { 39953e519524SHoward Hinnant if (__e) 39963e519524SHoward Hinnant __e->__weak_this_ = *this; 39973e519524SHoward Hinnant } 39983e519524SHoward Hinnant 3999848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 40003739fe79SHoward Hinnant void __enable_weak_this(const void*) _NOEXCEPT {} 40013e519524SHoward Hinnant 4002848a5374SHoward Hinnant template <class _Up> friend class _LIBCPP_VISIBLE shared_ptr; 4003848a5374SHoward Hinnant template <class _Up> friend class _LIBCPP_VISIBLE weak_ptr; 40043e519524SHoward Hinnant}; 40053e519524SHoward Hinnant 40063e519524SHoward Hinnanttemplate<class _Tp> 40073e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 4008*c0937e8aSHoward Hinnant_LIBCPP_CONSTEXPR 40093739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr() _NOEXCEPT 40103e519524SHoward Hinnant : __ptr_(0), 40113e519524SHoward Hinnant __cntrl_(0) 40123e519524SHoward Hinnant{ 40133e519524SHoward Hinnant} 40143e519524SHoward Hinnant 40153e519524SHoward Hinnanttemplate<class _Tp> 40163e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 4017*c0937e8aSHoward Hinnant_LIBCPP_CONSTEXPR 40183739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr(nullptr_t) _NOEXCEPT 40193e519524SHoward Hinnant : __ptr_(0), 40203e519524SHoward Hinnant __cntrl_(0) 40213e519524SHoward Hinnant{ 40223e519524SHoward Hinnant} 40233e519524SHoward Hinnant 40243e519524SHoward Hinnanttemplate<class _Tp> 40258e25104bSHoward Hinnanttemplate<class _Yp, class> 40263e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(_Yp* __p) 40273e519524SHoward Hinnant : __ptr_(__p) 40283e519524SHoward Hinnant{ 40293e519524SHoward Hinnant unique_ptr<_Yp> __hold(__p); 40303e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, default_delete<_Yp>, allocator<_Yp> > _CntrlBlk; 40313e519524SHoward Hinnant __cntrl_ = new _CntrlBlk(__p, default_delete<_Yp>(), allocator<_Yp>()); 40323e519524SHoward Hinnant __hold.release(); 40333e519524SHoward Hinnant __enable_weak_this(__p); 40343e519524SHoward Hinnant} 40353e519524SHoward Hinnant 40363e519524SHoward Hinnanttemplate<class _Tp> 40378e25104bSHoward Hinnanttemplate<class _Yp, class _Dp, class> 40383e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(_Yp* __p, _Dp __d) 40393e519524SHoward Hinnant : __ptr_(__p) 40403e519524SHoward Hinnant{ 40413e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 40423e519524SHoward Hinnant try 40433e519524SHoward Hinnant { 4044b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 40453e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, _Dp, allocator<_Yp> > _CntrlBlk; 40463e519524SHoward Hinnant __cntrl_ = new _CntrlBlk(__p, __d, allocator<_Yp>()); 40473e519524SHoward Hinnant __enable_weak_this(__p); 40483e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 40493e519524SHoward Hinnant } 40503e519524SHoward Hinnant catch (...) 40513e519524SHoward Hinnant { 40523e519524SHoward Hinnant __d(__p); 40533e519524SHoward Hinnant throw; 40543e519524SHoward Hinnant } 4055b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 40563e519524SHoward Hinnant} 40573e519524SHoward Hinnant 40583e519524SHoward Hinnanttemplate<class _Tp> 40593e519524SHoward Hinnanttemplate<class _Dp> 40603e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(nullptr_t __p, _Dp __d) 40613e519524SHoward Hinnant : __ptr_(0) 40623e519524SHoward Hinnant{ 40633e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 40643e519524SHoward Hinnant try 40653e519524SHoward Hinnant { 4066b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 40673e519524SHoward Hinnant typedef __shared_ptr_pointer<nullptr_t, _Dp, allocator<_Tp> > _CntrlBlk; 40683e519524SHoward Hinnant __cntrl_ = new _CntrlBlk(__p, __d, allocator<_Tp>()); 40693e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 40703e519524SHoward Hinnant } 40713e519524SHoward Hinnant catch (...) 40723e519524SHoward Hinnant { 40733e519524SHoward Hinnant __d(__p); 40743e519524SHoward Hinnant throw; 40753e519524SHoward Hinnant } 4076b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 40773e519524SHoward Hinnant} 40783e519524SHoward Hinnant 40793e519524SHoward Hinnanttemplate<class _Tp> 40808e25104bSHoward Hinnanttemplate<class _Yp, class _Dp, class _Alloc, class> 40813e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(_Yp* __p, _Dp __d, _Alloc __a) 40823e519524SHoward Hinnant : __ptr_(__p) 40833e519524SHoward Hinnant{ 40843e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 40853e519524SHoward Hinnant try 40863e519524SHoward Hinnant { 4087b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 40883e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, _Dp, _Alloc> _CntrlBlk; 40893e519524SHoward Hinnant typedef typename _Alloc::template rebind<_CntrlBlk>::other _A2; 40903e519524SHoward Hinnant typedef __allocator_destructor<_A2> _D2; 40913e519524SHoward Hinnant _A2 __a2(__a); 40923e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); 40933e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__p, __d, __a); 40943e519524SHoward Hinnant __cntrl_ = __hold2.release(); 40953e519524SHoward Hinnant __enable_weak_this(__p); 40963e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 40973e519524SHoward Hinnant } 40983e519524SHoward Hinnant catch (...) 40993e519524SHoward Hinnant { 41003e519524SHoward Hinnant __d(__p); 41013e519524SHoward Hinnant throw; 41023e519524SHoward Hinnant } 4103b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 41043e519524SHoward Hinnant} 41053e519524SHoward Hinnant 41063e519524SHoward Hinnanttemplate<class _Tp> 41073e519524SHoward Hinnanttemplate<class _Dp, class _Alloc> 41083e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(nullptr_t __p, _Dp __d, _Alloc __a) 41093e519524SHoward Hinnant : __ptr_(0) 41103e519524SHoward Hinnant{ 41113e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 41123e519524SHoward Hinnant try 41133e519524SHoward Hinnant { 4114b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 41153e519524SHoward Hinnant typedef __shared_ptr_pointer<nullptr_t, _Dp, _Alloc> _CntrlBlk; 41163e519524SHoward Hinnant typedef typename _Alloc::template rebind<_CntrlBlk>::other _A2; 41173e519524SHoward Hinnant typedef __allocator_destructor<_A2> _D2; 41183e519524SHoward Hinnant _A2 __a2(__a); 41193e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); 41203e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__p, __d, __a); 41213e519524SHoward Hinnant __cntrl_ = __hold2.release(); 41223e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 41233e519524SHoward Hinnant } 41243e519524SHoward Hinnant catch (...) 41253e519524SHoward Hinnant { 41263e519524SHoward Hinnant __d(__p); 41273e519524SHoward Hinnant throw; 41283e519524SHoward Hinnant } 4129b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 41303e519524SHoward Hinnant} 41313e519524SHoward Hinnant 41323e519524SHoward Hinnanttemplate<class _Tp> 41333e519524SHoward Hinnanttemplate<class _Yp> 41343e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 41353739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr(const shared_ptr<_Yp>& __r, element_type *__p) _NOEXCEPT 41363e519524SHoward Hinnant : __ptr_(__p), 41373e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 41383e519524SHoward Hinnant{ 41393e519524SHoward Hinnant if (__cntrl_) 41403e519524SHoward Hinnant __cntrl_->__add_shared(); 41413e519524SHoward Hinnant} 41423e519524SHoward Hinnant 41433e519524SHoward Hinnanttemplate<class _Tp> 41443e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 41453739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr(const shared_ptr& __r) _NOEXCEPT 41463e519524SHoward Hinnant : __ptr_(__r.__ptr_), 41473e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 41483e519524SHoward Hinnant{ 41493e519524SHoward Hinnant if (__cntrl_) 41503e519524SHoward Hinnant __cntrl_->__add_shared(); 41513e519524SHoward Hinnant} 41523e519524SHoward Hinnant 41533e519524SHoward Hinnanttemplate<class _Tp> 41543e519524SHoward Hinnanttemplate<class _Yp> 41553e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 41563e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(const shared_ptr<_Yp>& __r, 41573e519524SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type) 41583739fe79SHoward Hinnant _NOEXCEPT 41593e519524SHoward Hinnant : __ptr_(__r.__ptr_), 41603e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 41613e519524SHoward Hinnant{ 41623e519524SHoward Hinnant if (__cntrl_) 41633e519524SHoward Hinnant __cntrl_->__add_shared(); 41643e519524SHoward Hinnant} 41653e519524SHoward Hinnant 41667609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 41673e519524SHoward Hinnant 41683e519524SHoward Hinnanttemplate<class _Tp> 41693e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 41703739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr(shared_ptr&& __r) _NOEXCEPT 41713e519524SHoward Hinnant : __ptr_(__r.__ptr_), 41723e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 41733e519524SHoward Hinnant{ 41743e519524SHoward Hinnant __r.__ptr_ = 0; 41753e519524SHoward Hinnant __r.__cntrl_ = 0; 41763e519524SHoward Hinnant} 41773e519524SHoward Hinnant 41783e519524SHoward Hinnanttemplate<class _Tp> 41793e519524SHoward Hinnanttemplate<class _Yp> 41803e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 41813e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(shared_ptr<_Yp>&& __r, 41823e519524SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type) 41833739fe79SHoward Hinnant _NOEXCEPT 41843e519524SHoward Hinnant : __ptr_(__r.__ptr_), 41853e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 41863e519524SHoward Hinnant{ 41873e519524SHoward Hinnant __r.__ptr_ = 0; 41883e519524SHoward Hinnant __r.__cntrl_ = 0; 41893e519524SHoward Hinnant} 41903e519524SHoward Hinnant 41917609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 41923e519524SHoward Hinnant 41933e519524SHoward Hinnanttemplate<class _Tp> 41948e25104bSHoward Hinnanttemplate<class _Yp, class> 41957609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 41963e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(auto_ptr<_Yp>&& __r) 41973e519524SHoward Hinnant#else 41989f1102b7SHoward Hinnantshared_ptr<_Tp>::shared_ptr(auto_ptr<_Yp> __r) 41993e519524SHoward Hinnant#endif 42003e519524SHoward Hinnant : __ptr_(__r.get()) 42013e519524SHoward Hinnant{ 42023e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, default_delete<_Yp>, allocator<_Yp> > _CntrlBlk; 42033e519524SHoward Hinnant __cntrl_ = new _CntrlBlk(__r.get(), default_delete<_Yp>(), allocator<_Yp>()); 42043e519524SHoward Hinnant __enable_weak_this(__r.get()); 42053e519524SHoward Hinnant __r.release(); 42063e519524SHoward Hinnant} 42073e519524SHoward Hinnant 42083e519524SHoward Hinnanttemplate<class _Tp> 42098e25104bSHoward Hinnanttemplate <class _Yp, class _Dp, class> 42107609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 42113e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp>&& __r, 42123e519524SHoward Hinnant#else 42133e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp> __r, 42143e519524SHoward Hinnant#endif 42153e519524SHoward Hinnant typename enable_if<!is_lvalue_reference<_Dp>::value, __nat>::type) 42163e519524SHoward Hinnant : __ptr_(__r.get()) 42173e519524SHoward Hinnant{ 42183e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, _Dp, allocator<_Yp> > _CntrlBlk; 42193e519524SHoward Hinnant __cntrl_ = new _CntrlBlk(__r.get(), __r.get_deleter(), allocator<_Yp>()); 42203e519524SHoward Hinnant __enable_weak_this(__r.get()); 42213e519524SHoward Hinnant __r.release(); 42223e519524SHoward Hinnant} 42233e519524SHoward Hinnant 42243e519524SHoward Hinnanttemplate<class _Tp> 42258e25104bSHoward Hinnanttemplate <class _Yp, class _Dp, class> 42267609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 42273e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp>&& __r, 42283e519524SHoward Hinnant#else 42293e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp> __r, 42303e519524SHoward Hinnant#endif 42313e519524SHoward Hinnant typename enable_if<is_lvalue_reference<_Dp>::value, __nat>::type) 42323e519524SHoward Hinnant : __ptr_(__r.get()) 42333e519524SHoward Hinnant{ 42343e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, 42353e519524SHoward Hinnant reference_wrapper<typename remove_reference<_Dp>::type>, 42363e519524SHoward Hinnant allocator<_Yp> > _CntrlBlk; 42373e519524SHoward Hinnant __cntrl_ = new _CntrlBlk(__r.get(), ref(__r.get_deleter()), allocator<_Yp>()); 42383e519524SHoward Hinnant __enable_weak_this(__r.get()); 42393e519524SHoward Hinnant __r.release(); 42403e519524SHoward Hinnant} 42413e519524SHoward Hinnant 42423e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 42433e519524SHoward Hinnant 42443e519524SHoward Hinnanttemplate<class _Tp> 42453e519524SHoward Hinnanttemplate<class ..._Args> 42463e519524SHoward Hinnantshared_ptr<_Tp> 42473e519524SHoward Hinnantshared_ptr<_Tp>::make_shared(_Args&& ...__args) 42483e519524SHoward Hinnant{ 42493e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 42503e519524SHoward Hinnant typedef allocator<_CntrlBlk> _A2; 42513e519524SHoward Hinnant typedef __allocator_destructor<_A2> _D2; 42523e519524SHoward Hinnant _A2 __a2; 42533e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); 4254ce48a113SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__a2, _VSTD::forward<_Args>(__args)...); 42553e519524SHoward Hinnant shared_ptr<_Tp> __r; 42563e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 42573e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 42583e519524SHoward Hinnant __r.__enable_weak_this(__r.__ptr_); 42593e519524SHoward Hinnant return __r; 42603e519524SHoward Hinnant} 42613e519524SHoward Hinnant 42623e519524SHoward Hinnanttemplate<class _Tp> 42633e519524SHoward Hinnanttemplate<class _Alloc, class ..._Args> 42643e519524SHoward Hinnantshared_ptr<_Tp> 42653e519524SHoward Hinnantshared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _Args&& ...__args) 42663e519524SHoward Hinnant{ 42673e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 42683e519524SHoward Hinnant typedef typename _Alloc::template rebind<_CntrlBlk>::other _A2; 42693e519524SHoward Hinnant typedef __allocator_destructor<_A2> _D2; 42703e519524SHoward Hinnant _A2 __a2(__a); 42713e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); 4272ce48a113SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__a, _VSTD::forward<_Args>(__args)...); 42733e519524SHoward Hinnant shared_ptr<_Tp> __r; 42743e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 42753e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 42763e519524SHoward Hinnant __r.__enable_weak_this(__r.__ptr_); 42773e519524SHoward Hinnant return __r; 42783e519524SHoward Hinnant} 42793e519524SHoward Hinnant 42803e519524SHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 42813e519524SHoward Hinnant 42823e519524SHoward Hinnanttemplate<class _Tp> 42833e519524SHoward Hinnantshared_ptr<_Tp> 42843e519524SHoward Hinnantshared_ptr<_Tp>::make_shared() 42853e519524SHoward Hinnant{ 42863e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 42873e519524SHoward Hinnant typedef allocator<_CntrlBlk> _Alloc2; 42883e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 42893e519524SHoward Hinnant _Alloc2 __alloc2; 42903e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 42913e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__alloc2); 42923e519524SHoward Hinnant shared_ptr<_Tp> __r; 42933e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 42943e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 42953e519524SHoward Hinnant __r.__enable_weak_this(__r.__ptr_); 42963e519524SHoward Hinnant return __r; 42973e519524SHoward Hinnant} 42983e519524SHoward Hinnant 42993e519524SHoward Hinnanttemplate<class _Tp> 43003e519524SHoward Hinnanttemplate<class _A0> 43013e519524SHoward Hinnantshared_ptr<_Tp> 43023e519524SHoward Hinnantshared_ptr<_Tp>::make_shared(_A0& __a0) 43033e519524SHoward Hinnant{ 43043e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 43053e519524SHoward Hinnant typedef allocator<_CntrlBlk> _Alloc2; 43063e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 43073e519524SHoward Hinnant _Alloc2 __alloc2; 43083e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 43093e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__alloc2, __a0); 43103e519524SHoward Hinnant shared_ptr<_Tp> __r; 43113e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 43123e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 43133e519524SHoward Hinnant __r.__enable_weak_this(__r.__ptr_); 43143e519524SHoward Hinnant return __r; 43153e519524SHoward Hinnant} 43163e519524SHoward Hinnant 43173e519524SHoward Hinnanttemplate<class _Tp> 43183e519524SHoward Hinnanttemplate<class _A0, class _A1> 43193e519524SHoward Hinnantshared_ptr<_Tp> 43203e519524SHoward Hinnantshared_ptr<_Tp>::make_shared(_A0& __a0, _A1& __a1) 43213e519524SHoward Hinnant{ 43223e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 43233e519524SHoward Hinnant typedef allocator<_CntrlBlk> _Alloc2; 43243e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 43253e519524SHoward Hinnant _Alloc2 __alloc2; 43263e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 43273e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__alloc2, __a0, __a1); 43283e519524SHoward Hinnant shared_ptr<_Tp> __r; 43293e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 43303e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 43313e519524SHoward Hinnant __r.__enable_weak_this(__r.__ptr_); 43323e519524SHoward Hinnant return __r; 43333e519524SHoward Hinnant} 43343e519524SHoward Hinnant 43353e519524SHoward Hinnanttemplate<class _Tp> 43363e519524SHoward Hinnanttemplate<class _A0, class _A1, class _A2> 43373e519524SHoward Hinnantshared_ptr<_Tp> 43383e519524SHoward Hinnantshared_ptr<_Tp>::make_shared(_A0& __a0, _A1& __a1, _A2& __a2) 43393e519524SHoward Hinnant{ 43403e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 43413e519524SHoward Hinnant typedef allocator<_CntrlBlk> _Alloc2; 43423e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 43433e519524SHoward Hinnant _Alloc2 __alloc2; 43443e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 43453e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__alloc2, __a0, __a1, __a2); 43463e519524SHoward Hinnant shared_ptr<_Tp> __r; 43473e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 43483e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 43493e519524SHoward Hinnant __r.__enable_weak_this(__r.__ptr_); 43503e519524SHoward Hinnant return __r; 43513e519524SHoward Hinnant} 43523e519524SHoward Hinnant 43533e519524SHoward Hinnanttemplate<class _Tp> 43543e519524SHoward Hinnanttemplate<class _Alloc> 43553e519524SHoward Hinnantshared_ptr<_Tp> 43563e519524SHoward Hinnantshared_ptr<_Tp>::allocate_shared(const _Alloc& __a) 43573e519524SHoward Hinnant{ 43583e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 43593e519524SHoward Hinnant typedef typename _Alloc::template rebind<_CntrlBlk>::other _Alloc2; 43603e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 43613e519524SHoward Hinnant _Alloc2 __alloc2(__a); 43623e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 43633e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__a); 43643e519524SHoward Hinnant shared_ptr<_Tp> __r; 43653e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 43663e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 43673e519524SHoward Hinnant __r.__enable_weak_this(__r.__ptr_); 43683e519524SHoward Hinnant return __r; 43693e519524SHoward Hinnant} 43703e519524SHoward Hinnant 43713e519524SHoward Hinnanttemplate<class _Tp> 43723e519524SHoward Hinnanttemplate<class _Alloc, class _A0> 43733e519524SHoward Hinnantshared_ptr<_Tp> 43743e519524SHoward Hinnantshared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _A0& __a0) 43753e519524SHoward Hinnant{ 43763e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 43773e519524SHoward Hinnant typedef typename _Alloc::template rebind<_CntrlBlk>::other _Alloc2; 43783e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 43793e519524SHoward Hinnant _Alloc2 __alloc2(__a); 43803e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 43813e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__a, __a0); 43823e519524SHoward Hinnant shared_ptr<_Tp> __r; 43833e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 43843e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 43853e519524SHoward Hinnant __r.__enable_weak_this(__r.__ptr_); 43863e519524SHoward Hinnant return __r; 43873e519524SHoward Hinnant} 43883e519524SHoward Hinnant 43893e519524SHoward Hinnanttemplate<class _Tp> 43903e519524SHoward Hinnanttemplate<class _Alloc, class _A0, class _A1> 43913e519524SHoward Hinnantshared_ptr<_Tp> 43923e519524SHoward Hinnantshared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1) 43933e519524SHoward Hinnant{ 43943e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 43953e519524SHoward Hinnant typedef typename _Alloc::template rebind<_CntrlBlk>::other _Alloc2; 43963e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 43973e519524SHoward Hinnant _Alloc2 __alloc2(__a); 43983e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 43993e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__a, __a0, __a1); 44003e519524SHoward Hinnant shared_ptr<_Tp> __r; 44013e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 44023e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 44033e519524SHoward Hinnant __r.__enable_weak_this(__r.__ptr_); 44043e519524SHoward Hinnant return __r; 44053e519524SHoward Hinnant} 44063e519524SHoward Hinnant 44073e519524SHoward Hinnanttemplate<class _Tp> 44083e519524SHoward Hinnanttemplate<class _Alloc, class _A0, class _A1, class _A2> 44093e519524SHoward Hinnantshared_ptr<_Tp> 44103e519524SHoward Hinnantshared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1, _A2& __a2) 44113e519524SHoward Hinnant{ 44123e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 44133e519524SHoward Hinnant typedef typename _Alloc::template rebind<_CntrlBlk>::other _Alloc2; 44143e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 44153e519524SHoward Hinnant _Alloc2 __alloc2(__a); 44163e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 44173e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__a, __a0, __a1, __a2); 44183e519524SHoward Hinnant shared_ptr<_Tp> __r; 44193e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 44203e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 44213e519524SHoward Hinnant __r.__enable_weak_this(__r.__ptr_); 44223e519524SHoward Hinnant return __r; 44233e519524SHoward Hinnant} 44243e519524SHoward Hinnant 44253e519524SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 44263e519524SHoward Hinnant 44273e519524SHoward Hinnanttemplate<class _Tp> 44283e519524SHoward Hinnantshared_ptr<_Tp>::~shared_ptr() 44293e519524SHoward Hinnant{ 44303e519524SHoward Hinnant if (__cntrl_) 44313e519524SHoward Hinnant __cntrl_->__release_shared(); 44323e519524SHoward Hinnant} 44333e519524SHoward Hinnant 44343e519524SHoward Hinnanttemplate<class _Tp> 44353e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 44363e519524SHoward Hinnantshared_ptr<_Tp>& 44373739fe79SHoward Hinnantshared_ptr<_Tp>::operator=(const shared_ptr& __r) _NOEXCEPT 44383e519524SHoward Hinnant{ 44393e519524SHoward Hinnant shared_ptr(__r).swap(*this); 44403e519524SHoward Hinnant return *this; 44413e519524SHoward Hinnant} 44423e519524SHoward Hinnant 44433e519524SHoward Hinnanttemplate<class _Tp> 44443e519524SHoward Hinnanttemplate<class _Yp> 44453e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 44468e25104bSHoward Hinnanttypename enable_if 44478e25104bSHoward Hinnant< 44488e25104bSHoward Hinnant is_convertible<_Yp*, _Tp*>::value, 44493e519524SHoward Hinnant shared_ptr<_Tp>& 44508e25104bSHoward Hinnant>::type 44513739fe79SHoward Hinnantshared_ptr<_Tp>::operator=(const shared_ptr<_Yp>& __r) _NOEXCEPT 44523e519524SHoward Hinnant{ 44533e519524SHoward Hinnant shared_ptr(__r).swap(*this); 44543e519524SHoward Hinnant return *this; 44553e519524SHoward Hinnant} 44563e519524SHoward Hinnant 44577609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 44583e519524SHoward Hinnant 44593e519524SHoward Hinnanttemplate<class _Tp> 44603e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 44613e519524SHoward Hinnantshared_ptr<_Tp>& 44623739fe79SHoward Hinnantshared_ptr<_Tp>::operator=(shared_ptr&& __r) _NOEXCEPT 44633e519524SHoward Hinnant{ 4464ce48a113SHoward Hinnant shared_ptr(_VSTD::move(__r)).swap(*this); 44653e519524SHoward Hinnant return *this; 44663e519524SHoward Hinnant} 44673e519524SHoward Hinnant 44683e519524SHoward Hinnanttemplate<class _Tp> 44693e519524SHoward Hinnanttemplate<class _Yp> 44703e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 44718e25104bSHoward Hinnanttypename enable_if 44728e25104bSHoward Hinnant< 44738e25104bSHoward Hinnant is_convertible<_Yp*, _Tp*>::value, 44743e519524SHoward Hinnant shared_ptr<_Tp>& 44758e25104bSHoward Hinnant>::type 44763e519524SHoward Hinnantshared_ptr<_Tp>::operator=(shared_ptr<_Yp>&& __r) 44773e519524SHoward Hinnant{ 4478ce48a113SHoward Hinnant shared_ptr(_VSTD::move(__r)).swap(*this); 44793e519524SHoward Hinnant return *this; 44803e519524SHoward Hinnant} 44813e519524SHoward Hinnant 44823e519524SHoward Hinnanttemplate<class _Tp> 44833e519524SHoward Hinnanttemplate<class _Yp> 44843e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 44858e25104bSHoward Hinnanttypename enable_if 44868e25104bSHoward Hinnant< 44878e25104bSHoward Hinnant !is_array<_Yp>::value && 44888e25104bSHoward Hinnant is_convertible<_Yp*, _Tp*>::value, 44893e519524SHoward Hinnant shared_ptr<_Tp>& 44908e25104bSHoward Hinnant>::type 44913e519524SHoward Hinnantshared_ptr<_Tp>::operator=(auto_ptr<_Yp>&& __r) 44923e519524SHoward Hinnant{ 4493ce48a113SHoward Hinnant shared_ptr(_VSTD::move(__r)).swap(*this); 44943e519524SHoward Hinnant return *this; 44953e519524SHoward Hinnant} 44963e519524SHoward Hinnant 44973e519524SHoward Hinnanttemplate<class _Tp> 44983e519524SHoward Hinnanttemplate <class _Yp, class _Dp> 44993e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 45008e25104bSHoward Hinnanttypename enable_if 45018e25104bSHoward Hinnant< 45028e25104bSHoward Hinnant !is_array<_Yp>::value && 45038e25104bSHoward Hinnant is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, _Tp*>::value, 45043e519524SHoward Hinnant shared_ptr<_Tp>& 45058e25104bSHoward Hinnant>::type 45063e519524SHoward Hinnantshared_ptr<_Tp>::operator=(unique_ptr<_Yp, _Dp>&& __r) 45073e519524SHoward Hinnant{ 4508ce48a113SHoward Hinnant shared_ptr(_VSTD::move(__r)).swap(*this); 45093e519524SHoward Hinnant return *this; 45103e519524SHoward Hinnant} 45113e519524SHoward Hinnant 45127609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 45133e519524SHoward Hinnant 45143e519524SHoward Hinnanttemplate<class _Tp> 45153e519524SHoward Hinnanttemplate<class _Yp> 45163e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 45178e25104bSHoward Hinnanttypename enable_if 45188e25104bSHoward Hinnant< 45198e25104bSHoward Hinnant !is_array<_Yp>::value && 45208e25104bSHoward Hinnant is_convertible<_Yp*, _Tp*>::value, 45213e519524SHoward Hinnant shared_ptr<_Tp>& 45228e25104bSHoward Hinnant>::type 4523b3371f6fSHoward Hinnantshared_ptr<_Tp>::operator=(auto_ptr<_Yp> __r) 45243e519524SHoward Hinnant{ 45253e519524SHoward Hinnant shared_ptr(__r).swap(*this); 45263e519524SHoward Hinnant return *this; 45273e519524SHoward Hinnant} 45283e519524SHoward Hinnant 45293e519524SHoward Hinnanttemplate<class _Tp> 45303e519524SHoward Hinnanttemplate <class _Yp, class _Dp> 45313e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 45328e25104bSHoward Hinnanttypename enable_if 45338e25104bSHoward Hinnant< 45348e25104bSHoward Hinnant !is_array<_Yp>::value && 45358e25104bSHoward Hinnant is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, _Tp*>::value, 45363e519524SHoward Hinnant shared_ptr<_Tp>& 45378e25104bSHoward Hinnant>::type 45383e519524SHoward Hinnantshared_ptr<_Tp>::operator=(unique_ptr<_Yp, _Dp> __r) 45393e519524SHoward Hinnant{ 4540ce48a113SHoward Hinnant shared_ptr(_VSTD::move(__r)).swap(*this); 45413e519524SHoward Hinnant return *this; 45423e519524SHoward Hinnant} 45433e519524SHoward Hinnant 45447609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 45453e519524SHoward Hinnant 45463e519524SHoward Hinnanttemplate<class _Tp> 45473e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 45483e519524SHoward Hinnantvoid 45493739fe79SHoward Hinnantshared_ptr<_Tp>::swap(shared_ptr& __r) _NOEXCEPT 45503e519524SHoward Hinnant{ 4551ce48a113SHoward Hinnant _VSTD::swap(__ptr_, __r.__ptr_); 4552ce48a113SHoward Hinnant _VSTD::swap(__cntrl_, __r.__cntrl_); 45533e519524SHoward Hinnant} 45543e519524SHoward Hinnant 45553e519524SHoward Hinnanttemplate<class _Tp> 45563e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 45573e519524SHoward Hinnantvoid 45583739fe79SHoward Hinnantshared_ptr<_Tp>::reset() _NOEXCEPT 45593e519524SHoward Hinnant{ 45603e519524SHoward Hinnant shared_ptr().swap(*this); 45613e519524SHoward Hinnant} 45623e519524SHoward Hinnant 45633e519524SHoward Hinnanttemplate<class _Tp> 45643e519524SHoward Hinnanttemplate<class _Yp> 45653e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 45668e25104bSHoward Hinnanttypename enable_if 45678e25104bSHoward Hinnant< 45688e25104bSHoward Hinnant is_convertible<_Yp*, _Tp*>::value, 45693e519524SHoward Hinnant void 45708e25104bSHoward Hinnant>::type 45713e519524SHoward Hinnantshared_ptr<_Tp>::reset(_Yp* __p) 45723e519524SHoward Hinnant{ 45733e519524SHoward Hinnant shared_ptr(__p).swap(*this); 45743e519524SHoward Hinnant} 45753e519524SHoward Hinnant 45763e519524SHoward Hinnanttemplate<class _Tp> 45773e519524SHoward Hinnanttemplate<class _Yp, class _Dp> 45783e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 45798e25104bSHoward Hinnanttypename enable_if 45808e25104bSHoward Hinnant< 45818e25104bSHoward Hinnant is_convertible<_Yp*, _Tp*>::value, 45823e519524SHoward Hinnant void 45838e25104bSHoward Hinnant>::type 45843e519524SHoward Hinnantshared_ptr<_Tp>::reset(_Yp* __p, _Dp __d) 45853e519524SHoward Hinnant{ 45863e519524SHoward Hinnant shared_ptr(__p, __d).swap(*this); 45873e519524SHoward Hinnant} 45883e519524SHoward Hinnant 45893e519524SHoward Hinnanttemplate<class _Tp> 45903e519524SHoward Hinnanttemplate<class _Yp, class _Dp, class _Alloc> 45913e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 45928e25104bSHoward Hinnanttypename enable_if 45938e25104bSHoward Hinnant< 45948e25104bSHoward Hinnant is_convertible<_Yp*, _Tp*>::value, 45953e519524SHoward Hinnant void 45968e25104bSHoward Hinnant>::type 45973e519524SHoward Hinnantshared_ptr<_Tp>::reset(_Yp* __p, _Dp __d, _Alloc __a) 45983e519524SHoward Hinnant{ 45993e519524SHoward Hinnant shared_ptr(__p, __d, __a).swap(*this); 46003e519524SHoward Hinnant} 46013e519524SHoward Hinnant 46023e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 46033e519524SHoward Hinnant 46043e519524SHoward Hinnanttemplate<class _Tp, class ..._Args> 46053e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 46068e25104bSHoward Hinnanttypename enable_if 46078e25104bSHoward Hinnant< 46088e25104bSHoward Hinnant !is_array<_Tp>::value, 46093e519524SHoward Hinnant shared_ptr<_Tp> 46108e25104bSHoward Hinnant>::type 46113e519524SHoward Hinnantmake_shared(_Args&& ...__args) 46123e519524SHoward Hinnant{ 4613ce48a113SHoward Hinnant return shared_ptr<_Tp>::make_shared(_VSTD::forward<_Args>(__args)...); 46143e519524SHoward Hinnant} 46153e519524SHoward Hinnant 46163e519524SHoward Hinnanttemplate<class _Tp, class _Alloc, class ..._Args> 46173e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 46188e25104bSHoward Hinnanttypename enable_if 46198e25104bSHoward Hinnant< 46208e25104bSHoward Hinnant !is_array<_Tp>::value, 46213e519524SHoward Hinnant shared_ptr<_Tp> 46228e25104bSHoward Hinnant>::type 46233e519524SHoward Hinnantallocate_shared(const _Alloc& __a, _Args&& ...__args) 46243e519524SHoward Hinnant{ 4625ce48a113SHoward Hinnant return shared_ptr<_Tp>::allocate_shared(__a, _VSTD::forward<_Args>(__args)...); 46263e519524SHoward Hinnant} 46273e519524SHoward Hinnant 46283e519524SHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 46293e519524SHoward Hinnant 46303e519524SHoward Hinnanttemplate<class _Tp> 46313e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 46323e519524SHoward Hinnantshared_ptr<_Tp> 46333e519524SHoward Hinnantmake_shared() 46343e519524SHoward Hinnant{ 46353e519524SHoward Hinnant return shared_ptr<_Tp>::make_shared(); 46363e519524SHoward Hinnant} 46373e519524SHoward Hinnant 46383e519524SHoward Hinnanttemplate<class _Tp, class _A0> 46393e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 46403e519524SHoward Hinnantshared_ptr<_Tp> 46413e519524SHoward Hinnantmake_shared(_A0& __a0) 46423e519524SHoward Hinnant{ 46433e519524SHoward Hinnant return shared_ptr<_Tp>::make_shared(__a0); 46443e519524SHoward Hinnant} 46453e519524SHoward Hinnant 46463e519524SHoward Hinnanttemplate<class _Tp, class _A0, class _A1> 46473e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 46483e519524SHoward Hinnantshared_ptr<_Tp> 46493e519524SHoward Hinnantmake_shared(_A0& __a0, _A1& __a1) 46503e519524SHoward Hinnant{ 46513e519524SHoward Hinnant return shared_ptr<_Tp>::make_shared(__a0, __a1); 46523e519524SHoward Hinnant} 46533e519524SHoward Hinnant 46543e519524SHoward Hinnanttemplate<class _Tp, class _A0, class _A1, class _A2> 46553e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 46563e519524SHoward Hinnantshared_ptr<_Tp> 46573e519524SHoward Hinnantmake_shared(_A0& __a0, _A1& __a1, _A2& __a2) 46583e519524SHoward Hinnant{ 46593e519524SHoward Hinnant return shared_ptr<_Tp>::make_shared(__a0, __a1, __a2); 46603e519524SHoward Hinnant} 46613e519524SHoward Hinnant 46623e519524SHoward Hinnanttemplate<class _Tp, class _Alloc> 46633e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 46643e519524SHoward Hinnantshared_ptr<_Tp> 46653e519524SHoward Hinnantallocate_shared(const _Alloc& __a) 46663e519524SHoward Hinnant{ 46673e519524SHoward Hinnant return shared_ptr<_Tp>::allocate_shared(__a); 46683e519524SHoward Hinnant} 46693e519524SHoward Hinnant 46703e519524SHoward Hinnanttemplate<class _Tp, class _Alloc, class _A0> 46713e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 46723e519524SHoward Hinnantshared_ptr<_Tp> 46733e519524SHoward Hinnantallocate_shared(const _Alloc& __a, _A0& __a0) 46743e519524SHoward Hinnant{ 46753e519524SHoward Hinnant return shared_ptr<_Tp>::allocate_shared(__a, __a0); 46763e519524SHoward Hinnant} 46773e519524SHoward Hinnant 46783e519524SHoward Hinnanttemplate<class _Tp, class _Alloc, class _A0, class _A1> 46793e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 46803e519524SHoward Hinnantshared_ptr<_Tp> 46813e519524SHoward Hinnantallocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1) 46823e519524SHoward Hinnant{ 46833e519524SHoward Hinnant return shared_ptr<_Tp>::allocate_shared(__a, __a0, __a1); 46843e519524SHoward Hinnant} 46853e519524SHoward Hinnant 46863e519524SHoward Hinnanttemplate<class _Tp, class _Alloc, class _A0, class _A1, class _A2> 46873e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 46883e519524SHoward Hinnantshared_ptr<_Tp> 46893e519524SHoward Hinnantallocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1, _A2& __a2) 46903e519524SHoward Hinnant{ 46913e519524SHoward Hinnant return shared_ptr<_Tp>::allocate_shared(__a, __a0, __a1, __a2); 46923e519524SHoward Hinnant} 46933e519524SHoward Hinnant 46943e519524SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 46953e519524SHoward Hinnant 46963e519524SHoward Hinnanttemplate<class _Tp, class _Up> 46973e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 46983e519524SHoward Hinnantbool 46993739fe79SHoward Hinnantoperator==(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 47003e519524SHoward Hinnant{ 47013e519524SHoward Hinnant return __x.get() == __y.get(); 47023e519524SHoward Hinnant} 47033e519524SHoward Hinnant 47043e519524SHoward Hinnanttemplate<class _Tp, class _Up> 47053e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 47063e519524SHoward Hinnantbool 47073739fe79SHoward Hinnantoperator!=(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 47083e519524SHoward Hinnant{ 47093e519524SHoward Hinnant return !(__x == __y); 47103e519524SHoward Hinnant} 47113e519524SHoward Hinnant 47123e519524SHoward Hinnanttemplate<class _Tp, class _Up> 47133e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 47143e519524SHoward Hinnantbool 47153739fe79SHoward Hinnantoperator<(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 47163e519524SHoward Hinnant{ 471767f39647SHoward Hinnant typedef typename common_type<_Tp*, _Up*>::type _V; 471867f39647SHoward Hinnant return less<_V>()(__x.get(), __y.get()); 471967f39647SHoward Hinnant} 472067f39647SHoward Hinnant 472167f39647SHoward Hinnanttemplate<class _Tp, class _Up> 472267f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 472367f39647SHoward Hinnantbool 472467f39647SHoward Hinnantoperator>(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 472567f39647SHoward Hinnant{ 472667f39647SHoward Hinnant return __y < __x; 472767f39647SHoward Hinnant} 472867f39647SHoward Hinnant 472967f39647SHoward Hinnanttemplate<class _Tp, class _Up> 473067f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 473167f39647SHoward Hinnantbool 473267f39647SHoward Hinnantoperator<=(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 473367f39647SHoward Hinnant{ 473467f39647SHoward Hinnant return !(__y < __x); 473567f39647SHoward Hinnant} 473667f39647SHoward Hinnant 473767f39647SHoward Hinnanttemplate<class _Tp, class _Up> 473867f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 473967f39647SHoward Hinnantbool 474067f39647SHoward Hinnantoperator>=(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 474167f39647SHoward Hinnant{ 474267f39647SHoward Hinnant return !(__x < __y); 474367f39647SHoward Hinnant} 474467f39647SHoward Hinnant 474567f39647SHoward Hinnanttemplate<class _Tp> 474667f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 474767f39647SHoward Hinnantbool 474867f39647SHoward Hinnantoperator==(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 474967f39647SHoward Hinnant{ 475067f39647SHoward Hinnant return !__x; 475167f39647SHoward Hinnant} 475267f39647SHoward Hinnant 475367f39647SHoward Hinnanttemplate<class _Tp> 475467f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 475567f39647SHoward Hinnantbool 475667f39647SHoward Hinnantoperator==(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 475767f39647SHoward Hinnant{ 475867f39647SHoward Hinnant return !__x; 475967f39647SHoward Hinnant} 476067f39647SHoward Hinnant 476167f39647SHoward Hinnanttemplate<class _Tp> 476267f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 476367f39647SHoward Hinnantbool 476467f39647SHoward Hinnantoperator!=(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 476567f39647SHoward Hinnant{ 476667f39647SHoward Hinnant return static_cast<bool>(__x); 476767f39647SHoward Hinnant} 476867f39647SHoward Hinnant 476967f39647SHoward Hinnanttemplate<class _Tp> 477067f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 477167f39647SHoward Hinnantbool 477267f39647SHoward Hinnantoperator!=(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 477367f39647SHoward Hinnant{ 477467f39647SHoward Hinnant return static_cast<bool>(__x); 477567f39647SHoward Hinnant} 477667f39647SHoward Hinnant 477767f39647SHoward Hinnanttemplate<class _Tp> 477867f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 477967f39647SHoward Hinnantbool 478067f39647SHoward Hinnantoperator<(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 478167f39647SHoward Hinnant{ 478267f39647SHoward Hinnant return less<_Tp*>()(__x.get(), nullptr); 478367f39647SHoward Hinnant} 478467f39647SHoward Hinnant 478567f39647SHoward Hinnanttemplate<class _Tp> 478667f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 478767f39647SHoward Hinnantbool 478867f39647SHoward Hinnantoperator<(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 478967f39647SHoward Hinnant{ 479067f39647SHoward Hinnant return less<_Tp*>()(nullptr, __x.get()); 479167f39647SHoward Hinnant} 479267f39647SHoward Hinnant 479367f39647SHoward Hinnanttemplate<class _Tp> 479467f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 479567f39647SHoward Hinnantbool 479667f39647SHoward Hinnantoperator>(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 479767f39647SHoward Hinnant{ 479867f39647SHoward Hinnant return nullptr < __x; 479967f39647SHoward Hinnant} 480067f39647SHoward Hinnant 480167f39647SHoward Hinnanttemplate<class _Tp> 480267f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 480367f39647SHoward Hinnantbool 480467f39647SHoward Hinnantoperator>(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 480567f39647SHoward Hinnant{ 480667f39647SHoward Hinnant return __x < nullptr; 480767f39647SHoward Hinnant} 480867f39647SHoward Hinnant 480967f39647SHoward Hinnanttemplate<class _Tp> 481067f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 481167f39647SHoward Hinnantbool 481267f39647SHoward Hinnantoperator<=(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 481367f39647SHoward Hinnant{ 481467f39647SHoward Hinnant return !(nullptr < __x); 481567f39647SHoward Hinnant} 481667f39647SHoward Hinnant 481767f39647SHoward Hinnanttemplate<class _Tp> 481867f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 481967f39647SHoward Hinnantbool 482067f39647SHoward Hinnantoperator<=(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 482167f39647SHoward Hinnant{ 482267f39647SHoward Hinnant return !(__x < nullptr); 482367f39647SHoward Hinnant} 482467f39647SHoward Hinnant 482567f39647SHoward Hinnanttemplate<class _Tp> 482667f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 482767f39647SHoward Hinnantbool 482867f39647SHoward Hinnantoperator>=(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 482967f39647SHoward Hinnant{ 483067f39647SHoward Hinnant return !(__x < nullptr); 483167f39647SHoward Hinnant} 483267f39647SHoward Hinnant 483367f39647SHoward Hinnanttemplate<class _Tp> 483467f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 483567f39647SHoward Hinnantbool 483667f39647SHoward Hinnantoperator>=(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 483767f39647SHoward Hinnant{ 483867f39647SHoward Hinnant return !(nullptr < __x); 48393e519524SHoward Hinnant} 48403e519524SHoward Hinnant 48413e519524SHoward Hinnanttemplate<class _Tp> 48423e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 48433e519524SHoward Hinnantvoid 48443739fe79SHoward Hinnantswap(shared_ptr<_Tp>& __x, shared_ptr<_Tp>& __y) _NOEXCEPT 48453e519524SHoward Hinnant{ 48463e519524SHoward Hinnant __x.swap(__y); 48473e519524SHoward Hinnant} 48483e519524SHoward Hinnant 48493e519524SHoward Hinnanttemplate<class _Tp, class _Up> 48503e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 48518e25104bSHoward Hinnanttypename enable_if 48528e25104bSHoward Hinnant< 48538e25104bSHoward Hinnant !is_array<_Tp>::value && !is_array<_Up>::value, 48543e519524SHoward Hinnant shared_ptr<_Tp> 48558e25104bSHoward Hinnant>::type 48563739fe79SHoward Hinnantstatic_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT 48573e519524SHoward Hinnant{ 48583e519524SHoward Hinnant return shared_ptr<_Tp>(__r, static_cast<_Tp*>(__r.get())); 48593e519524SHoward Hinnant} 48603e519524SHoward Hinnant 48613e519524SHoward Hinnanttemplate<class _Tp, class _Up> 48623e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 48638e25104bSHoward Hinnanttypename enable_if 48648e25104bSHoward Hinnant< 48658e25104bSHoward Hinnant !is_array<_Tp>::value && !is_array<_Up>::value, 48663e519524SHoward Hinnant shared_ptr<_Tp> 48678e25104bSHoward Hinnant>::type 48683739fe79SHoward Hinnantdynamic_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT 48693e519524SHoward Hinnant{ 48703e519524SHoward Hinnant _Tp* __p = dynamic_cast<_Tp*>(__r.get()); 48713e519524SHoward Hinnant return __p ? shared_ptr<_Tp>(__r, __p) : shared_ptr<_Tp>(); 48723e519524SHoward Hinnant} 48733e519524SHoward Hinnant 48743e519524SHoward Hinnanttemplate<class _Tp, class _Up> 48758e25104bSHoward Hinnanttypename enable_if 48768e25104bSHoward Hinnant< 48778e25104bSHoward Hinnant is_array<_Tp>::value == is_array<_Up>::value, 48783e519524SHoward Hinnant shared_ptr<_Tp> 48798e25104bSHoward Hinnant>::type 48803739fe79SHoward Hinnantconst_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT 48813e519524SHoward Hinnant{ 48828e25104bSHoward Hinnant typedef typename remove_extent<_Tp>::type _RTp; 48838e25104bSHoward Hinnant return shared_ptr<_Tp>(__r, const_cast<_RTp*>(__r.get())); 48843e519524SHoward Hinnant} 48853e519524SHoward Hinnant 488654b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI 488754b409fdSHoward Hinnant 48883e519524SHoward Hinnanttemplate<class _Dp, class _Tp> 48893e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 48903e519524SHoward Hinnant_Dp* 48913739fe79SHoward Hinnantget_deleter(const shared_ptr<_Tp>& __p) _NOEXCEPT 48923e519524SHoward Hinnant{ 48933e519524SHoward Hinnant return __p.template __get_deleter<_Dp>(); 48943e519524SHoward Hinnant} 48953e519524SHoward Hinnant 4896b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_RTTI 489754b409fdSHoward Hinnant 48983e519524SHoward Hinnanttemplate<class _Tp> 4899848a5374SHoward Hinnantclass _LIBCPP_VISIBLE weak_ptr 49003e519524SHoward Hinnant{ 49013e519524SHoward Hinnantpublic: 49023e519524SHoward Hinnant typedef _Tp element_type; 49033e519524SHoward Hinnantprivate: 49043e519524SHoward Hinnant element_type* __ptr_; 49053e519524SHoward Hinnant __shared_weak_count* __cntrl_; 49063e519524SHoward Hinnant 49073e519524SHoward Hinnantpublic: 4908*c0937e8aSHoward Hinnant _LIBCPP_CONSTEXPR weak_ptr() _NOEXCEPT; 49093e519524SHoward Hinnant template<class _Yp> weak_ptr(shared_ptr<_Yp> const& __r, 49103739fe79SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0) 49113739fe79SHoward Hinnant _NOEXCEPT; 49123739fe79SHoward Hinnant weak_ptr(weak_ptr const& __r) _NOEXCEPT; 49133e519524SHoward Hinnant template<class _Yp> weak_ptr(weak_ptr<_Yp> const& __r, 49143739fe79SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0) 49153739fe79SHoward Hinnant _NOEXCEPT; 49163e519524SHoward Hinnant 49178e25104bSHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 49188e25104bSHoward Hinnant weak_ptr(weak_ptr&& __r) _NOEXCEPT; 49198e25104bSHoward Hinnant template<class _Yp> weak_ptr(weak_ptr<_Yp>&& __r, 49208e25104bSHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0) 49218e25104bSHoward Hinnant _NOEXCEPT; 49228e25104bSHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 49233e519524SHoward Hinnant ~weak_ptr(); 49243e519524SHoward Hinnant 49253739fe79SHoward Hinnant weak_ptr& operator=(weak_ptr const& __r) _NOEXCEPT; 49268e25104bSHoward Hinnant template<class _Yp> 49278e25104bSHoward Hinnant typename enable_if 49288e25104bSHoward Hinnant < 49298e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 49308e25104bSHoward Hinnant weak_ptr& 49318e25104bSHoward Hinnant >::type 49328e25104bSHoward Hinnant operator=(weak_ptr<_Yp> const& __r) _NOEXCEPT; 49338e25104bSHoward Hinnant 49348e25104bSHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 49358e25104bSHoward Hinnant 49368e25104bSHoward Hinnant weak_ptr& operator=(weak_ptr&& __r) _NOEXCEPT; 49378e25104bSHoward Hinnant template<class _Yp> 49388e25104bSHoward Hinnant typename enable_if 49398e25104bSHoward Hinnant < 49408e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 49418e25104bSHoward Hinnant weak_ptr& 49428e25104bSHoward Hinnant >::type 49438e25104bSHoward Hinnant operator=(weak_ptr<_Yp>&& __r) _NOEXCEPT; 49448e25104bSHoward Hinnant 49458e25104bSHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 49468e25104bSHoward Hinnant 49478e25104bSHoward Hinnant template<class _Yp> 49488e25104bSHoward Hinnant typename enable_if 49498e25104bSHoward Hinnant < 49508e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 49518e25104bSHoward Hinnant weak_ptr& 49528e25104bSHoward Hinnant >::type 49538e25104bSHoward Hinnant operator=(shared_ptr<_Yp> const& __r) _NOEXCEPT; 49543e519524SHoward Hinnant 49553739fe79SHoward Hinnant void swap(weak_ptr& __r) _NOEXCEPT; 49563739fe79SHoward Hinnant void reset() _NOEXCEPT; 49573e519524SHoward Hinnant 4958848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 49593739fe79SHoward Hinnant long use_count() const _NOEXCEPT 49603739fe79SHoward Hinnant {return __cntrl_ ? __cntrl_->use_count() : 0;} 4961848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 49623739fe79SHoward Hinnant bool expired() const _NOEXCEPT 49633739fe79SHoward Hinnant {return __cntrl_ == 0 || __cntrl_->use_count() == 0;} 49643739fe79SHoward Hinnant shared_ptr<_Tp> lock() const _NOEXCEPT; 4965848a5374SHoward Hinnant template<class _Up> 4966848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4967848a5374SHoward Hinnant bool owner_before(const shared_ptr<_Up>& __r) const 49683e519524SHoward Hinnant {return __cntrl_ < __r.__cntrl_;} 4969848a5374SHoward Hinnant template<class _Up> 4970848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4971848a5374SHoward Hinnant bool owner_before(const weak_ptr<_Up>& __r) const 49723e519524SHoward Hinnant {return __cntrl_ < __r.__cntrl_;} 49733e519524SHoward Hinnant 4974848a5374SHoward Hinnant template <class _Up> friend class _LIBCPP_VISIBLE weak_ptr; 4975848a5374SHoward Hinnant template <class _Up> friend class _LIBCPP_VISIBLE shared_ptr; 49763e519524SHoward Hinnant}; 49773e519524SHoward Hinnant 49783e519524SHoward Hinnanttemplate<class _Tp> 49793e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 4980*c0937e8aSHoward Hinnant_LIBCPP_CONSTEXPR 49813739fe79SHoward Hinnantweak_ptr<_Tp>::weak_ptr() _NOEXCEPT 49823e519524SHoward Hinnant : __ptr_(0), 49833e519524SHoward Hinnant __cntrl_(0) 49843e519524SHoward Hinnant{ 49853e519524SHoward Hinnant} 49863e519524SHoward Hinnant 49873e519524SHoward Hinnanttemplate<class _Tp> 49883e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 49893739fe79SHoward Hinnantweak_ptr<_Tp>::weak_ptr(weak_ptr const& __r) _NOEXCEPT 49903e519524SHoward Hinnant : __ptr_(__r.__ptr_), 49913e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 49923e519524SHoward Hinnant{ 49933e519524SHoward Hinnant if (__cntrl_) 49943e519524SHoward Hinnant __cntrl_->__add_weak(); 49953e519524SHoward Hinnant} 49963e519524SHoward Hinnant 49973e519524SHoward Hinnanttemplate<class _Tp> 49983e519524SHoward Hinnanttemplate<class _Yp> 49993e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 50003e519524SHoward Hinnantweak_ptr<_Tp>::weak_ptr(shared_ptr<_Yp> const& __r, 50015eb6bdfaSHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type) 50023739fe79SHoward Hinnant _NOEXCEPT 50033e519524SHoward Hinnant : __ptr_(__r.__ptr_), 50043e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 50053e519524SHoward Hinnant{ 50063e519524SHoward Hinnant if (__cntrl_) 50073e519524SHoward Hinnant __cntrl_->__add_weak(); 50083e519524SHoward Hinnant} 50093e519524SHoward Hinnant 50103e519524SHoward Hinnanttemplate<class _Tp> 50113e519524SHoward Hinnanttemplate<class _Yp> 50123e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 50133e519524SHoward Hinnantweak_ptr<_Tp>::weak_ptr(weak_ptr<_Yp> const& __r, 50145eb6bdfaSHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type) 50153739fe79SHoward Hinnant _NOEXCEPT 50163e519524SHoward Hinnant : __ptr_(__r.__ptr_), 50173e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 50183e519524SHoward Hinnant{ 50193e519524SHoward Hinnant if (__cntrl_) 50203e519524SHoward Hinnant __cntrl_->__add_weak(); 50213e519524SHoward Hinnant} 50223e519524SHoward Hinnant 50238e25104bSHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 50248e25104bSHoward Hinnant 50258e25104bSHoward Hinnanttemplate<class _Tp> 50268e25104bSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 50278e25104bSHoward Hinnantweak_ptr<_Tp>::weak_ptr(weak_ptr&& __r) _NOEXCEPT 50288e25104bSHoward Hinnant : __ptr_(__r.__ptr_), 50298e25104bSHoward Hinnant __cntrl_(__r.__cntrl_) 50308e25104bSHoward Hinnant{ 50318e25104bSHoward Hinnant __r.__ptr_ = 0; 50328e25104bSHoward Hinnant __r.__cntrl_ = 0; 50338e25104bSHoward Hinnant} 50348e25104bSHoward Hinnant 50358e25104bSHoward Hinnanttemplate<class _Tp> 50368e25104bSHoward Hinnanttemplate<class _Yp> 50378e25104bSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 50388e25104bSHoward Hinnantweak_ptr<_Tp>::weak_ptr(weak_ptr<_Yp>&& __r, 50398e25104bSHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type) 50408e25104bSHoward Hinnant _NOEXCEPT 50418e25104bSHoward Hinnant : __ptr_(__r.__ptr_), 50428e25104bSHoward Hinnant __cntrl_(__r.__cntrl_) 50438e25104bSHoward Hinnant{ 50448e25104bSHoward Hinnant __r.__ptr_ = 0; 50458e25104bSHoward Hinnant __r.__cntrl_ = 0; 50468e25104bSHoward Hinnant} 50478e25104bSHoward Hinnant 50488e25104bSHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 50498e25104bSHoward Hinnant 50503e519524SHoward Hinnanttemplate<class _Tp> 50513e519524SHoward Hinnantweak_ptr<_Tp>::~weak_ptr() 50523e519524SHoward Hinnant{ 50533e519524SHoward Hinnant if (__cntrl_) 50543e519524SHoward Hinnant __cntrl_->__release_weak(); 50553e519524SHoward Hinnant} 50563e519524SHoward Hinnant 50573e519524SHoward Hinnanttemplate<class _Tp> 50583e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 50593e519524SHoward Hinnantweak_ptr<_Tp>& 50603739fe79SHoward Hinnantweak_ptr<_Tp>::operator=(weak_ptr const& __r) _NOEXCEPT 50613e519524SHoward Hinnant{ 50623e519524SHoward Hinnant weak_ptr(__r).swap(*this); 50633e519524SHoward Hinnant return *this; 50643e519524SHoward Hinnant} 50653e519524SHoward Hinnant 50663e519524SHoward Hinnanttemplate<class _Tp> 50673e519524SHoward Hinnanttemplate<class _Yp> 50683e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 50698e25104bSHoward Hinnanttypename enable_if 50708e25104bSHoward Hinnant< 50718e25104bSHoward Hinnant is_convertible<_Yp*, _Tp*>::value, 50723e519524SHoward Hinnant weak_ptr<_Tp>& 50738e25104bSHoward Hinnant>::type 50743739fe79SHoward Hinnantweak_ptr<_Tp>::operator=(weak_ptr<_Yp> const& __r) _NOEXCEPT 50753e519524SHoward Hinnant{ 50763e519524SHoward Hinnant weak_ptr(__r).swap(*this); 50773e519524SHoward Hinnant return *this; 50783e519524SHoward Hinnant} 50793e519524SHoward Hinnant 50808e25104bSHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 50818e25104bSHoward Hinnant 50828e25104bSHoward Hinnanttemplate<class _Tp> 50838e25104bSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 50848e25104bSHoward Hinnantweak_ptr<_Tp>& 50858e25104bSHoward Hinnantweak_ptr<_Tp>::operator=(weak_ptr&& __r) _NOEXCEPT 50868e25104bSHoward Hinnant{ 50878e25104bSHoward Hinnant weak_ptr(_VSTD::move(__r)).swap(*this); 50888e25104bSHoward Hinnant return *this; 50898e25104bSHoward Hinnant} 50908e25104bSHoward Hinnant 50913e519524SHoward Hinnanttemplate<class _Tp> 50923e519524SHoward Hinnanttemplate<class _Yp> 50933e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 50948e25104bSHoward Hinnanttypename enable_if 50958e25104bSHoward Hinnant< 50968e25104bSHoward Hinnant is_convertible<_Yp*, _Tp*>::value, 50973e519524SHoward Hinnant weak_ptr<_Tp>& 50988e25104bSHoward Hinnant>::type 50998e25104bSHoward Hinnantweak_ptr<_Tp>::operator=(weak_ptr<_Yp>&& __r) _NOEXCEPT 51008e25104bSHoward Hinnant{ 51018e25104bSHoward Hinnant weak_ptr(_VSTD::move(__r)).swap(*this); 51028e25104bSHoward Hinnant return *this; 51038e25104bSHoward Hinnant} 51048e25104bSHoward Hinnant 51058e25104bSHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 51068e25104bSHoward Hinnant 51078e25104bSHoward Hinnanttemplate<class _Tp> 51088e25104bSHoward Hinnanttemplate<class _Yp> 51098e25104bSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 51108e25104bSHoward Hinnanttypename enable_if 51118e25104bSHoward Hinnant< 51128e25104bSHoward Hinnant is_convertible<_Yp*, _Tp*>::value, 51138e25104bSHoward Hinnant weak_ptr<_Tp>& 51148e25104bSHoward Hinnant>::type 51153739fe79SHoward Hinnantweak_ptr<_Tp>::operator=(shared_ptr<_Yp> const& __r) _NOEXCEPT 51163e519524SHoward Hinnant{ 51173e519524SHoward Hinnant weak_ptr(__r).swap(*this); 51183e519524SHoward Hinnant return *this; 51193e519524SHoward Hinnant} 51203e519524SHoward Hinnant 51213e519524SHoward Hinnanttemplate<class _Tp> 51223e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 51233e519524SHoward Hinnantvoid 51243739fe79SHoward Hinnantweak_ptr<_Tp>::swap(weak_ptr& __r) _NOEXCEPT 51253e519524SHoward Hinnant{ 5126ce48a113SHoward Hinnant _VSTD::swap(__ptr_, __r.__ptr_); 5127ce48a113SHoward Hinnant _VSTD::swap(__cntrl_, __r.__cntrl_); 51283e519524SHoward Hinnant} 51293e519524SHoward Hinnant 51303e519524SHoward Hinnanttemplate<class _Tp> 51313e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 51323e519524SHoward Hinnantvoid 51333739fe79SHoward Hinnantswap(weak_ptr<_Tp>& __x, weak_ptr<_Tp>& __y) _NOEXCEPT 51343e519524SHoward Hinnant{ 51353e519524SHoward Hinnant __x.swap(__y); 51363e519524SHoward Hinnant} 51373e519524SHoward Hinnant 51383e519524SHoward Hinnanttemplate<class _Tp> 51393e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 51403e519524SHoward Hinnantvoid 51413739fe79SHoward Hinnantweak_ptr<_Tp>::reset() _NOEXCEPT 51423e519524SHoward Hinnant{ 51433e519524SHoward Hinnant weak_ptr().swap(*this); 51443e519524SHoward Hinnant} 51453e519524SHoward Hinnant 51463e519524SHoward Hinnanttemplate<class _Tp> 51473e519524SHoward Hinnanttemplate<class _Yp> 51483e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(const weak_ptr<_Yp>& __r, 51493e519524SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type) 51503e519524SHoward Hinnant : __ptr_(__r.__ptr_), 51513e519524SHoward Hinnant __cntrl_(__r.__cntrl_ ? __r.__cntrl_->lock() : __r.__cntrl_) 51523e519524SHoward Hinnant{ 51533e519524SHoward Hinnant if (__cntrl_ == 0) 51543e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 51553e519524SHoward Hinnant throw bad_weak_ptr(); 51563e519524SHoward Hinnant#else 51573e519524SHoward Hinnant assert(!"bad_weak_ptr"); 51583e519524SHoward Hinnant#endif 51593e519524SHoward Hinnant} 51603e519524SHoward Hinnant 51613e519524SHoward Hinnanttemplate<class _Tp> 51623e519524SHoward Hinnantshared_ptr<_Tp> 51633739fe79SHoward Hinnantweak_ptr<_Tp>::lock() const _NOEXCEPT 51643e519524SHoward Hinnant{ 51653e519524SHoward Hinnant shared_ptr<_Tp> __r; 51663e519524SHoward Hinnant __r.__cntrl_ = __cntrl_ ? __cntrl_->lock() : __cntrl_; 51673e519524SHoward Hinnant if (__r.__cntrl_) 51683e519524SHoward Hinnant __r.__ptr_ = __ptr_; 51693e519524SHoward Hinnant return __r; 51703e519524SHoward Hinnant} 51713e519524SHoward Hinnant 51723e519524SHoward Hinnanttemplate <class _Tp> struct owner_less; 51733e519524SHoward Hinnant 51743e519524SHoward Hinnanttemplate <class _Tp> 5175848a5374SHoward Hinnantstruct _LIBCPP_VISIBLE owner_less<shared_ptr<_Tp> > 51763e519524SHoward Hinnant : binary_function<shared_ptr<_Tp>, shared_ptr<_Tp>, bool> 51773e519524SHoward Hinnant{ 51783e519524SHoward Hinnant typedef bool result_type; 5179848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 51803e519524SHoward Hinnant bool operator()(shared_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const 51813e519524SHoward Hinnant {return __x.owner_before(__y);} 5182848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 51833e519524SHoward Hinnant bool operator()(shared_ptr<_Tp> const& __x, weak_ptr<_Tp> const& __y) const 51843e519524SHoward Hinnant {return __x.owner_before(__y);} 5185848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 51863e519524SHoward Hinnant bool operator()( weak_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const 51873e519524SHoward Hinnant {return __x.owner_before(__y);} 51883e519524SHoward Hinnant}; 51893e519524SHoward Hinnant 51903e519524SHoward Hinnanttemplate <class _Tp> 5191848a5374SHoward Hinnantstruct _LIBCPP_VISIBLE owner_less<weak_ptr<_Tp> > 51923e519524SHoward Hinnant : binary_function<weak_ptr<_Tp>, weak_ptr<_Tp>, bool> 51933e519524SHoward Hinnant{ 51943e519524SHoward Hinnant typedef bool result_type; 5195848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 51963e519524SHoward Hinnant bool operator()( weak_ptr<_Tp> const& __x, weak_ptr<_Tp> const& __y) const 51973e519524SHoward Hinnant {return __x.owner_before(__y);} 5198848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 51993e519524SHoward Hinnant bool operator()(shared_ptr<_Tp> const& __x, weak_ptr<_Tp> const& __y) const 52003e519524SHoward Hinnant {return __x.owner_before(__y);} 5201848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 52023e519524SHoward Hinnant bool operator()( weak_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const 52033e519524SHoward Hinnant {return __x.owner_before(__y);} 52043e519524SHoward Hinnant}; 52053e519524SHoward Hinnant 52063e519524SHoward Hinnanttemplate<class _Tp> 5207848a5374SHoward Hinnantclass _LIBCPP_VISIBLE enable_shared_from_this 52083e519524SHoward Hinnant{ 52093e519524SHoward Hinnant mutable weak_ptr<_Tp> __weak_this_; 52103e519524SHoward Hinnantprotected: 5211*c0937e8aSHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 52123739fe79SHoward Hinnant enable_shared_from_this() _NOEXCEPT {} 5213848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 52143739fe79SHoward Hinnant enable_shared_from_this(enable_shared_from_this const&) _NOEXCEPT {} 5215848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 52163739fe79SHoward Hinnant enable_shared_from_this& operator=(enable_shared_from_this const&) _NOEXCEPT 52173739fe79SHoward Hinnant {return *this;} 5218848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 52193e519524SHoward Hinnant ~enable_shared_from_this() {} 52203e519524SHoward Hinnantpublic: 5221848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 52223739fe79SHoward Hinnant shared_ptr<_Tp> shared_from_this() 52233739fe79SHoward Hinnant {return shared_ptr<_Tp>(__weak_this_);} 5224848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 52253739fe79SHoward Hinnant shared_ptr<_Tp const> shared_from_this() const 52263739fe79SHoward Hinnant {return shared_ptr<const _Tp>(__weak_this_);} 52273e519524SHoward Hinnant 52283e519524SHoward Hinnant template <class _Up> friend class shared_ptr; 52293e519524SHoward Hinnant}; 52303e519524SHoward Hinnant 5231d1803b6cSHoward Hinnanttemplate <class _Tp> 5232848a5374SHoward Hinnantstruct _LIBCPP_VISIBLE hash<shared_ptr<_Tp> > 5233d1803b6cSHoward Hinnant{ 5234d1803b6cSHoward Hinnant typedef shared_ptr<_Tp> argument_type; 5235d1803b6cSHoward Hinnant typedef size_t result_type; 5236848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 52373739fe79SHoward Hinnant result_type operator()(const argument_type& __ptr) const _NOEXCEPT 5238d1803b6cSHoward Hinnant { 5239d1803b6cSHoward Hinnant return hash<_Tp*>()(__ptr.get()); 5240d1803b6cSHoward Hinnant } 5241d1803b6cSHoward Hinnant}; 5242d1803b6cSHoward Hinnant 5243c003db1fSHoward Hinnanttemplate<class _CharT, class _Traits, class _Yp> 5244e3163f5aSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5245e3163f5aSHoward Hinnantbasic_ostream<_CharT, _Traits>& 5246c003db1fSHoward Hinnantoperator<<(basic_ostream<_CharT, _Traits>& __os, shared_ptr<_Yp> const& __p); 5247e3163f5aSHoward Hinnant 52483e519524SHoward Hinnant//enum class 5249848a5374SHoward Hinnantstruct _LIBCPP_VISIBLE pointer_safety 52503e519524SHoward Hinnant{ 52513e519524SHoward Hinnant enum _ 52523e519524SHoward Hinnant { 52533e519524SHoward Hinnant relaxed, 52543e519524SHoward Hinnant preferred, 52553e519524SHoward Hinnant strict 52563e519524SHoward Hinnant }; 52573e519524SHoward Hinnant 52583e519524SHoward Hinnant _ __v_; 52593e519524SHoward Hinnant 5260848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 52613e519524SHoward Hinnant pointer_safety(_ __v) : __v_(__v) {} 5262848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 52633e519524SHoward Hinnant operator int() const {return __v_;} 52643e519524SHoward Hinnant}; 52653e519524SHoward Hinnant 52663e519524SHoward Hinnantvoid declare_reachable(void* __p); 52673e519524SHoward Hinnantvoid declare_no_pointers(char* __p, size_t __n); 52683e519524SHoward Hinnantvoid undeclare_no_pointers(char* __p, size_t __n); 52693739fe79SHoward Hinnantpointer_safety get_pointer_safety() _NOEXCEPT; 5270ce53420eSHoward Hinnantvoid* __undeclare_reachable(void* __p); 52713e519524SHoward Hinnant 52723e519524SHoward Hinnanttemplate <class _Tp> 52733e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 52743e519524SHoward Hinnant_Tp* 52753e519524SHoward Hinnantundeclare_reachable(_Tp* __p) 52763e519524SHoward Hinnant{ 52773e519524SHoward Hinnant return static_cast<_Tp*>(__undeclare_reachable(__p)); 52783e519524SHoward Hinnant} 52793e519524SHoward Hinnant 5280ce53420eSHoward Hinnantvoid* align(size_t __align, size_t __sz, void*& __ptr, size_t& __space); 52813e519524SHoward Hinnant 52823e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD 52833e519524SHoward Hinnant 52843e519524SHoward Hinnant#endif // _LIBCPP_MEMORY 5285