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; 7831a47313SMarshall Clow typedef Alloc::is_always_equal 7931a47313SMarshall Clow | is_empty is_always_equal; 803e519524SHoward Hinnant 813e519524SHoward Hinnant template <class T> using rebind_alloc = Alloc::rebind<U>::other | Alloc<T, Args...>; 823e519524SHoward Hinnant template <class T> using rebind_traits = allocator_traits<rebind_alloc<T>>; 833e519524SHoward Hinnant 843e519524SHoward Hinnant static pointer allocate(allocator_type& a, size_type n); 853e519524SHoward Hinnant static pointer allocate(allocator_type& a, size_type n, const_void_pointer hint); 863e519524SHoward Hinnant 873739fe79SHoward Hinnant static void deallocate(allocator_type& a, pointer p, size_type n) noexcept; 883e519524SHoward Hinnant 893e519524SHoward Hinnant template <class T, class... Args> 903e519524SHoward Hinnant static void construct(allocator_type& a, T* p, Args&&... args); 913e519524SHoward Hinnant 923e519524SHoward Hinnant template <class T> 933e519524SHoward Hinnant static void destroy(allocator_type& a, T* p); 943e519524SHoward Hinnant 9506fbed03SMarshall Clow static size_type max_size(const allocator_type& a); // noexcept in C++14 963e519524SHoward Hinnant 973e519524SHoward Hinnant static allocator_type 983e519524SHoward Hinnant select_on_container_copy_construction(const allocator_type& a); 993e519524SHoward Hinnant}; 1003e519524SHoward Hinnant 1013e519524SHoward Hinnanttemplate <> 1023e519524SHoward Hinnantclass allocator<void> 1033e519524SHoward Hinnant{ 1043e519524SHoward Hinnantpublic: 1053e519524SHoward Hinnant typedef void* pointer; 1063e519524SHoward Hinnant typedef const void* const_pointer; 1073e519524SHoward Hinnant typedef void value_type; 1083e519524SHoward Hinnant 1093e519524SHoward Hinnant template <class _Up> struct rebind {typedef allocator<_Up> other;}; 1103e519524SHoward Hinnant}; 1113e519524SHoward Hinnant 1123e519524SHoward Hinnanttemplate <class T> 1133e519524SHoward Hinnantclass allocator 1143e519524SHoward Hinnant{ 1153e519524SHoward Hinnantpublic: 1163e519524SHoward Hinnant typedef size_t size_type; 1173e519524SHoward Hinnant typedef ptrdiff_t difference_type; 1183e519524SHoward Hinnant typedef T* pointer; 1193e519524SHoward Hinnant typedef const T* const_pointer; 1203e519524SHoward Hinnant typedef typename add_lvalue_reference<T>::type reference; 1213e519524SHoward Hinnant typedef typename add_lvalue_reference<const T>::type const_reference; 1223e519524SHoward Hinnant typedef T value_type; 1233e519524SHoward Hinnant 1243e519524SHoward Hinnant template <class U> struct rebind {typedef allocator<U> other;}; 1253e519524SHoward Hinnant 1263739fe79SHoward Hinnant allocator() noexcept; 1273739fe79SHoward Hinnant allocator(const allocator&) noexcept; 1283739fe79SHoward Hinnant template <class U> allocator(const allocator<U>&) noexcept; 1293739fe79SHoward Hinnant ~allocator(); 1303739fe79SHoward Hinnant pointer address(reference x) const noexcept; 1313739fe79SHoward Hinnant const_pointer address(const_reference x) const noexcept; 1323e519524SHoward Hinnant pointer allocate(size_type, allocator<void>::const_pointer hint = 0); 1333739fe79SHoward Hinnant void deallocate(pointer p, size_type n) noexcept; 1343739fe79SHoward Hinnant size_type max_size() const noexcept; 1353739fe79SHoward Hinnant template<class U, class... Args> 1363739fe79SHoward Hinnant void construct(U* p, Args&&... args); 1373739fe79SHoward Hinnant template <class U> 1383739fe79SHoward Hinnant void destroy(U* p); 1393e519524SHoward Hinnant}; 1403e519524SHoward Hinnant 1413e519524SHoward Hinnanttemplate <class T, class U> 1423739fe79SHoward Hinnantbool operator==(const allocator<T>&, const allocator<U>&) noexcept; 1433e519524SHoward Hinnant 1443e519524SHoward Hinnanttemplate <class T, class U> 1453739fe79SHoward Hinnantbool operator!=(const allocator<T>&, const allocator<U>&) noexcept; 1463e519524SHoward Hinnant 1473e519524SHoward Hinnanttemplate <class OutputIterator, class T> 1483e519524SHoward Hinnantclass raw_storage_iterator 1493e519524SHoward Hinnant : public iterator<output_iterator_tag, 1503e519524SHoward Hinnant T, // purposefully not C++03 1513e519524SHoward Hinnant ptrdiff_t, // purposefully not C++03 1523e519524SHoward Hinnant T*, // purposefully not C++03 1533e519524SHoward Hinnant raw_storage_iterator&> // purposefully not C++03 1543e519524SHoward Hinnant{ 1553e519524SHoward Hinnantpublic: 1563e519524SHoward Hinnant explicit raw_storage_iterator(OutputIterator x); 1573e519524SHoward Hinnant raw_storage_iterator& operator*(); 1583e519524SHoward Hinnant raw_storage_iterator& operator=(const T& element); 1593e519524SHoward Hinnant raw_storage_iterator& operator++(); 1603e519524SHoward Hinnant raw_storage_iterator operator++(int); 1613e519524SHoward Hinnant}; 1623e519524SHoward Hinnant 1633739fe79SHoward Hinnanttemplate <class T> pair<T*,ptrdiff_t> get_temporary_buffer(ptrdiff_t n) noexcept; 1643739fe79SHoward Hinnanttemplate <class T> void return_temporary_buffer(T* p) noexcept; 1653739fe79SHoward Hinnant 1663739fe79SHoward Hinnanttemplate <class T> T* addressof(T& r) noexcept; 1671c7fe126SMarshall Clowtemplate <class T> T* addressof(const T&& r) noexcept = delete; 1683e519524SHoward Hinnant 1693e519524SHoward Hinnanttemplate <class InputIterator, class ForwardIterator> 1703e519524SHoward HinnantForwardIterator 1713e519524SHoward Hinnantuninitialized_copy(InputIterator first, InputIterator last, ForwardIterator result); 1723e519524SHoward Hinnant 1733739fe79SHoward Hinnanttemplate <class InputIterator, class Size, class ForwardIterator> 1743739fe79SHoward HinnantForwardIterator 1753739fe79SHoward Hinnantuninitialized_copy_n(InputIterator first, Size n, ForwardIterator result); 1763739fe79SHoward Hinnant 1773e519524SHoward Hinnanttemplate <class ForwardIterator, class T> 1783e519524SHoward Hinnantvoid uninitialized_fill(ForwardIterator first, ForwardIterator last, const T& x); 1793e519524SHoward Hinnant 1803e519524SHoward Hinnanttemplate <class ForwardIterator, class Size, class T> 18148d05bd2SHoward HinnantForwardIterator 18248d05bd2SHoward Hinnantuninitialized_fill_n(ForwardIterator first, Size n, const T& x); 1833e519524SHoward Hinnant 184e4d9c316SEric Fiseliertemplate <class T> 185e4d9c316SEric Fiseliervoid destroy_at(T* location); 186e4d9c316SEric Fiselier 187e4d9c316SEric Fiseliertemplate <class ForwardIterator> 188e4d9c316SEric Fiselier void destroy(ForwardIterator first, ForwardIterator last); 189e4d9c316SEric Fiselier 190e4d9c316SEric Fiseliertemplate <class ForwardIterator, class Size> 191e4d9c316SEric Fiselier ForwardIterator destroy_n(ForwardIterator first, Size n); 192e4d9c316SEric Fiselier 193e4d9c316SEric Fiseliertemplate <class InputIterator, class ForwardIterator> 194e4d9c316SEric Fiselier ForwardIterator uninitialized_move(InputIterator first, InputIterator last, ForwardIterator result); 195e4d9c316SEric Fiselier 196e4d9c316SEric Fiseliertemplate <class InputIterator, class Size, class ForwardIterator> 197e4d9c316SEric Fiselier pair<InputIterator,ForwardIterator> uninitialized_move_n(InputIterator first, Size n, ForwardIterator result); 198e4d9c316SEric Fiselier 199e4d9c316SEric Fiseliertemplate <class ForwardIterator> 200e4d9c316SEric Fiselier void uninitialized_value_construct(ForwardIterator first, ForwardIterator last); 201e4d9c316SEric Fiselier 202e4d9c316SEric Fiseliertemplate <class ForwardIterator, class Size> 203e4d9c316SEric Fiselier ForwardIterator uninitialized_value_construct_n(ForwardIterator first, Size n); 204e4d9c316SEric Fiselier 205e4d9c316SEric Fiseliertemplate <class ForwardIterator> 206e4d9c316SEric Fiselier void uninitialized_default_construct(ForwardIterator first, ForwardIterator last); 207e4d9c316SEric Fiselier 208e4d9c316SEric Fiseliertemplate <class ForwardIterator, class Size> 209e4d9c316SEric Fiselier ForwardIterator uninitialized_default_construct_n(ForwardIterator first, Size n); 210e4d9c316SEric Fiselier 211e67179bcSMarshall Clowtemplate <class Y> struct auto_ptr_ref {}; // removed in C++17 2123e519524SHoward Hinnant 2133e519524SHoward Hinnanttemplate<class X> 214e67179bcSMarshall Clowclass auto_ptr // removed in C++17 2153e519524SHoward Hinnant{ 2163e519524SHoward Hinnantpublic: 2173e519524SHoward Hinnant typedef X element_type; 2183e519524SHoward Hinnant 2193e519524SHoward Hinnant explicit auto_ptr(X* p =0) throw(); 2203e519524SHoward Hinnant auto_ptr(auto_ptr&) throw(); 2213e519524SHoward Hinnant template<class Y> auto_ptr(auto_ptr<Y>&) throw(); 2223e519524SHoward Hinnant auto_ptr& operator=(auto_ptr&) throw(); 2233e519524SHoward Hinnant template<class Y> auto_ptr& operator=(auto_ptr<Y>&) throw(); 2243e519524SHoward Hinnant auto_ptr& operator=(auto_ptr_ref<X> r) throw(); 2253e519524SHoward Hinnant ~auto_ptr() throw(); 2263e519524SHoward Hinnant 2273e519524SHoward Hinnant typename add_lvalue_reference<X>::type operator*() const throw(); 2283e519524SHoward Hinnant X* operator->() const throw(); 2293e519524SHoward Hinnant X* get() const throw(); 2303e519524SHoward Hinnant X* release() throw(); 2313e519524SHoward Hinnant void reset(X* p =0) throw(); 2323e519524SHoward Hinnant 2333e519524SHoward Hinnant auto_ptr(auto_ptr_ref<X>) throw(); 2343e519524SHoward Hinnant template<class Y> operator auto_ptr_ref<Y>() throw(); 2353e519524SHoward Hinnant template<class Y> operator auto_ptr<Y>() throw(); 2363e519524SHoward Hinnant}; 2373e519524SHoward Hinnant 23820cc2a42SHoward Hinnanttemplate <class T> 23920cc2a42SHoward Hinnantstruct default_delete 24020cc2a42SHoward Hinnant{ 2413739fe79SHoward Hinnant constexpr default_delete() noexcept = default; 2423739fe79SHoward Hinnant template <class U> default_delete(const default_delete<U>&) noexcept; 24320cc2a42SHoward Hinnant 2443739fe79SHoward Hinnant void operator()(T*) const noexcept; 24520cc2a42SHoward Hinnant}; 24620cc2a42SHoward Hinnant 24720cc2a42SHoward Hinnanttemplate <class T> 24820cc2a42SHoward Hinnantstruct default_delete<T[]> 24920cc2a42SHoward Hinnant{ 2503739fe79SHoward Hinnant constexpr default_delete() noexcept = default; 2513739fe79SHoward Hinnant void operator()(T*) const noexcept; 25220cc2a42SHoward Hinnant template <class U> void operator()(U*) const = delete; 25320cc2a42SHoward Hinnant}; 25420cc2a42SHoward Hinnant 25520cc2a42SHoward Hinnanttemplate <class T, class D = default_delete<T>> 25620cc2a42SHoward Hinnantclass unique_ptr 25720cc2a42SHoward Hinnant{ 25820cc2a42SHoward Hinnantpublic: 25920cc2a42SHoward Hinnant typedef see below pointer; 26020cc2a42SHoward Hinnant typedef T element_type; 26120cc2a42SHoward Hinnant typedef D deleter_type; 26220cc2a42SHoward Hinnant 26320cc2a42SHoward Hinnant // constructors 2643739fe79SHoward Hinnant constexpr unique_ptr() noexcept; 2653739fe79SHoward Hinnant explicit unique_ptr(pointer p) noexcept; 2663739fe79SHoward Hinnant unique_ptr(pointer p, see below d1) noexcept; 2673739fe79SHoward Hinnant unique_ptr(pointer p, see below d2) noexcept; 2683739fe79SHoward Hinnant unique_ptr(unique_ptr&& u) noexcept; 2693739fe79SHoward Hinnant unique_ptr(nullptr_t) noexcept : unique_ptr() { } 27020cc2a42SHoward Hinnant template <class U, class E> 2713739fe79SHoward Hinnant unique_ptr(unique_ptr<U, E>&& u) noexcept; 27220cc2a42SHoward Hinnant template <class U> 273e67179bcSMarshall Clow unique_ptr(auto_ptr<U>&& u) noexcept; // removed in C++17 27420cc2a42SHoward Hinnant 27520cc2a42SHoward Hinnant // destructor 27620cc2a42SHoward Hinnant ~unique_ptr(); 27720cc2a42SHoward Hinnant 27820cc2a42SHoward Hinnant // assignment 2793739fe79SHoward Hinnant unique_ptr& operator=(unique_ptr&& u) noexcept; 2803739fe79SHoward Hinnant template <class U, class E> unique_ptr& operator=(unique_ptr<U, E>&& u) noexcept; 2813739fe79SHoward Hinnant unique_ptr& operator=(nullptr_t) noexcept; 28220cc2a42SHoward Hinnant 28320cc2a42SHoward Hinnant // observers 28420cc2a42SHoward Hinnant typename add_lvalue_reference<T>::type operator*() const; 2853739fe79SHoward Hinnant pointer operator->() const noexcept; 2863739fe79SHoward Hinnant pointer get() const noexcept; 2873739fe79SHoward Hinnant deleter_type& get_deleter() noexcept; 2883739fe79SHoward Hinnant const deleter_type& get_deleter() const noexcept; 2893739fe79SHoward Hinnant explicit operator bool() const noexcept; 29020cc2a42SHoward Hinnant 29120cc2a42SHoward Hinnant // modifiers 2923739fe79SHoward Hinnant pointer release() noexcept; 2933739fe79SHoward Hinnant void reset(pointer p = pointer()) noexcept; 2943739fe79SHoward Hinnant void swap(unique_ptr& u) noexcept; 29520cc2a42SHoward Hinnant}; 29620cc2a42SHoward Hinnant 29720cc2a42SHoward Hinnanttemplate <class T, class D> 29820cc2a42SHoward Hinnantclass unique_ptr<T[], D> 29920cc2a42SHoward Hinnant{ 30020cc2a42SHoward Hinnantpublic: 30120cc2a42SHoward Hinnant typedef implementation-defined pointer; 30220cc2a42SHoward Hinnant typedef T element_type; 30320cc2a42SHoward Hinnant typedef D deleter_type; 30420cc2a42SHoward Hinnant 30520cc2a42SHoward Hinnant // constructors 3063739fe79SHoward Hinnant constexpr unique_ptr() noexcept; 3073739fe79SHoward Hinnant explicit unique_ptr(pointer p) noexcept; 3083739fe79SHoward Hinnant unique_ptr(pointer p, see below d) noexcept; 3093739fe79SHoward Hinnant unique_ptr(pointer p, see below d) noexcept; 3103739fe79SHoward Hinnant unique_ptr(unique_ptr&& u) noexcept; 3113739fe79SHoward Hinnant unique_ptr(nullptr_t) noexcept : unique_ptr() { } 31220cc2a42SHoward Hinnant 31320cc2a42SHoward Hinnant // destructor 314b3371f6fSHoward Hinnant ~unique_ptr(); 31520cc2a42SHoward Hinnant 31620cc2a42SHoward Hinnant // assignment 3173739fe79SHoward Hinnant unique_ptr& operator=(unique_ptr&& u) noexcept; 3183739fe79SHoward Hinnant unique_ptr& operator=(nullptr_t) noexcept; 31920cc2a42SHoward Hinnant 32020cc2a42SHoward Hinnant // observers 32120cc2a42SHoward Hinnant T& operator[](size_t i) const; 3223739fe79SHoward Hinnant pointer get() const noexcept; 3233739fe79SHoward Hinnant deleter_type& get_deleter() noexcept; 3243739fe79SHoward Hinnant const deleter_type& get_deleter() const noexcept; 3253739fe79SHoward Hinnant explicit operator bool() const noexcept; 32620cc2a42SHoward Hinnant 32720cc2a42SHoward Hinnant // modifiers 3283739fe79SHoward Hinnant pointer release() noexcept; 3293739fe79SHoward Hinnant void reset(pointer p = pointer()) noexcept; 3303739fe79SHoward Hinnant void reset(nullptr_t) noexcept; 33120cc2a42SHoward Hinnant template <class U> void reset(U) = delete; 3323739fe79SHoward Hinnant void swap(unique_ptr& u) noexcept; 33320cc2a42SHoward Hinnant}; 33420cc2a42SHoward Hinnant 33520cc2a42SHoward Hinnanttemplate <class T, class D> 3363739fe79SHoward Hinnant void swap(unique_ptr<T, D>& x, unique_ptr<T, D>& y) noexcept; 33720cc2a42SHoward Hinnant 33820cc2a42SHoward Hinnanttemplate <class T1, class D1, class T2, class D2> 33920cc2a42SHoward Hinnant bool operator==(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 34020cc2a42SHoward Hinnanttemplate <class T1, class D1, class T2, class D2> 34120cc2a42SHoward Hinnant bool operator!=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 34220cc2a42SHoward Hinnanttemplate <class T1, class D1, class T2, class D2> 34320cc2a42SHoward Hinnant bool operator<(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 34420cc2a42SHoward Hinnanttemplate <class T1, class D1, class T2, class D2> 34520cc2a42SHoward Hinnant bool operator<=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 34620cc2a42SHoward Hinnanttemplate <class T1, class D1, class T2, class D2> 34720cc2a42SHoward Hinnant bool operator>(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 34820cc2a42SHoward Hinnanttemplate <class T1, class D1, class T2, class D2> 34920cc2a42SHoward Hinnant bool operator>=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 35020cc2a42SHoward Hinnant 3513739fe79SHoward Hinnanttemplate <class T, class D> 3523739fe79SHoward Hinnant bool operator==(const unique_ptr<T, D>& x, nullptr_t) noexcept; 3533739fe79SHoward Hinnanttemplate <class T, class D> 3543739fe79SHoward Hinnant bool operator==(nullptr_t, const unique_ptr<T, D>& y) noexcept; 3553739fe79SHoward Hinnanttemplate <class T, class D> 3563739fe79SHoward Hinnant bool operator!=(const unique_ptr<T, D>& x, nullptr_t) noexcept; 3573739fe79SHoward Hinnanttemplate <class T, class D> 3583739fe79SHoward Hinnant bool operator!=(nullptr_t, const unique_ptr<T, D>& y) noexcept; 3593739fe79SHoward Hinnant 3603739fe79SHoward Hinnanttemplate <class T, class D> 3613739fe79SHoward Hinnant bool operator<(const unique_ptr<T, D>& x, nullptr_t); 3623739fe79SHoward Hinnanttemplate <class T, class D> 3633739fe79SHoward Hinnant bool operator<(nullptr_t, const unique_ptr<T, D>& y); 3643739fe79SHoward Hinnanttemplate <class T, class D> 3653739fe79SHoward Hinnant bool operator<=(const unique_ptr<T, D>& x, nullptr_t); 3663739fe79SHoward Hinnanttemplate <class T, class D> 3673739fe79SHoward Hinnant bool operator<=(nullptr_t, const unique_ptr<T, D>& y); 3683739fe79SHoward Hinnanttemplate <class T, class D> 3693739fe79SHoward Hinnant bool operator>(const unique_ptr<T, D>& x, nullptr_t); 3703739fe79SHoward Hinnanttemplate <class T, class D> 3713739fe79SHoward Hinnant bool operator>(nullptr_t, const unique_ptr<T, D>& y); 3723739fe79SHoward Hinnanttemplate <class T, class D> 3733739fe79SHoward Hinnant bool operator>=(const unique_ptr<T, D>& x, nullptr_t); 3743739fe79SHoward Hinnanttemplate <class T, class D> 3753739fe79SHoward Hinnant bool operator>=(nullptr_t, const unique_ptr<T, D>& y); 3763739fe79SHoward Hinnant 37720cc2a42SHoward Hinnantclass bad_weak_ptr 37820cc2a42SHoward Hinnant : public std::exception 37920cc2a42SHoward Hinnant{ 3803739fe79SHoward Hinnant bad_weak_ptr() noexcept; 38120cc2a42SHoward Hinnant}; 38220cc2a42SHoward Hinnant 38328d8ba5fSMarshall Clowtemplate<class T, class... Args> unique_ptr<T> make_unique(Args&&... args); // C++14 38428d8ba5fSMarshall Clowtemplate<class T> unique_ptr<T> make_unique(size_t n); // C++14 38528d8ba5fSMarshall Clowtemplate<class T, class... Args> unspecified make_unique(Args&&...) = delete; // C++14, T == U[N] 38628d8ba5fSMarshall Clow 38720cc2a42SHoward Hinnanttemplate<class T> 38820cc2a42SHoward Hinnantclass shared_ptr 38920cc2a42SHoward Hinnant{ 39020cc2a42SHoward Hinnantpublic: 39120cc2a42SHoward Hinnant typedef T element_type; 39268436a9bSEric Fiselier typedef weak_ptr<T> weak_type; // C++17 39320cc2a42SHoward Hinnant 39420cc2a42SHoward Hinnant // constructors: 3953739fe79SHoward Hinnant constexpr shared_ptr() noexcept; 39620cc2a42SHoward Hinnant template<class Y> explicit shared_ptr(Y* p); 39720cc2a42SHoward Hinnant template<class Y, class D> shared_ptr(Y* p, D d); 39820cc2a42SHoward Hinnant template<class Y, class D, class A> shared_ptr(Y* p, D d, A a); 39920cc2a42SHoward Hinnant template <class D> shared_ptr(nullptr_t p, D d); 40020cc2a42SHoward Hinnant template <class D, class A> shared_ptr(nullptr_t p, D d, A a); 4013739fe79SHoward Hinnant template<class Y> shared_ptr(const shared_ptr<Y>& r, T *p) noexcept; 4023739fe79SHoward Hinnant shared_ptr(const shared_ptr& r) noexcept; 4033739fe79SHoward Hinnant template<class Y> shared_ptr(const shared_ptr<Y>& r) noexcept; 4043739fe79SHoward Hinnant shared_ptr(shared_ptr&& r) noexcept; 4053739fe79SHoward Hinnant template<class Y> shared_ptr(shared_ptr<Y>&& r) noexcept; 40620cc2a42SHoward Hinnant template<class Y> explicit shared_ptr(const weak_ptr<Y>& r); 407e67179bcSMarshall Clow template<class Y> shared_ptr(auto_ptr<Y>&& r); // removed in C++17 40820cc2a42SHoward Hinnant template <class Y, class D> shared_ptr(unique_ptr<Y, D>&& r); 40920cc2a42SHoward Hinnant shared_ptr(nullptr_t) : shared_ptr() { } 41020cc2a42SHoward Hinnant 41120cc2a42SHoward Hinnant // destructor: 41220cc2a42SHoward Hinnant ~shared_ptr(); 41320cc2a42SHoward Hinnant 41420cc2a42SHoward Hinnant // assignment: 4153739fe79SHoward Hinnant shared_ptr& operator=(const shared_ptr& r) noexcept; 4163739fe79SHoward Hinnant template<class Y> shared_ptr& operator=(const shared_ptr<Y>& r) noexcept; 4173739fe79SHoward Hinnant shared_ptr& operator=(shared_ptr&& r) noexcept; 41820cc2a42SHoward Hinnant template<class Y> shared_ptr& operator=(shared_ptr<Y>&& r); 419e67179bcSMarshall Clow template<class Y> shared_ptr& operator=(auto_ptr<Y>&& r); // removed in C++17 42020cc2a42SHoward Hinnant template <class Y, class D> shared_ptr& operator=(unique_ptr<Y, D>&& r); 42120cc2a42SHoward Hinnant 42220cc2a42SHoward Hinnant // modifiers: 4233739fe79SHoward Hinnant void swap(shared_ptr& r) noexcept; 4243739fe79SHoward Hinnant void reset() noexcept; 42520cc2a42SHoward Hinnant template<class Y> void reset(Y* p); 42620cc2a42SHoward Hinnant template<class Y, class D> void reset(Y* p, D d); 42720cc2a42SHoward Hinnant template<class Y, class D, class A> void reset(Y* p, D d, A a); 42820cc2a42SHoward Hinnant 4293739fe79SHoward Hinnant // observers: 4303739fe79SHoward Hinnant T* get() const noexcept; 4313739fe79SHoward Hinnant T& operator*() const noexcept; 4323739fe79SHoward Hinnant T* operator->() const noexcept; 4333739fe79SHoward Hinnant long use_count() const noexcept; 4343739fe79SHoward Hinnant bool unique() const noexcept; 4353739fe79SHoward Hinnant explicit operator bool() const noexcept; 43636bc7178SMarshall Clow template<class U> bool owner_before(shared_ptr<U> const& b) const noexcept; 43736bc7178SMarshall Clow template<class U> bool owner_before(weak_ptr<U> const& b) const noexcept; 43820cc2a42SHoward Hinnant}; 43920cc2a42SHoward Hinnant 44020cc2a42SHoward Hinnant// shared_ptr comparisons: 44120cc2a42SHoward Hinnanttemplate<class T, class U> 4423739fe79SHoward Hinnant bool operator==(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; 44320cc2a42SHoward Hinnanttemplate<class T, class U> 4443739fe79SHoward Hinnant bool operator!=(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; 44520cc2a42SHoward Hinnanttemplate<class T, class U> 4463739fe79SHoward Hinnant bool operator<(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; 44720cc2a42SHoward Hinnanttemplate<class T, class U> 4483739fe79SHoward Hinnant bool operator>(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; 44920cc2a42SHoward Hinnanttemplate<class T, class U> 4503739fe79SHoward Hinnant bool operator<=(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; 45120cc2a42SHoward Hinnanttemplate<class T, class U> 4523739fe79SHoward Hinnant bool operator>=(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; 4533739fe79SHoward Hinnant 4543739fe79SHoward Hinnanttemplate <class T> 4553739fe79SHoward Hinnant bool operator==(const shared_ptr<T>& x, nullptr_t) noexcept; 4563739fe79SHoward Hinnanttemplate <class T> 4573739fe79SHoward Hinnant bool operator==(nullptr_t, const shared_ptr<T>& y) noexcept; 4583739fe79SHoward Hinnanttemplate <class T> 4593739fe79SHoward Hinnant bool operator!=(const shared_ptr<T>& x, nullptr_t) noexcept; 4603739fe79SHoward Hinnanttemplate <class T> 4613739fe79SHoward Hinnant bool operator!=(nullptr_t, const shared_ptr<T>& y) noexcept; 4623739fe79SHoward Hinnanttemplate <class T> 4633739fe79SHoward Hinnant bool operator<(const shared_ptr<T>& x, nullptr_t) noexcept; 4643739fe79SHoward Hinnanttemplate <class T> 4653739fe79SHoward Hinnantbool operator<(nullptr_t, const shared_ptr<T>& y) noexcept; 4663739fe79SHoward Hinnanttemplate <class T> 4673739fe79SHoward Hinnant bool operator<=(const shared_ptr<T>& x, nullptr_t) noexcept; 4683739fe79SHoward Hinnanttemplate <class T> 4693739fe79SHoward Hinnant bool operator<=(nullptr_t, const shared_ptr<T>& y) noexcept; 4703739fe79SHoward Hinnanttemplate <class T> 4713739fe79SHoward Hinnant bool operator>(const shared_ptr<T>& x, nullptr_t) noexcept; 4723739fe79SHoward Hinnanttemplate <class T> 4733739fe79SHoward Hinnant bool operator>(nullptr_t, const shared_ptr<T>& y) noexcept; 4743739fe79SHoward Hinnanttemplate <class T> 4753739fe79SHoward Hinnant bool operator>=(const shared_ptr<T>& x, nullptr_t) noexcept; 4763739fe79SHoward Hinnanttemplate <class T> 4773739fe79SHoward Hinnant bool operator>=(nullptr_t, const shared_ptr<T>& y) noexcept; 47820cc2a42SHoward Hinnant 47920cc2a42SHoward Hinnant// shared_ptr specialized algorithms: 4803739fe79SHoward Hinnanttemplate<class T> void swap(shared_ptr<T>& a, shared_ptr<T>& b) noexcept; 48120cc2a42SHoward Hinnant 48220cc2a42SHoward Hinnant// shared_ptr casts: 48320cc2a42SHoward Hinnanttemplate<class T, class U> 4843739fe79SHoward Hinnant shared_ptr<T> static_pointer_cast(shared_ptr<U> const& r) noexcept; 48520cc2a42SHoward Hinnanttemplate<class T, class U> 4863739fe79SHoward Hinnant shared_ptr<T> dynamic_pointer_cast(shared_ptr<U> const& r) noexcept; 48720cc2a42SHoward Hinnanttemplate<class T, class U> 4883739fe79SHoward Hinnant shared_ptr<T> const_pointer_cast(shared_ptr<U> const& r) noexcept; 48920cc2a42SHoward Hinnant 49020cc2a42SHoward Hinnant// shared_ptr I/O: 49120cc2a42SHoward Hinnanttemplate<class E, class T, class Y> 49220cc2a42SHoward Hinnant basic_ostream<E, T>& operator<< (basic_ostream<E, T>& os, shared_ptr<Y> const& p); 49320cc2a42SHoward Hinnant 49420cc2a42SHoward Hinnant// shared_ptr get_deleter: 4953739fe79SHoward Hinnanttemplate<class D, class T> D* get_deleter(shared_ptr<T> const& p) noexcept; 49620cc2a42SHoward Hinnant 49720cc2a42SHoward Hinnanttemplate<class T, class... Args> 49820cc2a42SHoward Hinnant shared_ptr<T> make_shared(Args&&... args); 49920cc2a42SHoward Hinnanttemplate<class T, class A, class... Args> 50020cc2a42SHoward Hinnant shared_ptr<T> allocate_shared(const A& a, Args&&... args); 50120cc2a42SHoward Hinnant 50220cc2a42SHoward Hinnanttemplate<class T> 50320cc2a42SHoward Hinnantclass weak_ptr 50420cc2a42SHoward Hinnant{ 50520cc2a42SHoward Hinnantpublic: 50620cc2a42SHoward Hinnant typedef T element_type; 50720cc2a42SHoward Hinnant 50820cc2a42SHoward Hinnant // constructors 5093739fe79SHoward Hinnant constexpr weak_ptr() noexcept; 5103739fe79SHoward Hinnant template<class Y> weak_ptr(shared_ptr<Y> const& r) noexcept; 5113739fe79SHoward Hinnant weak_ptr(weak_ptr const& r) noexcept; 5123739fe79SHoward Hinnant template<class Y> weak_ptr(weak_ptr<Y> const& r) noexcept; 5134703f763SMarshall Clow weak_ptr(weak_ptr&& r) noexcept; // C++14 5144703f763SMarshall Clow template<class Y> weak_ptr(weak_ptr<Y>&& r) noexcept; // C++14 51520cc2a42SHoward Hinnant 51620cc2a42SHoward Hinnant // destructor 51720cc2a42SHoward Hinnant ~weak_ptr(); 51820cc2a42SHoward Hinnant 51920cc2a42SHoward Hinnant // assignment 5203739fe79SHoward Hinnant weak_ptr& operator=(weak_ptr const& r) noexcept; 5213739fe79SHoward Hinnant template<class Y> weak_ptr& operator=(weak_ptr<Y> const& r) noexcept; 5223739fe79SHoward Hinnant template<class Y> weak_ptr& operator=(shared_ptr<Y> const& r) noexcept; 5234703f763SMarshall Clow weak_ptr& operator=(weak_ptr&& r) noexcept; // C++14 5244703f763SMarshall Clow template<class Y> weak_ptr& operator=(weak_ptr<Y>&& r) noexcept; // C++14 52520cc2a42SHoward Hinnant 52620cc2a42SHoward Hinnant // modifiers 5273739fe79SHoward Hinnant void swap(weak_ptr& r) noexcept; 5283739fe79SHoward Hinnant void reset() noexcept; 52920cc2a42SHoward Hinnant 53020cc2a42SHoward Hinnant // observers 5313739fe79SHoward Hinnant long use_count() const noexcept; 5323739fe79SHoward Hinnant bool expired() const noexcept; 5333739fe79SHoward Hinnant shared_ptr<T> lock() const noexcept; 53436bc7178SMarshall Clow template<class U> bool owner_before(shared_ptr<U> const& b) const noexcept; 53536bc7178SMarshall Clow template<class U> bool owner_before(weak_ptr<U> const& b) const noexcept; 53620cc2a42SHoward Hinnant}; 53720cc2a42SHoward Hinnant 53820cc2a42SHoward Hinnant// weak_ptr specialized algorithms: 5393739fe79SHoward Hinnanttemplate<class T> void swap(weak_ptr<T>& a, weak_ptr<T>& b) noexcept; 54020cc2a42SHoward Hinnant 54120cc2a42SHoward Hinnant// class owner_less: 54220cc2a42SHoward Hinnanttemplate<class T> struct owner_less; 54320cc2a42SHoward Hinnant 54420cc2a42SHoward Hinnanttemplate<class T> 54520cc2a42SHoward Hinnantstruct owner_less<shared_ptr<T>> 54620cc2a42SHoward Hinnant : binary_function<shared_ptr<T>, shared_ptr<T>, bool> 54720cc2a42SHoward Hinnant{ 54820cc2a42SHoward Hinnant typedef bool result_type; 54936bc7178SMarshall Clow bool operator()(shared_ptr<T> const&, shared_ptr<T> const&) const noexcept; 55036bc7178SMarshall Clow bool operator()(shared_ptr<T> const&, weak_ptr<T> const&) const noexcept; 55136bc7178SMarshall Clow bool operator()(weak_ptr<T> const&, shared_ptr<T> const&) const noexcept; 55220cc2a42SHoward Hinnant}; 55320cc2a42SHoward Hinnant 55420cc2a42SHoward Hinnanttemplate<class T> 55520cc2a42SHoward Hinnantstruct owner_less<weak_ptr<T>> 55620cc2a42SHoward Hinnant : binary_function<weak_ptr<T>, weak_ptr<T>, bool> 55720cc2a42SHoward Hinnant{ 55820cc2a42SHoward Hinnant typedef bool result_type; 55936bc7178SMarshall Clow bool operator()(weak_ptr<T> const&, weak_ptr<T> const&) const noexcept; 56036bc7178SMarshall Clow bool operator()(shared_ptr<T> const&, weak_ptr<T> const&) const noexcept; 56136bc7178SMarshall Clow bool operator()(weak_ptr<T> const&, shared_ptr<T> const&) const noexcept; 56236bc7178SMarshall Clow}; 56336bc7178SMarshall Clow 56436bc7178SMarshall Clowtemplate <> // Added in C++14 56536bc7178SMarshall Clowstruct owner_less<void> 56636bc7178SMarshall Clow{ 56736bc7178SMarshall Clow template <class _Tp, class _Up> 56836bc7178SMarshall Clow bool operator()( shared_ptr<_Tp> const& __x, shared_ptr<_Up> const& __y) const noexcept; 56936bc7178SMarshall Clow template <class _Tp, class _Up> 57036bc7178SMarshall Clow bool operator()( shared_ptr<_Tp> const& __x, weak_ptr<_Up> const& __y) const noexcept; 57136bc7178SMarshall Clow template <class _Tp, class _Up> 57236bc7178SMarshall Clow bool operator()( weak_ptr<_Tp> const& __x, shared_ptr<_Up> const& __y) const noexcept; 57336bc7178SMarshall Clow template <class _Tp, class _Up> 57436bc7178SMarshall Clow bool operator()( weak_ptr<_Tp> const& __x, weak_ptr<_Up> const& __y) const noexcept; 57536bc7178SMarshall Clow 57636bc7178SMarshall Clow typedef void is_transparent; 57720cc2a42SHoward Hinnant}; 57820cc2a42SHoward Hinnant 57920cc2a42SHoward Hinnanttemplate<class T> 58020cc2a42SHoward Hinnantclass enable_shared_from_this 58120cc2a42SHoward Hinnant{ 58220cc2a42SHoward Hinnantprotected: 5833739fe79SHoward Hinnant constexpr enable_shared_from_this() noexcept; 5843739fe79SHoward Hinnant enable_shared_from_this(enable_shared_from_this const&) noexcept; 5853739fe79SHoward Hinnant enable_shared_from_this& operator=(enable_shared_from_this const&) noexcept; 58620cc2a42SHoward Hinnant ~enable_shared_from_this(); 58720cc2a42SHoward Hinnantpublic: 58820cc2a42SHoward Hinnant shared_ptr<T> shared_from_this(); 58920cc2a42SHoward Hinnant shared_ptr<T const> shared_from_this() const; 59020cc2a42SHoward Hinnant}; 59120cc2a42SHoward Hinnant 59220cc2a42SHoward Hinnanttemplate<class T> 59320cc2a42SHoward Hinnant bool atomic_is_lock_free(const shared_ptr<T>* p); 59420cc2a42SHoward Hinnanttemplate<class T> 59520cc2a42SHoward Hinnant shared_ptr<T> atomic_load(const shared_ptr<T>* p); 59620cc2a42SHoward Hinnanttemplate<class T> 59720cc2a42SHoward Hinnant shared_ptr<T> atomic_load_explicit(const shared_ptr<T>* p, memory_order mo); 59820cc2a42SHoward Hinnanttemplate<class T> 59920cc2a42SHoward Hinnant void atomic_store(shared_ptr<T>* p, shared_ptr<T> r); 60020cc2a42SHoward Hinnanttemplate<class T> 60120cc2a42SHoward Hinnant void atomic_store_explicit(shared_ptr<T>* p, shared_ptr<T> r, memory_order mo); 60220cc2a42SHoward Hinnanttemplate<class T> 60320cc2a42SHoward Hinnant shared_ptr<T> atomic_exchange(shared_ptr<T>* p, shared_ptr<T> r); 60420cc2a42SHoward Hinnanttemplate<class T> 60520cc2a42SHoward Hinnant shared_ptr<T> 60620cc2a42SHoward Hinnant atomic_exchange_explicit(shared_ptr<T>* p, shared_ptr<T> r, memory_order mo); 60720cc2a42SHoward Hinnanttemplate<class T> 60820cc2a42SHoward Hinnant bool 60920cc2a42SHoward Hinnant atomic_compare_exchange_weak(shared_ptr<T>* p, shared_ptr<T>* v, shared_ptr<T> w); 61020cc2a42SHoward Hinnanttemplate<class T> 61120cc2a42SHoward Hinnant bool 61220cc2a42SHoward Hinnant atomic_compare_exchange_strong( shared_ptr<T>* p, shared_ptr<T>* v, shared_ptr<T> w); 61320cc2a42SHoward Hinnanttemplate<class T> 61420cc2a42SHoward Hinnant bool 61520cc2a42SHoward Hinnant atomic_compare_exchange_weak_explicit(shared_ptr<T>* p, shared_ptr<T>* v, 61620cc2a42SHoward Hinnant shared_ptr<T> w, memory_order success, 61720cc2a42SHoward Hinnant memory_order failure); 61820cc2a42SHoward Hinnanttemplate<class T> 61920cc2a42SHoward Hinnant bool 62020cc2a42SHoward Hinnant atomic_compare_exchange_strong_explicit(shared_ptr<T>* p, shared_ptr<T>* v, 62120cc2a42SHoward Hinnant shared_ptr<T> w, memory_order success, 62220cc2a42SHoward Hinnant memory_order failure); 62320cc2a42SHoward Hinnant// Hash support 62420cc2a42SHoward Hinnanttemplate <class T> struct hash; 62520cc2a42SHoward Hinnanttemplate <class T, class D> struct hash<unique_ptr<T, D> >; 62620cc2a42SHoward Hinnanttemplate <class T> struct hash<shared_ptr<T> >; 62720cc2a42SHoward Hinnant 62820cc2a42SHoward Hinnant// Pointer safety 62920cc2a42SHoward Hinnantenum class pointer_safety { relaxed, preferred, strict }; 63020cc2a42SHoward Hinnantvoid declare_reachable(void *p); 63120cc2a42SHoward Hinnanttemplate <class T> T *undeclare_reachable(T *p); 63220cc2a42SHoward Hinnantvoid declare_no_pointers(char *p, size_t n); 63320cc2a42SHoward Hinnantvoid undeclare_no_pointers(char *p, size_t n); 6343739fe79SHoward Hinnantpointer_safety get_pointer_safety() noexcept; 63520cc2a42SHoward Hinnant 6363e519524SHoward Hinnantvoid* align(size_t alignment, size_t size, void*& ptr, size_t& space); 6373e519524SHoward Hinnant 6383e519524SHoward Hinnant} // std 6393e519524SHoward Hinnant 6403e519524SHoward Hinnant*/ 6413e519524SHoward Hinnant 6423e519524SHoward Hinnant#include <__config> 6433e519524SHoward Hinnant#include <type_traits> 6443e519524SHoward Hinnant#include <typeinfo> 6453e519524SHoward Hinnant#include <cstddef> 6463e519524SHoward Hinnant#include <cstdint> 6473e519524SHoward Hinnant#include <new> 6483e519524SHoward Hinnant#include <utility> 6493e519524SHoward Hinnant#include <limits> 6503e519524SHoward Hinnant#include <iterator> 6513e519524SHoward Hinnant#include <__functional_base> 652e3163f5aSHoward Hinnant#include <iosfwd> 653a87b5e34SHoward Hinnant#include <tuple> 6544524d6e7SEric Fiselier#include <stdexcept> 6559741d6c9SHoward Hinnant#include <cstring> 656c88580c4SEric Fiselier#include <cassert> 657749adebaSEric Fiselier#if !defined(_LIBCPP_HAS_NO_ATOMIC_HEADER) 658d77851e8SHoward Hinnant# include <atomic> 659d77851e8SHoward Hinnant#endif 660d77851e8SHoward Hinnant 661ab4f4382SHoward Hinnant#include <__undef_min_max> 662ab4f4382SHoward Hinnant 663073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 6643e519524SHoward Hinnant#pragma GCC system_header 665073458b1SHoward Hinnant#endif 6663e519524SHoward Hinnant 6673e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 6683e519524SHoward Hinnant 6691faf289eSEric Fiseliertemplate <class _ValueType> 6701faf289eSEric Fiselierinline _LIBCPP_ALWAYS_INLINE 6711faf289eSEric Fiselier_ValueType __libcpp_relaxed_load(_ValueType const* __value) { 6721faf289eSEric Fiselier#if !defined(_LIBCPP_HAS_NO_THREADS) && \ 6731faf289eSEric Fiselier defined(__ATOMIC_RELAXED) && \ 6741faf289eSEric Fiselier (__has_builtin(__atomic_load_n) || _GNUC_VER >= 407) 6751faf289eSEric Fiselier return __atomic_load_n(__value, __ATOMIC_RELAXED); 6761faf289eSEric Fiselier#else 6771faf289eSEric Fiselier return *__value; 6781faf289eSEric Fiselier#endif 6791faf289eSEric Fiselier} 6801faf289eSEric Fiselier 681224264adSKuba Breckatemplate <class _ValueType> 682224264adSKuba Breckainline _LIBCPP_ALWAYS_INLINE 683224264adSKuba Brecka_ValueType __libcpp_acquire_load(_ValueType const* __value) { 684224264adSKuba Brecka#if !defined(_LIBCPP_HAS_NO_THREADS) && \ 685224264adSKuba Brecka defined(__ATOMIC_ACQUIRE) && \ 686224264adSKuba Brecka (__has_builtin(__atomic_load_n) || _GNUC_VER >= 407) 687224264adSKuba Brecka return __atomic_load_n(__value, __ATOMIC_ACQUIRE); 688224264adSKuba Brecka#else 689224264adSKuba Brecka return *__value; 690224264adSKuba Brecka#endif 691224264adSKuba Brecka} 692224264adSKuba Brecka 6931c7fe126SMarshall Clow// addressof moved to <type_traits> 69464ec101eSDouglas Gregor 6953e519524SHoward Hinnanttemplate <class _Tp> class allocator; 6963e519524SHoward Hinnant 6973e519524SHoward Hinnanttemplate <> 698e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS allocator<void> 6993e519524SHoward Hinnant{ 7003e519524SHoward Hinnantpublic: 7013e519524SHoward Hinnant typedef void* pointer; 7023e519524SHoward Hinnant typedef const void* const_pointer; 7033e519524SHoward Hinnant typedef void value_type; 7043e519524SHoward Hinnant 7053e519524SHoward Hinnant template <class _Up> struct rebind {typedef allocator<_Up> other;}; 7063e519524SHoward Hinnant}; 7073e519524SHoward Hinnant 70821fa1887SHoward Hinnanttemplate <> 709e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS allocator<const void> 71021fa1887SHoward Hinnant{ 71121fa1887SHoward Hinnantpublic: 71221fa1887SHoward Hinnant typedef const void* pointer; 71321fa1887SHoward Hinnant typedef const void* const_pointer; 71421fa1887SHoward Hinnant typedef const void value_type; 71521fa1887SHoward Hinnant 71621fa1887SHoward Hinnant template <class _Up> struct rebind {typedef allocator<_Up> other;}; 71721fa1887SHoward Hinnant}; 71821fa1887SHoward Hinnant 7193e519524SHoward Hinnant// pointer_traits 7203e519524SHoward Hinnant 7213e519524SHoward Hinnanttemplate <class _Tp> 7223e519524SHoward Hinnantstruct __has_element_type 7233e519524SHoward Hinnant{ 7243e519524SHoward Hinnantprivate: 72554d333a6SHoward Hinnant struct __two {char __lx; char __lxx;}; 7263e519524SHoward Hinnant template <class _Up> static __two __test(...); 7273e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::element_type* = 0); 7283e519524SHoward Hinnantpublic: 7293e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 7303e519524SHoward Hinnant}; 7313e519524SHoward Hinnant 7323e519524SHoward Hinnanttemplate <class _Ptr, bool = __has_element_type<_Ptr>::value> 7333e519524SHoward Hinnantstruct __pointer_traits_element_type; 7343e519524SHoward Hinnant 7353e519524SHoward Hinnanttemplate <class _Ptr> 7363e519524SHoward Hinnantstruct __pointer_traits_element_type<_Ptr, true> 7373e519524SHoward Hinnant{ 7383e519524SHoward Hinnant typedef typename _Ptr::element_type type; 7393e519524SHoward Hinnant}; 7403e519524SHoward Hinnant 7413e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 7423e519524SHoward Hinnant 7433e519524SHoward Hinnanttemplate <template <class, class...> class _Sp, class _Tp, class ..._Args> 7443e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _Args...>, true> 7453e519524SHoward Hinnant{ 7463e519524SHoward Hinnant typedef typename _Sp<_Tp, _Args...>::element_type type; 7473e519524SHoward Hinnant}; 7483e519524SHoward Hinnant 7493e519524SHoward Hinnanttemplate <template <class, class...> class _Sp, class _Tp, class ..._Args> 7503e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _Args...>, false> 7513e519524SHoward Hinnant{ 7523e519524SHoward Hinnant typedef _Tp type; 7533e519524SHoward Hinnant}; 7543e519524SHoward Hinnant 755b3371f6fSHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 7563e519524SHoward Hinnant 7573e519524SHoward Hinnanttemplate <template <class> class _Sp, class _Tp> 7583e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp>, true> 7593e519524SHoward Hinnant{ 7603e519524SHoward Hinnant typedef typename _Sp<_Tp>::element_type type; 7613e519524SHoward Hinnant}; 7623e519524SHoward Hinnant 7633e519524SHoward Hinnanttemplate <template <class> class _Sp, class _Tp> 7643e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp>, false> 7653e519524SHoward Hinnant{ 7663e519524SHoward Hinnant typedef _Tp type; 7673e519524SHoward Hinnant}; 7683e519524SHoward Hinnant 7693e519524SHoward Hinnanttemplate <template <class, class> class _Sp, class _Tp, class _A0> 7703e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0>, true> 7713e519524SHoward Hinnant{ 7723e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0>::element_type type; 7733e519524SHoward Hinnant}; 7743e519524SHoward Hinnant 7753e519524SHoward Hinnanttemplate <template <class, class> class _Sp, class _Tp, class _A0> 7763e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0>, false> 7773e519524SHoward Hinnant{ 7783e519524SHoward Hinnant typedef _Tp type; 7793e519524SHoward Hinnant}; 7803e519524SHoward Hinnant 7813e519524SHoward Hinnanttemplate <template <class, class, class> class _Sp, class _Tp, class _A0, class _A1> 7823e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1>, true> 7833e519524SHoward Hinnant{ 7843e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1>::element_type type; 7853e519524SHoward Hinnant}; 7863e519524SHoward Hinnant 7873e519524SHoward Hinnanttemplate <template <class, class, class> class _Sp, class _Tp, class _A0, class _A1> 7883e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1>, false> 7893e519524SHoward Hinnant{ 7903e519524SHoward Hinnant typedef _Tp type; 7913e519524SHoward Hinnant}; 7923e519524SHoward Hinnant 7933e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Sp, class _Tp, class _A0, 7943e519524SHoward Hinnant class _A1, class _A2> 7953e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1, _A2>, true> 7963e519524SHoward Hinnant{ 7973e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1, _A2>::element_type type; 7983e519524SHoward Hinnant}; 7993e519524SHoward Hinnant 8003e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Sp, class _Tp, class _A0, 8013e519524SHoward Hinnant class _A1, class _A2> 8023e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1, _A2>, false> 8033e519524SHoward Hinnant{ 8043e519524SHoward Hinnant typedef _Tp type; 8053e519524SHoward Hinnant}; 8063e519524SHoward Hinnant 807b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 8083e519524SHoward Hinnant 8093e519524SHoward Hinnanttemplate <class _Tp> 8103e519524SHoward Hinnantstruct __has_difference_type 8113e519524SHoward Hinnant{ 8123e519524SHoward Hinnantprivate: 81354d333a6SHoward Hinnant struct __two {char __lx; char __lxx;}; 8143e519524SHoward Hinnant template <class _Up> static __two __test(...); 8153e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::difference_type* = 0); 8163e519524SHoward Hinnantpublic: 8173e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 8183e519524SHoward Hinnant}; 8193e519524SHoward Hinnant 8203e519524SHoward Hinnanttemplate <class _Ptr, bool = __has_difference_type<_Ptr>::value> 8213e519524SHoward Hinnantstruct __pointer_traits_difference_type 8223e519524SHoward Hinnant{ 8233e519524SHoward Hinnant typedef ptrdiff_t type; 8243e519524SHoward Hinnant}; 8253e519524SHoward Hinnant 8263e519524SHoward Hinnanttemplate <class _Ptr> 8273e519524SHoward Hinnantstruct __pointer_traits_difference_type<_Ptr, true> 8283e519524SHoward Hinnant{ 8293e519524SHoward Hinnant typedef typename _Ptr::difference_type type; 8303e519524SHoward Hinnant}; 8313e519524SHoward Hinnant 8323e519524SHoward Hinnanttemplate <class _Tp, class _Up> 8333e519524SHoward Hinnantstruct __has_rebind 8343e519524SHoward Hinnant{ 8353e519524SHoward Hinnantprivate: 83654d333a6SHoward Hinnant struct __two {char __lx; char __lxx;}; 8373e519524SHoward Hinnant template <class _Xp> static __two __test(...); 8383e519524SHoward Hinnant template <class _Xp> static char __test(typename _Xp::template rebind<_Up>* = 0); 8393e519524SHoward Hinnantpublic: 8403e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 8413e519524SHoward Hinnant}; 8423e519524SHoward Hinnant 8433e519524SHoward Hinnanttemplate <class _Tp, class _Up, bool = __has_rebind<_Tp, _Up>::value> 8443e519524SHoward Hinnantstruct __pointer_traits_rebind 8453e519524SHoward Hinnant{ 84654613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 8473e519524SHoward Hinnant typedef typename _Tp::template rebind<_Up> type; 8483e519524SHoward Hinnant#else 8493e519524SHoward Hinnant typedef typename _Tp::template rebind<_Up>::other type; 8503e519524SHoward Hinnant#endif 8513e519524SHoward Hinnant}; 8523e519524SHoward Hinnant 8533e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 8543e519524SHoward Hinnant 8553e519524SHoward Hinnanttemplate <template <class, class...> class _Sp, class _Tp, class ..._Args, class _Up> 8563e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _Args...>, _Up, true> 8573e519524SHoward Hinnant{ 85854613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 8593e519524SHoward Hinnant typedef typename _Sp<_Tp, _Args...>::template rebind<_Up> type; 8603e519524SHoward Hinnant#else 8613e519524SHoward Hinnant typedef typename _Sp<_Tp, _Args...>::template rebind<_Up>::other type; 8623e519524SHoward Hinnant#endif 8633e519524SHoward Hinnant}; 8643e519524SHoward Hinnant 8653e519524SHoward Hinnanttemplate <template <class, class...> class _Sp, class _Tp, class ..._Args, class _Up> 8663e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _Args...>, _Up, false> 8673e519524SHoward Hinnant{ 8683e519524SHoward Hinnant typedef _Sp<_Up, _Args...> type; 8693e519524SHoward Hinnant}; 8703e519524SHoward Hinnant 871b3371f6fSHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 8723e519524SHoward Hinnant 8733e519524SHoward Hinnanttemplate <template <class> class _Sp, class _Tp, class _Up> 8743e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp>, _Up, true> 8753e519524SHoward Hinnant{ 87654613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 8773e519524SHoward Hinnant typedef typename _Sp<_Tp>::template rebind<_Up> type; 8783e519524SHoward Hinnant#else 8793e519524SHoward Hinnant typedef typename _Sp<_Tp>::template rebind<_Up>::other type; 8803e519524SHoward Hinnant#endif 8813e519524SHoward Hinnant}; 8823e519524SHoward Hinnant 8833e519524SHoward Hinnanttemplate <template <class> class _Sp, class _Tp, class _Up> 8843e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp>, _Up, false> 8853e519524SHoward Hinnant{ 8863e519524SHoward Hinnant typedef _Sp<_Up> type; 8873e519524SHoward Hinnant}; 8883e519524SHoward Hinnant 8893e519524SHoward Hinnanttemplate <template <class, class> class _Sp, class _Tp, class _A0, class _Up> 8903e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0>, _Up, true> 8913e519524SHoward Hinnant{ 89254613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 8933e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0>::template rebind<_Up> type; 8943e519524SHoward Hinnant#else 8953e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0>::template rebind<_Up>::other type; 8963e519524SHoward Hinnant#endif 8973e519524SHoward Hinnant}; 8983e519524SHoward Hinnant 8993e519524SHoward Hinnanttemplate <template <class, class> class _Sp, class _Tp, class _A0, class _Up> 9003e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0>, _Up, false> 9013e519524SHoward Hinnant{ 9023e519524SHoward Hinnant typedef _Sp<_Up, _A0> type; 9033e519524SHoward Hinnant}; 9043e519524SHoward Hinnant 9053e519524SHoward Hinnanttemplate <template <class, class, class> class _Sp, class _Tp, class _A0, 9063e519524SHoward Hinnant class _A1, class _Up> 9073e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1>, _Up, true> 9083e519524SHoward Hinnant{ 90954613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 9103e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1>::template rebind<_Up> type; 9113e519524SHoward Hinnant#else 9123e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1>::template rebind<_Up>::other type; 9133e519524SHoward Hinnant#endif 9143e519524SHoward Hinnant}; 9153e519524SHoward Hinnant 9163e519524SHoward Hinnanttemplate <template <class, class, class> class _Sp, class _Tp, class _A0, 9173e519524SHoward Hinnant class _A1, class _Up> 9183e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1>, _Up, false> 9193e519524SHoward Hinnant{ 9203e519524SHoward Hinnant typedef _Sp<_Up, _A0, _A1> type; 9213e519524SHoward Hinnant}; 9223e519524SHoward Hinnant 9233e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Sp, class _Tp, class _A0, 9243e519524SHoward Hinnant class _A1, class _A2, class _Up> 9253e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1, _A2>, _Up, true> 9263e519524SHoward Hinnant{ 92754613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 9283e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1, _A2>::template rebind<_Up> type; 9293e519524SHoward Hinnant#else 9303e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1, _A2>::template rebind<_Up>::other type; 9313e519524SHoward Hinnant#endif 9323e519524SHoward Hinnant}; 9333e519524SHoward Hinnant 9343e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Sp, class _Tp, class _A0, 9353e519524SHoward Hinnant class _A1, class _A2, class _Up> 9363e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1, _A2>, _Up, false> 9373e519524SHoward Hinnant{ 9383e519524SHoward Hinnant typedef _Sp<_Up, _A0, _A1, _A2> type; 9393e519524SHoward Hinnant}; 9403e519524SHoward Hinnant 941b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 9423e519524SHoward Hinnant 9433e519524SHoward Hinnanttemplate <class _Ptr> 944e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS pointer_traits 9453e519524SHoward Hinnant{ 9463e519524SHoward Hinnant typedef _Ptr pointer; 9473e519524SHoward Hinnant typedef typename __pointer_traits_element_type<pointer>::type element_type; 9483e519524SHoward Hinnant typedef typename __pointer_traits_difference_type<pointer>::type difference_type; 9493e519524SHoward Hinnant 95054613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 951f7384975SHoward Hinnant template <class _Up> using rebind = typename __pointer_traits_rebind<pointer, _Up>::type; 9523e519524SHoward Hinnant#else 9533e519524SHoward Hinnant template <class _Up> struct rebind 9543e519524SHoward Hinnant {typedef typename __pointer_traits_rebind<pointer, _Up>::type other;}; 95554613ab4SEric Fiselier#endif // _LIBCPP_CXX03_LANG 9563e519524SHoward Hinnant 9573e519524SHoward Hinnantprivate: 9583e519524SHoward Hinnant struct __nat {}; 9593e519524SHoward Hinnantpublic: 960848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9613e519524SHoward Hinnant static pointer pointer_to(typename conditional<is_void<element_type>::value, 9623e519524SHoward Hinnant __nat, element_type>::type& __r) 9633e519524SHoward Hinnant {return pointer::pointer_to(__r);} 9643e519524SHoward Hinnant}; 9653e519524SHoward Hinnant 9663e519524SHoward Hinnanttemplate <class _Tp> 967e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS pointer_traits<_Tp*> 9683e519524SHoward Hinnant{ 9693e519524SHoward Hinnant typedef _Tp* pointer; 9703e519524SHoward Hinnant typedef _Tp element_type; 9713e519524SHoward Hinnant typedef ptrdiff_t difference_type; 9723e519524SHoward Hinnant 97354613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 9743e519524SHoward Hinnant template <class _Up> using rebind = _Up*; 9753e519524SHoward Hinnant#else 9763e519524SHoward Hinnant template <class _Up> struct rebind {typedef _Up* other;}; 9773e519524SHoward Hinnant#endif 9783e519524SHoward Hinnant 9793e519524SHoward Hinnantprivate: 9803e519524SHoward Hinnant struct __nat {}; 9813e519524SHoward Hinnantpublic: 982848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9833e519524SHoward Hinnant static pointer pointer_to(typename conditional<is_void<element_type>::value, 9843739fe79SHoward Hinnant __nat, element_type>::type& __r) _NOEXCEPT 985ce48a113SHoward Hinnant {return _VSTD::addressof(__r);} 9863e519524SHoward Hinnant}; 9873e519524SHoward Hinnant 9881c813407SEric Fiseliertemplate <class _From, class _To> 9891c813407SEric Fiselierstruct __rebind_pointer { 99054613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 9911c813407SEric Fiselier typedef typename pointer_traits<_From>::template rebind<_To> type; 9921c813407SEric Fiselier#else 9931c813407SEric Fiselier typedef typename pointer_traits<_From>::template rebind<_To>::other type; 9941c813407SEric Fiselier#endif 9951c813407SEric Fiselier}; 9961c813407SEric Fiselier 9973e519524SHoward Hinnant// allocator_traits 9983e519524SHoward Hinnant 9993e519524SHoward Hinnantnamespace __has_pointer_type_imp 10003e519524SHoward Hinnant{ 1001b1c82cd0SHoward Hinnant template <class _Up> static __two __test(...); 1002b1c82cd0SHoward Hinnant template <class _Up> static char __test(typename _Up::pointer* = 0); 10033e519524SHoward Hinnant} 10043e519524SHoward Hinnant 10053e519524SHoward Hinnanttemplate <class _Tp> 10063e519524SHoward Hinnantstruct __has_pointer_type 1007b1c82cd0SHoward Hinnant : public integral_constant<bool, sizeof(__has_pointer_type_imp::__test<_Tp>(0)) == 1> 10083e519524SHoward Hinnant{ 10093e519524SHoward Hinnant}; 10103e519524SHoward Hinnant 10113e519524SHoward Hinnantnamespace __pointer_type_imp 10123e519524SHoward Hinnant{ 10133e519524SHoward Hinnant 10143e519524SHoward Hinnanttemplate <class _Tp, class _Dp, bool = __has_pointer_type<_Dp>::value> 10153e519524SHoward Hinnantstruct __pointer_type 10163e519524SHoward Hinnant{ 10173e519524SHoward Hinnant typedef typename _Dp::pointer type; 10183e519524SHoward Hinnant}; 10193e519524SHoward Hinnant 10203e519524SHoward Hinnanttemplate <class _Tp, class _Dp> 10213e519524SHoward Hinnantstruct __pointer_type<_Tp, _Dp, false> 10223e519524SHoward Hinnant{ 10233e519524SHoward Hinnant typedef _Tp* type; 10243e519524SHoward Hinnant}; 10253e519524SHoward Hinnant 1026a4a1ef1fSHoward Hinnant} // __pointer_type_imp 10273e519524SHoward Hinnant 10283e519524SHoward Hinnanttemplate <class _Tp, class _Dp> 10293e519524SHoward Hinnantstruct __pointer_type 10303e519524SHoward Hinnant{ 10313e519524SHoward Hinnant typedef typename __pointer_type_imp::__pointer_type<_Tp, typename remove_reference<_Dp>::type>::type type; 10323e519524SHoward Hinnant}; 10333e519524SHoward Hinnant 10343e519524SHoward Hinnanttemplate <class _Tp> 10353e519524SHoward Hinnantstruct __has_const_pointer 10363e519524SHoward Hinnant{ 10373e519524SHoward Hinnantprivate: 103854d333a6SHoward Hinnant struct __two {char __lx; char __lxx;}; 10393e519524SHoward Hinnant template <class _Up> static __two __test(...); 10403e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::const_pointer* = 0); 10413e519524SHoward Hinnantpublic: 10423e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 10433e519524SHoward Hinnant}; 10443e519524SHoward Hinnant 10453e519524SHoward Hinnanttemplate <class _Tp, class _Ptr, class _Alloc, bool = __has_const_pointer<_Alloc>::value> 10463e519524SHoward Hinnantstruct __const_pointer 10473e519524SHoward Hinnant{ 10483e519524SHoward Hinnant typedef typename _Alloc::const_pointer type; 10493e519524SHoward Hinnant}; 10503e519524SHoward Hinnant 10513e519524SHoward Hinnanttemplate <class _Tp, class _Ptr, class _Alloc> 10523e519524SHoward Hinnantstruct __const_pointer<_Tp, _Ptr, _Alloc, false> 10533e519524SHoward Hinnant{ 105454613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 10553e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<const _Tp> type; 10563e519524SHoward Hinnant#else 10573e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<const _Tp>::other type; 10583e519524SHoward Hinnant#endif 10593e519524SHoward Hinnant}; 10603e519524SHoward Hinnant 10613e519524SHoward Hinnanttemplate <class _Tp> 10623e519524SHoward Hinnantstruct __has_void_pointer 10633e519524SHoward Hinnant{ 10643e519524SHoward Hinnantprivate: 106554d333a6SHoward Hinnant struct __two {char __lx; char __lxx;}; 10663e519524SHoward Hinnant template <class _Up> static __two __test(...); 10673e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::void_pointer* = 0); 10683e519524SHoward Hinnantpublic: 10693e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 10703e519524SHoward Hinnant}; 10713e519524SHoward Hinnant 10723e519524SHoward Hinnanttemplate <class _Ptr, class _Alloc, bool = __has_void_pointer<_Alloc>::value> 10733e519524SHoward Hinnantstruct __void_pointer 10743e519524SHoward Hinnant{ 10753e519524SHoward Hinnant typedef typename _Alloc::void_pointer type; 10763e519524SHoward Hinnant}; 10773e519524SHoward Hinnant 10783e519524SHoward Hinnanttemplate <class _Ptr, class _Alloc> 10793e519524SHoward Hinnantstruct __void_pointer<_Ptr, _Alloc, false> 10803e519524SHoward Hinnant{ 108154613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 10823e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<void> type; 10833e519524SHoward Hinnant#else 10843e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<void>::other type; 10853e519524SHoward Hinnant#endif 10863e519524SHoward Hinnant}; 10873e519524SHoward Hinnant 10883e519524SHoward Hinnanttemplate <class _Tp> 10893e519524SHoward Hinnantstruct __has_const_void_pointer 10903e519524SHoward Hinnant{ 10913e519524SHoward Hinnantprivate: 109254d333a6SHoward Hinnant struct __two {char __lx; char __lxx;}; 10933e519524SHoward Hinnant template <class _Up> static __two __test(...); 10943e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::const_void_pointer* = 0); 10953e519524SHoward Hinnantpublic: 10963e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 10973e519524SHoward Hinnant}; 10983e519524SHoward Hinnant 10993e519524SHoward Hinnanttemplate <class _Ptr, class _Alloc, bool = __has_const_void_pointer<_Alloc>::value> 11003e519524SHoward Hinnantstruct __const_void_pointer 11013e519524SHoward Hinnant{ 11023e519524SHoward Hinnant typedef typename _Alloc::const_void_pointer type; 11033e519524SHoward Hinnant}; 11043e519524SHoward Hinnant 11053e519524SHoward Hinnanttemplate <class _Ptr, class _Alloc> 11063e519524SHoward Hinnantstruct __const_void_pointer<_Ptr, _Alloc, false> 11073e519524SHoward Hinnant{ 110854613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 11093e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<const void> type; 11103e519524SHoward Hinnant#else 11113e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<const void>::other type; 11123e519524SHoward Hinnant#endif 11133e519524SHoward Hinnant}; 11143e519524SHoward Hinnant 1115c003db1fSHoward Hinnanttemplate <class _Tp> 11163e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1117c003db1fSHoward Hinnant_Tp* 1118c003db1fSHoward Hinnant__to_raw_pointer(_Tp* __p) _NOEXCEPT 11193e519524SHoward Hinnant{ 11203e519524SHoward Hinnant return __p; 11213e519524SHoward Hinnant} 11223e519524SHoward Hinnant 11233e519524SHoward Hinnanttemplate <class _Pointer> 11243e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 11253e519524SHoward Hinnanttypename pointer_traits<_Pointer>::element_type* 11263739fe79SHoward Hinnant__to_raw_pointer(_Pointer __p) _NOEXCEPT 11273e519524SHoward Hinnant{ 1128ce48a113SHoward Hinnant return _VSTD::__to_raw_pointer(__p.operator->()); 11293e519524SHoward Hinnant} 11303e519524SHoward Hinnant 11313e519524SHoward Hinnanttemplate <class _Tp> 11323e519524SHoward Hinnantstruct __has_size_type 11333e519524SHoward Hinnant{ 11343e519524SHoward Hinnantprivate: 113554d333a6SHoward Hinnant struct __two {char __lx; char __lxx;}; 11363e519524SHoward Hinnant template <class _Up> static __two __test(...); 11373e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::size_type* = 0); 11383e519524SHoward Hinnantpublic: 11393e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 11403e519524SHoward Hinnant}; 11413e519524SHoward Hinnant 1142a4a1ef1fSHoward Hinnanttemplate <class _Alloc, class _DiffType, bool = __has_size_type<_Alloc>::value> 11433e519524SHoward Hinnantstruct __size_type 11443e519524SHoward Hinnant{ 1145a4a1ef1fSHoward Hinnant typedef typename make_unsigned<_DiffType>::type type; 11463e519524SHoward Hinnant}; 11473e519524SHoward Hinnant 1148a4a1ef1fSHoward Hinnanttemplate <class _Alloc, class _DiffType> 1149a4a1ef1fSHoward Hinnantstruct __size_type<_Alloc, _DiffType, true> 11503e519524SHoward Hinnant{ 11513e519524SHoward Hinnant typedef typename _Alloc::size_type type; 11523e519524SHoward Hinnant}; 11533e519524SHoward Hinnant 11543e519524SHoward Hinnanttemplate <class _Tp> 11553e519524SHoward Hinnantstruct __has_propagate_on_container_copy_assignment 11563e519524SHoward Hinnant{ 11573e519524SHoward Hinnantprivate: 115854d333a6SHoward Hinnant struct __two {char __lx; char __lxx;}; 11593e519524SHoward Hinnant template <class _Up> static __two __test(...); 11603e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::propagate_on_container_copy_assignment* = 0); 11613e519524SHoward Hinnantpublic: 11623e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 11633e519524SHoward Hinnant}; 11643e519524SHoward Hinnant 11653e519524SHoward Hinnanttemplate <class _Alloc, bool = __has_propagate_on_container_copy_assignment<_Alloc>::value> 11663e519524SHoward Hinnantstruct __propagate_on_container_copy_assignment 11673e519524SHoward Hinnant{ 11683e519524SHoward Hinnant typedef false_type type; 11693e519524SHoward Hinnant}; 11703e519524SHoward Hinnant 11713e519524SHoward Hinnanttemplate <class _Alloc> 11723e519524SHoward Hinnantstruct __propagate_on_container_copy_assignment<_Alloc, true> 11733e519524SHoward Hinnant{ 11743e519524SHoward Hinnant typedef typename _Alloc::propagate_on_container_copy_assignment type; 11753e519524SHoward Hinnant}; 11763e519524SHoward Hinnant 11773e519524SHoward Hinnanttemplate <class _Tp> 11783e519524SHoward Hinnantstruct __has_propagate_on_container_move_assignment 11793e519524SHoward Hinnant{ 11803e519524SHoward Hinnantprivate: 118154d333a6SHoward Hinnant struct __two {char __lx; char __lxx;}; 11823e519524SHoward Hinnant template <class _Up> static __two __test(...); 11833e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::propagate_on_container_move_assignment* = 0); 11843e519524SHoward Hinnantpublic: 11853e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 11863e519524SHoward Hinnant}; 11873e519524SHoward Hinnant 11883e519524SHoward Hinnanttemplate <class _Alloc, bool = __has_propagate_on_container_move_assignment<_Alloc>::value> 11893e519524SHoward Hinnantstruct __propagate_on_container_move_assignment 11903e519524SHoward Hinnant{ 11913e519524SHoward Hinnant typedef false_type type; 11923e519524SHoward Hinnant}; 11933e519524SHoward Hinnant 11943e519524SHoward Hinnanttemplate <class _Alloc> 11953e519524SHoward Hinnantstruct __propagate_on_container_move_assignment<_Alloc, true> 11963e519524SHoward Hinnant{ 11973e519524SHoward Hinnant typedef typename _Alloc::propagate_on_container_move_assignment type; 11983e519524SHoward Hinnant}; 11993e519524SHoward Hinnant 12003e519524SHoward Hinnanttemplate <class _Tp> 12013e519524SHoward Hinnantstruct __has_propagate_on_container_swap 12023e519524SHoward Hinnant{ 12033e519524SHoward Hinnantprivate: 120454d333a6SHoward Hinnant struct __two {char __lx; char __lxx;}; 12053e519524SHoward Hinnant template <class _Up> static __two __test(...); 12063e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::propagate_on_container_swap* = 0); 12073e519524SHoward Hinnantpublic: 12083e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 12093e519524SHoward Hinnant}; 12103e519524SHoward Hinnant 12113e519524SHoward Hinnanttemplate <class _Alloc, bool = __has_propagate_on_container_swap<_Alloc>::value> 12123e519524SHoward Hinnantstruct __propagate_on_container_swap 12133e519524SHoward Hinnant{ 12143e519524SHoward Hinnant typedef false_type type; 12153e519524SHoward Hinnant}; 12163e519524SHoward Hinnant 12173e519524SHoward Hinnanttemplate <class _Alloc> 12183e519524SHoward Hinnantstruct __propagate_on_container_swap<_Alloc, true> 12193e519524SHoward Hinnant{ 12203e519524SHoward Hinnant typedef typename _Alloc::propagate_on_container_swap type; 12213e519524SHoward Hinnant}; 12223e519524SHoward Hinnant 122331a47313SMarshall Clowtemplate <class _Tp> 122431a47313SMarshall Clowstruct __has_is_always_equal 122531a47313SMarshall Clow{ 122631a47313SMarshall Clowprivate: 122731a47313SMarshall Clow struct __two {char __lx; char __lxx;}; 122831a47313SMarshall Clow template <class _Up> static __two __test(...); 122931a47313SMarshall Clow template <class _Up> static char __test(typename _Up::is_always_equal* = 0); 123031a47313SMarshall Clowpublic: 123131a47313SMarshall Clow static const bool value = sizeof(__test<_Tp>(0)) == 1; 123231a47313SMarshall Clow}; 123331a47313SMarshall Clow 123431a47313SMarshall Clowtemplate <class _Alloc, bool = __has_is_always_equal<_Alloc>::value> 123531a47313SMarshall Clowstruct __is_always_equal 123631a47313SMarshall Clow{ 123731a47313SMarshall Clow typedef typename _VSTD::is_empty<_Alloc>::type type; 123831a47313SMarshall Clow}; 123931a47313SMarshall Clow 124031a47313SMarshall Clowtemplate <class _Alloc> 124131a47313SMarshall Clowstruct __is_always_equal<_Alloc, true> 124231a47313SMarshall Clow{ 124331a47313SMarshall Clow typedef typename _Alloc::is_always_equal type; 124431a47313SMarshall Clow}; 124531a47313SMarshall Clow 12463e519524SHoward Hinnanttemplate <class _Tp, class _Up, bool = __has_rebind<_Tp, _Up>::value> 12473e519524SHoward Hinnantstruct __has_rebind_other 12483e519524SHoward Hinnant{ 12493e519524SHoward Hinnantprivate: 125054d333a6SHoward Hinnant struct __two {char __lx; char __lxx;}; 12513e519524SHoward Hinnant template <class _Xp> static __two __test(...); 12523e519524SHoward Hinnant template <class _Xp> static char __test(typename _Xp::template rebind<_Up>::other* = 0); 12533e519524SHoward Hinnantpublic: 12543e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 12553e519524SHoward Hinnant}; 12563e519524SHoward Hinnant 12573e519524SHoward Hinnanttemplate <class _Tp, class _Up> 12583e519524SHoward Hinnantstruct __has_rebind_other<_Tp, _Up, false> 12593e519524SHoward Hinnant{ 12603e519524SHoward Hinnant static const bool value = false; 12613e519524SHoward Hinnant}; 12623e519524SHoward Hinnant 12633e519524SHoward Hinnanttemplate <class _Tp, class _Up, bool = __has_rebind_other<_Tp, _Up>::value> 12643e519524SHoward Hinnantstruct __allocator_traits_rebind 12653e519524SHoward Hinnant{ 12663e519524SHoward Hinnant typedef typename _Tp::template rebind<_Up>::other type; 12673e519524SHoward Hinnant}; 12683e519524SHoward Hinnant 12693e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 12703e519524SHoward Hinnant 12713e519524SHoward Hinnanttemplate <template <class, class...> class _Alloc, class _Tp, class ..._Args, class _Up> 12723e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _Args...>, _Up, true> 12733e519524SHoward Hinnant{ 12743e519524SHoward Hinnant typedef typename _Alloc<_Tp, _Args...>::template rebind<_Up>::other type; 12753e519524SHoward Hinnant}; 12763e519524SHoward Hinnant 12773e519524SHoward Hinnanttemplate <template <class, class...> class _Alloc, class _Tp, class ..._Args, class _Up> 12783e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _Args...>, _Up, false> 12793e519524SHoward Hinnant{ 12803e519524SHoward Hinnant typedef _Alloc<_Up, _Args...> type; 12813e519524SHoward Hinnant}; 12823e519524SHoward Hinnant 1283b3371f6fSHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 12843e519524SHoward Hinnant 12853e519524SHoward Hinnanttemplate <template <class> class _Alloc, class _Tp, class _Up> 12863e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp>, _Up, true> 12873e519524SHoward Hinnant{ 12883e519524SHoward Hinnant typedef typename _Alloc<_Tp>::template rebind<_Up>::other type; 12893e519524SHoward Hinnant}; 12903e519524SHoward Hinnant 12913e519524SHoward Hinnanttemplate <template <class> class _Alloc, class _Tp, class _Up> 12923e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp>, _Up, false> 12933e519524SHoward Hinnant{ 12943e519524SHoward Hinnant typedef _Alloc<_Up> type; 12953e519524SHoward Hinnant}; 12963e519524SHoward Hinnant 12973e519524SHoward Hinnanttemplate <template <class, class> class _Alloc, class _Tp, class _A0, class _Up> 12983e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0>, _Up, true> 12993e519524SHoward Hinnant{ 13003e519524SHoward Hinnant typedef typename _Alloc<_Tp, _A0>::template rebind<_Up>::other type; 13013e519524SHoward Hinnant}; 13023e519524SHoward Hinnant 13033e519524SHoward Hinnanttemplate <template <class, class> class _Alloc, class _Tp, class _A0, class _Up> 13043e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0>, _Up, false> 13053e519524SHoward Hinnant{ 13063e519524SHoward Hinnant typedef _Alloc<_Up, _A0> type; 13073e519524SHoward Hinnant}; 13083e519524SHoward Hinnant 13093e519524SHoward Hinnanttemplate <template <class, class, class> class _Alloc, class _Tp, class _A0, 13103e519524SHoward Hinnant class _A1, class _Up> 13113e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1>, _Up, true> 13123e519524SHoward Hinnant{ 13133e519524SHoward Hinnant typedef typename _Alloc<_Tp, _A0, _A1>::template rebind<_Up>::other type; 13143e519524SHoward Hinnant}; 13153e519524SHoward Hinnant 13163e519524SHoward Hinnanttemplate <template <class, class, class> class _Alloc, class _Tp, class _A0, 13173e519524SHoward Hinnant class _A1, class _Up> 13183e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1>, _Up, false> 13193e519524SHoward Hinnant{ 13203e519524SHoward Hinnant typedef _Alloc<_Up, _A0, _A1> type; 13213e519524SHoward Hinnant}; 13223e519524SHoward Hinnant 13233e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Alloc, class _Tp, class _A0, 13243e519524SHoward Hinnant class _A1, class _A2, class _Up> 13253e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1, _A2>, _Up, true> 13263e519524SHoward Hinnant{ 13273e519524SHoward Hinnant typedef typename _Alloc<_Tp, _A0, _A1, _A2>::template rebind<_Up>::other type; 13283e519524SHoward Hinnant}; 13293e519524SHoward Hinnant 13303e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Alloc, class _Tp, class _A0, 13313e519524SHoward Hinnant class _A1, class _A2, class _Up> 13323e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1, _A2>, _Up, false> 13333e519524SHoward Hinnant{ 13343e519524SHoward Hinnant typedef _Alloc<_Up, _A0, _A1, _A2> type; 13353e519524SHoward Hinnant}; 13363e519524SHoward Hinnant 1337b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 13383e519524SHoward Hinnant 133954613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 13403e519524SHoward Hinnant 13413e519524SHoward Hinnanttemplate <class _Alloc, class _SizeType, class _ConstVoidPtr> 13423e519524SHoward Hinnantauto 13433e519524SHoward Hinnant__has_allocate_hint_test(_Alloc&& __a, _SizeType&& __sz, _ConstVoidPtr&& __p) 13443e519524SHoward Hinnant -> decltype(__a.allocate(__sz, __p), true_type()); 13453e519524SHoward Hinnant 13463e519524SHoward Hinnanttemplate <class _Alloc, class _SizeType, class _ConstVoidPtr> 13473e519524SHoward Hinnantauto 13483e519524SHoward Hinnant__has_allocate_hint_test(const _Alloc& __a, _SizeType&& __sz, _ConstVoidPtr&& __p) 13493e519524SHoward Hinnant -> false_type; 13503e519524SHoward Hinnant 13513e519524SHoward Hinnanttemplate <class _Alloc, class _SizeType, class _ConstVoidPtr> 13523e519524SHoward Hinnantstruct __has_allocate_hint 13533e519524SHoward Hinnant : integral_constant<bool, 13543e519524SHoward Hinnant is_same< 13553e519524SHoward Hinnant decltype(__has_allocate_hint_test(declval<_Alloc>(), 13563e519524SHoward Hinnant declval<_SizeType>(), 13573e519524SHoward Hinnant declval<_ConstVoidPtr>())), 13583e519524SHoward Hinnant true_type>::value> 13593e519524SHoward Hinnant{ 13603e519524SHoward Hinnant}; 13613e519524SHoward Hinnant 136254613ab4SEric Fiselier#else // _LIBCPP_CXX03_LANG 13633e519524SHoward Hinnant 13643e519524SHoward Hinnanttemplate <class _Alloc, class _SizeType, class _ConstVoidPtr> 13653e519524SHoward Hinnantstruct __has_allocate_hint 13663e519524SHoward Hinnant : true_type 13673e519524SHoward Hinnant{ 13683e519524SHoward Hinnant}; 13693e519524SHoward Hinnant 137054613ab4SEric Fiselier#endif // _LIBCPP_CXX03_LANG 13713e519524SHoward Hinnant 137254613ab4SEric Fiselier#if !defined(_LIBCPP_CXX03_LANG) 13733e519524SHoward Hinnant 13743e519524SHoward Hinnanttemplate <class _Alloc, class _Tp, class ..._Args> 1375ce48a113SHoward Hinnantdecltype(_VSTD::declval<_Alloc>().construct(_VSTD::declval<_Tp*>(), 1376ce48a113SHoward Hinnant _VSTD::declval<_Args>()...), 13773e519524SHoward Hinnant true_type()) 13783e519524SHoward Hinnant__has_construct_test(_Alloc&& __a, _Tp* __p, _Args&& ...__args); 13793e519524SHoward Hinnant 13803e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer, class ..._Args> 13813e519524SHoward Hinnantfalse_type 13823e519524SHoward Hinnant__has_construct_test(const _Alloc& __a, _Pointer&& __p, _Args&& ...__args); 13833e519524SHoward Hinnant 13843e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer, class ..._Args> 13853e519524SHoward Hinnantstruct __has_construct 13863e519524SHoward Hinnant : integral_constant<bool, 13873e519524SHoward Hinnant is_same< 13883e519524SHoward Hinnant decltype(__has_construct_test(declval<_Alloc>(), 13893e519524SHoward Hinnant declval<_Pointer>(), 13903e519524SHoward Hinnant declval<_Args>()...)), 13913e519524SHoward Hinnant true_type>::value> 13923e519524SHoward Hinnant{ 13933e519524SHoward Hinnant}; 13943e519524SHoward Hinnant 13953e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer> 13963e519524SHoward Hinnantauto 13973e519524SHoward Hinnant__has_destroy_test(_Alloc&& __a, _Pointer&& __p) 13983e519524SHoward Hinnant -> decltype(__a.destroy(__p), true_type()); 13993e519524SHoward Hinnant 14003e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer> 14013e519524SHoward Hinnantauto 14023e519524SHoward Hinnant__has_destroy_test(const _Alloc& __a, _Pointer&& __p) 14033e519524SHoward Hinnant -> false_type; 14043e519524SHoward Hinnant 14053e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer> 14063e519524SHoward Hinnantstruct __has_destroy 14073e519524SHoward Hinnant : integral_constant<bool, 14083e519524SHoward Hinnant is_same< 14093e519524SHoward Hinnant decltype(__has_destroy_test(declval<_Alloc>(), 14103e519524SHoward Hinnant declval<_Pointer>())), 14113e519524SHoward Hinnant true_type>::value> 14123e519524SHoward Hinnant{ 14133e519524SHoward Hinnant}; 14143e519524SHoward Hinnant 14153e519524SHoward Hinnanttemplate <class _Alloc> 14163e519524SHoward Hinnantauto 14173e519524SHoward Hinnant__has_max_size_test(_Alloc&& __a) 14183e519524SHoward Hinnant -> decltype(__a.max_size(), true_type()); 14193e519524SHoward Hinnant 14203e519524SHoward Hinnanttemplate <class _Alloc> 14213e519524SHoward Hinnantauto 14223e519524SHoward Hinnant__has_max_size_test(const volatile _Alloc& __a) 14233e519524SHoward Hinnant -> false_type; 14243e519524SHoward Hinnant 14253e519524SHoward Hinnanttemplate <class _Alloc> 14263e519524SHoward Hinnantstruct __has_max_size 14273e519524SHoward Hinnant : integral_constant<bool, 14283e519524SHoward Hinnant is_same< 14293e519524SHoward Hinnant decltype(__has_max_size_test(declval<_Alloc&>())), 14303e519524SHoward Hinnant true_type>::value> 14313e519524SHoward Hinnant{ 14323e519524SHoward Hinnant}; 14333e519524SHoward Hinnant 14343e519524SHoward Hinnanttemplate <class _Alloc> 14353e519524SHoward Hinnantauto 14363e519524SHoward Hinnant__has_select_on_container_copy_construction_test(_Alloc&& __a) 14373e519524SHoward Hinnant -> decltype(__a.select_on_container_copy_construction(), true_type()); 14383e519524SHoward Hinnant 14393e519524SHoward Hinnanttemplate <class _Alloc> 14403e519524SHoward Hinnantauto 14413e519524SHoward Hinnant__has_select_on_container_copy_construction_test(const volatile _Alloc& __a) 14423e519524SHoward Hinnant -> false_type; 14433e519524SHoward Hinnant 14443e519524SHoward Hinnanttemplate <class _Alloc> 14453e519524SHoward Hinnantstruct __has_select_on_container_copy_construction 14463e519524SHoward Hinnant : integral_constant<bool, 14473e519524SHoward Hinnant is_same< 14483e519524SHoward Hinnant decltype(__has_select_on_container_copy_construction_test(declval<_Alloc&>())), 14493e519524SHoward Hinnant true_type>::value> 14503e519524SHoward Hinnant{ 14513e519524SHoward Hinnant}; 14523e519524SHoward Hinnant 145354613ab4SEric Fiselier#else // _LIBCPP_CXX03_LANG 14543e519524SHoward Hinnant 14553e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 14563e519524SHoward Hinnant 14573e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer, class ..._Args> 14583e519524SHoward Hinnantstruct __has_construct 14593e519524SHoward Hinnant : false_type 14603e519524SHoward Hinnant{ 14613e519524SHoward Hinnant}; 14623e519524SHoward Hinnant 14639741d6c9SHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 14649741d6c9SHoward Hinnant 14659741d6c9SHoward Hinnanttemplate <class _Alloc, class _Pointer, class _Args> 14669741d6c9SHoward Hinnantstruct __has_construct 14679741d6c9SHoward Hinnant : false_type 14689741d6c9SHoward Hinnant{ 14699741d6c9SHoward Hinnant}; 14709741d6c9SHoward Hinnant 1471b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 14723e519524SHoward Hinnant 14733e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer> 14743e519524SHoward Hinnantstruct __has_destroy 14753e519524SHoward Hinnant : false_type 14763e519524SHoward Hinnant{ 14773e519524SHoward Hinnant}; 14783e519524SHoward Hinnant 14793e519524SHoward Hinnanttemplate <class _Alloc> 14803e519524SHoward Hinnantstruct __has_max_size 14813e519524SHoward Hinnant : true_type 14823e519524SHoward Hinnant{ 14833e519524SHoward Hinnant}; 14843e519524SHoward Hinnant 14853e519524SHoward Hinnanttemplate <class _Alloc> 14863e519524SHoward Hinnantstruct __has_select_on_container_copy_construction 14873e519524SHoward Hinnant : false_type 14883e519524SHoward Hinnant{ 14893e519524SHoward Hinnant}; 14903e519524SHoward Hinnant 149154613ab4SEric Fiselier#endif // _LIBCPP_CXX03_LANG 14923e519524SHoward Hinnant 1493a4a1ef1fSHoward Hinnanttemplate <class _Alloc, class _Ptr, bool = __has_difference_type<_Alloc>::value> 1494a4a1ef1fSHoward Hinnantstruct __alloc_traits_difference_type 1495a4a1ef1fSHoward Hinnant{ 1496a4a1ef1fSHoward Hinnant typedef typename pointer_traits<_Ptr>::difference_type type; 1497a4a1ef1fSHoward Hinnant}; 1498a4a1ef1fSHoward Hinnant 1499a4a1ef1fSHoward Hinnanttemplate <class _Alloc, class _Ptr> 1500a4a1ef1fSHoward Hinnantstruct __alloc_traits_difference_type<_Alloc, _Ptr, true> 1501a4a1ef1fSHoward Hinnant{ 1502a4a1ef1fSHoward Hinnant typedef typename _Alloc::difference_type type; 1503a4a1ef1fSHoward Hinnant}; 1504a4a1ef1fSHoward Hinnant 15053e519524SHoward Hinnanttemplate <class _Alloc> 1506e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS allocator_traits 15073e519524SHoward Hinnant{ 15083e519524SHoward Hinnant typedef _Alloc allocator_type; 15093e519524SHoward Hinnant typedef typename allocator_type::value_type value_type; 15103e519524SHoward Hinnant 15113e519524SHoward Hinnant typedef typename __pointer_type<value_type, allocator_type>::type pointer; 15123e519524SHoward Hinnant typedef typename __const_pointer<value_type, pointer, allocator_type>::type const_pointer; 15133e519524SHoward Hinnant typedef typename __void_pointer<pointer, allocator_type>::type void_pointer; 15143e519524SHoward Hinnant typedef typename __const_void_pointer<pointer, allocator_type>::type const_void_pointer; 15153e519524SHoward Hinnant 1516a4a1ef1fSHoward Hinnant typedef typename __alloc_traits_difference_type<allocator_type, pointer>::type difference_type; 1517a4a1ef1fSHoward Hinnant typedef typename __size_type<allocator_type, difference_type>::type size_type; 15183e519524SHoward Hinnant 15193e519524SHoward Hinnant typedef typename __propagate_on_container_copy_assignment<allocator_type>::type 15203e519524SHoward Hinnant propagate_on_container_copy_assignment; 15213e519524SHoward Hinnant typedef typename __propagate_on_container_move_assignment<allocator_type>::type 15223e519524SHoward Hinnant propagate_on_container_move_assignment; 15233e519524SHoward Hinnant typedef typename __propagate_on_container_swap<allocator_type>::type 15243e519524SHoward Hinnant propagate_on_container_swap; 152531a47313SMarshall Clow typedef typename __is_always_equal<allocator_type>::type 152631a47313SMarshall Clow is_always_equal; 15273e519524SHoward Hinnant 152854613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 15293e519524SHoward Hinnant template <class _Tp> using rebind_alloc = 1530f7384975SHoward Hinnant typename __allocator_traits_rebind<allocator_type, _Tp>::type; 15313e519524SHoward Hinnant template <class _Tp> using rebind_traits = allocator_traits<rebind_alloc<_Tp>>; 153254613ab4SEric Fiselier#else // _LIBCPP_CXX03_LANG 15333e519524SHoward Hinnant template <class _Tp> struct rebind_alloc 15343e519524SHoward Hinnant {typedef typename __allocator_traits_rebind<allocator_type, _Tp>::type other;}; 15353e519524SHoward Hinnant template <class _Tp> struct rebind_traits 15363e519524SHoward Hinnant {typedef allocator_traits<typename rebind_alloc<_Tp>::other> other;}; 153754613ab4SEric Fiselier#endif // _LIBCPP_CXX03_LANG 15383e519524SHoward Hinnant 1539848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15403e519524SHoward Hinnant static pointer allocate(allocator_type& __a, size_type __n) 15413e519524SHoward Hinnant {return __a.allocate(__n);} 1542848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15433e519524SHoward Hinnant static pointer allocate(allocator_type& __a, size_type __n, const_void_pointer __hint) 15443e519524SHoward Hinnant {return allocate(__a, __n, __hint, 15453e519524SHoward Hinnant __has_allocate_hint<allocator_type, size_type, const_void_pointer>());} 15463e519524SHoward Hinnant 1547848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15483739fe79SHoward Hinnant static void deallocate(allocator_type& __a, pointer __p, size_type __n) _NOEXCEPT 15493e519524SHoward Hinnant {__a.deallocate(__p, __n);} 15503e519524SHoward Hinnant 15513e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 15523e519524SHoward Hinnant template <class _Tp, class... _Args> 1553848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15543e519524SHoward Hinnant static void construct(allocator_type& __a, _Tp* __p, _Args&&... __args) 1555981f31acSMarshall Clow {__construct(__has_construct<allocator_type, _Tp*, _Args...>(), 1556ce48a113SHoward Hinnant __a, __p, _VSTD::forward<_Args>(__args)...);} 1557b3371f6fSHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 15583e519524SHoward Hinnant template <class _Tp> 1559848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1560a595b7f0SEric Fiselier static void construct(allocator_type&, _Tp* __p) 15613e519524SHoward Hinnant { 15623e519524SHoward Hinnant ::new ((void*)__p) _Tp(); 15633e519524SHoward Hinnant } 15643e519524SHoward Hinnant template <class _Tp, class _A0> 1565848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1566a595b7f0SEric Fiselier static void construct(allocator_type&, _Tp* __p, const _A0& __a0) 15673e519524SHoward Hinnant { 15683e519524SHoward Hinnant ::new ((void*)__p) _Tp(__a0); 15693e519524SHoward Hinnant } 15703e519524SHoward Hinnant template <class _Tp, class _A0, class _A1> 1571848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1572a595b7f0SEric Fiselier static void construct(allocator_type&, _Tp* __p, const _A0& __a0, 15733e519524SHoward Hinnant const _A1& __a1) 15743e519524SHoward Hinnant { 15753e519524SHoward Hinnant ::new ((void*)__p) _Tp(__a0, __a1); 15763e519524SHoward Hinnant } 15773e519524SHoward Hinnant template <class _Tp, class _A0, class _A1, class _A2> 1578848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1579a595b7f0SEric Fiselier static void construct(allocator_type&, _Tp* __p, const _A0& __a0, 15803e519524SHoward Hinnant const _A1& __a1, const _A2& __a2) 15813e519524SHoward Hinnant { 15823e519524SHoward Hinnant ::new ((void*)__p) _Tp(__a0, __a1, __a2); 15833e519524SHoward Hinnant } 1584b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 15853e519524SHoward Hinnant 15863e519524SHoward Hinnant template <class _Tp> 1587848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15883e519524SHoward Hinnant static void destroy(allocator_type& __a, _Tp* __p) 15893e519524SHoward Hinnant {__destroy(__has_destroy<allocator_type, _Tp*>(), __a, __p);} 15903e519524SHoward Hinnant 1591848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 159206fbed03SMarshall Clow static size_type max_size(const allocator_type& __a) _NOEXCEPT 15933e519524SHoward Hinnant {return __max_size(__has_max_size<const allocator_type>(), __a);} 15943e519524SHoward Hinnant 1595848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15963e519524SHoward Hinnant static allocator_type 15973e519524SHoward Hinnant select_on_container_copy_construction(const allocator_type& __a) 15983e519524SHoward Hinnant {return select_on_container_copy_construction( 15993e519524SHoward Hinnant __has_select_on_container_copy_construction<const allocator_type>(), 16003e519524SHoward Hinnant __a);} 16013e519524SHoward Hinnant 16029741d6c9SHoward Hinnant template <class _Ptr> 16039741d6c9SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16049741d6c9SHoward Hinnant static 16059741d6c9SHoward Hinnant void 16069741d6c9SHoward Hinnant __construct_forward(allocator_type& __a, _Ptr __begin1, _Ptr __end1, _Ptr& __begin2) 16079741d6c9SHoward Hinnant { 16089741d6c9SHoward Hinnant for (; __begin1 != __end1; ++__begin1, ++__begin2) 16099741d6c9SHoward Hinnant construct(__a, _VSTD::__to_raw_pointer(__begin2), _VSTD::move_if_noexcept(*__begin1)); 16109741d6c9SHoward Hinnant } 16119741d6c9SHoward Hinnant 16129741d6c9SHoward Hinnant template <class _Tp> 16139741d6c9SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16149741d6c9SHoward Hinnant static 16159741d6c9SHoward Hinnant typename enable_if 16169741d6c9SHoward Hinnant < 16179741d6c9SHoward Hinnant (is_same<allocator_type, allocator<_Tp> >::value 16189741d6c9SHoward Hinnant || !__has_construct<allocator_type, _Tp*, _Tp>::value) && 16199741d6c9SHoward Hinnant is_trivially_move_constructible<_Tp>::value, 16209741d6c9SHoward Hinnant void 16219741d6c9SHoward Hinnant >::type 1622fd838227SEric Fiselier __construct_forward(allocator_type&, _Tp* __begin1, _Tp* __end1, _Tp*& __begin2) 16239741d6c9SHoward Hinnant { 16249741d6c9SHoward Hinnant ptrdiff_t _Np = __end1 - __begin1; 162587601befSMarshall Clow if (_Np > 0) 1626e6230742SMarshall Clow { 16279741d6c9SHoward Hinnant _VSTD::memcpy(__begin2, __begin1, _Np * sizeof(_Tp)); 16289741d6c9SHoward Hinnant __begin2 += _Np; 16299741d6c9SHoward Hinnant } 1630e6230742SMarshall Clow } 16319741d6c9SHoward Hinnant 1632e782178eSEric Fiselier template <class _Iter, class _Ptr> 1633e782178eSEric Fiselier _LIBCPP_INLINE_VISIBILITY 1634e782178eSEric Fiselier static 1635e782178eSEric Fiselier void 1636e782178eSEric Fiselier __construct_range_forward(allocator_type& __a, _Iter __begin1, _Iter __end1, _Ptr& __begin2) 1637e782178eSEric Fiselier { 1638e782178eSEric Fiselier for (; __begin1 != __end1; ++__begin1, (void) ++__begin2) 1639e782178eSEric Fiselier construct(__a, _VSTD::__to_raw_pointer(__begin2), *__begin1); 1640e782178eSEric Fiselier } 1641e782178eSEric Fiselier 1642e782178eSEric Fiselier template <class _Tp> 1643e782178eSEric Fiselier _LIBCPP_INLINE_VISIBILITY 1644e782178eSEric Fiselier static 1645e782178eSEric Fiselier typename enable_if 1646e782178eSEric Fiselier < 1647e782178eSEric Fiselier (is_same<allocator_type, allocator<_Tp> >::value 1648e782178eSEric Fiselier || !__has_construct<allocator_type, _Tp*, _Tp>::value) && 1649e782178eSEric Fiselier is_trivially_move_constructible<_Tp>::value, 1650e782178eSEric Fiselier void 1651e782178eSEric Fiselier >::type 1652fd838227SEric Fiselier __construct_range_forward(allocator_type&, _Tp* __begin1, _Tp* __end1, _Tp*& __begin2) 1653e782178eSEric Fiselier { 1654e782178eSEric Fiselier typedef typename remove_const<_Tp>::type _Vp; 1655e782178eSEric Fiselier ptrdiff_t _Np = __end1 - __begin1; 165687601befSMarshall Clow if (_Np > 0) 1657e6230742SMarshall Clow { 1658e782178eSEric Fiselier _VSTD::memcpy(const_cast<_Vp*>(__begin2), __begin1, _Np * sizeof(_Tp)); 1659e782178eSEric Fiselier __begin2 += _Np; 1660e782178eSEric Fiselier } 1661e6230742SMarshall Clow } 1662e782178eSEric Fiselier 16639741d6c9SHoward Hinnant template <class _Ptr> 16649741d6c9SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16659741d6c9SHoward Hinnant static 16669741d6c9SHoward Hinnant void 16679741d6c9SHoward Hinnant __construct_backward(allocator_type& __a, _Ptr __begin1, _Ptr __end1, _Ptr& __end2) 16689741d6c9SHoward Hinnant { 16699741d6c9SHoward Hinnant while (__end1 != __begin1) 16708d9aec88SHoward Hinnant { 16718d9aec88SHoward Hinnant construct(__a, _VSTD::__to_raw_pointer(__end2-1), _VSTD::move_if_noexcept(*--__end1)); 16728d9aec88SHoward Hinnant --__end2; 16738d9aec88SHoward Hinnant } 16749741d6c9SHoward Hinnant } 16759741d6c9SHoward Hinnant 16769741d6c9SHoward Hinnant template <class _Tp> 16779741d6c9SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16789741d6c9SHoward Hinnant static 16799741d6c9SHoward Hinnant typename enable_if 16809741d6c9SHoward Hinnant < 16819741d6c9SHoward Hinnant (is_same<allocator_type, allocator<_Tp> >::value 16829741d6c9SHoward Hinnant || !__has_construct<allocator_type, _Tp*, _Tp>::value) && 16839741d6c9SHoward Hinnant is_trivially_move_constructible<_Tp>::value, 16849741d6c9SHoward Hinnant void 16859741d6c9SHoward Hinnant >::type 1686fd838227SEric Fiselier __construct_backward(allocator_type&, _Tp* __begin1, _Tp* __end1, _Tp*& __end2) 16879741d6c9SHoward Hinnant { 16889741d6c9SHoward Hinnant ptrdiff_t _Np = __end1 - __begin1; 16899741d6c9SHoward Hinnant __end2 -= _Np; 169087601befSMarshall Clow if (_Np > 0) 16919741d6c9SHoward Hinnant _VSTD::memcpy(__end2, __begin1, _Np * sizeof(_Tp)); 16929741d6c9SHoward Hinnant } 16939741d6c9SHoward Hinnant 16943e519524SHoward Hinnantprivate: 16953e519524SHoward Hinnant 1696848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16973e519524SHoward Hinnant static pointer allocate(allocator_type& __a, size_type __n, 16983e519524SHoward Hinnant const_void_pointer __hint, true_type) 16993e519524SHoward Hinnant {return __a.allocate(__n, __hint);} 1700848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17013e519524SHoward Hinnant static pointer allocate(allocator_type& __a, size_type __n, 1702c206366fSHoward Hinnant const_void_pointer, false_type) 17033e519524SHoward Hinnant {return __a.allocate(__n);} 17043e519524SHoward Hinnant 17053e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 17063e519524SHoward Hinnant template <class _Tp, class... _Args> 1707848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17083e519524SHoward Hinnant static void __construct(true_type, allocator_type& __a, _Tp* __p, _Args&&... __args) 1709ce48a113SHoward Hinnant {__a.construct(__p, _VSTD::forward<_Args>(__args)...);} 17103e519524SHoward Hinnant template <class _Tp, class... _Args> 1711848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17123e519524SHoward Hinnant static void __construct(false_type, allocator_type&, _Tp* __p, _Args&&... __args) 17133e519524SHoward Hinnant { 1714ce48a113SHoward Hinnant ::new ((void*)__p) _Tp(_VSTD::forward<_Args>(__args)...); 17153e519524SHoward Hinnant } 1716b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 17173e519524SHoward Hinnant 17183e519524SHoward Hinnant template <class _Tp> 1719848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17203e519524SHoward Hinnant static void __destroy(true_type, allocator_type& __a, _Tp* __p) 17213e519524SHoward Hinnant {__a.destroy(__p);} 17223e519524SHoward Hinnant template <class _Tp> 1723848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17243e519524SHoward Hinnant static void __destroy(false_type, allocator_type&, _Tp* __p) 17253e519524SHoward Hinnant { 17263e519524SHoward Hinnant __p->~_Tp(); 17273e519524SHoward Hinnant } 17283e519524SHoward Hinnant 1729848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17303e519524SHoward Hinnant static size_type __max_size(true_type, const allocator_type& __a) 17313e519524SHoward Hinnant {return __a.max_size();} 1732848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17333e519524SHoward Hinnant static size_type __max_size(false_type, const allocator_type&) 1734b631c243SMarshall Clow {return numeric_limits<size_type>::max() / sizeof(value_type);} 17353e519524SHoward Hinnant 1736848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17373e519524SHoward Hinnant static allocator_type 17383e519524SHoward Hinnant select_on_container_copy_construction(true_type, const allocator_type& __a) 17393e519524SHoward Hinnant {return __a.select_on_container_copy_construction();} 1740848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17413e519524SHoward Hinnant static allocator_type 17423e519524SHoward Hinnant select_on_container_copy_construction(false_type, const allocator_type& __a) 17433e519524SHoward Hinnant {return __a;} 17443e519524SHoward Hinnant}; 17453e519524SHoward Hinnant 17461f508014SMarshall Clowtemplate <class _Traits, class _Tp> 17471f508014SMarshall Clowstruct __rebind_alloc_helper 17481f508014SMarshall Clow{ 174954613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 17501f508014SMarshall Clow typedef typename _Traits::template rebind_alloc<_Tp> type; 17511f508014SMarshall Clow#else 17521f508014SMarshall Clow typedef typename _Traits::template rebind_alloc<_Tp>::other type; 17531f508014SMarshall Clow#endif 17541f508014SMarshall Clow}; 17551f508014SMarshall Clow 17563e519524SHoward Hinnant// allocator 17573e519524SHoward Hinnant 17583e519524SHoward Hinnanttemplate <class _Tp> 1759e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS allocator 17603e519524SHoward Hinnant{ 17613e519524SHoward Hinnantpublic: 17623e519524SHoward Hinnant typedef size_t size_type; 17633e519524SHoward Hinnant typedef ptrdiff_t difference_type; 17643e519524SHoward Hinnant typedef _Tp* pointer; 17653e519524SHoward Hinnant typedef const _Tp* const_pointer; 17663e519524SHoward Hinnant typedef _Tp& reference; 17673e519524SHoward Hinnant typedef const _Tp& const_reference; 17683e519524SHoward Hinnant typedef _Tp value_type; 17693e519524SHoward Hinnant 1770b58f59cdSHoward Hinnant typedef true_type propagate_on_container_move_assignment; 177131a47313SMarshall Clow typedef true_type is_always_equal; 1772b58f59cdSHoward Hinnant 17733e519524SHoward Hinnant template <class _Up> struct rebind {typedef allocator<_Up> other;}; 17743e519524SHoward Hinnant 17753739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY allocator() _NOEXCEPT {} 17763739fe79SHoward Hinnant template <class _Up> _LIBCPP_INLINE_VISIBILITY allocator(const allocator<_Up>&) _NOEXCEPT {} 17773739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer address(reference __x) const _NOEXCEPT 1778ce48a113SHoward Hinnant {return _VSTD::addressof(__x);} 17793739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY const_pointer address(const_reference __x) const _NOEXCEPT 1780ce48a113SHoward Hinnant {return _VSTD::addressof(__x);} 17813e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer allocate(size_type __n, allocator<void>::const_pointer = 0) 17824cec709eSMarshall Clow { 17834cec709eSMarshall Clow if (__n > max_size()) 17840fc8cec7SMarshall Clow __throw_length_error("allocator<T>::allocate(size_t n)" 17850fc8cec7SMarshall Clow " 'n' exceeds maximum supported size"); 17864cec709eSMarshall Clow return static_cast<pointer>(_VSTD::__allocate(__n * sizeof(_Tp))); 17874cec709eSMarshall Clow } 17883739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void deallocate(pointer __p, size_type) _NOEXCEPT 1789cd71f447SEric Fiselier {_VSTD::__libcpp_deallocate((void*)__p);} 17903739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT 17913739fe79SHoward Hinnant {return size_type(~0) / sizeof(_Tp);} 17927609c9b6SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 17933e519524SHoward Hinnant template <class _Up, class... _Args> 17943e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17953e519524SHoward Hinnant void 17963e519524SHoward Hinnant construct(_Up* __p, _Args&&... __args) 17973e519524SHoward Hinnant { 1798ce48a113SHoward Hinnant ::new((void*)__p) _Up(_VSTD::forward<_Args>(__args)...); 17993e519524SHoward Hinnant } 18007609c9b6SHoward Hinnant#else // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 18013e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18023e519524SHoward Hinnant void 18033e519524SHoward Hinnant construct(pointer __p) 18043e519524SHoward Hinnant { 18053e519524SHoward Hinnant ::new((void*)__p) _Tp(); 18063e519524SHoward Hinnant } 1807f5799be4SMichael J. Spencer# if defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) 1808bff1bfc6SHoward Hinnant 18093e519524SHoward Hinnant template <class _A0> 18103e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18113e519524SHoward Hinnant void 18123e519524SHoward Hinnant construct(pointer __p, _A0& __a0) 18133e519524SHoward Hinnant { 18143e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0); 18153e519524SHoward Hinnant } 18163e519524SHoward Hinnant template <class _A0> 18173e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18183e519524SHoward Hinnant void 18193e519524SHoward Hinnant construct(pointer __p, const _A0& __a0) 18203e519524SHoward Hinnant { 18213e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0); 18223e519524SHoward Hinnant } 1823f5799be4SMichael J. Spencer# endif // defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) 18243e519524SHoward Hinnant template <class _A0, class _A1> 18253e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18263e519524SHoward Hinnant void 18273e519524SHoward Hinnant construct(pointer __p, _A0& __a0, _A1& __a1) 18283e519524SHoward Hinnant { 18293e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 18303e519524SHoward Hinnant } 18313e519524SHoward Hinnant template <class _A0, class _A1> 18323e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18333e519524SHoward Hinnant void 18343e519524SHoward Hinnant construct(pointer __p, const _A0& __a0, _A1& __a1) 18353e519524SHoward Hinnant { 18363e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 18373e519524SHoward Hinnant } 18383e519524SHoward Hinnant template <class _A0, class _A1> 18393e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18403e519524SHoward Hinnant void 18413e519524SHoward Hinnant construct(pointer __p, _A0& __a0, const _A1& __a1) 18423e519524SHoward Hinnant { 18433e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 18443e519524SHoward Hinnant } 18453e519524SHoward Hinnant template <class _A0, class _A1> 18463e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18473e519524SHoward Hinnant void 18483e519524SHoward Hinnant construct(pointer __p, const _A0& __a0, const _A1& __a1) 18493e519524SHoward Hinnant { 18503e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 18513e519524SHoward Hinnant } 18527609c9b6SHoward Hinnant#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 18533e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void destroy(pointer __p) {__p->~_Tp();} 18543e519524SHoward Hinnant}; 18553e519524SHoward Hinnant 18568e25104bSHoward Hinnanttemplate <class _Tp> 1857e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS allocator<const _Tp> 18588e25104bSHoward Hinnant{ 18598e25104bSHoward Hinnantpublic: 18608e25104bSHoward Hinnant typedef size_t size_type; 18618e25104bSHoward Hinnant typedef ptrdiff_t difference_type; 18628e25104bSHoward Hinnant typedef const _Tp* pointer; 18638e25104bSHoward Hinnant typedef const _Tp* const_pointer; 18648e25104bSHoward Hinnant typedef const _Tp& reference; 18658e25104bSHoward Hinnant typedef const _Tp& const_reference; 186630444adcSHoward Hinnant typedef const _Tp value_type; 18678e25104bSHoward Hinnant 18688e25104bSHoward Hinnant typedef true_type propagate_on_container_move_assignment; 1869f43a42d5SMarshall Clow typedef true_type is_always_equal; 18708e25104bSHoward Hinnant 18718e25104bSHoward Hinnant template <class _Up> struct rebind {typedef allocator<_Up> other;}; 18728e25104bSHoward Hinnant 18738e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY allocator() _NOEXCEPT {} 18748e25104bSHoward Hinnant template <class _Up> _LIBCPP_INLINE_VISIBILITY allocator(const allocator<_Up>&) _NOEXCEPT {} 18758e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY const_pointer address(const_reference __x) const _NOEXCEPT 18768e25104bSHoward Hinnant {return _VSTD::addressof(__x);} 18778e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer allocate(size_type __n, allocator<void>::const_pointer = 0) 18784cec709eSMarshall Clow { 18794cec709eSMarshall Clow if (__n > max_size()) 18800fc8cec7SMarshall Clow __throw_length_error("allocator<const T>::allocate(size_t n)" 18810fc8cec7SMarshall Clow " 'n' exceeds maximum supported size"); 18824cec709eSMarshall Clow return static_cast<pointer>(_VSTD::__allocate(__n * sizeof(_Tp))); 18834cec709eSMarshall Clow } 18848e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY void deallocate(pointer __p, size_type) _NOEXCEPT 1885cd71f447SEric Fiselier {_VSTD::__libcpp_deallocate((void*)__p);} 18868e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT 18878e25104bSHoward Hinnant {return size_type(~0) / sizeof(_Tp);} 18888e25104bSHoward Hinnant#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 18898e25104bSHoward Hinnant template <class _Up, class... _Args> 18908e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18918e25104bSHoward Hinnant void 18928e25104bSHoward Hinnant construct(_Up* __p, _Args&&... __args) 18938e25104bSHoward Hinnant { 18948e25104bSHoward Hinnant ::new((void*)__p) _Up(_VSTD::forward<_Args>(__args)...); 18958e25104bSHoward Hinnant } 18968e25104bSHoward Hinnant#else // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 18978e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18988e25104bSHoward Hinnant void 18998e25104bSHoward Hinnant construct(pointer __p) 19008e25104bSHoward Hinnant { 19018e25104bSHoward Hinnant ::new((void*)__p) _Tp(); 19028e25104bSHoward Hinnant } 19038e25104bSHoward Hinnant# if defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) 1904bff1bfc6SHoward Hinnant 19058e25104bSHoward Hinnant template <class _A0> 19068e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19078e25104bSHoward Hinnant void 19088e25104bSHoward Hinnant construct(pointer __p, _A0& __a0) 19098e25104bSHoward Hinnant { 19108e25104bSHoward Hinnant ::new((void*)__p) _Tp(__a0); 19118e25104bSHoward Hinnant } 19128e25104bSHoward Hinnant template <class _A0> 19138e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19148e25104bSHoward Hinnant void 19158e25104bSHoward Hinnant construct(pointer __p, const _A0& __a0) 19168e25104bSHoward Hinnant { 19178e25104bSHoward Hinnant ::new((void*)__p) _Tp(__a0); 19188e25104bSHoward Hinnant } 19198e25104bSHoward Hinnant# endif // defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) 19208e25104bSHoward Hinnant template <class _A0, class _A1> 19218e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19228e25104bSHoward Hinnant void 19238e25104bSHoward Hinnant construct(pointer __p, _A0& __a0, _A1& __a1) 19248e25104bSHoward Hinnant { 19258e25104bSHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 19268e25104bSHoward Hinnant } 19278e25104bSHoward Hinnant template <class _A0, class _A1> 19288e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19298e25104bSHoward Hinnant void 19308e25104bSHoward Hinnant construct(pointer __p, const _A0& __a0, _A1& __a1) 19318e25104bSHoward Hinnant { 19328e25104bSHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 19338e25104bSHoward Hinnant } 19348e25104bSHoward Hinnant template <class _A0, class _A1> 19358e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19368e25104bSHoward Hinnant void 19378e25104bSHoward Hinnant construct(pointer __p, _A0& __a0, const _A1& __a1) 19388e25104bSHoward Hinnant { 19398e25104bSHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 19408e25104bSHoward Hinnant } 19418e25104bSHoward Hinnant template <class _A0, class _A1> 19428e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19438e25104bSHoward Hinnant void 19448e25104bSHoward Hinnant construct(pointer __p, const _A0& __a0, const _A1& __a1) 19458e25104bSHoward Hinnant { 19468e25104bSHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 19478e25104bSHoward Hinnant } 19488e25104bSHoward Hinnant#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 19498e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY void destroy(pointer __p) {__p->~_Tp();} 19508e25104bSHoward Hinnant}; 19518e25104bSHoward Hinnant 19523e519524SHoward Hinnanttemplate <class _Tp, class _Up> 19533e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 19543739fe79SHoward Hinnantbool operator==(const allocator<_Tp>&, const allocator<_Up>&) _NOEXCEPT {return true;} 19553e519524SHoward Hinnant 19563e519524SHoward Hinnanttemplate <class _Tp, class _Up> 19573e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 19583739fe79SHoward Hinnantbool operator!=(const allocator<_Tp>&, const allocator<_Up>&) _NOEXCEPT {return false;} 19593e519524SHoward Hinnant 19603e519524SHoward Hinnanttemplate <class _OutputIterator, class _Tp> 1961e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS raw_storage_iterator 19623e519524SHoward Hinnant : public iterator<output_iterator_tag, 19633e519524SHoward Hinnant _Tp, // purposefully not C++03 19643e519524SHoward Hinnant ptrdiff_t, // purposefully not C++03 19653e519524SHoward Hinnant _Tp*, // purposefully not C++03 19663e519524SHoward Hinnant raw_storage_iterator<_OutputIterator, _Tp>&> // purposefully not C++03 19673e519524SHoward Hinnant{ 19683e519524SHoward Hinnantprivate: 19693e519524SHoward Hinnant _OutputIterator __x_; 19703e519524SHoward Hinnantpublic: 19713e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit raw_storage_iterator(_OutputIterator __x) : __x_(__x) {} 19723e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator*() {return *this;} 19733e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator=(const _Tp& __element) 19743e519524SHoward Hinnant {::new(&*__x_) _Tp(__element); return *this;} 19752603b075SMarshall Clow#if _LIBCPP_STD_VER >= 14 19762603b075SMarshall Clow _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator=(_Tp&& __element) 19772603b075SMarshall Clow {::new(&*__x_) _Tp(_VSTD::move(__element)); return *this;} 19782603b075SMarshall Clow#endif 19793e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator++() {++__x_; return *this;} 19803e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY raw_storage_iterator operator++(int) 19813e519524SHoward Hinnant {raw_storage_iterator __t(*this); ++__x_; return __t;} 1982783b372aSMarshall Clow#if _LIBCPP_STD_VER >= 14 1983783b372aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _OutputIterator base() const { return __x_; } 1984783b372aSMarshall Clow#endif 19853e519524SHoward Hinnant}; 19863e519524SHoward Hinnant 19873e519524SHoward Hinnanttemplate <class _Tp> 19883e519524SHoward Hinnantpair<_Tp*, ptrdiff_t> 19893739fe79SHoward Hinnantget_temporary_buffer(ptrdiff_t __n) _NOEXCEPT 19903e519524SHoward Hinnant{ 19913e519524SHoward Hinnant pair<_Tp*, ptrdiff_t> __r(0, 0); 19923e519524SHoward Hinnant const ptrdiff_t __m = (~ptrdiff_t(0) ^ 19933e519524SHoward Hinnant ptrdiff_t(ptrdiff_t(1) << (sizeof(ptrdiff_t) * __CHAR_BIT__ - 1))) 19943e519524SHoward Hinnant / sizeof(_Tp); 19953e519524SHoward Hinnant if (__n > __m) 19963e519524SHoward Hinnant __n = __m; 19973e519524SHoward Hinnant while (__n > 0) 19983e519524SHoward Hinnant { 19993e519524SHoward Hinnant __r.first = static_cast<_Tp*>(::operator new(__n * sizeof(_Tp), nothrow)); 20003e519524SHoward Hinnant if (__r.first) 20013e519524SHoward Hinnant { 20023e519524SHoward Hinnant __r.second = __n; 20033e519524SHoward Hinnant break; 20043e519524SHoward Hinnant } 20053e519524SHoward Hinnant __n /= 2; 20063e519524SHoward Hinnant } 20073e519524SHoward Hinnant return __r; 20083e519524SHoward Hinnant} 20093e519524SHoward Hinnant 20103e519524SHoward Hinnanttemplate <class _Tp> 20113e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 20123739fe79SHoward Hinnantvoid return_temporary_buffer(_Tp* __p) _NOEXCEPT {::operator delete(__p);} 20133e519524SHoward Hinnant 2014e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR) 20153e519524SHoward Hinnanttemplate <class _Tp> 20163e519524SHoward Hinnantstruct auto_ptr_ref 20173e519524SHoward Hinnant{ 20183e519524SHoward Hinnant _Tp* __ptr_; 20193e519524SHoward Hinnant}; 20203e519524SHoward Hinnant 20213e519524SHoward Hinnanttemplate<class _Tp> 2022e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS auto_ptr 20233e519524SHoward Hinnant{ 20243e519524SHoward Hinnantprivate: 20253e519524SHoward Hinnant _Tp* __ptr_; 20263e519524SHoward Hinnantpublic: 20273e519524SHoward Hinnant typedef _Tp element_type; 20283e519524SHoward Hinnant 20293e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit auto_ptr(_Tp* __p = 0) throw() : __ptr_(__p) {} 20303e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr& __p) throw() : __ptr_(__p.release()) {} 20313e519524SHoward Hinnant template<class _Up> _LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr<_Up>& __p) throw() 20323e519524SHoward Hinnant : __ptr_(__p.release()) {} 20333e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr& __p) throw() 20343e519524SHoward Hinnant {reset(__p.release()); return *this;} 20353e519524SHoward Hinnant template<class _Up> _LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr<_Up>& __p) throw() 20363e519524SHoward Hinnant {reset(__p.release()); return *this;} 20373e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr_ref<_Tp> __p) throw() 20383e519524SHoward Hinnant {reset(__p.__ptr_); return *this;} 20393e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY ~auto_ptr() throw() {delete __ptr_;} 20403e519524SHoward Hinnant 20413e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Tp& operator*() const throw() 20423e519524SHoward Hinnant {return *__ptr_;} 20433e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Tp* operator->() const throw() {return __ptr_;} 20443e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Tp* get() const throw() {return __ptr_;} 20453e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Tp* release() throw() 20463e519524SHoward Hinnant { 20473e519524SHoward Hinnant _Tp* __t = __ptr_; 20483e519524SHoward Hinnant __ptr_ = 0; 20493e519524SHoward Hinnant return __t; 20503e519524SHoward Hinnant } 20513e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void reset(_Tp* __p = 0) throw() 20523e519524SHoward Hinnant { 20533e519524SHoward Hinnant if (__ptr_ != __p) 20543e519524SHoward Hinnant delete __ptr_; 20553e519524SHoward Hinnant __ptr_ = __p; 20563e519524SHoward Hinnant } 20573e519524SHoward Hinnant 20583e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr_ref<_Tp> __p) throw() : __ptr_(__p.__ptr_) {} 20593e519524SHoward Hinnant template<class _Up> _LIBCPP_INLINE_VISIBILITY operator auto_ptr_ref<_Up>() throw() 20603e519524SHoward Hinnant {auto_ptr_ref<_Up> __t; __t.__ptr_ = release(); return __t;} 20613e519524SHoward Hinnant template<class _Up> _LIBCPP_INLINE_VISIBILITY operator auto_ptr<_Up>() throw() 20623e519524SHoward Hinnant {return auto_ptr<_Up>(release());} 20633e519524SHoward Hinnant}; 20643e519524SHoward Hinnant 20653e519524SHoward Hinnanttemplate <> 2066e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS auto_ptr<void> 20673e519524SHoward Hinnant{ 20683e519524SHoward Hinnantpublic: 20693e519524SHoward Hinnant typedef void element_type; 20703e519524SHoward Hinnant}; 2071e67179bcSMarshall Clow#endif 20723e519524SHoward Hinnant 2073c88580c4SEric Fiseliertemplate <class _Tp, int _Idx, 2074c88580c4SEric Fiselier bool _CanBeEmptyBase = 2075c88580c4SEric Fiselier is_empty<_Tp>::value && !__libcpp_is_final<_Tp>::value> 2076c88580c4SEric Fiselierstruct __compressed_pair_elem { 2077c88580c4SEric Fiselier typedef _Tp _ParamT; 2078c88580c4SEric Fiselier typedef _Tp& reference; 2079c88580c4SEric Fiselier typedef const _Tp& const_reference; 20803e519524SHoward Hinnant 2081c88580c4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 20824104cf82SEric Fiselier template <bool _Dummy = true, class = typename enable_if< 20834104cf82SEric Fiselier __dependent_type<is_default_constructible<_Tp>, _Dummy>::value 20844104cf82SEric Fiselier >::type 20854104cf82SEric Fiselier > 20864104cf82SEric Fiselier _LIBCPP_CONSTEXPR __compressed_pair_elem() 20874104cf82SEric Fiselier _NOEXCEPT_(is_nothrow_default_constructible<_Tp>::value) 20884104cf82SEric Fiselier : __value_() {} 20893e519524SHoward Hinnant 2090c88580c4SEric Fiselier template <class _Up, class = typename enable_if< 2091c88580c4SEric Fiselier !is_same<__compressed_pair_elem, _Up>::value>::type> 2092c88580c4SEric Fiselier _LIBCPP_CONSTEXPR explicit 2093c88580c4SEric Fiselier __compressed_pair_elem(_Up&& __u) 2094c88580c4SEric Fiselier : __value_(_VSTD::forward<_Up>(__u)){}; 20953e519524SHoward Hinnant 2096c88580c4SEric Fiselier template <class... _Args, size_t... _Indexes> 2097c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 2098c88580c4SEric Fiselier __compressed_pair_elem(piecewise_construct_t, tuple<_Args...> __args, 2099c88580c4SEric Fiselier __tuple_indices<_Indexes...>) 2100c88580c4SEric Fiselier : __value_(_VSTD::forward<_Args>(_VSTD::get<_Indexes>(__args))...) {} 2101c88580c4SEric Fiselier#else 2102c88580c4SEric Fiselier __compressed_pair_elem() : __value_() {} 2103c88580c4SEric Fiselier __compressed_pair_elem(_ParamT __p) : __value_(std::forward<_ParamT>(__p)) {} 2104c88580c4SEric Fiselier#endif 21053e519524SHoward Hinnant 2106c88580c4SEric Fiselier reference __get() _NOEXCEPT { return __value_; } 2107c88580c4SEric Fiselier const_reference __get() const _NOEXCEPT { return __value_; } 21083e519524SHoward Hinnant 21093e519524SHoward Hinnantprivate: 2110c88580c4SEric Fiselier _Tp __value_; 21113e519524SHoward Hinnant}; 21123e519524SHoward Hinnant 2113c88580c4SEric Fiseliertemplate <class _Tp, int _Idx> 2114c88580c4SEric Fiselierstruct __compressed_pair_elem<_Tp, _Idx, true> : private _Tp { 2115c88580c4SEric Fiselier typedef _Tp _ParamT; 2116c88580c4SEric Fiselier typedef _Tp& reference; 2117c88580c4SEric Fiselier typedef const _Tp& const_reference; 2118c88580c4SEric Fiselier typedef _Tp __value_type; 21193e519524SHoward Hinnant 2120c88580c4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 21214104cf82SEric Fiselier _LIBCPP_CONSTEXPR __compressed_pair_elem() = default; 21223e519524SHoward Hinnant 2123c88580c4SEric Fiselier template <class _Up, class = typename enable_if< 2124c88580c4SEric Fiselier !is_same<__compressed_pair_elem, _Up>::value>::type> 2125c88580c4SEric Fiselier _LIBCPP_CONSTEXPR explicit 2126c88580c4SEric Fiselier __compressed_pair_elem(_Up&& __u) 2127c88580c4SEric Fiselier : __value_type(_VSTD::forward<_Up>(__u)){}; 21283e519524SHoward Hinnant 2129c88580c4SEric Fiselier template <class... _Args, size_t... _Indexes> 2130c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 2131c88580c4SEric Fiselier __compressed_pair_elem(piecewise_construct_t, tuple<_Args...> __args, 2132c88580c4SEric Fiselier __tuple_indices<_Indexes...>) 2133c88580c4SEric Fiselier : __value_type(_VSTD::forward<_Args>(_VSTD::get<_Indexes>(__args))...) {} 2134c88580c4SEric Fiselier#else 2135c88580c4SEric Fiselier __compressed_pair_elem() : __value_type() {} 2136c88580c4SEric Fiselier __compressed_pair_elem(_ParamT __p) 2137c88580c4SEric Fiselier : __value_type(std::forward<_ParamT>(__p)) {} 2138c88580c4SEric Fiselier#endif 21393e519524SHoward Hinnant 2140c88580c4SEric Fiselier reference __get() _NOEXCEPT { return *this; } 2141c88580c4SEric Fiselier const_reference __get() const _NOEXCEPT { return *this; } 21423e519524SHoward Hinnant}; 21433e519524SHoward Hinnant 2144c88580c4SEric Fiselier// Tag used to construct the second element of the compressed pair. 2145c88580c4SEric Fiselierstruct __second_tag {}; 2146c88580c4SEric Fiselier 21473e519524SHoward Hinnanttemplate <class _T1, class _T2> 2148c88580c4SEric Fiselierclass __compressed_pair : private __compressed_pair_elem<_T1, 0>, 2149c88580c4SEric Fiselier private __compressed_pair_elem<_T2, 1> { 2150c88580c4SEric Fiselier typedef __compressed_pair_elem<_T1, 0> _Base1; 2151c88580c4SEric Fiselier typedef __compressed_pair_elem<_T2, 1> _Base2; 2152c88580c4SEric Fiselier 2153c88580c4SEric Fiselier // NOTE: This static assert should never fire because __compressed_pair 2154c88580c4SEric Fiselier // is *almost never* used in a scenario where it's possible for T1 == T2. 2155c88580c4SEric Fiselier // (The exception is std::function where it is possible that the function 2156c88580c4SEric Fiselier // object and the allocator have the same type). 2157b411e9ceSEric Fiselier static_assert((!is_same<_T1, _T2>::value), 2158c88580c4SEric Fiselier "__compressed_pair cannot be instantated when T1 and T2 are the same type; " 2159c88580c4SEric Fiselier "The current implementation is NOT ABI-compatible with the previous " 2160c88580c4SEric Fiselier "implementation for this configuration"); 2161c88580c4SEric Fiselier 21623e519524SHoward Hinnantpublic: 2163c88580c4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 2164a87b5e34SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2165c88580c4SEric Fiselier __compressed_pair() = default; 2166a87b5e34SHoward Hinnant 2167c88580c4SEric Fiselier template <class _Tp, typename enable_if<!is_same<typename decay<_Tp>::type, 2168c88580c4SEric Fiselier __compressed_pair>::value, 2169c88580c4SEric Fiselier bool>::type = true> 2170c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY constexpr explicit 2171c88580c4SEric Fiselier __compressed_pair(_Tp&& __t) 2172c88580c4SEric Fiselier : _Base1(std::forward<_Tp>(__t)), _Base2() {} 2173a87b5e34SHoward Hinnant 2174c88580c4SEric Fiselier template <class _Tp> 2175c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY constexpr 2176c88580c4SEric Fiselier __compressed_pair(__second_tag, _Tp&& __t) 2177c88580c4SEric Fiselier : _Base1(), _Base2(std::forward<_Tp>(__t)) {} 2178a87b5e34SHoward Hinnant 2179c88580c4SEric Fiselier template <class _U1, class _U2> 2180c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY constexpr 2181c88580c4SEric Fiselier __compressed_pair(_U1&& __t1, _U2&& __t2) 2182c88580c4SEric Fiselier : _Base1(std::forward<_U1>(__t1)), _Base2(std::forward<_U2>(__t2)) {} 2183a87b5e34SHoward Hinnant 2184a87b5e34SHoward Hinnant template <class... _Args1, class... _Args2> 2185c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 2186a87b5e34SHoward Hinnant __compressed_pair(piecewise_construct_t __pc, tuple<_Args1...> __first_args, 2187a87b5e34SHoward Hinnant tuple<_Args2...> __second_args) 2188c88580c4SEric Fiselier : _Base1(__pc, _VSTD::move(__first_args), 2189c88580c4SEric Fiselier typename __make_tuple_indices<sizeof...(_Args1)>::type()), 2190c88580c4SEric Fiselier _Base2(__pc, _VSTD::move(__second_args), 2191c88580c4SEric Fiselier typename __make_tuple_indices<sizeof...(_Args2)>::type()) {} 2192a87b5e34SHoward Hinnant 2193c88580c4SEric Fiselier#else 2194c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY 2195c88580c4SEric Fiselier __compressed_pair() {} 2196a87b5e34SHoward Hinnant 2197c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY explicit 2198c88580c4SEric Fiselier __compressed_pair(_T1 __t1) : _Base1(_VSTD::forward<_T1>(__t1)) {} 21993e519524SHoward Hinnant 2200c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY 2201c88580c4SEric Fiselier __compressed_pair(__second_tag, _T2 __t2) 2202c88580c4SEric Fiselier : _Base1(), _Base2(_VSTD::forward<_T2>(__t2)) {} 22033e519524SHoward Hinnant 2204c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY 2205c88580c4SEric Fiselier __compressed_pair(_T1 __t1, _T2 __t2) 2206c88580c4SEric Fiselier : _Base1(_VSTD::forward<_T1>(__t1)), _Base2(_VSTD::forward<_T2>(__t2)) {} 2207c88580c4SEric Fiselier#endif 2208c88580c4SEric Fiselier 2209c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY 2210c88580c4SEric Fiselier typename _Base1::reference first() _NOEXCEPT { 2211c88580c4SEric Fiselier return static_cast<_Base1&>(*this).__get(); 2212c88580c4SEric Fiselier } 2213c88580c4SEric Fiselier 2214c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY 2215c88580c4SEric Fiselier typename _Base1::const_reference first() const _NOEXCEPT { 2216c88580c4SEric Fiselier return static_cast<_Base1 const&>(*this).__get(); 2217c88580c4SEric Fiselier } 2218c88580c4SEric Fiselier 2219c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY 2220c88580c4SEric Fiselier typename _Base2::reference second() _NOEXCEPT { 2221c88580c4SEric Fiselier return static_cast<_Base2&>(*this).__get(); 2222c88580c4SEric Fiselier } 2223c88580c4SEric Fiselier 2224c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY 2225c88580c4SEric Fiselier typename _Base2::const_reference second() const _NOEXCEPT { 2226c88580c4SEric Fiselier return static_cast<_Base2 const&>(*this).__get(); 2227c88580c4SEric Fiselier } 2228c88580c4SEric Fiselier 2229c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY 2230c88580c4SEric Fiselier void swap(__compressed_pair& __x) 22313739fe79SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && 2232afa72ed4SMarshall Clow __is_nothrow_swappable<_T2>::value) 2233c88580c4SEric Fiselier { 2234c88580c4SEric Fiselier using std::swap; 2235c88580c4SEric Fiselier swap(first(), __x.first()); 2236c88580c4SEric Fiselier swap(second(), __x.second()); 2237c88580c4SEric Fiselier } 22383e519524SHoward Hinnant}; 22393e519524SHoward Hinnant 22403e519524SHoward Hinnanttemplate <class _T1, class _T2> 22413e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 2242c88580c4SEric Fiseliervoid swap(__compressed_pair<_T1, _T2>& __x, __compressed_pair<_T1, _T2>& __y) 22433739fe79SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && 2244c88580c4SEric Fiselier __is_nothrow_swappable<_T2>::value) { 2245c88580c4SEric Fiselier __x.swap(__y); 2246c88580c4SEric Fiselier} 22473e519524SHoward Hinnant 22488e25104bSHoward Hinnant// default_delete 22498e25104bSHoward Hinnant 22503e519524SHoward Hinnanttemplate <class _Tp> 2251*030d19bdSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS default_delete { 2252*030d19bdSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 2253*030d19bdSEric Fiselier _LIBCPP_INLINE_VISIBILITY constexpr default_delete() noexcept = default; 2254c0937e8aSHoward Hinnant#else 2255*030d19bdSEric Fiselier _LIBCPP_INLINE_VISIBILITY default_delete() {} 2256c0937e8aSHoward Hinnant#endif 22573e519524SHoward Hinnant template <class _Up> 2258*030d19bdSEric Fiselier _LIBCPP_INLINE_VISIBILITY 2259*030d19bdSEric Fiselier default_delete(const default_delete<_Up>&, 2260*030d19bdSEric Fiselier typename enable_if<is_convertible<_Up*, _Tp*>::value>::type* = 2261*030d19bdSEric Fiselier 0) _NOEXCEPT {} 2262*030d19bdSEric Fiselier 2263*030d19bdSEric Fiselier _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __ptr) const _NOEXCEPT { 2264*030d19bdSEric Fiselier static_assert(sizeof(_Tp) > 0, 2265*030d19bdSEric Fiselier "default_delete can not delete incomplete type"); 2266*030d19bdSEric Fiselier static_assert(!is_void<_Tp>::value, 2267*030d19bdSEric Fiselier "default_delete can not delete incomplete type"); 22683e519524SHoward Hinnant delete __ptr; 22693e519524SHoward Hinnant } 22703e519524SHoward Hinnant}; 22713e519524SHoward Hinnant 22723e519524SHoward Hinnanttemplate <class _Tp> 2273*030d19bdSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS default_delete<_Tp[]> { 2274*030d19bdSEric Fiselierprivate: 2275e4097ad7SHoward Hinnant template <class _Up> 2276*030d19bdSEric Fiselier struct _EnableIfConvertible 2277*030d19bdSEric Fiselier : enable_if<is_convertible<_Up(*)[], _Tp(*)[]>::value> {}; 2278*030d19bdSEric Fiselier 2279*030d19bdSEric Fiselierpublic: 2280*030d19bdSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 2281*030d19bdSEric Fiselier _LIBCPP_INLINE_VISIBILITY constexpr default_delete() noexcept = default; 2282*030d19bdSEric Fiselier#else 2283*030d19bdSEric Fiselier _LIBCPP_INLINE_VISIBILITY default_delete() {} 2284*030d19bdSEric Fiselier#endif 2285*030d19bdSEric Fiselier 2286e4097ad7SHoward Hinnant template <class _Up> 2287e4097ad7SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2288*030d19bdSEric Fiselier default_delete(const default_delete<_Up[]>&, 2289*030d19bdSEric Fiselier typename _EnableIfConvertible<_Up>::type* = 0) _NOEXCEPT {} 2290*030d19bdSEric Fiselier 2291*030d19bdSEric Fiselier template <class _Up> 2292*030d19bdSEric Fiselier _LIBCPP_INLINE_VISIBILITY 2293*030d19bdSEric Fiselier typename _EnableIfConvertible<_Up>::type 2294*030d19bdSEric Fiselier operator()(_Up* __ptr) const _NOEXCEPT { 2295*030d19bdSEric Fiselier static_assert(sizeof(_Tp) > 0, 2296*030d19bdSEric Fiselier "default_delete can not delete incomplete type"); 2297*030d19bdSEric Fiselier static_assert(!is_void<_Tp>::value, 2298*030d19bdSEric Fiselier "default_delete can not delete void type"); 22993e519524SHoward Hinnant delete[] __ptr; 23003e519524SHoward Hinnant } 23013e519524SHoward Hinnant}; 23023e519524SHoward Hinnant 230347272722SEric Fiselier 2304*030d19bdSEric Fiselier 230547272722SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 230647272722SEric Fiseliertemplate <class _Deleter> 230747272722SEric Fiselierstruct __unique_ptr_deleter_sfinae { 230847272722SEric Fiselier static_assert(!is_reference<_Deleter>::value, "incorrect specialization"); 230947272722SEric Fiselier typedef const _Deleter& __lval_ref_type; 231047272722SEric Fiselier typedef _Deleter&& __good_rval_ref_type; 231147272722SEric Fiselier typedef true_type __enable_rval_overload; 231247272722SEric Fiselier}; 231347272722SEric Fiselier 231447272722SEric Fiseliertemplate <class _Deleter> 231547272722SEric Fiselierstruct __unique_ptr_deleter_sfinae<_Deleter const&> { 231647272722SEric Fiselier typedef const _Deleter& __lval_ref_type; 231747272722SEric Fiselier typedef const _Deleter&& __bad_rval_ref_type; 231847272722SEric Fiselier typedef false_type __enable_rval_overload; 231947272722SEric Fiselier}; 232047272722SEric Fiselier 232147272722SEric Fiseliertemplate <class _Deleter> 232247272722SEric Fiselierstruct __unique_ptr_deleter_sfinae<_Deleter&> { 232347272722SEric Fiselier typedef _Deleter& __lval_ref_type; 232447272722SEric Fiselier typedef _Deleter&& __bad_rval_ref_type; 232547272722SEric Fiselier typedef false_type __enable_rval_overload; 232647272722SEric Fiselier}; 232747272722SEric Fiselier#endif // !defined(_LIBCPP_CXX03_LANG) 232847272722SEric Fiselier 23293e519524SHoward Hinnanttemplate <class _Tp, class _Dp = default_delete<_Tp> > 233047272722SEric Fiselierclass _LIBCPP_TEMPLATE_VIS unique_ptr { 23313e519524SHoward Hinnantpublic: 23323e519524SHoward Hinnant typedef _Tp element_type; 23333e519524SHoward Hinnant typedef _Dp deleter_type; 23343e519524SHoward Hinnant typedef typename __pointer_type<_Tp, deleter_type>::type pointer; 233547272722SEric Fiselier 233647272722SEric Fiselier static_assert(!is_rvalue_reference<deleter_type>::value, 233747272722SEric Fiselier "the specified deleter type cannot be an rvalue reference"); 233847272722SEric Fiselier 23393e519524SHoward Hinnantprivate: 23403e519524SHoward Hinnant __compressed_pair<pointer, deleter_type> __ptr_; 23413e519524SHoward Hinnant 23423e519524SHoward Hinnant struct __nat { int __for_bool_; }; 23433e519524SHoward Hinnant 234447272722SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 234547272722SEric Fiselier typedef __unique_ptr_deleter_sfinae<_Dp> _SFINAE; 23463e519524SHoward Hinnant 234747272722SEric Fiselier template <bool _Dummy> 234847272722SEric Fiselier using _LValRefType = 234947272722SEric Fiselier typename __dependent_type<_SFINAE, _Dummy>::__lval_ref_type; 235047272722SEric Fiselier 235147272722SEric Fiselier template <bool _Dummy> 235247272722SEric Fiselier using _GoodRValRefType = 235347272722SEric Fiselier typename __dependent_type<_SFINAE, _Dummy>::__good_rval_ref_type; 235447272722SEric Fiselier 235547272722SEric Fiselier template <bool _Dummy> 235647272722SEric Fiselier using _BadRValRefType = 235747272722SEric Fiselier typename __dependent_type<_SFINAE, _Dummy>::__bad_rval_ref_type; 235847272722SEric Fiselier 235947272722SEric Fiselier template <bool _Dummy, class _Deleter = typename __dependent_type< 236047272722SEric Fiselier __identity<deleter_type>, _Dummy>::type> 236147272722SEric Fiselier using _EnableIfDeleterDefaultConstructible = 236247272722SEric Fiselier typename enable_if<is_default_constructible<_Deleter>::value && 236347272722SEric Fiselier !is_pointer<_Deleter>::value>::type; 236447272722SEric Fiselier 236547272722SEric Fiselier template <class _ArgType> 236647272722SEric Fiselier using _EnableIfDeleterConstructible = 236747272722SEric Fiselier typename enable_if<is_constructible<deleter_type, _ArgType>::value>::type; 236847272722SEric Fiselier 236947272722SEric Fiselier template <class _UPtr, class _Up> 237047272722SEric Fiselier using _EnableIfMoveConvertible = typename enable_if< 237147272722SEric Fiselier is_convertible<typename _UPtr::pointer, pointer>::value && 237247272722SEric Fiselier !is_array<_Up>::value 237347272722SEric Fiselier >::type; 237447272722SEric Fiselier 237547272722SEric Fiselier template <class _UDel> 237647272722SEric Fiselier using _EnableIfDeleterConvertible = typename enable_if< 237747272722SEric Fiselier (is_reference<_Dp>::value && is_same<_Dp, _UDel>::value) || 237847272722SEric Fiselier (!is_reference<_Dp>::value && is_convertible<_UDel, _Dp>::value) 237947272722SEric Fiselier >::type; 238047272722SEric Fiselier 238147272722SEric Fiselier template <class _UDel> 238247272722SEric Fiselier using _EnableIfDeleterAssignable = typename enable_if< 238347272722SEric Fiselier is_assignable<_Dp&, _UDel&&>::value 238447272722SEric Fiselier >::type; 238547272722SEric Fiselier 238647272722SEric Fiselierpublic: 238747272722SEric Fiselier template <bool _Dummy = true, 238847272722SEric Fiselier class = _EnableIfDeleterDefaultConstructible<_Dummy>> 238947272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 239047272722SEric Fiselier constexpr unique_ptr() noexcept : __ptr_(pointer()) {} 239147272722SEric Fiselier 239247272722SEric Fiselier template <bool _Dummy = true, 239347272722SEric Fiselier class = _EnableIfDeleterDefaultConstructible<_Dummy>> 239447272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 239547272722SEric Fiselier constexpr unique_ptr(nullptr_t) noexcept : __ptr_(pointer()) {} 239647272722SEric Fiselier 239747272722SEric Fiselier template <bool _Dummy = true, 239847272722SEric Fiselier class = _EnableIfDeleterDefaultConstructible<_Dummy>> 239947272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 240047272722SEric Fiselier explicit unique_ptr(pointer __p) noexcept : __ptr_(__p) {} 240147272722SEric Fiselier 240247272722SEric Fiselier template <bool _Dummy = true, 240347272722SEric Fiselier class = _EnableIfDeleterConstructible<_LValRefType<_Dummy>>> 240447272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 240547272722SEric Fiselier unique_ptr(pointer __p, _LValRefType<_Dummy> __d) noexcept 24063e519524SHoward Hinnant : __ptr_(__p, __d) {} 24073e519524SHoward Hinnant 240847272722SEric Fiselier template <bool _Dummy = true, 240947272722SEric Fiselier class = _EnableIfDeleterConstructible<_GoodRValRefType<_Dummy>>> 24103e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 241147272722SEric Fiselier unique_ptr(pointer __p, _GoodRValRefType<_Dummy> __d) noexcept 241247272722SEric Fiselier : __ptr_(__p, _VSTD::move(__d)) { 241347272722SEric Fiselier static_assert(!is_reference<deleter_type>::value, 241447272722SEric Fiselier "rvalue deleter bound to reference"); 241547272722SEric Fiselier } 241647272722SEric Fiselier 241747272722SEric Fiselier template <bool _Dummy = true, 241847272722SEric Fiselier class = _EnableIfDeleterConstructible<_BadRValRefType<_Dummy>>> 241947272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 242047272722SEric Fiselier unique_ptr(pointer __p, _BadRValRefType<_Dummy> __d) = delete; 242147272722SEric Fiselier 242247272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 242347272722SEric Fiselier unique_ptr(unique_ptr&& __u) noexcept 242447272722SEric Fiselier : __ptr_(__u.release(), _VSTD::forward<deleter_type>(__u.get_deleter())) { 242547272722SEric Fiselier } 242647272722SEric Fiselier 242747272722SEric Fiselier template <class _Up, class _Ep, 242847272722SEric Fiselier class = _EnableIfMoveConvertible<unique_ptr<_Up, _Ep>, _Up>, 242947272722SEric Fiselier class = _EnableIfDeleterConvertible<_Ep> 243047272722SEric Fiselier > 243147272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 243247272722SEric Fiselier unique_ptr(unique_ptr<_Up, _Ep>&& __u) _NOEXCEPT 2433ce48a113SHoward Hinnant : __ptr_(__u.release(), _VSTD::forward<_Ep>(__u.get_deleter())) {} 24343e519524SHoward Hinnant 2435e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR) 24363e519524SHoward Hinnant template <class _Up> 243747272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 243847272722SEric Fiselier unique_ptr(auto_ptr<_Up>&& __p, 243947272722SEric Fiselier typename enable_if<is_convertible<_Up*, _Tp*>::value && 24403e519524SHoward Hinnant is_same<_Dp, default_delete<_Tp>>::value, 244147272722SEric Fiselier __nat>::type = __nat()) _NOEXCEPT 244247272722SEric Fiselier : __ptr_(__p.release()) {} 2443e67179bcSMarshall Clow#endif 24443e519524SHoward Hinnant 244547272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 244647272722SEric Fiselier unique_ptr& operator=(unique_ptr&& __u) _NOEXCEPT { 24473e519524SHoward Hinnant reset(__u.release()); 2448ce48a113SHoward Hinnant __ptr_.second() = _VSTD::forward<deleter_type>(__u.get_deleter()); 24493e519524SHoward Hinnant return *this; 24503e519524SHoward Hinnant } 24513e519524SHoward Hinnant 245247272722SEric Fiselier template <class _Up, class _Ep, 245347272722SEric Fiselier class = _EnableIfMoveConvertible<unique_ptr<_Up, _Ep>, _Up>, 245447272722SEric Fiselier class = _EnableIfDeleterAssignable<_Ep> 245547272722SEric Fiselier > 24563e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 245747272722SEric Fiselier unique_ptr& operator=(unique_ptr<_Up, _Ep>&& __u) _NOEXCEPT { 24583e519524SHoward Hinnant reset(__u.release()); 2459ce48a113SHoward Hinnant __ptr_.second() = _VSTD::forward<_Ep>(__u.get_deleter()); 24603e519524SHoward Hinnant return *this; 24613e519524SHoward Hinnant } 24623e519524SHoward Hinnant 246347272722SEric Fiselier#else // _LIBCPP_CXX03_LANG 246447272722SEric Fiselierprivate: 246547272722SEric Fiselier unique_ptr(unique_ptr&); 246647272722SEric Fiselier template <class _Up, class _Ep> unique_ptr(unique_ptr<_Up, _Ep>&); 246747272722SEric Fiselier 246847272722SEric Fiselier unique_ptr& operator=(unique_ptr&); 246947272722SEric Fiselier template <class _Up, class _Ep> unique_ptr& operator=(unique_ptr<_Up, _Ep>&); 247047272722SEric Fiselier 247147272722SEric Fiselierpublic: 247247272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 247347272722SEric Fiselier unique_ptr() : __ptr_(pointer()) 24743e519524SHoward Hinnant { 247547272722SEric Fiselier static_assert(!is_pointer<deleter_type>::value, 247647272722SEric Fiselier "unique_ptr constructed with null function pointer deleter"); 247747272722SEric Fiselier static_assert(is_default_constructible<deleter_type>::value, 247847272722SEric Fiselier "unique_ptr::deleter_type is not default constructible"); 247947272722SEric Fiselier } 248047272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 248147272722SEric Fiselier unique_ptr(nullptr_t) : __ptr_(pointer()) 248247272722SEric Fiselier { 248347272722SEric Fiselier static_assert(!is_pointer<deleter_type>::value, 248447272722SEric Fiselier "unique_ptr constructed with null function pointer deleter"); 248547272722SEric Fiselier } 248647272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 248747272722SEric Fiselier explicit unique_ptr(pointer __p) 248847272722SEric Fiselier : __ptr_(_VSTD::move(__p)) { 248947272722SEric Fiselier static_assert(!is_pointer<deleter_type>::value, 249047272722SEric Fiselier "unique_ptr constructed with null function pointer deleter"); 249147272722SEric Fiselier } 249247272722SEric Fiselier 249347272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 249447272722SEric Fiselier operator __rv<unique_ptr>() { 24953e519524SHoward Hinnant return __rv<unique_ptr>(*this); 24963e519524SHoward Hinnant } 24973e519524SHoward Hinnant 249847272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 249947272722SEric Fiselier unique_ptr(__rv<unique_ptr> __u) 250047272722SEric Fiselier : __ptr_(__u->release(), 250147272722SEric Fiselier _VSTD::forward<deleter_type>(__u->get_deleter())) {} 25023e519524SHoward Hinnant 25033e519524SHoward Hinnant template <class _Up, class _Ep> 2504d48306e7SEric Fiselier _LIBCPP_INLINE_VISIBILITY 2505d48306e7SEric Fiselier typename enable_if< 2506d48306e7SEric Fiselier !is_array<_Up>::value && 250747272722SEric Fiselier is_convertible<typename unique_ptr<_Up, _Ep>::pointer, 250847272722SEric Fiselier pointer>::value && 2509d48306e7SEric Fiselier is_assignable<deleter_type&, _Ep&>::value, 251047272722SEric Fiselier unique_ptr&>::type 251147272722SEric Fiselier operator=(unique_ptr<_Up, _Ep> __u) { 25123e519524SHoward Hinnant reset(__u.release()); 2513d48306e7SEric Fiselier __ptr_.second() = _VSTD::forward<_Ep>(__u.get_deleter()); 25143e519524SHoward Hinnant return *this; 25153e519524SHoward Hinnant } 25163e519524SHoward Hinnant 251747272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 251847272722SEric Fiselier unique_ptr(pointer __p, deleter_type __d) 2519ce48a113SHoward Hinnant : __ptr_(_VSTD::move(__p), _VSTD::move(__d)) {} 252047272722SEric Fiselier#endif // _LIBCPP_CXX03_LANG 25213e519524SHoward Hinnant 2522e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR) 25233e519524SHoward Hinnant template <class _Up> 25243e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 252547272722SEric Fiselier typename enable_if<is_convertible<_Up*, _Tp*>::value && 25263e519524SHoward Hinnant is_same<_Dp, default_delete<_Tp> >::value, 252747272722SEric Fiselier unique_ptr&>::type 252847272722SEric Fiselier operator=(auto_ptr<_Up> __p) { 252947272722SEric Fiselier reset(__p.release()); 253047272722SEric Fiselier return *this; 253147272722SEric Fiselier } 2532e67179bcSMarshall Clow#endif 25333e519524SHoward Hinnant 253447272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 253547272722SEric Fiselier ~unique_ptr() { reset(); } 253647272722SEric Fiselier 253747272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 253847272722SEric Fiselier unique_ptr& operator=(nullptr_t) _NOEXCEPT { 25393e519524SHoward Hinnant reset(); 25403e519524SHoward Hinnant return *this; 25413e519524SHoward Hinnant } 25423e519524SHoward Hinnant 2543f2f2d8b9SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 254447272722SEric Fiselier typename add_lvalue_reference<_Tp>::type 254547272722SEric Fiselier operator*() const { 254647272722SEric Fiselier return *__ptr_.first(); 254747272722SEric Fiselier } 254847272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 254947272722SEric Fiselier pointer operator->() const _NOEXCEPT { 255047272722SEric Fiselier return __ptr_.first(); 255147272722SEric Fiselier } 255247272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 255347272722SEric Fiselier pointer get() const _NOEXCEPT { 255447272722SEric Fiselier return __ptr_.first(); 255547272722SEric Fiselier } 255647272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 255747272722SEric Fiselier deleter_type& get_deleter() _NOEXCEPT { 255847272722SEric Fiselier return __ptr_.second(); 255947272722SEric Fiselier } 256047272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 256147272722SEric Fiselier const deleter_type& get_deleter() const _NOEXCEPT { 256247272722SEric Fiselier return __ptr_.second(); 256347272722SEric Fiselier } 256447272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 256547272722SEric Fiselier _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT { 256647272722SEric Fiselier return __ptr_.first() != nullptr; 256747272722SEric Fiselier } 25683e519524SHoward Hinnant 256947272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 257047272722SEric Fiselier pointer release() _NOEXCEPT { 25713e519524SHoward Hinnant pointer __t = __ptr_.first(); 25723e519524SHoward Hinnant __ptr_.first() = pointer(); 25733e519524SHoward Hinnant return __t; 25743e519524SHoward Hinnant } 25753e519524SHoward Hinnant 257647272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 257747272722SEric Fiselier void reset(pointer __p = pointer()) _NOEXCEPT { 25783e519524SHoward Hinnant pointer __tmp = __ptr_.first(); 25793e519524SHoward Hinnant __ptr_.first() = __p; 25803e519524SHoward Hinnant if (__tmp) 25813e519524SHoward Hinnant __ptr_.second()(__tmp); 25823e519524SHoward Hinnant } 25833e519524SHoward Hinnant 258447272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 258547272722SEric Fiselier void swap(unique_ptr& __u) _NOEXCEPT { 258647272722SEric Fiselier __ptr_.swap(__u.__ptr_); 258747272722SEric Fiselier } 25883e519524SHoward Hinnant}; 25893e519524SHoward Hinnant 259047272722SEric Fiseliertemplate <class _From, class _ToUnique> 259147272722SEric Fiselierstruct __check_array_pointer_conversion : is_same<_From, typename _ToUnique::pointer> {}; 259247272722SEric Fiselier 259347272722SEric Fiseliertemplate <class _FromElem, class _ToUnique> 259447272722SEric Fiselierstruct __check_array_pointer_conversion<_FromElem*, _ToUnique> 259547272722SEric Fiselier : integral_constant<bool, 259647272722SEric Fiselier is_same<_FromElem*, typename _ToUnique::pointer>::value || 259747272722SEric Fiselier (is_same<typename _ToUnique::pointer, typename _ToUnique::element_type*>::value && 259847272722SEric Fiselier is_convertible<_FromElem(*)[], typename _ToUnique::element_type(*)[]>::value) 259947272722SEric Fiselier > 260047272722SEric Fiselier{}; 260147272722SEric Fiselier 26023e519524SHoward Hinnanttemplate <class _Tp, class _Dp> 260347272722SEric Fiselierclass _LIBCPP_TEMPLATE_VIS unique_ptr<_Tp[], _Dp> { 26043e519524SHoward Hinnantpublic: 26053e519524SHoward Hinnant typedef _Tp element_type; 26063e519524SHoward Hinnant typedef _Dp deleter_type; 26073e519524SHoward Hinnant typedef typename __pointer_type<_Tp, deleter_type>::type pointer; 260847272722SEric Fiselier 26093e519524SHoward Hinnantprivate: 26103e519524SHoward Hinnant __compressed_pair<pointer, deleter_type> __ptr_; 26113e519524SHoward Hinnant 26123e519524SHoward Hinnant struct __nat { int __for_bool_; }; 26133e519524SHoward Hinnant 261447272722SEric Fiselier typedef deleter_type& _Dp_reference; 261534e38caaSEric Fiselier typedef typename remove_reference<typename add_const<deleter_type>::type>::type& 261634e38caaSEric Fiselier _Dp_const_reference; 261747272722SEric Fiselier 261847272722SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 261947272722SEric Fiselier typedef __unique_ptr_deleter_sfinae<_Dp> _SFINAE; 262047272722SEric Fiselier 262147272722SEric Fiselier template <bool _Dummy> 262247272722SEric Fiselier using _LValRefType = 262347272722SEric Fiselier typename __dependent_type<_SFINAE, _Dummy>::__lval_ref_type; 262447272722SEric Fiselier 262547272722SEric Fiselier template <bool _Dummy> 262647272722SEric Fiselier using _GoodRValRefType = 262747272722SEric Fiselier typename __dependent_type<_SFINAE, _Dummy>::__good_rval_ref_type; 262847272722SEric Fiselier 262947272722SEric Fiselier template <bool _Dummy> 263047272722SEric Fiselier using _BadRValRefType = 263147272722SEric Fiselier typename __dependent_type<_SFINAE, _Dummy>::__bad_rval_ref_type; 263247272722SEric Fiselier 263347272722SEric Fiselier template <bool _Dummy, class _Deleter = typename __dependent_type< 263447272722SEric Fiselier __identity<deleter_type>, _Dummy>::type> 263547272722SEric Fiselier using _EnableIfDeleterDefaultConstructible = 263647272722SEric Fiselier typename enable_if<is_default_constructible<_Deleter>::value && 263747272722SEric Fiselier !is_pointer<_Deleter>::value>::type; 263847272722SEric Fiselier 263947272722SEric Fiselier template <class _ArgType> 264047272722SEric Fiselier using _EnableIfDeleterConstructible = 264147272722SEric Fiselier typename enable_if<is_constructible<deleter_type, _ArgType>::value>::type; 26423e519524SHoward Hinnant 264322747e62SLogan Chien template <class _Pp> 264447272722SEric Fiselier using _EnableIfPointerConvertible = typename enable_if< 264547272722SEric Fiselier __check_array_pointer_conversion<_Pp, unique_ptr>::value 264647272722SEric Fiselier >::type; 264747272722SEric Fiselier 264847272722SEric Fiselier template <class _UPtr, class _Up, 264947272722SEric Fiselier class _ElemT = typename _UPtr::element_type> 265047272722SEric Fiselier using _EnableIfMoveConvertible = typename enable_if< 265147272722SEric Fiselier is_array<_Up>::value && 265247272722SEric Fiselier is_same<pointer, element_type*>::value && 265347272722SEric Fiselier is_same<typename _UPtr::pointer, _ElemT*>::value && 265447272722SEric Fiselier is_convertible<_ElemT(*)[], element_type(*)[]>::value 265547272722SEric Fiselier >::type; 265647272722SEric Fiselier 265747272722SEric Fiselier template <class _UDel> 265847272722SEric Fiselier using _EnableIfDeleterConvertible = typename enable_if< 265947272722SEric Fiselier (is_reference<_Dp>::value && is_same<_Dp, _UDel>::value) || 266047272722SEric Fiselier (!is_reference<_Dp>::value && is_convertible<_UDel, _Dp>::value) 266147272722SEric Fiselier >::type; 266247272722SEric Fiselier 266347272722SEric Fiselier template <class _UDel> 266447272722SEric Fiselier using _EnableIfDeleterAssignable = typename enable_if< 266547272722SEric Fiselier is_assignable<_Dp&, _UDel&&>::value 266647272722SEric Fiselier >::type; 266747272722SEric Fiselier 266847272722SEric Fiselierpublic: 266947272722SEric Fiselier template <bool _Dummy = true, 267047272722SEric Fiselier class = _EnableIfDeleterDefaultConstructible<_Dummy>> 267147272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 267247272722SEric Fiselier constexpr unique_ptr() noexcept : __ptr_(pointer()) {} 267347272722SEric Fiselier 267447272722SEric Fiselier template <bool _Dummy = true, 267547272722SEric Fiselier class = _EnableIfDeleterDefaultConstructible<_Dummy>> 267647272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 267747272722SEric Fiselier constexpr unique_ptr(nullptr_t) noexcept : __ptr_(pointer()) {} 267847272722SEric Fiselier 267947272722SEric Fiselier template <class _Pp, bool _Dummy = true, 268047272722SEric Fiselier class = _EnableIfDeleterDefaultConstructible<_Dummy>, 268147272722SEric Fiselier class = _EnableIfPointerConvertible<_Pp>> 268247272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 268347272722SEric Fiselier explicit unique_ptr(_Pp __p) noexcept 268447272722SEric Fiselier : __ptr_(__p) {} 268547272722SEric Fiselier 268647272722SEric Fiselier template <class _Pp, bool _Dummy = true, 268747272722SEric Fiselier class = _EnableIfDeleterConstructible<_LValRefType<_Dummy>>, 268847272722SEric Fiselier class = _EnableIfPointerConvertible<_Pp>> 268947272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 269047272722SEric Fiselier unique_ptr(_Pp __p, _LValRefType<_Dummy> __d) noexcept 26913e519524SHoward Hinnant : __ptr_(__p, __d) {} 26923e519524SHoward Hinnant 269347272722SEric Fiselier template <bool _Dummy = true, 269447272722SEric Fiselier class = _EnableIfDeleterConstructible<_LValRefType<_Dummy>>> 269547272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 269647272722SEric Fiselier unique_ptr(nullptr_t, _LValRefType<_Dummy> __d) noexcept 269747272722SEric Fiselier : __ptr_(nullptr, __d) {} 26983e519524SHoward Hinnant 269947272722SEric Fiselier template <class _Pp, bool _Dummy = true, 270047272722SEric Fiselier class = _EnableIfDeleterConstructible<_GoodRValRefType<_Dummy>>, 270147272722SEric Fiselier class = _EnableIfPointerConvertible<_Pp>> 270247272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 270347272722SEric Fiselier unique_ptr(_Pp __p, _GoodRValRefType<_Dummy> __d) noexcept 270447272722SEric Fiselier : __ptr_(__p, _VSTD::move(__d)) { 270547272722SEric Fiselier static_assert(!is_reference<deleter_type>::value, 270647272722SEric Fiselier "rvalue deleter bound to reference"); 27073e519524SHoward Hinnant } 27083e519524SHoward Hinnant 270947272722SEric Fiselier template <bool _Dummy = true, 271047272722SEric Fiselier class = _EnableIfDeleterConstructible<_GoodRValRefType<_Dummy>>> 271147272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 271247272722SEric Fiselier unique_ptr(nullptr_t, _GoodRValRefType<_Dummy> __d) noexcept 271347272722SEric Fiselier : __ptr_(nullptr, _VSTD::move(__d)) { 271447272722SEric Fiselier static_assert(!is_reference<deleter_type>::value, 271547272722SEric Fiselier "rvalue deleter bound to reference"); 27163e519524SHoward Hinnant } 27173e519524SHoward Hinnant 271847272722SEric Fiselier template <class _Pp, bool _Dummy = true, 271947272722SEric Fiselier class = _EnableIfDeleterConstructible<_BadRValRefType<_Dummy>>, 272047272722SEric Fiselier class = _EnableIfPointerConvertible<_Pp>> 272147272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 272247272722SEric Fiselier unique_ptr(_Pp __p, _BadRValRefType<_Dummy> __d) = delete; 27233e519524SHoward Hinnant 272447272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 272547272722SEric Fiselier unique_ptr(unique_ptr&& __u) noexcept 272647272722SEric Fiselier : __ptr_(__u.release(), _VSTD::forward<deleter_type>(__u.get_deleter())) { 272747272722SEric Fiselier } 272847272722SEric Fiselier 272947272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 273047272722SEric Fiselier unique_ptr& operator=(unique_ptr&& __u) noexcept { 27313e519524SHoward Hinnant reset(__u.release()); 2732ce48a113SHoward Hinnant __ptr_.second() = _VSTD::forward<deleter_type>(__u.get_deleter()); 27333e519524SHoward Hinnant return *this; 27343e519524SHoward Hinnant } 2735e4097ad7SHoward Hinnant 273647272722SEric Fiselier template <class _Up, class _Ep, 273747272722SEric Fiselier class = _EnableIfMoveConvertible<unique_ptr<_Up, _Ep>, _Up>, 273847272722SEric Fiselier class = _EnableIfDeleterConvertible<_Ep> 273947272722SEric Fiselier > 2740e4097ad7SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 274147272722SEric Fiselier unique_ptr(unique_ptr<_Up, _Ep>&& __u) noexcept 274247272722SEric Fiselier : __ptr_(__u.release(), _VSTD::forward<deleter_type>(__u.get_deleter())) { 274347272722SEric Fiselier } 2744e4097ad7SHoward Hinnant 274547272722SEric Fiselier template <class _Up, class _Ep, 274647272722SEric Fiselier class = _EnableIfMoveConvertible<unique_ptr<_Up, _Ep>, _Up>, 274747272722SEric Fiselier class = _EnableIfDeleterAssignable<_Ep> 274847272722SEric Fiselier > 2749e4097ad7SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2750e4097ad7SHoward Hinnant unique_ptr& 275147272722SEric Fiselier operator=(unique_ptr<_Up, _Ep>&& __u) noexcept { 2752e4097ad7SHoward Hinnant reset(__u.release()); 2753e4097ad7SHoward Hinnant __ptr_.second() = _VSTD::forward<_Ep>(__u.get_deleter()); 2754e4097ad7SHoward Hinnant return *this; 2755e4097ad7SHoward Hinnant } 27563e519524SHoward Hinnant 275747272722SEric Fiselier#else // _LIBCPP_CXX03_LANG 275847272722SEric Fiselierprivate: 275947272722SEric Fiselier template <class _Up> explicit unique_ptr(_Up); 276047272722SEric Fiselier 276147272722SEric Fiselier unique_ptr(unique_ptr&); 276247272722SEric Fiselier template <class _Up> unique_ptr(unique_ptr<_Up>&); 276347272722SEric Fiselier 276447272722SEric Fiselier unique_ptr& operator=(unique_ptr&); 276547272722SEric Fiselier template <class _Up> unique_ptr& operator=(unique_ptr<_Up>&); 276647272722SEric Fiselier 276747272722SEric Fiselier template <class _Up> 276847272722SEric Fiselier unique_ptr(_Up __u, 276947272722SEric Fiselier typename conditional< 277047272722SEric Fiselier is_reference<deleter_type>::value, deleter_type, 277147272722SEric Fiselier typename add_lvalue_reference<const deleter_type>::type>::type, 277247272722SEric Fiselier typename enable_if<is_convertible<_Up, pointer>::value, 277347272722SEric Fiselier __nat>::type = __nat()); 277447272722SEric Fiselierpublic: 277547272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 277647272722SEric Fiselier unique_ptr() : __ptr_(pointer()) { 277747272722SEric Fiselier static_assert(!is_pointer<deleter_type>::value, 277847272722SEric Fiselier "unique_ptr constructed with null function pointer deleter"); 277947272722SEric Fiselier } 278047272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 278147272722SEric Fiselier unique_ptr(nullptr_t) : __ptr_(pointer()) { 27823e519524SHoward Hinnant static_assert(!is_pointer<deleter_type>::value, 27833e519524SHoward Hinnant "unique_ptr constructed with null function pointer deleter"); 27843e519524SHoward Hinnant } 27853e519524SHoward Hinnant 278647272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 278747272722SEric Fiselier explicit unique_ptr(pointer __p) : __ptr_(__p) { 278847272722SEric Fiselier static_assert(!is_pointer<deleter_type>::value, 278947272722SEric Fiselier "unique_ptr constructed with null function pointer deleter"); 279047272722SEric Fiselier } 279147272722SEric Fiselier 279247272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 279347272722SEric Fiselier unique_ptr(pointer __p, deleter_type __d) 2794ce48a113SHoward Hinnant : __ptr_(__p, _VSTD::forward<deleter_type>(__d)) {} 27953e519524SHoward Hinnant 279647272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 279747272722SEric Fiselier unique_ptr(nullptr_t, deleter_type __d) 2798ce48a113SHoward Hinnant : __ptr_(pointer(), _VSTD::forward<deleter_type>(__d)) {} 27993e519524SHoward Hinnant 280047272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 280147272722SEric Fiselier operator __rv<unique_ptr>() { 28023e519524SHoward Hinnant return __rv<unique_ptr>(*this); 28033e519524SHoward Hinnant } 28043e519524SHoward Hinnant 280547272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 280647272722SEric Fiselier unique_ptr(__rv<unique_ptr> __u) 280747272722SEric Fiselier : __ptr_(__u->release(), 280847272722SEric Fiselier _VSTD::forward<deleter_type>(__u->get_deleter())) {} 28093e519524SHoward Hinnant 281047272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 281147272722SEric Fiselier unique_ptr& operator=(__rv<unique_ptr> __u) { 28123e519524SHoward Hinnant reset(__u->release()); 2813ce48a113SHoward Hinnant __ptr_.second() = _VSTD::forward<deleter_type>(__u->get_deleter()); 28143e519524SHoward Hinnant return *this; 28153e519524SHoward Hinnant } 28163e519524SHoward Hinnant 281747272722SEric Fiselier#endif // _LIBCPP_CXX03_LANG 28183e519524SHoward Hinnant 281947272722SEric Fiselierpublic: 282047272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 282147272722SEric Fiselier ~unique_ptr() { reset(); } 282247272722SEric Fiselier 282347272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 282447272722SEric Fiselier unique_ptr& operator=(nullptr_t) _NOEXCEPT { 28253e519524SHoward Hinnant reset(); 28263e519524SHoward Hinnant return *this; 28273e519524SHoward Hinnant } 28283e519524SHoward Hinnant 2829f2f2d8b9SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 283047272722SEric Fiselier typename add_lvalue_reference<_Tp>::type 283147272722SEric Fiselier operator[](size_t __i) const { 283247272722SEric Fiselier return __ptr_.first()[__i]; 283347272722SEric Fiselier } 283447272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 283547272722SEric Fiselier pointer get() const _NOEXCEPT { 283647272722SEric Fiselier return __ptr_.first(); 283747272722SEric Fiselier } 28383e519524SHoward Hinnant 283947272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 284047272722SEric Fiselier deleter_type& get_deleter() _NOEXCEPT { 284147272722SEric Fiselier return __ptr_.second(); 284247272722SEric Fiselier } 284347272722SEric Fiselier 284447272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 284547272722SEric Fiselier const deleter_type& get_deleter() const _NOEXCEPT { 284647272722SEric Fiselier return __ptr_.second(); 284747272722SEric Fiselier } 284847272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 284947272722SEric Fiselier _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT { 285047272722SEric Fiselier return __ptr_.first() != nullptr; 285147272722SEric Fiselier } 285247272722SEric Fiselier 285347272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 285447272722SEric Fiselier pointer release() _NOEXCEPT { 28553e519524SHoward Hinnant pointer __t = __ptr_.first(); 28563e519524SHoward Hinnant __ptr_.first() = pointer(); 28573e519524SHoward Hinnant return __t; 28583e519524SHoward Hinnant } 28593e519524SHoward Hinnant 286022747e62SLogan Chien template <class _Pp> 286122747e62SLogan Chien _LIBCPP_INLINE_VISIBILITY 286247272722SEric Fiselier typename enable_if< 286347272722SEric Fiselier __check_array_pointer_conversion<_Pp, unique_ptr>::value 286447272722SEric Fiselier >::type 286547272722SEric Fiselier reset(_Pp __p) _NOEXCEPT { 28663e519524SHoward Hinnant pointer __tmp = __ptr_.first(); 28673e519524SHoward Hinnant __ptr_.first() = __p; 28683e519524SHoward Hinnant if (__tmp) 28693e519524SHoward Hinnant __ptr_.second()(__tmp); 28703e519524SHoward Hinnant } 287147272722SEric Fiselier 287247272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 287347272722SEric Fiselier void reset(nullptr_t = nullptr) _NOEXCEPT { 28743e519524SHoward Hinnant pointer __tmp = __ptr_.first(); 28753e519524SHoward Hinnant __ptr_.first() = nullptr; 28763e519524SHoward Hinnant if (__tmp) 28773e519524SHoward Hinnant __ptr_.second()(__tmp); 28783e519524SHoward Hinnant } 28793e519524SHoward Hinnant 288047272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 288147272722SEric Fiselier void swap(unique_ptr& __u) _NOEXCEPT { 288247272722SEric Fiselier __ptr_.swap(__u.__ptr_); 288347272722SEric Fiselier } 28843e519524SHoward Hinnant 28853e519524SHoward Hinnant}; 28863e519524SHoward Hinnant 28873e519524SHoward Hinnanttemplate <class _Tp, class _Dp> 28883e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 2889f07dd8d0SEric Fiseliertypename enable_if< 2890f07dd8d0SEric Fiselier __is_swappable<_Dp>::value, 28913e519524SHoward Hinnant void 2892f07dd8d0SEric Fiselier>::type 28933739fe79SHoward Hinnantswap(unique_ptr<_Tp, _Dp>& __x, unique_ptr<_Tp, _Dp>& __y) _NOEXCEPT {__x.swap(__y);} 28943e519524SHoward Hinnant 28953e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 28963e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 28973e519524SHoward Hinnantbool 28983e519524SHoward Hinnantoperator==(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return __x.get() == __y.get();} 28993e519524SHoward Hinnant 29003e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 29013e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 29023e519524SHoward Hinnantbool 29033e519524SHoward Hinnantoperator!=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__x == __y);} 29043e519524SHoward Hinnant 29053e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 29063e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 29073e519524SHoward Hinnantbool 290867f39647SHoward Hinnantoperator< (const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) 290967f39647SHoward Hinnant{ 291067f39647SHoward Hinnant typedef typename unique_ptr<_T1, _D1>::pointer _P1; 291167f39647SHoward Hinnant typedef typename unique_ptr<_T2, _D2>::pointer _P2; 29126fe361c1SEric Fiselier typedef typename common_type<_P1, _P2>::type _Vp; 29136fe361c1SEric Fiselier return less<_Vp>()(__x.get(), __y.get()); 291467f39647SHoward Hinnant} 29153e519524SHoward Hinnant 29163e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 29173e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 29183e519524SHoward Hinnantbool 29193e519524SHoward Hinnantoperator> (const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return __y < __x;} 29203e519524SHoward Hinnant 29213e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 29223e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 29233e519524SHoward Hinnantbool 29243e519524SHoward Hinnantoperator<=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__y < __x);} 29253e519524SHoward Hinnant 29263e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 29273e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 29283e519524SHoward Hinnantbool 29293e519524SHoward Hinnantoperator>=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__x < __y);} 29303e519524SHoward Hinnant 293167f39647SHoward Hinnanttemplate <class _T1, class _D1> 293267f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 293367f39647SHoward Hinnantbool 2934c0937e8aSHoward Hinnantoperator==(const unique_ptr<_T1, _D1>& __x, nullptr_t) _NOEXCEPT 293567f39647SHoward Hinnant{ 293667f39647SHoward Hinnant return !__x; 293767f39647SHoward Hinnant} 293867f39647SHoward Hinnant 293967f39647SHoward Hinnanttemplate <class _T1, class _D1> 294067f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 294167f39647SHoward Hinnantbool 2942c0937e8aSHoward Hinnantoperator==(nullptr_t, const unique_ptr<_T1, _D1>& __x) _NOEXCEPT 294367f39647SHoward Hinnant{ 294467f39647SHoward Hinnant return !__x; 294567f39647SHoward Hinnant} 294667f39647SHoward Hinnant 294767f39647SHoward Hinnanttemplate <class _T1, class _D1> 294867f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 294967f39647SHoward Hinnantbool 2950c0937e8aSHoward Hinnantoperator!=(const unique_ptr<_T1, _D1>& __x, nullptr_t) _NOEXCEPT 295167f39647SHoward Hinnant{ 295267f39647SHoward Hinnant return static_cast<bool>(__x); 295367f39647SHoward Hinnant} 295467f39647SHoward Hinnant 295567f39647SHoward Hinnanttemplate <class _T1, class _D1> 295667f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 295767f39647SHoward Hinnantbool 2958c0937e8aSHoward Hinnantoperator!=(nullptr_t, const unique_ptr<_T1, _D1>& __x) _NOEXCEPT 295967f39647SHoward Hinnant{ 296067f39647SHoward Hinnant return static_cast<bool>(__x); 296167f39647SHoward Hinnant} 296267f39647SHoward Hinnant 296367f39647SHoward Hinnanttemplate <class _T1, class _D1> 296467f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 296567f39647SHoward Hinnantbool 296667f39647SHoward Hinnantoperator<(const unique_ptr<_T1, _D1>& __x, nullptr_t) 296767f39647SHoward Hinnant{ 296867f39647SHoward Hinnant typedef typename unique_ptr<_T1, _D1>::pointer _P1; 296967f39647SHoward Hinnant return less<_P1>()(__x.get(), nullptr); 297067f39647SHoward Hinnant} 297167f39647SHoward Hinnant 297267f39647SHoward Hinnanttemplate <class _T1, class _D1> 297367f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 297467f39647SHoward Hinnantbool 297567f39647SHoward Hinnantoperator<(nullptr_t, const unique_ptr<_T1, _D1>& __x) 297667f39647SHoward Hinnant{ 297767f39647SHoward Hinnant typedef typename unique_ptr<_T1, _D1>::pointer _P1; 297867f39647SHoward Hinnant return less<_P1>()(nullptr, __x.get()); 297967f39647SHoward Hinnant} 298067f39647SHoward Hinnant 298167f39647SHoward Hinnanttemplate <class _T1, class _D1> 298267f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 298367f39647SHoward Hinnantbool 298467f39647SHoward Hinnantoperator>(const unique_ptr<_T1, _D1>& __x, nullptr_t) 298567f39647SHoward Hinnant{ 298667f39647SHoward Hinnant return nullptr < __x; 298767f39647SHoward Hinnant} 298867f39647SHoward Hinnant 298967f39647SHoward Hinnanttemplate <class _T1, class _D1> 299067f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 299167f39647SHoward Hinnantbool 299267f39647SHoward Hinnantoperator>(nullptr_t, const unique_ptr<_T1, _D1>& __x) 299367f39647SHoward Hinnant{ 299467f39647SHoward Hinnant return __x < nullptr; 299567f39647SHoward Hinnant} 299667f39647SHoward Hinnant 299767f39647SHoward Hinnanttemplate <class _T1, class _D1> 299867f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 299967f39647SHoward Hinnantbool 300067f39647SHoward Hinnantoperator<=(const unique_ptr<_T1, _D1>& __x, nullptr_t) 300167f39647SHoward Hinnant{ 300267f39647SHoward Hinnant return !(nullptr < __x); 300367f39647SHoward Hinnant} 300467f39647SHoward Hinnant 300567f39647SHoward Hinnanttemplate <class _T1, class _D1> 300667f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 300767f39647SHoward Hinnantbool 300867f39647SHoward Hinnantoperator<=(nullptr_t, const unique_ptr<_T1, _D1>& __x) 300967f39647SHoward Hinnant{ 301067f39647SHoward Hinnant return !(__x < nullptr); 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 !(__x < nullptr); 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 !(nullptr < __x); 302767f39647SHoward Hinnant} 302867f39647SHoward Hinnant 3029bff1bfc6SHoward Hinnant#ifdef _LIBCPP_HAS_NO_RVALUE_REFERENCES 3030bff1bfc6SHoward Hinnant 3031bff1bfc6SHoward Hinnanttemplate <class _Tp, class _Dp> 3032bff1bfc6SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 3033bff1bfc6SHoward Hinnantunique_ptr<_Tp, _Dp> 3034bff1bfc6SHoward Hinnantmove(unique_ptr<_Tp, _Dp>& __t) 3035bff1bfc6SHoward Hinnant{ 3036bff1bfc6SHoward Hinnant return unique_ptr<_Tp, _Dp>(__rv<unique_ptr<_Tp, _Dp> >(__t)); 3037bff1bfc6SHoward Hinnant} 3038bff1bfc6SHoward Hinnant 3039bff1bfc6SHoward Hinnant#endif 3040bff1bfc6SHoward Hinnant 304128d8ba5fSMarshall Clow#if _LIBCPP_STD_VER > 11 304228d8ba5fSMarshall Clow 304328d8ba5fSMarshall Clowtemplate<class _Tp> 304428d8ba5fSMarshall Clowstruct __unique_if 304528d8ba5fSMarshall Clow{ 304628d8ba5fSMarshall Clow typedef unique_ptr<_Tp> __unique_single; 304728d8ba5fSMarshall Clow}; 304828d8ba5fSMarshall Clow 304928d8ba5fSMarshall Clowtemplate<class _Tp> 305028d8ba5fSMarshall Clowstruct __unique_if<_Tp[]> 305128d8ba5fSMarshall Clow{ 305228d8ba5fSMarshall Clow typedef unique_ptr<_Tp[]> __unique_array_unknown_bound; 305328d8ba5fSMarshall Clow}; 305428d8ba5fSMarshall Clow 305528d8ba5fSMarshall Clowtemplate<class _Tp, size_t _Np> 305628d8ba5fSMarshall Clowstruct __unique_if<_Tp[_Np]> 305728d8ba5fSMarshall Clow{ 305828d8ba5fSMarshall Clow typedef void __unique_array_known_bound; 305928d8ba5fSMarshall Clow}; 306028d8ba5fSMarshall Clow 306128d8ba5fSMarshall Clowtemplate<class _Tp, class... _Args> 306295ddb530SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 306328d8ba5fSMarshall Clowtypename __unique_if<_Tp>::__unique_single 306428d8ba5fSMarshall Clowmake_unique(_Args&&... __args) 306528d8ba5fSMarshall Clow{ 306628d8ba5fSMarshall Clow return unique_ptr<_Tp>(new _Tp(_VSTD::forward<_Args>(__args)...)); 306728d8ba5fSMarshall Clow} 306828d8ba5fSMarshall Clow 306928d8ba5fSMarshall Clowtemplate<class _Tp> 307095ddb530SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 307128d8ba5fSMarshall Clowtypename __unique_if<_Tp>::__unique_array_unknown_bound 307228d8ba5fSMarshall Clowmake_unique(size_t __n) 307328d8ba5fSMarshall Clow{ 307428d8ba5fSMarshall Clow typedef typename remove_extent<_Tp>::type _Up; 307528d8ba5fSMarshall Clow return unique_ptr<_Tp>(new _Up[__n]()); 307628d8ba5fSMarshall Clow} 307728d8ba5fSMarshall Clow 307828d8ba5fSMarshall Clowtemplate<class _Tp, class... _Args> 307928d8ba5fSMarshall Clow typename __unique_if<_Tp>::__unique_array_known_bound 308028d8ba5fSMarshall Clow make_unique(_Args&&...) = delete; 308128d8ba5fSMarshall Clow 308228d8ba5fSMarshall Clow#endif // _LIBCPP_STD_VER > 11 308328d8ba5fSMarshall Clow 3084d1803b6cSHoward Hinnanttemplate <class _Tp, class _Dp> 3085f9127593SEric Fiselier#ifdef _LIBCPP_CXX03_LANG 3086e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS hash<unique_ptr<_Tp, _Dp> > 3087f9127593SEric Fiselier#else 3088f9127593SEric Fiselierstruct _LIBCPP_TEMPLATE_VIS hash<__enable_hash_helper< 3089f9127593SEric Fiselier unique_ptr<_Tp, _Dp>, typename unique_ptr<_Tp, _Dp>::pointer>> 3090f9127593SEric Fiselier#endif 3091d1803b6cSHoward Hinnant{ 3092d1803b6cSHoward Hinnant typedef unique_ptr<_Tp, _Dp> argument_type; 3093d1803b6cSHoward Hinnant typedef size_t result_type; 3094848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 30957c803385SMarshall Clow result_type operator()(const argument_type& __ptr) const 3096d1803b6cSHoward Hinnant { 3097d1803b6cSHoward Hinnant typedef typename argument_type::pointer pointer; 3098d1803b6cSHoward Hinnant return hash<pointer>()(__ptr.get()); 3099d1803b6cSHoward Hinnant } 3100d1803b6cSHoward Hinnant}; 3101d1803b6cSHoward Hinnant 31023e519524SHoward Hinnantstruct __destruct_n 31033e519524SHoward Hinnant{ 31043e519524SHoward Hinnantprivate: 31053e519524SHoward Hinnant size_t size; 31063e519524SHoward Hinnant 31073e519524SHoward Hinnant template <class _Tp> 31083739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __process(_Tp* __p, false_type) _NOEXCEPT 31093e519524SHoward Hinnant {for (size_t __i = 0; __i < size; ++__i, ++__p) __p->~_Tp();} 31103e519524SHoward Hinnant 31113e519524SHoward Hinnant template <class _Tp> 31123739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __process(_Tp*, true_type) _NOEXCEPT 31133e519524SHoward Hinnant {} 31143e519524SHoward Hinnant 31153739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __incr(false_type) _NOEXCEPT 31163e519524SHoward Hinnant {++size;} 31173739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __incr(true_type) _NOEXCEPT 31183e519524SHoward Hinnant {} 31193e519524SHoward Hinnant 31203739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __set(size_t __s, false_type) _NOEXCEPT 31213e519524SHoward Hinnant {size = __s;} 31223739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __set(size_t, true_type) _NOEXCEPT 31233e519524SHoward Hinnant {} 31243e519524SHoward Hinnantpublic: 31253739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __destruct_n(size_t __s) _NOEXCEPT 31263739fe79SHoward Hinnant : size(__s) {} 31273e519524SHoward Hinnant 31283e519524SHoward Hinnant template <class _Tp> 31293739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __incr(_Tp*) _NOEXCEPT 3130ca740483SHoward Hinnant {__incr(integral_constant<bool, is_trivially_destructible<_Tp>::value>());} 31313e519524SHoward Hinnant 31323e519524SHoward Hinnant template <class _Tp> 31333739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __set(size_t __s, _Tp*) _NOEXCEPT 3134ca740483SHoward Hinnant {__set(__s, integral_constant<bool, is_trivially_destructible<_Tp>::value>());} 31353e519524SHoward Hinnant 31363e519524SHoward Hinnant template <class _Tp> 31373739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __p) _NOEXCEPT 3138ca740483SHoward Hinnant {__process(__p, integral_constant<bool, is_trivially_destructible<_Tp>::value>());} 31393e519524SHoward Hinnant}; 31403e519524SHoward Hinnant 31413e519524SHoward Hinnanttemplate <class _Alloc> 31423e519524SHoward Hinnantclass __allocator_destructor 31433e519524SHoward Hinnant{ 31443e519524SHoward Hinnant typedef allocator_traits<_Alloc> __alloc_traits; 31453e519524SHoward Hinnantpublic: 31463e519524SHoward Hinnant typedef typename __alloc_traits::pointer pointer; 31473e519524SHoward Hinnant typedef typename __alloc_traits::size_type size_type; 31483e519524SHoward Hinnantprivate: 31493e519524SHoward Hinnant _Alloc& __alloc_; 31503e519524SHoward Hinnant size_type __s_; 31513e519524SHoward Hinnantpublic: 31523e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __allocator_destructor(_Alloc& __a, size_type __s) 31533739fe79SHoward Hinnant _NOEXCEPT 31543e519524SHoward Hinnant : __alloc_(__a), __s_(__s) {} 3155848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 31563739fe79SHoward Hinnant void operator()(pointer __p) _NOEXCEPT 31573739fe79SHoward Hinnant {__alloc_traits::deallocate(__alloc_, __p, __s_);} 31583e519524SHoward Hinnant}; 31593e519524SHoward Hinnant 31603e519524SHoward Hinnanttemplate <class _InputIterator, class _ForwardIterator> 31613e519524SHoward Hinnant_ForwardIterator 31623e519524SHoward Hinnantuninitialized_copy(_InputIterator __f, _InputIterator __l, _ForwardIterator __r) 31633e519524SHoward Hinnant{ 31643e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 3165b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3166b34b4819SHoward Hinnant _ForwardIterator __s = __r; 3167b34b4819SHoward Hinnant try 3168b34b4819SHoward Hinnant { 3169b34b4819SHoward Hinnant#endif 3170a00932bdSMarshall Clow for (; __f != __l; ++__f, (void) ++__r) 3171a00932bdSMarshall Clow ::new (static_cast<void*>(_VSTD::addressof(*__r))) value_type(*__f); 3172b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3173b34b4819SHoward Hinnant } 3174b34b4819SHoward Hinnant catch (...) 3175b34b4819SHoward Hinnant { 3176b34b4819SHoward Hinnant for (; __s != __r; ++__s) 3177b34b4819SHoward Hinnant __s->~value_type(); 3178b34b4819SHoward Hinnant throw; 3179b34b4819SHoward Hinnant } 3180b34b4819SHoward Hinnant#endif 31813e519524SHoward Hinnant return __r; 31823e519524SHoward Hinnant} 31833e519524SHoward Hinnant 31843e519524SHoward Hinnanttemplate <class _InputIterator, class _Size, class _ForwardIterator> 31853e519524SHoward Hinnant_ForwardIterator 31863e519524SHoward Hinnantuninitialized_copy_n(_InputIterator __f, _Size __n, _ForwardIterator __r) 31873e519524SHoward Hinnant{ 31883e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 3189b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3190b34b4819SHoward Hinnant _ForwardIterator __s = __r; 3191b34b4819SHoward Hinnant try 3192b34b4819SHoward Hinnant { 3193b34b4819SHoward Hinnant#endif 3194a00932bdSMarshall Clow for (; __n > 0; ++__f, (void) ++__r, (void) --__n) 3195a00932bdSMarshall Clow ::new (static_cast<void*>(_VSTD::addressof(*__r))) value_type(*__f); 3196b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3197b34b4819SHoward Hinnant } 3198b34b4819SHoward Hinnant catch (...) 3199b34b4819SHoward Hinnant { 3200b34b4819SHoward Hinnant for (; __s != __r; ++__s) 3201b34b4819SHoward Hinnant __s->~value_type(); 3202b34b4819SHoward Hinnant throw; 3203b34b4819SHoward Hinnant } 3204b34b4819SHoward Hinnant#endif 32053e519524SHoward Hinnant return __r; 32063e519524SHoward Hinnant} 32073e519524SHoward Hinnant 32083e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Tp> 32093e519524SHoward Hinnantvoid 32103e519524SHoward Hinnantuninitialized_fill(_ForwardIterator __f, _ForwardIterator __l, const _Tp& __x) 32113e519524SHoward Hinnant{ 32123e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 3213b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3214b34b4819SHoward Hinnant _ForwardIterator __s = __f; 3215b34b4819SHoward Hinnant try 3216b34b4819SHoward Hinnant { 3217b34b4819SHoward Hinnant#endif 3218b34b4819SHoward Hinnant for (; __f != __l; ++__f) 3219a00932bdSMarshall Clow ::new (static_cast<void*>(_VSTD::addressof(*__f))) value_type(__x); 3220b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3221b34b4819SHoward Hinnant } 3222b34b4819SHoward Hinnant catch (...) 3223b34b4819SHoward Hinnant { 3224b34b4819SHoward Hinnant for (; __s != __f; ++__s) 3225b34b4819SHoward Hinnant __s->~value_type(); 3226b34b4819SHoward Hinnant throw; 3227b34b4819SHoward Hinnant } 3228b34b4819SHoward Hinnant#endif 32293e519524SHoward Hinnant} 32303e519524SHoward Hinnant 32313e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Size, class _Tp> 323248d05bd2SHoward Hinnant_ForwardIterator 32333e519524SHoward Hinnantuninitialized_fill_n(_ForwardIterator __f, _Size __n, const _Tp& __x) 32343e519524SHoward Hinnant{ 32353e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 3236b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3237b34b4819SHoward Hinnant _ForwardIterator __s = __f; 3238b34b4819SHoward Hinnant try 3239b34b4819SHoward Hinnant { 3240b34b4819SHoward Hinnant#endif 3241a00932bdSMarshall Clow for (; __n > 0; ++__f, (void) --__n) 3242a00932bdSMarshall Clow ::new (static_cast<void*>(_VSTD::addressof(*__f))) value_type(__x); 3243b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3244b34b4819SHoward Hinnant } 3245b34b4819SHoward Hinnant catch (...) 3246b34b4819SHoward Hinnant { 3247b34b4819SHoward Hinnant for (; __s != __f; ++__s) 3248b34b4819SHoward Hinnant __s->~value_type(); 3249b34b4819SHoward Hinnant throw; 3250b34b4819SHoward Hinnant } 3251b34b4819SHoward Hinnant#endif 325248d05bd2SHoward Hinnant return __f; 32533e519524SHoward Hinnant} 32543e519524SHoward Hinnant 3255e4d9c316SEric Fiselier#if _LIBCPP_STD_VER > 14 3256e4d9c316SEric Fiselier 3257e4d9c316SEric Fiseliertemplate <class _Tp> 3258e4d9c316SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3259e4d9c316SEric Fiseliervoid destroy_at(_Tp* __loc) { 3260e4d9c316SEric Fiselier _LIBCPP_ASSERT(__loc, "null pointer given to destroy_at"); 3261e4d9c316SEric Fiselier __loc->~_Tp(); 3262e4d9c316SEric Fiselier} 3263e4d9c316SEric Fiselier 3264e4d9c316SEric Fiseliertemplate <class _ForwardIterator> 3265e4d9c316SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3266e4d9c316SEric Fiseliervoid destroy(_ForwardIterator __first, _ForwardIterator __last) { 3267e4d9c316SEric Fiselier for (; __first != __last; ++__first) 3268e4d9c316SEric Fiselier _VSTD::destroy_at(_VSTD::addressof(*__first)); 3269e4d9c316SEric Fiselier} 3270e4d9c316SEric Fiselier 3271e4d9c316SEric Fiseliertemplate <class _ForwardIterator, class _Size> 3272e4d9c316SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3273e4d9c316SEric Fiselier_ForwardIterator destroy_n(_ForwardIterator __first, _Size __n) { 3274e4d9c316SEric Fiselier for (; __n > 0; (void)++__first, --__n) 3275e4d9c316SEric Fiselier _VSTD::destroy_at(_VSTD::addressof(*__first)); 3276e4d9c316SEric Fiselier return __first; 3277e4d9c316SEric Fiselier} 3278e4d9c316SEric Fiselier 3279e778d10cSEric Fiseliertemplate <class _ForwardIterator> 3280e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3281e778d10cSEric Fiseliervoid uninitialized_default_construct(_ForwardIterator __first, _ForwardIterator __last) { 3282e778d10cSEric Fiselier using _Vt = typename iterator_traits<_ForwardIterator>::value_type; 3283e778d10cSEric Fiselier auto __idx = __first; 3284e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3285e778d10cSEric Fiselier try { 3286e778d10cSEric Fiselier#endif 3287e778d10cSEric Fiselier for (; __idx != __last; ++__idx) 3288e778d10cSEric Fiselier ::new((void*)_VSTD::addressof(*__idx)) _Vt; 3289e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3290e778d10cSEric Fiselier } catch (...) { 3291e778d10cSEric Fiselier _VSTD::destroy(__first, __idx); 3292e778d10cSEric Fiselier throw; 3293e778d10cSEric Fiselier } 3294e778d10cSEric Fiselier#endif 3295e778d10cSEric Fiselier} 3296e778d10cSEric Fiselier 3297e778d10cSEric Fiseliertemplate <class _ForwardIterator, class _Size> 3298e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3299e778d10cSEric Fiselier_ForwardIterator uninitialized_default_construct_n(_ForwardIterator __first, _Size __n) { 3300e778d10cSEric Fiselier using _Vt = typename iterator_traits<_ForwardIterator>::value_type; 3301e778d10cSEric Fiselier auto __idx = __first; 3302e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3303e778d10cSEric Fiselier try { 3304e778d10cSEric Fiselier#endif 3305e778d10cSEric Fiselier for (; __n > 0; (void)++__idx, --__n) 3306e778d10cSEric Fiselier ::new((void*)_VSTD::addressof(*__idx)) _Vt; 3307e778d10cSEric Fiselier return __idx; 3308e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3309e778d10cSEric Fiselier } catch (...) { 3310e778d10cSEric Fiselier _VSTD::destroy(__first, __idx); 3311e778d10cSEric Fiselier throw; 3312e778d10cSEric Fiselier } 3313e778d10cSEric Fiselier#endif 3314e778d10cSEric Fiselier} 3315e778d10cSEric Fiselier 3316e778d10cSEric Fiselier 3317e778d10cSEric Fiseliertemplate <class _ForwardIterator> 3318e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3319e778d10cSEric Fiseliervoid uninitialized_value_construct(_ForwardIterator __first, _ForwardIterator __last) { 3320e778d10cSEric Fiselier using _Vt = typename iterator_traits<_ForwardIterator>::value_type; 3321e778d10cSEric Fiselier auto __idx = __first; 3322e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3323e778d10cSEric Fiselier try { 3324e778d10cSEric Fiselier#endif 3325e778d10cSEric Fiselier for (; __idx != __last; ++__idx) 3326e778d10cSEric Fiselier ::new((void*)_VSTD::addressof(*__idx)) _Vt(); 3327e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3328e778d10cSEric Fiselier } catch (...) { 3329e778d10cSEric Fiselier _VSTD::destroy(__first, __idx); 3330e778d10cSEric Fiselier throw; 3331e778d10cSEric Fiselier } 3332e778d10cSEric Fiselier#endif 3333e778d10cSEric Fiselier} 3334e778d10cSEric Fiselier 3335e778d10cSEric Fiseliertemplate <class _ForwardIterator, class _Size> 3336e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3337e778d10cSEric Fiselier_ForwardIterator uninitialized_value_construct_n(_ForwardIterator __first, _Size __n) { 3338e778d10cSEric Fiselier using _Vt = typename iterator_traits<_ForwardIterator>::value_type; 3339e778d10cSEric Fiselier auto __idx = __first; 3340e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3341e778d10cSEric Fiselier try { 3342e778d10cSEric Fiselier#endif 3343e778d10cSEric Fiselier for (; __n > 0; (void)++__idx, --__n) 3344e778d10cSEric Fiselier ::new((void*)_VSTD::addressof(*__idx)) _Vt(); 3345e778d10cSEric Fiselier return __idx; 3346e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3347e778d10cSEric Fiselier } catch (...) { 3348e778d10cSEric Fiselier _VSTD::destroy(__first, __idx); 3349e778d10cSEric Fiselier throw; 3350e778d10cSEric Fiselier } 3351e778d10cSEric Fiselier#endif 3352e778d10cSEric Fiselier} 3353e778d10cSEric Fiselier 3354e778d10cSEric Fiselier 3355e778d10cSEric Fiseliertemplate <class _InputIt, class _ForwardIt> 3356e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3357e778d10cSEric Fiselier_ForwardIt uninitialized_move(_InputIt __first, _InputIt __last, _ForwardIt __first_res) { 3358e778d10cSEric Fiselier using _Vt = typename iterator_traits<_ForwardIt>::value_type; 3359e778d10cSEric Fiselier auto __idx = __first_res; 3360e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3361e778d10cSEric Fiselier try { 3362e778d10cSEric Fiselier#endif 3363e778d10cSEric Fiselier for (; __first != __last; (void)++__idx, ++__first) 3364e778d10cSEric Fiselier ::new((void*)_VSTD::addressof(*__idx)) _Vt(std::move(*__first)); 3365e778d10cSEric Fiselier return __idx; 3366e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3367e778d10cSEric Fiselier } catch (...) { 3368e778d10cSEric Fiselier _VSTD::destroy(__first_res, __idx); 3369e778d10cSEric Fiselier throw; 3370e778d10cSEric Fiselier } 3371e778d10cSEric Fiselier#endif 3372e778d10cSEric Fiselier} 3373e778d10cSEric Fiselier 3374e778d10cSEric Fiseliertemplate <class _InputIt, class _Size, class _ForwardIt> 3375e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3376e778d10cSEric Fiselierpair<_InputIt, _ForwardIt> 3377e778d10cSEric Fiselieruninitialized_move_n(_InputIt __first, _Size __n, _ForwardIt __first_res) { 3378e778d10cSEric Fiselier using _Vt = typename iterator_traits<_ForwardIt>::value_type; 3379e778d10cSEric Fiselier auto __idx = __first_res; 3380e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3381e778d10cSEric Fiselier try { 3382e778d10cSEric Fiselier#endif 3383e778d10cSEric Fiselier for (; __n > 0; ++__idx, (void)++__first, --__n) 3384e778d10cSEric Fiselier ::new((void*)_VSTD::addressof(*__idx)) _Vt(std::move(*__first)); 3385e778d10cSEric Fiselier return {__first, __idx}; 3386e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3387e778d10cSEric Fiselier } catch (...) { 3388e778d10cSEric Fiselier _VSTD::destroy(__first_res, __idx); 3389e778d10cSEric Fiselier throw; 3390e778d10cSEric Fiselier } 3391e778d10cSEric Fiselier#endif 3392e778d10cSEric Fiselier} 3393e778d10cSEric Fiselier 3394e778d10cSEric Fiselier 3395e4d9c316SEric Fiselier#endif // _LIBCPP_STD_VER > 14 3396e4d9c316SEric Fiselier 3397f08de52dSKevin Hu// NOTE: Relaxed and acq/rel atomics (for increment and decrement respectively) 3398f08de52dSKevin Hu// should be sufficient for thread safety. 33993c35491fSEric Fiselier// See https://bugs.llvm.org/show_bug.cgi?id=22803 3400f08de52dSKevin Hu#if defined(__clang__) && __has_builtin(__atomic_add_fetch) \ 3401f08de52dSKevin Hu && defined(__ATOMIC_RELAXED) \ 3402f08de52dSKevin Hu && defined(__ATOMIC_ACQ_REL) 3403f08de52dSKevin Hu# define _LIBCPP_HAS_BUILTIN_ATOMIC_SUPPORT 3404f08de52dSKevin Hu#elif !defined(__clang__) && defined(_GNUC_VER) && _GNUC_VER >= 407 3405f08de52dSKevin Hu# define _LIBCPP_HAS_BUILTIN_ATOMIC_SUPPORT 3406f08de52dSKevin Hu#endif 3407f08de52dSKevin Hu 3408f08de52dSKevin Hutemplate <class _Tp> 3409f08de52dSKevin Huinline _LIBCPP_INLINE_VISIBILITY _Tp 3410f08de52dSKevin Hu__libcpp_atomic_refcount_increment(_Tp& __t) _NOEXCEPT 3411f08de52dSKevin Hu{ 3412f08de52dSKevin Hu#if defined(_LIBCPP_HAS_BUILTIN_ATOMIC_SUPPORT) && !defined(_LIBCPP_HAS_NO_THREADS) 3413f08de52dSKevin Hu return __atomic_add_fetch(&__t, 1, __ATOMIC_RELAXED); 3414f08de52dSKevin Hu#else 3415f08de52dSKevin Hu return __t += 1; 3416f08de52dSKevin Hu#endif 3417f08de52dSKevin Hu} 3418f08de52dSKevin Hu 3419f08de52dSKevin Hutemplate <class _Tp> 3420f08de52dSKevin Huinline _LIBCPP_INLINE_VISIBILITY _Tp 3421f08de52dSKevin Hu__libcpp_atomic_refcount_decrement(_Tp& __t) _NOEXCEPT 3422f08de52dSKevin Hu{ 3423f08de52dSKevin Hu#if defined(_LIBCPP_HAS_BUILTIN_ATOMIC_SUPPORT) && !defined(_LIBCPP_HAS_NO_THREADS) 3424f08de52dSKevin Hu return __atomic_add_fetch(&__t, -1, __ATOMIC_ACQ_REL); 3425f08de52dSKevin Hu#else 3426f08de52dSKevin Hu return __t -= 1; 3427f08de52dSKevin Hu#endif 3428f08de52dSKevin Hu} 3429f08de52dSKevin Hu 3430848a5374SHoward Hinnantclass _LIBCPP_EXCEPTION_ABI bad_weak_ptr 34313e519524SHoward Hinnant : public std::exception 34323e519524SHoward Hinnant{ 34333e519524SHoward Hinnantpublic: 34343739fe79SHoward Hinnant virtual ~bad_weak_ptr() _NOEXCEPT; 34353739fe79SHoward Hinnant virtual const char* what() const _NOEXCEPT; 34363e519524SHoward Hinnant}; 34373e519524SHoward Hinnant 3438d437fa5cSMarshall Clow_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE 3439d437fa5cSMarshall Clowvoid __throw_bad_weak_ptr() 3440d437fa5cSMarshall Clow{ 3441d437fa5cSMarshall Clow#ifndef _LIBCPP_NO_EXCEPTIONS 3442d437fa5cSMarshall Clow throw bad_weak_ptr(); 3443d437fa5cSMarshall Clow#else 3444d437fa5cSMarshall Clow _VSTD::abort(); 3445d437fa5cSMarshall Clow#endif 3446d437fa5cSMarshall Clow} 3447d437fa5cSMarshall Clow 3448e2f2d1edSEric Fiseliertemplate<class _Tp> class _LIBCPP_TEMPLATE_VIS weak_ptr; 34493e519524SHoward Hinnant 3450f0544c20SHoward Hinnantclass _LIBCPP_TYPE_VIS __shared_count 34513e519524SHoward Hinnant{ 34523e519524SHoward Hinnant __shared_count(const __shared_count&); 34533e519524SHoward Hinnant __shared_count& operator=(const __shared_count&); 34543e519524SHoward Hinnant 34553e519524SHoward Hinnantprotected: 34563e519524SHoward Hinnant long __shared_owners_; 34573e519524SHoward Hinnant virtual ~__shared_count(); 34583e519524SHoward Hinnantprivate: 34593739fe79SHoward Hinnant virtual void __on_zero_shared() _NOEXCEPT = 0; 34603e519524SHoward Hinnant 34613e519524SHoward Hinnantpublic: 3462848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 34633739fe79SHoward Hinnant explicit __shared_count(long __refs = 0) _NOEXCEPT 34643e519524SHoward Hinnant : __shared_owners_(__refs) {} 34653e519524SHoward Hinnant 346611f60453SEric Fiselier#if defined(_LIBCPP_BUILDING_MEMORY) && \ 346711f60453SEric Fiselier defined(_LIBCPP_DEPRECATED_ABI_LEGACY_LIBRARY_DEFINITIONS_FOR_INLINE_FUNCTIONS) 3468a480c28bSEric Fiselier void __add_shared() _NOEXCEPT; 3469a480c28bSEric Fiselier bool __release_shared() _NOEXCEPT; 3470f08de52dSKevin Hu#else 3471f08de52dSKevin Hu _LIBCPP_INLINE_VISIBILITY 3472f08de52dSKevin Hu void __add_shared() _NOEXCEPT { 3473f08de52dSKevin Hu __libcpp_atomic_refcount_increment(__shared_owners_); 3474f08de52dSKevin Hu } 3475f08de52dSKevin Hu _LIBCPP_INLINE_VISIBILITY 3476f08de52dSKevin Hu bool __release_shared() _NOEXCEPT { 3477f08de52dSKevin Hu if (__libcpp_atomic_refcount_decrement(__shared_owners_) == -1) { 3478f08de52dSKevin Hu __on_zero_shared(); 3479f08de52dSKevin Hu return true; 3480f08de52dSKevin Hu } 3481f08de52dSKevin Hu return false; 3482f08de52dSKevin Hu } 3483f08de52dSKevin Hu#endif 3484848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 34851faf289eSEric Fiselier long use_count() const _NOEXCEPT { 34861faf289eSEric Fiselier return __libcpp_relaxed_load(&__shared_owners_) + 1; 34871faf289eSEric Fiselier } 34883e519524SHoward Hinnant}; 34893e519524SHoward Hinnant 3490f0544c20SHoward Hinnantclass _LIBCPP_TYPE_VIS __shared_weak_count 34913e519524SHoward Hinnant : private __shared_count 34923e519524SHoward Hinnant{ 34933e519524SHoward Hinnant long __shared_weak_owners_; 34943e519524SHoward Hinnant 34953e519524SHoward Hinnantpublic: 3496848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 34973739fe79SHoward Hinnant explicit __shared_weak_count(long __refs = 0) _NOEXCEPT 34983e519524SHoward Hinnant : __shared_count(__refs), 34993e519524SHoward Hinnant __shared_weak_owners_(__refs) {} 35003e519524SHoward Hinnantprotected: 35013e519524SHoward Hinnant virtual ~__shared_weak_count(); 35023e519524SHoward Hinnant 35033e519524SHoward Hinnantpublic: 350411f60453SEric Fiselier#if defined(_LIBCPP_BUILDING_MEMORY) && \ 350511f60453SEric Fiselier defined(_LIBCPP_DEPRECATED_ABI_LEGACY_LIBRARY_DEFINITIONS_FOR_INLINE_FUNCTIONS) 3506a480c28bSEric Fiselier void __add_shared() _NOEXCEPT; 3507a480c28bSEric Fiselier void __add_weak() _NOEXCEPT; 3508a480c28bSEric Fiselier void __release_shared() _NOEXCEPT; 3509f08de52dSKevin Hu#else 3510f08de52dSKevin Hu _LIBCPP_INLINE_VISIBILITY 3511f08de52dSKevin Hu void __add_shared() _NOEXCEPT { 3512f08de52dSKevin Hu __shared_count::__add_shared(); 3513f08de52dSKevin Hu } 3514f08de52dSKevin Hu _LIBCPP_INLINE_VISIBILITY 3515f08de52dSKevin Hu void __add_weak() _NOEXCEPT { 3516f08de52dSKevin Hu __libcpp_atomic_refcount_increment(__shared_weak_owners_); 3517f08de52dSKevin Hu } 3518f08de52dSKevin Hu _LIBCPP_INLINE_VISIBILITY 3519f08de52dSKevin Hu void __release_shared() _NOEXCEPT { 3520f08de52dSKevin Hu if (__shared_count::__release_shared()) 3521f08de52dSKevin Hu __release_weak(); 3522f08de52dSKevin Hu } 3523f08de52dSKevin Hu#endif 35243739fe79SHoward Hinnant void __release_weak() _NOEXCEPT; 3525848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 35263739fe79SHoward Hinnant long use_count() const _NOEXCEPT {return __shared_count::use_count();} 35273739fe79SHoward Hinnant __shared_weak_count* lock() _NOEXCEPT; 35283e519524SHoward Hinnant 3529a9f69800SHoward Hinnant // Define the function out only if we build static libc++ without RTTI. 3530a9f69800SHoward Hinnant // Otherwise we may break clients who need to compile their projects with 3531a9f69800SHoward Hinnant // -fno-rtti and yet link against a libc++.dylib compiled 3532a9f69800SHoward Hinnant // without -fno-rtti. 3533a9f69800SHoward Hinnant#if !defined(_LIBCPP_NO_RTTI) || !defined(_LIBCPP_BUILD_STATIC) 35343739fe79SHoward Hinnant virtual const void* __get_deleter(const type_info&) const _NOEXCEPT; 3535a9f69800SHoward Hinnant#endif 35363e519524SHoward Hinnantprivate: 35373739fe79SHoward Hinnant virtual void __on_zero_shared_weak() _NOEXCEPT = 0; 35383e519524SHoward Hinnant}; 35393e519524SHoward Hinnant 35403e519524SHoward Hinnanttemplate <class _Tp, class _Dp, class _Alloc> 35413e519524SHoward Hinnantclass __shared_ptr_pointer 35423e519524SHoward Hinnant : public __shared_weak_count 35433e519524SHoward Hinnant{ 35443e519524SHoward Hinnant __compressed_pair<__compressed_pair<_Tp, _Dp>, _Alloc> __data_; 35453e519524SHoward Hinnantpublic: 3546848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 35473e519524SHoward Hinnant __shared_ptr_pointer(_Tp __p, _Dp __d, _Alloc __a) 3548ce48a113SHoward Hinnant : __data_(__compressed_pair<_Tp, _Dp>(__p, _VSTD::move(__d)), _VSTD::move(__a)) {} 35493e519524SHoward Hinnant 355054b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI 35513739fe79SHoward Hinnant virtual const void* __get_deleter(const type_info&) const _NOEXCEPT; 355254b409fdSHoward Hinnant#endif 35533e519524SHoward Hinnant 35543e519524SHoward Hinnantprivate: 35553739fe79SHoward Hinnant virtual void __on_zero_shared() _NOEXCEPT; 35563739fe79SHoward Hinnant virtual void __on_zero_shared_weak() _NOEXCEPT; 35573e519524SHoward Hinnant}; 35583e519524SHoward Hinnant 355954b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI 356054b409fdSHoward Hinnant 35613e519524SHoward Hinnanttemplate <class _Tp, class _Dp, class _Alloc> 35623e519524SHoward Hinnantconst void* 35633739fe79SHoward Hinnant__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__get_deleter(const type_info& __t) const _NOEXCEPT 35643e519524SHoward Hinnant{ 3565278ddec2SMarshall Clow return __t == typeid(_Dp) ? _VSTD::addressof(__data_.first().second()) : 0; 35663e519524SHoward Hinnant} 35673e519524SHoward Hinnant 3568b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_RTTI 356954b409fdSHoward Hinnant 35703e519524SHoward Hinnanttemplate <class _Tp, class _Dp, class _Alloc> 35713e519524SHoward Hinnantvoid 35723739fe79SHoward Hinnant__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__on_zero_shared() _NOEXCEPT 35733e519524SHoward Hinnant{ 35743e519524SHoward Hinnant __data_.first().second()(__data_.first().first()); 35753e519524SHoward Hinnant __data_.first().second().~_Dp(); 35763e519524SHoward Hinnant} 35773e519524SHoward Hinnant 35783e519524SHoward Hinnanttemplate <class _Tp, class _Dp, class _Alloc> 35793e519524SHoward Hinnantvoid 35803739fe79SHoward Hinnant__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__on_zero_shared_weak() _NOEXCEPT 35813e519524SHoward Hinnant{ 35826fe361c1SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, __shared_ptr_pointer>::type _Al; 35836fe361c1SEric Fiselier typedef allocator_traits<_Al> _ATraits; 3584319be722SEric Fiselier typedef pointer_traits<typename _ATraits::pointer> _PTraits; 3585319be722SEric Fiselier 35866fe361c1SEric Fiselier _Al __a(__data_.second()); 35873e519524SHoward Hinnant __data_.second().~_Alloc(); 3588319be722SEric Fiselier __a.deallocate(_PTraits::pointer_to(*this), 1); 35893e519524SHoward Hinnant} 35903e519524SHoward Hinnant 35913e519524SHoward Hinnanttemplate <class _Tp, class _Alloc> 35923e519524SHoward Hinnantclass __shared_ptr_emplace 35933e519524SHoward Hinnant : public __shared_weak_count 35943e519524SHoward Hinnant{ 35953e519524SHoward Hinnant __compressed_pair<_Alloc, _Tp> __data_; 35963e519524SHoward Hinnantpublic: 35973e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 35983e519524SHoward Hinnant 3599848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 36003e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a) 3601ce48a113SHoward Hinnant : __data_(_VSTD::move(__a)) {} 36023e519524SHoward Hinnant 36033e519524SHoward Hinnant template <class ..._Args> 3604848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 36053e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a, _Args&& ...__args) 3606a87b5e34SHoward Hinnant : __data_(piecewise_construct, _VSTD::forward_as_tuple(__a), 3607a87b5e34SHoward Hinnant _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)) {} 36083e519524SHoward Hinnant 36093e519524SHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 36103e519524SHoward Hinnant 3611848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 36123e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a) 36133e519524SHoward Hinnant : __data_(__a) {} 36143e519524SHoward Hinnant 36153e519524SHoward Hinnant template <class _A0> 3616848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 36173e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a, _A0& __a0) 36183e519524SHoward Hinnant : __data_(__a, _Tp(__a0)) {} 36193e519524SHoward Hinnant 36203e519524SHoward Hinnant template <class _A0, class _A1> 3621848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 36223e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a, _A0& __a0, _A1& __a1) 36233e519524SHoward Hinnant : __data_(__a, _Tp(__a0, __a1)) {} 36243e519524SHoward Hinnant 36253e519524SHoward Hinnant template <class _A0, class _A1, class _A2> 3626848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 36273e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a, _A0& __a0, _A1& __a1, _A2& __a2) 36283e519524SHoward Hinnant : __data_(__a, _Tp(__a0, __a1, __a2)) {} 36293e519524SHoward Hinnant 36303e519524SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 36313e519524SHoward Hinnant 36323e519524SHoward Hinnantprivate: 36333739fe79SHoward Hinnant virtual void __on_zero_shared() _NOEXCEPT; 36343739fe79SHoward Hinnant virtual void __on_zero_shared_weak() _NOEXCEPT; 36353e519524SHoward Hinnantpublic: 3636848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 36373739fe79SHoward Hinnant _Tp* get() _NOEXCEPT {return &__data_.second();} 36383e519524SHoward Hinnant}; 36393e519524SHoward Hinnant 36403e519524SHoward Hinnanttemplate <class _Tp, class _Alloc> 36413e519524SHoward Hinnantvoid 36423739fe79SHoward Hinnant__shared_ptr_emplace<_Tp, _Alloc>::__on_zero_shared() _NOEXCEPT 36433e519524SHoward Hinnant{ 36443e519524SHoward Hinnant __data_.second().~_Tp(); 36453e519524SHoward Hinnant} 36463e519524SHoward Hinnant 36473e519524SHoward Hinnanttemplate <class _Tp, class _Alloc> 36483e519524SHoward Hinnantvoid 36493739fe79SHoward Hinnant__shared_ptr_emplace<_Tp, _Alloc>::__on_zero_shared_weak() _NOEXCEPT 36503e519524SHoward Hinnant{ 36516fe361c1SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, __shared_ptr_emplace>::type _Al; 36526fe361c1SEric Fiselier typedef allocator_traits<_Al> _ATraits; 3653319be722SEric Fiselier typedef pointer_traits<typename _ATraits::pointer> _PTraits; 36546fe361c1SEric Fiselier _Al __a(__data_.first()); 36553e519524SHoward Hinnant __data_.first().~_Alloc(); 3656319be722SEric Fiselier __a.deallocate(_PTraits::pointer_to(*this), 1); 36573e519524SHoward Hinnant} 36583e519524SHoward Hinnant 3659e2f2d1edSEric Fiseliertemplate<class _Tp> class _LIBCPP_TEMPLATE_VIS enable_shared_from_this; 36603e519524SHoward Hinnant 36613e519524SHoward Hinnanttemplate<class _Tp> 3662e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS shared_ptr 36633e519524SHoward Hinnant{ 36643e519524SHoward Hinnantpublic: 36653e519524SHoward Hinnant typedef _Tp element_type; 3666dc83e779SMarshall Clow 366768436a9bSEric Fiselier#if _LIBCPP_STD_VER > 14 366868436a9bSEric Fiselier typedef weak_ptr<_Tp> weak_type; 366968436a9bSEric Fiselier#endif 36703e519524SHoward Hinnantprivate: 36713e519524SHoward Hinnant element_type* __ptr_; 36723e519524SHoward Hinnant __shared_weak_count* __cntrl_; 36733e519524SHoward Hinnant 36743e519524SHoward Hinnant struct __nat {int __for_bool_;}; 36753e519524SHoward Hinnantpublic: 3676906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 3677c0937e8aSHoward Hinnant _LIBCPP_CONSTEXPR shared_ptr() _NOEXCEPT; 3678906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 3679c0937e8aSHoward Hinnant _LIBCPP_CONSTEXPR shared_ptr(nullptr_t) _NOEXCEPT; 368022747e62SLogan Chien template<class _Yp> 368122747e62SLogan Chien explicit shared_ptr(_Yp* __p, 368222747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat()); 368322747e62SLogan Chien template<class _Yp, class _Dp> 368422747e62SLogan Chien shared_ptr(_Yp* __p, _Dp __d, 368522747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat()); 368622747e62SLogan Chien template<class _Yp, class _Dp, class _Alloc> 368722747e62SLogan Chien shared_ptr(_Yp* __p, _Dp __d, _Alloc __a, 368822747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat()); 36893e519524SHoward Hinnant template <class _Dp> shared_ptr(nullptr_t __p, _Dp __d); 36903e519524SHoward Hinnant template <class _Dp, class _Alloc> shared_ptr(nullptr_t __p, _Dp __d, _Alloc __a); 3691906c872dSEvgeniy Stepanov template<class _Yp> _LIBCPP_INLINE_VISIBILITY shared_ptr(const shared_ptr<_Yp>& __r, element_type* __p) _NOEXCEPT; 3692906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 36933739fe79SHoward Hinnant shared_ptr(const shared_ptr& __r) _NOEXCEPT; 36943e519524SHoward Hinnant template<class _Yp> 3695906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 36963e519524SHoward Hinnant shared_ptr(const shared_ptr<_Yp>& __r, 3697dc83e779SMarshall Clow typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat()) 36983739fe79SHoward Hinnant _NOEXCEPT; 36997609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 3700906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 37013739fe79SHoward Hinnant shared_ptr(shared_ptr&& __r) _NOEXCEPT; 3702906c872dSEvgeniy Stepanov template<class _Yp> _LIBCPP_INLINE_VISIBILITY shared_ptr(shared_ptr<_Yp>&& __r, 3703dc83e779SMarshall Clow typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat()) 37043739fe79SHoward Hinnant _NOEXCEPT; 37057609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 37063e519524SHoward Hinnant template<class _Yp> explicit shared_ptr(const weak_ptr<_Yp>& __r, 3707dc83e779SMarshall Clow typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type= __nat()); 3708e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR) 37097609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 371022747e62SLogan Chien template<class _Yp> 371122747e62SLogan Chien shared_ptr(auto_ptr<_Yp>&& __r, 371222747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat()); 3713b3371f6fSHoward Hinnant#else 371422747e62SLogan Chien template<class _Yp> 371522747e62SLogan Chien shared_ptr(auto_ptr<_Yp> __r, 371622747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat()); 37173e519524SHoward Hinnant#endif 3718e67179bcSMarshall Clow#endif 37197609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 372022747e62SLogan Chien template <class _Yp, class _Dp> 37218e25104bSHoward Hinnant shared_ptr(unique_ptr<_Yp, _Dp>&&, 372222747e62SLogan Chien typename enable_if 37238e25104bSHoward Hinnant < 372422747e62SLogan Chien !is_lvalue_reference<_Dp>::value && 37258e25104bSHoward Hinnant !is_array<_Yp>::value && 372622747e62SLogan Chien is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 372722747e62SLogan Chien __nat 372822747e62SLogan Chien >::type = __nat()); 372922747e62SLogan Chien template <class _Yp, class _Dp> 37308e25104bSHoward Hinnant shared_ptr(unique_ptr<_Yp, _Dp>&&, 373122747e62SLogan Chien typename enable_if 373222747e62SLogan Chien < 373322747e62SLogan Chien is_lvalue_reference<_Dp>::value && 373422747e62SLogan Chien !is_array<_Yp>::value && 373522747e62SLogan Chien is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 373622747e62SLogan Chien __nat 373722747e62SLogan Chien >::type = __nat()); 37387609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 373922747e62SLogan Chien template <class _Yp, class _Dp> 37408e25104bSHoward Hinnant shared_ptr(unique_ptr<_Yp, _Dp>, 374122747e62SLogan Chien typename enable_if 374222747e62SLogan Chien < 374322747e62SLogan Chien !is_lvalue_reference<_Dp>::value && 374422747e62SLogan Chien !is_array<_Yp>::value && 374522747e62SLogan Chien is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 374622747e62SLogan Chien __nat 374722747e62SLogan Chien >::type = __nat()); 374822747e62SLogan Chien template <class _Yp, class _Dp> 374922747e62SLogan Chien shared_ptr(unique_ptr<_Yp, _Dp>, 375022747e62SLogan Chien typename enable_if 375122747e62SLogan Chien < 375222747e62SLogan Chien is_lvalue_reference<_Dp>::value && 375322747e62SLogan Chien !is_array<_Yp>::value && 375422747e62SLogan Chien is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 375522747e62SLogan Chien __nat 375622747e62SLogan Chien >::type = __nat()); 37577609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 37583e519524SHoward Hinnant 37593e519524SHoward Hinnant ~shared_ptr(); 37603e519524SHoward Hinnant 3761906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 37623739fe79SHoward Hinnant shared_ptr& operator=(const shared_ptr& __r) _NOEXCEPT; 37638e25104bSHoward Hinnant template<class _Yp> 37648e25104bSHoward Hinnant typename enable_if 37658e25104bSHoward Hinnant < 37668e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 37678e25104bSHoward Hinnant shared_ptr& 37688e25104bSHoward Hinnant >::type 3769906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 37708e25104bSHoward Hinnant operator=(const shared_ptr<_Yp>& __r) _NOEXCEPT; 37717609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 3772906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 37733739fe79SHoward Hinnant shared_ptr& operator=(shared_ptr&& __r) _NOEXCEPT; 37748e25104bSHoward Hinnant template<class _Yp> 37758e25104bSHoward Hinnant typename enable_if 37768e25104bSHoward Hinnant < 37778e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 37788e25104bSHoward Hinnant shared_ptr<_Tp>& 37798e25104bSHoward Hinnant >::type 3780906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 37818e25104bSHoward Hinnant operator=(shared_ptr<_Yp>&& __r); 3782e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR) 37838e25104bSHoward Hinnant template<class _Yp> 378489dd1dd2SEric Fiselier _LIBCPP_INLINE_VISIBILITY 37858e25104bSHoward Hinnant typename enable_if 37868e25104bSHoward Hinnant < 37878e25104bSHoward Hinnant !is_array<_Yp>::value && 37888e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 378984f996fbSHoward Hinnant shared_ptr 379084f996fbSHoward Hinnant >::type& 37918e25104bSHoward Hinnant operator=(auto_ptr<_Yp>&& __r); 3792e67179bcSMarshall Clow#endif 37937609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 3794e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR) 37958e25104bSHoward Hinnant template<class _Yp> 379689dd1dd2SEric Fiselier _LIBCPP_INLINE_VISIBILITY 37978e25104bSHoward Hinnant typename enable_if 37988e25104bSHoward Hinnant < 37998e25104bSHoward Hinnant !is_array<_Yp>::value && 38008e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 38018e25104bSHoward Hinnant shared_ptr& 38028e25104bSHoward Hinnant >::type 38038e25104bSHoward Hinnant operator=(auto_ptr<_Yp> __r); 38043e519524SHoward Hinnant#endif 3805e67179bcSMarshall Clow#endif 38068e25104bSHoward Hinnant template <class _Yp, class _Dp> 38078e25104bSHoward Hinnant typename enable_if 38088e25104bSHoward Hinnant < 38098e25104bSHoward Hinnant !is_array<_Yp>::value && 38108e25104bSHoward Hinnant is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 38118e25104bSHoward Hinnant shared_ptr& 38128e25104bSHoward Hinnant >::type 38137609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 3814906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 38158e25104bSHoward Hinnant operator=(unique_ptr<_Yp, _Dp>&& __r); 38167609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 381702b8e949SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 38188e25104bSHoward Hinnant operator=(unique_ptr<_Yp, _Dp> __r); 38193e519524SHoward Hinnant#endif 38203e519524SHoward Hinnant 3821906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 38223739fe79SHoward Hinnant void swap(shared_ptr& __r) _NOEXCEPT; 3823906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 38243739fe79SHoward Hinnant void reset() _NOEXCEPT; 38258e25104bSHoward Hinnant template<class _Yp> 38268e25104bSHoward Hinnant typename enable_if 38278e25104bSHoward Hinnant < 38288e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 38298e25104bSHoward Hinnant void 38308e25104bSHoward Hinnant >::type 3831906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 38328e25104bSHoward Hinnant reset(_Yp* __p); 38338e25104bSHoward Hinnant template<class _Yp, class _Dp> 38348e25104bSHoward Hinnant typename enable_if 38358e25104bSHoward Hinnant < 38368e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 38378e25104bSHoward Hinnant void 38388e25104bSHoward Hinnant >::type 3839906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 38408e25104bSHoward Hinnant reset(_Yp* __p, _Dp __d); 38418e25104bSHoward Hinnant template<class _Yp, class _Dp, class _Alloc> 38428e25104bSHoward Hinnant typename enable_if 38438e25104bSHoward Hinnant < 38448e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 38458e25104bSHoward Hinnant void 38468e25104bSHoward Hinnant >::type 3847906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 38488e25104bSHoward Hinnant reset(_Yp* __p, _Dp __d, _Alloc __a); 38493e519524SHoward Hinnant 3850848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 38513739fe79SHoward Hinnant element_type* get() const _NOEXCEPT {return __ptr_;} 3852848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 38533739fe79SHoward Hinnant typename add_lvalue_reference<element_type>::type operator*() const _NOEXCEPT 38543739fe79SHoward Hinnant {return *__ptr_;} 3855848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 38563739fe79SHoward Hinnant element_type* operator->() const _NOEXCEPT {return __ptr_;} 3857848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 38583739fe79SHoward Hinnant long use_count() const _NOEXCEPT {return __cntrl_ ? __cntrl_->use_count() : 0;} 3859848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 38603739fe79SHoward Hinnant bool unique() const _NOEXCEPT {return use_count() == 1;} 3861848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 3862f2f2d8b9SHoward Hinnant _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT {return get() != 0;} 3863c003db1fSHoward Hinnant template <class _Up> 3864848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 386536bc7178SMarshall Clow bool owner_before(shared_ptr<_Up> const& __p) const _NOEXCEPT 38663e519524SHoward Hinnant {return __cntrl_ < __p.__cntrl_;} 3867c003db1fSHoward Hinnant template <class _Up> 3868848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 386936bc7178SMarshall Clow bool owner_before(weak_ptr<_Up> const& __p) const _NOEXCEPT 38703e519524SHoward Hinnant {return __cntrl_ < __p.__cntrl_;} 3871d77851e8SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 3872d77851e8SHoward Hinnant bool 3873d77851e8SHoward Hinnant __owner_equivalent(const shared_ptr& __p) const 3874d77851e8SHoward Hinnant {return __cntrl_ == __p.__cntrl_;} 38753e519524SHoward Hinnant 387654b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI 38773e519524SHoward Hinnant template <class _Dp> 3878848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 38793739fe79SHoward Hinnant _Dp* __get_deleter() const _NOEXCEPT 38803e519524SHoward Hinnant {return (_Dp*)(__cntrl_ ? __cntrl_->__get_deleter(typeid(_Dp)) : 0);} 3881b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_RTTI 38823e519524SHoward Hinnant 38833e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 38843e519524SHoward Hinnant 38853e519524SHoward Hinnant template<class ..._Args> 38863e519524SHoward Hinnant static 38873e519524SHoward Hinnant shared_ptr<_Tp> 38883e519524SHoward Hinnant make_shared(_Args&& ...__args); 38893e519524SHoward Hinnant 38903e519524SHoward Hinnant template<class _Alloc, class ..._Args> 38913e519524SHoward Hinnant static 38923e519524SHoward Hinnant shared_ptr<_Tp> 38933e519524SHoward Hinnant allocate_shared(const _Alloc& __a, _Args&& ...__args); 38943e519524SHoward Hinnant 38953e519524SHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 38963e519524SHoward Hinnant 38973e519524SHoward Hinnant static shared_ptr<_Tp> make_shared(); 38983e519524SHoward Hinnant 38993e519524SHoward Hinnant template<class _A0> 39003e519524SHoward Hinnant static shared_ptr<_Tp> make_shared(_A0&); 39013e519524SHoward Hinnant 39023e519524SHoward Hinnant template<class _A0, class _A1> 39033e519524SHoward Hinnant static shared_ptr<_Tp> make_shared(_A0&, _A1&); 39043e519524SHoward Hinnant 39053e519524SHoward Hinnant template<class _A0, class _A1, class _A2> 39063e519524SHoward Hinnant static shared_ptr<_Tp> make_shared(_A0&, _A1&, _A2&); 39073e519524SHoward Hinnant 39083e519524SHoward Hinnant template<class _Alloc> 39093e519524SHoward Hinnant static shared_ptr<_Tp> 39103e519524SHoward Hinnant allocate_shared(const _Alloc& __a); 39113e519524SHoward Hinnant 39123e519524SHoward Hinnant template<class _Alloc, class _A0> 39133e519524SHoward Hinnant static shared_ptr<_Tp> 39143e519524SHoward Hinnant allocate_shared(const _Alloc& __a, _A0& __a0); 39153e519524SHoward Hinnant 39163e519524SHoward Hinnant template<class _Alloc, class _A0, class _A1> 39173e519524SHoward Hinnant static shared_ptr<_Tp> 39183e519524SHoward Hinnant allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1); 39193e519524SHoward Hinnant 39203e519524SHoward Hinnant template<class _Alloc, class _A0, class _A1, class _A2> 39213e519524SHoward Hinnant static shared_ptr<_Tp> 39223e519524SHoward Hinnant allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1, _A2& __a2); 39233e519524SHoward Hinnant 39243e519524SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 39253e519524SHoward Hinnant 39263e519524SHoward Hinnantprivate: 39273e519524SHoward Hinnant 392839005d30SEric Fiselier template <class _Yp, class _OrigPtr> 3929848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 39303e519524SHoward Hinnant void 393139005d30SEric Fiselier __enable_weak_this(const enable_shared_from_this<_Yp>* __e, 393239005d30SEric Fiselier _OrigPtr* __ptr) _NOEXCEPT 39333e519524SHoward Hinnant { 393439005d30SEric Fiselier typedef typename remove_cv<_Yp>::type _RawYp; 393588f5bfdcSEric Fiselier if (__e && __e->__weak_this_.expired()) 393655112defSMarshall Clow { 393739005d30SEric Fiselier __e->__weak_this_ = shared_ptr<_RawYp>(*this, 393839005d30SEric Fiselier const_cast<_RawYp*>(static_cast<const _Yp*>(__ptr))); 393955112defSMarshall Clow } 39403e519524SHoward Hinnant } 39413e519524SHoward Hinnant 3942848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 394339005d30SEric Fiselier void __enable_weak_this(const volatile void*, const volatile void*) _NOEXCEPT {} 39443e519524SHoward Hinnant 3945e2f2d1edSEric Fiselier template <class _Up> friend class _LIBCPP_TEMPLATE_VIS shared_ptr; 3946e2f2d1edSEric Fiselier template <class _Up> friend class _LIBCPP_TEMPLATE_VIS weak_ptr; 39473e519524SHoward Hinnant}; 39483e519524SHoward Hinnant 39493e519524SHoward Hinnanttemplate<class _Tp> 3950906c872dSEvgeniy Stepanovinline 3951c0937e8aSHoward Hinnant_LIBCPP_CONSTEXPR 39523739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr() _NOEXCEPT 39533e519524SHoward Hinnant : __ptr_(0), 39543e519524SHoward Hinnant __cntrl_(0) 39553e519524SHoward Hinnant{ 39563e519524SHoward Hinnant} 39573e519524SHoward Hinnant 39583e519524SHoward Hinnanttemplate<class _Tp> 3959906c872dSEvgeniy Stepanovinline 3960c0937e8aSHoward Hinnant_LIBCPP_CONSTEXPR 39613739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr(nullptr_t) _NOEXCEPT 39623e519524SHoward Hinnant : __ptr_(0), 39633e519524SHoward Hinnant __cntrl_(0) 39643e519524SHoward Hinnant{ 39653e519524SHoward Hinnant} 39663e519524SHoward Hinnant 39673e519524SHoward Hinnanttemplate<class _Tp> 396822747e62SLogan Chientemplate<class _Yp> 396922747e62SLogan Chienshared_ptr<_Tp>::shared_ptr(_Yp* __p, 397022747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type) 39713e519524SHoward Hinnant : __ptr_(__p) 39723e519524SHoward Hinnant{ 39733e519524SHoward Hinnant unique_ptr<_Yp> __hold(__p); 39743e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, default_delete<_Yp>, allocator<_Yp> > _CntrlBlk; 39753e519524SHoward Hinnant __cntrl_ = new _CntrlBlk(__p, default_delete<_Yp>(), allocator<_Yp>()); 39763e519524SHoward Hinnant __hold.release(); 397739005d30SEric Fiselier __enable_weak_this(__p, __p); 39783e519524SHoward Hinnant} 39793e519524SHoward Hinnant 39803e519524SHoward Hinnanttemplate<class _Tp> 398122747e62SLogan Chientemplate<class _Yp, class _Dp> 398222747e62SLogan Chienshared_ptr<_Tp>::shared_ptr(_Yp* __p, _Dp __d, 398322747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type) 39843e519524SHoward Hinnant : __ptr_(__p) 39853e519524SHoward Hinnant{ 39863e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 39873e519524SHoward Hinnant try 39883e519524SHoward Hinnant { 3989b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 39903e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, _Dp, allocator<_Yp> > _CntrlBlk; 39913e519524SHoward Hinnant __cntrl_ = new _CntrlBlk(__p, __d, allocator<_Yp>()); 399239005d30SEric Fiselier __enable_weak_this(__p, __p); 39933e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 39943e519524SHoward Hinnant } 39953e519524SHoward Hinnant catch (...) 39963e519524SHoward Hinnant { 39973e519524SHoward Hinnant __d(__p); 39983e519524SHoward Hinnant throw; 39993e519524SHoward Hinnant } 4000b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 40013e519524SHoward Hinnant} 40023e519524SHoward Hinnant 40033e519524SHoward Hinnanttemplate<class _Tp> 40043e519524SHoward Hinnanttemplate<class _Dp> 40053e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(nullptr_t __p, _Dp __d) 40063e519524SHoward Hinnant : __ptr_(0) 40073e519524SHoward Hinnant{ 40083e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 40093e519524SHoward Hinnant try 40103e519524SHoward Hinnant { 4011b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 40123e519524SHoward Hinnant typedef __shared_ptr_pointer<nullptr_t, _Dp, allocator<_Tp> > _CntrlBlk; 40133e519524SHoward Hinnant __cntrl_ = new _CntrlBlk(__p, __d, allocator<_Tp>()); 40143e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 40153e519524SHoward Hinnant } 40163e519524SHoward Hinnant catch (...) 40173e519524SHoward Hinnant { 40183e519524SHoward Hinnant __d(__p); 40193e519524SHoward Hinnant throw; 40203e519524SHoward Hinnant } 4021b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 40223e519524SHoward Hinnant} 40233e519524SHoward Hinnant 40243e519524SHoward Hinnanttemplate<class _Tp> 402522747e62SLogan Chientemplate<class _Yp, class _Dp, class _Alloc> 402622747e62SLogan Chienshared_ptr<_Tp>::shared_ptr(_Yp* __p, _Dp __d, _Alloc __a, 402722747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type) 40283e519524SHoward Hinnant : __ptr_(__p) 40293e519524SHoward Hinnant{ 40303e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 40313e519524SHoward Hinnant try 40323e519524SHoward Hinnant { 4033b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 40343e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, _Dp, _Alloc> _CntrlBlk; 4035319be722SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _A2; 40363e519524SHoward Hinnant typedef __allocator_destructor<_A2> _D2; 40373e519524SHoward Hinnant _A2 __a2(__a); 40383e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); 4039319be722SEric Fiselier ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4040319be722SEric Fiselier _CntrlBlk(__p, __d, __a); 4041319be722SEric Fiselier __cntrl_ = _VSTD::addressof(*__hold2.release()); 404239005d30SEric Fiselier __enable_weak_this(__p, __p); 40433e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 40443e519524SHoward Hinnant } 40453e519524SHoward Hinnant catch (...) 40463e519524SHoward Hinnant { 40473e519524SHoward Hinnant __d(__p); 40483e519524SHoward Hinnant throw; 40493e519524SHoward Hinnant } 4050b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 40513e519524SHoward Hinnant} 40523e519524SHoward Hinnant 40533e519524SHoward Hinnanttemplate<class _Tp> 40543e519524SHoward Hinnanttemplate<class _Dp, class _Alloc> 40553e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(nullptr_t __p, _Dp __d, _Alloc __a) 40563e519524SHoward Hinnant : __ptr_(0) 40573e519524SHoward Hinnant{ 40583e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 40593e519524SHoward Hinnant try 40603e519524SHoward Hinnant { 4061b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 40623e519524SHoward Hinnant typedef __shared_ptr_pointer<nullptr_t, _Dp, _Alloc> _CntrlBlk; 4063319be722SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _A2; 40643e519524SHoward Hinnant typedef __allocator_destructor<_A2> _D2; 40653e519524SHoward Hinnant _A2 __a2(__a); 40663e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); 4067319be722SEric Fiselier ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4068319be722SEric Fiselier _CntrlBlk(__p, __d, __a); 4069319be722SEric Fiselier __cntrl_ = _VSTD::addressof(*__hold2.release()); 40703e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 40713e519524SHoward Hinnant } 40723e519524SHoward Hinnant catch (...) 40733e519524SHoward Hinnant { 40743e519524SHoward Hinnant __d(__p); 40753e519524SHoward Hinnant throw; 40763e519524SHoward Hinnant } 4077b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 40783e519524SHoward Hinnant} 40793e519524SHoward Hinnant 40803e519524SHoward Hinnanttemplate<class _Tp> 40813e519524SHoward Hinnanttemplate<class _Yp> 4082906c872dSEvgeniy Stepanovinline 40833739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr(const shared_ptr<_Yp>& __r, element_type *__p) _NOEXCEPT 40843e519524SHoward Hinnant : __ptr_(__p), 40853e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 40863e519524SHoward Hinnant{ 40873e519524SHoward Hinnant if (__cntrl_) 40883e519524SHoward Hinnant __cntrl_->__add_shared(); 40893e519524SHoward Hinnant} 40903e519524SHoward Hinnant 40913e519524SHoward Hinnanttemplate<class _Tp> 4092906c872dSEvgeniy Stepanovinline 40933739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr(const shared_ptr& __r) _NOEXCEPT 40943e519524SHoward Hinnant : __ptr_(__r.__ptr_), 40953e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 40963e519524SHoward Hinnant{ 40973e519524SHoward Hinnant if (__cntrl_) 40983e519524SHoward Hinnant __cntrl_->__add_shared(); 40993e519524SHoward Hinnant} 41003e519524SHoward Hinnant 41013e519524SHoward Hinnanttemplate<class _Tp> 41023e519524SHoward Hinnanttemplate<class _Yp> 4103906c872dSEvgeniy Stepanovinline 41043e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(const shared_ptr<_Yp>& __r, 4105dc83e779SMarshall Clow typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type) 41063739fe79SHoward Hinnant _NOEXCEPT 41073e519524SHoward Hinnant : __ptr_(__r.__ptr_), 41083e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 41093e519524SHoward Hinnant{ 41103e519524SHoward Hinnant if (__cntrl_) 41113e519524SHoward Hinnant __cntrl_->__add_shared(); 41123e519524SHoward Hinnant} 41133e519524SHoward Hinnant 41147609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 41153e519524SHoward Hinnant 41163e519524SHoward Hinnanttemplate<class _Tp> 4117906c872dSEvgeniy Stepanovinline 41183739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr(shared_ptr&& __r) _NOEXCEPT 41193e519524SHoward Hinnant : __ptr_(__r.__ptr_), 41203e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 41213e519524SHoward Hinnant{ 41223e519524SHoward Hinnant __r.__ptr_ = 0; 41233e519524SHoward Hinnant __r.__cntrl_ = 0; 41243e519524SHoward Hinnant} 41253e519524SHoward Hinnant 41263e519524SHoward Hinnanttemplate<class _Tp> 41273e519524SHoward Hinnanttemplate<class _Yp> 4128906c872dSEvgeniy Stepanovinline 41293e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(shared_ptr<_Yp>&& __r, 4130dc83e779SMarshall Clow typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type) 41313739fe79SHoward Hinnant _NOEXCEPT 41323e519524SHoward Hinnant : __ptr_(__r.__ptr_), 41333e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 41343e519524SHoward Hinnant{ 41353e519524SHoward Hinnant __r.__ptr_ = 0; 41363e519524SHoward Hinnant __r.__cntrl_ = 0; 41373e519524SHoward Hinnant} 41383e519524SHoward Hinnant 41397609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 41403e519524SHoward Hinnant 4141e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR) 41423e519524SHoward Hinnanttemplate<class _Tp> 414322747e62SLogan Chientemplate<class _Yp> 41447609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 414522747e62SLogan Chienshared_ptr<_Tp>::shared_ptr(auto_ptr<_Yp>&& __r, 41463e519524SHoward Hinnant#else 414722747e62SLogan Chienshared_ptr<_Tp>::shared_ptr(auto_ptr<_Yp> __r, 41483e519524SHoward Hinnant#endif 414922747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type) 41503e519524SHoward Hinnant : __ptr_(__r.get()) 41513e519524SHoward Hinnant{ 41523e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, default_delete<_Yp>, allocator<_Yp> > _CntrlBlk; 41533e519524SHoward Hinnant __cntrl_ = new _CntrlBlk(__r.get(), default_delete<_Yp>(), allocator<_Yp>()); 415439005d30SEric Fiselier __enable_weak_this(__r.get(), __r.get()); 41553e519524SHoward Hinnant __r.release(); 41563e519524SHoward Hinnant} 4157e67179bcSMarshall Clow#endif 41583e519524SHoward Hinnant 41593e519524SHoward Hinnanttemplate<class _Tp> 416022747e62SLogan Chientemplate <class _Yp, class _Dp> 41617609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 41623e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp>&& __r, 41633e519524SHoward Hinnant#else 41643e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp> __r, 41653e519524SHoward Hinnant#endif 416622747e62SLogan Chien typename enable_if 416722747e62SLogan Chien < 416822747e62SLogan Chien !is_lvalue_reference<_Dp>::value && 416922747e62SLogan Chien !is_array<_Yp>::value && 417022747e62SLogan Chien is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 417122747e62SLogan Chien __nat 417222747e62SLogan Chien >::type) 41733e519524SHoward Hinnant : __ptr_(__r.get()) 41743e519524SHoward Hinnant{ 4175c34f847bSMarshall Clow#if _LIBCPP_STD_VER > 11 4176c34f847bSMarshall Clow if (__ptr_ == nullptr) 4177c34f847bSMarshall Clow __cntrl_ = nullptr; 4178c34f847bSMarshall Clow else 4179c34f847bSMarshall Clow#endif 4180c34f847bSMarshall Clow { 41813e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, _Dp, allocator<_Yp> > _CntrlBlk; 41823e519524SHoward Hinnant __cntrl_ = new _CntrlBlk(__r.get(), __r.get_deleter(), allocator<_Yp>()); 418339005d30SEric Fiselier __enable_weak_this(__r.get(), __r.get()); 4184c34f847bSMarshall Clow } 41853e519524SHoward Hinnant __r.release(); 41863e519524SHoward Hinnant} 41873e519524SHoward Hinnant 41883e519524SHoward Hinnanttemplate<class _Tp> 418922747e62SLogan Chientemplate <class _Yp, class _Dp> 41907609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 41913e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp>&& __r, 41923e519524SHoward Hinnant#else 41933e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp> __r, 41943e519524SHoward Hinnant#endif 419522747e62SLogan Chien typename enable_if 419622747e62SLogan Chien < 419722747e62SLogan Chien is_lvalue_reference<_Dp>::value && 419822747e62SLogan Chien !is_array<_Yp>::value && 419922747e62SLogan Chien is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 420022747e62SLogan Chien __nat 420122747e62SLogan Chien >::type) 42023e519524SHoward Hinnant : __ptr_(__r.get()) 42033e519524SHoward Hinnant{ 4204c34f847bSMarshall Clow#if _LIBCPP_STD_VER > 11 4205c34f847bSMarshall Clow if (__ptr_ == nullptr) 4206c34f847bSMarshall Clow __cntrl_ = nullptr; 4207c34f847bSMarshall Clow else 4208c34f847bSMarshall Clow#endif 4209c34f847bSMarshall Clow { 42103e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, 42113e519524SHoward Hinnant reference_wrapper<typename remove_reference<_Dp>::type>, 42123e519524SHoward Hinnant allocator<_Yp> > _CntrlBlk; 42133e519524SHoward Hinnant __cntrl_ = new _CntrlBlk(__r.get(), ref(__r.get_deleter()), allocator<_Yp>()); 421439005d30SEric Fiselier __enable_weak_this(__r.get(), __r.get()); 4215c34f847bSMarshall Clow } 42163e519524SHoward Hinnant __r.release(); 42173e519524SHoward Hinnant} 42183e519524SHoward Hinnant 42193e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 42203e519524SHoward Hinnant 42213e519524SHoward Hinnanttemplate<class _Tp> 42223e519524SHoward Hinnanttemplate<class ..._Args> 42233e519524SHoward Hinnantshared_ptr<_Tp> 42243e519524SHoward Hinnantshared_ptr<_Tp>::make_shared(_Args&& ...__args) 42253e519524SHoward Hinnant{ 42263e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 42273e519524SHoward Hinnant typedef allocator<_CntrlBlk> _A2; 42283e519524SHoward Hinnant typedef __allocator_destructor<_A2> _D2; 42293e519524SHoward Hinnant _A2 __a2; 42303e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); 4231ce48a113SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__a2, _VSTD::forward<_Args>(__args)...); 42323e519524SHoward Hinnant shared_ptr<_Tp> __r; 42333e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 42343e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 423539005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 42363e519524SHoward Hinnant return __r; 42373e519524SHoward Hinnant} 42383e519524SHoward Hinnant 42393e519524SHoward Hinnanttemplate<class _Tp> 42403e519524SHoward Hinnanttemplate<class _Alloc, class ..._Args> 42413e519524SHoward Hinnantshared_ptr<_Tp> 42423e519524SHoward Hinnantshared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _Args&& ...__args) 42433e519524SHoward Hinnant{ 42443e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 4245319be722SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _A2; 42463e519524SHoward Hinnant typedef __allocator_destructor<_A2> _D2; 42473e519524SHoward Hinnant _A2 __a2(__a); 42483e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); 4249319be722SEric Fiselier ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4250319be722SEric Fiselier _CntrlBlk(__a, _VSTD::forward<_Args>(__args)...); 42513e519524SHoward Hinnant shared_ptr<_Tp> __r; 42523e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 4253319be722SEric Fiselier __r.__cntrl_ = _VSTD::addressof(*__hold2.release()); 425439005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 42553e519524SHoward Hinnant return __r; 42563e519524SHoward Hinnant} 42573e519524SHoward Hinnant 42583e519524SHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 42593e519524SHoward Hinnant 42603e519524SHoward Hinnanttemplate<class _Tp> 42613e519524SHoward Hinnantshared_ptr<_Tp> 42623e519524SHoward Hinnantshared_ptr<_Tp>::make_shared() 42633e519524SHoward Hinnant{ 42643e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 42653e519524SHoward Hinnant typedef allocator<_CntrlBlk> _Alloc2; 42663e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 42673e519524SHoward Hinnant _Alloc2 __alloc2; 42683e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 42693e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__alloc2); 42703e519524SHoward Hinnant shared_ptr<_Tp> __r; 42713e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 42723e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 427339005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 42743e519524SHoward Hinnant return __r; 42753e519524SHoward Hinnant} 42763e519524SHoward Hinnant 42773e519524SHoward Hinnanttemplate<class _Tp> 42783e519524SHoward Hinnanttemplate<class _A0> 42793e519524SHoward Hinnantshared_ptr<_Tp> 42803e519524SHoward Hinnantshared_ptr<_Tp>::make_shared(_A0& __a0) 42813e519524SHoward Hinnant{ 42823e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 42833e519524SHoward Hinnant typedef allocator<_CntrlBlk> _Alloc2; 42843e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 42853e519524SHoward Hinnant _Alloc2 __alloc2; 42863e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 42873e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__alloc2, __a0); 42883e519524SHoward Hinnant shared_ptr<_Tp> __r; 42893e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 42903e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 429139005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 42923e519524SHoward Hinnant return __r; 42933e519524SHoward Hinnant} 42943e519524SHoward Hinnant 42953e519524SHoward Hinnanttemplate<class _Tp> 42963e519524SHoward Hinnanttemplate<class _A0, class _A1> 42973e519524SHoward Hinnantshared_ptr<_Tp> 42983e519524SHoward Hinnantshared_ptr<_Tp>::make_shared(_A0& __a0, _A1& __a1) 42993e519524SHoward Hinnant{ 43003e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 43013e519524SHoward Hinnant typedef allocator<_CntrlBlk> _Alloc2; 43023e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 43033e519524SHoward Hinnant _Alloc2 __alloc2; 43043e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 43053e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__alloc2, __a0, __a1); 43063e519524SHoward Hinnant shared_ptr<_Tp> __r; 43073e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 43083e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 430939005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 43103e519524SHoward Hinnant return __r; 43113e519524SHoward Hinnant} 43123e519524SHoward Hinnant 43133e519524SHoward Hinnanttemplate<class _Tp> 43143e519524SHoward Hinnanttemplate<class _A0, class _A1, class _A2> 43153e519524SHoward Hinnantshared_ptr<_Tp> 43163e519524SHoward Hinnantshared_ptr<_Tp>::make_shared(_A0& __a0, _A1& __a1, _A2& __a2) 43173e519524SHoward Hinnant{ 43183e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 43193e519524SHoward Hinnant typedef allocator<_CntrlBlk> _Alloc2; 43203e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 43213e519524SHoward Hinnant _Alloc2 __alloc2; 43223e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 43233e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__alloc2, __a0, __a1, __a2); 43243e519524SHoward Hinnant shared_ptr<_Tp> __r; 43253e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 43263e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 432739005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 43283e519524SHoward Hinnant return __r; 43293e519524SHoward Hinnant} 43303e519524SHoward Hinnant 43313e519524SHoward Hinnanttemplate<class _Tp> 43323e519524SHoward Hinnanttemplate<class _Alloc> 43333e519524SHoward Hinnantshared_ptr<_Tp> 43343e519524SHoward Hinnantshared_ptr<_Tp>::allocate_shared(const _Alloc& __a) 43353e519524SHoward Hinnant{ 43363e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 4337319be722SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _Alloc2; 43383e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 43393e519524SHoward Hinnant _Alloc2 __alloc2(__a); 43403e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 4341319be722SEric Fiselier ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4342319be722SEric Fiselier _CntrlBlk(__a); 43433e519524SHoward Hinnant shared_ptr<_Tp> __r; 43443e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 4345319be722SEric Fiselier __r.__cntrl_ = _VSTD::addressof(*__hold2.release()); 434639005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 43473e519524SHoward Hinnant return __r; 43483e519524SHoward Hinnant} 43493e519524SHoward Hinnant 43503e519524SHoward Hinnanttemplate<class _Tp> 43513e519524SHoward Hinnanttemplate<class _Alloc, class _A0> 43523e519524SHoward Hinnantshared_ptr<_Tp> 43533e519524SHoward Hinnantshared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _A0& __a0) 43543e519524SHoward Hinnant{ 43553e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 4356319be722SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _Alloc2; 43573e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 43583e519524SHoward Hinnant _Alloc2 __alloc2(__a); 43593e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 4360319be722SEric Fiselier ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4361319be722SEric Fiselier _CntrlBlk(__a, __a0); 43623e519524SHoward Hinnant shared_ptr<_Tp> __r; 43633e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 4364319be722SEric Fiselier __r.__cntrl_ = _VSTD::addressof(*__hold2.release()); 436539005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 43663e519524SHoward Hinnant return __r; 43673e519524SHoward Hinnant} 43683e519524SHoward Hinnant 43693e519524SHoward Hinnanttemplate<class _Tp> 43703e519524SHoward Hinnanttemplate<class _Alloc, class _A0, class _A1> 43713e519524SHoward Hinnantshared_ptr<_Tp> 43723e519524SHoward Hinnantshared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1) 43733e519524SHoward Hinnant{ 43743e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 4375319be722SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _Alloc2; 43763e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 43773e519524SHoward Hinnant _Alloc2 __alloc2(__a); 43783e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 4379319be722SEric Fiselier ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4380319be722SEric Fiselier _CntrlBlk(__a, __a0, __a1); 43813e519524SHoward Hinnant shared_ptr<_Tp> __r; 43823e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 4383319be722SEric Fiselier __r.__cntrl_ = _VSTD::addressof(*__hold2.release()); 438439005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 43853e519524SHoward Hinnant return __r; 43863e519524SHoward Hinnant} 43873e519524SHoward Hinnant 43883e519524SHoward Hinnanttemplate<class _Tp> 43893e519524SHoward Hinnanttemplate<class _Alloc, class _A0, class _A1, class _A2> 43903e519524SHoward Hinnantshared_ptr<_Tp> 43913e519524SHoward Hinnantshared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1, _A2& __a2) 43923e519524SHoward Hinnant{ 43933e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 4394319be722SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _Alloc2; 43953e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 43963e519524SHoward Hinnant _Alloc2 __alloc2(__a); 43973e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 4398319be722SEric Fiselier ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4399319be722SEric Fiselier _CntrlBlk(__a, __a0, __a1, __a2); 44003e519524SHoward Hinnant shared_ptr<_Tp> __r; 44013e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 4402319be722SEric Fiselier __r.__cntrl_ = _VSTD::addressof(*__hold2.release()); 440339005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 44043e519524SHoward Hinnant return __r; 44053e519524SHoward Hinnant} 44063e519524SHoward Hinnant 44073e519524SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 44083e519524SHoward Hinnant 44093e519524SHoward Hinnanttemplate<class _Tp> 44103e519524SHoward Hinnantshared_ptr<_Tp>::~shared_ptr() 44113e519524SHoward Hinnant{ 44123e519524SHoward Hinnant if (__cntrl_) 44133e519524SHoward Hinnant __cntrl_->__release_shared(); 44143e519524SHoward Hinnant} 44153e519524SHoward Hinnant 44163e519524SHoward Hinnanttemplate<class _Tp> 4417906c872dSEvgeniy Stepanovinline 44183e519524SHoward Hinnantshared_ptr<_Tp>& 44193739fe79SHoward Hinnantshared_ptr<_Tp>::operator=(const shared_ptr& __r) _NOEXCEPT 44203e519524SHoward Hinnant{ 44213e519524SHoward Hinnant shared_ptr(__r).swap(*this); 44223e519524SHoward Hinnant return *this; 44233e519524SHoward Hinnant} 44243e519524SHoward Hinnant 44253e519524SHoward Hinnanttemplate<class _Tp> 44263e519524SHoward Hinnanttemplate<class _Yp> 4427906c872dSEvgeniy Stepanovinline 44288e25104bSHoward Hinnanttypename enable_if 44298e25104bSHoward Hinnant< 4430dc83e779SMarshall Clow is_convertible<_Yp*, typename shared_ptr<_Tp>::element_type*>::value, 44313e519524SHoward Hinnant shared_ptr<_Tp>& 44328e25104bSHoward Hinnant>::type 44333739fe79SHoward Hinnantshared_ptr<_Tp>::operator=(const shared_ptr<_Yp>& __r) _NOEXCEPT 44343e519524SHoward Hinnant{ 44353e519524SHoward Hinnant shared_ptr(__r).swap(*this); 44363e519524SHoward Hinnant return *this; 44373e519524SHoward Hinnant} 44383e519524SHoward Hinnant 44397609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 44403e519524SHoward Hinnant 44413e519524SHoward Hinnanttemplate<class _Tp> 4442906c872dSEvgeniy Stepanovinline 44433e519524SHoward Hinnantshared_ptr<_Tp>& 44443739fe79SHoward Hinnantshared_ptr<_Tp>::operator=(shared_ptr&& __r) _NOEXCEPT 44453e519524SHoward Hinnant{ 4446ce48a113SHoward Hinnant shared_ptr(_VSTD::move(__r)).swap(*this); 44473e519524SHoward Hinnant return *this; 44483e519524SHoward Hinnant} 44493e519524SHoward Hinnant 44503e519524SHoward Hinnanttemplate<class _Tp> 44513e519524SHoward Hinnanttemplate<class _Yp> 4452906c872dSEvgeniy Stepanovinline 44538e25104bSHoward Hinnanttypename enable_if 44548e25104bSHoward Hinnant< 4455dc83e779SMarshall Clow is_convertible<_Yp*, typename shared_ptr<_Tp>::element_type*>::value, 44563e519524SHoward Hinnant shared_ptr<_Tp>& 44578e25104bSHoward Hinnant>::type 44583e519524SHoward Hinnantshared_ptr<_Tp>::operator=(shared_ptr<_Yp>&& __r) 44593e519524SHoward Hinnant{ 4460ce48a113SHoward Hinnant shared_ptr(_VSTD::move(__r)).swap(*this); 44613e519524SHoward Hinnant return *this; 44623e519524SHoward Hinnant} 44633e519524SHoward Hinnant 4464e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR) 44653e519524SHoward Hinnanttemplate<class _Tp> 44663e519524SHoward Hinnanttemplate<class _Yp> 4467906c872dSEvgeniy Stepanovinline 44688e25104bSHoward Hinnanttypename enable_if 44698e25104bSHoward Hinnant< 44708e25104bSHoward Hinnant !is_array<_Yp>::value && 4471dc83e779SMarshall Clow is_convertible<_Yp*, typename shared_ptr<_Tp>::element_type*>::value, 447284f996fbSHoward Hinnant shared_ptr<_Tp> 447384f996fbSHoward Hinnant>::type& 44743e519524SHoward Hinnantshared_ptr<_Tp>::operator=(auto_ptr<_Yp>&& __r) 44753e519524SHoward Hinnant{ 4476ce48a113SHoward Hinnant shared_ptr(_VSTD::move(__r)).swap(*this); 44773e519524SHoward Hinnant return *this; 44783e519524SHoward Hinnant} 4479e67179bcSMarshall Clow#endif 44803e519524SHoward Hinnant 44813e519524SHoward Hinnanttemplate<class _Tp> 44823e519524SHoward Hinnanttemplate <class _Yp, class _Dp> 4483906c872dSEvgeniy Stepanovinline 44848e25104bSHoward Hinnanttypename enable_if 44858e25104bSHoward Hinnant< 44868e25104bSHoward Hinnant !is_array<_Yp>::value && 4487dc83e779SMarshall Clow is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, 4488dc83e779SMarshall Clow typename shared_ptr<_Tp>::element_type*>::value, 44893e519524SHoward Hinnant shared_ptr<_Tp>& 44908e25104bSHoward Hinnant>::type 44913e519524SHoward Hinnantshared_ptr<_Tp>::operator=(unique_ptr<_Yp, _Dp>&& __r) 44923e519524SHoward Hinnant{ 4493ce48a113SHoward Hinnant shared_ptr(_VSTD::move(__r)).swap(*this); 44943e519524SHoward Hinnant return *this; 44953e519524SHoward Hinnant} 44963e519524SHoward Hinnant 44977609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 44983e519524SHoward Hinnant 4499e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR) 45003e519524SHoward Hinnanttemplate<class _Tp> 45013e519524SHoward Hinnanttemplate<class _Yp> 45023e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 45038e25104bSHoward Hinnanttypename enable_if 45048e25104bSHoward Hinnant< 45058e25104bSHoward Hinnant !is_array<_Yp>::value && 45063a6474ecSMarshall Clow is_convertible<_Yp*, typename shared_ptr<_Tp>::element_type*>::value, 45073e519524SHoward Hinnant shared_ptr<_Tp>& 45088e25104bSHoward Hinnant>::type 4509b3371f6fSHoward Hinnantshared_ptr<_Tp>::operator=(auto_ptr<_Yp> __r) 45103e519524SHoward Hinnant{ 45113e519524SHoward Hinnant shared_ptr(__r).swap(*this); 45123e519524SHoward Hinnant return *this; 45133e519524SHoward Hinnant} 4514e67179bcSMarshall Clow#endif 45153e519524SHoward Hinnant 45163e519524SHoward Hinnanttemplate<class _Tp> 45173e519524SHoward Hinnanttemplate <class _Yp, class _Dp> 45183e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 45198e25104bSHoward Hinnanttypename enable_if 45208e25104bSHoward Hinnant< 45218e25104bSHoward Hinnant !is_array<_Yp>::value && 45223a6474ecSMarshall Clow is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, 45233a6474ecSMarshall Clow typename shared_ptr<_Tp>::element_type*>::value, 45243e519524SHoward Hinnant shared_ptr<_Tp>& 45258e25104bSHoward Hinnant>::type 45263e519524SHoward Hinnantshared_ptr<_Tp>::operator=(unique_ptr<_Yp, _Dp> __r) 45273e519524SHoward Hinnant{ 4528ce48a113SHoward Hinnant shared_ptr(_VSTD::move(__r)).swap(*this); 45293e519524SHoward Hinnant return *this; 45303e519524SHoward Hinnant} 45313e519524SHoward Hinnant 45327609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 45333e519524SHoward Hinnant 45343e519524SHoward Hinnanttemplate<class _Tp> 4535906c872dSEvgeniy Stepanovinline 45363e519524SHoward Hinnantvoid 45373739fe79SHoward Hinnantshared_ptr<_Tp>::swap(shared_ptr& __r) _NOEXCEPT 45383e519524SHoward Hinnant{ 4539ce48a113SHoward Hinnant _VSTD::swap(__ptr_, __r.__ptr_); 4540ce48a113SHoward Hinnant _VSTD::swap(__cntrl_, __r.__cntrl_); 45413e519524SHoward Hinnant} 45423e519524SHoward Hinnant 45433e519524SHoward Hinnanttemplate<class _Tp> 4544906c872dSEvgeniy Stepanovinline 45453e519524SHoward Hinnantvoid 45463739fe79SHoward Hinnantshared_ptr<_Tp>::reset() _NOEXCEPT 45473e519524SHoward Hinnant{ 45483e519524SHoward Hinnant shared_ptr().swap(*this); 45493e519524SHoward Hinnant} 45503e519524SHoward Hinnant 45513e519524SHoward Hinnanttemplate<class _Tp> 45523e519524SHoward Hinnanttemplate<class _Yp> 4553906c872dSEvgeniy Stepanovinline 45548e25104bSHoward Hinnanttypename enable_if 45558e25104bSHoward Hinnant< 4556dc83e779SMarshall Clow is_convertible<_Yp*, typename shared_ptr<_Tp>::element_type*>::value, 45573e519524SHoward Hinnant void 45588e25104bSHoward Hinnant>::type 45593e519524SHoward Hinnantshared_ptr<_Tp>::reset(_Yp* __p) 45603e519524SHoward Hinnant{ 45613e519524SHoward Hinnant shared_ptr(__p).swap(*this); 45623e519524SHoward Hinnant} 45633e519524SHoward Hinnant 45643e519524SHoward Hinnanttemplate<class _Tp> 45653e519524SHoward Hinnanttemplate<class _Yp, class _Dp> 4566906c872dSEvgeniy Stepanovinline 45678e25104bSHoward Hinnanttypename enable_if 45688e25104bSHoward Hinnant< 4569dc83e779SMarshall Clow is_convertible<_Yp*, typename shared_ptr<_Tp>::element_type*>::value, 45703e519524SHoward Hinnant void 45718e25104bSHoward Hinnant>::type 45723e519524SHoward Hinnantshared_ptr<_Tp>::reset(_Yp* __p, _Dp __d) 45733e519524SHoward Hinnant{ 45743e519524SHoward Hinnant shared_ptr(__p, __d).swap(*this); 45753e519524SHoward Hinnant} 45763e519524SHoward Hinnant 45773e519524SHoward Hinnanttemplate<class _Tp> 45783e519524SHoward Hinnanttemplate<class _Yp, class _Dp, class _Alloc> 4579906c872dSEvgeniy Stepanovinline 45808e25104bSHoward Hinnanttypename enable_if 45818e25104bSHoward Hinnant< 4582dc83e779SMarshall Clow is_convertible<_Yp*, typename shared_ptr<_Tp>::element_type*>::value, 45833e519524SHoward Hinnant void 45848e25104bSHoward Hinnant>::type 45853e519524SHoward Hinnantshared_ptr<_Tp>::reset(_Yp* __p, _Dp __d, _Alloc __a) 45863e519524SHoward Hinnant{ 45873e519524SHoward Hinnant shared_ptr(__p, __d, __a).swap(*this); 45883e519524SHoward Hinnant} 45893e519524SHoward Hinnant 45903e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 45913e519524SHoward Hinnant 45923e519524SHoward Hinnanttemplate<class _Tp, class ..._Args> 45933e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 45948e25104bSHoward Hinnanttypename enable_if 45958e25104bSHoward Hinnant< 45968e25104bSHoward Hinnant !is_array<_Tp>::value, 45973e519524SHoward Hinnant shared_ptr<_Tp> 45988e25104bSHoward Hinnant>::type 45993e519524SHoward Hinnantmake_shared(_Args&& ...__args) 46003e519524SHoward Hinnant{ 4601ce48a113SHoward Hinnant return shared_ptr<_Tp>::make_shared(_VSTD::forward<_Args>(__args)...); 46023e519524SHoward Hinnant} 46033e519524SHoward Hinnant 46043e519524SHoward Hinnanttemplate<class _Tp, class _Alloc, 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 Hinnantallocate_shared(const _Alloc& __a, _Args&& ...__args) 46123e519524SHoward Hinnant{ 4613ce48a113SHoward Hinnant return shared_ptr<_Tp>::allocate_shared(__a, _VSTD::forward<_Args>(__args)...); 46143e519524SHoward Hinnant} 46153e519524SHoward Hinnant 46163e519524SHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 46173e519524SHoward Hinnant 46183e519524SHoward Hinnanttemplate<class _Tp> 46193e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 46203e519524SHoward Hinnantshared_ptr<_Tp> 46213e519524SHoward Hinnantmake_shared() 46223e519524SHoward Hinnant{ 46233e519524SHoward Hinnant return shared_ptr<_Tp>::make_shared(); 46243e519524SHoward Hinnant} 46253e519524SHoward Hinnant 46263e519524SHoward Hinnanttemplate<class _Tp, class _A0> 46273e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 46283e519524SHoward Hinnantshared_ptr<_Tp> 46293e519524SHoward Hinnantmake_shared(_A0& __a0) 46303e519524SHoward Hinnant{ 46313e519524SHoward Hinnant return shared_ptr<_Tp>::make_shared(__a0); 46323e519524SHoward Hinnant} 46333e519524SHoward Hinnant 46343e519524SHoward Hinnanttemplate<class _Tp, class _A0, class _A1> 46353e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 46363e519524SHoward Hinnantshared_ptr<_Tp> 46373e519524SHoward Hinnantmake_shared(_A0& __a0, _A1& __a1) 46383e519524SHoward Hinnant{ 46393e519524SHoward Hinnant return shared_ptr<_Tp>::make_shared(__a0, __a1); 46403e519524SHoward Hinnant} 46413e519524SHoward Hinnant 46423e519524SHoward Hinnanttemplate<class _Tp, class _A0, class _A1, class _A2> 46433e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 46443e519524SHoward Hinnantshared_ptr<_Tp> 46453e519524SHoward Hinnantmake_shared(_A0& __a0, _A1& __a1, _A2& __a2) 46463e519524SHoward Hinnant{ 46473e519524SHoward Hinnant return shared_ptr<_Tp>::make_shared(__a0, __a1, __a2); 46483e519524SHoward Hinnant} 46493e519524SHoward Hinnant 46503e519524SHoward Hinnanttemplate<class _Tp, class _Alloc> 46513e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 46523e519524SHoward Hinnantshared_ptr<_Tp> 46533e519524SHoward Hinnantallocate_shared(const _Alloc& __a) 46543e519524SHoward Hinnant{ 46553e519524SHoward Hinnant return shared_ptr<_Tp>::allocate_shared(__a); 46563e519524SHoward Hinnant} 46573e519524SHoward Hinnant 46583e519524SHoward Hinnanttemplate<class _Tp, class _Alloc, class _A0> 46593e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 46603e519524SHoward Hinnantshared_ptr<_Tp> 46613e519524SHoward Hinnantallocate_shared(const _Alloc& __a, _A0& __a0) 46623e519524SHoward Hinnant{ 46633e519524SHoward Hinnant return shared_ptr<_Tp>::allocate_shared(__a, __a0); 46643e519524SHoward Hinnant} 46653e519524SHoward Hinnant 46663e519524SHoward Hinnanttemplate<class _Tp, class _Alloc, class _A0, class _A1> 46673e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 46683e519524SHoward Hinnantshared_ptr<_Tp> 46693e519524SHoward Hinnantallocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1) 46703e519524SHoward Hinnant{ 46713e519524SHoward Hinnant return shared_ptr<_Tp>::allocate_shared(__a, __a0, __a1); 46723e519524SHoward Hinnant} 46733e519524SHoward Hinnant 46743e519524SHoward Hinnanttemplate<class _Tp, class _Alloc, class _A0, class _A1, class _A2> 46753e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 46763e519524SHoward Hinnantshared_ptr<_Tp> 46773e519524SHoward Hinnantallocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1, _A2& __a2) 46783e519524SHoward Hinnant{ 46793e519524SHoward Hinnant return shared_ptr<_Tp>::allocate_shared(__a, __a0, __a1, __a2); 46803e519524SHoward Hinnant} 46813e519524SHoward Hinnant 46823e519524SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 46833e519524SHoward Hinnant 46843e519524SHoward Hinnanttemplate<class _Tp, class _Up> 46853e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 46863e519524SHoward Hinnantbool 46873739fe79SHoward Hinnantoperator==(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 46883e519524SHoward Hinnant{ 46893e519524SHoward Hinnant return __x.get() == __y.get(); 46903e519524SHoward Hinnant} 46913e519524SHoward Hinnant 46923e519524SHoward Hinnanttemplate<class _Tp, class _Up> 46933e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 46943e519524SHoward Hinnantbool 46953739fe79SHoward Hinnantoperator!=(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 46963e519524SHoward Hinnant{ 46973e519524SHoward Hinnant return !(__x == __y); 46983e519524SHoward Hinnant} 46993e519524SHoward Hinnant 47003e519524SHoward Hinnanttemplate<class _Tp, class _Up> 47013e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 47023e519524SHoward Hinnantbool 47033739fe79SHoward Hinnantoperator<(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 47043e519524SHoward Hinnant{ 47056fe361c1SEric Fiselier typedef typename common_type<_Tp*, _Up*>::type _Vp; 47066fe361c1SEric Fiselier return less<_Vp>()(__x.get(), __y.get()); 470767f39647SHoward Hinnant} 470867f39647SHoward Hinnant 470967f39647SHoward Hinnanttemplate<class _Tp, class _Up> 471067f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 471167f39647SHoward Hinnantbool 471267f39647SHoward Hinnantoperator>(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 471367f39647SHoward Hinnant{ 471467f39647SHoward Hinnant return __y < __x; 471567f39647SHoward Hinnant} 471667f39647SHoward Hinnant 471767f39647SHoward Hinnanttemplate<class _Tp, class _Up> 471867f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 471967f39647SHoward Hinnantbool 472067f39647SHoward Hinnantoperator<=(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 472167f39647SHoward Hinnant{ 472267f39647SHoward Hinnant return !(__y < __x); 472367f39647SHoward Hinnant} 472467f39647SHoward Hinnant 472567f39647SHoward Hinnanttemplate<class _Tp, class _Up> 472667f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 472767f39647SHoward Hinnantbool 472867f39647SHoward Hinnantoperator>=(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 472967f39647SHoward Hinnant{ 473067f39647SHoward Hinnant return !(__x < __y); 473167f39647SHoward Hinnant} 473267f39647SHoward Hinnant 473367f39647SHoward Hinnanttemplate<class _Tp> 473467f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 473567f39647SHoward Hinnantbool 473667f39647SHoward Hinnantoperator==(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 473767f39647SHoward Hinnant{ 473867f39647SHoward Hinnant return !__x; 473967f39647SHoward Hinnant} 474067f39647SHoward Hinnant 474167f39647SHoward Hinnanttemplate<class _Tp> 474267f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 474367f39647SHoward Hinnantbool 474467f39647SHoward Hinnantoperator==(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 474567f39647SHoward Hinnant{ 474667f39647SHoward Hinnant return !__x; 474767f39647SHoward Hinnant} 474867f39647SHoward Hinnant 474967f39647SHoward Hinnanttemplate<class _Tp> 475067f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 475167f39647SHoward Hinnantbool 475267f39647SHoward Hinnantoperator!=(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 475367f39647SHoward Hinnant{ 475467f39647SHoward Hinnant return static_cast<bool>(__x); 475567f39647SHoward Hinnant} 475667f39647SHoward Hinnant 475767f39647SHoward Hinnanttemplate<class _Tp> 475867f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 475967f39647SHoward Hinnantbool 476067f39647SHoward Hinnantoperator!=(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 476167f39647SHoward Hinnant{ 476267f39647SHoward Hinnant return static_cast<bool>(__x); 476367f39647SHoward Hinnant} 476467f39647SHoward Hinnant 476567f39647SHoward Hinnanttemplate<class _Tp> 476667f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 476767f39647SHoward Hinnantbool 476867f39647SHoward Hinnantoperator<(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 476967f39647SHoward Hinnant{ 477067f39647SHoward Hinnant return less<_Tp*>()(__x.get(), nullptr); 477167f39647SHoward Hinnant} 477267f39647SHoward Hinnant 477367f39647SHoward Hinnanttemplate<class _Tp> 477467f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 477567f39647SHoward Hinnantbool 477667f39647SHoward Hinnantoperator<(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 477767f39647SHoward Hinnant{ 477867f39647SHoward Hinnant return less<_Tp*>()(nullptr, __x.get()); 477967f39647SHoward Hinnant} 478067f39647SHoward Hinnant 478167f39647SHoward Hinnanttemplate<class _Tp> 478267f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 478367f39647SHoward Hinnantbool 478467f39647SHoward Hinnantoperator>(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 478567f39647SHoward Hinnant{ 478667f39647SHoward Hinnant return nullptr < __x; 478767f39647SHoward Hinnant} 478867f39647SHoward Hinnant 478967f39647SHoward Hinnanttemplate<class _Tp> 479067f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 479167f39647SHoward Hinnantbool 479267f39647SHoward Hinnantoperator>(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 479367f39647SHoward Hinnant{ 479467f39647SHoward Hinnant return __x < nullptr; 479567f39647SHoward Hinnant} 479667f39647SHoward Hinnant 479767f39647SHoward Hinnanttemplate<class _Tp> 479867f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 479967f39647SHoward Hinnantbool 480067f39647SHoward Hinnantoperator<=(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 480167f39647SHoward Hinnant{ 480267f39647SHoward Hinnant return !(nullptr < __x); 480367f39647SHoward Hinnant} 480467f39647SHoward Hinnant 480567f39647SHoward Hinnanttemplate<class _Tp> 480667f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 480767f39647SHoward Hinnantbool 480867f39647SHoward Hinnantoperator<=(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 480967f39647SHoward Hinnant{ 481067f39647SHoward Hinnant return !(__x < nullptr); 481167f39647SHoward Hinnant} 481267f39647SHoward Hinnant 481367f39647SHoward Hinnanttemplate<class _Tp> 481467f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 481567f39647SHoward Hinnantbool 481667f39647SHoward Hinnantoperator>=(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 481767f39647SHoward Hinnant{ 481867f39647SHoward Hinnant return !(__x < nullptr); 481967f39647SHoward Hinnant} 482067f39647SHoward Hinnant 482167f39647SHoward Hinnanttemplate<class _Tp> 482267f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 482367f39647SHoward Hinnantbool 482467f39647SHoward Hinnantoperator>=(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 482567f39647SHoward Hinnant{ 482667f39647SHoward Hinnant return !(nullptr < __x); 48273e519524SHoward Hinnant} 48283e519524SHoward Hinnant 48293e519524SHoward Hinnanttemplate<class _Tp> 48303e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 48313e519524SHoward Hinnantvoid 48323739fe79SHoward Hinnantswap(shared_ptr<_Tp>& __x, shared_ptr<_Tp>& __y) _NOEXCEPT 48333e519524SHoward Hinnant{ 48343e519524SHoward Hinnant __x.swap(__y); 48353e519524SHoward Hinnant} 48363e519524SHoward Hinnant 48373e519524SHoward Hinnanttemplate<class _Tp, class _Up> 48383e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 48398e25104bSHoward Hinnanttypename enable_if 48408e25104bSHoward Hinnant< 48418e25104bSHoward Hinnant !is_array<_Tp>::value && !is_array<_Up>::value, 48423e519524SHoward Hinnant shared_ptr<_Tp> 48438e25104bSHoward Hinnant>::type 48443739fe79SHoward Hinnantstatic_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT 48453e519524SHoward Hinnant{ 48463e519524SHoward Hinnant return shared_ptr<_Tp>(__r, static_cast<_Tp*>(__r.get())); 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 Hinnantdynamic_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT 48573e519524SHoward Hinnant{ 48583e519524SHoward Hinnant _Tp* __p = dynamic_cast<_Tp*>(__r.get()); 48593e519524SHoward Hinnant return __p ? shared_ptr<_Tp>(__r, __p) : shared_ptr<_Tp>(); 48603e519524SHoward Hinnant} 48613e519524SHoward Hinnant 48623e519524SHoward Hinnanttemplate<class _Tp, class _Up> 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 Hinnantconst_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT 48693e519524SHoward Hinnant{ 48708e25104bSHoward Hinnant typedef typename remove_extent<_Tp>::type _RTp; 48718e25104bSHoward Hinnant return shared_ptr<_Tp>(__r, const_cast<_RTp*>(__r.get())); 48723e519524SHoward Hinnant} 48733e519524SHoward Hinnant 487454b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI 487554b409fdSHoward Hinnant 48763e519524SHoward Hinnanttemplate<class _Dp, class _Tp> 48773e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 48783e519524SHoward Hinnant_Dp* 48793739fe79SHoward Hinnantget_deleter(const shared_ptr<_Tp>& __p) _NOEXCEPT 48803e519524SHoward Hinnant{ 48813e519524SHoward Hinnant return __p.template __get_deleter<_Dp>(); 48823e519524SHoward Hinnant} 48833e519524SHoward Hinnant 4884b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_RTTI 488554b409fdSHoward Hinnant 48863e519524SHoward Hinnanttemplate<class _Tp> 4887e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS weak_ptr 48883e519524SHoward Hinnant{ 48893e519524SHoward Hinnantpublic: 48903e519524SHoward Hinnant typedef _Tp element_type; 48913e519524SHoward Hinnantprivate: 48923e519524SHoward Hinnant element_type* __ptr_; 48933e519524SHoward Hinnant __shared_weak_count* __cntrl_; 48943e519524SHoward Hinnant 48953e519524SHoward Hinnantpublic: 4896906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 4897c0937e8aSHoward Hinnant _LIBCPP_CONSTEXPR weak_ptr() _NOEXCEPT; 4898906c872dSEvgeniy Stepanov template<class _Yp> _LIBCPP_INLINE_VISIBILITY weak_ptr(shared_ptr<_Yp> const& __r, 48993739fe79SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0) 49003739fe79SHoward Hinnant _NOEXCEPT; 4901906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 49023739fe79SHoward Hinnant weak_ptr(weak_ptr const& __r) _NOEXCEPT; 4903906c872dSEvgeniy Stepanov template<class _Yp> _LIBCPP_INLINE_VISIBILITY weak_ptr(weak_ptr<_Yp> const& __r, 49043739fe79SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0) 49053739fe79SHoward Hinnant _NOEXCEPT; 49063e519524SHoward Hinnant 49078e25104bSHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 4908906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 49098e25104bSHoward Hinnant weak_ptr(weak_ptr&& __r) _NOEXCEPT; 4910906c872dSEvgeniy Stepanov template<class _Yp> _LIBCPP_INLINE_VISIBILITY weak_ptr(weak_ptr<_Yp>&& __r, 49118e25104bSHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0) 49128e25104bSHoward Hinnant _NOEXCEPT; 49138e25104bSHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 49143e519524SHoward Hinnant ~weak_ptr(); 49153e519524SHoward Hinnant 4916906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 49173739fe79SHoward Hinnant weak_ptr& operator=(weak_ptr const& __r) _NOEXCEPT; 49188e25104bSHoward Hinnant template<class _Yp> 49198e25104bSHoward Hinnant typename enable_if 49208e25104bSHoward Hinnant < 49218e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 49228e25104bSHoward Hinnant weak_ptr& 49238e25104bSHoward Hinnant >::type 4924906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 49258e25104bSHoward Hinnant operator=(weak_ptr<_Yp> const& __r) _NOEXCEPT; 49268e25104bSHoward Hinnant 49278e25104bSHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 49288e25104bSHoward Hinnant 4929906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 49308e25104bSHoward Hinnant weak_ptr& operator=(weak_ptr&& __r) _NOEXCEPT; 49318e25104bSHoward Hinnant template<class _Yp> 49328e25104bSHoward Hinnant typename enable_if 49338e25104bSHoward Hinnant < 49348e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 49358e25104bSHoward Hinnant weak_ptr& 49368e25104bSHoward Hinnant >::type 4937906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 49388e25104bSHoward Hinnant operator=(weak_ptr<_Yp>&& __r) _NOEXCEPT; 49398e25104bSHoward Hinnant 49408e25104bSHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 49418e25104bSHoward Hinnant 49428e25104bSHoward Hinnant template<class _Yp> 49438e25104bSHoward Hinnant typename enable_if 49448e25104bSHoward Hinnant < 49458e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 49468e25104bSHoward Hinnant weak_ptr& 49478e25104bSHoward Hinnant >::type 4948906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 49498e25104bSHoward Hinnant operator=(shared_ptr<_Yp> const& __r) _NOEXCEPT; 49503e519524SHoward Hinnant 4951906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 49523739fe79SHoward Hinnant void swap(weak_ptr& __r) _NOEXCEPT; 4953906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 49543739fe79SHoward Hinnant void reset() _NOEXCEPT; 49553e519524SHoward Hinnant 4956848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 49573739fe79SHoward Hinnant long use_count() const _NOEXCEPT 49583739fe79SHoward Hinnant {return __cntrl_ ? __cntrl_->use_count() : 0;} 4959848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 49603739fe79SHoward Hinnant bool expired() const _NOEXCEPT 49613739fe79SHoward Hinnant {return __cntrl_ == 0 || __cntrl_->use_count() == 0;} 49623739fe79SHoward Hinnant shared_ptr<_Tp> lock() const _NOEXCEPT; 4963848a5374SHoward Hinnant template<class _Up> 4964848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 496536bc7178SMarshall Clow bool owner_before(const shared_ptr<_Up>& __r) const _NOEXCEPT 49663e519524SHoward Hinnant {return __cntrl_ < __r.__cntrl_;} 4967848a5374SHoward Hinnant template<class _Up> 4968848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 496936bc7178SMarshall Clow bool owner_before(const weak_ptr<_Up>& __r) const _NOEXCEPT 49703e519524SHoward Hinnant {return __cntrl_ < __r.__cntrl_;} 49713e519524SHoward Hinnant 4972e2f2d1edSEric Fiselier template <class _Up> friend class _LIBCPP_TEMPLATE_VIS weak_ptr; 4973e2f2d1edSEric Fiselier template <class _Up> friend class _LIBCPP_TEMPLATE_VIS shared_ptr; 49743e519524SHoward Hinnant}; 49753e519524SHoward Hinnant 49763e519524SHoward Hinnanttemplate<class _Tp> 4977906c872dSEvgeniy Stepanovinline 4978c0937e8aSHoward Hinnant_LIBCPP_CONSTEXPR 49793739fe79SHoward Hinnantweak_ptr<_Tp>::weak_ptr() _NOEXCEPT 49803e519524SHoward Hinnant : __ptr_(0), 49813e519524SHoward Hinnant __cntrl_(0) 49823e519524SHoward Hinnant{ 49833e519524SHoward Hinnant} 49843e519524SHoward Hinnant 49853e519524SHoward Hinnanttemplate<class _Tp> 4986906c872dSEvgeniy Stepanovinline 49873739fe79SHoward Hinnantweak_ptr<_Tp>::weak_ptr(weak_ptr const& __r) _NOEXCEPT 49883e519524SHoward Hinnant : __ptr_(__r.__ptr_), 49893e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 49903e519524SHoward Hinnant{ 49913e519524SHoward Hinnant if (__cntrl_) 49923e519524SHoward Hinnant __cntrl_->__add_weak(); 49933e519524SHoward Hinnant} 49943e519524SHoward Hinnant 49953e519524SHoward Hinnanttemplate<class _Tp> 49963e519524SHoward Hinnanttemplate<class _Yp> 4997906c872dSEvgeniy Stepanovinline 49983e519524SHoward Hinnantweak_ptr<_Tp>::weak_ptr(shared_ptr<_Yp> const& __r, 49995eb6bdfaSHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type) 50003739fe79SHoward Hinnant _NOEXCEPT 50013e519524SHoward Hinnant : __ptr_(__r.__ptr_), 50023e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 50033e519524SHoward Hinnant{ 50043e519524SHoward Hinnant if (__cntrl_) 50053e519524SHoward Hinnant __cntrl_->__add_weak(); 50063e519524SHoward Hinnant} 50073e519524SHoward Hinnant 50083e519524SHoward Hinnanttemplate<class _Tp> 50093e519524SHoward Hinnanttemplate<class _Yp> 5010906c872dSEvgeniy Stepanovinline 50113e519524SHoward Hinnantweak_ptr<_Tp>::weak_ptr(weak_ptr<_Yp> const& __r, 50125eb6bdfaSHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type) 50133739fe79SHoward Hinnant _NOEXCEPT 50143e519524SHoward Hinnant : __ptr_(__r.__ptr_), 50153e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 50163e519524SHoward Hinnant{ 50173e519524SHoward Hinnant if (__cntrl_) 50183e519524SHoward Hinnant __cntrl_->__add_weak(); 50193e519524SHoward Hinnant} 50203e519524SHoward Hinnant 50218e25104bSHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 50228e25104bSHoward Hinnant 50238e25104bSHoward Hinnanttemplate<class _Tp> 5024906c872dSEvgeniy Stepanovinline 50258e25104bSHoward Hinnantweak_ptr<_Tp>::weak_ptr(weak_ptr&& __r) _NOEXCEPT 50268e25104bSHoward Hinnant : __ptr_(__r.__ptr_), 50278e25104bSHoward Hinnant __cntrl_(__r.__cntrl_) 50288e25104bSHoward Hinnant{ 50298e25104bSHoward Hinnant __r.__ptr_ = 0; 50308e25104bSHoward Hinnant __r.__cntrl_ = 0; 50318e25104bSHoward Hinnant} 50328e25104bSHoward Hinnant 50338e25104bSHoward Hinnanttemplate<class _Tp> 50348e25104bSHoward Hinnanttemplate<class _Yp> 5035906c872dSEvgeniy Stepanovinline 50368e25104bSHoward Hinnantweak_ptr<_Tp>::weak_ptr(weak_ptr<_Yp>&& __r, 50378e25104bSHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type) 50388e25104bSHoward Hinnant _NOEXCEPT 50398e25104bSHoward Hinnant : __ptr_(__r.__ptr_), 50408e25104bSHoward Hinnant __cntrl_(__r.__cntrl_) 50418e25104bSHoward Hinnant{ 50428e25104bSHoward Hinnant __r.__ptr_ = 0; 50438e25104bSHoward Hinnant __r.__cntrl_ = 0; 50448e25104bSHoward Hinnant} 50458e25104bSHoward Hinnant 50468e25104bSHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 50478e25104bSHoward Hinnant 50483e519524SHoward Hinnanttemplate<class _Tp> 50493e519524SHoward Hinnantweak_ptr<_Tp>::~weak_ptr() 50503e519524SHoward Hinnant{ 50513e519524SHoward Hinnant if (__cntrl_) 50523e519524SHoward Hinnant __cntrl_->__release_weak(); 50533e519524SHoward Hinnant} 50543e519524SHoward Hinnant 50553e519524SHoward Hinnanttemplate<class _Tp> 5056906c872dSEvgeniy Stepanovinline 50573e519524SHoward Hinnantweak_ptr<_Tp>& 50583739fe79SHoward Hinnantweak_ptr<_Tp>::operator=(weak_ptr const& __r) _NOEXCEPT 50593e519524SHoward Hinnant{ 50603e519524SHoward Hinnant weak_ptr(__r).swap(*this); 50613e519524SHoward Hinnant return *this; 50623e519524SHoward Hinnant} 50633e519524SHoward Hinnant 50643e519524SHoward Hinnanttemplate<class _Tp> 50653e519524SHoward Hinnanttemplate<class _Yp> 5066906c872dSEvgeniy Stepanovinline 50678e25104bSHoward Hinnanttypename enable_if 50688e25104bSHoward Hinnant< 50698e25104bSHoward Hinnant is_convertible<_Yp*, _Tp*>::value, 50703e519524SHoward Hinnant weak_ptr<_Tp>& 50718e25104bSHoward Hinnant>::type 50723739fe79SHoward Hinnantweak_ptr<_Tp>::operator=(weak_ptr<_Yp> const& __r) _NOEXCEPT 50733e519524SHoward Hinnant{ 50743e519524SHoward Hinnant weak_ptr(__r).swap(*this); 50753e519524SHoward Hinnant return *this; 50763e519524SHoward Hinnant} 50773e519524SHoward Hinnant 50788e25104bSHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 50798e25104bSHoward Hinnant 50808e25104bSHoward Hinnanttemplate<class _Tp> 5081906c872dSEvgeniy Stepanovinline 50828e25104bSHoward Hinnantweak_ptr<_Tp>& 50838e25104bSHoward Hinnantweak_ptr<_Tp>::operator=(weak_ptr&& __r) _NOEXCEPT 50848e25104bSHoward Hinnant{ 50858e25104bSHoward Hinnant weak_ptr(_VSTD::move(__r)).swap(*this); 50868e25104bSHoward Hinnant return *this; 50878e25104bSHoward Hinnant} 50888e25104bSHoward Hinnant 50893e519524SHoward Hinnanttemplate<class _Tp> 50903e519524SHoward Hinnanttemplate<class _Yp> 5091906c872dSEvgeniy Stepanovinline 50928e25104bSHoward Hinnanttypename enable_if 50938e25104bSHoward Hinnant< 50948e25104bSHoward Hinnant is_convertible<_Yp*, _Tp*>::value, 50953e519524SHoward Hinnant weak_ptr<_Tp>& 50968e25104bSHoward Hinnant>::type 50978e25104bSHoward Hinnantweak_ptr<_Tp>::operator=(weak_ptr<_Yp>&& __r) _NOEXCEPT 50988e25104bSHoward Hinnant{ 50998e25104bSHoward Hinnant weak_ptr(_VSTD::move(__r)).swap(*this); 51008e25104bSHoward Hinnant return *this; 51018e25104bSHoward Hinnant} 51028e25104bSHoward Hinnant 51038e25104bSHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 51048e25104bSHoward Hinnant 51058e25104bSHoward Hinnanttemplate<class _Tp> 51068e25104bSHoward Hinnanttemplate<class _Yp> 5107906c872dSEvgeniy Stepanovinline 51088e25104bSHoward Hinnanttypename enable_if 51098e25104bSHoward Hinnant< 51108e25104bSHoward Hinnant is_convertible<_Yp*, _Tp*>::value, 51118e25104bSHoward Hinnant weak_ptr<_Tp>& 51128e25104bSHoward Hinnant>::type 51133739fe79SHoward Hinnantweak_ptr<_Tp>::operator=(shared_ptr<_Yp> const& __r) _NOEXCEPT 51143e519524SHoward Hinnant{ 51153e519524SHoward Hinnant weak_ptr(__r).swap(*this); 51163e519524SHoward Hinnant return *this; 51173e519524SHoward Hinnant} 51183e519524SHoward Hinnant 51193e519524SHoward Hinnanttemplate<class _Tp> 5120906c872dSEvgeniy Stepanovinline 51213e519524SHoward Hinnantvoid 51223739fe79SHoward Hinnantweak_ptr<_Tp>::swap(weak_ptr& __r) _NOEXCEPT 51233e519524SHoward Hinnant{ 5124ce48a113SHoward Hinnant _VSTD::swap(__ptr_, __r.__ptr_); 5125ce48a113SHoward Hinnant _VSTD::swap(__cntrl_, __r.__cntrl_); 51263e519524SHoward Hinnant} 51273e519524SHoward Hinnant 51283e519524SHoward Hinnanttemplate<class _Tp> 51293e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 51303e519524SHoward Hinnantvoid 51313739fe79SHoward Hinnantswap(weak_ptr<_Tp>& __x, weak_ptr<_Tp>& __y) _NOEXCEPT 51323e519524SHoward Hinnant{ 51333e519524SHoward Hinnant __x.swap(__y); 51343e519524SHoward Hinnant} 51353e519524SHoward Hinnant 51363e519524SHoward Hinnanttemplate<class _Tp> 5137906c872dSEvgeniy Stepanovinline 51383e519524SHoward Hinnantvoid 51393739fe79SHoward Hinnantweak_ptr<_Tp>::reset() _NOEXCEPT 51403e519524SHoward Hinnant{ 51413e519524SHoward Hinnant weak_ptr().swap(*this); 51423e519524SHoward Hinnant} 51433e519524SHoward Hinnant 51443e519524SHoward Hinnanttemplate<class _Tp> 51453e519524SHoward Hinnanttemplate<class _Yp> 51463e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(const weak_ptr<_Yp>& __r, 5147dc83e779SMarshall Clow typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type) 51483e519524SHoward Hinnant : __ptr_(__r.__ptr_), 51493e519524SHoward Hinnant __cntrl_(__r.__cntrl_ ? __r.__cntrl_->lock() : __r.__cntrl_) 51503e519524SHoward Hinnant{ 51513e519524SHoward Hinnant if (__cntrl_ == 0) 5152d437fa5cSMarshall Clow __throw_bad_weak_ptr(); 51533e519524SHoward Hinnant} 51543e519524SHoward Hinnant 51553e519524SHoward Hinnanttemplate<class _Tp> 51563e519524SHoward Hinnantshared_ptr<_Tp> 51573739fe79SHoward Hinnantweak_ptr<_Tp>::lock() const _NOEXCEPT 51583e519524SHoward Hinnant{ 51593e519524SHoward Hinnant shared_ptr<_Tp> __r; 51603e519524SHoward Hinnant __r.__cntrl_ = __cntrl_ ? __cntrl_->lock() : __cntrl_; 51613e519524SHoward Hinnant if (__r.__cntrl_) 51623e519524SHoward Hinnant __r.__ptr_ = __ptr_; 51633e519524SHoward Hinnant return __r; 51643e519524SHoward Hinnant} 51653e519524SHoward Hinnant 5166183c010cSMarshall Clow#if _LIBCPP_STD_VER > 14 5167183c010cSMarshall Clowtemplate <class _Tp = void> struct owner_less; 5168183c010cSMarshall Clow#else 51693e519524SHoward Hinnanttemplate <class _Tp> struct owner_less; 5170183c010cSMarshall Clow#endif 51713e519524SHoward Hinnant 51723e519524SHoward Hinnanttemplate <class _Tp> 5173e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS owner_less<shared_ptr<_Tp> > 51743e519524SHoward Hinnant : binary_function<shared_ptr<_Tp>, shared_ptr<_Tp>, bool> 51753e519524SHoward Hinnant{ 51763e519524SHoward Hinnant typedef bool result_type; 5177848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 517836bc7178SMarshall Clow bool operator()(shared_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const _NOEXCEPT 51793e519524SHoward Hinnant {return __x.owner_before(__y);} 5180848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 518136bc7178SMarshall Clow bool operator()(shared_ptr<_Tp> const& __x, weak_ptr<_Tp> const& __y) const _NOEXCEPT 51823e519524SHoward Hinnant {return __x.owner_before(__y);} 5183848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 518436bc7178SMarshall Clow bool operator()( weak_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const _NOEXCEPT 51853e519524SHoward Hinnant {return __x.owner_before(__y);} 51863e519524SHoward Hinnant}; 51873e519524SHoward Hinnant 51883e519524SHoward Hinnanttemplate <class _Tp> 5189e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS owner_less<weak_ptr<_Tp> > 51903e519524SHoward Hinnant : binary_function<weak_ptr<_Tp>, weak_ptr<_Tp>, bool> 51913e519524SHoward Hinnant{ 51923e519524SHoward Hinnant typedef bool result_type; 5193848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 519436bc7178SMarshall Clow bool operator()( weak_ptr<_Tp> const& __x, weak_ptr<_Tp> const& __y) const _NOEXCEPT 51953e519524SHoward Hinnant {return __x.owner_before(__y);} 5196848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 519736bc7178SMarshall Clow bool operator()(shared_ptr<_Tp> const& __x, weak_ptr<_Tp> const& __y) const _NOEXCEPT 51983e519524SHoward Hinnant {return __x.owner_before(__y);} 5199848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 520036bc7178SMarshall Clow bool operator()( weak_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const _NOEXCEPT 52013e519524SHoward Hinnant {return __x.owner_before(__y);} 52023e519524SHoward Hinnant}; 52033e519524SHoward Hinnant 5204183c010cSMarshall Clow#if _LIBCPP_STD_VER > 14 5205183c010cSMarshall Clowtemplate <> 5206e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS owner_less<void> 5207183c010cSMarshall Clow{ 5208183c010cSMarshall Clow template <class _Tp, class _Up> 5209183c010cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 521036bc7178SMarshall Clow bool operator()( shared_ptr<_Tp> const& __x, shared_ptr<_Up> const& __y) const _NOEXCEPT 5211183c010cSMarshall Clow {return __x.owner_before(__y);} 5212183c010cSMarshall Clow template <class _Tp, class _Up> 5213183c010cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 521436bc7178SMarshall Clow bool operator()( shared_ptr<_Tp> const& __x, weak_ptr<_Up> const& __y) const _NOEXCEPT 5215183c010cSMarshall Clow {return __x.owner_before(__y);} 5216183c010cSMarshall Clow template <class _Tp, class _Up> 5217183c010cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 521836bc7178SMarshall Clow bool operator()( weak_ptr<_Tp> const& __x, shared_ptr<_Up> const& __y) const _NOEXCEPT 5219183c010cSMarshall Clow {return __x.owner_before(__y);} 5220183c010cSMarshall Clow template <class _Tp, class _Up> 5221183c010cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 522236bc7178SMarshall Clow bool operator()( weak_ptr<_Tp> const& __x, weak_ptr<_Up> const& __y) const _NOEXCEPT 5223183c010cSMarshall Clow {return __x.owner_before(__y);} 5224183c010cSMarshall Clow typedef void is_transparent; 5225183c010cSMarshall Clow}; 5226183c010cSMarshall Clow#endif 5227183c010cSMarshall Clow 52283e519524SHoward Hinnanttemplate<class _Tp> 5229e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS enable_shared_from_this 52303e519524SHoward Hinnant{ 52313e519524SHoward Hinnant mutable weak_ptr<_Tp> __weak_this_; 52323e519524SHoward Hinnantprotected: 5233c0937e8aSHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 52343739fe79SHoward Hinnant enable_shared_from_this() _NOEXCEPT {} 5235848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 52363739fe79SHoward Hinnant enable_shared_from_this(enable_shared_from_this const&) _NOEXCEPT {} 5237848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 52383739fe79SHoward Hinnant enable_shared_from_this& operator=(enable_shared_from_this const&) _NOEXCEPT 52393739fe79SHoward Hinnant {return *this;} 5240848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 52413e519524SHoward Hinnant ~enable_shared_from_this() {} 52423e519524SHoward Hinnantpublic: 5243848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 52443739fe79SHoward Hinnant shared_ptr<_Tp> shared_from_this() 52453739fe79SHoward Hinnant {return shared_ptr<_Tp>(__weak_this_);} 5246848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 52473739fe79SHoward Hinnant shared_ptr<_Tp const> shared_from_this() const 52483739fe79SHoward Hinnant {return shared_ptr<const _Tp>(__weak_this_);} 52493e519524SHoward Hinnant 525088f5bfdcSEric Fiselier#if _LIBCPP_STD_VER > 14 525188f5bfdcSEric Fiselier _LIBCPP_INLINE_VISIBILITY 525288f5bfdcSEric Fiselier weak_ptr<_Tp> weak_from_this() _NOEXCEPT 525388f5bfdcSEric Fiselier { return __weak_this_; } 525488f5bfdcSEric Fiselier 525588f5bfdcSEric Fiselier _LIBCPP_INLINE_VISIBILITY 525688f5bfdcSEric Fiselier weak_ptr<const _Tp> weak_from_this() const _NOEXCEPT 525788f5bfdcSEric Fiselier { return __weak_this_; } 525888f5bfdcSEric Fiselier#endif // _LIBCPP_STD_VER > 14 525988f5bfdcSEric Fiselier 52603e519524SHoward Hinnant template <class _Up> friend class shared_ptr; 52613e519524SHoward Hinnant}; 52623e519524SHoward Hinnant 5263d1803b6cSHoward Hinnanttemplate <class _Tp> 5264e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS hash<shared_ptr<_Tp> > 5265d1803b6cSHoward Hinnant{ 5266d1803b6cSHoward Hinnant typedef shared_ptr<_Tp> argument_type; 5267d1803b6cSHoward Hinnant typedef size_t result_type; 5268f9127593SEric Fiselier 5269848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 52703739fe79SHoward Hinnant result_type operator()(const argument_type& __ptr) const _NOEXCEPT 5271d1803b6cSHoward Hinnant { 5272d1803b6cSHoward Hinnant return hash<_Tp*>()(__ptr.get()); 5273d1803b6cSHoward Hinnant } 5274d1803b6cSHoward Hinnant}; 5275d1803b6cSHoward Hinnant 5276c003db1fSHoward Hinnanttemplate<class _CharT, class _Traits, class _Yp> 5277e3163f5aSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5278e3163f5aSHoward Hinnantbasic_ostream<_CharT, _Traits>& 5279c003db1fSHoward Hinnantoperator<<(basic_ostream<_CharT, _Traits>& __os, shared_ptr<_Yp> const& __p); 5280e3163f5aSHoward Hinnant 5281df93bad1SEric Fiselier 5282df93bad1SEric Fiselier#if !defined(_LIBCPP_HAS_NO_ATOMIC_HEADER) 5283d77851e8SHoward Hinnant 5284f0544c20SHoward Hinnantclass _LIBCPP_TYPE_VIS __sp_mut 5285d77851e8SHoward Hinnant{ 528654d333a6SHoward Hinnant void* __lx; 5287d77851e8SHoward Hinnantpublic: 5288d77851e8SHoward Hinnant void lock() _NOEXCEPT; 5289d77851e8SHoward Hinnant void unlock() _NOEXCEPT; 5290d77851e8SHoward Hinnant 5291d77851e8SHoward Hinnantprivate: 5292d77851e8SHoward Hinnant _LIBCPP_CONSTEXPR __sp_mut(void*) _NOEXCEPT; 5293d77851e8SHoward Hinnant __sp_mut(const __sp_mut&); 5294d77851e8SHoward Hinnant __sp_mut& operator=(const __sp_mut&); 5295d77851e8SHoward Hinnant 52966e41256fSHoward Hinnant friend _LIBCPP_FUNC_VIS __sp_mut& __get_sp_mut(const void*); 5297d77851e8SHoward Hinnant}; 5298d77851e8SHoward Hinnant 52996e41256fSHoward Hinnant_LIBCPP_FUNC_VIS __sp_mut& __get_sp_mut(const void*); 5300d77851e8SHoward Hinnant 5301d77851e8SHoward Hinnanttemplate <class _Tp> 5302d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5303d77851e8SHoward Hinnantbool 5304d77851e8SHoward Hinnantatomic_is_lock_free(const shared_ptr<_Tp>*) 5305d77851e8SHoward Hinnant{ 5306d77851e8SHoward Hinnant return false; 5307d77851e8SHoward Hinnant} 5308d77851e8SHoward Hinnant 5309d77851e8SHoward Hinnanttemplate <class _Tp> 5310d77851e8SHoward Hinnantshared_ptr<_Tp> 5311d77851e8SHoward Hinnantatomic_load(const shared_ptr<_Tp>* __p) 5312d77851e8SHoward Hinnant{ 5313d77851e8SHoward Hinnant __sp_mut& __m = __get_sp_mut(__p); 5314d77851e8SHoward Hinnant __m.lock(); 5315d77851e8SHoward Hinnant shared_ptr<_Tp> __q = *__p; 5316d77851e8SHoward Hinnant __m.unlock(); 5317d77851e8SHoward Hinnant return __q; 5318d77851e8SHoward Hinnant} 5319d77851e8SHoward Hinnant 5320d77851e8SHoward Hinnanttemplate <class _Tp> 5321d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5322d77851e8SHoward Hinnantshared_ptr<_Tp> 5323d77851e8SHoward Hinnantatomic_load_explicit(const shared_ptr<_Tp>* __p, memory_order) 5324d77851e8SHoward Hinnant{ 5325d77851e8SHoward Hinnant return atomic_load(__p); 5326d77851e8SHoward Hinnant} 5327d77851e8SHoward Hinnant 5328d77851e8SHoward Hinnanttemplate <class _Tp> 5329d77851e8SHoward Hinnantvoid 5330d77851e8SHoward Hinnantatomic_store(shared_ptr<_Tp>* __p, shared_ptr<_Tp> __r) 5331d77851e8SHoward Hinnant{ 5332d77851e8SHoward Hinnant __sp_mut& __m = __get_sp_mut(__p); 5333d77851e8SHoward Hinnant __m.lock(); 5334d77851e8SHoward Hinnant __p->swap(__r); 5335d77851e8SHoward Hinnant __m.unlock(); 5336d77851e8SHoward Hinnant} 5337d77851e8SHoward Hinnant 5338d77851e8SHoward Hinnanttemplate <class _Tp> 5339d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5340d77851e8SHoward Hinnantvoid 5341d77851e8SHoward Hinnantatomic_store_explicit(shared_ptr<_Tp>* __p, shared_ptr<_Tp> __r, memory_order) 5342d77851e8SHoward Hinnant{ 5343d77851e8SHoward Hinnant atomic_store(__p, __r); 5344d77851e8SHoward Hinnant} 5345d77851e8SHoward Hinnant 5346d77851e8SHoward Hinnanttemplate <class _Tp> 5347d77851e8SHoward Hinnantshared_ptr<_Tp> 5348d77851e8SHoward Hinnantatomic_exchange(shared_ptr<_Tp>* __p, shared_ptr<_Tp> __r) 5349d77851e8SHoward Hinnant{ 5350d77851e8SHoward Hinnant __sp_mut& __m = __get_sp_mut(__p); 5351d77851e8SHoward Hinnant __m.lock(); 5352d77851e8SHoward Hinnant __p->swap(__r); 5353d77851e8SHoward Hinnant __m.unlock(); 5354d77851e8SHoward Hinnant return __r; 5355d77851e8SHoward Hinnant} 5356d77851e8SHoward Hinnant 5357d77851e8SHoward Hinnanttemplate <class _Tp> 5358d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5359d77851e8SHoward Hinnantshared_ptr<_Tp> 5360d77851e8SHoward Hinnantatomic_exchange_explicit(shared_ptr<_Tp>* __p, shared_ptr<_Tp> __r, memory_order) 5361d77851e8SHoward Hinnant{ 5362d77851e8SHoward Hinnant return atomic_exchange(__p, __r); 5363d77851e8SHoward Hinnant} 5364d77851e8SHoward Hinnant 5365d77851e8SHoward Hinnanttemplate <class _Tp> 5366d77851e8SHoward Hinnantbool 5367d77851e8SHoward Hinnantatomic_compare_exchange_strong(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v, shared_ptr<_Tp> __w) 5368d77851e8SHoward Hinnant{ 53693379baebSMarshall Clow shared_ptr<_Tp> __temp; 5370d77851e8SHoward Hinnant __sp_mut& __m = __get_sp_mut(__p); 5371d77851e8SHoward Hinnant __m.lock(); 5372d77851e8SHoward Hinnant if (__p->__owner_equivalent(*__v)) 5373d77851e8SHoward Hinnant { 53743379baebSMarshall Clow _VSTD::swap(__temp, *__p); 5375d77851e8SHoward Hinnant *__p = __w; 5376d77851e8SHoward Hinnant __m.unlock(); 5377d77851e8SHoward Hinnant return true; 5378d77851e8SHoward Hinnant } 53793379baebSMarshall Clow _VSTD::swap(__temp, *__v); 5380d77851e8SHoward Hinnant *__v = *__p; 5381d77851e8SHoward Hinnant __m.unlock(); 5382d77851e8SHoward Hinnant return false; 5383d77851e8SHoward Hinnant} 5384d77851e8SHoward Hinnant 5385d77851e8SHoward Hinnanttemplate <class _Tp> 5386d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5387d77851e8SHoward Hinnantbool 5388d77851e8SHoward Hinnantatomic_compare_exchange_weak(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v, shared_ptr<_Tp> __w) 5389d77851e8SHoward Hinnant{ 5390d77851e8SHoward Hinnant return atomic_compare_exchange_strong(__p, __v, __w); 5391d77851e8SHoward Hinnant} 5392d77851e8SHoward Hinnant 5393d77851e8SHoward Hinnanttemplate <class _Tp> 5394d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5395d77851e8SHoward Hinnantbool 5396d77851e8SHoward Hinnantatomic_compare_exchange_strong_explicit(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v, 5397d77851e8SHoward Hinnant shared_ptr<_Tp> __w, memory_order, memory_order) 5398d77851e8SHoward Hinnant{ 5399d77851e8SHoward Hinnant return atomic_compare_exchange_strong(__p, __v, __w); 5400d77851e8SHoward Hinnant} 5401d77851e8SHoward Hinnant 5402d77851e8SHoward Hinnanttemplate <class _Tp> 5403d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5404d77851e8SHoward Hinnantbool 5405d77851e8SHoward Hinnantatomic_compare_exchange_weak_explicit(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v, 5406d77851e8SHoward Hinnant shared_ptr<_Tp> __w, memory_order, memory_order) 5407d77851e8SHoward Hinnant{ 5408d77851e8SHoward Hinnant return atomic_compare_exchange_weak(__p, __v, __w); 5409d77851e8SHoward Hinnant} 5410d77851e8SHoward Hinnant 5411df93bad1SEric Fiselier#endif // !defined(_LIBCPP_HAS_NO_ATOMIC_HEADER) 5412d77851e8SHoward Hinnant 54133e519524SHoward Hinnant//enum class 5414528600c4SEric Fiselier#if defined(_LIBCPP_ABI_POINTER_SAFETY_ENUM_TYPE) 5415528600c4SEric Fiselier# ifndef _LIBCPP_CXX03_LANG 5416528600c4SEric Fiselierenum class pointer_safety : unsigned char { 5417528600c4SEric Fiselier relaxed, 5418528600c4SEric Fiselier preferred, 5419528600c4SEric Fiselier strict 5420528600c4SEric Fiselier}; 5421528600c4SEric Fiselier# endif 5422528600c4SEric Fiselier#else 54236e41256fSHoward Hinnantstruct _LIBCPP_TYPE_VIS pointer_safety 54243e519524SHoward Hinnant{ 542554d333a6SHoward Hinnant enum __lx 54263e519524SHoward Hinnant { 54273e519524SHoward Hinnant relaxed, 54283e519524SHoward Hinnant preferred, 54293e519524SHoward Hinnant strict 54303e519524SHoward Hinnant }; 54313e519524SHoward Hinnant 543254d333a6SHoward Hinnant __lx __v_; 54333e519524SHoward Hinnant 5434848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 543576a01ea3SEric Fiselier pointer_safety() : __v_() {} 543676a01ea3SEric Fiselier 543776a01ea3SEric Fiselier _LIBCPP_INLINE_VISIBILITY 543854d333a6SHoward Hinnant pointer_safety(__lx __v) : __v_(__v) {} 5439848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 54403e519524SHoward Hinnant operator int() const {return __v_;} 54413e519524SHoward Hinnant}; 5442528600c4SEric Fiselier#endif 5443528600c4SEric Fiselier 5444528600c4SEric Fiselier#if !defined(_LIBCPP_ABI_POINTER_SAFETY_ENUM_TYPE) && \ 5445528600c4SEric Fiselier defined(_LIBCPP_BUILDING_MEMORY) 5446528600c4SEric Fiselier_LIBCPP_FUNC_VIS pointer_safety get_pointer_safety() _NOEXCEPT; 5447528600c4SEric Fiselier#else 5448528600c4SEric Fiselier// This function is only offered in C++03 under ABI v1. 5449528600c4SEric Fiselier# if !defined(_LIBCPP_ABI_POINTER_SAFETY_ENUM_TYPE) || !defined(_LIBCPP_CXX03_LANG) 5450528600c4SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 5451528600c4SEric Fiselierpointer_safety get_pointer_safety() _NOEXCEPT { 5452528600c4SEric Fiselier return pointer_safety::relaxed; 5453528600c4SEric Fiselier} 5454528600c4SEric Fiselier# endif 5455528600c4SEric Fiselier#endif 5456528600c4SEric Fiselier 54573e519524SHoward Hinnant 5458f0544c20SHoward Hinnant_LIBCPP_FUNC_VIS void declare_reachable(void* __p); 5459f0544c20SHoward Hinnant_LIBCPP_FUNC_VIS void declare_no_pointers(char* __p, size_t __n); 5460f0544c20SHoward Hinnant_LIBCPP_FUNC_VIS void undeclare_no_pointers(char* __p, size_t __n); 5461f0544c20SHoward Hinnant_LIBCPP_FUNC_VIS void* __undeclare_reachable(void* __p); 54623e519524SHoward Hinnant 54633e519524SHoward Hinnanttemplate <class _Tp> 54643e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 54653e519524SHoward Hinnant_Tp* 54663e519524SHoward Hinnantundeclare_reachable(_Tp* __p) 54673e519524SHoward Hinnant{ 54683e519524SHoward Hinnant return static_cast<_Tp*>(__undeclare_reachable(__p)); 54693e519524SHoward Hinnant} 54703e519524SHoward Hinnant 5471f0544c20SHoward Hinnant_LIBCPP_FUNC_VIS void* align(size_t __align, size_t __sz, void*& __ptr, size_t& __space); 54723e519524SHoward Hinnant 5473e3fbe143SMarshall Clow// --- Helper for container swap -- 5474e3fbe143SMarshall Clowtemplate <typename _Alloc> 547589dd1dd2SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 5476e3fbe143SMarshall Clowvoid __swap_allocator(_Alloc & __a1, _Alloc & __a2) 5477e3fbe143SMarshall Clow#if _LIBCPP_STD_VER >= 14 5478e3fbe143SMarshall Clow _NOEXCEPT 5479e3fbe143SMarshall Clow#else 5480e3fbe143SMarshall Clow _NOEXCEPT_(__is_nothrow_swappable<_Alloc>::value) 5481e3fbe143SMarshall Clow#endif 5482e3fbe143SMarshall Clow{ 5483e3fbe143SMarshall Clow __swap_allocator(__a1, __a2, 5484e3fbe143SMarshall Clow integral_constant<bool, _VSTD::allocator_traits<_Alloc>::propagate_on_container_swap::value>()); 5485e3fbe143SMarshall Clow} 5486e3fbe143SMarshall Clow 5487e3fbe143SMarshall Clowtemplate <typename _Alloc> 5488e3fbe143SMarshall Clow_LIBCPP_INLINE_VISIBILITY 5489e3fbe143SMarshall Clowvoid __swap_allocator(_Alloc & __a1, _Alloc & __a2, true_type) 5490e3fbe143SMarshall Clow#if _LIBCPP_STD_VER >= 14 5491e3fbe143SMarshall Clow _NOEXCEPT 5492e3fbe143SMarshall Clow#else 5493e3fbe143SMarshall Clow _NOEXCEPT_(__is_nothrow_swappable<_Alloc>::value) 5494e3fbe143SMarshall Clow#endif 5495e3fbe143SMarshall Clow{ 5496e3fbe143SMarshall Clow using _VSTD::swap; 5497e3fbe143SMarshall Clow swap(__a1, __a2); 5498e3fbe143SMarshall Clow} 5499e3fbe143SMarshall Clow 5500e3fbe143SMarshall Clowtemplate <typename _Alloc> 550189dd1dd2SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 5502e3fbe143SMarshall Clowvoid __swap_allocator(_Alloc &, _Alloc &, false_type) _NOEXCEPT {} 5503e3fbe143SMarshall Clow 55041378a5aeSMarshall Clowtemplate <typename _Alloc, typename _Traits=allocator_traits<_Alloc> > 55051378a5aeSMarshall Clowstruct __noexcept_move_assign_container : public integral_constant<bool, 55061378a5aeSMarshall Clow _Traits::propagate_on_container_move_assignment::value 55071378a5aeSMarshall Clow#if _LIBCPP_STD_VER > 14 55081378a5aeSMarshall Clow || _Traits::is_always_equal::value 55091378a5aeSMarshall Clow#else 55101378a5aeSMarshall Clow && is_nothrow_move_assignable<_Alloc>::value 55111378a5aeSMarshall Clow#endif 55121378a5aeSMarshall Clow > {}; 5513e3fbe143SMarshall Clow 5514dc3eb83dSMarshall Clow 5515dc3eb83dSMarshall Clow#ifndef _LIBCPP_HAS_NO_VARIADICS 5516dc3eb83dSMarshall Clowtemplate <class _Tp, class _Alloc> 5517dc3eb83dSMarshall Clowstruct __temp_value { 5518dc3eb83dSMarshall Clow typedef allocator_traits<_Alloc> _Traits; 5519dc3eb83dSMarshall Clow 5520dc3eb83dSMarshall Clow typename aligned_storage<sizeof(_Tp), alignof(_Tp)>::type __v; 5521dc3eb83dSMarshall Clow _Alloc &__a; 5522dc3eb83dSMarshall Clow 5523dc3eb83dSMarshall Clow _Tp *__addr() { return reinterpret_cast<_Tp *>(addressof(__v)); } 5524dc3eb83dSMarshall Clow _Tp & get() { return *__addr(); } 5525dc3eb83dSMarshall Clow 5526dc3eb83dSMarshall Clow template<class... _Args> 5527dc3eb83dSMarshall Clow __temp_value(_Alloc &__alloc, _Args&& ... __args) : __a(__alloc) 5528dc3eb83dSMarshall Clow { _Traits::construct(__a, __addr(), _VSTD::forward<_Args>(__args)...); } 5529dc3eb83dSMarshall Clow 5530dc3eb83dSMarshall Clow ~__temp_value() { _Traits::destroy(__a, __addr()); } 5531dc3eb83dSMarshall Clow }; 5532dc3eb83dSMarshall Clow#endif 5533dc3eb83dSMarshall Clow 55343e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD 55353e519524SHoward Hinnant 55363e519524SHoward Hinnant#endif // _LIBCPP_MEMORY 5537