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 { }; 2140a01d53SMarshall Clowinline constexpr 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 4932952747SEric Fiseliertemplate <class T> constexpr T* to_address(T* p) noexcept; // C++20 5032952747SEric Fiseliertemplate <class Ptr> auto to_address(const Ptr& p) noexcept; // C++20 5132952747SEric Fiselier 523e519524SHoward Hinnanttemplate <class Alloc> 533e519524SHoward Hinnantstruct allocator_traits 543e519524SHoward Hinnant{ 553e519524SHoward Hinnant typedef Alloc allocator_type; 563e519524SHoward Hinnant typedef typename allocator_type::value_type 573e519524SHoward Hinnant value_type; 583e519524SHoward Hinnant 593e519524SHoward Hinnant typedef Alloc::pointer | value_type* pointer; 603e519524SHoward Hinnant typedef Alloc::const_pointer 613e519524SHoward Hinnant | pointer_traits<pointer>::rebind<const value_type> 623e519524SHoward Hinnant const_pointer; 633e519524SHoward Hinnant typedef Alloc::void_pointer 643e519524SHoward Hinnant | pointer_traits<pointer>::rebind<void> 653e519524SHoward Hinnant void_pointer; 663e519524SHoward Hinnant typedef Alloc::const_void_pointer 673e519524SHoward Hinnant | pointer_traits<pointer>::rebind<const void> 683e519524SHoward Hinnant const_void_pointer; 693e519524SHoward Hinnant typedef Alloc::difference_type 70a4a1ef1fSHoward Hinnant | pointer_traits<pointer>::difference_type 71a4a1ef1fSHoward Hinnant difference_type; 72a4a1ef1fSHoward Hinnant typedef Alloc::size_type 73a4a1ef1fSHoward Hinnant | make_unsigned<difference_type>::type 74a4a1ef1fSHoward Hinnant size_type; 753e519524SHoward Hinnant typedef Alloc::propagate_on_container_copy_assignment 763e519524SHoward Hinnant | false_type propagate_on_container_copy_assignment; 773e519524SHoward Hinnant typedef Alloc::propagate_on_container_move_assignment 783e519524SHoward Hinnant | false_type propagate_on_container_move_assignment; 793e519524SHoward Hinnant typedef Alloc::propagate_on_container_swap 803e519524SHoward Hinnant | false_type propagate_on_container_swap; 8131a47313SMarshall Clow typedef Alloc::is_always_equal 8231a47313SMarshall Clow | is_empty is_always_equal; 833e519524SHoward Hinnant 843e519524SHoward Hinnant template <class T> using rebind_alloc = Alloc::rebind<U>::other | Alloc<T, Args...>; 853e519524SHoward Hinnant template <class T> using rebind_traits = allocator_traits<rebind_alloc<T>>; 863e519524SHoward Hinnant 873fddff51SMarshall Clow static pointer allocate(allocator_type& a, size_type n); // [[nodiscard]] in C++20 883fddff51SMarshall Clow static pointer allocate(allocator_type& a, size_type n, const_void_pointer hint); // [[nodiscard]] in C++20 893e519524SHoward Hinnant 903739fe79SHoward Hinnant static void deallocate(allocator_type& a, pointer p, size_type n) noexcept; 913e519524SHoward Hinnant 923e519524SHoward Hinnant template <class T, class... Args> 933e519524SHoward Hinnant static void construct(allocator_type& a, T* p, Args&&... args); 943e519524SHoward Hinnant 953e519524SHoward Hinnant template <class T> 963e519524SHoward Hinnant static void destroy(allocator_type& a, T* p); 973e519524SHoward Hinnant 9806fbed03SMarshall Clow static size_type max_size(const allocator_type& a); // noexcept in C++14 993e519524SHoward Hinnant 1003e519524SHoward Hinnant static allocator_type 1013e519524SHoward Hinnant select_on_container_copy_construction(const allocator_type& a); 1023e519524SHoward Hinnant}; 1033e519524SHoward Hinnant 1043e519524SHoward Hinnanttemplate <> 1053e519524SHoward Hinnantclass allocator<void> 1063e519524SHoward Hinnant{ 1073e519524SHoward Hinnantpublic: 1083e519524SHoward Hinnant typedef void* pointer; 1093e519524SHoward Hinnant typedef const void* const_pointer; 1103e519524SHoward Hinnant typedef void value_type; 1113e519524SHoward Hinnant 1123e519524SHoward Hinnant template <class _Up> struct rebind {typedef allocator<_Up> other;}; 1133e519524SHoward Hinnant}; 1143e519524SHoward Hinnant 1153e519524SHoward Hinnanttemplate <class T> 1163e519524SHoward Hinnantclass allocator 1173e519524SHoward Hinnant{ 1183e519524SHoward Hinnantpublic: 1193e519524SHoward Hinnant typedef size_t size_type; 1203e519524SHoward Hinnant typedef ptrdiff_t difference_type; 1213e519524SHoward Hinnant typedef T* pointer; 1223e519524SHoward Hinnant typedef const T* const_pointer; 1233e519524SHoward Hinnant typedef typename add_lvalue_reference<T>::type reference; 1243e519524SHoward Hinnant typedef typename add_lvalue_reference<const T>::type const_reference; 1253e519524SHoward Hinnant typedef T value_type; 1263e519524SHoward Hinnant 1273e519524SHoward Hinnant template <class U> struct rebind {typedef allocator<U> other;}; 1283e519524SHoward Hinnant 1293739fe79SHoward Hinnant allocator() noexcept; 1303739fe79SHoward Hinnant allocator(const allocator&) noexcept; 1313739fe79SHoward Hinnant template <class U> allocator(const allocator<U>&) noexcept; 1323739fe79SHoward Hinnant ~allocator(); 1333739fe79SHoward Hinnant pointer address(reference x) const noexcept; 1343739fe79SHoward Hinnant const_pointer address(const_reference x) const noexcept; 1353e519524SHoward Hinnant pointer allocate(size_type, allocator<void>::const_pointer hint = 0); 1363739fe79SHoward Hinnant void deallocate(pointer p, size_type n) noexcept; 1373739fe79SHoward Hinnant size_type max_size() const noexcept; 1383739fe79SHoward Hinnant template<class U, class... Args> 1393739fe79SHoward Hinnant void construct(U* p, Args&&... args); 1403739fe79SHoward Hinnant template <class U> 1413739fe79SHoward Hinnant void destroy(U* p); 1423e519524SHoward Hinnant}; 1433e519524SHoward Hinnant 1443e519524SHoward Hinnanttemplate <class T, class U> 1453739fe79SHoward Hinnantbool operator==(const allocator<T>&, const allocator<U>&) noexcept; 1463e519524SHoward Hinnant 1473e519524SHoward Hinnanttemplate <class T, class U> 1483739fe79SHoward Hinnantbool operator!=(const allocator<T>&, const allocator<U>&) noexcept; 1493e519524SHoward Hinnant 1503e519524SHoward Hinnanttemplate <class OutputIterator, class T> 1513e519524SHoward Hinnantclass raw_storage_iterator 1523e519524SHoward Hinnant : public iterator<output_iterator_tag, 1533e519524SHoward Hinnant T, // purposefully not C++03 1543e519524SHoward Hinnant ptrdiff_t, // purposefully not C++03 1553e519524SHoward Hinnant T*, // purposefully not C++03 1563e519524SHoward Hinnant raw_storage_iterator&> // purposefully not C++03 1573e519524SHoward Hinnant{ 1583e519524SHoward Hinnantpublic: 1593e519524SHoward Hinnant explicit raw_storage_iterator(OutputIterator x); 1603e519524SHoward Hinnant raw_storage_iterator& operator*(); 1613e519524SHoward Hinnant raw_storage_iterator& operator=(const T& element); 1623e519524SHoward Hinnant raw_storage_iterator& operator++(); 1633e519524SHoward Hinnant raw_storage_iterator operator++(int); 1643e519524SHoward Hinnant}; 1653e519524SHoward Hinnant 1663739fe79SHoward Hinnanttemplate <class T> pair<T*,ptrdiff_t> get_temporary_buffer(ptrdiff_t n) noexcept; 1673739fe79SHoward Hinnanttemplate <class T> void return_temporary_buffer(T* p) noexcept; 1683739fe79SHoward Hinnant 1693739fe79SHoward Hinnanttemplate <class T> T* addressof(T& r) noexcept; 1701c7fe126SMarshall Clowtemplate <class T> T* addressof(const T&& r) noexcept = delete; 1713e519524SHoward Hinnant 1723e519524SHoward Hinnanttemplate <class InputIterator, class ForwardIterator> 1733e519524SHoward HinnantForwardIterator 1743e519524SHoward Hinnantuninitialized_copy(InputIterator first, InputIterator last, ForwardIterator result); 1753e519524SHoward Hinnant 1763739fe79SHoward Hinnanttemplate <class InputIterator, class Size, class ForwardIterator> 1773739fe79SHoward HinnantForwardIterator 1783739fe79SHoward Hinnantuninitialized_copy_n(InputIterator first, Size n, ForwardIterator result); 1793739fe79SHoward Hinnant 1803e519524SHoward Hinnanttemplate <class ForwardIterator, class T> 1813e519524SHoward Hinnantvoid uninitialized_fill(ForwardIterator first, ForwardIterator last, const T& x); 1823e519524SHoward Hinnant 1833e519524SHoward Hinnanttemplate <class ForwardIterator, class Size, class T> 18448d05bd2SHoward HinnantForwardIterator 18548d05bd2SHoward Hinnantuninitialized_fill_n(ForwardIterator first, Size n, const T& x); 1863e519524SHoward Hinnant 187e4d9c316SEric Fiseliertemplate <class T> 188e4d9c316SEric Fiseliervoid destroy_at(T* location); 189e4d9c316SEric Fiselier 190e4d9c316SEric Fiseliertemplate <class ForwardIterator> 191e4d9c316SEric Fiselier void destroy(ForwardIterator first, ForwardIterator last); 192e4d9c316SEric Fiselier 193e4d9c316SEric Fiseliertemplate <class ForwardIterator, class Size> 194e4d9c316SEric Fiselier ForwardIterator destroy_n(ForwardIterator first, Size n); 195e4d9c316SEric Fiselier 196e4d9c316SEric Fiseliertemplate <class InputIterator, class ForwardIterator> 197e4d9c316SEric Fiselier ForwardIterator uninitialized_move(InputIterator first, InputIterator last, ForwardIterator result); 198e4d9c316SEric Fiselier 199e4d9c316SEric Fiseliertemplate <class InputIterator, class Size, class ForwardIterator> 200e4d9c316SEric Fiselier pair<InputIterator,ForwardIterator> uninitialized_move_n(InputIterator first, Size n, ForwardIterator result); 201e4d9c316SEric Fiselier 202e4d9c316SEric Fiseliertemplate <class ForwardIterator> 203e4d9c316SEric Fiselier void uninitialized_value_construct(ForwardIterator first, ForwardIterator last); 204e4d9c316SEric Fiselier 205e4d9c316SEric Fiseliertemplate <class ForwardIterator, class Size> 206e4d9c316SEric Fiselier ForwardIterator uninitialized_value_construct_n(ForwardIterator first, Size n); 207e4d9c316SEric Fiselier 208e4d9c316SEric Fiseliertemplate <class ForwardIterator> 209e4d9c316SEric Fiselier void uninitialized_default_construct(ForwardIterator first, ForwardIterator last); 210e4d9c316SEric Fiselier 211e4d9c316SEric Fiseliertemplate <class ForwardIterator, class Size> 212e4d9c316SEric Fiselier ForwardIterator uninitialized_default_construct_n(ForwardIterator first, Size n); 213e4d9c316SEric Fiselier 214e67179bcSMarshall Clowtemplate <class Y> struct auto_ptr_ref {}; // removed in C++17 2153e519524SHoward Hinnant 2163e519524SHoward Hinnanttemplate<class X> 217e67179bcSMarshall Clowclass auto_ptr // removed in C++17 2183e519524SHoward Hinnant{ 2193e519524SHoward Hinnantpublic: 2203e519524SHoward Hinnant typedef X element_type; 2213e519524SHoward Hinnant 2223e519524SHoward Hinnant explicit auto_ptr(X* p =0) throw(); 2233e519524SHoward Hinnant auto_ptr(auto_ptr&) throw(); 2243e519524SHoward Hinnant template<class Y> auto_ptr(auto_ptr<Y>&) throw(); 2253e519524SHoward Hinnant auto_ptr& operator=(auto_ptr&) throw(); 2263e519524SHoward Hinnant template<class Y> auto_ptr& operator=(auto_ptr<Y>&) throw(); 2273e519524SHoward Hinnant auto_ptr& operator=(auto_ptr_ref<X> r) throw(); 2283e519524SHoward Hinnant ~auto_ptr() throw(); 2293e519524SHoward Hinnant 2303e519524SHoward Hinnant typename add_lvalue_reference<X>::type operator*() const throw(); 2313e519524SHoward Hinnant X* operator->() const throw(); 2323e519524SHoward Hinnant X* get() const throw(); 2333e519524SHoward Hinnant X* release() throw(); 2343e519524SHoward Hinnant void reset(X* p =0) throw(); 2353e519524SHoward Hinnant 2363e519524SHoward Hinnant auto_ptr(auto_ptr_ref<X>) throw(); 2373e519524SHoward Hinnant template<class Y> operator auto_ptr_ref<Y>() throw(); 2383e519524SHoward Hinnant template<class Y> operator auto_ptr<Y>() throw(); 2393e519524SHoward Hinnant}; 2403e519524SHoward Hinnant 24120cc2a42SHoward Hinnanttemplate <class T> 24220cc2a42SHoward Hinnantstruct default_delete 24320cc2a42SHoward Hinnant{ 2443739fe79SHoward Hinnant constexpr default_delete() noexcept = default; 2453739fe79SHoward Hinnant template <class U> default_delete(const default_delete<U>&) noexcept; 24620cc2a42SHoward Hinnant 2473739fe79SHoward Hinnant void operator()(T*) const noexcept; 24820cc2a42SHoward Hinnant}; 24920cc2a42SHoward Hinnant 25020cc2a42SHoward Hinnanttemplate <class T> 25120cc2a42SHoward Hinnantstruct default_delete<T[]> 25220cc2a42SHoward Hinnant{ 2533739fe79SHoward Hinnant constexpr default_delete() noexcept = default; 2543739fe79SHoward Hinnant void operator()(T*) const noexcept; 25520cc2a42SHoward Hinnant template <class U> void operator()(U*) const = delete; 25620cc2a42SHoward Hinnant}; 25720cc2a42SHoward Hinnant 25820cc2a42SHoward Hinnanttemplate <class T, class D = default_delete<T>> 25920cc2a42SHoward Hinnantclass unique_ptr 26020cc2a42SHoward Hinnant{ 26120cc2a42SHoward Hinnantpublic: 26220cc2a42SHoward Hinnant typedef see below pointer; 26320cc2a42SHoward Hinnant typedef T element_type; 26420cc2a42SHoward Hinnant typedef D deleter_type; 26520cc2a42SHoward Hinnant 26620cc2a42SHoward Hinnant // constructors 2673739fe79SHoward Hinnant constexpr unique_ptr() noexcept; 2683739fe79SHoward Hinnant explicit unique_ptr(pointer p) noexcept; 2693739fe79SHoward Hinnant unique_ptr(pointer p, see below d1) noexcept; 2703739fe79SHoward Hinnant unique_ptr(pointer p, see below d2) noexcept; 2713739fe79SHoward Hinnant unique_ptr(unique_ptr&& u) noexcept; 2723739fe79SHoward Hinnant unique_ptr(nullptr_t) noexcept : unique_ptr() { } 27320cc2a42SHoward Hinnant template <class U, class E> 2743739fe79SHoward Hinnant unique_ptr(unique_ptr<U, E>&& u) noexcept; 27520cc2a42SHoward Hinnant template <class U> 276e67179bcSMarshall Clow unique_ptr(auto_ptr<U>&& u) noexcept; // removed in C++17 27720cc2a42SHoward Hinnant 27820cc2a42SHoward Hinnant // destructor 27920cc2a42SHoward Hinnant ~unique_ptr(); 28020cc2a42SHoward Hinnant 28120cc2a42SHoward Hinnant // assignment 2823739fe79SHoward Hinnant unique_ptr& operator=(unique_ptr&& u) noexcept; 2833739fe79SHoward Hinnant template <class U, class E> unique_ptr& operator=(unique_ptr<U, E>&& u) noexcept; 2843739fe79SHoward Hinnant unique_ptr& operator=(nullptr_t) noexcept; 28520cc2a42SHoward Hinnant 28620cc2a42SHoward Hinnant // observers 28720cc2a42SHoward Hinnant typename add_lvalue_reference<T>::type operator*() const; 2883739fe79SHoward Hinnant pointer operator->() const noexcept; 2893739fe79SHoward Hinnant pointer get() const noexcept; 2903739fe79SHoward Hinnant deleter_type& get_deleter() noexcept; 2913739fe79SHoward Hinnant const deleter_type& get_deleter() const noexcept; 2923739fe79SHoward Hinnant explicit operator bool() const noexcept; 29320cc2a42SHoward Hinnant 29420cc2a42SHoward Hinnant // modifiers 2953739fe79SHoward Hinnant pointer release() noexcept; 2963739fe79SHoward Hinnant void reset(pointer p = pointer()) noexcept; 2973739fe79SHoward Hinnant void swap(unique_ptr& u) noexcept; 29820cc2a42SHoward Hinnant}; 29920cc2a42SHoward Hinnant 30020cc2a42SHoward Hinnanttemplate <class T, class D> 30120cc2a42SHoward Hinnantclass unique_ptr<T[], D> 30220cc2a42SHoward Hinnant{ 30320cc2a42SHoward Hinnantpublic: 30420cc2a42SHoward Hinnant typedef implementation-defined pointer; 30520cc2a42SHoward Hinnant typedef T element_type; 30620cc2a42SHoward Hinnant typedef D deleter_type; 30720cc2a42SHoward Hinnant 30820cc2a42SHoward Hinnant // constructors 3093739fe79SHoward Hinnant constexpr unique_ptr() noexcept; 3103739fe79SHoward Hinnant explicit unique_ptr(pointer p) noexcept; 3113739fe79SHoward Hinnant unique_ptr(pointer p, see below d) noexcept; 3123739fe79SHoward Hinnant unique_ptr(pointer p, see below d) noexcept; 3133739fe79SHoward Hinnant unique_ptr(unique_ptr&& u) noexcept; 3143739fe79SHoward Hinnant unique_ptr(nullptr_t) noexcept : unique_ptr() { } 31520cc2a42SHoward Hinnant 31620cc2a42SHoward Hinnant // destructor 317b3371f6fSHoward Hinnant ~unique_ptr(); 31820cc2a42SHoward Hinnant 31920cc2a42SHoward Hinnant // assignment 3203739fe79SHoward Hinnant unique_ptr& operator=(unique_ptr&& u) noexcept; 3213739fe79SHoward Hinnant unique_ptr& operator=(nullptr_t) noexcept; 32220cc2a42SHoward Hinnant 32320cc2a42SHoward Hinnant // observers 32420cc2a42SHoward Hinnant T& operator[](size_t i) const; 3253739fe79SHoward Hinnant pointer get() const noexcept; 3263739fe79SHoward Hinnant deleter_type& get_deleter() noexcept; 3273739fe79SHoward Hinnant const deleter_type& get_deleter() const noexcept; 3283739fe79SHoward Hinnant explicit operator bool() const noexcept; 32920cc2a42SHoward Hinnant 33020cc2a42SHoward Hinnant // modifiers 3313739fe79SHoward Hinnant pointer release() noexcept; 3323739fe79SHoward Hinnant void reset(pointer p = pointer()) noexcept; 3333739fe79SHoward Hinnant void reset(nullptr_t) noexcept; 33420cc2a42SHoward Hinnant template <class U> void reset(U) = delete; 3353739fe79SHoward Hinnant void swap(unique_ptr& u) noexcept; 33620cc2a42SHoward Hinnant}; 33720cc2a42SHoward Hinnant 33820cc2a42SHoward Hinnanttemplate <class T, class D> 3393739fe79SHoward Hinnant void swap(unique_ptr<T, D>& x, unique_ptr<T, D>& y) noexcept; 34020cc2a42SHoward Hinnant 34120cc2a42SHoward Hinnanttemplate <class T1, class D1, class T2, class D2> 34220cc2a42SHoward Hinnant bool operator==(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 34320cc2a42SHoward Hinnanttemplate <class T1, class D1, class T2, class D2> 34420cc2a42SHoward Hinnant bool operator!=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 34520cc2a42SHoward Hinnanttemplate <class T1, class D1, class T2, class D2> 34620cc2a42SHoward Hinnant bool operator<(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 34720cc2a42SHoward Hinnanttemplate <class T1, class D1, class T2, class D2> 34820cc2a42SHoward Hinnant bool operator<=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 34920cc2a42SHoward Hinnanttemplate <class T1, class D1, class T2, class D2> 35020cc2a42SHoward Hinnant bool operator>(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 35120cc2a42SHoward Hinnanttemplate <class T1, class D1, class T2, class D2> 35220cc2a42SHoward Hinnant bool operator>=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 35320cc2a42SHoward Hinnant 3543739fe79SHoward Hinnanttemplate <class T, class D> 3553739fe79SHoward Hinnant bool operator==(const unique_ptr<T, D>& x, nullptr_t) noexcept; 3563739fe79SHoward Hinnanttemplate <class T, class D> 3573739fe79SHoward Hinnant bool operator==(nullptr_t, const unique_ptr<T, D>& y) noexcept; 3583739fe79SHoward Hinnanttemplate <class T, class D> 3593739fe79SHoward Hinnant bool operator!=(const unique_ptr<T, D>& x, nullptr_t) noexcept; 3603739fe79SHoward Hinnanttemplate <class T, class D> 3613739fe79SHoward Hinnant bool operator!=(nullptr_t, const unique_ptr<T, D>& y) noexcept; 3623739fe79SHoward Hinnant 3633739fe79SHoward Hinnanttemplate <class T, class D> 3643739fe79SHoward Hinnant bool operator<(const unique_ptr<T, D>& x, nullptr_t); 3653739fe79SHoward Hinnanttemplate <class T, class D> 3663739fe79SHoward Hinnant bool operator<(nullptr_t, const unique_ptr<T, D>& y); 3673739fe79SHoward Hinnanttemplate <class T, class D> 3683739fe79SHoward Hinnant bool operator<=(const unique_ptr<T, D>& x, nullptr_t); 3693739fe79SHoward Hinnanttemplate <class T, class D> 3703739fe79SHoward Hinnant bool operator<=(nullptr_t, const unique_ptr<T, D>& y); 3713739fe79SHoward Hinnanttemplate <class T, class D> 3723739fe79SHoward Hinnant bool operator>(const unique_ptr<T, D>& x, nullptr_t); 3733739fe79SHoward Hinnanttemplate <class T, class D> 3743739fe79SHoward Hinnant bool operator>(nullptr_t, const unique_ptr<T, D>& y); 3753739fe79SHoward Hinnanttemplate <class T, class D> 3763739fe79SHoward Hinnant bool operator>=(const unique_ptr<T, D>& x, nullptr_t); 3773739fe79SHoward Hinnanttemplate <class T, class D> 3783739fe79SHoward Hinnant bool operator>=(nullptr_t, const unique_ptr<T, D>& y); 3793739fe79SHoward Hinnant 38020cc2a42SHoward Hinnantclass bad_weak_ptr 38120cc2a42SHoward Hinnant : public std::exception 38220cc2a42SHoward Hinnant{ 3833739fe79SHoward Hinnant bad_weak_ptr() noexcept; 38420cc2a42SHoward Hinnant}; 38520cc2a42SHoward Hinnant 38628d8ba5fSMarshall Clowtemplate<class T, class... Args> unique_ptr<T> make_unique(Args&&... args); // C++14 38728d8ba5fSMarshall Clowtemplate<class T> unique_ptr<T> make_unique(size_t n); // C++14 38828d8ba5fSMarshall Clowtemplate<class T, class... Args> unspecified make_unique(Args&&...) = delete; // C++14, T == U[N] 38928d8ba5fSMarshall Clow 39048f36539SMarshall Clowtemplate<class E, class T, class Y, class D> 39148f36539SMarshall Clow basic_ostream<E, T>& operator<< (basic_ostream<E, T>& os, unique_ptr<Y, D> const& p); 39248f36539SMarshall Clow 39320cc2a42SHoward Hinnanttemplate<class T> 39420cc2a42SHoward Hinnantclass shared_ptr 39520cc2a42SHoward Hinnant{ 39620cc2a42SHoward Hinnantpublic: 39720cc2a42SHoward Hinnant typedef T element_type; 39868436a9bSEric Fiselier typedef weak_ptr<T> weak_type; // C++17 39920cc2a42SHoward Hinnant 40020cc2a42SHoward Hinnant // constructors: 4013739fe79SHoward Hinnant constexpr shared_ptr() noexcept; 40220cc2a42SHoward Hinnant template<class Y> explicit shared_ptr(Y* p); 40320cc2a42SHoward Hinnant template<class Y, class D> shared_ptr(Y* p, D d); 40420cc2a42SHoward Hinnant template<class Y, class D, class A> shared_ptr(Y* p, D d, A a); 40520cc2a42SHoward Hinnant template <class D> shared_ptr(nullptr_t p, D d); 40620cc2a42SHoward Hinnant template <class D, class A> shared_ptr(nullptr_t p, D d, A a); 4073739fe79SHoward Hinnant template<class Y> shared_ptr(const shared_ptr<Y>& r, T *p) noexcept; 4083739fe79SHoward Hinnant shared_ptr(const shared_ptr& r) noexcept; 4093739fe79SHoward Hinnant template<class Y> shared_ptr(const shared_ptr<Y>& r) noexcept; 4103739fe79SHoward Hinnant shared_ptr(shared_ptr&& r) noexcept; 4113739fe79SHoward Hinnant template<class Y> shared_ptr(shared_ptr<Y>&& r) noexcept; 41220cc2a42SHoward Hinnant template<class Y> explicit shared_ptr(const weak_ptr<Y>& r); 413e67179bcSMarshall Clow template<class Y> shared_ptr(auto_ptr<Y>&& r); // removed in C++17 41420cc2a42SHoward Hinnant template <class Y, class D> shared_ptr(unique_ptr<Y, D>&& r); 41520cc2a42SHoward Hinnant shared_ptr(nullptr_t) : shared_ptr() { } 41620cc2a42SHoward Hinnant 41720cc2a42SHoward Hinnant // destructor: 41820cc2a42SHoward Hinnant ~shared_ptr(); 41920cc2a42SHoward Hinnant 42020cc2a42SHoward Hinnant // assignment: 4213739fe79SHoward Hinnant shared_ptr& operator=(const shared_ptr& r) noexcept; 4223739fe79SHoward Hinnant template<class Y> shared_ptr& operator=(const shared_ptr<Y>& r) noexcept; 4233739fe79SHoward Hinnant shared_ptr& operator=(shared_ptr&& r) noexcept; 42420cc2a42SHoward Hinnant template<class Y> shared_ptr& operator=(shared_ptr<Y>&& r); 425e67179bcSMarshall Clow template<class Y> shared_ptr& operator=(auto_ptr<Y>&& r); // removed in C++17 42620cc2a42SHoward Hinnant template <class Y, class D> shared_ptr& operator=(unique_ptr<Y, D>&& r); 42720cc2a42SHoward Hinnant 42820cc2a42SHoward Hinnant // modifiers: 4293739fe79SHoward Hinnant void swap(shared_ptr& r) noexcept; 4303739fe79SHoward Hinnant void reset() noexcept; 43120cc2a42SHoward Hinnant template<class Y> void reset(Y* p); 43220cc2a42SHoward Hinnant template<class Y, class D> void reset(Y* p, D d); 43320cc2a42SHoward Hinnant template<class Y, class D, class A> void reset(Y* p, D d, A a); 43420cc2a42SHoward Hinnant 4353739fe79SHoward Hinnant // observers: 4363739fe79SHoward Hinnant T* get() const noexcept; 4373739fe79SHoward Hinnant T& operator*() const noexcept; 4383739fe79SHoward Hinnant T* operator->() const noexcept; 4393739fe79SHoward Hinnant long use_count() const noexcept; 4403739fe79SHoward Hinnant bool unique() const noexcept; 4413739fe79SHoward Hinnant explicit operator bool() const noexcept; 44236bc7178SMarshall Clow template<class U> bool owner_before(shared_ptr<U> const& b) const noexcept; 44336bc7178SMarshall Clow template<class U> bool owner_before(weak_ptr<U> const& b) const noexcept; 44420cc2a42SHoward Hinnant}; 44520cc2a42SHoward Hinnant 44620cc2a42SHoward Hinnant// shared_ptr comparisons: 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; 45320cc2a42SHoward Hinnanttemplate<class T, class U> 4543739fe79SHoward Hinnant bool operator>(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; 45520cc2a42SHoward Hinnanttemplate<class T, class U> 4563739fe79SHoward Hinnant bool operator<=(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; 45720cc2a42SHoward Hinnanttemplate<class T, class U> 4583739fe79SHoward Hinnant bool operator>=(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; 4593739fe79SHoward Hinnant 4603739fe79SHoward Hinnanttemplate <class T> 4613739fe79SHoward Hinnant bool operator==(const shared_ptr<T>& x, nullptr_t) noexcept; 4623739fe79SHoward Hinnanttemplate <class T> 4633739fe79SHoward Hinnant bool operator==(nullptr_t, const shared_ptr<T>& y) noexcept; 4643739fe79SHoward Hinnanttemplate <class T> 4653739fe79SHoward Hinnant bool operator!=(const shared_ptr<T>& x, nullptr_t) noexcept; 4663739fe79SHoward Hinnanttemplate <class T> 4673739fe79SHoward Hinnant bool operator!=(nullptr_t, const shared_ptr<T>& y) noexcept; 4683739fe79SHoward Hinnanttemplate <class T> 4693739fe79SHoward Hinnant bool operator<(const shared_ptr<T>& x, nullptr_t) noexcept; 4703739fe79SHoward Hinnanttemplate <class T> 4713739fe79SHoward Hinnantbool operator<(nullptr_t, const shared_ptr<T>& y) noexcept; 4723739fe79SHoward Hinnanttemplate <class T> 4733739fe79SHoward Hinnant bool operator<=(const shared_ptr<T>& x, nullptr_t) noexcept; 4743739fe79SHoward Hinnanttemplate <class T> 4753739fe79SHoward Hinnant bool operator<=(nullptr_t, const shared_ptr<T>& y) noexcept; 4763739fe79SHoward Hinnanttemplate <class T> 4773739fe79SHoward Hinnant bool operator>(const shared_ptr<T>& x, nullptr_t) noexcept; 4783739fe79SHoward Hinnanttemplate <class T> 4793739fe79SHoward Hinnant bool operator>(nullptr_t, const shared_ptr<T>& y) noexcept; 4803739fe79SHoward Hinnanttemplate <class T> 4813739fe79SHoward Hinnant bool operator>=(const shared_ptr<T>& x, nullptr_t) noexcept; 4823739fe79SHoward Hinnanttemplate <class T> 4833739fe79SHoward Hinnant bool operator>=(nullptr_t, const shared_ptr<T>& y) noexcept; 48420cc2a42SHoward Hinnant 48520cc2a42SHoward Hinnant// shared_ptr specialized algorithms: 4863739fe79SHoward Hinnanttemplate<class T> void swap(shared_ptr<T>& a, shared_ptr<T>& b) noexcept; 48720cc2a42SHoward Hinnant 48820cc2a42SHoward Hinnant// shared_ptr casts: 48920cc2a42SHoward Hinnanttemplate<class T, class U> 4903739fe79SHoward Hinnant shared_ptr<T> static_pointer_cast(shared_ptr<U> const& r) noexcept; 49120cc2a42SHoward Hinnanttemplate<class T, class U> 4923739fe79SHoward Hinnant shared_ptr<T> dynamic_pointer_cast(shared_ptr<U> const& r) noexcept; 49320cc2a42SHoward Hinnanttemplate<class T, class U> 4943739fe79SHoward Hinnant shared_ptr<T> const_pointer_cast(shared_ptr<U> const& r) noexcept; 49520cc2a42SHoward Hinnant 49620cc2a42SHoward Hinnant// shared_ptr I/O: 49720cc2a42SHoward Hinnanttemplate<class E, class T, class Y> 49820cc2a42SHoward Hinnant basic_ostream<E, T>& operator<< (basic_ostream<E, T>& os, shared_ptr<Y> const& p); 49920cc2a42SHoward Hinnant 50020cc2a42SHoward Hinnant// shared_ptr get_deleter: 5013739fe79SHoward Hinnanttemplate<class D, class T> D* get_deleter(shared_ptr<T> const& p) noexcept; 50220cc2a42SHoward Hinnant 50320cc2a42SHoward Hinnanttemplate<class T, class... Args> 50420cc2a42SHoward Hinnant shared_ptr<T> make_shared(Args&&... args); 50520cc2a42SHoward Hinnanttemplate<class T, class A, class... Args> 50620cc2a42SHoward Hinnant shared_ptr<T> allocate_shared(const A& a, Args&&... args); 50720cc2a42SHoward Hinnant 50820cc2a42SHoward Hinnanttemplate<class T> 50920cc2a42SHoward Hinnantclass weak_ptr 51020cc2a42SHoward Hinnant{ 51120cc2a42SHoward Hinnantpublic: 51220cc2a42SHoward Hinnant typedef T element_type; 51320cc2a42SHoward Hinnant 51420cc2a42SHoward Hinnant // constructors 5153739fe79SHoward Hinnant constexpr weak_ptr() noexcept; 5163739fe79SHoward Hinnant template<class Y> weak_ptr(shared_ptr<Y> const& r) noexcept; 5173739fe79SHoward Hinnant weak_ptr(weak_ptr const& r) noexcept; 5183739fe79SHoward Hinnant template<class Y> weak_ptr(weak_ptr<Y> const& r) noexcept; 5194703f763SMarshall Clow weak_ptr(weak_ptr&& r) noexcept; // C++14 5204703f763SMarshall Clow template<class Y> weak_ptr(weak_ptr<Y>&& r) noexcept; // C++14 52120cc2a42SHoward Hinnant 52220cc2a42SHoward Hinnant // destructor 52320cc2a42SHoward Hinnant ~weak_ptr(); 52420cc2a42SHoward Hinnant 52520cc2a42SHoward Hinnant // assignment 5263739fe79SHoward Hinnant weak_ptr& operator=(weak_ptr const& r) noexcept; 5273739fe79SHoward Hinnant template<class Y> weak_ptr& operator=(weak_ptr<Y> const& r) noexcept; 5283739fe79SHoward Hinnant template<class Y> weak_ptr& operator=(shared_ptr<Y> const& r) noexcept; 5294703f763SMarshall Clow weak_ptr& operator=(weak_ptr&& r) noexcept; // C++14 5304703f763SMarshall Clow template<class Y> weak_ptr& operator=(weak_ptr<Y>&& r) noexcept; // C++14 53120cc2a42SHoward Hinnant 53220cc2a42SHoward Hinnant // modifiers 5333739fe79SHoward Hinnant void swap(weak_ptr& r) noexcept; 5343739fe79SHoward Hinnant void reset() noexcept; 53520cc2a42SHoward Hinnant 53620cc2a42SHoward Hinnant // observers 5373739fe79SHoward Hinnant long use_count() const noexcept; 5383739fe79SHoward Hinnant bool expired() const noexcept; 5393739fe79SHoward Hinnant shared_ptr<T> lock() const noexcept; 54036bc7178SMarshall Clow template<class U> bool owner_before(shared_ptr<U> const& b) const noexcept; 54136bc7178SMarshall Clow template<class U> bool owner_before(weak_ptr<U> const& b) const noexcept; 54220cc2a42SHoward Hinnant}; 54320cc2a42SHoward Hinnant 54420cc2a42SHoward Hinnant// weak_ptr specialized algorithms: 5453739fe79SHoward Hinnanttemplate<class T> void swap(weak_ptr<T>& a, weak_ptr<T>& b) noexcept; 54620cc2a42SHoward Hinnant 54720cc2a42SHoward Hinnant// class owner_less: 54820cc2a42SHoward Hinnanttemplate<class T> struct owner_less; 54920cc2a42SHoward Hinnant 55020cc2a42SHoward Hinnanttemplate<class T> 55120cc2a42SHoward Hinnantstruct owner_less<shared_ptr<T>> 55220cc2a42SHoward Hinnant : binary_function<shared_ptr<T>, shared_ptr<T>, bool> 55320cc2a42SHoward Hinnant{ 55420cc2a42SHoward Hinnant typedef bool result_type; 55536bc7178SMarshall Clow bool operator()(shared_ptr<T> const&, shared_ptr<T> const&) const noexcept; 55636bc7178SMarshall Clow bool operator()(shared_ptr<T> const&, weak_ptr<T> const&) const noexcept; 55736bc7178SMarshall Clow bool operator()(weak_ptr<T> const&, shared_ptr<T> const&) const noexcept; 55820cc2a42SHoward Hinnant}; 55920cc2a42SHoward Hinnant 56020cc2a42SHoward Hinnanttemplate<class T> 56120cc2a42SHoward Hinnantstruct owner_less<weak_ptr<T>> 56220cc2a42SHoward Hinnant : binary_function<weak_ptr<T>, weak_ptr<T>, bool> 56320cc2a42SHoward Hinnant{ 56420cc2a42SHoward Hinnant typedef bool result_type; 56536bc7178SMarshall Clow bool operator()(weak_ptr<T> const&, weak_ptr<T> const&) const noexcept; 56636bc7178SMarshall Clow bool operator()(shared_ptr<T> const&, weak_ptr<T> const&) const noexcept; 56736bc7178SMarshall Clow bool operator()(weak_ptr<T> const&, shared_ptr<T> const&) const noexcept; 56836bc7178SMarshall Clow}; 56936bc7178SMarshall Clow 57036bc7178SMarshall Clowtemplate <> // Added in C++14 57136bc7178SMarshall Clowstruct owner_less<void> 57236bc7178SMarshall Clow{ 57336bc7178SMarshall Clow template <class _Tp, class _Up> 57436bc7178SMarshall Clow bool operator()( shared_ptr<_Tp> const& __x, shared_ptr<_Up> const& __y) const noexcept; 57536bc7178SMarshall Clow template <class _Tp, class _Up> 57636bc7178SMarshall Clow bool operator()( shared_ptr<_Tp> const& __x, weak_ptr<_Up> const& __y) const noexcept; 57736bc7178SMarshall Clow template <class _Tp, class _Up> 57836bc7178SMarshall Clow bool operator()( weak_ptr<_Tp> const& __x, shared_ptr<_Up> const& __y) const noexcept; 57936bc7178SMarshall Clow template <class _Tp, class _Up> 58036bc7178SMarshall Clow bool operator()( weak_ptr<_Tp> const& __x, weak_ptr<_Up> const& __y) const noexcept; 58136bc7178SMarshall Clow 58236bc7178SMarshall Clow typedef void is_transparent; 58320cc2a42SHoward Hinnant}; 58420cc2a42SHoward Hinnant 58520cc2a42SHoward Hinnanttemplate<class T> 58620cc2a42SHoward Hinnantclass enable_shared_from_this 58720cc2a42SHoward Hinnant{ 58820cc2a42SHoward Hinnantprotected: 5893739fe79SHoward Hinnant constexpr enable_shared_from_this() noexcept; 5903739fe79SHoward Hinnant enable_shared_from_this(enable_shared_from_this const&) noexcept; 5913739fe79SHoward Hinnant enable_shared_from_this& operator=(enable_shared_from_this const&) noexcept; 59220cc2a42SHoward Hinnant ~enable_shared_from_this(); 59320cc2a42SHoward Hinnantpublic: 59420cc2a42SHoward Hinnant shared_ptr<T> shared_from_this(); 59520cc2a42SHoward Hinnant shared_ptr<T const> shared_from_this() const; 59620cc2a42SHoward Hinnant}; 59720cc2a42SHoward Hinnant 59820cc2a42SHoward Hinnanttemplate<class T> 59920cc2a42SHoward Hinnant bool atomic_is_lock_free(const shared_ptr<T>* p); 60020cc2a42SHoward Hinnanttemplate<class T> 60120cc2a42SHoward Hinnant shared_ptr<T> atomic_load(const shared_ptr<T>* p); 60220cc2a42SHoward Hinnanttemplate<class T> 60320cc2a42SHoward Hinnant shared_ptr<T> atomic_load_explicit(const shared_ptr<T>* p, memory_order mo); 60420cc2a42SHoward Hinnanttemplate<class T> 60520cc2a42SHoward Hinnant void atomic_store(shared_ptr<T>* p, shared_ptr<T> r); 60620cc2a42SHoward Hinnanttemplate<class T> 60720cc2a42SHoward Hinnant void atomic_store_explicit(shared_ptr<T>* p, shared_ptr<T> r, memory_order mo); 60820cc2a42SHoward Hinnanttemplate<class T> 60920cc2a42SHoward Hinnant shared_ptr<T> atomic_exchange(shared_ptr<T>* p, shared_ptr<T> r); 61020cc2a42SHoward Hinnanttemplate<class T> 61120cc2a42SHoward Hinnant shared_ptr<T> 61220cc2a42SHoward Hinnant atomic_exchange_explicit(shared_ptr<T>* p, shared_ptr<T> r, memory_order mo); 61320cc2a42SHoward Hinnanttemplate<class T> 61420cc2a42SHoward Hinnant bool 61520cc2a42SHoward Hinnant atomic_compare_exchange_weak(shared_ptr<T>* p, shared_ptr<T>* v, shared_ptr<T> w); 61620cc2a42SHoward Hinnanttemplate<class T> 61720cc2a42SHoward Hinnant bool 61820cc2a42SHoward Hinnant atomic_compare_exchange_strong( shared_ptr<T>* p, shared_ptr<T>* v, shared_ptr<T> w); 61920cc2a42SHoward Hinnanttemplate<class T> 62020cc2a42SHoward Hinnant bool 62120cc2a42SHoward Hinnant atomic_compare_exchange_weak_explicit(shared_ptr<T>* p, shared_ptr<T>* v, 62220cc2a42SHoward Hinnant shared_ptr<T> w, memory_order success, 62320cc2a42SHoward Hinnant memory_order failure); 62420cc2a42SHoward Hinnanttemplate<class T> 62520cc2a42SHoward Hinnant bool 62620cc2a42SHoward Hinnant atomic_compare_exchange_strong_explicit(shared_ptr<T>* p, shared_ptr<T>* v, 62720cc2a42SHoward Hinnant shared_ptr<T> w, memory_order success, 62820cc2a42SHoward Hinnant memory_order failure); 62920cc2a42SHoward Hinnant// Hash support 63020cc2a42SHoward Hinnanttemplate <class T> struct hash; 63120cc2a42SHoward Hinnanttemplate <class T, class D> struct hash<unique_ptr<T, D> >; 63220cc2a42SHoward Hinnanttemplate <class T> struct hash<shared_ptr<T> >; 63320cc2a42SHoward Hinnant 63440a01d53SMarshall Clowtemplate <class T, class Alloc> 63540a01d53SMarshall Clow inline constexpr bool uses_allocator_v = uses_allocator<T, Alloc>::value; 63640a01d53SMarshall Clow 63720cc2a42SHoward Hinnant// Pointer safety 63820cc2a42SHoward Hinnantenum class pointer_safety { relaxed, preferred, strict }; 63920cc2a42SHoward Hinnantvoid declare_reachable(void *p); 64020cc2a42SHoward Hinnanttemplate <class T> T *undeclare_reachable(T *p); 64120cc2a42SHoward Hinnantvoid declare_no_pointers(char *p, size_t n); 64220cc2a42SHoward Hinnantvoid undeclare_no_pointers(char *p, size_t n); 6433739fe79SHoward Hinnantpointer_safety get_pointer_safety() noexcept; 64420cc2a42SHoward Hinnant 6453e519524SHoward Hinnantvoid* align(size_t alignment, size_t size, void*& ptr, size_t& space); 6463e519524SHoward Hinnant 6473e519524SHoward Hinnant} // std 6483e519524SHoward Hinnant 6493e519524SHoward Hinnant*/ 6503e519524SHoward Hinnant 6513e519524SHoward Hinnant#include <__config> 6523e519524SHoward Hinnant#include <type_traits> 6533e519524SHoward Hinnant#include <typeinfo> 6543e519524SHoward Hinnant#include <cstddef> 6553e519524SHoward Hinnant#include <cstdint> 6563e519524SHoward Hinnant#include <new> 6573e519524SHoward Hinnant#include <utility> 6583e519524SHoward Hinnant#include <limits> 6593e519524SHoward Hinnant#include <iterator> 6603e519524SHoward Hinnant#include <__functional_base> 661e3163f5aSHoward Hinnant#include <iosfwd> 662a87b5e34SHoward Hinnant#include <tuple> 6634524d6e7SEric Fiselier#include <stdexcept> 6649741d6c9SHoward Hinnant#include <cstring> 665c88580c4SEric Fiselier#include <cassert> 666749adebaSEric Fiselier#if !defined(_LIBCPP_HAS_NO_ATOMIC_HEADER) 667d77851e8SHoward Hinnant# include <atomic> 668d77851e8SHoward Hinnant#endif 669d77851e8SHoward Hinnant 670073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 6713e519524SHoward Hinnant#pragma GCC system_header 672073458b1SHoward Hinnant#endif 6733e519524SHoward Hinnant 674a016efb1SEric Fiselier_LIBCPP_PUSH_MACROS 675a016efb1SEric Fiselier#include <__undef_macros> 676a016efb1SEric Fiselier 677a016efb1SEric Fiselier 6783e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 6793e519524SHoward Hinnant 6801faf289eSEric Fiseliertemplate <class _ValueType> 6811faf289eSEric Fiselierinline _LIBCPP_ALWAYS_INLINE 6821faf289eSEric Fiselier_ValueType __libcpp_relaxed_load(_ValueType const* __value) { 6831faf289eSEric Fiselier#if !defined(_LIBCPP_HAS_NO_THREADS) && \ 6841faf289eSEric Fiselier defined(__ATOMIC_RELAXED) && \ 6851faf289eSEric Fiselier (__has_builtin(__atomic_load_n) || _GNUC_VER >= 407) 6861faf289eSEric Fiselier return __atomic_load_n(__value, __ATOMIC_RELAXED); 6871faf289eSEric Fiselier#else 6881faf289eSEric Fiselier return *__value; 6891faf289eSEric Fiselier#endif 6901faf289eSEric Fiselier} 6911faf289eSEric Fiselier 692224264adSKuba Breckatemplate <class _ValueType> 693224264adSKuba Breckainline _LIBCPP_ALWAYS_INLINE 694224264adSKuba Brecka_ValueType __libcpp_acquire_load(_ValueType const* __value) { 695224264adSKuba Brecka#if !defined(_LIBCPP_HAS_NO_THREADS) && \ 696224264adSKuba Brecka defined(__ATOMIC_ACQUIRE) && \ 697224264adSKuba Brecka (__has_builtin(__atomic_load_n) || _GNUC_VER >= 407) 698224264adSKuba Brecka return __atomic_load_n(__value, __ATOMIC_ACQUIRE); 699224264adSKuba Brecka#else 700224264adSKuba Brecka return *__value; 701224264adSKuba Brecka#endif 702224264adSKuba Brecka} 703224264adSKuba Brecka 7041c7fe126SMarshall Clow// addressof moved to <type_traits> 70564ec101eSDouglas Gregor 7063e519524SHoward Hinnanttemplate <class _Tp> class allocator; 7073e519524SHoward Hinnant 7083e519524SHoward Hinnanttemplate <> 709e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS allocator<void> 7103e519524SHoward Hinnant{ 7113e519524SHoward Hinnantpublic: 7123e519524SHoward Hinnant typedef void* pointer; 7133e519524SHoward Hinnant typedef const void* const_pointer; 7143e519524SHoward Hinnant typedef void value_type; 7153e519524SHoward Hinnant 7163e519524SHoward Hinnant template <class _Up> struct rebind {typedef allocator<_Up> other;}; 7173e519524SHoward Hinnant}; 7183e519524SHoward Hinnant 71921fa1887SHoward Hinnanttemplate <> 720e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS allocator<const void> 72121fa1887SHoward Hinnant{ 72221fa1887SHoward Hinnantpublic: 72321fa1887SHoward Hinnant typedef const void* pointer; 72421fa1887SHoward Hinnant typedef const void* const_pointer; 72521fa1887SHoward Hinnant typedef const void value_type; 72621fa1887SHoward Hinnant 72721fa1887SHoward Hinnant template <class _Up> struct rebind {typedef allocator<_Up> other;}; 72821fa1887SHoward Hinnant}; 72921fa1887SHoward Hinnant 7303e519524SHoward Hinnant// pointer_traits 7313e519524SHoward Hinnant 732b082f11fSMarshall Clowtemplate <class _Tp, class = void> 733b082f11fSMarshall Clowstruct __has_element_type : false_type {}; 734b082f11fSMarshall Clow 7353e519524SHoward Hinnanttemplate <class _Tp> 736b082f11fSMarshall Clowstruct __has_element_type<_Tp, 737b082f11fSMarshall Clow typename __void_t<typename _Tp::element_type>::type> : true_type {}; 7383e519524SHoward Hinnant 7393e519524SHoward Hinnanttemplate <class _Ptr, bool = __has_element_type<_Ptr>::value> 7403e519524SHoward Hinnantstruct __pointer_traits_element_type; 7413e519524SHoward Hinnant 7423e519524SHoward Hinnanttemplate <class _Ptr> 7433e519524SHoward Hinnantstruct __pointer_traits_element_type<_Ptr, true> 7443e519524SHoward Hinnant{ 7453e519524SHoward Hinnant typedef typename _Ptr::element_type type; 7463e519524SHoward Hinnant}; 7473e519524SHoward Hinnant 7483e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 7493e519524SHoward Hinnant 7503e519524SHoward Hinnanttemplate <template <class, class...> class _Sp, class _Tp, class ..._Args> 7513e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _Args...>, true> 7523e519524SHoward Hinnant{ 7533e519524SHoward Hinnant typedef typename _Sp<_Tp, _Args...>::element_type type; 7543e519524SHoward Hinnant}; 7553e519524SHoward Hinnant 7563e519524SHoward Hinnanttemplate <template <class, class...> class _Sp, class _Tp, class ..._Args> 7573e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _Args...>, false> 7583e519524SHoward Hinnant{ 7593e519524SHoward Hinnant typedef _Tp type; 7603e519524SHoward Hinnant}; 7613e519524SHoward Hinnant 762b3371f6fSHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 7633e519524SHoward Hinnant 7643e519524SHoward Hinnanttemplate <template <class> class _Sp, class _Tp> 7653e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp>, true> 7663e519524SHoward Hinnant{ 7673e519524SHoward Hinnant typedef typename _Sp<_Tp>::element_type type; 7683e519524SHoward Hinnant}; 7693e519524SHoward Hinnant 7703e519524SHoward Hinnanttemplate <template <class> class _Sp, class _Tp> 7713e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp>, false> 7723e519524SHoward Hinnant{ 7733e519524SHoward Hinnant typedef _Tp type; 7743e519524SHoward Hinnant}; 7753e519524SHoward Hinnant 7763e519524SHoward Hinnanttemplate <template <class, class> class _Sp, class _Tp, class _A0> 7773e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0>, true> 7783e519524SHoward Hinnant{ 7793e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0>::element_type type; 7803e519524SHoward Hinnant}; 7813e519524SHoward Hinnant 7823e519524SHoward Hinnanttemplate <template <class, class> class _Sp, class _Tp, class _A0> 7833e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0>, false> 7843e519524SHoward Hinnant{ 7853e519524SHoward Hinnant typedef _Tp type; 7863e519524SHoward Hinnant}; 7873e519524SHoward Hinnant 7883e519524SHoward Hinnanttemplate <template <class, class, class> class _Sp, class _Tp, class _A0, class _A1> 7893e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1>, true> 7903e519524SHoward Hinnant{ 7913e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1>::element_type type; 7923e519524SHoward Hinnant}; 7933e519524SHoward Hinnant 7943e519524SHoward Hinnanttemplate <template <class, class, class> class _Sp, class _Tp, class _A0, class _A1> 7953e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1>, false> 7963e519524SHoward Hinnant{ 7973e519524SHoward Hinnant typedef _Tp 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>, true> 8033e519524SHoward Hinnant{ 8043e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1, _A2>::element_type type; 8053e519524SHoward Hinnant}; 8063e519524SHoward Hinnant 8073e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Sp, class _Tp, class _A0, 8083e519524SHoward Hinnant class _A1, class _A2> 8093e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1, _A2>, false> 8103e519524SHoward Hinnant{ 8113e519524SHoward Hinnant typedef _Tp type; 8123e519524SHoward Hinnant}; 8133e519524SHoward Hinnant 814b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 8153e519524SHoward Hinnant 816b082f11fSMarshall Clowtemplate <class _Tp, class = void> 817b082f11fSMarshall Clowstruct __has_difference_type : false_type {}; 818b082f11fSMarshall Clow 8193e519524SHoward Hinnanttemplate <class _Tp> 820b082f11fSMarshall Clowstruct __has_difference_type<_Tp, 821b082f11fSMarshall Clow typename __void_t<typename _Tp::difference_type>::type> : true_type {}; 8223e519524SHoward Hinnant 8233e519524SHoward Hinnanttemplate <class _Ptr, bool = __has_difference_type<_Ptr>::value> 8243e519524SHoward Hinnantstruct __pointer_traits_difference_type 8253e519524SHoward Hinnant{ 8263e519524SHoward Hinnant typedef ptrdiff_t type; 8273e519524SHoward Hinnant}; 8283e519524SHoward Hinnant 8293e519524SHoward Hinnanttemplate <class _Ptr> 8303e519524SHoward Hinnantstruct __pointer_traits_difference_type<_Ptr, true> 8313e519524SHoward Hinnant{ 8323e519524SHoward Hinnant typedef typename _Ptr::difference_type type; 8333e519524SHoward Hinnant}; 8343e519524SHoward Hinnant 8353e519524SHoward Hinnanttemplate <class _Tp, class _Up> 8363e519524SHoward Hinnantstruct __has_rebind 8373e519524SHoward Hinnant{ 8383e519524SHoward Hinnantprivate: 83954d333a6SHoward Hinnant struct __two {char __lx; char __lxx;}; 8403e519524SHoward Hinnant template <class _Xp> static __two __test(...); 8413e519524SHoward Hinnant template <class _Xp> static char __test(typename _Xp::template rebind<_Up>* = 0); 8423e519524SHoward Hinnantpublic: 8433e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 8443e519524SHoward Hinnant}; 8453e519524SHoward Hinnant 8463e519524SHoward Hinnanttemplate <class _Tp, class _Up, bool = __has_rebind<_Tp, _Up>::value> 8473e519524SHoward Hinnantstruct __pointer_traits_rebind 8483e519524SHoward Hinnant{ 84954613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 8503e519524SHoward Hinnant typedef typename _Tp::template rebind<_Up> type; 8513e519524SHoward Hinnant#else 8523e519524SHoward Hinnant typedef typename _Tp::template rebind<_Up>::other type; 8533e519524SHoward Hinnant#endif 8543e519524SHoward Hinnant}; 8553e519524SHoward Hinnant 8563e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 8573e519524SHoward Hinnant 8583e519524SHoward Hinnanttemplate <template <class, class...> class _Sp, class _Tp, class ..._Args, class _Up> 8593e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _Args...>, _Up, true> 8603e519524SHoward Hinnant{ 86154613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 8623e519524SHoward Hinnant typedef typename _Sp<_Tp, _Args...>::template rebind<_Up> type; 8633e519524SHoward Hinnant#else 8643e519524SHoward Hinnant typedef typename _Sp<_Tp, _Args...>::template rebind<_Up>::other type; 8653e519524SHoward Hinnant#endif 8663e519524SHoward Hinnant}; 8673e519524SHoward Hinnant 8683e519524SHoward Hinnanttemplate <template <class, class...> class _Sp, class _Tp, class ..._Args, class _Up> 8693e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _Args...>, _Up, false> 8703e519524SHoward Hinnant{ 8713e519524SHoward Hinnant typedef _Sp<_Up, _Args...> type; 8723e519524SHoward Hinnant}; 8733e519524SHoward Hinnant 874b3371f6fSHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 8753e519524SHoward Hinnant 8763e519524SHoward Hinnanttemplate <template <class> class _Sp, class _Tp, class _Up> 8773e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp>, _Up, true> 8783e519524SHoward Hinnant{ 87954613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 8803e519524SHoward Hinnant typedef typename _Sp<_Tp>::template rebind<_Up> type; 8813e519524SHoward Hinnant#else 8823e519524SHoward Hinnant typedef typename _Sp<_Tp>::template rebind<_Up>::other type; 8833e519524SHoward Hinnant#endif 8843e519524SHoward Hinnant}; 8853e519524SHoward Hinnant 8863e519524SHoward Hinnanttemplate <template <class> class _Sp, class _Tp, class _Up> 8873e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp>, _Up, false> 8883e519524SHoward Hinnant{ 8893e519524SHoward Hinnant typedef _Sp<_Up> type; 8903e519524SHoward Hinnant}; 8913e519524SHoward Hinnant 8923e519524SHoward Hinnanttemplate <template <class, class> class _Sp, class _Tp, class _A0, class _Up> 8933e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0>, _Up, true> 8943e519524SHoward Hinnant{ 89554613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 8963e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0>::template rebind<_Up> type; 8973e519524SHoward Hinnant#else 8983e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0>::template rebind<_Up>::other type; 8993e519524SHoward Hinnant#endif 9003e519524SHoward Hinnant}; 9013e519524SHoward Hinnant 9023e519524SHoward Hinnanttemplate <template <class, class> class _Sp, class _Tp, class _A0, class _Up> 9033e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0>, _Up, false> 9043e519524SHoward Hinnant{ 9053e519524SHoward Hinnant typedef _Sp<_Up, _A0> type; 9063e519524SHoward Hinnant}; 9073e519524SHoward Hinnant 9083e519524SHoward Hinnanttemplate <template <class, class, class> class _Sp, class _Tp, class _A0, 9093e519524SHoward Hinnant class _A1, class _Up> 9103e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1>, _Up, true> 9113e519524SHoward Hinnant{ 91254613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 9133e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1>::template rebind<_Up> type; 9143e519524SHoward Hinnant#else 9153e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1>::template rebind<_Up>::other type; 9163e519524SHoward Hinnant#endif 9173e519524SHoward Hinnant}; 9183e519524SHoward Hinnant 9193e519524SHoward Hinnanttemplate <template <class, class, class> class _Sp, class _Tp, class _A0, 9203e519524SHoward Hinnant class _A1, class _Up> 9213e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1>, _Up, false> 9223e519524SHoward Hinnant{ 9233e519524SHoward Hinnant typedef _Sp<_Up, _A0, _A1> type; 9243e519524SHoward Hinnant}; 9253e519524SHoward Hinnant 9263e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Sp, class _Tp, class _A0, 9273e519524SHoward Hinnant class _A1, class _A2, class _Up> 9283e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1, _A2>, _Up, true> 9293e519524SHoward Hinnant{ 93054613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 9313e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1, _A2>::template rebind<_Up> type; 9323e519524SHoward Hinnant#else 9333e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1, _A2>::template rebind<_Up>::other type; 9343e519524SHoward Hinnant#endif 9353e519524SHoward Hinnant}; 9363e519524SHoward Hinnant 9373e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Sp, class _Tp, class _A0, 9383e519524SHoward Hinnant class _A1, class _A2, class _Up> 9393e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1, _A2>, _Up, false> 9403e519524SHoward Hinnant{ 9413e519524SHoward Hinnant typedef _Sp<_Up, _A0, _A1, _A2> type; 9423e519524SHoward Hinnant}; 9433e519524SHoward Hinnant 944b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 9453e519524SHoward Hinnant 9463e519524SHoward Hinnanttemplate <class _Ptr> 947e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS pointer_traits 9483e519524SHoward Hinnant{ 9493e519524SHoward Hinnant typedef _Ptr pointer; 9503e519524SHoward Hinnant typedef typename __pointer_traits_element_type<pointer>::type element_type; 9513e519524SHoward Hinnant typedef typename __pointer_traits_difference_type<pointer>::type difference_type; 9523e519524SHoward Hinnant 95354613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 954f7384975SHoward Hinnant template <class _Up> using rebind = typename __pointer_traits_rebind<pointer, _Up>::type; 9553e519524SHoward Hinnant#else 9563e519524SHoward Hinnant template <class _Up> struct rebind 9573e519524SHoward Hinnant {typedef typename __pointer_traits_rebind<pointer, _Up>::type other;}; 95854613ab4SEric Fiselier#endif // _LIBCPP_CXX03_LANG 9593e519524SHoward Hinnant 9603e519524SHoward Hinnantprivate: 9613e519524SHoward Hinnant struct __nat {}; 9623e519524SHoward Hinnantpublic: 963848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9643e519524SHoward Hinnant static pointer pointer_to(typename conditional<is_void<element_type>::value, 9653e519524SHoward Hinnant __nat, element_type>::type& __r) 9663e519524SHoward Hinnant {return pointer::pointer_to(__r);} 9673e519524SHoward Hinnant}; 9683e519524SHoward Hinnant 9693e519524SHoward Hinnanttemplate <class _Tp> 970e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS pointer_traits<_Tp*> 9713e519524SHoward Hinnant{ 9723e519524SHoward Hinnant typedef _Tp* pointer; 9733e519524SHoward Hinnant typedef _Tp element_type; 9743e519524SHoward Hinnant typedef ptrdiff_t difference_type; 9753e519524SHoward Hinnant 97654613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 9773e519524SHoward Hinnant template <class _Up> using rebind = _Up*; 9783e519524SHoward Hinnant#else 9793e519524SHoward Hinnant template <class _Up> struct rebind {typedef _Up* other;}; 9803e519524SHoward Hinnant#endif 9813e519524SHoward Hinnant 9823e519524SHoward Hinnantprivate: 9833e519524SHoward Hinnant struct __nat {}; 9843e519524SHoward Hinnantpublic: 985848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9863e519524SHoward Hinnant static pointer pointer_to(typename conditional<is_void<element_type>::value, 9873739fe79SHoward Hinnant __nat, element_type>::type& __r) _NOEXCEPT 988ce48a113SHoward Hinnant {return _VSTD::addressof(__r);} 9893e519524SHoward Hinnant}; 9903e519524SHoward Hinnant 9911c813407SEric Fiseliertemplate <class _From, class _To> 9921c813407SEric Fiselierstruct __rebind_pointer { 99354613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 9941c813407SEric Fiselier typedef typename pointer_traits<_From>::template rebind<_To> type; 9951c813407SEric Fiselier#else 9961c813407SEric Fiselier typedef typename pointer_traits<_From>::template rebind<_To>::other type; 9971c813407SEric Fiselier#endif 9981c813407SEric Fiselier}; 9991c813407SEric Fiselier 10003e519524SHoward Hinnant// allocator_traits 10013e519524SHoward Hinnant 1002b082f11fSMarshall Clowtemplate <class _Tp, class = void> 1003b082f11fSMarshall Clowstruct __has_pointer_type : false_type {}; 10043e519524SHoward Hinnant 10053e519524SHoward Hinnanttemplate <class _Tp> 1006b082f11fSMarshall Clowstruct __has_pointer_type<_Tp, 1007b082f11fSMarshall Clow typename __void_t<typename _Tp::pointer>::type> : true_type {}; 10083e519524SHoward Hinnant 10093e519524SHoward Hinnantnamespace __pointer_type_imp 10103e519524SHoward Hinnant{ 10113e519524SHoward Hinnant 10123e519524SHoward Hinnanttemplate <class _Tp, class _Dp, bool = __has_pointer_type<_Dp>::value> 10133e519524SHoward Hinnantstruct __pointer_type 10143e519524SHoward Hinnant{ 10153e519524SHoward Hinnant typedef typename _Dp::pointer type; 10163e519524SHoward Hinnant}; 10173e519524SHoward Hinnant 10183e519524SHoward Hinnanttemplate <class _Tp, class _Dp> 10193e519524SHoward Hinnantstruct __pointer_type<_Tp, _Dp, false> 10203e519524SHoward Hinnant{ 10213e519524SHoward Hinnant typedef _Tp* type; 10223e519524SHoward Hinnant}; 10233e519524SHoward Hinnant 1024a4a1ef1fSHoward Hinnant} // __pointer_type_imp 10253e519524SHoward Hinnant 10263e519524SHoward Hinnanttemplate <class _Tp, class _Dp> 10273e519524SHoward Hinnantstruct __pointer_type 10283e519524SHoward Hinnant{ 10293e519524SHoward Hinnant typedef typename __pointer_type_imp::__pointer_type<_Tp, typename remove_reference<_Dp>::type>::type type; 10303e519524SHoward Hinnant}; 10313e519524SHoward Hinnant 1032b082f11fSMarshall Clowtemplate <class _Tp, class = void> 1033b082f11fSMarshall Clowstruct __has_const_pointer : false_type {}; 1034b082f11fSMarshall Clow 10353e519524SHoward Hinnanttemplate <class _Tp> 1036b082f11fSMarshall Clowstruct __has_const_pointer<_Tp, 1037b082f11fSMarshall Clow typename __void_t<typename _Tp::const_pointer>::type> : true_type {}; 10383e519524SHoward Hinnant 10393e519524SHoward Hinnanttemplate <class _Tp, class _Ptr, class _Alloc, bool = __has_const_pointer<_Alloc>::value> 10403e519524SHoward Hinnantstruct __const_pointer 10413e519524SHoward Hinnant{ 10423e519524SHoward Hinnant typedef typename _Alloc::const_pointer type; 10433e519524SHoward Hinnant}; 10443e519524SHoward Hinnant 10453e519524SHoward Hinnanttemplate <class _Tp, class _Ptr, class _Alloc> 10463e519524SHoward Hinnantstruct __const_pointer<_Tp, _Ptr, _Alloc, false> 10473e519524SHoward Hinnant{ 104854613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 10493e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<const _Tp> type; 10503e519524SHoward Hinnant#else 10513e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<const _Tp>::other type; 10523e519524SHoward Hinnant#endif 10533e519524SHoward Hinnant}; 10543e519524SHoward Hinnant 1055b082f11fSMarshall Clowtemplate <class _Tp, class = void> 1056b082f11fSMarshall Clowstruct __has_void_pointer : false_type {}; 1057b082f11fSMarshall Clow 10583e519524SHoward Hinnanttemplate <class _Tp> 1059b082f11fSMarshall Clowstruct __has_void_pointer<_Tp, 1060b082f11fSMarshall Clow typename __void_t<typename _Tp::void_pointer>::type> : true_type {}; 10613e519524SHoward Hinnant 10623e519524SHoward Hinnanttemplate <class _Ptr, class _Alloc, bool = __has_void_pointer<_Alloc>::value> 10633e519524SHoward Hinnantstruct __void_pointer 10643e519524SHoward Hinnant{ 10653e519524SHoward Hinnant typedef typename _Alloc::void_pointer type; 10663e519524SHoward Hinnant}; 10673e519524SHoward Hinnant 10683e519524SHoward Hinnanttemplate <class _Ptr, class _Alloc> 10693e519524SHoward Hinnantstruct __void_pointer<_Ptr, _Alloc, false> 10703e519524SHoward Hinnant{ 107154613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 10723e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<void> type; 10733e519524SHoward Hinnant#else 10743e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<void>::other type; 10753e519524SHoward Hinnant#endif 10763e519524SHoward Hinnant}; 10773e519524SHoward Hinnant 1078b082f11fSMarshall Clowtemplate <class _Tp, class = void> 1079b082f11fSMarshall Clowstruct __has_const_void_pointer : false_type {}; 1080b082f11fSMarshall Clow 10813e519524SHoward Hinnanttemplate <class _Tp> 1082b082f11fSMarshall Clowstruct __has_const_void_pointer<_Tp, 1083b082f11fSMarshall Clow typename __void_t<typename _Tp::const_void_pointer>::type> : true_type {}; 10843e519524SHoward Hinnant 10853e519524SHoward Hinnanttemplate <class _Ptr, class _Alloc, bool = __has_const_void_pointer<_Alloc>::value> 10863e519524SHoward Hinnantstruct __const_void_pointer 10873e519524SHoward Hinnant{ 10883e519524SHoward Hinnant typedef typename _Alloc::const_void_pointer type; 10893e519524SHoward Hinnant}; 10903e519524SHoward Hinnant 10913e519524SHoward Hinnanttemplate <class _Ptr, class _Alloc> 10923e519524SHoward Hinnantstruct __const_void_pointer<_Ptr, _Alloc, false> 10933e519524SHoward Hinnant{ 109454613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 10953e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<const void> type; 10963e519524SHoward Hinnant#else 10973e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<const void>::other type; 10983e519524SHoward Hinnant#endif 10993e519524SHoward Hinnant}; 11003e519524SHoward Hinnant 1101c003db1fSHoward Hinnanttemplate <class _Tp> 110232952747SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 1103c003db1fSHoward Hinnant_Tp* 1104c003db1fSHoward Hinnant__to_raw_pointer(_Tp* __p) _NOEXCEPT 11053e519524SHoward Hinnant{ 11063e519524SHoward Hinnant return __p; 11073e519524SHoward Hinnant} 11083e519524SHoward Hinnant 110932952747SEric Fiselier#if _LIBCPP_STD_VER <= 17 11103e519524SHoward Hinnanttemplate <class _Pointer> 11113e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 11123e519524SHoward Hinnanttypename pointer_traits<_Pointer>::element_type* 11133739fe79SHoward Hinnant__to_raw_pointer(_Pointer __p) _NOEXCEPT 11143e519524SHoward Hinnant{ 1115ce48a113SHoward Hinnant return _VSTD::__to_raw_pointer(__p.operator->()); 11163e519524SHoward Hinnant} 111732952747SEric Fiselier#else 111832952747SEric Fiseliertemplate <class _Pointer> 111932952747SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 112032952747SEric Fiselierauto 112132952747SEric Fiselier__to_raw_pointer(const _Pointer& __p) _NOEXCEPT 112232952747SEric Fiselier-> decltype(pointer_traits<_Pointer>::to_address(__p)) 112332952747SEric Fiselier{ 112432952747SEric Fiselier return pointer_traits<_Pointer>::to_address(__p); 112532952747SEric Fiselier} 112632952747SEric Fiselier 112732952747SEric Fiseliertemplate <class _Pointer, class... _None> 112832952747SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 112932952747SEric Fiselierauto 113032952747SEric Fiselier__to_raw_pointer(const _Pointer& __p, _None...) _NOEXCEPT 113132952747SEric Fiselier{ 113232952747SEric Fiselier return _VSTD::__to_raw_pointer(__p.operator->()); 113332952747SEric Fiselier} 113432952747SEric Fiselier 113532952747SEric Fiseliertemplate <class _Tp> 113632952747SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY constexpr 113732952747SEric Fiselier_Tp* 113832952747SEric Fiselierto_address(_Tp* __p) _NOEXCEPT 113932952747SEric Fiselier{ 114032952747SEric Fiselier static_assert(!is_function_v<_Tp>, "_Tp is a function type"); 114132952747SEric Fiselier return __p; 114232952747SEric Fiselier} 114332952747SEric Fiselier 114432952747SEric Fiseliertemplate <class _Pointer> 114532952747SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 114632952747SEric Fiselierauto 114732952747SEric Fiselierto_address(const _Pointer& __p) _NOEXCEPT 114832952747SEric Fiselier{ 114932952747SEric Fiselier return _VSTD::__to_raw_pointer(__p); 115032952747SEric Fiselier} 115132952747SEric Fiselier#endif 11523e519524SHoward Hinnant 1153b082f11fSMarshall Clowtemplate <class _Tp, class = void> 1154b082f11fSMarshall Clowstruct __has_size_type : false_type {}; 1155b082f11fSMarshall Clow 11563e519524SHoward Hinnanttemplate <class _Tp> 1157b082f11fSMarshall Clowstruct __has_size_type<_Tp, 1158b082f11fSMarshall Clow typename __void_t<typename _Tp::size_type>::type> : true_type {}; 11593e519524SHoward Hinnant 1160a4a1ef1fSHoward Hinnanttemplate <class _Alloc, class _DiffType, bool = __has_size_type<_Alloc>::value> 11613e519524SHoward Hinnantstruct __size_type 11623e519524SHoward Hinnant{ 1163a4a1ef1fSHoward Hinnant typedef typename make_unsigned<_DiffType>::type type; 11643e519524SHoward Hinnant}; 11653e519524SHoward Hinnant 1166a4a1ef1fSHoward Hinnanttemplate <class _Alloc, class _DiffType> 1167a4a1ef1fSHoward Hinnantstruct __size_type<_Alloc, _DiffType, true> 11683e519524SHoward Hinnant{ 11693e519524SHoward Hinnant typedef typename _Alloc::size_type type; 11703e519524SHoward Hinnant}; 11713e519524SHoward Hinnant 1172b082f11fSMarshall Clowtemplate <class _Tp, class = void> 1173b082f11fSMarshall Clowstruct __has_propagate_on_container_copy_assignment : false_type {}; 1174b082f11fSMarshall Clow 11753e519524SHoward Hinnanttemplate <class _Tp> 1176b082f11fSMarshall Clowstruct __has_propagate_on_container_copy_assignment<_Tp, 1177b082f11fSMarshall Clow typename __void_t<typename _Tp::propagate_on_container_copy_assignment>::type> 1178b082f11fSMarshall Clow : true_type {}; 11793e519524SHoward Hinnant 11803e519524SHoward Hinnanttemplate <class _Alloc, bool = __has_propagate_on_container_copy_assignment<_Alloc>::value> 11813e519524SHoward Hinnantstruct __propagate_on_container_copy_assignment 11823e519524SHoward Hinnant{ 11833e519524SHoward Hinnant typedef false_type type; 11843e519524SHoward Hinnant}; 11853e519524SHoward Hinnant 11863e519524SHoward Hinnanttemplate <class _Alloc> 11873e519524SHoward Hinnantstruct __propagate_on_container_copy_assignment<_Alloc, true> 11883e519524SHoward Hinnant{ 11893e519524SHoward Hinnant typedef typename _Alloc::propagate_on_container_copy_assignment type; 11903e519524SHoward Hinnant}; 11913e519524SHoward Hinnant 1192b082f11fSMarshall Clowtemplate <class _Tp, class = void> 1193b082f11fSMarshall Clowstruct __has_propagate_on_container_move_assignment : false_type {}; 1194b082f11fSMarshall Clow 11953e519524SHoward Hinnanttemplate <class _Tp> 1196b082f11fSMarshall Clowstruct __has_propagate_on_container_move_assignment<_Tp, 1197b082f11fSMarshall Clow typename __void_t<typename _Tp::propagate_on_container_move_assignment>::type> 1198b082f11fSMarshall Clow : true_type {}; 11993e519524SHoward Hinnant 12003e519524SHoward Hinnanttemplate <class _Alloc, bool = __has_propagate_on_container_move_assignment<_Alloc>::value> 12013e519524SHoward Hinnantstruct __propagate_on_container_move_assignment 12023e519524SHoward Hinnant{ 12033e519524SHoward Hinnant typedef false_type type; 12043e519524SHoward Hinnant}; 12053e519524SHoward Hinnant 12063e519524SHoward Hinnanttemplate <class _Alloc> 12073e519524SHoward Hinnantstruct __propagate_on_container_move_assignment<_Alloc, true> 12083e519524SHoward Hinnant{ 12093e519524SHoward Hinnant typedef typename _Alloc::propagate_on_container_move_assignment type; 12103e519524SHoward Hinnant}; 12113e519524SHoward Hinnant 1212b082f11fSMarshall Clowtemplate <class _Tp, class = void> 1213b082f11fSMarshall Clowstruct __has_propagate_on_container_swap : false_type {}; 1214b082f11fSMarshall Clow 12153e519524SHoward Hinnanttemplate <class _Tp> 1216b082f11fSMarshall Clowstruct __has_propagate_on_container_swap<_Tp, 1217b082f11fSMarshall Clow typename __void_t<typename _Tp::propagate_on_container_swap>::type> 1218b082f11fSMarshall Clow : true_type {}; 12193e519524SHoward Hinnant 12203e519524SHoward Hinnanttemplate <class _Alloc, bool = __has_propagate_on_container_swap<_Alloc>::value> 12213e519524SHoward Hinnantstruct __propagate_on_container_swap 12223e519524SHoward Hinnant{ 12233e519524SHoward Hinnant typedef false_type type; 12243e519524SHoward Hinnant}; 12253e519524SHoward Hinnant 12263e519524SHoward Hinnanttemplate <class _Alloc> 12273e519524SHoward Hinnantstruct __propagate_on_container_swap<_Alloc, true> 12283e519524SHoward Hinnant{ 12293e519524SHoward Hinnant typedef typename _Alloc::propagate_on_container_swap type; 12303e519524SHoward Hinnant}; 12313e519524SHoward Hinnant 1232b082f11fSMarshall Clowtemplate <class _Tp, class = void> 1233b082f11fSMarshall Clowstruct __has_is_always_equal : false_type {}; 1234b082f11fSMarshall Clow 123531a47313SMarshall Clowtemplate <class _Tp> 1236b082f11fSMarshall Clowstruct __has_is_always_equal<_Tp, 1237b082f11fSMarshall Clow typename __void_t<typename _Tp::is_always_equal>::type> 1238b082f11fSMarshall Clow : true_type {}; 123931a47313SMarshall Clow 124031a47313SMarshall Clowtemplate <class _Alloc, bool = __has_is_always_equal<_Alloc>::value> 124131a47313SMarshall Clowstruct __is_always_equal 124231a47313SMarshall Clow{ 124331a47313SMarshall Clow typedef typename _VSTD::is_empty<_Alloc>::type type; 124431a47313SMarshall Clow}; 124531a47313SMarshall Clow 124631a47313SMarshall Clowtemplate <class _Alloc> 124731a47313SMarshall Clowstruct __is_always_equal<_Alloc, true> 124831a47313SMarshall Clow{ 124931a47313SMarshall Clow typedef typename _Alloc::is_always_equal type; 125031a47313SMarshall Clow}; 125131a47313SMarshall Clow 12523e519524SHoward Hinnanttemplate <class _Tp, class _Up, bool = __has_rebind<_Tp, _Up>::value> 12533e519524SHoward Hinnantstruct __has_rebind_other 12543e519524SHoward Hinnant{ 12553e519524SHoward Hinnantprivate: 125654d333a6SHoward Hinnant struct __two {char __lx; char __lxx;}; 12573e519524SHoward Hinnant template <class _Xp> static __two __test(...); 12583e519524SHoward Hinnant template <class _Xp> static char __test(typename _Xp::template rebind<_Up>::other* = 0); 12593e519524SHoward Hinnantpublic: 12603e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 12613e519524SHoward Hinnant}; 12623e519524SHoward Hinnant 12633e519524SHoward Hinnanttemplate <class _Tp, class _Up> 12643e519524SHoward Hinnantstruct __has_rebind_other<_Tp, _Up, false> 12653e519524SHoward Hinnant{ 12663e519524SHoward Hinnant static const bool value = false; 12673e519524SHoward Hinnant}; 12683e519524SHoward Hinnant 12693e519524SHoward Hinnanttemplate <class _Tp, class _Up, bool = __has_rebind_other<_Tp, _Up>::value> 12703e519524SHoward Hinnantstruct __allocator_traits_rebind 12713e519524SHoward Hinnant{ 12723e519524SHoward Hinnant typedef typename _Tp::template rebind<_Up>::other type; 12733e519524SHoward Hinnant}; 12743e519524SHoward Hinnant 12753e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 12763e519524SHoward Hinnant 12773e519524SHoward Hinnanttemplate <template <class, class...> class _Alloc, class _Tp, class ..._Args, class _Up> 12783e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _Args...>, _Up, true> 12793e519524SHoward Hinnant{ 12803e519524SHoward Hinnant typedef typename _Alloc<_Tp, _Args...>::template rebind<_Up>::other type; 12813e519524SHoward Hinnant}; 12823e519524SHoward Hinnant 12833e519524SHoward Hinnanttemplate <template <class, class...> class _Alloc, class _Tp, class ..._Args, class _Up> 12843e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _Args...>, _Up, false> 12853e519524SHoward Hinnant{ 12863e519524SHoward Hinnant typedef _Alloc<_Up, _Args...> type; 12873e519524SHoward Hinnant}; 12883e519524SHoward Hinnant 1289b3371f6fSHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 12903e519524SHoward Hinnant 12913e519524SHoward Hinnanttemplate <template <class> class _Alloc, class _Tp, class _Up> 12923e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp>, _Up, true> 12933e519524SHoward Hinnant{ 12943e519524SHoward Hinnant typedef typename _Alloc<_Tp>::template rebind<_Up>::other type; 12953e519524SHoward Hinnant}; 12963e519524SHoward Hinnant 12973e519524SHoward Hinnanttemplate <template <class> class _Alloc, class _Tp, class _Up> 12983e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp>, _Up, false> 12993e519524SHoward Hinnant{ 13003e519524SHoward Hinnant typedef _Alloc<_Up> 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, true> 13053e519524SHoward Hinnant{ 13063e519524SHoward Hinnant typedef typename _Alloc<_Tp, _A0>::template rebind<_Up>::other type; 13073e519524SHoward Hinnant}; 13083e519524SHoward Hinnant 13093e519524SHoward Hinnanttemplate <template <class, class> class _Alloc, class _Tp, class _A0, class _Up> 13103e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0>, _Up, false> 13113e519524SHoward Hinnant{ 13123e519524SHoward Hinnant typedef _Alloc<_Up, _A0> type; 13133e519524SHoward Hinnant}; 13143e519524SHoward Hinnant 13153e519524SHoward Hinnanttemplate <template <class, class, class> class _Alloc, class _Tp, class _A0, 13163e519524SHoward Hinnant class _A1, class _Up> 13173e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1>, _Up, true> 13183e519524SHoward Hinnant{ 13193e519524SHoward Hinnant typedef typename _Alloc<_Tp, _A0, _A1>::template rebind<_Up>::other type; 13203e519524SHoward Hinnant}; 13213e519524SHoward Hinnant 13223e519524SHoward Hinnanttemplate <template <class, class, class> class _Alloc, class _Tp, class _A0, 13233e519524SHoward Hinnant class _A1, class _Up> 13243e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1>, _Up, false> 13253e519524SHoward Hinnant{ 13263e519524SHoward Hinnant typedef _Alloc<_Up, _A0, _A1> type; 13273e519524SHoward Hinnant}; 13283e519524SHoward Hinnant 13293e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Alloc, class _Tp, class _A0, 13303e519524SHoward Hinnant class _A1, class _A2, class _Up> 13313e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1, _A2>, _Up, true> 13323e519524SHoward Hinnant{ 13333e519524SHoward Hinnant typedef typename _Alloc<_Tp, _A0, _A1, _A2>::template rebind<_Up>::other type; 13343e519524SHoward Hinnant}; 13353e519524SHoward Hinnant 13363e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Alloc, class _Tp, class _A0, 13373e519524SHoward Hinnant class _A1, class _A2, class _Up> 13383e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1, _A2>, _Up, false> 13393e519524SHoward Hinnant{ 13403e519524SHoward Hinnant typedef _Alloc<_Up, _A0, _A1, _A2> type; 13413e519524SHoward Hinnant}; 13423e519524SHoward Hinnant 1343b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 13443e519524SHoward Hinnant 134554613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 13463e519524SHoward Hinnant 13473e519524SHoward Hinnanttemplate <class _Alloc, class _SizeType, class _ConstVoidPtr> 13483e519524SHoward Hinnantauto 13493e519524SHoward Hinnant__has_allocate_hint_test(_Alloc&& __a, _SizeType&& __sz, _ConstVoidPtr&& __p) 13509f8fef95SEric Fiselier -> decltype((void)__a.allocate(__sz, __p), true_type()); 13513e519524SHoward Hinnant 13523e519524SHoward Hinnanttemplate <class _Alloc, class _SizeType, class _ConstVoidPtr> 13533e519524SHoward Hinnantauto 13543e519524SHoward Hinnant__has_allocate_hint_test(const _Alloc& __a, _SizeType&& __sz, _ConstVoidPtr&& __p) 13553e519524SHoward Hinnant -> false_type; 13563e519524SHoward Hinnant 13573e519524SHoward Hinnanttemplate <class _Alloc, class _SizeType, class _ConstVoidPtr> 13583e519524SHoward Hinnantstruct __has_allocate_hint 13593e519524SHoward Hinnant : integral_constant<bool, 13603e519524SHoward Hinnant is_same< 13619f8fef95SEric Fiselier decltype(_VSTD::__has_allocate_hint_test(declval<_Alloc>(), 13623e519524SHoward Hinnant declval<_SizeType>(), 13633e519524SHoward Hinnant declval<_ConstVoidPtr>())), 13643e519524SHoward Hinnant true_type>::value> 13653e519524SHoward Hinnant{ 13663e519524SHoward Hinnant}; 13673e519524SHoward Hinnant 136854613ab4SEric Fiselier#else // _LIBCPP_CXX03_LANG 13693e519524SHoward Hinnant 13703e519524SHoward Hinnanttemplate <class _Alloc, class _SizeType, class _ConstVoidPtr> 13713e519524SHoward Hinnantstruct __has_allocate_hint 13723e519524SHoward Hinnant : true_type 13733e519524SHoward Hinnant{ 13743e519524SHoward Hinnant}; 13753e519524SHoward Hinnant 137654613ab4SEric Fiselier#endif // _LIBCPP_CXX03_LANG 13773e519524SHoward Hinnant 137854613ab4SEric Fiselier#if !defined(_LIBCPP_CXX03_LANG) 13793e519524SHoward Hinnant 13803e519524SHoward Hinnanttemplate <class _Alloc, class _Tp, class ..._Args> 1381ce48a113SHoward Hinnantdecltype(_VSTD::declval<_Alloc>().construct(_VSTD::declval<_Tp*>(), 1382ce48a113SHoward Hinnant _VSTD::declval<_Args>()...), 13833e519524SHoward Hinnant true_type()) 13843e519524SHoward Hinnant__has_construct_test(_Alloc&& __a, _Tp* __p, _Args&& ...__args); 13853e519524SHoward Hinnant 13863e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer, class ..._Args> 13873e519524SHoward Hinnantfalse_type 13883e519524SHoward Hinnant__has_construct_test(const _Alloc& __a, _Pointer&& __p, _Args&& ...__args); 13893e519524SHoward Hinnant 13903e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer, class ..._Args> 13913e519524SHoward Hinnantstruct __has_construct 13923e519524SHoward Hinnant : integral_constant<bool, 13933e519524SHoward Hinnant is_same< 13949f8fef95SEric Fiselier decltype(_VSTD::__has_construct_test(declval<_Alloc>(), 13953e519524SHoward Hinnant declval<_Pointer>(), 13963e519524SHoward Hinnant declval<_Args>()...)), 13973e519524SHoward Hinnant true_type>::value> 13983e519524SHoward Hinnant{ 13993e519524SHoward Hinnant}; 14003e519524SHoward Hinnant 14013e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer> 14023e519524SHoward Hinnantauto 14033e519524SHoward Hinnant__has_destroy_test(_Alloc&& __a, _Pointer&& __p) 14043e519524SHoward Hinnant -> decltype(__a.destroy(__p), true_type()); 14053e519524SHoward Hinnant 14063e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer> 14073e519524SHoward Hinnantauto 14083e519524SHoward Hinnant__has_destroy_test(const _Alloc& __a, _Pointer&& __p) 14093e519524SHoward Hinnant -> false_type; 14103e519524SHoward Hinnant 14113e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer> 14123e519524SHoward Hinnantstruct __has_destroy 14133e519524SHoward Hinnant : integral_constant<bool, 14143e519524SHoward Hinnant is_same< 14159f8fef95SEric Fiselier decltype(_VSTD::__has_destroy_test(declval<_Alloc>(), 14163e519524SHoward Hinnant declval<_Pointer>())), 14173e519524SHoward Hinnant true_type>::value> 14183e519524SHoward Hinnant{ 14193e519524SHoward Hinnant}; 14203e519524SHoward Hinnant 14213e519524SHoward Hinnanttemplate <class _Alloc> 14223e519524SHoward Hinnantauto 14233e519524SHoward Hinnant__has_max_size_test(_Alloc&& __a) 14243e519524SHoward Hinnant -> decltype(__a.max_size(), true_type()); 14253e519524SHoward Hinnant 14263e519524SHoward Hinnanttemplate <class _Alloc> 14273e519524SHoward Hinnantauto 14283e519524SHoward Hinnant__has_max_size_test(const volatile _Alloc& __a) 14293e519524SHoward Hinnant -> false_type; 14303e519524SHoward Hinnant 14313e519524SHoward Hinnanttemplate <class _Alloc> 14323e519524SHoward Hinnantstruct __has_max_size 14333e519524SHoward Hinnant : integral_constant<bool, 14343e519524SHoward Hinnant is_same< 14359f8fef95SEric Fiselier decltype(_VSTD::__has_max_size_test(declval<_Alloc&>())), 14363e519524SHoward Hinnant true_type>::value> 14373e519524SHoward Hinnant{ 14383e519524SHoward Hinnant}; 14393e519524SHoward Hinnant 14403e519524SHoward Hinnanttemplate <class _Alloc> 14413e519524SHoward Hinnantauto 14423e519524SHoward Hinnant__has_select_on_container_copy_construction_test(_Alloc&& __a) 14433e519524SHoward Hinnant -> decltype(__a.select_on_container_copy_construction(), true_type()); 14443e519524SHoward Hinnant 14453e519524SHoward Hinnanttemplate <class _Alloc> 14463e519524SHoward Hinnantauto 14473e519524SHoward Hinnant__has_select_on_container_copy_construction_test(const volatile _Alloc& __a) 14483e519524SHoward Hinnant -> false_type; 14493e519524SHoward Hinnant 14503e519524SHoward Hinnanttemplate <class _Alloc> 14513e519524SHoward Hinnantstruct __has_select_on_container_copy_construction 14523e519524SHoward Hinnant : integral_constant<bool, 14533e519524SHoward Hinnant is_same< 14549f8fef95SEric Fiselier decltype(_VSTD::__has_select_on_container_copy_construction_test(declval<_Alloc&>())), 14553e519524SHoward Hinnant true_type>::value> 14563e519524SHoward Hinnant{ 14573e519524SHoward Hinnant}; 14583e519524SHoward Hinnant 145954613ab4SEric Fiselier#else // _LIBCPP_CXX03_LANG 14603e519524SHoward Hinnant 14613e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 14623e519524SHoward Hinnant 14633e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer, class ..._Args> 14643e519524SHoward Hinnantstruct __has_construct 14653e519524SHoward Hinnant : false_type 14663e519524SHoward Hinnant{ 14673e519524SHoward Hinnant}; 14683e519524SHoward Hinnant 14699741d6c9SHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 14709741d6c9SHoward Hinnant 14719741d6c9SHoward Hinnanttemplate <class _Alloc, class _Pointer, class _Args> 14729741d6c9SHoward Hinnantstruct __has_construct 14739741d6c9SHoward Hinnant : false_type 14749741d6c9SHoward Hinnant{ 14759741d6c9SHoward Hinnant}; 14769741d6c9SHoward Hinnant 1477b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 14783e519524SHoward Hinnant 14793e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer> 14803e519524SHoward Hinnantstruct __has_destroy 14813e519524SHoward Hinnant : false_type 14823e519524SHoward Hinnant{ 14833e519524SHoward Hinnant}; 14843e519524SHoward Hinnant 14853e519524SHoward Hinnanttemplate <class _Alloc> 14863e519524SHoward Hinnantstruct __has_max_size 14873e519524SHoward Hinnant : true_type 14883e519524SHoward Hinnant{ 14893e519524SHoward Hinnant}; 14903e519524SHoward Hinnant 14913e519524SHoward Hinnanttemplate <class _Alloc> 14923e519524SHoward Hinnantstruct __has_select_on_container_copy_construction 14933e519524SHoward Hinnant : false_type 14943e519524SHoward Hinnant{ 14953e519524SHoward Hinnant}; 14963e519524SHoward Hinnant 149754613ab4SEric Fiselier#endif // _LIBCPP_CXX03_LANG 14983e519524SHoward Hinnant 1499a4a1ef1fSHoward Hinnanttemplate <class _Alloc, class _Ptr, bool = __has_difference_type<_Alloc>::value> 1500a4a1ef1fSHoward Hinnantstruct __alloc_traits_difference_type 1501a4a1ef1fSHoward Hinnant{ 1502a4a1ef1fSHoward Hinnant typedef typename pointer_traits<_Ptr>::difference_type type; 1503a4a1ef1fSHoward Hinnant}; 1504a4a1ef1fSHoward Hinnant 1505a4a1ef1fSHoward Hinnanttemplate <class _Alloc, class _Ptr> 1506a4a1ef1fSHoward Hinnantstruct __alloc_traits_difference_type<_Alloc, _Ptr, true> 1507a4a1ef1fSHoward Hinnant{ 1508a4a1ef1fSHoward Hinnant typedef typename _Alloc::difference_type type; 1509a4a1ef1fSHoward Hinnant}; 1510a4a1ef1fSHoward Hinnant 15113e519524SHoward Hinnanttemplate <class _Alloc> 1512e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS allocator_traits 15133e519524SHoward Hinnant{ 15143e519524SHoward Hinnant typedef _Alloc allocator_type; 15153e519524SHoward Hinnant typedef typename allocator_type::value_type value_type; 15163e519524SHoward Hinnant 15173e519524SHoward Hinnant typedef typename __pointer_type<value_type, allocator_type>::type pointer; 15183e519524SHoward Hinnant typedef typename __const_pointer<value_type, pointer, allocator_type>::type const_pointer; 15193e519524SHoward Hinnant typedef typename __void_pointer<pointer, allocator_type>::type void_pointer; 15203e519524SHoward Hinnant typedef typename __const_void_pointer<pointer, allocator_type>::type const_void_pointer; 15213e519524SHoward Hinnant 1522a4a1ef1fSHoward Hinnant typedef typename __alloc_traits_difference_type<allocator_type, pointer>::type difference_type; 1523a4a1ef1fSHoward Hinnant typedef typename __size_type<allocator_type, difference_type>::type size_type; 15243e519524SHoward Hinnant 15253e519524SHoward Hinnant typedef typename __propagate_on_container_copy_assignment<allocator_type>::type 15263e519524SHoward Hinnant propagate_on_container_copy_assignment; 15273e519524SHoward Hinnant typedef typename __propagate_on_container_move_assignment<allocator_type>::type 15283e519524SHoward Hinnant propagate_on_container_move_assignment; 15293e519524SHoward Hinnant typedef typename __propagate_on_container_swap<allocator_type>::type 15303e519524SHoward Hinnant propagate_on_container_swap; 153131a47313SMarshall Clow typedef typename __is_always_equal<allocator_type>::type 153231a47313SMarshall Clow is_always_equal; 15333e519524SHoward Hinnant 153454613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 15353e519524SHoward Hinnant template <class _Tp> using rebind_alloc = 1536f7384975SHoward Hinnant typename __allocator_traits_rebind<allocator_type, _Tp>::type; 15373e519524SHoward Hinnant template <class _Tp> using rebind_traits = allocator_traits<rebind_alloc<_Tp>>; 153854613ab4SEric Fiselier#else // _LIBCPP_CXX03_LANG 15393e519524SHoward Hinnant template <class _Tp> struct rebind_alloc 15403e519524SHoward Hinnant {typedef typename __allocator_traits_rebind<allocator_type, _Tp>::type other;}; 15413e519524SHoward Hinnant template <class _Tp> struct rebind_traits 15423e519524SHoward Hinnant {typedef allocator_traits<typename rebind_alloc<_Tp>::other> other;}; 154354613ab4SEric Fiselier#endif // _LIBCPP_CXX03_LANG 15443e519524SHoward Hinnant 15453fddff51SMarshall Clow _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 15463e519524SHoward Hinnant static pointer allocate(allocator_type& __a, size_type __n) 15473e519524SHoward Hinnant {return __a.allocate(__n);} 15483fddff51SMarshall Clow _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 15493e519524SHoward Hinnant static pointer allocate(allocator_type& __a, size_type __n, const_void_pointer __hint) 15509ffacf3dSEric Fiselier {return __allocate(__a, __n, __hint, 15513e519524SHoward Hinnant __has_allocate_hint<allocator_type, size_type, const_void_pointer>());} 15523e519524SHoward Hinnant 1553848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15543739fe79SHoward Hinnant static void deallocate(allocator_type& __a, pointer __p, size_type __n) _NOEXCEPT 15553e519524SHoward Hinnant {__a.deallocate(__p, __n);} 15563e519524SHoward Hinnant 15573e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 15583e519524SHoward Hinnant template <class _Tp, class... _Args> 1559848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15603e519524SHoward Hinnant static void construct(allocator_type& __a, _Tp* __p, _Args&&... __args) 1561981f31acSMarshall Clow {__construct(__has_construct<allocator_type, _Tp*, _Args...>(), 1562ce48a113SHoward Hinnant __a, __p, _VSTD::forward<_Args>(__args)...);} 1563b3371f6fSHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 15643e519524SHoward Hinnant template <class _Tp> 1565848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1566a595b7f0SEric Fiselier static void construct(allocator_type&, _Tp* __p) 15673e519524SHoward Hinnant { 15683e519524SHoward Hinnant ::new ((void*)__p) _Tp(); 15693e519524SHoward Hinnant } 15703e519524SHoward Hinnant template <class _Tp, class _A0> 1571848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1572a595b7f0SEric Fiselier static void construct(allocator_type&, _Tp* __p, const _A0& __a0) 15733e519524SHoward Hinnant { 15743e519524SHoward Hinnant ::new ((void*)__p) _Tp(__a0); 15753e519524SHoward Hinnant } 15763e519524SHoward Hinnant template <class _Tp, class _A0, class _A1> 1577848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1578a595b7f0SEric Fiselier static void construct(allocator_type&, _Tp* __p, const _A0& __a0, 15793e519524SHoward Hinnant const _A1& __a1) 15803e519524SHoward Hinnant { 15813e519524SHoward Hinnant ::new ((void*)__p) _Tp(__a0, __a1); 15823e519524SHoward Hinnant } 15833e519524SHoward Hinnant template <class _Tp, class _A0, class _A1, class _A2> 1584848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1585a595b7f0SEric Fiselier static void construct(allocator_type&, _Tp* __p, const _A0& __a0, 15863e519524SHoward Hinnant const _A1& __a1, const _A2& __a2) 15873e519524SHoward Hinnant { 15883e519524SHoward Hinnant ::new ((void*)__p) _Tp(__a0, __a1, __a2); 15893e519524SHoward Hinnant } 1590b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 15913e519524SHoward Hinnant 15923e519524SHoward Hinnant template <class _Tp> 1593848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15943e519524SHoward Hinnant static void destroy(allocator_type& __a, _Tp* __p) 15953e519524SHoward Hinnant {__destroy(__has_destroy<allocator_type, _Tp*>(), __a, __p);} 15963e519524SHoward Hinnant 1597848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 159806fbed03SMarshall Clow static size_type max_size(const allocator_type& __a) _NOEXCEPT 15993e519524SHoward Hinnant {return __max_size(__has_max_size<const allocator_type>(), __a);} 16003e519524SHoward Hinnant 1601848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16023e519524SHoward Hinnant static allocator_type 16033e519524SHoward Hinnant select_on_container_copy_construction(const allocator_type& __a) 16049ffacf3dSEric Fiselier {return __select_on_container_copy_construction( 16053e519524SHoward Hinnant __has_select_on_container_copy_construction<const allocator_type>(), 16063e519524SHoward Hinnant __a);} 16073e519524SHoward Hinnant 16089741d6c9SHoward Hinnant template <class _Ptr> 16099741d6c9SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16109741d6c9SHoward Hinnant static 16119741d6c9SHoward Hinnant void 16129741d6c9SHoward Hinnant __construct_forward(allocator_type& __a, _Ptr __begin1, _Ptr __end1, _Ptr& __begin2) 16139741d6c9SHoward Hinnant { 16149741d6c9SHoward Hinnant for (; __begin1 != __end1; ++__begin1, ++__begin2) 16159741d6c9SHoward Hinnant construct(__a, _VSTD::__to_raw_pointer(__begin2), _VSTD::move_if_noexcept(*__begin1)); 16169741d6c9SHoward Hinnant } 16179741d6c9SHoward Hinnant 16189741d6c9SHoward Hinnant template <class _Tp> 16199741d6c9SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16209741d6c9SHoward Hinnant static 16219741d6c9SHoward Hinnant typename enable_if 16229741d6c9SHoward Hinnant < 16239741d6c9SHoward Hinnant (is_same<allocator_type, allocator<_Tp> >::value 16249741d6c9SHoward Hinnant || !__has_construct<allocator_type, _Tp*, _Tp>::value) && 16259741d6c9SHoward Hinnant is_trivially_move_constructible<_Tp>::value, 16269741d6c9SHoward Hinnant void 16279741d6c9SHoward Hinnant >::type 1628fd838227SEric Fiselier __construct_forward(allocator_type&, _Tp* __begin1, _Tp* __end1, _Tp*& __begin2) 16299741d6c9SHoward Hinnant { 16309741d6c9SHoward Hinnant ptrdiff_t _Np = __end1 - __begin1; 163187601befSMarshall Clow if (_Np > 0) 1632e6230742SMarshall Clow { 16339741d6c9SHoward Hinnant _VSTD::memcpy(__begin2, __begin1, _Np * sizeof(_Tp)); 16349741d6c9SHoward Hinnant __begin2 += _Np; 16359741d6c9SHoward Hinnant } 1636e6230742SMarshall Clow } 16379741d6c9SHoward Hinnant 1638e782178eSEric Fiselier template <class _Iter, class _Ptr> 1639e782178eSEric Fiselier _LIBCPP_INLINE_VISIBILITY 1640e782178eSEric Fiselier static 1641e782178eSEric Fiselier void 1642e782178eSEric Fiselier __construct_range_forward(allocator_type& __a, _Iter __begin1, _Iter __end1, _Ptr& __begin2) 1643e782178eSEric Fiselier { 1644e782178eSEric Fiselier for (; __begin1 != __end1; ++__begin1, (void) ++__begin2) 1645e782178eSEric Fiselier construct(__a, _VSTD::__to_raw_pointer(__begin2), *__begin1); 1646e782178eSEric Fiselier } 1647e782178eSEric Fiselier 1648e782178eSEric Fiselier template <class _Tp> 1649e782178eSEric Fiselier _LIBCPP_INLINE_VISIBILITY 1650e782178eSEric Fiselier static 1651e782178eSEric Fiselier typename enable_if 1652e782178eSEric Fiselier < 1653e782178eSEric Fiselier (is_same<allocator_type, allocator<_Tp> >::value 1654e782178eSEric Fiselier || !__has_construct<allocator_type, _Tp*, _Tp>::value) && 1655e782178eSEric Fiselier is_trivially_move_constructible<_Tp>::value, 1656e782178eSEric Fiselier void 1657e782178eSEric Fiselier >::type 1658fd838227SEric Fiselier __construct_range_forward(allocator_type&, _Tp* __begin1, _Tp* __end1, _Tp*& __begin2) 1659e782178eSEric Fiselier { 1660e782178eSEric Fiselier typedef typename remove_const<_Tp>::type _Vp; 1661e782178eSEric Fiselier ptrdiff_t _Np = __end1 - __begin1; 166287601befSMarshall Clow if (_Np > 0) 1663e6230742SMarshall Clow { 1664e782178eSEric Fiselier _VSTD::memcpy(const_cast<_Vp*>(__begin2), __begin1, _Np * sizeof(_Tp)); 1665e782178eSEric Fiselier __begin2 += _Np; 1666e782178eSEric Fiselier } 1667e6230742SMarshall Clow } 1668e782178eSEric Fiselier 16699741d6c9SHoward Hinnant template <class _Ptr> 16709741d6c9SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16719741d6c9SHoward Hinnant static 16729741d6c9SHoward Hinnant void 16739741d6c9SHoward Hinnant __construct_backward(allocator_type& __a, _Ptr __begin1, _Ptr __end1, _Ptr& __end2) 16749741d6c9SHoward Hinnant { 16759741d6c9SHoward Hinnant while (__end1 != __begin1) 16768d9aec88SHoward Hinnant { 16778d9aec88SHoward Hinnant construct(__a, _VSTD::__to_raw_pointer(__end2-1), _VSTD::move_if_noexcept(*--__end1)); 16788d9aec88SHoward Hinnant --__end2; 16798d9aec88SHoward Hinnant } 16809741d6c9SHoward Hinnant } 16819741d6c9SHoward Hinnant 16829741d6c9SHoward Hinnant template <class _Tp> 16839741d6c9SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16849741d6c9SHoward Hinnant static 16859741d6c9SHoward Hinnant typename enable_if 16869741d6c9SHoward Hinnant < 16879741d6c9SHoward Hinnant (is_same<allocator_type, allocator<_Tp> >::value 16889741d6c9SHoward Hinnant || !__has_construct<allocator_type, _Tp*, _Tp>::value) && 16899741d6c9SHoward Hinnant is_trivially_move_constructible<_Tp>::value, 16909741d6c9SHoward Hinnant void 16919741d6c9SHoward Hinnant >::type 1692fd838227SEric Fiselier __construct_backward(allocator_type&, _Tp* __begin1, _Tp* __end1, _Tp*& __end2) 16939741d6c9SHoward Hinnant { 16949741d6c9SHoward Hinnant ptrdiff_t _Np = __end1 - __begin1; 16959741d6c9SHoward Hinnant __end2 -= _Np; 169687601befSMarshall Clow if (_Np > 0) 16979741d6c9SHoward Hinnant _VSTD::memcpy(__end2, __begin1, _Np * sizeof(_Tp)); 16989741d6c9SHoward Hinnant } 16999741d6c9SHoward Hinnant 17003e519524SHoward Hinnantprivate: 17013e519524SHoward Hinnant 1702848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17039ffacf3dSEric Fiselier static pointer __allocate(allocator_type& __a, size_type __n, 17043e519524SHoward Hinnant const_void_pointer __hint, true_type) 17053e519524SHoward Hinnant {return __a.allocate(__n, __hint);} 1706848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17079ffacf3dSEric Fiselier static pointer __allocate(allocator_type& __a, size_type __n, 1708c206366fSHoward Hinnant const_void_pointer, false_type) 17093e519524SHoward Hinnant {return __a.allocate(__n);} 17103e519524SHoward Hinnant 17113e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 17123e519524SHoward Hinnant template <class _Tp, class... _Args> 1713848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17143e519524SHoward Hinnant static void __construct(true_type, allocator_type& __a, _Tp* __p, _Args&&... __args) 1715ce48a113SHoward Hinnant {__a.construct(__p, _VSTD::forward<_Args>(__args)...);} 17163e519524SHoward Hinnant template <class _Tp, class... _Args> 1717848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17183e519524SHoward Hinnant static void __construct(false_type, allocator_type&, _Tp* __p, _Args&&... __args) 17193e519524SHoward Hinnant { 1720ce48a113SHoward Hinnant ::new ((void*)__p) _Tp(_VSTD::forward<_Args>(__args)...); 17213e519524SHoward Hinnant } 1722b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 17233e519524SHoward Hinnant 17243e519524SHoward Hinnant template <class _Tp> 1725848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17263e519524SHoward Hinnant static void __destroy(true_type, allocator_type& __a, _Tp* __p) 17273e519524SHoward Hinnant {__a.destroy(__p);} 17283e519524SHoward Hinnant template <class _Tp> 1729848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17303e519524SHoward Hinnant static void __destroy(false_type, allocator_type&, _Tp* __p) 17313e519524SHoward Hinnant { 17323e519524SHoward Hinnant __p->~_Tp(); 17333e519524SHoward Hinnant } 17343e519524SHoward Hinnant 1735848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1736fa40ee77SMarshall Clow static size_type __max_size(true_type, const allocator_type& __a) _NOEXCEPT 17373e519524SHoward Hinnant {return __a.max_size();} 1738848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1739fa40ee77SMarshall Clow static size_type __max_size(false_type, const allocator_type&) _NOEXCEPT 1740b631c243SMarshall Clow {return numeric_limits<size_type>::max() / sizeof(value_type);} 17413e519524SHoward Hinnant 1742848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17433e519524SHoward Hinnant static allocator_type 17449ffacf3dSEric Fiselier __select_on_container_copy_construction(true_type, const allocator_type& __a) 17453e519524SHoward Hinnant {return __a.select_on_container_copy_construction();} 1746848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17473e519524SHoward Hinnant static allocator_type 17489ffacf3dSEric Fiselier __select_on_container_copy_construction(false_type, const allocator_type& __a) 17493e519524SHoward Hinnant {return __a;} 17503e519524SHoward Hinnant}; 17513e519524SHoward Hinnant 17521f508014SMarshall Clowtemplate <class _Traits, class _Tp> 17531f508014SMarshall Clowstruct __rebind_alloc_helper 17541f508014SMarshall Clow{ 175554613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 17561f508014SMarshall Clow typedef typename _Traits::template rebind_alloc<_Tp> type; 17571f508014SMarshall Clow#else 17581f508014SMarshall Clow typedef typename _Traits::template rebind_alloc<_Tp>::other type; 17591f508014SMarshall Clow#endif 17601f508014SMarshall Clow}; 17611f508014SMarshall Clow 17623e519524SHoward Hinnant// allocator 17633e519524SHoward Hinnant 17643e519524SHoward Hinnanttemplate <class _Tp> 1765e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS allocator 17663e519524SHoward Hinnant{ 17673e519524SHoward Hinnantpublic: 17683e519524SHoward Hinnant typedef size_t size_type; 17693e519524SHoward Hinnant typedef ptrdiff_t difference_type; 17703e519524SHoward Hinnant typedef _Tp* pointer; 17713e519524SHoward Hinnant typedef const _Tp* const_pointer; 17723e519524SHoward Hinnant typedef _Tp& reference; 17733e519524SHoward Hinnant typedef const _Tp& const_reference; 17743e519524SHoward Hinnant typedef _Tp value_type; 17753e519524SHoward Hinnant 1776b58f59cdSHoward Hinnant typedef true_type propagate_on_container_move_assignment; 177731a47313SMarshall Clow typedef true_type is_always_equal; 1778b58f59cdSHoward Hinnant 17793e519524SHoward Hinnant template <class _Up> struct rebind {typedef allocator<_Up> other;}; 17803e519524SHoward Hinnant 17813739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY allocator() _NOEXCEPT {} 17823739fe79SHoward Hinnant template <class _Up> _LIBCPP_INLINE_VISIBILITY allocator(const allocator<_Up>&) _NOEXCEPT {} 17833739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer address(reference __x) const _NOEXCEPT 1784ce48a113SHoward Hinnant {return _VSTD::addressof(__x);} 17853739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY const_pointer address(const_reference __x) const _NOEXCEPT 1786ce48a113SHoward Hinnant {return _VSTD::addressof(__x);} 17873fddff51SMarshall Clow _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 17883fddff51SMarshall Clow pointer allocate(size_type __n, allocator<void>::const_pointer = 0) 17894cec709eSMarshall Clow { 17904cec709eSMarshall Clow if (__n > max_size()) 17910fc8cec7SMarshall Clow __throw_length_error("allocator<T>::allocate(size_t n)" 17920fc8cec7SMarshall Clow " 'n' exceeds maximum supported size"); 17934cec709eSMarshall Clow return static_cast<pointer>(_VSTD::__allocate(__n * sizeof(_Tp))); 17944cec709eSMarshall Clow } 17953739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void deallocate(pointer __p, size_type) _NOEXCEPT 1796cd71f447SEric Fiselier {_VSTD::__libcpp_deallocate((void*)__p);} 17973739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT 17983739fe79SHoward Hinnant {return size_type(~0) / sizeof(_Tp);} 17997609c9b6SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 18003e519524SHoward Hinnant template <class _Up, class... _Args> 18013e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18023e519524SHoward Hinnant void 18033e519524SHoward Hinnant construct(_Up* __p, _Args&&... __args) 18043e519524SHoward Hinnant { 1805ce48a113SHoward Hinnant ::new((void*)__p) _Up(_VSTD::forward<_Args>(__args)...); 18063e519524SHoward Hinnant } 18077609c9b6SHoward Hinnant#else // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 18083e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18093e519524SHoward Hinnant void 18103e519524SHoward Hinnant construct(pointer __p) 18113e519524SHoward Hinnant { 18123e519524SHoward Hinnant ::new((void*)__p) _Tp(); 18133e519524SHoward Hinnant } 1814f5799be4SMichael J. Spencer# if defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) 1815bff1bfc6SHoward Hinnant 18163e519524SHoward Hinnant template <class _A0> 18173e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18183e519524SHoward Hinnant void 18193e519524SHoward Hinnant construct(pointer __p, _A0& __a0) 18203e519524SHoward Hinnant { 18213e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0); 18223e519524SHoward Hinnant } 18233e519524SHoward Hinnant template <class _A0> 18243e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18253e519524SHoward Hinnant void 18263e519524SHoward Hinnant construct(pointer __p, const _A0& __a0) 18273e519524SHoward Hinnant { 18283e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0); 18293e519524SHoward Hinnant } 1830f5799be4SMichael J. Spencer# endif // defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) 18313e519524SHoward Hinnant template <class _A0, class _A1> 18323e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18333e519524SHoward Hinnant void 18343e519524SHoward Hinnant construct(pointer __p, _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, const _A0& __a0, _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, _A0& __a0, const _A1& __a1) 18493e519524SHoward Hinnant { 18503e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 18513e519524SHoward Hinnant } 18523e519524SHoward Hinnant template <class _A0, class _A1> 18533e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18543e519524SHoward Hinnant void 18553e519524SHoward Hinnant construct(pointer __p, const _A0& __a0, const _A1& __a1) 18563e519524SHoward Hinnant { 18573e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 18583e519524SHoward Hinnant } 18597609c9b6SHoward Hinnant#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 18603e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void destroy(pointer __p) {__p->~_Tp();} 18613e519524SHoward Hinnant}; 18623e519524SHoward Hinnant 18638e25104bSHoward Hinnanttemplate <class _Tp> 1864e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS allocator<const _Tp> 18658e25104bSHoward Hinnant{ 18668e25104bSHoward Hinnantpublic: 18678e25104bSHoward Hinnant typedef size_t size_type; 18688e25104bSHoward Hinnant typedef ptrdiff_t difference_type; 18698e25104bSHoward Hinnant typedef const _Tp* pointer; 18708e25104bSHoward Hinnant typedef const _Tp* const_pointer; 18718e25104bSHoward Hinnant typedef const _Tp& reference; 18728e25104bSHoward Hinnant typedef const _Tp& const_reference; 187330444adcSHoward Hinnant typedef const _Tp value_type; 18748e25104bSHoward Hinnant 18758e25104bSHoward Hinnant typedef true_type propagate_on_container_move_assignment; 1876f43a42d5SMarshall Clow typedef true_type is_always_equal; 18778e25104bSHoward Hinnant 18788e25104bSHoward Hinnant template <class _Up> struct rebind {typedef allocator<_Up> other;}; 18798e25104bSHoward Hinnant 18808e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY allocator() _NOEXCEPT {} 18818e25104bSHoward Hinnant template <class _Up> _LIBCPP_INLINE_VISIBILITY allocator(const allocator<_Up>&) _NOEXCEPT {} 18828e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY const_pointer address(const_reference __x) const _NOEXCEPT 18838e25104bSHoward Hinnant {return _VSTD::addressof(__x);} 18848e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer allocate(size_type __n, allocator<void>::const_pointer = 0) 18854cec709eSMarshall Clow { 18864cec709eSMarshall Clow if (__n > max_size()) 18870fc8cec7SMarshall Clow __throw_length_error("allocator<const T>::allocate(size_t n)" 18880fc8cec7SMarshall Clow " 'n' exceeds maximum supported size"); 18894cec709eSMarshall Clow return static_cast<pointer>(_VSTD::__allocate(__n * sizeof(_Tp))); 18904cec709eSMarshall Clow } 18918e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY void deallocate(pointer __p, size_type) _NOEXCEPT 18924a911c86SMarshall Clow {_VSTD::__libcpp_deallocate((void*) const_cast<_Tp *>(__p));} 18938e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT 18948e25104bSHoward Hinnant {return size_type(~0) / sizeof(_Tp);} 18958e25104bSHoward Hinnant#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 18968e25104bSHoward Hinnant template <class _Up, class... _Args> 18978e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18988e25104bSHoward Hinnant void 18998e25104bSHoward Hinnant construct(_Up* __p, _Args&&... __args) 19008e25104bSHoward Hinnant { 19018e25104bSHoward Hinnant ::new((void*)__p) _Up(_VSTD::forward<_Args>(__args)...); 19028e25104bSHoward Hinnant } 19038e25104bSHoward Hinnant#else // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 19048e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19058e25104bSHoward Hinnant void 19068e25104bSHoward Hinnant construct(pointer __p) 19078e25104bSHoward Hinnant { 19084a911c86SMarshall Clow ::new((void*) const_cast<_Tp *>(__p)) _Tp(); 19098e25104bSHoward Hinnant } 19108e25104bSHoward Hinnant# if defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) 1911bff1bfc6SHoward Hinnant 19128e25104bSHoward Hinnant template <class _A0> 19138e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19148e25104bSHoward Hinnant void 19158e25104bSHoward Hinnant construct(pointer __p, _A0& __a0) 19168e25104bSHoward Hinnant { 19174a911c86SMarshall Clow ::new((void*) const_cast<_Tp *>(__p)) _Tp(__a0); 19188e25104bSHoward Hinnant } 19198e25104bSHoward Hinnant template <class _A0> 19208e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19218e25104bSHoward Hinnant void 19228e25104bSHoward Hinnant construct(pointer __p, const _A0& __a0) 19238e25104bSHoward Hinnant { 19244a911c86SMarshall Clow ::new((void*) const_cast<_Tp *>(__p)) _Tp(__a0); 19258e25104bSHoward Hinnant } 19268e25104bSHoward Hinnant# endif // defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) 19278e25104bSHoward Hinnant template <class _A0, class _A1> 19288e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19298e25104bSHoward Hinnant void 19308e25104bSHoward Hinnant construct(pointer __p, _A0& __a0, _A1& __a1) 19318e25104bSHoward Hinnant { 19324a911c86SMarshall Clow ::new((void*) const_cast<_Tp *>(__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, const _A0& __a0, _A1& __a1) 19388e25104bSHoward Hinnant { 19394a911c86SMarshall Clow ::new((void*) const_cast<_Tp *>(__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, _A0& __a0, const _A1& __a1) 19458e25104bSHoward Hinnant { 19464a911c86SMarshall Clow ::new((void*) const_cast<_Tp *>(__p)) _Tp(__a0, __a1); 19478e25104bSHoward Hinnant } 19488e25104bSHoward Hinnant template <class _A0, class _A1> 19498e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19508e25104bSHoward Hinnant void 19518e25104bSHoward Hinnant construct(pointer __p, const _A0& __a0, const _A1& __a1) 19528e25104bSHoward Hinnant { 19534a911c86SMarshall Clow ::new((void*) const_cast<_Tp *>(__p)) _Tp(__a0, __a1); 19548e25104bSHoward Hinnant } 19558e25104bSHoward Hinnant#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 19568e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY void destroy(pointer __p) {__p->~_Tp();} 19578e25104bSHoward Hinnant}; 19588e25104bSHoward Hinnant 19593e519524SHoward Hinnanttemplate <class _Tp, class _Up> 19603e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 19613739fe79SHoward Hinnantbool operator==(const allocator<_Tp>&, const allocator<_Up>&) _NOEXCEPT {return true;} 19623e519524SHoward Hinnant 19633e519524SHoward Hinnanttemplate <class _Tp, class _Up> 19643e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 19653739fe79SHoward Hinnantbool operator!=(const allocator<_Tp>&, const allocator<_Up>&) _NOEXCEPT {return false;} 19663e519524SHoward Hinnant 19673e519524SHoward Hinnanttemplate <class _OutputIterator, class _Tp> 1968e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS raw_storage_iterator 19693e519524SHoward Hinnant : public iterator<output_iterator_tag, 19703e519524SHoward Hinnant _Tp, // purposefully not C++03 19713e519524SHoward Hinnant ptrdiff_t, // purposefully not C++03 19723e519524SHoward Hinnant _Tp*, // purposefully not C++03 19733e519524SHoward Hinnant raw_storage_iterator<_OutputIterator, _Tp>&> // purposefully not C++03 19743e519524SHoward Hinnant{ 19753e519524SHoward Hinnantprivate: 19763e519524SHoward Hinnant _OutputIterator __x_; 19773e519524SHoward Hinnantpublic: 19783e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit raw_storage_iterator(_OutputIterator __x) : __x_(__x) {} 19793e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator*() {return *this;} 19803e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator=(const _Tp& __element) 19813e519524SHoward Hinnant {::new(&*__x_) _Tp(__element); return *this;} 19822603b075SMarshall Clow#if _LIBCPP_STD_VER >= 14 19832603b075SMarshall Clow _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator=(_Tp&& __element) 19842603b075SMarshall Clow {::new(&*__x_) _Tp(_VSTD::move(__element)); return *this;} 19852603b075SMarshall Clow#endif 19863e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator++() {++__x_; return *this;} 19873e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY raw_storage_iterator operator++(int) 19883e519524SHoward Hinnant {raw_storage_iterator __t(*this); ++__x_; return __t;} 1989783b372aSMarshall Clow#if _LIBCPP_STD_VER >= 14 1990783b372aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _OutputIterator base() const { return __x_; } 1991783b372aSMarshall Clow#endif 19923e519524SHoward Hinnant}; 19933e519524SHoward Hinnant 19943e519524SHoward Hinnanttemplate <class _Tp> 1995b89956c8SPeter Collingbourne_LIBCPP_NO_CFI 19963e519524SHoward Hinnantpair<_Tp*, ptrdiff_t> 19973739fe79SHoward Hinnantget_temporary_buffer(ptrdiff_t __n) _NOEXCEPT 19983e519524SHoward Hinnant{ 19993e519524SHoward Hinnant pair<_Tp*, ptrdiff_t> __r(0, 0); 20003e519524SHoward Hinnant const ptrdiff_t __m = (~ptrdiff_t(0) ^ 20013e519524SHoward Hinnant ptrdiff_t(ptrdiff_t(1) << (sizeof(ptrdiff_t) * __CHAR_BIT__ - 1))) 20023e519524SHoward Hinnant / sizeof(_Tp); 20033e519524SHoward Hinnant if (__n > __m) 20043e519524SHoward Hinnant __n = __m; 20053e519524SHoward Hinnant while (__n > 0) 20063e519524SHoward Hinnant { 20074e3195c9SRichard Smith#if !defined(_LIBCPP_HAS_NO_ALIGNED_ALLOCATION) 20084e3195c9SRichard Smith#if defined(__STDCPP_DEFAULT_NEW_ALIGNMENT__) 20094e3195c9SRichard Smith if (std::alignment_of<_Tp>::value > __STDCPP_DEFAULT_NEW_ALIGNMENT__) 20104e3195c9SRichard Smith#else 20114e3195c9SRichard Smith if (std::alignment_of<_Tp>::value > 20124e3195c9SRichard Smith std::alignment_of<std::max_align_t>::value) 20134e3195c9SRichard Smith#endif 20144e3195c9SRichard Smith { 20154e3195c9SRichard Smith std::align_val_t __al = 20164e3195c9SRichard Smith std::align_val_t(std::alignment_of<_Tp>::value); 20174e3195c9SRichard Smith __r.first = static_cast<_Tp*>(::operator new( 20184e3195c9SRichard Smith __n * sizeof(_Tp), __al, nothrow)); 20194e3195c9SRichard Smith } else { 20204e3195c9SRichard Smith __r.first = static_cast<_Tp*>(::operator new( 20214e3195c9SRichard Smith __n * sizeof(_Tp), nothrow)); 20224e3195c9SRichard Smith } 20234e3195c9SRichard Smith#else 20244e3195c9SRichard Smith#if defined(__STDCPP_DEFAULT_NEW_ALIGNMENT__) 20254e3195c9SRichard Smith if (std::alignment_of<_Tp>::value > __STDCPP_DEFAULT_NEW_ALIGNMENT__) 20264e3195c9SRichard Smith#else 20274e3195c9SRichard Smith if (std::alignment_of<_Tp>::value > 20284e3195c9SRichard Smith std::alignment_of<std::max_align_t>::value) 20294e3195c9SRichard Smith#endif 20304e3195c9SRichard Smith { 20314e3195c9SRichard Smith // Since aligned operator new is unavailable, return an empty 20324e3195c9SRichard Smith // buffer rather than one with invalid alignment. 20334e3195c9SRichard Smith return __r; 20344e3195c9SRichard Smith } 20354e3195c9SRichard Smith 20363e519524SHoward Hinnant __r.first = static_cast<_Tp*>(::operator new(__n * sizeof(_Tp), nothrow)); 20374e3195c9SRichard Smith#endif 20384e3195c9SRichard Smith 20393e519524SHoward Hinnant if (__r.first) 20403e519524SHoward Hinnant { 20413e519524SHoward Hinnant __r.second = __n; 20423e519524SHoward Hinnant break; 20433e519524SHoward Hinnant } 20443e519524SHoward Hinnant __n /= 2; 20453e519524SHoward Hinnant } 20463e519524SHoward Hinnant return __r; 20473e519524SHoward Hinnant} 20483e519524SHoward Hinnant 20493e519524SHoward Hinnanttemplate <class _Tp> 20503e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 20514e3195c9SRichard Smithvoid return_temporary_buffer(_Tp* __p) _NOEXCEPT 20524e3195c9SRichard Smith{ 20534e3195c9SRichard Smith#if !defined(_LIBCPP_HAS_NO_ALIGNED_ALLOCATION) 20544e3195c9SRichard Smith#if defined(__STDCPP_DEFAULT_NEW_ALIGNMENT__) 20554e3195c9SRichard Smith if (std::alignment_of<_Tp>::value > __STDCPP_DEFAULT_NEW_ALIGNMENT__) 20564e3195c9SRichard Smith#else 20574e3195c9SRichard Smith if (std::alignment_of<_Tp>::value > 20584e3195c9SRichard Smith std::alignment_of<std::max_align_t>::value) 20594e3195c9SRichard Smith#endif 20604e3195c9SRichard Smith { 20614e3195c9SRichard Smith std::align_val_t __al = std::align_val_t(std::alignment_of<_Tp>::value); 20624e3195c9SRichard Smith ::operator delete(__p, __al); 20634e3195c9SRichard Smith return; 20644e3195c9SRichard Smith } 20654e3195c9SRichard Smith#endif 20664e3195c9SRichard Smith ::operator delete(__p); 20674e3195c9SRichard Smith} 20683e519524SHoward Hinnant 2069e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR) 20703e519524SHoward Hinnanttemplate <class _Tp> 20713e519524SHoward Hinnantstruct auto_ptr_ref 20723e519524SHoward Hinnant{ 20733e519524SHoward Hinnant _Tp* __ptr_; 20743e519524SHoward Hinnant}; 20753e519524SHoward Hinnant 20763e519524SHoward Hinnanttemplate<class _Tp> 2077e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS auto_ptr 20783e519524SHoward Hinnant{ 20793e519524SHoward Hinnantprivate: 20803e519524SHoward Hinnant _Tp* __ptr_; 20813e519524SHoward Hinnantpublic: 20823e519524SHoward Hinnant typedef _Tp element_type; 20833e519524SHoward Hinnant 20843e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit auto_ptr(_Tp* __p = 0) throw() : __ptr_(__p) {} 20853e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr& __p) throw() : __ptr_(__p.release()) {} 20863e519524SHoward Hinnant template<class _Up> _LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr<_Up>& __p) throw() 20873e519524SHoward Hinnant : __ptr_(__p.release()) {} 20883e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr& __p) throw() 20893e519524SHoward Hinnant {reset(__p.release()); return *this;} 20903e519524SHoward Hinnant template<class _Up> _LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr<_Up>& __p) throw() 20913e519524SHoward Hinnant {reset(__p.release()); return *this;} 20923e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr_ref<_Tp> __p) throw() 20933e519524SHoward Hinnant {reset(__p.__ptr_); return *this;} 20943e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY ~auto_ptr() throw() {delete __ptr_;} 20953e519524SHoward Hinnant 20963e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Tp& operator*() const throw() 20973e519524SHoward Hinnant {return *__ptr_;} 20983e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Tp* operator->() const throw() {return __ptr_;} 20993e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Tp* get() const throw() {return __ptr_;} 21003e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Tp* release() throw() 21013e519524SHoward Hinnant { 21023e519524SHoward Hinnant _Tp* __t = __ptr_; 21033e519524SHoward Hinnant __ptr_ = 0; 21043e519524SHoward Hinnant return __t; 21053e519524SHoward Hinnant } 21063e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void reset(_Tp* __p = 0) throw() 21073e519524SHoward Hinnant { 21083e519524SHoward Hinnant if (__ptr_ != __p) 21093e519524SHoward Hinnant delete __ptr_; 21103e519524SHoward Hinnant __ptr_ = __p; 21113e519524SHoward Hinnant } 21123e519524SHoward Hinnant 21133e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr_ref<_Tp> __p) throw() : __ptr_(__p.__ptr_) {} 21143e519524SHoward Hinnant template<class _Up> _LIBCPP_INLINE_VISIBILITY operator auto_ptr_ref<_Up>() throw() 21153e519524SHoward Hinnant {auto_ptr_ref<_Up> __t; __t.__ptr_ = release(); return __t;} 21163e519524SHoward Hinnant template<class _Up> _LIBCPP_INLINE_VISIBILITY operator auto_ptr<_Up>() throw() 21173e519524SHoward Hinnant {return auto_ptr<_Up>(release());} 21183e519524SHoward Hinnant}; 21193e519524SHoward Hinnant 21203e519524SHoward Hinnanttemplate <> 2121e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS auto_ptr<void> 21223e519524SHoward Hinnant{ 21233e519524SHoward Hinnantpublic: 21243e519524SHoward Hinnant typedef void element_type; 21253e519524SHoward Hinnant}; 2126e67179bcSMarshall Clow#endif 21273e519524SHoward Hinnant 2128c88580c4SEric Fiseliertemplate <class _Tp, int _Idx, 2129c88580c4SEric Fiselier bool _CanBeEmptyBase = 2130c88580c4SEric Fiselier is_empty<_Tp>::value && !__libcpp_is_final<_Tp>::value> 2131c88580c4SEric Fiselierstruct __compressed_pair_elem { 2132c88580c4SEric Fiselier typedef _Tp _ParamT; 2133c88580c4SEric Fiselier typedef _Tp& reference; 2134c88580c4SEric Fiselier typedef const _Tp& const_reference; 21353e519524SHoward Hinnant 2136c88580c4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 21379dae972cSAlex Lorenz _LIBCPP_INLINE_VISIBILITY constexpr __compressed_pair_elem() : __value_() {} 21383e519524SHoward Hinnant 2139c88580c4SEric Fiselier template <class _Up, class = typename enable_if< 21408948264eSEric Fiselier !is_same<__compressed_pair_elem, typename decay<_Up>::type>::value 21418948264eSEric Fiselier >::type> 21429dae972cSAlex Lorenz _LIBCPP_INLINE_VISIBILITY 21438948264eSEric Fiselier constexpr explicit 2144c88580c4SEric Fiselier __compressed_pair_elem(_Up&& __u) 2145c88580c4SEric Fiselier : __value_(_VSTD::forward<_Up>(__u)){}; 21463e519524SHoward Hinnant 2147c88580c4SEric Fiselier template <class... _Args, size_t... _Indexes> 2148c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 2149c88580c4SEric Fiselier __compressed_pair_elem(piecewise_construct_t, tuple<_Args...> __args, 2150c88580c4SEric Fiselier __tuple_indices<_Indexes...>) 2151c88580c4SEric Fiselier : __value_(_VSTD::forward<_Args>(_VSTD::get<_Indexes>(__args))...) {} 2152c88580c4SEric Fiselier#else 21539dae972cSAlex Lorenz _LIBCPP_INLINE_VISIBILITY __compressed_pair_elem() : __value_() {} 21549dae972cSAlex Lorenz _LIBCPP_INLINE_VISIBILITY 2155c88580c4SEric Fiselier __compressed_pair_elem(_ParamT __p) : __value_(std::forward<_ParamT>(__p)) {} 2156c88580c4SEric Fiselier#endif 21573e519524SHoward Hinnant 21589dae972cSAlex Lorenz _LIBCPP_INLINE_VISIBILITY reference __get() _NOEXCEPT { return __value_; } 21599dae972cSAlex Lorenz _LIBCPP_INLINE_VISIBILITY 2160c88580c4SEric Fiselier const_reference __get() const _NOEXCEPT { return __value_; } 21613e519524SHoward Hinnant 21623e519524SHoward Hinnantprivate: 2163c88580c4SEric Fiselier _Tp __value_; 21643e519524SHoward Hinnant}; 21653e519524SHoward Hinnant 2166c88580c4SEric Fiseliertemplate <class _Tp, int _Idx> 2167c88580c4SEric Fiselierstruct __compressed_pair_elem<_Tp, _Idx, true> : private _Tp { 2168c88580c4SEric Fiselier typedef _Tp _ParamT; 2169c88580c4SEric Fiselier typedef _Tp& reference; 2170c88580c4SEric Fiselier typedef const _Tp& const_reference; 2171c88580c4SEric Fiselier typedef _Tp __value_type; 21723e519524SHoward Hinnant 2173c88580c4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 21749dae972cSAlex Lorenz _LIBCPP_INLINE_VISIBILITY constexpr __compressed_pair_elem() = default; 21753e519524SHoward Hinnant 2176c88580c4SEric Fiselier template <class _Up, class = typename enable_if< 21778948264eSEric Fiselier !is_same<__compressed_pair_elem, typename decay<_Up>::type>::value 21788948264eSEric Fiselier >::type> 21799dae972cSAlex Lorenz _LIBCPP_INLINE_VISIBILITY 21808948264eSEric Fiselier constexpr explicit 2181c88580c4SEric Fiselier __compressed_pair_elem(_Up&& __u) 2182c88580c4SEric Fiselier : __value_type(_VSTD::forward<_Up>(__u)){}; 21833e519524SHoward Hinnant 2184c88580c4SEric Fiselier template <class... _Args, size_t... _Indexes> 2185c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 2186c88580c4SEric Fiselier __compressed_pair_elem(piecewise_construct_t, tuple<_Args...> __args, 2187c88580c4SEric Fiselier __tuple_indices<_Indexes...>) 2188c88580c4SEric Fiselier : __value_type(_VSTD::forward<_Args>(_VSTD::get<_Indexes>(__args))...) {} 2189c88580c4SEric Fiselier#else 21909dae972cSAlex Lorenz _LIBCPP_INLINE_VISIBILITY __compressed_pair_elem() : __value_type() {} 21919dae972cSAlex Lorenz _LIBCPP_INLINE_VISIBILITY 2192c88580c4SEric Fiselier __compressed_pair_elem(_ParamT __p) 2193c88580c4SEric Fiselier : __value_type(std::forward<_ParamT>(__p)) {} 2194c88580c4SEric Fiselier#endif 21953e519524SHoward Hinnant 21969dae972cSAlex Lorenz _LIBCPP_INLINE_VISIBILITY reference __get() _NOEXCEPT { return *this; } 21979dae972cSAlex Lorenz _LIBCPP_INLINE_VISIBILITY 2198c88580c4SEric Fiselier const_reference __get() const _NOEXCEPT { return *this; } 21993e519524SHoward Hinnant}; 22003e519524SHoward Hinnant 2201c88580c4SEric Fiselier// Tag used to construct the second element of the compressed pair. 2202c88580c4SEric Fiselierstruct __second_tag {}; 2203c88580c4SEric Fiselier 22043e519524SHoward Hinnanttemplate <class _T1, class _T2> 2205c88580c4SEric Fiselierclass __compressed_pair : private __compressed_pair_elem<_T1, 0>, 2206c88580c4SEric Fiselier private __compressed_pair_elem<_T2, 1> { 2207c88580c4SEric Fiselier typedef __compressed_pair_elem<_T1, 0> _Base1; 2208c88580c4SEric Fiselier typedef __compressed_pair_elem<_T2, 1> _Base2; 2209c88580c4SEric Fiselier 2210c88580c4SEric Fiselier // NOTE: This static assert should never fire because __compressed_pair 2211c88580c4SEric Fiselier // is *almost never* used in a scenario where it's possible for T1 == T2. 2212c88580c4SEric Fiselier // (The exception is std::function where it is possible that the function 2213c88580c4SEric Fiselier // object and the allocator have the same type). 2214b411e9ceSEric Fiselier static_assert((!is_same<_T1, _T2>::value), 2215c88580c4SEric Fiselier "__compressed_pair cannot be instantated when T1 and T2 are the same type; " 2216c88580c4SEric Fiselier "The current implementation is NOT ABI-compatible with the previous " 2217c88580c4SEric Fiselier "implementation for this configuration"); 2218c88580c4SEric Fiselier 22193e519524SHoward Hinnantpublic: 2220c88580c4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 22218948264eSEric Fiselier template <bool _Dummy = true, 22228948264eSEric Fiselier class = typename enable_if< 22238948264eSEric Fiselier __dependent_type<is_default_constructible<_T1>, _Dummy>::value && 22248948264eSEric Fiselier __dependent_type<is_default_constructible<_T2>, _Dummy>::value 22258948264eSEric Fiselier >::type 22268948264eSEric Fiselier > 2227a87b5e34SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22288948264eSEric Fiselier constexpr __compressed_pair() {} 2229a87b5e34SHoward Hinnant 2230c88580c4SEric Fiselier template <class _Tp, typename enable_if<!is_same<typename decay<_Tp>::type, 2231c88580c4SEric Fiselier __compressed_pair>::value, 2232c88580c4SEric Fiselier bool>::type = true> 2233c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY constexpr explicit 2234c88580c4SEric Fiselier __compressed_pair(_Tp&& __t) 2235c88580c4SEric Fiselier : _Base1(std::forward<_Tp>(__t)), _Base2() {} 2236a87b5e34SHoward Hinnant 2237c88580c4SEric Fiselier template <class _Tp> 2238c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY constexpr 2239c88580c4SEric Fiselier __compressed_pair(__second_tag, _Tp&& __t) 2240c88580c4SEric Fiselier : _Base1(), _Base2(std::forward<_Tp>(__t)) {} 2241a87b5e34SHoward Hinnant 2242c88580c4SEric Fiselier template <class _U1, class _U2> 2243c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY constexpr 2244c88580c4SEric Fiselier __compressed_pair(_U1&& __t1, _U2&& __t2) 2245c88580c4SEric Fiselier : _Base1(std::forward<_U1>(__t1)), _Base2(std::forward<_U2>(__t2)) {} 2246a87b5e34SHoward Hinnant 2247a87b5e34SHoward Hinnant template <class... _Args1, class... _Args2> 2248c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 2249a87b5e34SHoward Hinnant __compressed_pair(piecewise_construct_t __pc, tuple<_Args1...> __first_args, 2250a87b5e34SHoward Hinnant tuple<_Args2...> __second_args) 2251c88580c4SEric Fiselier : _Base1(__pc, _VSTD::move(__first_args), 2252c88580c4SEric Fiselier typename __make_tuple_indices<sizeof...(_Args1)>::type()), 2253c88580c4SEric Fiselier _Base2(__pc, _VSTD::move(__second_args), 2254c88580c4SEric Fiselier typename __make_tuple_indices<sizeof...(_Args2)>::type()) {} 2255a87b5e34SHoward Hinnant 2256c88580c4SEric Fiselier#else 2257c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY 2258c88580c4SEric Fiselier __compressed_pair() {} 2259a87b5e34SHoward Hinnant 2260c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY explicit 2261c88580c4SEric Fiselier __compressed_pair(_T1 __t1) : _Base1(_VSTD::forward<_T1>(__t1)) {} 22623e519524SHoward Hinnant 2263c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY 2264c88580c4SEric Fiselier __compressed_pair(__second_tag, _T2 __t2) 2265c88580c4SEric Fiselier : _Base1(), _Base2(_VSTD::forward<_T2>(__t2)) {} 22663e519524SHoward Hinnant 2267c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY 2268c88580c4SEric Fiselier __compressed_pair(_T1 __t1, _T2 __t2) 2269c88580c4SEric Fiselier : _Base1(_VSTD::forward<_T1>(__t1)), _Base2(_VSTD::forward<_T2>(__t2)) {} 2270c88580c4SEric Fiselier#endif 2271c88580c4SEric Fiselier 2272c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY 2273c88580c4SEric Fiselier typename _Base1::reference first() _NOEXCEPT { 2274c88580c4SEric Fiselier return static_cast<_Base1&>(*this).__get(); 2275c88580c4SEric Fiselier } 2276c88580c4SEric Fiselier 2277c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY 2278c88580c4SEric Fiselier typename _Base1::const_reference first() const _NOEXCEPT { 2279c88580c4SEric Fiselier return static_cast<_Base1 const&>(*this).__get(); 2280c88580c4SEric Fiselier } 2281c88580c4SEric Fiselier 2282c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY 2283c88580c4SEric Fiselier typename _Base2::reference second() _NOEXCEPT { 2284c88580c4SEric Fiselier return static_cast<_Base2&>(*this).__get(); 2285c88580c4SEric Fiselier } 2286c88580c4SEric Fiselier 2287c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY 2288c88580c4SEric Fiselier typename _Base2::const_reference second() const _NOEXCEPT { 2289c88580c4SEric Fiselier return static_cast<_Base2 const&>(*this).__get(); 2290c88580c4SEric Fiselier } 2291c88580c4SEric Fiselier 2292c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY 2293c88580c4SEric Fiselier void swap(__compressed_pair& __x) 22943739fe79SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && 2295afa72ed4SMarshall Clow __is_nothrow_swappable<_T2>::value) 2296c88580c4SEric Fiselier { 2297c88580c4SEric Fiselier using std::swap; 2298c88580c4SEric Fiselier swap(first(), __x.first()); 2299c88580c4SEric Fiselier swap(second(), __x.second()); 2300c88580c4SEric Fiselier } 23013e519524SHoward Hinnant}; 23023e519524SHoward Hinnant 23033e519524SHoward Hinnanttemplate <class _T1, class _T2> 23043e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 2305c88580c4SEric Fiseliervoid swap(__compressed_pair<_T1, _T2>& __x, __compressed_pair<_T1, _T2>& __y) 23063739fe79SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && 2307c88580c4SEric Fiselier __is_nothrow_swappable<_T2>::value) { 2308c88580c4SEric Fiselier __x.swap(__y); 2309c88580c4SEric Fiselier} 23103e519524SHoward Hinnant 23118e25104bSHoward Hinnant// default_delete 23128e25104bSHoward Hinnant 23133e519524SHoward Hinnanttemplate <class _Tp> 2314030d19bdSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS default_delete { 231572d0d603SErik Pilkington static_assert(!is_function<_Tp>::value, 231672d0d603SErik Pilkington "default_delete cannot be instantiated for function types"); 2317030d19bdSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 2318030d19bdSEric Fiselier _LIBCPP_INLINE_VISIBILITY constexpr default_delete() noexcept = default; 2319c0937e8aSHoward Hinnant#else 2320030d19bdSEric Fiselier _LIBCPP_INLINE_VISIBILITY default_delete() {} 2321c0937e8aSHoward Hinnant#endif 23223e519524SHoward Hinnant template <class _Up> 2323030d19bdSEric Fiselier _LIBCPP_INLINE_VISIBILITY 2324030d19bdSEric Fiselier default_delete(const default_delete<_Up>&, 2325030d19bdSEric Fiselier typename enable_if<is_convertible<_Up*, _Tp*>::value>::type* = 2326030d19bdSEric Fiselier 0) _NOEXCEPT {} 2327030d19bdSEric Fiselier 2328030d19bdSEric Fiselier _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __ptr) const _NOEXCEPT { 2329030d19bdSEric Fiselier static_assert(sizeof(_Tp) > 0, 2330030d19bdSEric Fiselier "default_delete can not delete incomplete type"); 2331030d19bdSEric Fiselier static_assert(!is_void<_Tp>::value, 2332030d19bdSEric Fiselier "default_delete can not delete incomplete type"); 23333e519524SHoward Hinnant delete __ptr; 23343e519524SHoward Hinnant } 23353e519524SHoward Hinnant}; 23363e519524SHoward Hinnant 23373e519524SHoward Hinnanttemplate <class _Tp> 2338030d19bdSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS default_delete<_Tp[]> { 2339030d19bdSEric Fiselierprivate: 2340e4097ad7SHoward Hinnant template <class _Up> 2341030d19bdSEric Fiselier struct _EnableIfConvertible 2342030d19bdSEric Fiselier : enable_if<is_convertible<_Up(*)[], _Tp(*)[]>::value> {}; 2343030d19bdSEric Fiselier 2344030d19bdSEric Fiselierpublic: 2345030d19bdSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 2346030d19bdSEric Fiselier _LIBCPP_INLINE_VISIBILITY constexpr default_delete() noexcept = default; 2347030d19bdSEric Fiselier#else 2348030d19bdSEric Fiselier _LIBCPP_INLINE_VISIBILITY default_delete() {} 2349030d19bdSEric Fiselier#endif 2350030d19bdSEric Fiselier 2351e4097ad7SHoward Hinnant template <class _Up> 2352e4097ad7SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2353030d19bdSEric Fiselier default_delete(const default_delete<_Up[]>&, 2354030d19bdSEric Fiselier typename _EnableIfConvertible<_Up>::type* = 0) _NOEXCEPT {} 2355030d19bdSEric Fiselier 2356030d19bdSEric Fiselier template <class _Up> 2357030d19bdSEric Fiselier _LIBCPP_INLINE_VISIBILITY 2358030d19bdSEric Fiselier typename _EnableIfConvertible<_Up>::type 2359030d19bdSEric Fiselier operator()(_Up* __ptr) const _NOEXCEPT { 2360030d19bdSEric Fiselier static_assert(sizeof(_Tp) > 0, 2361030d19bdSEric Fiselier "default_delete can not delete incomplete type"); 2362030d19bdSEric Fiselier static_assert(!is_void<_Tp>::value, 2363030d19bdSEric Fiselier "default_delete can not delete void type"); 23643e519524SHoward Hinnant delete[] __ptr; 23653e519524SHoward Hinnant } 23663e519524SHoward Hinnant}; 23673e519524SHoward Hinnant 236847272722SEric Fiselier 2369030d19bdSEric Fiselier 237047272722SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 237147272722SEric Fiseliertemplate <class _Deleter> 237247272722SEric Fiselierstruct __unique_ptr_deleter_sfinae { 237347272722SEric Fiselier static_assert(!is_reference<_Deleter>::value, "incorrect specialization"); 237447272722SEric Fiselier typedef const _Deleter& __lval_ref_type; 237547272722SEric Fiselier typedef _Deleter&& __good_rval_ref_type; 237647272722SEric Fiselier typedef true_type __enable_rval_overload; 237747272722SEric Fiselier}; 237847272722SEric Fiselier 237947272722SEric Fiseliertemplate <class _Deleter> 238047272722SEric Fiselierstruct __unique_ptr_deleter_sfinae<_Deleter const&> { 238147272722SEric Fiselier typedef const _Deleter& __lval_ref_type; 238247272722SEric Fiselier typedef const _Deleter&& __bad_rval_ref_type; 238347272722SEric Fiselier typedef false_type __enable_rval_overload; 238447272722SEric Fiselier}; 238547272722SEric Fiselier 238647272722SEric Fiseliertemplate <class _Deleter> 238747272722SEric Fiselierstruct __unique_ptr_deleter_sfinae<_Deleter&> { 238847272722SEric Fiselier typedef _Deleter& __lval_ref_type; 238947272722SEric Fiselier typedef _Deleter&& __bad_rval_ref_type; 239047272722SEric Fiselier typedef false_type __enable_rval_overload; 239147272722SEric Fiselier}; 239247272722SEric Fiselier#endif // !defined(_LIBCPP_CXX03_LANG) 239347272722SEric Fiselier 23943e519524SHoward Hinnanttemplate <class _Tp, class _Dp = default_delete<_Tp> > 239547272722SEric Fiselierclass _LIBCPP_TEMPLATE_VIS unique_ptr { 23963e519524SHoward Hinnantpublic: 23973e519524SHoward Hinnant typedef _Tp element_type; 23983e519524SHoward Hinnant typedef _Dp deleter_type; 23993e519524SHoward Hinnant typedef typename __pointer_type<_Tp, deleter_type>::type pointer; 240047272722SEric Fiselier 240147272722SEric Fiselier static_assert(!is_rvalue_reference<deleter_type>::value, 240247272722SEric Fiselier "the specified deleter type cannot be an rvalue reference"); 240347272722SEric Fiselier 24043e519524SHoward Hinnantprivate: 24053e519524SHoward Hinnant __compressed_pair<pointer, deleter_type> __ptr_; 24063e519524SHoward Hinnant 24073e519524SHoward Hinnant struct __nat { int __for_bool_; }; 24083e519524SHoward Hinnant 240947272722SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 241092e61e93SEric Fiselier typedef __unique_ptr_deleter_sfinae<_Dp> _DeleterSFINAE; 24113e519524SHoward Hinnant 241247272722SEric Fiselier template <bool _Dummy> 241347272722SEric Fiselier using _LValRefType = 241492e61e93SEric Fiselier typename __dependent_type<_DeleterSFINAE, _Dummy>::__lval_ref_type; 241547272722SEric Fiselier 241647272722SEric Fiselier template <bool _Dummy> 241747272722SEric Fiselier using _GoodRValRefType = 241892e61e93SEric Fiselier typename __dependent_type<_DeleterSFINAE, _Dummy>::__good_rval_ref_type; 241947272722SEric Fiselier 242047272722SEric Fiselier template <bool _Dummy> 242147272722SEric Fiselier using _BadRValRefType = 242292e61e93SEric Fiselier typename __dependent_type<_DeleterSFINAE, _Dummy>::__bad_rval_ref_type; 242347272722SEric Fiselier 242447272722SEric Fiselier template <bool _Dummy, class _Deleter = typename __dependent_type< 242547272722SEric Fiselier __identity<deleter_type>, _Dummy>::type> 242647272722SEric Fiselier using _EnableIfDeleterDefaultConstructible = 242747272722SEric Fiselier typename enable_if<is_default_constructible<_Deleter>::value && 242847272722SEric Fiselier !is_pointer<_Deleter>::value>::type; 242947272722SEric Fiselier 243047272722SEric Fiselier template <class _ArgType> 243147272722SEric Fiselier using _EnableIfDeleterConstructible = 243247272722SEric Fiselier typename enable_if<is_constructible<deleter_type, _ArgType>::value>::type; 243347272722SEric Fiselier 243447272722SEric Fiselier template <class _UPtr, class _Up> 243547272722SEric Fiselier using _EnableIfMoveConvertible = typename enable_if< 243647272722SEric Fiselier is_convertible<typename _UPtr::pointer, pointer>::value && 243747272722SEric Fiselier !is_array<_Up>::value 243847272722SEric Fiselier >::type; 243947272722SEric Fiselier 244047272722SEric Fiselier template <class _UDel> 244147272722SEric Fiselier using _EnableIfDeleterConvertible = typename enable_if< 244247272722SEric Fiselier (is_reference<_Dp>::value && is_same<_Dp, _UDel>::value) || 244347272722SEric Fiselier (!is_reference<_Dp>::value && is_convertible<_UDel, _Dp>::value) 244447272722SEric Fiselier >::type; 244547272722SEric Fiselier 244647272722SEric Fiselier template <class _UDel> 244747272722SEric Fiselier using _EnableIfDeleterAssignable = typename enable_if< 244847272722SEric Fiselier is_assignable<_Dp&, _UDel&&>::value 244947272722SEric Fiselier >::type; 245047272722SEric Fiselier 245147272722SEric Fiselierpublic: 245247272722SEric Fiselier template <bool _Dummy = true, 245347272722SEric Fiselier class = _EnableIfDeleterDefaultConstructible<_Dummy>> 245447272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 245547272722SEric Fiselier constexpr unique_ptr() noexcept : __ptr_(pointer()) {} 245647272722SEric Fiselier 245747272722SEric Fiselier template <bool _Dummy = true, 245847272722SEric Fiselier class = _EnableIfDeleterDefaultConstructible<_Dummy>> 245947272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 246047272722SEric Fiselier constexpr unique_ptr(nullptr_t) noexcept : __ptr_(pointer()) {} 246147272722SEric Fiselier 246247272722SEric Fiselier template <bool _Dummy = true, 246347272722SEric Fiselier class = _EnableIfDeleterDefaultConstructible<_Dummy>> 246447272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 246547272722SEric Fiselier explicit unique_ptr(pointer __p) noexcept : __ptr_(__p) {} 246647272722SEric Fiselier 246747272722SEric Fiselier template <bool _Dummy = true, 246847272722SEric Fiselier class = _EnableIfDeleterConstructible<_LValRefType<_Dummy>>> 246947272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 247047272722SEric Fiselier unique_ptr(pointer __p, _LValRefType<_Dummy> __d) noexcept 24713e519524SHoward Hinnant : __ptr_(__p, __d) {} 24723e519524SHoward Hinnant 247347272722SEric Fiselier template <bool _Dummy = true, 247447272722SEric Fiselier class = _EnableIfDeleterConstructible<_GoodRValRefType<_Dummy>>> 24753e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 247647272722SEric Fiselier unique_ptr(pointer __p, _GoodRValRefType<_Dummy> __d) noexcept 247747272722SEric Fiselier : __ptr_(__p, _VSTD::move(__d)) { 247847272722SEric Fiselier static_assert(!is_reference<deleter_type>::value, 247947272722SEric Fiselier "rvalue deleter bound to reference"); 248047272722SEric Fiselier } 248147272722SEric Fiselier 248247272722SEric Fiselier template <bool _Dummy = true, 248347272722SEric Fiselier class = _EnableIfDeleterConstructible<_BadRValRefType<_Dummy>>> 248447272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 248547272722SEric Fiselier unique_ptr(pointer __p, _BadRValRefType<_Dummy> __d) = delete; 248647272722SEric Fiselier 248747272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 248847272722SEric Fiselier unique_ptr(unique_ptr&& __u) noexcept 248947272722SEric Fiselier : __ptr_(__u.release(), _VSTD::forward<deleter_type>(__u.get_deleter())) { 249047272722SEric Fiselier } 249147272722SEric Fiselier 249247272722SEric Fiselier template <class _Up, class _Ep, 249347272722SEric Fiselier class = _EnableIfMoveConvertible<unique_ptr<_Up, _Ep>, _Up>, 249447272722SEric Fiselier class = _EnableIfDeleterConvertible<_Ep> 249547272722SEric Fiselier > 249647272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 249747272722SEric Fiselier unique_ptr(unique_ptr<_Up, _Ep>&& __u) _NOEXCEPT 2498ce48a113SHoward Hinnant : __ptr_(__u.release(), _VSTD::forward<_Ep>(__u.get_deleter())) {} 24993e519524SHoward Hinnant 2500e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR) 25013e519524SHoward Hinnant template <class _Up> 250247272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 250347272722SEric Fiselier unique_ptr(auto_ptr<_Up>&& __p, 250447272722SEric Fiselier typename enable_if<is_convertible<_Up*, _Tp*>::value && 25053e519524SHoward Hinnant is_same<_Dp, default_delete<_Tp>>::value, 250647272722SEric Fiselier __nat>::type = __nat()) _NOEXCEPT 250747272722SEric Fiselier : __ptr_(__p.release()) {} 2508e67179bcSMarshall Clow#endif 25093e519524SHoward Hinnant 251047272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 251147272722SEric Fiselier unique_ptr& operator=(unique_ptr&& __u) _NOEXCEPT { 25123e519524SHoward Hinnant reset(__u.release()); 2513ce48a113SHoward Hinnant __ptr_.second() = _VSTD::forward<deleter_type>(__u.get_deleter()); 25143e519524SHoward Hinnant return *this; 25153e519524SHoward Hinnant } 25163e519524SHoward Hinnant 251747272722SEric Fiselier template <class _Up, class _Ep, 251847272722SEric Fiselier class = _EnableIfMoveConvertible<unique_ptr<_Up, _Ep>, _Up>, 251947272722SEric Fiselier class = _EnableIfDeleterAssignable<_Ep> 252047272722SEric Fiselier > 25213e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 252247272722SEric Fiselier unique_ptr& operator=(unique_ptr<_Up, _Ep>&& __u) _NOEXCEPT { 25233e519524SHoward Hinnant reset(__u.release()); 2524ce48a113SHoward Hinnant __ptr_.second() = _VSTD::forward<_Ep>(__u.get_deleter()); 25253e519524SHoward Hinnant return *this; 25263e519524SHoward Hinnant } 25273e519524SHoward Hinnant 252847272722SEric Fiselier#else // _LIBCPP_CXX03_LANG 252947272722SEric Fiselierprivate: 253047272722SEric Fiselier unique_ptr(unique_ptr&); 253147272722SEric Fiselier template <class _Up, class _Ep> unique_ptr(unique_ptr<_Up, _Ep>&); 253247272722SEric Fiselier 253347272722SEric Fiselier unique_ptr& operator=(unique_ptr&); 253447272722SEric Fiselier template <class _Up, class _Ep> unique_ptr& operator=(unique_ptr<_Up, _Ep>&); 253547272722SEric Fiselier 253647272722SEric Fiselierpublic: 253747272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 253847272722SEric Fiselier unique_ptr() : __ptr_(pointer()) 25393e519524SHoward Hinnant { 254047272722SEric Fiselier static_assert(!is_pointer<deleter_type>::value, 254147272722SEric Fiselier "unique_ptr constructed with null function pointer deleter"); 254247272722SEric Fiselier static_assert(is_default_constructible<deleter_type>::value, 254347272722SEric Fiselier "unique_ptr::deleter_type is not default constructible"); 254447272722SEric Fiselier } 254547272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 254647272722SEric Fiselier unique_ptr(nullptr_t) : __ptr_(pointer()) 254747272722SEric Fiselier { 254847272722SEric Fiselier static_assert(!is_pointer<deleter_type>::value, 254947272722SEric Fiselier "unique_ptr constructed with null function pointer deleter"); 255047272722SEric Fiselier } 255147272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 255247272722SEric Fiselier explicit unique_ptr(pointer __p) 255347272722SEric Fiselier : __ptr_(_VSTD::move(__p)) { 255447272722SEric Fiselier static_assert(!is_pointer<deleter_type>::value, 255547272722SEric Fiselier "unique_ptr constructed with null function pointer deleter"); 255647272722SEric Fiselier } 255747272722SEric Fiselier 255847272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 255947272722SEric Fiselier operator __rv<unique_ptr>() { 25603e519524SHoward Hinnant return __rv<unique_ptr>(*this); 25613e519524SHoward Hinnant } 25623e519524SHoward Hinnant 256347272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 256447272722SEric Fiselier unique_ptr(__rv<unique_ptr> __u) 256547272722SEric Fiselier : __ptr_(__u->release(), 256647272722SEric Fiselier _VSTD::forward<deleter_type>(__u->get_deleter())) {} 25673e519524SHoward Hinnant 25683e519524SHoward Hinnant template <class _Up, class _Ep> 2569d48306e7SEric Fiselier _LIBCPP_INLINE_VISIBILITY 2570d48306e7SEric Fiselier typename enable_if< 2571d48306e7SEric Fiselier !is_array<_Up>::value && 257247272722SEric Fiselier is_convertible<typename unique_ptr<_Up, _Ep>::pointer, 257347272722SEric Fiselier pointer>::value && 2574d48306e7SEric Fiselier is_assignable<deleter_type&, _Ep&>::value, 257547272722SEric Fiselier unique_ptr&>::type 257647272722SEric Fiselier operator=(unique_ptr<_Up, _Ep> __u) { 25773e519524SHoward Hinnant reset(__u.release()); 2578d48306e7SEric Fiselier __ptr_.second() = _VSTD::forward<_Ep>(__u.get_deleter()); 25793e519524SHoward Hinnant return *this; 25803e519524SHoward Hinnant } 25813e519524SHoward Hinnant 258247272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 258347272722SEric Fiselier unique_ptr(pointer __p, deleter_type __d) 2584ce48a113SHoward Hinnant : __ptr_(_VSTD::move(__p), _VSTD::move(__d)) {} 258547272722SEric Fiselier#endif // _LIBCPP_CXX03_LANG 25863e519524SHoward Hinnant 2587e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR) 25883e519524SHoward Hinnant template <class _Up> 25893e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 259047272722SEric Fiselier typename enable_if<is_convertible<_Up*, _Tp*>::value && 25913e519524SHoward Hinnant is_same<_Dp, default_delete<_Tp> >::value, 259247272722SEric Fiselier unique_ptr&>::type 259347272722SEric Fiselier operator=(auto_ptr<_Up> __p) { 259447272722SEric Fiselier reset(__p.release()); 259547272722SEric Fiselier return *this; 259647272722SEric Fiselier } 2597e67179bcSMarshall Clow#endif 25983e519524SHoward Hinnant 259947272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 260047272722SEric Fiselier ~unique_ptr() { reset(); } 260147272722SEric Fiselier 260247272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 260347272722SEric Fiselier unique_ptr& operator=(nullptr_t) _NOEXCEPT { 26043e519524SHoward Hinnant reset(); 26053e519524SHoward Hinnant return *this; 26063e519524SHoward Hinnant } 26073e519524SHoward Hinnant 2608f2f2d8b9SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 260947272722SEric Fiselier typename add_lvalue_reference<_Tp>::type 261047272722SEric Fiselier operator*() const { 261147272722SEric Fiselier return *__ptr_.first(); 261247272722SEric Fiselier } 261347272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 261447272722SEric Fiselier pointer operator->() const _NOEXCEPT { 261547272722SEric Fiselier return __ptr_.first(); 261647272722SEric Fiselier } 261747272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 261847272722SEric Fiselier pointer get() const _NOEXCEPT { 261947272722SEric Fiselier return __ptr_.first(); 262047272722SEric Fiselier } 262147272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 262247272722SEric Fiselier deleter_type& get_deleter() _NOEXCEPT { 262347272722SEric Fiselier return __ptr_.second(); 262447272722SEric Fiselier } 262547272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 262647272722SEric Fiselier const deleter_type& get_deleter() const _NOEXCEPT { 262747272722SEric Fiselier return __ptr_.second(); 262847272722SEric Fiselier } 262947272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 263047272722SEric Fiselier _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT { 263147272722SEric Fiselier return __ptr_.first() != nullptr; 263247272722SEric Fiselier } 26333e519524SHoward Hinnant 263447272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 263547272722SEric Fiselier pointer release() _NOEXCEPT { 26363e519524SHoward Hinnant pointer __t = __ptr_.first(); 26373e519524SHoward Hinnant __ptr_.first() = pointer(); 26383e519524SHoward Hinnant return __t; 26393e519524SHoward Hinnant } 26403e519524SHoward Hinnant 264147272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 264247272722SEric Fiselier void reset(pointer __p = pointer()) _NOEXCEPT { 26433e519524SHoward Hinnant pointer __tmp = __ptr_.first(); 26443e519524SHoward Hinnant __ptr_.first() = __p; 26453e519524SHoward Hinnant if (__tmp) 26463e519524SHoward Hinnant __ptr_.second()(__tmp); 26473e519524SHoward Hinnant } 26483e519524SHoward Hinnant 264947272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 265047272722SEric Fiselier void swap(unique_ptr& __u) _NOEXCEPT { 265147272722SEric Fiselier __ptr_.swap(__u.__ptr_); 265247272722SEric Fiselier } 26533e519524SHoward Hinnant}; 26543e519524SHoward Hinnant 265547272722SEric Fiselier 26563e519524SHoward Hinnanttemplate <class _Tp, class _Dp> 265747272722SEric Fiselierclass _LIBCPP_TEMPLATE_VIS unique_ptr<_Tp[], _Dp> { 26583e519524SHoward Hinnantpublic: 26593e519524SHoward Hinnant typedef _Tp element_type; 26603e519524SHoward Hinnant typedef _Dp deleter_type; 26613e519524SHoward Hinnant typedef typename __pointer_type<_Tp, deleter_type>::type pointer; 266247272722SEric Fiselier 26633e519524SHoward Hinnantprivate: 26643e519524SHoward Hinnant __compressed_pair<pointer, deleter_type> __ptr_; 26653e519524SHoward Hinnant 266692e61e93SEric Fiselier template <class _From> 266792e61e93SEric Fiselier struct _CheckArrayPointerConversion : is_same<_From, pointer> {}; 26683e519524SHoward Hinnant 266992e61e93SEric Fiselier template <class _FromElem> 267092e61e93SEric Fiselier struct _CheckArrayPointerConversion<_FromElem*> 267192e61e93SEric Fiselier : integral_constant<bool, 267292e61e93SEric Fiselier is_same<_FromElem*, pointer>::value || 267392e61e93SEric Fiselier (is_same<pointer, element_type*>::value && 267492e61e93SEric Fiselier is_convertible<_FromElem(*)[], element_type(*)[]>::value) 267592e61e93SEric Fiselier > 267692e61e93SEric Fiselier {}; 267747272722SEric Fiselier 267847272722SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 267992e61e93SEric Fiselier typedef __unique_ptr_deleter_sfinae<_Dp> _DeleterSFINAE; 268047272722SEric Fiselier 268147272722SEric Fiselier template <bool _Dummy> 268247272722SEric Fiselier using _LValRefType = 268392e61e93SEric Fiselier typename __dependent_type<_DeleterSFINAE, _Dummy>::__lval_ref_type; 268447272722SEric Fiselier 268547272722SEric Fiselier template <bool _Dummy> 268647272722SEric Fiselier using _GoodRValRefType = 268792e61e93SEric Fiselier typename __dependent_type<_DeleterSFINAE, _Dummy>::__good_rval_ref_type; 268847272722SEric Fiselier 268947272722SEric Fiselier template <bool _Dummy> 269047272722SEric Fiselier using _BadRValRefType = 269192e61e93SEric Fiselier typename __dependent_type<_DeleterSFINAE, _Dummy>::__bad_rval_ref_type; 269247272722SEric Fiselier 269347272722SEric Fiselier template <bool _Dummy, class _Deleter = typename __dependent_type< 269447272722SEric Fiselier __identity<deleter_type>, _Dummy>::type> 269547272722SEric Fiselier using _EnableIfDeleterDefaultConstructible = 269647272722SEric Fiselier typename enable_if<is_default_constructible<_Deleter>::value && 269747272722SEric Fiselier !is_pointer<_Deleter>::value>::type; 269847272722SEric Fiselier 269947272722SEric Fiselier template <class _ArgType> 270047272722SEric Fiselier using _EnableIfDeleterConstructible = 270147272722SEric Fiselier typename enable_if<is_constructible<deleter_type, _ArgType>::value>::type; 27023e519524SHoward Hinnant 270322747e62SLogan Chien template <class _Pp> 270447272722SEric Fiselier using _EnableIfPointerConvertible = typename enable_if< 270592e61e93SEric Fiselier _CheckArrayPointerConversion<_Pp>::value 270647272722SEric Fiselier >::type; 270747272722SEric Fiselier 270847272722SEric Fiselier template <class _UPtr, class _Up, 270947272722SEric Fiselier class _ElemT = typename _UPtr::element_type> 271047272722SEric Fiselier using _EnableIfMoveConvertible = typename enable_if< 271147272722SEric Fiselier is_array<_Up>::value && 271247272722SEric Fiselier is_same<pointer, element_type*>::value && 271347272722SEric Fiselier is_same<typename _UPtr::pointer, _ElemT*>::value && 271447272722SEric Fiselier is_convertible<_ElemT(*)[], element_type(*)[]>::value 271547272722SEric Fiselier >::type; 271647272722SEric Fiselier 271747272722SEric Fiselier template <class _UDel> 271847272722SEric Fiselier using _EnableIfDeleterConvertible = typename enable_if< 271947272722SEric Fiselier (is_reference<_Dp>::value && is_same<_Dp, _UDel>::value) || 272047272722SEric Fiselier (!is_reference<_Dp>::value && is_convertible<_UDel, _Dp>::value) 272147272722SEric Fiselier >::type; 272247272722SEric Fiselier 272347272722SEric Fiselier template <class _UDel> 272447272722SEric Fiselier using _EnableIfDeleterAssignable = typename enable_if< 272547272722SEric Fiselier is_assignable<_Dp&, _UDel&&>::value 272647272722SEric Fiselier >::type; 272747272722SEric Fiselier 272847272722SEric Fiselierpublic: 272947272722SEric Fiselier template <bool _Dummy = true, 273047272722SEric Fiselier class = _EnableIfDeleterDefaultConstructible<_Dummy>> 273147272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 273247272722SEric Fiselier constexpr unique_ptr() noexcept : __ptr_(pointer()) {} 273347272722SEric Fiselier 273447272722SEric Fiselier template <bool _Dummy = true, 273547272722SEric Fiselier class = _EnableIfDeleterDefaultConstructible<_Dummy>> 273647272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 273747272722SEric Fiselier constexpr unique_ptr(nullptr_t) noexcept : __ptr_(pointer()) {} 273847272722SEric Fiselier 273947272722SEric Fiselier template <class _Pp, bool _Dummy = true, 274047272722SEric Fiselier class = _EnableIfDeleterDefaultConstructible<_Dummy>, 274147272722SEric Fiselier class = _EnableIfPointerConvertible<_Pp>> 274247272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 274347272722SEric Fiselier explicit unique_ptr(_Pp __p) noexcept 274447272722SEric Fiselier : __ptr_(__p) {} 274547272722SEric Fiselier 274647272722SEric Fiselier template <class _Pp, bool _Dummy = true, 274747272722SEric Fiselier class = _EnableIfDeleterConstructible<_LValRefType<_Dummy>>, 274847272722SEric Fiselier class = _EnableIfPointerConvertible<_Pp>> 274947272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 275047272722SEric Fiselier unique_ptr(_Pp __p, _LValRefType<_Dummy> __d) noexcept 27513e519524SHoward Hinnant : __ptr_(__p, __d) {} 27523e519524SHoward Hinnant 275347272722SEric Fiselier template <bool _Dummy = true, 275447272722SEric Fiselier class = _EnableIfDeleterConstructible<_LValRefType<_Dummy>>> 275547272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 275647272722SEric Fiselier unique_ptr(nullptr_t, _LValRefType<_Dummy> __d) noexcept 275747272722SEric Fiselier : __ptr_(nullptr, __d) {} 27583e519524SHoward Hinnant 275947272722SEric Fiselier template <class _Pp, bool _Dummy = true, 276047272722SEric Fiselier class = _EnableIfDeleterConstructible<_GoodRValRefType<_Dummy>>, 276147272722SEric Fiselier class = _EnableIfPointerConvertible<_Pp>> 276247272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 276347272722SEric Fiselier unique_ptr(_Pp __p, _GoodRValRefType<_Dummy> __d) noexcept 276447272722SEric Fiselier : __ptr_(__p, _VSTD::move(__d)) { 276547272722SEric Fiselier static_assert(!is_reference<deleter_type>::value, 276647272722SEric Fiselier "rvalue deleter bound to reference"); 27673e519524SHoward Hinnant } 27683e519524SHoward Hinnant 276947272722SEric Fiselier template <bool _Dummy = true, 277047272722SEric Fiselier class = _EnableIfDeleterConstructible<_GoodRValRefType<_Dummy>>> 277147272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 277247272722SEric Fiselier unique_ptr(nullptr_t, _GoodRValRefType<_Dummy> __d) noexcept 277347272722SEric Fiselier : __ptr_(nullptr, _VSTD::move(__d)) { 277447272722SEric Fiselier static_assert(!is_reference<deleter_type>::value, 277547272722SEric Fiselier "rvalue deleter bound to reference"); 27763e519524SHoward Hinnant } 27773e519524SHoward Hinnant 277847272722SEric Fiselier template <class _Pp, bool _Dummy = true, 277947272722SEric Fiselier class = _EnableIfDeleterConstructible<_BadRValRefType<_Dummy>>, 278047272722SEric Fiselier class = _EnableIfPointerConvertible<_Pp>> 278147272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 278247272722SEric Fiselier unique_ptr(_Pp __p, _BadRValRefType<_Dummy> __d) = delete; 27833e519524SHoward Hinnant 278447272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 278547272722SEric Fiselier unique_ptr(unique_ptr&& __u) noexcept 278647272722SEric Fiselier : __ptr_(__u.release(), _VSTD::forward<deleter_type>(__u.get_deleter())) { 278747272722SEric Fiselier } 278847272722SEric Fiselier 278947272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 279047272722SEric Fiselier unique_ptr& operator=(unique_ptr&& __u) noexcept { 27913e519524SHoward Hinnant reset(__u.release()); 2792ce48a113SHoward Hinnant __ptr_.second() = _VSTD::forward<deleter_type>(__u.get_deleter()); 27933e519524SHoward Hinnant return *this; 27943e519524SHoward Hinnant } 2795e4097ad7SHoward Hinnant 279647272722SEric Fiselier template <class _Up, class _Ep, 279747272722SEric Fiselier class = _EnableIfMoveConvertible<unique_ptr<_Up, _Ep>, _Up>, 279847272722SEric Fiselier class = _EnableIfDeleterConvertible<_Ep> 279947272722SEric Fiselier > 2800e4097ad7SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 280147272722SEric Fiselier unique_ptr(unique_ptr<_Up, _Ep>&& __u) noexcept 280286321b2bSEric Fiselier : __ptr_(__u.release(), _VSTD::forward<_Ep>(__u.get_deleter())) { 280347272722SEric Fiselier } 2804e4097ad7SHoward Hinnant 280547272722SEric Fiselier template <class _Up, class _Ep, 280647272722SEric Fiselier class = _EnableIfMoveConvertible<unique_ptr<_Up, _Ep>, _Up>, 280747272722SEric Fiselier class = _EnableIfDeleterAssignable<_Ep> 280847272722SEric Fiselier > 2809e4097ad7SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2810e4097ad7SHoward Hinnant unique_ptr& 281147272722SEric Fiselier operator=(unique_ptr<_Up, _Ep>&& __u) noexcept { 2812e4097ad7SHoward Hinnant reset(__u.release()); 2813e4097ad7SHoward Hinnant __ptr_.second() = _VSTD::forward<_Ep>(__u.get_deleter()); 2814e4097ad7SHoward Hinnant return *this; 2815e4097ad7SHoward Hinnant } 28163e519524SHoward Hinnant 281747272722SEric Fiselier#else // _LIBCPP_CXX03_LANG 281847272722SEric Fiselierprivate: 281947272722SEric Fiselier template <class _Up> explicit unique_ptr(_Up); 282047272722SEric Fiselier 282147272722SEric Fiselier unique_ptr(unique_ptr&); 282247272722SEric Fiselier template <class _Up> unique_ptr(unique_ptr<_Up>&); 282347272722SEric Fiselier 282447272722SEric Fiselier unique_ptr& operator=(unique_ptr&); 282547272722SEric Fiselier template <class _Up> unique_ptr& operator=(unique_ptr<_Up>&); 282647272722SEric Fiselier 282747272722SEric Fiselier template <class _Up> 282847272722SEric Fiselier unique_ptr(_Up __u, 282947272722SEric Fiselier typename conditional< 283047272722SEric Fiselier is_reference<deleter_type>::value, deleter_type, 283147272722SEric Fiselier typename add_lvalue_reference<const deleter_type>::type>::type, 283247272722SEric Fiselier typename enable_if<is_convertible<_Up, pointer>::value, 283347272722SEric Fiselier __nat>::type = __nat()); 283447272722SEric Fiselierpublic: 283547272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 283647272722SEric Fiselier unique_ptr() : __ptr_(pointer()) { 283747272722SEric Fiselier static_assert(!is_pointer<deleter_type>::value, 283847272722SEric Fiselier "unique_ptr constructed with null function pointer deleter"); 283947272722SEric Fiselier } 284047272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 284147272722SEric Fiselier unique_ptr(nullptr_t) : __ptr_(pointer()) { 28423e519524SHoward Hinnant static_assert(!is_pointer<deleter_type>::value, 28433e519524SHoward Hinnant "unique_ptr constructed with null function pointer deleter"); 28443e519524SHoward Hinnant } 28453e519524SHoward Hinnant 284647272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 284747272722SEric Fiselier explicit unique_ptr(pointer __p) : __ptr_(__p) { 284847272722SEric Fiselier static_assert(!is_pointer<deleter_type>::value, 284947272722SEric Fiselier "unique_ptr constructed with null function pointer deleter"); 285047272722SEric Fiselier } 285147272722SEric Fiselier 285247272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 285347272722SEric Fiselier unique_ptr(pointer __p, deleter_type __d) 2854ce48a113SHoward Hinnant : __ptr_(__p, _VSTD::forward<deleter_type>(__d)) {} 28553e519524SHoward Hinnant 285647272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 285747272722SEric Fiselier unique_ptr(nullptr_t, deleter_type __d) 2858ce48a113SHoward Hinnant : __ptr_(pointer(), _VSTD::forward<deleter_type>(__d)) {} 28593e519524SHoward Hinnant 286047272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 286147272722SEric Fiselier operator __rv<unique_ptr>() { 28623e519524SHoward Hinnant return __rv<unique_ptr>(*this); 28633e519524SHoward Hinnant } 28643e519524SHoward Hinnant 286547272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 286647272722SEric Fiselier unique_ptr(__rv<unique_ptr> __u) 286747272722SEric Fiselier : __ptr_(__u->release(), 286847272722SEric Fiselier _VSTD::forward<deleter_type>(__u->get_deleter())) {} 28693e519524SHoward Hinnant 287047272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 287147272722SEric Fiselier unique_ptr& operator=(__rv<unique_ptr> __u) { 28723e519524SHoward Hinnant reset(__u->release()); 2873ce48a113SHoward Hinnant __ptr_.second() = _VSTD::forward<deleter_type>(__u->get_deleter()); 28743e519524SHoward Hinnant return *this; 28753e519524SHoward Hinnant } 28763e519524SHoward Hinnant 287747272722SEric Fiselier#endif // _LIBCPP_CXX03_LANG 28783e519524SHoward Hinnant 287947272722SEric Fiselierpublic: 288047272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 288147272722SEric Fiselier ~unique_ptr() { reset(); } 288247272722SEric Fiselier 288347272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 288447272722SEric Fiselier unique_ptr& operator=(nullptr_t) _NOEXCEPT { 28853e519524SHoward Hinnant reset(); 28863e519524SHoward Hinnant return *this; 28873e519524SHoward Hinnant } 28883e519524SHoward Hinnant 2889f2f2d8b9SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 289047272722SEric Fiselier typename add_lvalue_reference<_Tp>::type 289147272722SEric Fiselier operator[](size_t __i) const { 289247272722SEric Fiselier return __ptr_.first()[__i]; 289347272722SEric Fiselier } 289447272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 289547272722SEric Fiselier pointer get() const _NOEXCEPT { 289647272722SEric Fiselier return __ptr_.first(); 289747272722SEric Fiselier } 28983e519524SHoward Hinnant 289947272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 290047272722SEric Fiselier deleter_type& get_deleter() _NOEXCEPT { 290147272722SEric Fiselier return __ptr_.second(); 290247272722SEric Fiselier } 290347272722SEric Fiselier 290447272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 290547272722SEric Fiselier const deleter_type& get_deleter() const _NOEXCEPT { 290647272722SEric Fiselier return __ptr_.second(); 290747272722SEric Fiselier } 290847272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 290947272722SEric Fiselier _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT { 291047272722SEric Fiselier return __ptr_.first() != nullptr; 291147272722SEric Fiselier } 291247272722SEric Fiselier 291347272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 291447272722SEric Fiselier pointer release() _NOEXCEPT { 29153e519524SHoward Hinnant pointer __t = __ptr_.first(); 29163e519524SHoward Hinnant __ptr_.first() = pointer(); 29173e519524SHoward Hinnant return __t; 29183e519524SHoward Hinnant } 29193e519524SHoward Hinnant 292022747e62SLogan Chien template <class _Pp> 292122747e62SLogan Chien _LIBCPP_INLINE_VISIBILITY 292247272722SEric Fiselier typename enable_if< 292392e61e93SEric Fiselier _CheckArrayPointerConversion<_Pp>::value 292447272722SEric Fiselier >::type 292547272722SEric Fiselier reset(_Pp __p) _NOEXCEPT { 29263e519524SHoward Hinnant pointer __tmp = __ptr_.first(); 29273e519524SHoward Hinnant __ptr_.first() = __p; 29283e519524SHoward Hinnant if (__tmp) 29293e519524SHoward Hinnant __ptr_.second()(__tmp); 29303e519524SHoward Hinnant } 293147272722SEric Fiselier 293247272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 293347272722SEric Fiselier void reset(nullptr_t = nullptr) _NOEXCEPT { 29343e519524SHoward Hinnant pointer __tmp = __ptr_.first(); 29353e519524SHoward Hinnant __ptr_.first() = nullptr; 29363e519524SHoward Hinnant if (__tmp) 29373e519524SHoward Hinnant __ptr_.second()(__tmp); 29383e519524SHoward Hinnant } 29393e519524SHoward Hinnant 294047272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 294147272722SEric Fiselier void swap(unique_ptr& __u) _NOEXCEPT { 294247272722SEric Fiselier __ptr_.swap(__u.__ptr_); 294347272722SEric Fiselier } 29443e519524SHoward Hinnant 29453e519524SHoward Hinnant}; 29463e519524SHoward Hinnant 29473e519524SHoward Hinnanttemplate <class _Tp, class _Dp> 29483e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 2949f07dd8d0SEric Fiseliertypename enable_if< 2950f07dd8d0SEric Fiselier __is_swappable<_Dp>::value, 29513e519524SHoward Hinnant void 2952f07dd8d0SEric Fiselier>::type 29533739fe79SHoward Hinnantswap(unique_ptr<_Tp, _Dp>& __x, unique_ptr<_Tp, _Dp>& __y) _NOEXCEPT {__x.swap(__y);} 29543e519524SHoward Hinnant 29553e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 29563e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 29573e519524SHoward Hinnantbool 29583e519524SHoward Hinnantoperator==(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return __x.get() == __y.get();} 29593e519524SHoward Hinnant 29603e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 29613e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 29623e519524SHoward Hinnantbool 29633e519524SHoward Hinnantoperator!=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__x == __y);} 29643e519524SHoward Hinnant 29653e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 29663e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 29673e519524SHoward Hinnantbool 296867f39647SHoward Hinnantoperator< (const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) 296967f39647SHoward Hinnant{ 297067f39647SHoward Hinnant typedef typename unique_ptr<_T1, _D1>::pointer _P1; 297167f39647SHoward Hinnant typedef typename unique_ptr<_T2, _D2>::pointer _P2; 29726fe361c1SEric Fiselier typedef typename common_type<_P1, _P2>::type _Vp; 29736fe361c1SEric Fiselier return less<_Vp>()(__x.get(), __y.get()); 297467f39647SHoward Hinnant} 29753e519524SHoward Hinnant 29763e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 29773e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 29783e519524SHoward Hinnantbool 29793e519524SHoward Hinnantoperator> (const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return __y < __x;} 29803e519524SHoward Hinnant 29813e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 29823e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 29833e519524SHoward Hinnantbool 29843e519524SHoward Hinnantoperator<=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__y < __x);} 29853e519524SHoward Hinnant 29863e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 29873e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 29883e519524SHoward Hinnantbool 29893e519524SHoward Hinnantoperator>=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__x < __y);} 29903e519524SHoward Hinnant 299167f39647SHoward Hinnanttemplate <class _T1, class _D1> 299267f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 299367f39647SHoward Hinnantbool 2994c0937e8aSHoward Hinnantoperator==(const unique_ptr<_T1, _D1>& __x, nullptr_t) _NOEXCEPT 299567f39647SHoward Hinnant{ 299667f39647SHoward Hinnant return !__x; 299767f39647SHoward Hinnant} 299867f39647SHoward Hinnant 299967f39647SHoward Hinnanttemplate <class _T1, class _D1> 300067f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 300167f39647SHoward Hinnantbool 3002c0937e8aSHoward Hinnantoperator==(nullptr_t, const unique_ptr<_T1, _D1>& __x) _NOEXCEPT 300367f39647SHoward Hinnant{ 300467f39647SHoward Hinnant return !__x; 300567f39647SHoward Hinnant} 300667f39647SHoward Hinnant 300767f39647SHoward Hinnanttemplate <class _T1, class _D1> 300867f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 300967f39647SHoward Hinnantbool 3010c0937e8aSHoward Hinnantoperator!=(const unique_ptr<_T1, _D1>& __x, nullptr_t) _NOEXCEPT 301167f39647SHoward Hinnant{ 301267f39647SHoward Hinnant return static_cast<bool>(__x); 301367f39647SHoward Hinnant} 301467f39647SHoward Hinnant 301567f39647SHoward Hinnanttemplate <class _T1, class _D1> 301667f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 301767f39647SHoward Hinnantbool 3018c0937e8aSHoward Hinnantoperator!=(nullptr_t, const unique_ptr<_T1, _D1>& __x) _NOEXCEPT 301967f39647SHoward Hinnant{ 302067f39647SHoward Hinnant return static_cast<bool>(__x); 302167f39647SHoward Hinnant} 302267f39647SHoward Hinnant 302367f39647SHoward Hinnanttemplate <class _T1, class _D1> 302467f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 302567f39647SHoward Hinnantbool 302667f39647SHoward Hinnantoperator<(const unique_ptr<_T1, _D1>& __x, nullptr_t) 302767f39647SHoward Hinnant{ 302867f39647SHoward Hinnant typedef typename unique_ptr<_T1, _D1>::pointer _P1; 302967f39647SHoward Hinnant return less<_P1>()(__x.get(), nullptr); 303067f39647SHoward Hinnant} 303167f39647SHoward Hinnant 303267f39647SHoward Hinnanttemplate <class _T1, class _D1> 303367f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 303467f39647SHoward Hinnantbool 303567f39647SHoward Hinnantoperator<(nullptr_t, const unique_ptr<_T1, _D1>& __x) 303667f39647SHoward Hinnant{ 303767f39647SHoward Hinnant typedef typename unique_ptr<_T1, _D1>::pointer _P1; 303867f39647SHoward Hinnant return less<_P1>()(nullptr, __x.get()); 303967f39647SHoward Hinnant} 304067f39647SHoward Hinnant 304167f39647SHoward Hinnanttemplate <class _T1, class _D1> 304267f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 304367f39647SHoward Hinnantbool 304467f39647SHoward Hinnantoperator>(const unique_ptr<_T1, _D1>& __x, nullptr_t) 304567f39647SHoward Hinnant{ 304667f39647SHoward Hinnant return nullptr < __x; 304767f39647SHoward Hinnant} 304867f39647SHoward Hinnant 304967f39647SHoward Hinnanttemplate <class _T1, class _D1> 305067f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 305167f39647SHoward Hinnantbool 305267f39647SHoward Hinnantoperator>(nullptr_t, const unique_ptr<_T1, _D1>& __x) 305367f39647SHoward Hinnant{ 305467f39647SHoward Hinnant return __x < nullptr; 305567f39647SHoward Hinnant} 305667f39647SHoward Hinnant 305767f39647SHoward Hinnanttemplate <class _T1, class _D1> 305867f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 305967f39647SHoward Hinnantbool 306067f39647SHoward Hinnantoperator<=(const unique_ptr<_T1, _D1>& __x, nullptr_t) 306167f39647SHoward Hinnant{ 306267f39647SHoward Hinnant return !(nullptr < __x); 306367f39647SHoward Hinnant} 306467f39647SHoward Hinnant 306567f39647SHoward Hinnanttemplate <class _T1, class _D1> 306667f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 306767f39647SHoward Hinnantbool 306867f39647SHoward Hinnantoperator<=(nullptr_t, const unique_ptr<_T1, _D1>& __x) 306967f39647SHoward Hinnant{ 307067f39647SHoward Hinnant return !(__x < nullptr); 307167f39647SHoward Hinnant} 307267f39647SHoward Hinnant 307367f39647SHoward Hinnanttemplate <class _T1, class _D1> 307467f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 307567f39647SHoward Hinnantbool 307667f39647SHoward Hinnantoperator>=(const unique_ptr<_T1, _D1>& __x, nullptr_t) 307767f39647SHoward Hinnant{ 307867f39647SHoward Hinnant return !(__x < nullptr); 307967f39647SHoward Hinnant} 308067f39647SHoward Hinnant 308167f39647SHoward Hinnanttemplate <class _T1, class _D1> 308267f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 308367f39647SHoward Hinnantbool 308467f39647SHoward Hinnantoperator>=(nullptr_t, const unique_ptr<_T1, _D1>& __x) 308567f39647SHoward Hinnant{ 308667f39647SHoward Hinnant return !(nullptr < __x); 308767f39647SHoward Hinnant} 308867f39647SHoward Hinnant 3089bff1bfc6SHoward Hinnant#ifdef _LIBCPP_HAS_NO_RVALUE_REFERENCES 3090bff1bfc6SHoward Hinnant 3091bff1bfc6SHoward Hinnanttemplate <class _Tp, class _Dp> 3092bff1bfc6SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 3093bff1bfc6SHoward Hinnantunique_ptr<_Tp, _Dp> 3094bff1bfc6SHoward Hinnantmove(unique_ptr<_Tp, _Dp>& __t) 3095bff1bfc6SHoward Hinnant{ 3096bff1bfc6SHoward Hinnant return unique_ptr<_Tp, _Dp>(__rv<unique_ptr<_Tp, _Dp> >(__t)); 3097bff1bfc6SHoward Hinnant} 3098bff1bfc6SHoward Hinnant 3099bff1bfc6SHoward Hinnant#endif 3100bff1bfc6SHoward Hinnant 310128d8ba5fSMarshall Clow#if _LIBCPP_STD_VER > 11 310228d8ba5fSMarshall Clow 310328d8ba5fSMarshall Clowtemplate<class _Tp> 310428d8ba5fSMarshall Clowstruct __unique_if 310528d8ba5fSMarshall Clow{ 310628d8ba5fSMarshall Clow typedef unique_ptr<_Tp> __unique_single; 310728d8ba5fSMarshall Clow}; 310828d8ba5fSMarshall Clow 310928d8ba5fSMarshall Clowtemplate<class _Tp> 311028d8ba5fSMarshall Clowstruct __unique_if<_Tp[]> 311128d8ba5fSMarshall Clow{ 311228d8ba5fSMarshall Clow typedef unique_ptr<_Tp[]> __unique_array_unknown_bound; 311328d8ba5fSMarshall Clow}; 311428d8ba5fSMarshall Clow 311528d8ba5fSMarshall Clowtemplate<class _Tp, size_t _Np> 311628d8ba5fSMarshall Clowstruct __unique_if<_Tp[_Np]> 311728d8ba5fSMarshall Clow{ 311828d8ba5fSMarshall Clow typedef void __unique_array_known_bound; 311928d8ba5fSMarshall Clow}; 312028d8ba5fSMarshall Clow 312128d8ba5fSMarshall Clowtemplate<class _Tp, class... _Args> 312295ddb530SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 312328d8ba5fSMarshall Clowtypename __unique_if<_Tp>::__unique_single 312428d8ba5fSMarshall Clowmake_unique(_Args&&... __args) 312528d8ba5fSMarshall Clow{ 312628d8ba5fSMarshall Clow return unique_ptr<_Tp>(new _Tp(_VSTD::forward<_Args>(__args)...)); 312728d8ba5fSMarshall Clow} 312828d8ba5fSMarshall Clow 312928d8ba5fSMarshall Clowtemplate<class _Tp> 313095ddb530SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 313128d8ba5fSMarshall Clowtypename __unique_if<_Tp>::__unique_array_unknown_bound 313228d8ba5fSMarshall Clowmake_unique(size_t __n) 313328d8ba5fSMarshall Clow{ 313428d8ba5fSMarshall Clow typedef typename remove_extent<_Tp>::type _Up; 313528d8ba5fSMarshall Clow return unique_ptr<_Tp>(new _Up[__n]()); 313628d8ba5fSMarshall Clow} 313728d8ba5fSMarshall Clow 313828d8ba5fSMarshall Clowtemplate<class _Tp, class... _Args> 313928d8ba5fSMarshall Clow typename __unique_if<_Tp>::__unique_array_known_bound 314028d8ba5fSMarshall Clow make_unique(_Args&&...) = delete; 314128d8ba5fSMarshall Clow 314228d8ba5fSMarshall Clow#endif // _LIBCPP_STD_VER > 11 314328d8ba5fSMarshall Clow 3144d1803b6cSHoward Hinnanttemplate <class _Tp, class _Dp> 3145f9127593SEric Fiselier#ifdef _LIBCPP_CXX03_LANG 3146e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS hash<unique_ptr<_Tp, _Dp> > 3147f9127593SEric Fiselier#else 3148f9127593SEric Fiselierstruct _LIBCPP_TEMPLATE_VIS hash<__enable_hash_helper< 3149f9127593SEric Fiselier unique_ptr<_Tp, _Dp>, typename unique_ptr<_Tp, _Dp>::pointer>> 3150f9127593SEric Fiselier#endif 3151d1803b6cSHoward Hinnant{ 3152d1803b6cSHoward Hinnant typedef unique_ptr<_Tp, _Dp> argument_type; 3153d1803b6cSHoward Hinnant typedef size_t result_type; 3154848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 31557c803385SMarshall Clow result_type operator()(const argument_type& __ptr) const 3156d1803b6cSHoward Hinnant { 3157d1803b6cSHoward Hinnant typedef typename argument_type::pointer pointer; 3158d1803b6cSHoward Hinnant return hash<pointer>()(__ptr.get()); 3159d1803b6cSHoward Hinnant } 3160d1803b6cSHoward Hinnant}; 3161d1803b6cSHoward Hinnant 31623e519524SHoward Hinnantstruct __destruct_n 31633e519524SHoward Hinnant{ 31643e519524SHoward Hinnantprivate: 31659ffacf3dSEric Fiselier size_t __size_; 31663e519524SHoward Hinnant 31673e519524SHoward Hinnant template <class _Tp> 31683739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __process(_Tp* __p, false_type) _NOEXCEPT 31699ffacf3dSEric Fiselier {for (size_t __i = 0; __i < __size_; ++__i, ++__p) __p->~_Tp();} 31703e519524SHoward Hinnant 31713e519524SHoward Hinnant template <class _Tp> 31723739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __process(_Tp*, true_type) _NOEXCEPT 31733e519524SHoward Hinnant {} 31743e519524SHoward Hinnant 31753739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __incr(false_type) _NOEXCEPT 31769ffacf3dSEric Fiselier {++__size_;} 31773739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __incr(true_type) _NOEXCEPT 31783e519524SHoward Hinnant {} 31793e519524SHoward Hinnant 31803739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __set(size_t __s, false_type) _NOEXCEPT 31819ffacf3dSEric Fiselier {__size_ = __s;} 31823739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __set(size_t, true_type) _NOEXCEPT 31833e519524SHoward Hinnant {} 31843e519524SHoward Hinnantpublic: 31853739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __destruct_n(size_t __s) _NOEXCEPT 31869ffacf3dSEric Fiselier : __size_(__s) {} 31873e519524SHoward Hinnant 31883e519524SHoward Hinnant template <class _Tp> 31893739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __incr(_Tp*) _NOEXCEPT 3190ca740483SHoward Hinnant {__incr(integral_constant<bool, is_trivially_destructible<_Tp>::value>());} 31913e519524SHoward Hinnant 31923e519524SHoward Hinnant template <class _Tp> 31933739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __set(size_t __s, _Tp*) _NOEXCEPT 3194ca740483SHoward Hinnant {__set(__s, integral_constant<bool, is_trivially_destructible<_Tp>::value>());} 31953e519524SHoward Hinnant 31963e519524SHoward Hinnant template <class _Tp> 31973739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __p) _NOEXCEPT 3198ca740483SHoward Hinnant {__process(__p, integral_constant<bool, is_trivially_destructible<_Tp>::value>());} 31993e519524SHoward Hinnant}; 32003e519524SHoward Hinnant 32013e519524SHoward Hinnanttemplate <class _Alloc> 32023e519524SHoward Hinnantclass __allocator_destructor 32033e519524SHoward Hinnant{ 32043e519524SHoward Hinnant typedef allocator_traits<_Alloc> __alloc_traits; 32053e519524SHoward Hinnantpublic: 32063e519524SHoward Hinnant typedef typename __alloc_traits::pointer pointer; 32073e519524SHoward Hinnant typedef typename __alloc_traits::size_type size_type; 32083e519524SHoward Hinnantprivate: 32093e519524SHoward Hinnant _Alloc& __alloc_; 32103e519524SHoward Hinnant size_type __s_; 32113e519524SHoward Hinnantpublic: 32123e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __allocator_destructor(_Alloc& __a, size_type __s) 32133739fe79SHoward Hinnant _NOEXCEPT 32143e519524SHoward Hinnant : __alloc_(__a), __s_(__s) {} 3215848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 32163739fe79SHoward Hinnant void operator()(pointer __p) _NOEXCEPT 32173739fe79SHoward Hinnant {__alloc_traits::deallocate(__alloc_, __p, __s_);} 32183e519524SHoward Hinnant}; 32193e519524SHoward Hinnant 32203e519524SHoward Hinnanttemplate <class _InputIterator, class _ForwardIterator> 32213e519524SHoward Hinnant_ForwardIterator 32223e519524SHoward Hinnantuninitialized_copy(_InputIterator __f, _InputIterator __l, _ForwardIterator __r) 32233e519524SHoward Hinnant{ 32243e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 3225b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3226b34b4819SHoward Hinnant _ForwardIterator __s = __r; 3227b34b4819SHoward Hinnant try 3228b34b4819SHoward Hinnant { 3229b34b4819SHoward Hinnant#endif 3230a00932bdSMarshall Clow for (; __f != __l; ++__f, (void) ++__r) 3231a00932bdSMarshall Clow ::new (static_cast<void*>(_VSTD::addressof(*__r))) value_type(*__f); 3232b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3233b34b4819SHoward Hinnant } 3234b34b4819SHoward Hinnant catch (...) 3235b34b4819SHoward Hinnant { 3236b34b4819SHoward Hinnant for (; __s != __r; ++__s) 3237b34b4819SHoward Hinnant __s->~value_type(); 3238b34b4819SHoward Hinnant throw; 3239b34b4819SHoward Hinnant } 3240b34b4819SHoward Hinnant#endif 32413e519524SHoward Hinnant return __r; 32423e519524SHoward Hinnant} 32433e519524SHoward Hinnant 32443e519524SHoward Hinnanttemplate <class _InputIterator, class _Size, class _ForwardIterator> 32453e519524SHoward Hinnant_ForwardIterator 32463e519524SHoward Hinnantuninitialized_copy_n(_InputIterator __f, _Size __n, _ForwardIterator __r) 32473e519524SHoward Hinnant{ 32483e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 3249b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3250b34b4819SHoward Hinnant _ForwardIterator __s = __r; 3251b34b4819SHoward Hinnant try 3252b34b4819SHoward Hinnant { 3253b34b4819SHoward Hinnant#endif 3254a00932bdSMarshall Clow for (; __n > 0; ++__f, (void) ++__r, (void) --__n) 3255a00932bdSMarshall Clow ::new (static_cast<void*>(_VSTD::addressof(*__r))) value_type(*__f); 3256b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3257b34b4819SHoward Hinnant } 3258b34b4819SHoward Hinnant catch (...) 3259b34b4819SHoward Hinnant { 3260b34b4819SHoward Hinnant for (; __s != __r; ++__s) 3261b34b4819SHoward Hinnant __s->~value_type(); 3262b34b4819SHoward Hinnant throw; 3263b34b4819SHoward Hinnant } 3264b34b4819SHoward Hinnant#endif 32653e519524SHoward Hinnant return __r; 32663e519524SHoward Hinnant} 32673e519524SHoward Hinnant 32683e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Tp> 32693e519524SHoward Hinnantvoid 32703e519524SHoward Hinnantuninitialized_fill(_ForwardIterator __f, _ForwardIterator __l, const _Tp& __x) 32713e519524SHoward Hinnant{ 32723e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 3273b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3274b34b4819SHoward Hinnant _ForwardIterator __s = __f; 3275b34b4819SHoward Hinnant try 3276b34b4819SHoward Hinnant { 3277b34b4819SHoward Hinnant#endif 3278b34b4819SHoward Hinnant for (; __f != __l; ++__f) 3279a00932bdSMarshall Clow ::new (static_cast<void*>(_VSTD::addressof(*__f))) value_type(__x); 3280b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3281b34b4819SHoward Hinnant } 3282b34b4819SHoward Hinnant catch (...) 3283b34b4819SHoward Hinnant { 3284b34b4819SHoward Hinnant for (; __s != __f; ++__s) 3285b34b4819SHoward Hinnant __s->~value_type(); 3286b34b4819SHoward Hinnant throw; 3287b34b4819SHoward Hinnant } 3288b34b4819SHoward Hinnant#endif 32893e519524SHoward Hinnant} 32903e519524SHoward Hinnant 32913e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Size, class _Tp> 329248d05bd2SHoward Hinnant_ForwardIterator 32933e519524SHoward Hinnantuninitialized_fill_n(_ForwardIterator __f, _Size __n, const _Tp& __x) 32943e519524SHoward Hinnant{ 32953e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 3296b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3297b34b4819SHoward Hinnant _ForwardIterator __s = __f; 3298b34b4819SHoward Hinnant try 3299b34b4819SHoward Hinnant { 3300b34b4819SHoward Hinnant#endif 3301a00932bdSMarshall Clow for (; __n > 0; ++__f, (void) --__n) 3302a00932bdSMarshall Clow ::new (static_cast<void*>(_VSTD::addressof(*__f))) value_type(__x); 3303b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3304b34b4819SHoward Hinnant } 3305b34b4819SHoward Hinnant catch (...) 3306b34b4819SHoward Hinnant { 3307b34b4819SHoward Hinnant for (; __s != __f; ++__s) 3308b34b4819SHoward Hinnant __s->~value_type(); 3309b34b4819SHoward Hinnant throw; 3310b34b4819SHoward Hinnant } 3311b34b4819SHoward Hinnant#endif 331248d05bd2SHoward Hinnant return __f; 33133e519524SHoward Hinnant} 33143e519524SHoward Hinnant 3315e4d9c316SEric Fiselier#if _LIBCPP_STD_VER > 14 3316e4d9c316SEric Fiselier 3317e4d9c316SEric Fiseliertemplate <class _Tp> 3318e4d9c316SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3319e4d9c316SEric Fiseliervoid destroy_at(_Tp* __loc) { 3320e4d9c316SEric Fiselier _LIBCPP_ASSERT(__loc, "null pointer given to destroy_at"); 3321e4d9c316SEric Fiselier __loc->~_Tp(); 3322e4d9c316SEric Fiselier} 3323e4d9c316SEric Fiselier 3324e4d9c316SEric Fiseliertemplate <class _ForwardIterator> 3325e4d9c316SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3326e4d9c316SEric Fiseliervoid destroy(_ForwardIterator __first, _ForwardIterator __last) { 3327e4d9c316SEric Fiselier for (; __first != __last; ++__first) 3328e4d9c316SEric Fiselier _VSTD::destroy_at(_VSTD::addressof(*__first)); 3329e4d9c316SEric Fiselier} 3330e4d9c316SEric Fiselier 3331e4d9c316SEric Fiseliertemplate <class _ForwardIterator, class _Size> 3332e4d9c316SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3333e4d9c316SEric Fiselier_ForwardIterator destroy_n(_ForwardIterator __first, _Size __n) { 3334e4d9c316SEric Fiselier for (; __n > 0; (void)++__first, --__n) 3335e4d9c316SEric Fiselier _VSTD::destroy_at(_VSTD::addressof(*__first)); 3336e4d9c316SEric Fiselier return __first; 3337e4d9c316SEric Fiselier} 3338e4d9c316SEric Fiselier 3339e778d10cSEric Fiseliertemplate <class _ForwardIterator> 3340e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3341e778d10cSEric Fiseliervoid uninitialized_default_construct(_ForwardIterator __first, _ForwardIterator __last) { 3342e778d10cSEric Fiselier using _Vt = typename iterator_traits<_ForwardIterator>::value_type; 3343e778d10cSEric Fiselier auto __idx = __first; 3344e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3345e778d10cSEric Fiselier try { 3346e778d10cSEric Fiselier#endif 3347e778d10cSEric Fiselier for (; __idx != __last; ++__idx) 3348e778d10cSEric Fiselier ::new((void*)_VSTD::addressof(*__idx)) _Vt; 3349e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3350e778d10cSEric Fiselier } catch (...) { 3351e778d10cSEric Fiselier _VSTD::destroy(__first, __idx); 3352e778d10cSEric Fiselier throw; 3353e778d10cSEric Fiselier } 3354e778d10cSEric Fiselier#endif 3355e778d10cSEric Fiselier} 3356e778d10cSEric Fiselier 3357e778d10cSEric Fiseliertemplate <class _ForwardIterator, class _Size> 3358e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3359e778d10cSEric Fiselier_ForwardIterator uninitialized_default_construct_n(_ForwardIterator __first, _Size __n) { 3360e778d10cSEric Fiselier using _Vt = typename iterator_traits<_ForwardIterator>::value_type; 3361e778d10cSEric Fiselier auto __idx = __first; 3362e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3363e778d10cSEric Fiselier try { 3364e778d10cSEric Fiselier#endif 3365e778d10cSEric Fiselier for (; __n > 0; (void)++__idx, --__n) 3366e778d10cSEric Fiselier ::new((void*)_VSTD::addressof(*__idx)) _Vt; 3367e778d10cSEric Fiselier return __idx; 3368e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3369e778d10cSEric Fiselier } catch (...) { 3370e778d10cSEric Fiselier _VSTD::destroy(__first, __idx); 3371e778d10cSEric Fiselier throw; 3372e778d10cSEric Fiselier } 3373e778d10cSEric Fiselier#endif 3374e778d10cSEric Fiselier} 3375e778d10cSEric Fiselier 3376e778d10cSEric Fiselier 3377e778d10cSEric Fiseliertemplate <class _ForwardIterator> 3378e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3379e778d10cSEric Fiseliervoid uninitialized_value_construct(_ForwardIterator __first, _ForwardIterator __last) { 3380e778d10cSEric Fiselier using _Vt = typename iterator_traits<_ForwardIterator>::value_type; 3381e778d10cSEric Fiselier auto __idx = __first; 3382e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3383e778d10cSEric Fiselier try { 3384e778d10cSEric Fiselier#endif 3385e778d10cSEric Fiselier for (; __idx != __last; ++__idx) 3386e778d10cSEric Fiselier ::new((void*)_VSTD::addressof(*__idx)) _Vt(); 3387e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3388e778d10cSEric Fiselier } catch (...) { 3389e778d10cSEric Fiselier _VSTD::destroy(__first, __idx); 3390e778d10cSEric Fiselier throw; 3391e778d10cSEric Fiselier } 3392e778d10cSEric Fiselier#endif 3393e778d10cSEric Fiselier} 3394e778d10cSEric Fiselier 3395e778d10cSEric Fiseliertemplate <class _ForwardIterator, class _Size> 3396e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3397e778d10cSEric Fiselier_ForwardIterator uninitialized_value_construct_n(_ForwardIterator __first, _Size __n) { 3398e778d10cSEric Fiselier using _Vt = typename iterator_traits<_ForwardIterator>::value_type; 3399e778d10cSEric Fiselier auto __idx = __first; 3400e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3401e778d10cSEric Fiselier try { 3402e778d10cSEric Fiselier#endif 3403e778d10cSEric Fiselier for (; __n > 0; (void)++__idx, --__n) 3404e778d10cSEric Fiselier ::new((void*)_VSTD::addressof(*__idx)) _Vt(); 3405e778d10cSEric Fiselier return __idx; 3406e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3407e778d10cSEric Fiselier } catch (...) { 3408e778d10cSEric Fiselier _VSTD::destroy(__first, __idx); 3409e778d10cSEric Fiselier throw; 3410e778d10cSEric Fiselier } 3411e778d10cSEric Fiselier#endif 3412e778d10cSEric Fiselier} 3413e778d10cSEric Fiselier 3414e778d10cSEric Fiselier 3415e778d10cSEric Fiseliertemplate <class _InputIt, class _ForwardIt> 3416e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3417e778d10cSEric Fiselier_ForwardIt uninitialized_move(_InputIt __first, _InputIt __last, _ForwardIt __first_res) { 3418e778d10cSEric Fiselier using _Vt = typename iterator_traits<_ForwardIt>::value_type; 3419e778d10cSEric Fiselier auto __idx = __first_res; 3420e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3421e778d10cSEric Fiselier try { 3422e778d10cSEric Fiselier#endif 3423e778d10cSEric Fiselier for (; __first != __last; (void)++__idx, ++__first) 3424e778d10cSEric Fiselier ::new((void*)_VSTD::addressof(*__idx)) _Vt(std::move(*__first)); 3425e778d10cSEric Fiselier return __idx; 3426e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3427e778d10cSEric Fiselier } catch (...) { 3428e778d10cSEric Fiselier _VSTD::destroy(__first_res, __idx); 3429e778d10cSEric Fiselier throw; 3430e778d10cSEric Fiselier } 3431e778d10cSEric Fiselier#endif 3432e778d10cSEric Fiselier} 3433e778d10cSEric Fiselier 3434e778d10cSEric Fiseliertemplate <class _InputIt, class _Size, class _ForwardIt> 3435e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3436e778d10cSEric Fiselierpair<_InputIt, _ForwardIt> 3437e778d10cSEric Fiselieruninitialized_move_n(_InputIt __first, _Size __n, _ForwardIt __first_res) { 3438e778d10cSEric Fiselier using _Vt = typename iterator_traits<_ForwardIt>::value_type; 3439e778d10cSEric Fiselier auto __idx = __first_res; 3440e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3441e778d10cSEric Fiselier try { 3442e778d10cSEric Fiselier#endif 3443e778d10cSEric Fiselier for (; __n > 0; ++__idx, (void)++__first, --__n) 3444e778d10cSEric Fiselier ::new((void*)_VSTD::addressof(*__idx)) _Vt(std::move(*__first)); 3445e778d10cSEric Fiselier return {__first, __idx}; 3446e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3447e778d10cSEric Fiselier } catch (...) { 3448e778d10cSEric Fiselier _VSTD::destroy(__first_res, __idx); 3449e778d10cSEric Fiselier throw; 3450e778d10cSEric Fiselier } 3451e778d10cSEric Fiselier#endif 3452e778d10cSEric Fiselier} 3453e778d10cSEric Fiselier 3454e778d10cSEric Fiselier 3455e4d9c316SEric Fiselier#endif // _LIBCPP_STD_VER > 14 3456e4d9c316SEric Fiselier 3457f08de52dSKevin Hu// NOTE: Relaxed and acq/rel atomics (for increment and decrement respectively) 3458f08de52dSKevin Hu// should be sufficient for thread safety. 34593c35491fSEric Fiselier// See https://bugs.llvm.org/show_bug.cgi?id=22803 3460f08de52dSKevin Hu#if defined(__clang__) && __has_builtin(__atomic_add_fetch) \ 3461f08de52dSKevin Hu && defined(__ATOMIC_RELAXED) \ 3462f08de52dSKevin Hu && defined(__ATOMIC_ACQ_REL) 3463f08de52dSKevin Hu# define _LIBCPP_HAS_BUILTIN_ATOMIC_SUPPORT 3464f08de52dSKevin Hu#elif !defined(__clang__) && defined(_GNUC_VER) && _GNUC_VER >= 407 3465f08de52dSKevin Hu# define _LIBCPP_HAS_BUILTIN_ATOMIC_SUPPORT 3466f08de52dSKevin Hu#endif 3467f08de52dSKevin Hu 3468f08de52dSKevin Hutemplate <class _Tp> 3469f08de52dSKevin Huinline _LIBCPP_INLINE_VISIBILITY _Tp 3470f08de52dSKevin Hu__libcpp_atomic_refcount_increment(_Tp& __t) _NOEXCEPT 3471f08de52dSKevin Hu{ 3472f08de52dSKevin Hu#if defined(_LIBCPP_HAS_BUILTIN_ATOMIC_SUPPORT) && !defined(_LIBCPP_HAS_NO_THREADS) 3473f08de52dSKevin Hu return __atomic_add_fetch(&__t, 1, __ATOMIC_RELAXED); 3474f08de52dSKevin Hu#else 3475f08de52dSKevin Hu return __t += 1; 3476f08de52dSKevin Hu#endif 3477f08de52dSKevin Hu} 3478f08de52dSKevin Hu 3479f08de52dSKevin Hutemplate <class _Tp> 3480f08de52dSKevin Huinline _LIBCPP_INLINE_VISIBILITY _Tp 3481f08de52dSKevin Hu__libcpp_atomic_refcount_decrement(_Tp& __t) _NOEXCEPT 3482f08de52dSKevin Hu{ 3483f08de52dSKevin Hu#if defined(_LIBCPP_HAS_BUILTIN_ATOMIC_SUPPORT) && !defined(_LIBCPP_HAS_NO_THREADS) 3484f08de52dSKevin Hu return __atomic_add_fetch(&__t, -1, __ATOMIC_ACQ_REL); 3485f08de52dSKevin Hu#else 3486f08de52dSKevin Hu return __t -= 1; 3487f08de52dSKevin Hu#endif 3488f08de52dSKevin Hu} 3489f08de52dSKevin Hu 3490848a5374SHoward Hinnantclass _LIBCPP_EXCEPTION_ABI bad_weak_ptr 34913e519524SHoward Hinnant : public std::exception 34923e519524SHoward Hinnant{ 34933e519524SHoward Hinnantpublic: 34943739fe79SHoward Hinnant virtual ~bad_weak_ptr() _NOEXCEPT; 34953739fe79SHoward Hinnant virtual const char* what() const _NOEXCEPT; 34963e519524SHoward Hinnant}; 34973e519524SHoward Hinnant 3498d437fa5cSMarshall Clow_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE 3499d437fa5cSMarshall Clowvoid __throw_bad_weak_ptr() 3500d437fa5cSMarshall Clow{ 3501d437fa5cSMarshall Clow#ifndef _LIBCPP_NO_EXCEPTIONS 3502d437fa5cSMarshall Clow throw bad_weak_ptr(); 3503d437fa5cSMarshall Clow#else 3504d437fa5cSMarshall Clow _VSTD::abort(); 3505d437fa5cSMarshall Clow#endif 3506d437fa5cSMarshall Clow} 3507d437fa5cSMarshall Clow 3508e2f2d1edSEric Fiseliertemplate<class _Tp> class _LIBCPP_TEMPLATE_VIS weak_ptr; 35093e519524SHoward Hinnant 3510f0544c20SHoward Hinnantclass _LIBCPP_TYPE_VIS __shared_count 35113e519524SHoward Hinnant{ 35123e519524SHoward Hinnant __shared_count(const __shared_count&); 35133e519524SHoward Hinnant __shared_count& operator=(const __shared_count&); 35143e519524SHoward Hinnant 35153e519524SHoward Hinnantprotected: 35163e519524SHoward Hinnant long __shared_owners_; 35173e519524SHoward Hinnant virtual ~__shared_count(); 35183e519524SHoward Hinnantprivate: 35193739fe79SHoward Hinnant virtual void __on_zero_shared() _NOEXCEPT = 0; 35203e519524SHoward Hinnant 35213e519524SHoward Hinnantpublic: 3522848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 35233739fe79SHoward Hinnant explicit __shared_count(long __refs = 0) _NOEXCEPT 35243e519524SHoward Hinnant : __shared_owners_(__refs) {} 35253e519524SHoward Hinnant 352611f60453SEric Fiselier#if defined(_LIBCPP_BUILDING_MEMORY) && \ 352711f60453SEric Fiselier defined(_LIBCPP_DEPRECATED_ABI_LEGACY_LIBRARY_DEFINITIONS_FOR_INLINE_FUNCTIONS) 3528a480c28bSEric Fiselier void __add_shared() _NOEXCEPT; 3529a480c28bSEric Fiselier bool __release_shared() _NOEXCEPT; 3530f08de52dSKevin Hu#else 3531f08de52dSKevin Hu _LIBCPP_INLINE_VISIBILITY 3532f08de52dSKevin Hu void __add_shared() _NOEXCEPT { 3533f08de52dSKevin Hu __libcpp_atomic_refcount_increment(__shared_owners_); 3534f08de52dSKevin Hu } 3535f08de52dSKevin Hu _LIBCPP_INLINE_VISIBILITY 3536f08de52dSKevin Hu bool __release_shared() _NOEXCEPT { 3537f08de52dSKevin Hu if (__libcpp_atomic_refcount_decrement(__shared_owners_) == -1) { 3538f08de52dSKevin Hu __on_zero_shared(); 3539f08de52dSKevin Hu return true; 3540f08de52dSKevin Hu } 3541f08de52dSKevin Hu return false; 3542f08de52dSKevin Hu } 3543f08de52dSKevin Hu#endif 3544848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 35451faf289eSEric Fiselier long use_count() const _NOEXCEPT { 35461faf289eSEric Fiselier return __libcpp_relaxed_load(&__shared_owners_) + 1; 35471faf289eSEric Fiselier } 35483e519524SHoward Hinnant}; 35493e519524SHoward Hinnant 3550f0544c20SHoward Hinnantclass _LIBCPP_TYPE_VIS __shared_weak_count 35513e519524SHoward Hinnant : private __shared_count 35523e519524SHoward Hinnant{ 35533e519524SHoward Hinnant long __shared_weak_owners_; 35543e519524SHoward Hinnant 35553e519524SHoward Hinnantpublic: 3556848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 35573739fe79SHoward Hinnant explicit __shared_weak_count(long __refs = 0) _NOEXCEPT 35583e519524SHoward Hinnant : __shared_count(__refs), 35593e519524SHoward Hinnant __shared_weak_owners_(__refs) {} 35603e519524SHoward Hinnantprotected: 35613e519524SHoward Hinnant virtual ~__shared_weak_count(); 35623e519524SHoward Hinnant 35633e519524SHoward Hinnantpublic: 356411f60453SEric Fiselier#if defined(_LIBCPP_BUILDING_MEMORY) && \ 356511f60453SEric Fiselier defined(_LIBCPP_DEPRECATED_ABI_LEGACY_LIBRARY_DEFINITIONS_FOR_INLINE_FUNCTIONS) 3566a480c28bSEric Fiselier void __add_shared() _NOEXCEPT; 3567a480c28bSEric Fiselier void __add_weak() _NOEXCEPT; 3568a480c28bSEric Fiselier void __release_shared() _NOEXCEPT; 3569f08de52dSKevin Hu#else 3570f08de52dSKevin Hu _LIBCPP_INLINE_VISIBILITY 3571f08de52dSKevin Hu void __add_shared() _NOEXCEPT { 3572f08de52dSKevin Hu __shared_count::__add_shared(); 3573f08de52dSKevin Hu } 3574f08de52dSKevin Hu _LIBCPP_INLINE_VISIBILITY 3575f08de52dSKevin Hu void __add_weak() _NOEXCEPT { 3576f08de52dSKevin Hu __libcpp_atomic_refcount_increment(__shared_weak_owners_); 3577f08de52dSKevin Hu } 3578f08de52dSKevin Hu _LIBCPP_INLINE_VISIBILITY 3579f08de52dSKevin Hu void __release_shared() _NOEXCEPT { 3580f08de52dSKevin Hu if (__shared_count::__release_shared()) 3581f08de52dSKevin Hu __release_weak(); 3582f08de52dSKevin Hu } 3583f08de52dSKevin Hu#endif 35843739fe79SHoward Hinnant void __release_weak() _NOEXCEPT; 3585848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 35863739fe79SHoward Hinnant long use_count() const _NOEXCEPT {return __shared_count::use_count();} 35873739fe79SHoward Hinnant __shared_weak_count* lock() _NOEXCEPT; 35883e519524SHoward Hinnant 3589a9f69800SHoward Hinnant // Define the function out only if we build static libc++ without RTTI. 3590a9f69800SHoward Hinnant // Otherwise we may break clients who need to compile their projects with 3591a9f69800SHoward Hinnant // -fno-rtti and yet link against a libc++.dylib compiled 3592a9f69800SHoward Hinnant // without -fno-rtti. 3593a9f69800SHoward Hinnant#if !defined(_LIBCPP_NO_RTTI) || !defined(_LIBCPP_BUILD_STATIC) 35943739fe79SHoward Hinnant virtual const void* __get_deleter(const type_info&) const _NOEXCEPT; 3595a9f69800SHoward Hinnant#endif 35963e519524SHoward Hinnantprivate: 35973739fe79SHoward Hinnant virtual void __on_zero_shared_weak() _NOEXCEPT = 0; 35983e519524SHoward Hinnant}; 35993e519524SHoward Hinnant 36003e519524SHoward Hinnanttemplate <class _Tp, class _Dp, class _Alloc> 36013e519524SHoward Hinnantclass __shared_ptr_pointer 36023e519524SHoward Hinnant : public __shared_weak_count 36033e519524SHoward Hinnant{ 36043e519524SHoward Hinnant __compressed_pair<__compressed_pair<_Tp, _Dp>, _Alloc> __data_; 36053e519524SHoward Hinnantpublic: 3606848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 36073e519524SHoward Hinnant __shared_ptr_pointer(_Tp __p, _Dp __d, _Alloc __a) 3608ce48a113SHoward Hinnant : __data_(__compressed_pair<_Tp, _Dp>(__p, _VSTD::move(__d)), _VSTD::move(__a)) {} 36093e519524SHoward Hinnant 361054b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI 36113739fe79SHoward Hinnant virtual const void* __get_deleter(const type_info&) const _NOEXCEPT; 361254b409fdSHoward Hinnant#endif 36133e519524SHoward Hinnant 36143e519524SHoward Hinnantprivate: 36153739fe79SHoward Hinnant virtual void __on_zero_shared() _NOEXCEPT; 36163739fe79SHoward Hinnant virtual void __on_zero_shared_weak() _NOEXCEPT; 36173e519524SHoward Hinnant}; 36183e519524SHoward Hinnant 361954b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI 362054b409fdSHoward Hinnant 36213e519524SHoward Hinnanttemplate <class _Tp, class _Dp, class _Alloc> 36223e519524SHoward Hinnantconst void* 36233739fe79SHoward Hinnant__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__get_deleter(const type_info& __t) const _NOEXCEPT 36243e519524SHoward Hinnant{ 36259c973b9fSEric Fiselier return __t == typeid(_Dp) ? _VSTD::addressof(__data_.first().second()) : nullptr; 36263e519524SHoward Hinnant} 36273e519524SHoward Hinnant 3628b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_RTTI 362954b409fdSHoward Hinnant 36303e519524SHoward Hinnanttemplate <class _Tp, class _Dp, class _Alloc> 36313e519524SHoward Hinnantvoid 36323739fe79SHoward Hinnant__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__on_zero_shared() _NOEXCEPT 36333e519524SHoward Hinnant{ 36343e519524SHoward Hinnant __data_.first().second()(__data_.first().first()); 36353e519524SHoward Hinnant __data_.first().second().~_Dp(); 36363e519524SHoward Hinnant} 36373e519524SHoward Hinnant 36383e519524SHoward Hinnanttemplate <class _Tp, class _Dp, class _Alloc> 36393e519524SHoward Hinnantvoid 36403739fe79SHoward Hinnant__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__on_zero_shared_weak() _NOEXCEPT 36413e519524SHoward Hinnant{ 36426fe361c1SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, __shared_ptr_pointer>::type _Al; 36436fe361c1SEric Fiselier typedef allocator_traits<_Al> _ATraits; 3644319be722SEric Fiselier typedef pointer_traits<typename _ATraits::pointer> _PTraits; 3645319be722SEric Fiselier 36466fe361c1SEric Fiselier _Al __a(__data_.second()); 36473e519524SHoward Hinnant __data_.second().~_Alloc(); 3648319be722SEric Fiselier __a.deallocate(_PTraits::pointer_to(*this), 1); 36493e519524SHoward Hinnant} 36503e519524SHoward Hinnant 36513e519524SHoward Hinnanttemplate <class _Tp, class _Alloc> 36523e519524SHoward Hinnantclass __shared_ptr_emplace 36533e519524SHoward Hinnant : public __shared_weak_count 36543e519524SHoward Hinnant{ 36553e519524SHoward Hinnant __compressed_pair<_Alloc, _Tp> __data_; 36563e519524SHoward Hinnantpublic: 36573e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 36583e519524SHoward Hinnant 3659848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 36603e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a) 3661ce48a113SHoward Hinnant : __data_(_VSTD::move(__a)) {} 36623e519524SHoward Hinnant 36633e519524SHoward Hinnant template <class ..._Args> 3664848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 36653e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a, _Args&& ...__args) 3666a87b5e34SHoward Hinnant : __data_(piecewise_construct, _VSTD::forward_as_tuple(__a), 3667a87b5e34SHoward Hinnant _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)) {} 36683e519524SHoward Hinnant 36693e519524SHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 36703e519524SHoward Hinnant 3671848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 36723e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a) 36733e519524SHoward Hinnant : __data_(__a) {} 36743e519524SHoward Hinnant 36753e519524SHoward Hinnant template <class _A0> 3676848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 36773e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a, _A0& __a0) 36783e519524SHoward Hinnant : __data_(__a, _Tp(__a0)) {} 36793e519524SHoward Hinnant 36803e519524SHoward Hinnant template <class _A0, class _A1> 3681848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 36823e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a, _A0& __a0, _A1& __a1) 36833e519524SHoward Hinnant : __data_(__a, _Tp(__a0, __a1)) {} 36843e519524SHoward Hinnant 36853e519524SHoward Hinnant template <class _A0, class _A1, class _A2> 3686848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 36873e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a, _A0& __a0, _A1& __a1, _A2& __a2) 36883e519524SHoward Hinnant : __data_(__a, _Tp(__a0, __a1, __a2)) {} 36893e519524SHoward Hinnant 36903e519524SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 36913e519524SHoward Hinnant 36923e519524SHoward Hinnantprivate: 36933739fe79SHoward Hinnant virtual void __on_zero_shared() _NOEXCEPT; 36943739fe79SHoward Hinnant virtual void __on_zero_shared_weak() _NOEXCEPT; 36953e519524SHoward Hinnantpublic: 3696848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 36973739fe79SHoward Hinnant _Tp* get() _NOEXCEPT {return &__data_.second();} 36983e519524SHoward Hinnant}; 36993e519524SHoward Hinnant 37003e519524SHoward Hinnanttemplate <class _Tp, class _Alloc> 37013e519524SHoward Hinnantvoid 37023739fe79SHoward Hinnant__shared_ptr_emplace<_Tp, _Alloc>::__on_zero_shared() _NOEXCEPT 37033e519524SHoward Hinnant{ 37043e519524SHoward Hinnant __data_.second().~_Tp(); 37053e519524SHoward Hinnant} 37063e519524SHoward Hinnant 37073e519524SHoward Hinnanttemplate <class _Tp, class _Alloc> 37083e519524SHoward Hinnantvoid 37093739fe79SHoward Hinnant__shared_ptr_emplace<_Tp, _Alloc>::__on_zero_shared_weak() _NOEXCEPT 37103e519524SHoward Hinnant{ 37116fe361c1SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, __shared_ptr_emplace>::type _Al; 37126fe361c1SEric Fiselier typedef allocator_traits<_Al> _ATraits; 3713319be722SEric Fiselier typedef pointer_traits<typename _ATraits::pointer> _PTraits; 37146fe361c1SEric Fiselier _Al __a(__data_.first()); 37153e519524SHoward Hinnant __data_.first().~_Alloc(); 3716319be722SEric Fiselier __a.deallocate(_PTraits::pointer_to(*this), 1); 37173e519524SHoward Hinnant} 37183e519524SHoward Hinnant 371972d0d603SErik Pilkingtonstruct __shared_ptr_dummy_rebind_allocator_type; 372072d0d603SErik Pilkingtontemplate <> 372172d0d603SErik Pilkingtonclass _LIBCPP_TEMPLATE_VIS allocator<__shared_ptr_dummy_rebind_allocator_type> 372272d0d603SErik Pilkington{ 372372d0d603SErik Pilkingtonpublic: 372472d0d603SErik Pilkington template <class _Other> 372572d0d603SErik Pilkington struct rebind 372672d0d603SErik Pilkington { 372772d0d603SErik Pilkington typedef allocator<_Other> other; 372872d0d603SErik Pilkington }; 372972d0d603SErik Pilkington}; 373072d0d603SErik Pilkington 3731e2f2d1edSEric Fiseliertemplate<class _Tp> class _LIBCPP_TEMPLATE_VIS enable_shared_from_this; 37323e519524SHoward Hinnant 37333e519524SHoward Hinnanttemplate<class _Tp> 3734e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS shared_ptr 37353e519524SHoward Hinnant{ 37363e519524SHoward Hinnantpublic: 37373e519524SHoward Hinnant typedef _Tp element_type; 3738dc83e779SMarshall Clow 373968436a9bSEric Fiselier#if _LIBCPP_STD_VER > 14 374068436a9bSEric Fiselier typedef weak_ptr<_Tp> weak_type; 374168436a9bSEric Fiselier#endif 37423e519524SHoward Hinnantprivate: 37433e519524SHoward Hinnant element_type* __ptr_; 37443e519524SHoward Hinnant __shared_weak_count* __cntrl_; 37453e519524SHoward Hinnant 37463e519524SHoward Hinnant struct __nat {int __for_bool_;}; 37473e519524SHoward Hinnantpublic: 3748906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 3749c0937e8aSHoward Hinnant _LIBCPP_CONSTEXPR shared_ptr() _NOEXCEPT; 3750906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 3751c0937e8aSHoward Hinnant _LIBCPP_CONSTEXPR shared_ptr(nullptr_t) _NOEXCEPT; 375222747e62SLogan Chien template<class _Yp> 375322747e62SLogan Chien explicit shared_ptr(_Yp* __p, 375422747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat()); 375522747e62SLogan Chien template<class _Yp, class _Dp> 375622747e62SLogan Chien shared_ptr(_Yp* __p, _Dp __d, 375722747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat()); 375822747e62SLogan Chien template<class _Yp, class _Dp, class _Alloc> 375922747e62SLogan Chien shared_ptr(_Yp* __p, _Dp __d, _Alloc __a, 376022747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat()); 37613e519524SHoward Hinnant template <class _Dp> shared_ptr(nullptr_t __p, _Dp __d); 37623e519524SHoward Hinnant template <class _Dp, class _Alloc> shared_ptr(nullptr_t __p, _Dp __d, _Alloc __a); 3763906c872dSEvgeniy Stepanov template<class _Yp> _LIBCPP_INLINE_VISIBILITY shared_ptr(const shared_ptr<_Yp>& __r, element_type* __p) _NOEXCEPT; 3764906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 37653739fe79SHoward Hinnant shared_ptr(const shared_ptr& __r) _NOEXCEPT; 37663e519524SHoward Hinnant template<class _Yp> 3767906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 37683e519524SHoward Hinnant shared_ptr(const shared_ptr<_Yp>& __r, 3769dc83e779SMarshall Clow typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat()) 37703739fe79SHoward Hinnant _NOEXCEPT; 37717609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 3772906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 37733739fe79SHoward Hinnant shared_ptr(shared_ptr&& __r) _NOEXCEPT; 3774906c872dSEvgeniy Stepanov template<class _Yp> _LIBCPP_INLINE_VISIBILITY shared_ptr(shared_ptr<_Yp>&& __r, 3775dc83e779SMarshall Clow typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat()) 37763739fe79SHoward Hinnant _NOEXCEPT; 37777609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 37783e519524SHoward Hinnant template<class _Yp> explicit shared_ptr(const weak_ptr<_Yp>& __r, 3779dc83e779SMarshall Clow typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type= __nat()); 3780e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR) 37817609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 378222747e62SLogan Chien template<class _Yp> 378322747e62SLogan Chien shared_ptr(auto_ptr<_Yp>&& __r, 378422747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat()); 3785b3371f6fSHoward Hinnant#else 378622747e62SLogan Chien template<class _Yp> 378722747e62SLogan Chien shared_ptr(auto_ptr<_Yp> __r, 378822747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat()); 37893e519524SHoward Hinnant#endif 3790e67179bcSMarshall Clow#endif 37917609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 379222747e62SLogan Chien template <class _Yp, class _Dp> 37938e25104bSHoward Hinnant shared_ptr(unique_ptr<_Yp, _Dp>&&, 379422747e62SLogan Chien typename enable_if 37958e25104bSHoward Hinnant < 379622747e62SLogan Chien !is_lvalue_reference<_Dp>::value && 37978e25104bSHoward Hinnant !is_array<_Yp>::value && 379822747e62SLogan Chien is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 379922747e62SLogan Chien __nat 380022747e62SLogan Chien >::type = __nat()); 380122747e62SLogan Chien template <class _Yp, class _Dp> 38028e25104bSHoward Hinnant shared_ptr(unique_ptr<_Yp, _Dp>&&, 380322747e62SLogan Chien typename enable_if 380422747e62SLogan Chien < 380522747e62SLogan Chien is_lvalue_reference<_Dp>::value && 380622747e62SLogan Chien !is_array<_Yp>::value && 380722747e62SLogan Chien is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 380822747e62SLogan Chien __nat 380922747e62SLogan Chien >::type = __nat()); 38107609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 381122747e62SLogan Chien template <class _Yp, class _Dp> 38128e25104bSHoward Hinnant shared_ptr(unique_ptr<_Yp, _Dp>, 381322747e62SLogan Chien typename enable_if 381422747e62SLogan Chien < 381522747e62SLogan Chien !is_lvalue_reference<_Dp>::value && 381622747e62SLogan Chien !is_array<_Yp>::value && 381722747e62SLogan Chien is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 381822747e62SLogan Chien __nat 381922747e62SLogan Chien >::type = __nat()); 382022747e62SLogan Chien template <class _Yp, class _Dp> 382122747e62SLogan Chien shared_ptr(unique_ptr<_Yp, _Dp>, 382222747e62SLogan Chien typename enable_if 382322747e62SLogan Chien < 382422747e62SLogan Chien is_lvalue_reference<_Dp>::value && 382522747e62SLogan Chien !is_array<_Yp>::value && 382622747e62SLogan Chien is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 382722747e62SLogan Chien __nat 382822747e62SLogan Chien >::type = __nat()); 38297609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 38303e519524SHoward Hinnant 38313e519524SHoward Hinnant ~shared_ptr(); 38323e519524SHoward Hinnant 3833906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 38343739fe79SHoward Hinnant shared_ptr& operator=(const shared_ptr& __r) _NOEXCEPT; 38358e25104bSHoward Hinnant template<class _Yp> 38368e25104bSHoward Hinnant typename enable_if 38378e25104bSHoward Hinnant < 38388e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 38398e25104bSHoward Hinnant shared_ptr& 38408e25104bSHoward Hinnant >::type 3841906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 38428e25104bSHoward Hinnant operator=(const shared_ptr<_Yp>& __r) _NOEXCEPT; 38437609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 3844906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 38453739fe79SHoward Hinnant shared_ptr& operator=(shared_ptr&& __r) _NOEXCEPT; 38468e25104bSHoward Hinnant template<class _Yp> 38478e25104bSHoward Hinnant typename enable_if 38488e25104bSHoward Hinnant < 38498e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 38508e25104bSHoward Hinnant shared_ptr<_Tp>& 38518e25104bSHoward Hinnant >::type 3852906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 38538e25104bSHoward Hinnant operator=(shared_ptr<_Yp>&& __r); 3854e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR) 38558e25104bSHoward Hinnant template<class _Yp> 385689dd1dd2SEric Fiselier _LIBCPP_INLINE_VISIBILITY 38578e25104bSHoward Hinnant typename enable_if 38588e25104bSHoward Hinnant < 38598e25104bSHoward Hinnant !is_array<_Yp>::value && 38608e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 386184f996fbSHoward Hinnant shared_ptr 386284f996fbSHoward Hinnant >::type& 38638e25104bSHoward Hinnant operator=(auto_ptr<_Yp>&& __r); 3864e67179bcSMarshall Clow#endif 38657609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 3866e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR) 38678e25104bSHoward Hinnant template<class _Yp> 386889dd1dd2SEric Fiselier _LIBCPP_INLINE_VISIBILITY 38698e25104bSHoward Hinnant typename enable_if 38708e25104bSHoward Hinnant < 38718e25104bSHoward Hinnant !is_array<_Yp>::value && 38728e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 38738e25104bSHoward Hinnant shared_ptr& 38748e25104bSHoward Hinnant >::type 38758e25104bSHoward Hinnant operator=(auto_ptr<_Yp> __r); 38763e519524SHoward Hinnant#endif 3877e67179bcSMarshall Clow#endif 38788e25104bSHoward Hinnant template <class _Yp, class _Dp> 38798e25104bSHoward Hinnant typename enable_if 38808e25104bSHoward Hinnant < 38818e25104bSHoward Hinnant !is_array<_Yp>::value && 38828e25104bSHoward Hinnant is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 38838e25104bSHoward Hinnant shared_ptr& 38848e25104bSHoward Hinnant >::type 38857609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 3886906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 38878e25104bSHoward Hinnant operator=(unique_ptr<_Yp, _Dp>&& __r); 38887609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 388902b8e949SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 38908e25104bSHoward Hinnant operator=(unique_ptr<_Yp, _Dp> __r); 38913e519524SHoward Hinnant#endif 38923e519524SHoward Hinnant 3893906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 38943739fe79SHoward Hinnant void swap(shared_ptr& __r) _NOEXCEPT; 3895906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 38963739fe79SHoward Hinnant void reset() _NOEXCEPT; 38978e25104bSHoward Hinnant template<class _Yp> 38988e25104bSHoward Hinnant typename enable_if 38998e25104bSHoward Hinnant < 39008e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 39018e25104bSHoward Hinnant void 39028e25104bSHoward Hinnant >::type 3903906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 39048e25104bSHoward Hinnant reset(_Yp* __p); 39058e25104bSHoward Hinnant template<class _Yp, class _Dp> 39068e25104bSHoward Hinnant typename enable_if 39078e25104bSHoward Hinnant < 39088e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 39098e25104bSHoward Hinnant void 39108e25104bSHoward Hinnant >::type 3911906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 39128e25104bSHoward Hinnant reset(_Yp* __p, _Dp __d); 39138e25104bSHoward Hinnant template<class _Yp, class _Dp, class _Alloc> 39148e25104bSHoward Hinnant typename enable_if 39158e25104bSHoward Hinnant < 39168e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 39178e25104bSHoward Hinnant void 39188e25104bSHoward Hinnant >::type 3919906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 39208e25104bSHoward Hinnant reset(_Yp* __p, _Dp __d, _Alloc __a); 39213e519524SHoward Hinnant 3922848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 39233739fe79SHoward Hinnant element_type* get() const _NOEXCEPT {return __ptr_;} 3924848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 39253739fe79SHoward Hinnant typename add_lvalue_reference<element_type>::type operator*() const _NOEXCEPT 39263739fe79SHoward Hinnant {return *__ptr_;} 3927848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 39283739fe79SHoward Hinnant element_type* operator->() const _NOEXCEPT {return __ptr_;} 3929848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 39303739fe79SHoward Hinnant long use_count() const _NOEXCEPT {return __cntrl_ ? __cntrl_->use_count() : 0;} 3931848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 39323739fe79SHoward Hinnant bool unique() const _NOEXCEPT {return use_count() == 1;} 3933848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 3934f2f2d8b9SHoward Hinnant _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT {return get() != 0;} 3935c003db1fSHoward Hinnant template <class _Up> 3936848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 393736bc7178SMarshall Clow bool owner_before(shared_ptr<_Up> const& __p) const _NOEXCEPT 39383e519524SHoward Hinnant {return __cntrl_ < __p.__cntrl_;} 3939c003db1fSHoward Hinnant template <class _Up> 3940848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 394136bc7178SMarshall Clow bool owner_before(weak_ptr<_Up> const& __p) const _NOEXCEPT 39423e519524SHoward Hinnant {return __cntrl_ < __p.__cntrl_;} 3943d77851e8SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 3944d77851e8SHoward Hinnant bool 3945d77851e8SHoward Hinnant __owner_equivalent(const shared_ptr& __p) const 3946d77851e8SHoward Hinnant {return __cntrl_ == __p.__cntrl_;} 39473e519524SHoward Hinnant 394854b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI 39493e519524SHoward Hinnant template <class _Dp> 3950848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 39513739fe79SHoward Hinnant _Dp* __get_deleter() const _NOEXCEPT 39524a911c86SMarshall Clow {return static_cast<_Dp*>(__cntrl_ 39534a911c86SMarshall Clow ? const_cast<void *>(__cntrl_->__get_deleter(typeid(_Dp))) 39544a911c86SMarshall Clow : nullptr);} 3955b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_RTTI 39563e519524SHoward Hinnant 39573e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 39583e519524SHoward Hinnant 39593e519524SHoward Hinnant template<class ..._Args> 39603e519524SHoward Hinnant static 39613e519524SHoward Hinnant shared_ptr<_Tp> 39623e519524SHoward Hinnant make_shared(_Args&& ...__args); 39633e519524SHoward Hinnant 39643e519524SHoward Hinnant template<class _Alloc, class ..._Args> 39653e519524SHoward Hinnant static 39663e519524SHoward Hinnant shared_ptr<_Tp> 39673e519524SHoward Hinnant allocate_shared(const _Alloc& __a, _Args&& ...__args); 39683e519524SHoward Hinnant 39693e519524SHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 39703e519524SHoward Hinnant 39713e519524SHoward Hinnant static shared_ptr<_Tp> make_shared(); 39723e519524SHoward Hinnant 39733e519524SHoward Hinnant template<class _A0> 39743e519524SHoward Hinnant static shared_ptr<_Tp> make_shared(_A0&); 39753e519524SHoward Hinnant 39763e519524SHoward Hinnant template<class _A0, class _A1> 39773e519524SHoward Hinnant static shared_ptr<_Tp> make_shared(_A0&, _A1&); 39783e519524SHoward Hinnant 39793e519524SHoward Hinnant template<class _A0, class _A1, class _A2> 39803e519524SHoward Hinnant static shared_ptr<_Tp> make_shared(_A0&, _A1&, _A2&); 39813e519524SHoward Hinnant 39823e519524SHoward Hinnant template<class _Alloc> 39833e519524SHoward Hinnant static shared_ptr<_Tp> 39843e519524SHoward Hinnant allocate_shared(const _Alloc& __a); 39853e519524SHoward Hinnant 39863e519524SHoward Hinnant template<class _Alloc, class _A0> 39873e519524SHoward Hinnant static shared_ptr<_Tp> 39883e519524SHoward Hinnant allocate_shared(const _Alloc& __a, _A0& __a0); 39893e519524SHoward Hinnant 39903e519524SHoward Hinnant template<class _Alloc, class _A0, class _A1> 39913e519524SHoward Hinnant static shared_ptr<_Tp> 39923e519524SHoward Hinnant allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1); 39933e519524SHoward Hinnant 39943e519524SHoward Hinnant template<class _Alloc, class _A0, class _A1, class _A2> 39953e519524SHoward Hinnant static shared_ptr<_Tp> 39963e519524SHoward Hinnant allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1, _A2& __a2); 39973e519524SHoward Hinnant 39983e519524SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 39993e519524SHoward Hinnant 40003e519524SHoward Hinnantprivate: 400172d0d603SErik Pilkington template <class _Yp, bool = is_function<_Yp>::value> 400272d0d603SErik Pilkington struct __shared_ptr_default_allocator 400372d0d603SErik Pilkington { 400472d0d603SErik Pilkington typedef allocator<_Yp> type; 400572d0d603SErik Pilkington }; 400672d0d603SErik Pilkington 400772d0d603SErik Pilkington template <class _Yp> 400872d0d603SErik Pilkington struct __shared_ptr_default_allocator<_Yp, true> 400972d0d603SErik Pilkington { 401072d0d603SErik Pilkington typedef allocator<__shared_ptr_dummy_rebind_allocator_type> type; 401172d0d603SErik Pilkington }; 40123e519524SHoward Hinnant 401339005d30SEric Fiselier template <class _Yp, class _OrigPtr> 4014848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4015f09df772SEric Fiselier typename enable_if<is_convertible<_OrigPtr*, 4016f09df772SEric Fiselier const enable_shared_from_this<_Yp>* 4017f09df772SEric Fiselier >::value, 4018f09df772SEric Fiselier void>::type 401939005d30SEric Fiselier __enable_weak_this(const enable_shared_from_this<_Yp>* __e, 402039005d30SEric Fiselier _OrigPtr* __ptr) _NOEXCEPT 40213e519524SHoward Hinnant { 402239005d30SEric Fiselier typedef typename remove_cv<_Yp>::type _RawYp; 402388f5bfdcSEric Fiselier if (__e && __e->__weak_this_.expired()) 402455112defSMarshall Clow { 402539005d30SEric Fiselier __e->__weak_this_ = shared_ptr<_RawYp>(*this, 402639005d30SEric Fiselier const_cast<_RawYp*>(static_cast<const _Yp*>(__ptr))); 402755112defSMarshall Clow } 40283e519524SHoward Hinnant } 40293e519524SHoward Hinnant 403072d0d603SErik Pilkington _LIBCPP_INLINE_VISIBILITY void __enable_weak_this(...) _NOEXCEPT {} 40313e519524SHoward Hinnant 4032e2f2d1edSEric Fiselier template <class _Up> friend class _LIBCPP_TEMPLATE_VIS shared_ptr; 4033e2f2d1edSEric Fiselier template <class _Up> friend class _LIBCPP_TEMPLATE_VIS weak_ptr; 40343e519524SHoward Hinnant}; 40353e519524SHoward Hinnant 4036f09df772SEric Fiselier 40373e519524SHoward Hinnanttemplate<class _Tp> 4038906c872dSEvgeniy Stepanovinline 4039c0937e8aSHoward Hinnant_LIBCPP_CONSTEXPR 40403739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr() _NOEXCEPT 40413e519524SHoward Hinnant : __ptr_(0), 40423e519524SHoward Hinnant __cntrl_(0) 40433e519524SHoward Hinnant{ 40443e519524SHoward Hinnant} 40453e519524SHoward Hinnant 40463e519524SHoward Hinnanttemplate<class _Tp> 4047906c872dSEvgeniy Stepanovinline 4048c0937e8aSHoward Hinnant_LIBCPP_CONSTEXPR 40493739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr(nullptr_t) _NOEXCEPT 40503e519524SHoward Hinnant : __ptr_(0), 40513e519524SHoward Hinnant __cntrl_(0) 40523e519524SHoward Hinnant{ 40533e519524SHoward Hinnant} 40543e519524SHoward Hinnant 40553e519524SHoward Hinnanttemplate<class _Tp> 405622747e62SLogan Chientemplate<class _Yp> 405722747e62SLogan Chienshared_ptr<_Tp>::shared_ptr(_Yp* __p, 405822747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type) 40593e519524SHoward Hinnant : __ptr_(__p) 40603e519524SHoward Hinnant{ 40613e519524SHoward Hinnant unique_ptr<_Yp> __hold(__p); 406272d0d603SErik Pilkington typedef typename __shared_ptr_default_allocator<_Yp>::type _AllocT; 406372d0d603SErik Pilkington typedef __shared_ptr_pointer<_Yp*, default_delete<_Yp>, _AllocT > _CntrlBlk; 406472d0d603SErik Pilkington __cntrl_ = new _CntrlBlk(__p, default_delete<_Yp>(), _AllocT()); 40653e519524SHoward Hinnant __hold.release(); 406639005d30SEric Fiselier __enable_weak_this(__p, __p); 40673e519524SHoward Hinnant} 40683e519524SHoward Hinnant 40693e519524SHoward Hinnanttemplate<class _Tp> 407022747e62SLogan Chientemplate<class _Yp, class _Dp> 407122747e62SLogan Chienshared_ptr<_Tp>::shared_ptr(_Yp* __p, _Dp __d, 407222747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type) 40733e519524SHoward Hinnant : __ptr_(__p) 40743e519524SHoward Hinnant{ 40753e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 40763e519524SHoward Hinnant try 40773e519524SHoward Hinnant { 4078b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 407972d0d603SErik Pilkington typedef typename __shared_ptr_default_allocator<_Yp>::type _AllocT; 408072d0d603SErik Pilkington typedef __shared_ptr_pointer<_Yp*, _Dp, _AllocT > _CntrlBlk; 408172d0d603SErik Pilkington __cntrl_ = new _CntrlBlk(__p, __d, _AllocT()); 408239005d30SEric Fiselier __enable_weak_this(__p, __p); 40833e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 40843e519524SHoward Hinnant } 40853e519524SHoward Hinnant catch (...) 40863e519524SHoward Hinnant { 40873e519524SHoward Hinnant __d(__p); 40883e519524SHoward Hinnant throw; 40893e519524SHoward Hinnant } 4090b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 40913e519524SHoward Hinnant} 40923e519524SHoward Hinnant 40933e519524SHoward Hinnanttemplate<class _Tp> 40943e519524SHoward Hinnanttemplate<class _Dp> 40953e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(nullptr_t __p, _Dp __d) 40963e519524SHoward Hinnant : __ptr_(0) 40973e519524SHoward Hinnant{ 40983e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 40993e519524SHoward Hinnant try 41003e519524SHoward Hinnant { 4101b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 410272d0d603SErik Pilkington typedef typename __shared_ptr_default_allocator<_Tp>::type _AllocT; 410372d0d603SErik Pilkington typedef __shared_ptr_pointer<nullptr_t, _Dp, _AllocT > _CntrlBlk; 410472d0d603SErik Pilkington __cntrl_ = new _CntrlBlk(__p, __d, _AllocT()); 41053e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 41063e519524SHoward Hinnant } 41073e519524SHoward Hinnant catch (...) 41083e519524SHoward Hinnant { 41093e519524SHoward Hinnant __d(__p); 41103e519524SHoward Hinnant throw; 41113e519524SHoward Hinnant } 4112b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 41133e519524SHoward Hinnant} 41143e519524SHoward Hinnant 41153e519524SHoward Hinnanttemplate<class _Tp> 411622747e62SLogan Chientemplate<class _Yp, class _Dp, class _Alloc> 411722747e62SLogan Chienshared_ptr<_Tp>::shared_ptr(_Yp* __p, _Dp __d, _Alloc __a, 411822747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type) 41193e519524SHoward Hinnant : __ptr_(__p) 41203e519524SHoward Hinnant{ 41213e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 41223e519524SHoward Hinnant try 41233e519524SHoward Hinnant { 4124b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 41253e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, _Dp, _Alloc> _CntrlBlk; 4126319be722SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _A2; 41273e519524SHoward Hinnant typedef __allocator_destructor<_A2> _D2; 41283e519524SHoward Hinnant _A2 __a2(__a); 41293e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); 4130319be722SEric Fiselier ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4131319be722SEric Fiselier _CntrlBlk(__p, __d, __a); 4132319be722SEric Fiselier __cntrl_ = _VSTD::addressof(*__hold2.release()); 413339005d30SEric Fiselier __enable_weak_this(__p, __p); 41343e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 41353e519524SHoward Hinnant } 41363e519524SHoward Hinnant catch (...) 41373e519524SHoward Hinnant { 41383e519524SHoward Hinnant __d(__p); 41393e519524SHoward Hinnant throw; 41403e519524SHoward Hinnant } 4141b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 41423e519524SHoward Hinnant} 41433e519524SHoward Hinnant 41443e519524SHoward Hinnanttemplate<class _Tp> 41453e519524SHoward Hinnanttemplate<class _Dp, class _Alloc> 41463e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(nullptr_t __p, _Dp __d, _Alloc __a) 41473e519524SHoward Hinnant : __ptr_(0) 41483e519524SHoward Hinnant{ 41493e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 41503e519524SHoward Hinnant try 41513e519524SHoward Hinnant { 4152b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 41533e519524SHoward Hinnant typedef __shared_ptr_pointer<nullptr_t, _Dp, _Alloc> _CntrlBlk; 4154319be722SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _A2; 41553e519524SHoward Hinnant typedef __allocator_destructor<_A2> _D2; 41563e519524SHoward Hinnant _A2 __a2(__a); 41573e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); 4158319be722SEric Fiselier ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4159319be722SEric Fiselier _CntrlBlk(__p, __d, __a); 4160319be722SEric Fiselier __cntrl_ = _VSTD::addressof(*__hold2.release()); 41613e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 41623e519524SHoward Hinnant } 41633e519524SHoward Hinnant catch (...) 41643e519524SHoward Hinnant { 41653e519524SHoward Hinnant __d(__p); 41663e519524SHoward Hinnant throw; 41673e519524SHoward Hinnant } 4168b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 41693e519524SHoward Hinnant} 41703e519524SHoward Hinnant 41713e519524SHoward Hinnanttemplate<class _Tp> 41723e519524SHoward Hinnanttemplate<class _Yp> 4173906c872dSEvgeniy Stepanovinline 41743739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr(const shared_ptr<_Yp>& __r, element_type *__p) _NOEXCEPT 41753e519524SHoward Hinnant : __ptr_(__p), 41763e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 41773e519524SHoward Hinnant{ 41783e519524SHoward Hinnant if (__cntrl_) 41793e519524SHoward Hinnant __cntrl_->__add_shared(); 41803e519524SHoward Hinnant} 41813e519524SHoward Hinnant 41823e519524SHoward Hinnanttemplate<class _Tp> 4183906c872dSEvgeniy Stepanovinline 41843739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr(const shared_ptr& __r) _NOEXCEPT 41853e519524SHoward Hinnant : __ptr_(__r.__ptr_), 41863e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 41873e519524SHoward Hinnant{ 41883e519524SHoward Hinnant if (__cntrl_) 41893e519524SHoward Hinnant __cntrl_->__add_shared(); 41903e519524SHoward Hinnant} 41913e519524SHoward Hinnant 41923e519524SHoward Hinnanttemplate<class _Tp> 41933e519524SHoward Hinnanttemplate<class _Yp> 4194906c872dSEvgeniy Stepanovinline 41953e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(const shared_ptr<_Yp>& __r, 4196dc83e779SMarshall Clow typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type) 41973739fe79SHoward Hinnant _NOEXCEPT 41983e519524SHoward Hinnant : __ptr_(__r.__ptr_), 41993e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 42003e519524SHoward Hinnant{ 42013e519524SHoward Hinnant if (__cntrl_) 42023e519524SHoward Hinnant __cntrl_->__add_shared(); 42033e519524SHoward Hinnant} 42043e519524SHoward Hinnant 42057609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 42063e519524SHoward Hinnant 42073e519524SHoward Hinnanttemplate<class _Tp> 4208906c872dSEvgeniy Stepanovinline 42093739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr(shared_ptr&& __r) _NOEXCEPT 42103e519524SHoward Hinnant : __ptr_(__r.__ptr_), 42113e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 42123e519524SHoward Hinnant{ 42133e519524SHoward Hinnant __r.__ptr_ = 0; 42143e519524SHoward Hinnant __r.__cntrl_ = 0; 42153e519524SHoward Hinnant} 42163e519524SHoward Hinnant 42173e519524SHoward Hinnanttemplate<class _Tp> 42183e519524SHoward Hinnanttemplate<class _Yp> 4219906c872dSEvgeniy Stepanovinline 42203e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(shared_ptr<_Yp>&& __r, 4221dc83e779SMarshall Clow typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type) 42223739fe79SHoward Hinnant _NOEXCEPT 42233e519524SHoward Hinnant : __ptr_(__r.__ptr_), 42243e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 42253e519524SHoward Hinnant{ 42263e519524SHoward Hinnant __r.__ptr_ = 0; 42273e519524SHoward Hinnant __r.__cntrl_ = 0; 42283e519524SHoward Hinnant} 42293e519524SHoward Hinnant 42307609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 42313e519524SHoward Hinnant 4232e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR) 42333e519524SHoward Hinnanttemplate<class _Tp> 423422747e62SLogan Chientemplate<class _Yp> 42357609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 423622747e62SLogan Chienshared_ptr<_Tp>::shared_ptr(auto_ptr<_Yp>&& __r, 42373e519524SHoward Hinnant#else 423822747e62SLogan Chienshared_ptr<_Tp>::shared_ptr(auto_ptr<_Yp> __r, 42393e519524SHoward Hinnant#endif 424022747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type) 42413e519524SHoward Hinnant : __ptr_(__r.get()) 42423e519524SHoward Hinnant{ 42433e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, default_delete<_Yp>, allocator<_Yp> > _CntrlBlk; 42443e519524SHoward Hinnant __cntrl_ = new _CntrlBlk(__r.get(), default_delete<_Yp>(), allocator<_Yp>()); 424539005d30SEric Fiselier __enable_weak_this(__r.get(), __r.get()); 42463e519524SHoward Hinnant __r.release(); 42473e519524SHoward Hinnant} 4248e67179bcSMarshall Clow#endif 42493e519524SHoward Hinnant 42503e519524SHoward Hinnanttemplate<class _Tp> 425122747e62SLogan Chientemplate <class _Yp, class _Dp> 42527609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 42533e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp>&& __r, 42543e519524SHoward Hinnant#else 42553e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp> __r, 42563e519524SHoward Hinnant#endif 425722747e62SLogan Chien typename enable_if 425822747e62SLogan Chien < 425922747e62SLogan Chien !is_lvalue_reference<_Dp>::value && 426022747e62SLogan Chien !is_array<_Yp>::value && 426122747e62SLogan Chien is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 426222747e62SLogan Chien __nat 426322747e62SLogan Chien >::type) 42643e519524SHoward Hinnant : __ptr_(__r.get()) 42653e519524SHoward Hinnant{ 4266c34f847bSMarshall Clow#if _LIBCPP_STD_VER > 11 4267c34f847bSMarshall Clow if (__ptr_ == nullptr) 4268c34f847bSMarshall Clow __cntrl_ = nullptr; 4269c34f847bSMarshall Clow else 4270c34f847bSMarshall Clow#endif 4271c34f847bSMarshall Clow { 427272d0d603SErik Pilkington typedef typename __shared_ptr_default_allocator<_Yp>::type _AllocT; 427372d0d603SErik Pilkington typedef __shared_ptr_pointer<_Yp*, _Dp, _AllocT > _CntrlBlk; 427472d0d603SErik Pilkington __cntrl_ = new _CntrlBlk(__r.get(), __r.get_deleter(), _AllocT()); 427539005d30SEric Fiselier __enable_weak_this(__r.get(), __r.get()); 4276c34f847bSMarshall Clow } 42773e519524SHoward Hinnant __r.release(); 42783e519524SHoward Hinnant} 42793e519524SHoward Hinnant 42803e519524SHoward Hinnanttemplate<class _Tp> 428122747e62SLogan Chientemplate <class _Yp, class _Dp> 42827609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 42833e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp>&& __r, 42843e519524SHoward Hinnant#else 42853e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp> __r, 42863e519524SHoward Hinnant#endif 428722747e62SLogan Chien typename enable_if 428822747e62SLogan Chien < 428922747e62SLogan Chien is_lvalue_reference<_Dp>::value && 429022747e62SLogan Chien !is_array<_Yp>::value && 429122747e62SLogan Chien is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 429222747e62SLogan Chien __nat 429322747e62SLogan Chien >::type) 42943e519524SHoward Hinnant : __ptr_(__r.get()) 42953e519524SHoward Hinnant{ 4296c34f847bSMarshall Clow#if _LIBCPP_STD_VER > 11 4297c34f847bSMarshall Clow if (__ptr_ == nullptr) 4298c34f847bSMarshall Clow __cntrl_ = nullptr; 4299c34f847bSMarshall Clow else 4300c34f847bSMarshall Clow#endif 4301c34f847bSMarshall Clow { 430272d0d603SErik Pilkington typedef typename __shared_ptr_default_allocator<_Yp>::type _AllocT; 43033e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, 43043e519524SHoward Hinnant reference_wrapper<typename remove_reference<_Dp>::type>, 430572d0d603SErik Pilkington _AllocT > _CntrlBlk; 430672d0d603SErik Pilkington __cntrl_ = new _CntrlBlk(__r.get(), ref(__r.get_deleter()), _AllocT()); 430739005d30SEric Fiselier __enable_weak_this(__r.get(), __r.get()); 4308c34f847bSMarshall Clow } 43093e519524SHoward Hinnant __r.release(); 43103e519524SHoward Hinnant} 43113e519524SHoward Hinnant 43123e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 43133e519524SHoward Hinnant 43143e519524SHoward Hinnanttemplate<class _Tp> 43153e519524SHoward Hinnanttemplate<class ..._Args> 43163e519524SHoward Hinnantshared_ptr<_Tp> 43173e519524SHoward Hinnantshared_ptr<_Tp>::make_shared(_Args&& ...__args) 43183e519524SHoward Hinnant{ 431977009129SMarshall Clow static_assert( is_constructible<_Tp, _Args...>::value, "Can't construct object in make_shared" ); 43203e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 43213e519524SHoward Hinnant typedef allocator<_CntrlBlk> _A2; 43223e519524SHoward Hinnant typedef __allocator_destructor<_A2> _D2; 43233e519524SHoward Hinnant _A2 __a2; 43243e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); 4325ce48a113SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__a2, _VSTD::forward<_Args>(__args)...); 43263e519524SHoward Hinnant shared_ptr<_Tp> __r; 43273e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 43283e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 432939005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 43303e519524SHoward Hinnant return __r; 43313e519524SHoward Hinnant} 43323e519524SHoward Hinnant 43333e519524SHoward Hinnanttemplate<class _Tp> 43343e519524SHoward Hinnanttemplate<class _Alloc, class ..._Args> 43353e519524SHoward Hinnantshared_ptr<_Tp> 43363e519524SHoward Hinnantshared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _Args&& ...__args) 43373e519524SHoward Hinnant{ 433877009129SMarshall Clow static_assert( is_constructible<_Tp, _Args...>::value, "Can't construct object in allocate_shared" ); 43393e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 4340319be722SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _A2; 43413e519524SHoward Hinnant typedef __allocator_destructor<_A2> _D2; 43423e519524SHoward Hinnant _A2 __a2(__a); 43433e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); 4344319be722SEric Fiselier ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4345319be722SEric Fiselier _CntrlBlk(__a, _VSTD::forward<_Args>(__args)...); 43463e519524SHoward Hinnant shared_ptr<_Tp> __r; 43473e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 4348319be722SEric Fiselier __r.__cntrl_ = _VSTD::addressof(*__hold2.release()); 434939005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 43503e519524SHoward Hinnant return __r; 43513e519524SHoward Hinnant} 43523e519524SHoward Hinnant 43533e519524SHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 43543e519524SHoward Hinnant 43553e519524SHoward Hinnanttemplate<class _Tp> 43563e519524SHoward Hinnantshared_ptr<_Tp> 43573e519524SHoward Hinnantshared_ptr<_Tp>::make_shared() 43583e519524SHoward Hinnant{ 435977009129SMarshall Clow static_assert((is_constructible<_Tp>::value), "Can't construct object in make_shared" ); 43603e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 43613e519524SHoward Hinnant typedef allocator<_CntrlBlk> _Alloc2; 43623e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 43633e519524SHoward Hinnant _Alloc2 __alloc2; 43643e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 43653e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__alloc2); 43663e519524SHoward Hinnant shared_ptr<_Tp> __r; 43673e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 43683e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 436939005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 43703e519524SHoward Hinnant return __r; 43713e519524SHoward Hinnant} 43723e519524SHoward Hinnant 43733e519524SHoward Hinnanttemplate<class _Tp> 43743e519524SHoward Hinnanttemplate<class _A0> 43753e519524SHoward Hinnantshared_ptr<_Tp> 43763e519524SHoward Hinnantshared_ptr<_Tp>::make_shared(_A0& __a0) 43773e519524SHoward Hinnant{ 437877009129SMarshall Clow static_assert((is_constructible<_Tp, _A0>::value), "Can't construct object in make_shared" ); 43793e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 43803e519524SHoward Hinnant typedef allocator<_CntrlBlk> _Alloc2; 43813e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 43823e519524SHoward Hinnant _Alloc2 __alloc2; 43833e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 43843e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__alloc2, __a0); 43853e519524SHoward Hinnant shared_ptr<_Tp> __r; 43863e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 43873e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 438839005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 43893e519524SHoward Hinnant return __r; 43903e519524SHoward Hinnant} 43913e519524SHoward Hinnant 43923e519524SHoward Hinnanttemplate<class _Tp> 43933e519524SHoward Hinnanttemplate<class _A0, class _A1> 43943e519524SHoward Hinnantshared_ptr<_Tp> 43953e519524SHoward Hinnantshared_ptr<_Tp>::make_shared(_A0& __a0, _A1& __a1) 43963e519524SHoward Hinnant{ 439777009129SMarshall Clow static_assert((is_constructible<_Tp, _A0, _A1>::value), "Can't construct object in make_shared" ); 43983e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 43993e519524SHoward Hinnant typedef allocator<_CntrlBlk> _Alloc2; 44003e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 44013e519524SHoward Hinnant _Alloc2 __alloc2; 44023e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 44033e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__alloc2, __a0, __a1); 44043e519524SHoward Hinnant shared_ptr<_Tp> __r; 44053e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 44063e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 440739005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 44083e519524SHoward Hinnant return __r; 44093e519524SHoward Hinnant} 44103e519524SHoward Hinnant 44113e519524SHoward Hinnanttemplate<class _Tp> 44123e519524SHoward Hinnanttemplate<class _A0, class _A1, class _A2> 44133e519524SHoward Hinnantshared_ptr<_Tp> 44143e519524SHoward Hinnantshared_ptr<_Tp>::make_shared(_A0& __a0, _A1& __a1, _A2& __a2) 44153e519524SHoward Hinnant{ 441677009129SMarshall Clow static_assert((is_constructible<_Tp, _A0, _A1, _A2>::value), "Can't construct object in make_shared" ); 44173e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 44183e519524SHoward Hinnant typedef allocator<_CntrlBlk> _Alloc2; 44193e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 44203e519524SHoward Hinnant _Alloc2 __alloc2; 44213e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 44223e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__alloc2, __a0, __a1, __a2); 44233e519524SHoward Hinnant shared_ptr<_Tp> __r; 44243e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 44253e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 442639005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 44273e519524SHoward Hinnant return __r; 44283e519524SHoward Hinnant} 44293e519524SHoward Hinnant 44303e519524SHoward Hinnanttemplate<class _Tp> 44313e519524SHoward Hinnanttemplate<class _Alloc> 44323e519524SHoward Hinnantshared_ptr<_Tp> 44333e519524SHoward Hinnantshared_ptr<_Tp>::allocate_shared(const _Alloc& __a) 44343e519524SHoward Hinnant{ 443577009129SMarshall Clow static_assert((is_constructible<_Tp>::value), "Can't construct object in allocate_shared" ); 44363e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 4437319be722SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _Alloc2; 44383e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 44393e519524SHoward Hinnant _Alloc2 __alloc2(__a); 44403e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 4441319be722SEric Fiselier ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4442319be722SEric Fiselier _CntrlBlk(__a); 44433e519524SHoward Hinnant shared_ptr<_Tp> __r; 44443e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 4445319be722SEric Fiselier __r.__cntrl_ = _VSTD::addressof(*__hold2.release()); 444639005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 44473e519524SHoward Hinnant return __r; 44483e519524SHoward Hinnant} 44493e519524SHoward Hinnant 44503e519524SHoward Hinnanttemplate<class _Tp> 44513e519524SHoward Hinnanttemplate<class _Alloc, class _A0> 44523e519524SHoward Hinnantshared_ptr<_Tp> 44533e519524SHoward Hinnantshared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _A0& __a0) 44543e519524SHoward Hinnant{ 445577009129SMarshall Clow static_assert((is_constructible<_Tp, _A0>::value), "Can't construct object in allocate_shared" ); 44563e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 4457319be722SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _Alloc2; 44583e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 44593e519524SHoward Hinnant _Alloc2 __alloc2(__a); 44603e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 4461319be722SEric Fiselier ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4462319be722SEric Fiselier _CntrlBlk(__a, __a0); 44633e519524SHoward Hinnant shared_ptr<_Tp> __r; 44643e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 4465319be722SEric Fiselier __r.__cntrl_ = _VSTD::addressof(*__hold2.release()); 446639005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 44673e519524SHoward Hinnant return __r; 44683e519524SHoward Hinnant} 44693e519524SHoward Hinnant 44703e519524SHoward Hinnanttemplate<class _Tp> 44713e519524SHoward Hinnanttemplate<class _Alloc, class _A0, class _A1> 44723e519524SHoward Hinnantshared_ptr<_Tp> 44733e519524SHoward Hinnantshared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1) 44743e519524SHoward Hinnant{ 447577009129SMarshall Clow static_assert((is_constructible<_Tp, _A0, _A1>::value), "Can't construct object in allocate_shared" ); 44763e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 4477319be722SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _Alloc2; 44783e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 44793e519524SHoward Hinnant _Alloc2 __alloc2(__a); 44803e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 4481319be722SEric Fiselier ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4482319be722SEric Fiselier _CntrlBlk(__a, __a0, __a1); 44833e519524SHoward Hinnant shared_ptr<_Tp> __r; 44843e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 4485319be722SEric Fiselier __r.__cntrl_ = _VSTD::addressof(*__hold2.release()); 448639005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 44873e519524SHoward Hinnant return __r; 44883e519524SHoward Hinnant} 44893e519524SHoward Hinnant 44903e519524SHoward Hinnanttemplate<class _Tp> 44913e519524SHoward Hinnanttemplate<class _Alloc, class _A0, class _A1, class _A2> 44923e519524SHoward Hinnantshared_ptr<_Tp> 44933e519524SHoward Hinnantshared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1, _A2& __a2) 44943e519524SHoward Hinnant{ 449577009129SMarshall Clow static_assert((is_constructible<_Tp, _A0, _A1, _A2>::value), "Can't construct object in allocate_shared" ); 44963e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 4497319be722SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _Alloc2; 44983e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 44993e519524SHoward Hinnant _Alloc2 __alloc2(__a); 45003e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 4501319be722SEric Fiselier ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4502319be722SEric Fiselier _CntrlBlk(__a, __a0, __a1, __a2); 45033e519524SHoward Hinnant shared_ptr<_Tp> __r; 45043e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 4505319be722SEric Fiselier __r.__cntrl_ = _VSTD::addressof(*__hold2.release()); 450639005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 45073e519524SHoward Hinnant return __r; 45083e519524SHoward Hinnant} 45093e519524SHoward Hinnant 45103e519524SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 45113e519524SHoward Hinnant 45123e519524SHoward Hinnanttemplate<class _Tp> 45133e519524SHoward Hinnantshared_ptr<_Tp>::~shared_ptr() 45143e519524SHoward Hinnant{ 45153e519524SHoward Hinnant if (__cntrl_) 45163e519524SHoward Hinnant __cntrl_->__release_shared(); 45173e519524SHoward Hinnant} 45183e519524SHoward Hinnant 45193e519524SHoward Hinnanttemplate<class _Tp> 4520906c872dSEvgeniy Stepanovinline 45213e519524SHoward Hinnantshared_ptr<_Tp>& 45223739fe79SHoward Hinnantshared_ptr<_Tp>::operator=(const shared_ptr& __r) _NOEXCEPT 45233e519524SHoward Hinnant{ 45243e519524SHoward Hinnant shared_ptr(__r).swap(*this); 45253e519524SHoward Hinnant return *this; 45263e519524SHoward Hinnant} 45273e519524SHoward Hinnant 45283e519524SHoward Hinnanttemplate<class _Tp> 45293e519524SHoward Hinnanttemplate<class _Yp> 4530906c872dSEvgeniy Stepanovinline 45318e25104bSHoward Hinnanttypename enable_if 45328e25104bSHoward Hinnant< 4533dc83e779SMarshall Clow is_convertible<_Yp*, typename shared_ptr<_Tp>::element_type*>::value, 45343e519524SHoward Hinnant shared_ptr<_Tp>& 45358e25104bSHoward Hinnant>::type 45363739fe79SHoward Hinnantshared_ptr<_Tp>::operator=(const shared_ptr<_Yp>& __r) _NOEXCEPT 45373e519524SHoward Hinnant{ 45383e519524SHoward Hinnant shared_ptr(__r).swap(*this); 45393e519524SHoward Hinnant return *this; 45403e519524SHoward Hinnant} 45413e519524SHoward Hinnant 45427609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 45433e519524SHoward Hinnant 45443e519524SHoward Hinnanttemplate<class _Tp> 4545906c872dSEvgeniy Stepanovinline 45463e519524SHoward Hinnantshared_ptr<_Tp>& 45473739fe79SHoward Hinnantshared_ptr<_Tp>::operator=(shared_ptr&& __r) _NOEXCEPT 45483e519524SHoward Hinnant{ 4549ce48a113SHoward Hinnant shared_ptr(_VSTD::move(__r)).swap(*this); 45503e519524SHoward Hinnant return *this; 45513e519524SHoward Hinnant} 45523e519524SHoward Hinnant 45533e519524SHoward Hinnanttemplate<class _Tp> 45543e519524SHoward Hinnanttemplate<class _Yp> 4555906c872dSEvgeniy Stepanovinline 45568e25104bSHoward Hinnanttypename enable_if 45578e25104bSHoward Hinnant< 4558dc83e779SMarshall Clow is_convertible<_Yp*, typename shared_ptr<_Tp>::element_type*>::value, 45593e519524SHoward Hinnant shared_ptr<_Tp>& 45608e25104bSHoward Hinnant>::type 45613e519524SHoward Hinnantshared_ptr<_Tp>::operator=(shared_ptr<_Yp>&& __r) 45623e519524SHoward Hinnant{ 4563ce48a113SHoward Hinnant shared_ptr(_VSTD::move(__r)).swap(*this); 45643e519524SHoward Hinnant return *this; 45653e519524SHoward Hinnant} 45663e519524SHoward Hinnant 4567e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR) 45683e519524SHoward Hinnanttemplate<class _Tp> 45693e519524SHoward Hinnanttemplate<class _Yp> 4570906c872dSEvgeniy Stepanovinline 45718e25104bSHoward Hinnanttypename enable_if 45728e25104bSHoward Hinnant< 45738e25104bSHoward Hinnant !is_array<_Yp>::value && 4574dc83e779SMarshall Clow is_convertible<_Yp*, typename shared_ptr<_Tp>::element_type*>::value, 457584f996fbSHoward Hinnant shared_ptr<_Tp> 457684f996fbSHoward Hinnant>::type& 45773e519524SHoward Hinnantshared_ptr<_Tp>::operator=(auto_ptr<_Yp>&& __r) 45783e519524SHoward Hinnant{ 4579ce48a113SHoward Hinnant shared_ptr(_VSTD::move(__r)).swap(*this); 45803e519524SHoward Hinnant return *this; 45813e519524SHoward Hinnant} 4582e67179bcSMarshall Clow#endif 45833e519524SHoward Hinnant 45843e519524SHoward Hinnanttemplate<class _Tp> 45853e519524SHoward Hinnanttemplate <class _Yp, class _Dp> 4586906c872dSEvgeniy Stepanovinline 45878e25104bSHoward Hinnanttypename enable_if 45888e25104bSHoward Hinnant< 45898e25104bSHoward Hinnant !is_array<_Yp>::value && 4590dc83e779SMarshall Clow is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, 4591dc83e779SMarshall Clow typename shared_ptr<_Tp>::element_type*>::value, 45923e519524SHoward Hinnant shared_ptr<_Tp>& 45938e25104bSHoward Hinnant>::type 45943e519524SHoward Hinnantshared_ptr<_Tp>::operator=(unique_ptr<_Yp, _Dp>&& __r) 45953e519524SHoward Hinnant{ 4596ce48a113SHoward Hinnant shared_ptr(_VSTD::move(__r)).swap(*this); 45973e519524SHoward Hinnant return *this; 45983e519524SHoward Hinnant} 45993e519524SHoward Hinnant 46007609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 46013e519524SHoward Hinnant 4602e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR) 46033e519524SHoward Hinnanttemplate<class _Tp> 46043e519524SHoward Hinnanttemplate<class _Yp> 46053e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 46068e25104bSHoward Hinnanttypename enable_if 46078e25104bSHoward Hinnant< 46088e25104bSHoward Hinnant !is_array<_Yp>::value && 46093a6474ecSMarshall Clow is_convertible<_Yp*, typename shared_ptr<_Tp>::element_type*>::value, 46103e519524SHoward Hinnant shared_ptr<_Tp>& 46118e25104bSHoward Hinnant>::type 4612b3371f6fSHoward Hinnantshared_ptr<_Tp>::operator=(auto_ptr<_Yp> __r) 46133e519524SHoward Hinnant{ 46143e519524SHoward Hinnant shared_ptr(__r).swap(*this); 46153e519524SHoward Hinnant return *this; 46163e519524SHoward Hinnant} 4617e67179bcSMarshall Clow#endif 46183e519524SHoward Hinnant 46193e519524SHoward Hinnanttemplate<class _Tp> 46203e519524SHoward Hinnanttemplate <class _Yp, class _Dp> 46213e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 46228e25104bSHoward Hinnanttypename enable_if 46238e25104bSHoward Hinnant< 46248e25104bSHoward Hinnant !is_array<_Yp>::value && 46253a6474ecSMarshall Clow is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, 46263a6474ecSMarshall Clow typename shared_ptr<_Tp>::element_type*>::value, 46273e519524SHoward Hinnant shared_ptr<_Tp>& 46288e25104bSHoward Hinnant>::type 46293e519524SHoward Hinnantshared_ptr<_Tp>::operator=(unique_ptr<_Yp, _Dp> __r) 46303e519524SHoward Hinnant{ 4631ce48a113SHoward Hinnant shared_ptr(_VSTD::move(__r)).swap(*this); 46323e519524SHoward Hinnant return *this; 46333e519524SHoward Hinnant} 46343e519524SHoward Hinnant 46357609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 46363e519524SHoward Hinnant 46373e519524SHoward Hinnanttemplate<class _Tp> 4638906c872dSEvgeniy Stepanovinline 46393e519524SHoward Hinnantvoid 46403739fe79SHoward Hinnantshared_ptr<_Tp>::swap(shared_ptr& __r) _NOEXCEPT 46413e519524SHoward Hinnant{ 4642ce48a113SHoward Hinnant _VSTD::swap(__ptr_, __r.__ptr_); 4643ce48a113SHoward Hinnant _VSTD::swap(__cntrl_, __r.__cntrl_); 46443e519524SHoward Hinnant} 46453e519524SHoward Hinnant 46463e519524SHoward Hinnanttemplate<class _Tp> 4647906c872dSEvgeniy Stepanovinline 46483e519524SHoward Hinnantvoid 46493739fe79SHoward Hinnantshared_ptr<_Tp>::reset() _NOEXCEPT 46503e519524SHoward Hinnant{ 46513e519524SHoward Hinnant shared_ptr().swap(*this); 46523e519524SHoward Hinnant} 46533e519524SHoward Hinnant 46543e519524SHoward Hinnanttemplate<class _Tp> 46553e519524SHoward Hinnanttemplate<class _Yp> 4656906c872dSEvgeniy Stepanovinline 46578e25104bSHoward Hinnanttypename enable_if 46588e25104bSHoward Hinnant< 4659dc83e779SMarshall Clow is_convertible<_Yp*, typename shared_ptr<_Tp>::element_type*>::value, 46603e519524SHoward Hinnant void 46618e25104bSHoward Hinnant>::type 46623e519524SHoward Hinnantshared_ptr<_Tp>::reset(_Yp* __p) 46633e519524SHoward Hinnant{ 46643e519524SHoward Hinnant shared_ptr(__p).swap(*this); 46653e519524SHoward Hinnant} 46663e519524SHoward Hinnant 46673e519524SHoward Hinnanttemplate<class _Tp> 46683e519524SHoward Hinnanttemplate<class _Yp, class _Dp> 4669906c872dSEvgeniy Stepanovinline 46708e25104bSHoward Hinnanttypename enable_if 46718e25104bSHoward Hinnant< 4672dc83e779SMarshall Clow is_convertible<_Yp*, typename shared_ptr<_Tp>::element_type*>::value, 46733e519524SHoward Hinnant void 46748e25104bSHoward Hinnant>::type 46753e519524SHoward Hinnantshared_ptr<_Tp>::reset(_Yp* __p, _Dp __d) 46763e519524SHoward Hinnant{ 46773e519524SHoward Hinnant shared_ptr(__p, __d).swap(*this); 46783e519524SHoward Hinnant} 46793e519524SHoward Hinnant 46803e519524SHoward Hinnanttemplate<class _Tp> 46813e519524SHoward Hinnanttemplate<class _Yp, class _Dp, class _Alloc> 4682906c872dSEvgeniy Stepanovinline 46838e25104bSHoward Hinnanttypename enable_if 46848e25104bSHoward Hinnant< 4685dc83e779SMarshall Clow is_convertible<_Yp*, typename shared_ptr<_Tp>::element_type*>::value, 46863e519524SHoward Hinnant void 46878e25104bSHoward Hinnant>::type 46883e519524SHoward Hinnantshared_ptr<_Tp>::reset(_Yp* __p, _Dp __d, _Alloc __a) 46893e519524SHoward Hinnant{ 46903e519524SHoward Hinnant shared_ptr(__p, __d, __a).swap(*this); 46913e519524SHoward Hinnant} 46923e519524SHoward Hinnant 46933e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 46943e519524SHoward Hinnant 46953e519524SHoward Hinnanttemplate<class _Tp, class ..._Args> 46963e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 46978e25104bSHoward Hinnanttypename enable_if 46988e25104bSHoward Hinnant< 46998e25104bSHoward Hinnant !is_array<_Tp>::value, 47003e519524SHoward Hinnant shared_ptr<_Tp> 47018e25104bSHoward Hinnant>::type 47023e519524SHoward Hinnantmake_shared(_Args&& ...__args) 47033e519524SHoward Hinnant{ 4704ce48a113SHoward Hinnant return shared_ptr<_Tp>::make_shared(_VSTD::forward<_Args>(__args)...); 47053e519524SHoward Hinnant} 47063e519524SHoward Hinnant 47073e519524SHoward Hinnanttemplate<class _Tp, class _Alloc, class ..._Args> 47083e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 47098e25104bSHoward Hinnanttypename enable_if 47108e25104bSHoward Hinnant< 47118e25104bSHoward Hinnant !is_array<_Tp>::value, 47123e519524SHoward Hinnant shared_ptr<_Tp> 47138e25104bSHoward Hinnant>::type 47143e519524SHoward Hinnantallocate_shared(const _Alloc& __a, _Args&& ...__args) 47153e519524SHoward Hinnant{ 4716ce48a113SHoward Hinnant return shared_ptr<_Tp>::allocate_shared(__a, _VSTD::forward<_Args>(__args)...); 47173e519524SHoward Hinnant} 47183e519524SHoward Hinnant 47193e519524SHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 47203e519524SHoward Hinnant 47213e519524SHoward Hinnanttemplate<class _Tp> 47223e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 47233e519524SHoward Hinnantshared_ptr<_Tp> 47243e519524SHoward Hinnantmake_shared() 47253e519524SHoward Hinnant{ 47263e519524SHoward Hinnant return shared_ptr<_Tp>::make_shared(); 47273e519524SHoward Hinnant} 47283e519524SHoward Hinnant 47293e519524SHoward Hinnanttemplate<class _Tp, class _A0> 47303e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 47313e519524SHoward Hinnantshared_ptr<_Tp> 47323e519524SHoward Hinnantmake_shared(_A0& __a0) 47333e519524SHoward Hinnant{ 47343e519524SHoward Hinnant return shared_ptr<_Tp>::make_shared(__a0); 47353e519524SHoward Hinnant} 47363e519524SHoward Hinnant 47373e519524SHoward Hinnanttemplate<class _Tp, class _A0, class _A1> 47383e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 47393e519524SHoward Hinnantshared_ptr<_Tp> 47403e519524SHoward Hinnantmake_shared(_A0& __a0, _A1& __a1) 47413e519524SHoward Hinnant{ 47423e519524SHoward Hinnant return shared_ptr<_Tp>::make_shared(__a0, __a1); 47433e519524SHoward Hinnant} 47443e519524SHoward Hinnant 47453e519524SHoward Hinnanttemplate<class _Tp, class _A0, class _A1, class _A2> 47463e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 47473e519524SHoward Hinnantshared_ptr<_Tp> 47483e519524SHoward Hinnantmake_shared(_A0& __a0, _A1& __a1, _A2& __a2) 47493e519524SHoward Hinnant{ 47503e519524SHoward Hinnant return shared_ptr<_Tp>::make_shared(__a0, __a1, __a2); 47513e519524SHoward Hinnant} 47523e519524SHoward Hinnant 47533e519524SHoward Hinnanttemplate<class _Tp, class _Alloc> 47543e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 47553e519524SHoward Hinnantshared_ptr<_Tp> 47563e519524SHoward Hinnantallocate_shared(const _Alloc& __a) 47573e519524SHoward Hinnant{ 47583e519524SHoward Hinnant return shared_ptr<_Tp>::allocate_shared(__a); 47593e519524SHoward Hinnant} 47603e519524SHoward Hinnant 47613e519524SHoward Hinnanttemplate<class _Tp, class _Alloc, class _A0> 47623e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 47633e519524SHoward Hinnantshared_ptr<_Tp> 47643e519524SHoward Hinnantallocate_shared(const _Alloc& __a, _A0& __a0) 47653e519524SHoward Hinnant{ 47663e519524SHoward Hinnant return shared_ptr<_Tp>::allocate_shared(__a, __a0); 47673e519524SHoward Hinnant} 47683e519524SHoward Hinnant 47693e519524SHoward Hinnanttemplate<class _Tp, class _Alloc, class _A0, class _A1> 47703e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 47713e519524SHoward Hinnantshared_ptr<_Tp> 47723e519524SHoward Hinnantallocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1) 47733e519524SHoward Hinnant{ 47743e519524SHoward Hinnant return shared_ptr<_Tp>::allocate_shared(__a, __a0, __a1); 47753e519524SHoward Hinnant} 47763e519524SHoward Hinnant 47773e519524SHoward Hinnanttemplate<class _Tp, class _Alloc, class _A0, class _A1, class _A2> 47783e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 47793e519524SHoward Hinnantshared_ptr<_Tp> 47803e519524SHoward Hinnantallocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1, _A2& __a2) 47813e519524SHoward Hinnant{ 47823e519524SHoward Hinnant return shared_ptr<_Tp>::allocate_shared(__a, __a0, __a1, __a2); 47833e519524SHoward Hinnant} 47843e519524SHoward Hinnant 47853e519524SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 47863e519524SHoward Hinnant 47873e519524SHoward Hinnanttemplate<class _Tp, class _Up> 47883e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 47893e519524SHoward Hinnantbool 47903739fe79SHoward Hinnantoperator==(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 47913e519524SHoward Hinnant{ 47923e519524SHoward Hinnant return __x.get() == __y.get(); 47933e519524SHoward Hinnant} 47943e519524SHoward Hinnant 47953e519524SHoward Hinnanttemplate<class _Tp, class _Up> 47963e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 47973e519524SHoward Hinnantbool 47983739fe79SHoward Hinnantoperator!=(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 47993e519524SHoward Hinnant{ 48003e519524SHoward Hinnant return !(__x == __y); 48013e519524SHoward Hinnant} 48023e519524SHoward Hinnant 48033e519524SHoward Hinnanttemplate<class _Tp, class _Up> 48043e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 48053e519524SHoward Hinnantbool 48063739fe79SHoward Hinnantoperator<(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 48073e519524SHoward Hinnant{ 4808*c0db0729SMarshall Clow#if _LIBCPP_STD_VER <= 11 48096fe361c1SEric Fiselier typedef typename common_type<_Tp*, _Up*>::type _Vp; 48106fe361c1SEric Fiselier return less<_Vp>()(__x.get(), __y.get()); 4811*c0db0729SMarshall Clow#else 4812*c0db0729SMarshall Clow return less<>()(__x.get(), __y.get()); 4813*c0db0729SMarshall Clow#endif 4814*c0db0729SMarshall Clow 481567f39647SHoward Hinnant} 481667f39647SHoward Hinnant 481767f39647SHoward Hinnanttemplate<class _Tp, class _Up> 481867f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 481967f39647SHoward Hinnantbool 482067f39647SHoward Hinnantoperator>(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 482167f39647SHoward Hinnant{ 482267f39647SHoward Hinnant return __y < __x; 482367f39647SHoward Hinnant} 482467f39647SHoward Hinnant 482567f39647SHoward Hinnanttemplate<class _Tp, class _Up> 482667f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 482767f39647SHoward Hinnantbool 482867f39647SHoward Hinnantoperator<=(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 482967f39647SHoward Hinnant{ 483067f39647SHoward Hinnant return !(__y < __x); 483167f39647SHoward Hinnant} 483267f39647SHoward Hinnant 483367f39647SHoward Hinnanttemplate<class _Tp, class _Up> 483467f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 483567f39647SHoward Hinnantbool 483667f39647SHoward Hinnantoperator>=(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 483767f39647SHoward Hinnant{ 483867f39647SHoward Hinnant return !(__x < __y); 483967f39647SHoward Hinnant} 484067f39647SHoward Hinnant 484167f39647SHoward Hinnanttemplate<class _Tp> 484267f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 484367f39647SHoward Hinnantbool 484467f39647SHoward Hinnantoperator==(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 484567f39647SHoward Hinnant{ 484667f39647SHoward Hinnant return !__x; 484767f39647SHoward Hinnant} 484867f39647SHoward Hinnant 484967f39647SHoward Hinnanttemplate<class _Tp> 485067f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 485167f39647SHoward Hinnantbool 485267f39647SHoward Hinnantoperator==(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 485367f39647SHoward Hinnant{ 485467f39647SHoward Hinnant return !__x; 485567f39647SHoward Hinnant} 485667f39647SHoward Hinnant 485767f39647SHoward Hinnanttemplate<class _Tp> 485867f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 485967f39647SHoward Hinnantbool 486067f39647SHoward Hinnantoperator!=(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 486167f39647SHoward Hinnant{ 486267f39647SHoward Hinnant return static_cast<bool>(__x); 486367f39647SHoward Hinnant} 486467f39647SHoward Hinnant 486567f39647SHoward Hinnanttemplate<class _Tp> 486667f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 486767f39647SHoward Hinnantbool 486867f39647SHoward Hinnantoperator!=(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 486967f39647SHoward Hinnant{ 487067f39647SHoward Hinnant return static_cast<bool>(__x); 487167f39647SHoward Hinnant} 487267f39647SHoward Hinnant 487367f39647SHoward Hinnanttemplate<class _Tp> 487467f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 487567f39647SHoward Hinnantbool 487667f39647SHoward Hinnantoperator<(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 487767f39647SHoward Hinnant{ 487867f39647SHoward Hinnant return less<_Tp*>()(__x.get(), nullptr); 487967f39647SHoward Hinnant} 488067f39647SHoward Hinnant 488167f39647SHoward Hinnanttemplate<class _Tp> 488267f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 488367f39647SHoward Hinnantbool 488467f39647SHoward Hinnantoperator<(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 488567f39647SHoward Hinnant{ 488667f39647SHoward Hinnant return less<_Tp*>()(nullptr, __x.get()); 488767f39647SHoward Hinnant} 488867f39647SHoward Hinnant 488967f39647SHoward Hinnanttemplate<class _Tp> 489067f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 489167f39647SHoward Hinnantbool 489267f39647SHoward Hinnantoperator>(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 489367f39647SHoward Hinnant{ 489467f39647SHoward Hinnant return nullptr < __x; 489567f39647SHoward Hinnant} 489667f39647SHoward Hinnant 489767f39647SHoward Hinnanttemplate<class _Tp> 489867f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 489967f39647SHoward Hinnantbool 490067f39647SHoward Hinnantoperator>(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 490167f39647SHoward Hinnant{ 490267f39647SHoward Hinnant return __x < nullptr; 490367f39647SHoward Hinnant} 490467f39647SHoward Hinnant 490567f39647SHoward Hinnanttemplate<class _Tp> 490667f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 490767f39647SHoward Hinnantbool 490867f39647SHoward Hinnantoperator<=(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 490967f39647SHoward Hinnant{ 491067f39647SHoward Hinnant return !(nullptr < __x); 491167f39647SHoward Hinnant} 491267f39647SHoward Hinnant 491367f39647SHoward Hinnanttemplate<class _Tp> 491467f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 491567f39647SHoward Hinnantbool 491667f39647SHoward Hinnantoperator<=(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 491767f39647SHoward Hinnant{ 491867f39647SHoward Hinnant return !(__x < nullptr); 491967f39647SHoward Hinnant} 492067f39647SHoward Hinnant 492167f39647SHoward Hinnanttemplate<class _Tp> 492267f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 492367f39647SHoward Hinnantbool 492467f39647SHoward Hinnantoperator>=(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 492567f39647SHoward Hinnant{ 492667f39647SHoward Hinnant return !(__x < nullptr); 492767f39647SHoward Hinnant} 492867f39647SHoward Hinnant 492967f39647SHoward Hinnanttemplate<class _Tp> 493067f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 493167f39647SHoward Hinnantbool 493267f39647SHoward Hinnantoperator>=(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 493367f39647SHoward Hinnant{ 493467f39647SHoward Hinnant return !(nullptr < __x); 49353e519524SHoward Hinnant} 49363e519524SHoward Hinnant 49373e519524SHoward Hinnanttemplate<class _Tp> 49383e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 49393e519524SHoward Hinnantvoid 49403739fe79SHoward Hinnantswap(shared_ptr<_Tp>& __x, shared_ptr<_Tp>& __y) _NOEXCEPT 49413e519524SHoward Hinnant{ 49423e519524SHoward Hinnant __x.swap(__y); 49433e519524SHoward Hinnant} 49443e519524SHoward Hinnant 49453e519524SHoward Hinnanttemplate<class _Tp, class _Up> 49463e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 49478e25104bSHoward Hinnanttypename enable_if 49488e25104bSHoward Hinnant< 49498e25104bSHoward Hinnant !is_array<_Tp>::value && !is_array<_Up>::value, 49503e519524SHoward Hinnant shared_ptr<_Tp> 49518e25104bSHoward Hinnant>::type 49523739fe79SHoward Hinnantstatic_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT 49533e519524SHoward Hinnant{ 49543e519524SHoward Hinnant return shared_ptr<_Tp>(__r, static_cast<_Tp*>(__r.get())); 49553e519524SHoward Hinnant} 49563e519524SHoward Hinnant 49573e519524SHoward Hinnanttemplate<class _Tp, class _Up> 49583e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 49598e25104bSHoward Hinnanttypename enable_if 49608e25104bSHoward Hinnant< 49618e25104bSHoward Hinnant !is_array<_Tp>::value && !is_array<_Up>::value, 49623e519524SHoward Hinnant shared_ptr<_Tp> 49638e25104bSHoward Hinnant>::type 49643739fe79SHoward Hinnantdynamic_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT 49653e519524SHoward Hinnant{ 49663e519524SHoward Hinnant _Tp* __p = dynamic_cast<_Tp*>(__r.get()); 49673e519524SHoward Hinnant return __p ? shared_ptr<_Tp>(__r, __p) : shared_ptr<_Tp>(); 49683e519524SHoward Hinnant} 49693e519524SHoward Hinnant 49703e519524SHoward Hinnanttemplate<class _Tp, class _Up> 49718e25104bSHoward Hinnanttypename enable_if 49728e25104bSHoward Hinnant< 49738e25104bSHoward Hinnant is_array<_Tp>::value == is_array<_Up>::value, 49743e519524SHoward Hinnant shared_ptr<_Tp> 49758e25104bSHoward Hinnant>::type 49763739fe79SHoward Hinnantconst_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT 49773e519524SHoward Hinnant{ 49788e25104bSHoward Hinnant typedef typename remove_extent<_Tp>::type _RTp; 49798e25104bSHoward Hinnant return shared_ptr<_Tp>(__r, const_cast<_RTp*>(__r.get())); 49803e519524SHoward Hinnant} 49813e519524SHoward Hinnant 498254b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI 498354b409fdSHoward Hinnant 49843e519524SHoward Hinnanttemplate<class _Dp, class _Tp> 49853e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 49863e519524SHoward Hinnant_Dp* 49873739fe79SHoward Hinnantget_deleter(const shared_ptr<_Tp>& __p) _NOEXCEPT 49883e519524SHoward Hinnant{ 49893e519524SHoward Hinnant return __p.template __get_deleter<_Dp>(); 49903e519524SHoward Hinnant} 49913e519524SHoward Hinnant 4992b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_RTTI 499354b409fdSHoward Hinnant 49943e519524SHoward Hinnanttemplate<class _Tp> 4995e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS weak_ptr 49963e519524SHoward Hinnant{ 49973e519524SHoward Hinnantpublic: 49983e519524SHoward Hinnant typedef _Tp element_type; 49993e519524SHoward Hinnantprivate: 50003e519524SHoward Hinnant element_type* __ptr_; 50013e519524SHoward Hinnant __shared_weak_count* __cntrl_; 50023e519524SHoward Hinnant 50033e519524SHoward Hinnantpublic: 5004906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 5005c0937e8aSHoward Hinnant _LIBCPP_CONSTEXPR weak_ptr() _NOEXCEPT; 5006906c872dSEvgeniy Stepanov template<class _Yp> _LIBCPP_INLINE_VISIBILITY weak_ptr(shared_ptr<_Yp> const& __r, 50073739fe79SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0) 50083739fe79SHoward Hinnant _NOEXCEPT; 5009906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 50103739fe79SHoward Hinnant weak_ptr(weak_ptr const& __r) _NOEXCEPT; 5011906c872dSEvgeniy Stepanov template<class _Yp> _LIBCPP_INLINE_VISIBILITY weak_ptr(weak_ptr<_Yp> const& __r, 50123739fe79SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0) 50133739fe79SHoward Hinnant _NOEXCEPT; 50143e519524SHoward Hinnant 50158e25104bSHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 5016906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 50178e25104bSHoward Hinnant weak_ptr(weak_ptr&& __r) _NOEXCEPT; 5018906c872dSEvgeniy Stepanov template<class _Yp> _LIBCPP_INLINE_VISIBILITY weak_ptr(weak_ptr<_Yp>&& __r, 50198e25104bSHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0) 50208e25104bSHoward Hinnant _NOEXCEPT; 50218e25104bSHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 50223e519524SHoward Hinnant ~weak_ptr(); 50233e519524SHoward Hinnant 5024906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 50253739fe79SHoward Hinnant weak_ptr& operator=(weak_ptr const& __r) _NOEXCEPT; 50268e25104bSHoward Hinnant template<class _Yp> 50278e25104bSHoward Hinnant typename enable_if 50288e25104bSHoward Hinnant < 50298e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 50308e25104bSHoward Hinnant weak_ptr& 50318e25104bSHoward Hinnant >::type 5032906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 50338e25104bSHoward Hinnant operator=(weak_ptr<_Yp> const& __r) _NOEXCEPT; 50348e25104bSHoward Hinnant 50358e25104bSHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 50368e25104bSHoward Hinnant 5037906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 50388e25104bSHoward Hinnant weak_ptr& operator=(weak_ptr&& __r) _NOEXCEPT; 50398e25104bSHoward Hinnant template<class _Yp> 50408e25104bSHoward Hinnant typename enable_if 50418e25104bSHoward Hinnant < 50428e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 50438e25104bSHoward Hinnant weak_ptr& 50448e25104bSHoward Hinnant >::type 5045906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 50468e25104bSHoward Hinnant operator=(weak_ptr<_Yp>&& __r) _NOEXCEPT; 50478e25104bSHoward Hinnant 50488e25104bSHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 50498e25104bSHoward Hinnant 50508e25104bSHoward Hinnant template<class _Yp> 50518e25104bSHoward Hinnant typename enable_if 50528e25104bSHoward Hinnant < 50538e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 50548e25104bSHoward Hinnant weak_ptr& 50558e25104bSHoward Hinnant >::type 5056906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 50578e25104bSHoward Hinnant operator=(shared_ptr<_Yp> const& __r) _NOEXCEPT; 50583e519524SHoward Hinnant 5059906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 50603739fe79SHoward Hinnant void swap(weak_ptr& __r) _NOEXCEPT; 5061906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 50623739fe79SHoward Hinnant void reset() _NOEXCEPT; 50633e519524SHoward Hinnant 5064848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 50653739fe79SHoward Hinnant long use_count() const _NOEXCEPT 50663739fe79SHoward Hinnant {return __cntrl_ ? __cntrl_->use_count() : 0;} 5067848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 50683739fe79SHoward Hinnant bool expired() const _NOEXCEPT 50693739fe79SHoward Hinnant {return __cntrl_ == 0 || __cntrl_->use_count() == 0;} 50703739fe79SHoward Hinnant shared_ptr<_Tp> lock() const _NOEXCEPT; 5071848a5374SHoward Hinnant template<class _Up> 5072848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 507336bc7178SMarshall Clow bool owner_before(const shared_ptr<_Up>& __r) const _NOEXCEPT 50743e519524SHoward Hinnant {return __cntrl_ < __r.__cntrl_;} 5075848a5374SHoward Hinnant template<class _Up> 5076848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 507736bc7178SMarshall Clow bool owner_before(const weak_ptr<_Up>& __r) const _NOEXCEPT 50783e519524SHoward Hinnant {return __cntrl_ < __r.__cntrl_;} 50793e519524SHoward Hinnant 5080e2f2d1edSEric Fiselier template <class _Up> friend class _LIBCPP_TEMPLATE_VIS weak_ptr; 5081e2f2d1edSEric Fiselier template <class _Up> friend class _LIBCPP_TEMPLATE_VIS shared_ptr; 50823e519524SHoward Hinnant}; 50833e519524SHoward Hinnant 50843e519524SHoward Hinnanttemplate<class _Tp> 5085906c872dSEvgeniy Stepanovinline 5086c0937e8aSHoward Hinnant_LIBCPP_CONSTEXPR 50873739fe79SHoward Hinnantweak_ptr<_Tp>::weak_ptr() _NOEXCEPT 50883e519524SHoward Hinnant : __ptr_(0), 50893e519524SHoward Hinnant __cntrl_(0) 50903e519524SHoward Hinnant{ 50913e519524SHoward Hinnant} 50923e519524SHoward Hinnant 50933e519524SHoward Hinnanttemplate<class _Tp> 5094906c872dSEvgeniy Stepanovinline 50953739fe79SHoward Hinnantweak_ptr<_Tp>::weak_ptr(weak_ptr const& __r) _NOEXCEPT 50963e519524SHoward Hinnant : __ptr_(__r.__ptr_), 50973e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 50983e519524SHoward Hinnant{ 50993e519524SHoward Hinnant if (__cntrl_) 51003e519524SHoward Hinnant __cntrl_->__add_weak(); 51013e519524SHoward Hinnant} 51023e519524SHoward Hinnant 51033e519524SHoward Hinnanttemplate<class _Tp> 51043e519524SHoward Hinnanttemplate<class _Yp> 5105906c872dSEvgeniy Stepanovinline 51063e519524SHoward Hinnantweak_ptr<_Tp>::weak_ptr(shared_ptr<_Yp> const& __r, 51075eb6bdfaSHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type) 51083739fe79SHoward Hinnant _NOEXCEPT 51093e519524SHoward Hinnant : __ptr_(__r.__ptr_), 51103e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 51113e519524SHoward Hinnant{ 51123e519524SHoward Hinnant if (__cntrl_) 51133e519524SHoward Hinnant __cntrl_->__add_weak(); 51143e519524SHoward Hinnant} 51153e519524SHoward Hinnant 51163e519524SHoward Hinnanttemplate<class _Tp> 51173e519524SHoward Hinnanttemplate<class _Yp> 5118906c872dSEvgeniy Stepanovinline 51193e519524SHoward Hinnantweak_ptr<_Tp>::weak_ptr(weak_ptr<_Yp> const& __r, 51205eb6bdfaSHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type) 51213739fe79SHoward Hinnant _NOEXCEPT 51223e519524SHoward Hinnant : __ptr_(__r.__ptr_), 51233e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 51243e519524SHoward Hinnant{ 51253e519524SHoward Hinnant if (__cntrl_) 51263e519524SHoward Hinnant __cntrl_->__add_weak(); 51273e519524SHoward Hinnant} 51283e519524SHoward Hinnant 51298e25104bSHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 51308e25104bSHoward Hinnant 51318e25104bSHoward Hinnanttemplate<class _Tp> 5132906c872dSEvgeniy Stepanovinline 51338e25104bSHoward Hinnantweak_ptr<_Tp>::weak_ptr(weak_ptr&& __r) _NOEXCEPT 51348e25104bSHoward Hinnant : __ptr_(__r.__ptr_), 51358e25104bSHoward Hinnant __cntrl_(__r.__cntrl_) 51368e25104bSHoward Hinnant{ 51378e25104bSHoward Hinnant __r.__ptr_ = 0; 51388e25104bSHoward Hinnant __r.__cntrl_ = 0; 51398e25104bSHoward Hinnant} 51408e25104bSHoward Hinnant 51418e25104bSHoward Hinnanttemplate<class _Tp> 51428e25104bSHoward Hinnanttemplate<class _Yp> 5143906c872dSEvgeniy Stepanovinline 51448e25104bSHoward Hinnantweak_ptr<_Tp>::weak_ptr(weak_ptr<_Yp>&& __r, 51458e25104bSHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type) 51468e25104bSHoward Hinnant _NOEXCEPT 51478e25104bSHoward Hinnant : __ptr_(__r.__ptr_), 51488e25104bSHoward Hinnant __cntrl_(__r.__cntrl_) 51498e25104bSHoward Hinnant{ 51508e25104bSHoward Hinnant __r.__ptr_ = 0; 51518e25104bSHoward Hinnant __r.__cntrl_ = 0; 51528e25104bSHoward Hinnant} 51538e25104bSHoward Hinnant 51548e25104bSHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 51558e25104bSHoward Hinnant 51563e519524SHoward Hinnanttemplate<class _Tp> 51573e519524SHoward Hinnantweak_ptr<_Tp>::~weak_ptr() 51583e519524SHoward Hinnant{ 51593e519524SHoward Hinnant if (__cntrl_) 51603e519524SHoward Hinnant __cntrl_->__release_weak(); 51613e519524SHoward Hinnant} 51623e519524SHoward Hinnant 51633e519524SHoward Hinnanttemplate<class _Tp> 5164906c872dSEvgeniy Stepanovinline 51653e519524SHoward Hinnantweak_ptr<_Tp>& 51663739fe79SHoward Hinnantweak_ptr<_Tp>::operator=(weak_ptr const& __r) _NOEXCEPT 51673e519524SHoward Hinnant{ 51683e519524SHoward Hinnant weak_ptr(__r).swap(*this); 51693e519524SHoward Hinnant return *this; 51703e519524SHoward Hinnant} 51713e519524SHoward Hinnant 51723e519524SHoward Hinnanttemplate<class _Tp> 51733e519524SHoward Hinnanttemplate<class _Yp> 5174906c872dSEvgeniy Stepanovinline 51758e25104bSHoward Hinnanttypename enable_if 51768e25104bSHoward Hinnant< 51778e25104bSHoward Hinnant is_convertible<_Yp*, _Tp*>::value, 51783e519524SHoward Hinnant weak_ptr<_Tp>& 51798e25104bSHoward Hinnant>::type 51803739fe79SHoward Hinnantweak_ptr<_Tp>::operator=(weak_ptr<_Yp> const& __r) _NOEXCEPT 51813e519524SHoward Hinnant{ 51823e519524SHoward Hinnant weak_ptr(__r).swap(*this); 51833e519524SHoward Hinnant return *this; 51843e519524SHoward Hinnant} 51853e519524SHoward Hinnant 51868e25104bSHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 51878e25104bSHoward Hinnant 51888e25104bSHoward Hinnanttemplate<class _Tp> 5189906c872dSEvgeniy Stepanovinline 51908e25104bSHoward Hinnantweak_ptr<_Tp>& 51918e25104bSHoward Hinnantweak_ptr<_Tp>::operator=(weak_ptr&& __r) _NOEXCEPT 51928e25104bSHoward Hinnant{ 51938e25104bSHoward Hinnant weak_ptr(_VSTD::move(__r)).swap(*this); 51948e25104bSHoward Hinnant return *this; 51958e25104bSHoward Hinnant} 51968e25104bSHoward Hinnant 51973e519524SHoward Hinnanttemplate<class _Tp> 51983e519524SHoward Hinnanttemplate<class _Yp> 5199906c872dSEvgeniy Stepanovinline 52008e25104bSHoward Hinnanttypename enable_if 52018e25104bSHoward Hinnant< 52028e25104bSHoward Hinnant is_convertible<_Yp*, _Tp*>::value, 52033e519524SHoward Hinnant weak_ptr<_Tp>& 52048e25104bSHoward Hinnant>::type 52058e25104bSHoward Hinnantweak_ptr<_Tp>::operator=(weak_ptr<_Yp>&& __r) _NOEXCEPT 52068e25104bSHoward Hinnant{ 52078e25104bSHoward Hinnant weak_ptr(_VSTD::move(__r)).swap(*this); 52088e25104bSHoward Hinnant return *this; 52098e25104bSHoward Hinnant} 52108e25104bSHoward Hinnant 52118e25104bSHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 52128e25104bSHoward Hinnant 52138e25104bSHoward Hinnanttemplate<class _Tp> 52148e25104bSHoward Hinnanttemplate<class _Yp> 5215906c872dSEvgeniy Stepanovinline 52168e25104bSHoward Hinnanttypename enable_if 52178e25104bSHoward Hinnant< 52188e25104bSHoward Hinnant is_convertible<_Yp*, _Tp*>::value, 52198e25104bSHoward Hinnant weak_ptr<_Tp>& 52208e25104bSHoward Hinnant>::type 52213739fe79SHoward Hinnantweak_ptr<_Tp>::operator=(shared_ptr<_Yp> const& __r) _NOEXCEPT 52223e519524SHoward Hinnant{ 52233e519524SHoward Hinnant weak_ptr(__r).swap(*this); 52243e519524SHoward Hinnant return *this; 52253e519524SHoward Hinnant} 52263e519524SHoward Hinnant 52273e519524SHoward Hinnanttemplate<class _Tp> 5228906c872dSEvgeniy Stepanovinline 52293e519524SHoward Hinnantvoid 52303739fe79SHoward Hinnantweak_ptr<_Tp>::swap(weak_ptr& __r) _NOEXCEPT 52313e519524SHoward Hinnant{ 5232ce48a113SHoward Hinnant _VSTD::swap(__ptr_, __r.__ptr_); 5233ce48a113SHoward Hinnant _VSTD::swap(__cntrl_, __r.__cntrl_); 52343e519524SHoward Hinnant} 52353e519524SHoward Hinnant 52363e519524SHoward Hinnanttemplate<class _Tp> 52373e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 52383e519524SHoward Hinnantvoid 52393739fe79SHoward Hinnantswap(weak_ptr<_Tp>& __x, weak_ptr<_Tp>& __y) _NOEXCEPT 52403e519524SHoward Hinnant{ 52413e519524SHoward Hinnant __x.swap(__y); 52423e519524SHoward Hinnant} 52433e519524SHoward Hinnant 52443e519524SHoward Hinnanttemplate<class _Tp> 5245906c872dSEvgeniy Stepanovinline 52463e519524SHoward Hinnantvoid 52473739fe79SHoward Hinnantweak_ptr<_Tp>::reset() _NOEXCEPT 52483e519524SHoward Hinnant{ 52493e519524SHoward Hinnant weak_ptr().swap(*this); 52503e519524SHoward Hinnant} 52513e519524SHoward Hinnant 52523e519524SHoward Hinnanttemplate<class _Tp> 52533e519524SHoward Hinnanttemplate<class _Yp> 52543e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(const weak_ptr<_Yp>& __r, 5255dc83e779SMarshall Clow typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type) 52563e519524SHoward Hinnant : __ptr_(__r.__ptr_), 52573e519524SHoward Hinnant __cntrl_(__r.__cntrl_ ? __r.__cntrl_->lock() : __r.__cntrl_) 52583e519524SHoward Hinnant{ 52593e519524SHoward Hinnant if (__cntrl_ == 0) 5260d437fa5cSMarshall Clow __throw_bad_weak_ptr(); 52613e519524SHoward Hinnant} 52623e519524SHoward Hinnant 52633e519524SHoward Hinnanttemplate<class _Tp> 52643e519524SHoward Hinnantshared_ptr<_Tp> 52653739fe79SHoward Hinnantweak_ptr<_Tp>::lock() const _NOEXCEPT 52663e519524SHoward Hinnant{ 52673e519524SHoward Hinnant shared_ptr<_Tp> __r; 52683e519524SHoward Hinnant __r.__cntrl_ = __cntrl_ ? __cntrl_->lock() : __cntrl_; 52693e519524SHoward Hinnant if (__r.__cntrl_) 52703e519524SHoward Hinnant __r.__ptr_ = __ptr_; 52713e519524SHoward Hinnant return __r; 52723e519524SHoward Hinnant} 52733e519524SHoward Hinnant 5274183c010cSMarshall Clow#if _LIBCPP_STD_VER > 14 5275183c010cSMarshall Clowtemplate <class _Tp = void> struct owner_less; 5276183c010cSMarshall Clow#else 52773e519524SHoward Hinnanttemplate <class _Tp> struct owner_less; 5278183c010cSMarshall Clow#endif 52793e519524SHoward Hinnant 52803e519524SHoward Hinnanttemplate <class _Tp> 5281e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS owner_less<shared_ptr<_Tp> > 52823e519524SHoward Hinnant : binary_function<shared_ptr<_Tp>, shared_ptr<_Tp>, bool> 52833e519524SHoward Hinnant{ 52843e519524SHoward Hinnant typedef bool result_type; 5285848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 528636bc7178SMarshall Clow bool operator()(shared_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const _NOEXCEPT 52873e519524SHoward Hinnant {return __x.owner_before(__y);} 5288848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 528936bc7178SMarshall Clow bool operator()(shared_ptr<_Tp> const& __x, weak_ptr<_Tp> const& __y) const _NOEXCEPT 52903e519524SHoward Hinnant {return __x.owner_before(__y);} 5291848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 529236bc7178SMarshall Clow bool operator()( weak_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const _NOEXCEPT 52933e519524SHoward Hinnant {return __x.owner_before(__y);} 52943e519524SHoward Hinnant}; 52953e519524SHoward Hinnant 52963e519524SHoward Hinnanttemplate <class _Tp> 5297e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS owner_less<weak_ptr<_Tp> > 52983e519524SHoward Hinnant : binary_function<weak_ptr<_Tp>, weak_ptr<_Tp>, bool> 52993e519524SHoward Hinnant{ 53003e519524SHoward Hinnant typedef bool result_type; 5301848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 530236bc7178SMarshall Clow bool operator()( weak_ptr<_Tp> const& __x, weak_ptr<_Tp> const& __y) const _NOEXCEPT 53033e519524SHoward Hinnant {return __x.owner_before(__y);} 5304848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 530536bc7178SMarshall Clow bool operator()(shared_ptr<_Tp> const& __x, weak_ptr<_Tp> const& __y) const _NOEXCEPT 53063e519524SHoward Hinnant {return __x.owner_before(__y);} 5307848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 530836bc7178SMarshall Clow bool operator()( weak_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const _NOEXCEPT 53093e519524SHoward Hinnant {return __x.owner_before(__y);} 53103e519524SHoward Hinnant}; 53113e519524SHoward Hinnant 5312183c010cSMarshall Clow#if _LIBCPP_STD_VER > 14 5313183c010cSMarshall Clowtemplate <> 5314e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS owner_less<void> 5315183c010cSMarshall Clow{ 5316183c010cSMarshall Clow template <class _Tp, class _Up> 5317183c010cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 531836bc7178SMarshall Clow bool operator()( shared_ptr<_Tp> const& __x, shared_ptr<_Up> const& __y) const _NOEXCEPT 5319183c010cSMarshall Clow {return __x.owner_before(__y);} 5320183c010cSMarshall Clow template <class _Tp, class _Up> 5321183c010cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 532236bc7178SMarshall Clow bool operator()( shared_ptr<_Tp> const& __x, weak_ptr<_Up> const& __y) const _NOEXCEPT 5323183c010cSMarshall Clow {return __x.owner_before(__y);} 5324183c010cSMarshall Clow template <class _Tp, class _Up> 5325183c010cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 532636bc7178SMarshall Clow bool operator()( weak_ptr<_Tp> const& __x, shared_ptr<_Up> const& __y) const _NOEXCEPT 5327183c010cSMarshall Clow {return __x.owner_before(__y);} 5328183c010cSMarshall Clow template <class _Tp, class _Up> 5329183c010cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 533036bc7178SMarshall Clow bool operator()( weak_ptr<_Tp> const& __x, weak_ptr<_Up> const& __y) const _NOEXCEPT 5331183c010cSMarshall Clow {return __x.owner_before(__y);} 5332183c010cSMarshall Clow typedef void is_transparent; 5333183c010cSMarshall Clow}; 5334183c010cSMarshall Clow#endif 5335183c010cSMarshall Clow 53363e519524SHoward Hinnanttemplate<class _Tp> 5337e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS enable_shared_from_this 53383e519524SHoward Hinnant{ 53393e519524SHoward Hinnant mutable weak_ptr<_Tp> __weak_this_; 53403e519524SHoward Hinnantprotected: 5341c0937e8aSHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 53423739fe79SHoward Hinnant enable_shared_from_this() _NOEXCEPT {} 5343848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 53443739fe79SHoward Hinnant enable_shared_from_this(enable_shared_from_this const&) _NOEXCEPT {} 5345848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 53463739fe79SHoward Hinnant enable_shared_from_this& operator=(enable_shared_from_this const&) _NOEXCEPT 53473739fe79SHoward Hinnant {return *this;} 5348848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 53493e519524SHoward Hinnant ~enable_shared_from_this() {} 53503e519524SHoward Hinnantpublic: 5351848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 53523739fe79SHoward Hinnant shared_ptr<_Tp> shared_from_this() 53533739fe79SHoward Hinnant {return shared_ptr<_Tp>(__weak_this_);} 5354848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 53553739fe79SHoward Hinnant shared_ptr<_Tp const> shared_from_this() const 53563739fe79SHoward Hinnant {return shared_ptr<const _Tp>(__weak_this_);} 53573e519524SHoward Hinnant 535888f5bfdcSEric Fiselier#if _LIBCPP_STD_VER > 14 535988f5bfdcSEric Fiselier _LIBCPP_INLINE_VISIBILITY 536088f5bfdcSEric Fiselier weak_ptr<_Tp> weak_from_this() _NOEXCEPT 536188f5bfdcSEric Fiselier { return __weak_this_; } 536288f5bfdcSEric Fiselier 536388f5bfdcSEric Fiselier _LIBCPP_INLINE_VISIBILITY 536488f5bfdcSEric Fiselier weak_ptr<const _Tp> weak_from_this() const _NOEXCEPT 536588f5bfdcSEric Fiselier { return __weak_this_; } 536688f5bfdcSEric Fiselier#endif // _LIBCPP_STD_VER > 14 536788f5bfdcSEric Fiselier 53683e519524SHoward Hinnant template <class _Up> friend class shared_ptr; 53693e519524SHoward Hinnant}; 53703e519524SHoward Hinnant 5371d1803b6cSHoward Hinnanttemplate <class _Tp> 5372e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS hash<shared_ptr<_Tp> > 5373d1803b6cSHoward Hinnant{ 5374d1803b6cSHoward Hinnant typedef shared_ptr<_Tp> argument_type; 5375d1803b6cSHoward Hinnant typedef size_t result_type; 5376f9127593SEric Fiselier 5377848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 53783739fe79SHoward Hinnant result_type operator()(const argument_type& __ptr) const _NOEXCEPT 5379d1803b6cSHoward Hinnant { 5380d1803b6cSHoward Hinnant return hash<_Tp*>()(__ptr.get()); 5381d1803b6cSHoward Hinnant } 5382d1803b6cSHoward Hinnant}; 5383d1803b6cSHoward Hinnant 5384c003db1fSHoward Hinnanttemplate<class _CharT, class _Traits, class _Yp> 5385e3163f5aSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5386e3163f5aSHoward Hinnantbasic_ostream<_CharT, _Traits>& 5387c003db1fSHoward Hinnantoperator<<(basic_ostream<_CharT, _Traits>& __os, shared_ptr<_Yp> const& __p); 5388e3163f5aSHoward Hinnant 5389df93bad1SEric Fiselier 5390df93bad1SEric Fiselier#if !defined(_LIBCPP_HAS_NO_ATOMIC_HEADER) 5391d77851e8SHoward Hinnant 5392f0544c20SHoward Hinnantclass _LIBCPP_TYPE_VIS __sp_mut 5393d77851e8SHoward Hinnant{ 539454d333a6SHoward Hinnant void* __lx; 5395d77851e8SHoward Hinnantpublic: 5396d77851e8SHoward Hinnant void lock() _NOEXCEPT; 5397d77851e8SHoward Hinnant void unlock() _NOEXCEPT; 5398d77851e8SHoward Hinnant 5399d77851e8SHoward Hinnantprivate: 5400d77851e8SHoward Hinnant _LIBCPP_CONSTEXPR __sp_mut(void*) _NOEXCEPT; 5401d77851e8SHoward Hinnant __sp_mut(const __sp_mut&); 5402d77851e8SHoward Hinnant __sp_mut& operator=(const __sp_mut&); 5403d77851e8SHoward Hinnant 54046e41256fSHoward Hinnant friend _LIBCPP_FUNC_VIS __sp_mut& __get_sp_mut(const void*); 5405d77851e8SHoward Hinnant}; 5406d77851e8SHoward Hinnant 5407e9c66ad9SMehdi Amini_LIBCPP_FUNC_VIS _LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR 5408e9c66ad9SMehdi Amini__sp_mut& __get_sp_mut(const void*); 5409d77851e8SHoward Hinnant 5410d77851e8SHoward Hinnanttemplate <class _Tp> 5411d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5412d77851e8SHoward Hinnantbool 5413d77851e8SHoward Hinnantatomic_is_lock_free(const shared_ptr<_Tp>*) 5414d77851e8SHoward Hinnant{ 5415d77851e8SHoward Hinnant return false; 5416d77851e8SHoward Hinnant} 5417d77851e8SHoward Hinnant 5418d77851e8SHoward Hinnanttemplate <class _Tp> 5419e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR 5420d77851e8SHoward Hinnantshared_ptr<_Tp> 5421d77851e8SHoward Hinnantatomic_load(const shared_ptr<_Tp>* __p) 5422d77851e8SHoward Hinnant{ 5423d77851e8SHoward Hinnant __sp_mut& __m = __get_sp_mut(__p); 5424d77851e8SHoward Hinnant __m.lock(); 5425d77851e8SHoward Hinnant shared_ptr<_Tp> __q = *__p; 5426d77851e8SHoward Hinnant __m.unlock(); 5427d77851e8SHoward Hinnant return __q; 5428d77851e8SHoward Hinnant} 5429d77851e8SHoward Hinnant 5430d77851e8SHoward Hinnanttemplate <class _Tp> 5431d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5432e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR 5433d77851e8SHoward Hinnantshared_ptr<_Tp> 5434d77851e8SHoward Hinnantatomic_load_explicit(const shared_ptr<_Tp>* __p, memory_order) 5435d77851e8SHoward Hinnant{ 5436d77851e8SHoward Hinnant return atomic_load(__p); 5437d77851e8SHoward Hinnant} 5438d77851e8SHoward Hinnant 5439d77851e8SHoward Hinnanttemplate <class _Tp> 5440e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR 5441d77851e8SHoward Hinnantvoid 5442d77851e8SHoward Hinnantatomic_store(shared_ptr<_Tp>* __p, shared_ptr<_Tp> __r) 5443d77851e8SHoward Hinnant{ 5444d77851e8SHoward Hinnant __sp_mut& __m = __get_sp_mut(__p); 5445d77851e8SHoward Hinnant __m.lock(); 5446d77851e8SHoward Hinnant __p->swap(__r); 5447d77851e8SHoward Hinnant __m.unlock(); 5448d77851e8SHoward Hinnant} 5449d77851e8SHoward Hinnant 5450d77851e8SHoward Hinnanttemplate <class _Tp> 5451d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5452e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR 5453d77851e8SHoward Hinnantvoid 5454d77851e8SHoward Hinnantatomic_store_explicit(shared_ptr<_Tp>* __p, shared_ptr<_Tp> __r, memory_order) 5455d77851e8SHoward Hinnant{ 5456d77851e8SHoward Hinnant atomic_store(__p, __r); 5457d77851e8SHoward Hinnant} 5458d77851e8SHoward Hinnant 5459d77851e8SHoward Hinnanttemplate <class _Tp> 5460e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR 5461d77851e8SHoward Hinnantshared_ptr<_Tp> 5462d77851e8SHoward Hinnantatomic_exchange(shared_ptr<_Tp>* __p, shared_ptr<_Tp> __r) 5463d77851e8SHoward Hinnant{ 5464d77851e8SHoward Hinnant __sp_mut& __m = __get_sp_mut(__p); 5465d77851e8SHoward Hinnant __m.lock(); 5466d77851e8SHoward Hinnant __p->swap(__r); 5467d77851e8SHoward Hinnant __m.unlock(); 5468d77851e8SHoward Hinnant return __r; 5469d77851e8SHoward Hinnant} 5470d77851e8SHoward Hinnant 5471d77851e8SHoward Hinnanttemplate <class _Tp> 5472d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5473e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR 5474d77851e8SHoward Hinnantshared_ptr<_Tp> 5475d77851e8SHoward Hinnantatomic_exchange_explicit(shared_ptr<_Tp>* __p, shared_ptr<_Tp> __r, memory_order) 5476d77851e8SHoward Hinnant{ 5477d77851e8SHoward Hinnant return atomic_exchange(__p, __r); 5478d77851e8SHoward Hinnant} 5479d77851e8SHoward Hinnant 5480d77851e8SHoward Hinnanttemplate <class _Tp> 5481e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR 5482d77851e8SHoward Hinnantbool 5483d77851e8SHoward Hinnantatomic_compare_exchange_strong(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v, shared_ptr<_Tp> __w) 5484d77851e8SHoward Hinnant{ 54853379baebSMarshall Clow shared_ptr<_Tp> __temp; 5486d77851e8SHoward Hinnant __sp_mut& __m = __get_sp_mut(__p); 5487d77851e8SHoward Hinnant __m.lock(); 5488d77851e8SHoward Hinnant if (__p->__owner_equivalent(*__v)) 5489d77851e8SHoward Hinnant { 54903379baebSMarshall Clow _VSTD::swap(__temp, *__p); 5491d77851e8SHoward Hinnant *__p = __w; 5492d77851e8SHoward Hinnant __m.unlock(); 5493d77851e8SHoward Hinnant return true; 5494d77851e8SHoward Hinnant } 54953379baebSMarshall Clow _VSTD::swap(__temp, *__v); 5496d77851e8SHoward Hinnant *__v = *__p; 5497d77851e8SHoward Hinnant __m.unlock(); 5498d77851e8SHoward Hinnant return false; 5499d77851e8SHoward Hinnant} 5500d77851e8SHoward Hinnant 5501d77851e8SHoward Hinnanttemplate <class _Tp> 5502d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5503e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR 5504d77851e8SHoward Hinnantbool 5505d77851e8SHoward Hinnantatomic_compare_exchange_weak(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v, shared_ptr<_Tp> __w) 5506d77851e8SHoward Hinnant{ 5507d77851e8SHoward Hinnant return atomic_compare_exchange_strong(__p, __v, __w); 5508d77851e8SHoward Hinnant} 5509d77851e8SHoward Hinnant 5510d77851e8SHoward Hinnanttemplate <class _Tp> 5511d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5512e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR 5513d77851e8SHoward Hinnantbool 5514d77851e8SHoward Hinnantatomic_compare_exchange_strong_explicit(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v, 5515d77851e8SHoward Hinnant shared_ptr<_Tp> __w, memory_order, memory_order) 5516d77851e8SHoward Hinnant{ 5517d77851e8SHoward Hinnant return atomic_compare_exchange_strong(__p, __v, __w); 5518d77851e8SHoward Hinnant} 5519d77851e8SHoward Hinnant 5520d77851e8SHoward Hinnanttemplate <class _Tp> 5521d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5522e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR 5523d77851e8SHoward Hinnantbool 5524d77851e8SHoward Hinnantatomic_compare_exchange_weak_explicit(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v, 5525d77851e8SHoward Hinnant shared_ptr<_Tp> __w, memory_order, memory_order) 5526d77851e8SHoward Hinnant{ 5527d77851e8SHoward Hinnant return atomic_compare_exchange_weak(__p, __v, __w); 5528d77851e8SHoward Hinnant} 5529d77851e8SHoward Hinnant 5530df93bad1SEric Fiselier#endif // !defined(_LIBCPP_HAS_NO_ATOMIC_HEADER) 5531d77851e8SHoward Hinnant 55323e519524SHoward Hinnant//enum class 5533528600c4SEric Fiselier#if defined(_LIBCPP_ABI_POINTER_SAFETY_ENUM_TYPE) 5534528600c4SEric Fiselier# ifndef _LIBCPP_CXX03_LANG 5535528600c4SEric Fiselierenum class pointer_safety : unsigned char { 5536528600c4SEric Fiselier relaxed, 5537528600c4SEric Fiselier preferred, 5538528600c4SEric Fiselier strict 5539528600c4SEric Fiselier}; 5540528600c4SEric Fiselier# endif 5541528600c4SEric Fiselier#else 55426e41256fSHoward Hinnantstruct _LIBCPP_TYPE_VIS pointer_safety 55433e519524SHoward Hinnant{ 554454d333a6SHoward Hinnant enum __lx 55453e519524SHoward Hinnant { 55463e519524SHoward Hinnant relaxed, 55473e519524SHoward Hinnant preferred, 55483e519524SHoward Hinnant strict 55493e519524SHoward Hinnant }; 55503e519524SHoward Hinnant 555154d333a6SHoward Hinnant __lx __v_; 55523e519524SHoward Hinnant 5553848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 555476a01ea3SEric Fiselier pointer_safety() : __v_() {} 555576a01ea3SEric Fiselier 555676a01ea3SEric Fiselier _LIBCPP_INLINE_VISIBILITY 555754d333a6SHoward Hinnant pointer_safety(__lx __v) : __v_(__v) {} 5558848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 55593e519524SHoward Hinnant operator int() const {return __v_;} 55603e519524SHoward Hinnant}; 5561528600c4SEric Fiselier#endif 5562528600c4SEric Fiselier 5563528600c4SEric Fiselier#if !defined(_LIBCPP_ABI_POINTER_SAFETY_ENUM_TYPE) && \ 5564528600c4SEric Fiselier defined(_LIBCPP_BUILDING_MEMORY) 5565528600c4SEric Fiselier_LIBCPP_FUNC_VIS pointer_safety get_pointer_safety() _NOEXCEPT; 5566528600c4SEric Fiselier#else 5567528600c4SEric Fiselier// This function is only offered in C++03 under ABI v1. 5568528600c4SEric Fiselier# if !defined(_LIBCPP_ABI_POINTER_SAFETY_ENUM_TYPE) || !defined(_LIBCPP_CXX03_LANG) 5569528600c4SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 5570528600c4SEric Fiselierpointer_safety get_pointer_safety() _NOEXCEPT { 5571528600c4SEric Fiselier return pointer_safety::relaxed; 5572528600c4SEric Fiselier} 5573528600c4SEric Fiselier# endif 5574528600c4SEric Fiselier#endif 5575528600c4SEric Fiselier 55763e519524SHoward Hinnant 5577f0544c20SHoward Hinnant_LIBCPP_FUNC_VIS void declare_reachable(void* __p); 5578f0544c20SHoward Hinnant_LIBCPP_FUNC_VIS void declare_no_pointers(char* __p, size_t __n); 5579f0544c20SHoward Hinnant_LIBCPP_FUNC_VIS void undeclare_no_pointers(char* __p, size_t __n); 5580f0544c20SHoward Hinnant_LIBCPP_FUNC_VIS void* __undeclare_reachable(void* __p); 55813e519524SHoward Hinnant 55823e519524SHoward Hinnanttemplate <class _Tp> 55833e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 55843e519524SHoward Hinnant_Tp* 55853e519524SHoward Hinnantundeclare_reachable(_Tp* __p) 55863e519524SHoward Hinnant{ 55873e519524SHoward Hinnant return static_cast<_Tp*>(__undeclare_reachable(__p)); 55883e519524SHoward Hinnant} 55893e519524SHoward Hinnant 5590f0544c20SHoward Hinnant_LIBCPP_FUNC_VIS void* align(size_t __align, size_t __sz, void*& __ptr, size_t& __space); 55913e519524SHoward Hinnant 5592e3fbe143SMarshall Clow// --- Helper for container swap -- 5593e3fbe143SMarshall Clowtemplate <typename _Alloc> 559489dd1dd2SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 5595e3fbe143SMarshall Clowvoid __swap_allocator(_Alloc & __a1, _Alloc & __a2) 5596e3fbe143SMarshall Clow#if _LIBCPP_STD_VER >= 14 5597e3fbe143SMarshall Clow _NOEXCEPT 5598e3fbe143SMarshall Clow#else 5599e3fbe143SMarshall Clow _NOEXCEPT_(__is_nothrow_swappable<_Alloc>::value) 5600e3fbe143SMarshall Clow#endif 5601e3fbe143SMarshall Clow{ 5602e3fbe143SMarshall Clow __swap_allocator(__a1, __a2, 5603e3fbe143SMarshall Clow integral_constant<bool, _VSTD::allocator_traits<_Alloc>::propagate_on_container_swap::value>()); 5604e3fbe143SMarshall Clow} 5605e3fbe143SMarshall Clow 5606e3fbe143SMarshall Clowtemplate <typename _Alloc> 5607e3fbe143SMarshall Clow_LIBCPP_INLINE_VISIBILITY 5608e3fbe143SMarshall Clowvoid __swap_allocator(_Alloc & __a1, _Alloc & __a2, true_type) 5609e3fbe143SMarshall Clow#if _LIBCPP_STD_VER >= 14 5610e3fbe143SMarshall Clow _NOEXCEPT 5611e3fbe143SMarshall Clow#else 5612e3fbe143SMarshall Clow _NOEXCEPT_(__is_nothrow_swappable<_Alloc>::value) 5613e3fbe143SMarshall Clow#endif 5614e3fbe143SMarshall Clow{ 5615e3fbe143SMarshall Clow using _VSTD::swap; 5616e3fbe143SMarshall Clow swap(__a1, __a2); 5617e3fbe143SMarshall Clow} 5618e3fbe143SMarshall Clow 5619e3fbe143SMarshall Clowtemplate <typename _Alloc> 562089dd1dd2SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 5621e3fbe143SMarshall Clowvoid __swap_allocator(_Alloc &, _Alloc &, false_type) _NOEXCEPT {} 5622e3fbe143SMarshall Clow 56231378a5aeSMarshall Clowtemplate <typename _Alloc, typename _Traits=allocator_traits<_Alloc> > 56241378a5aeSMarshall Clowstruct __noexcept_move_assign_container : public integral_constant<bool, 56251378a5aeSMarshall Clow _Traits::propagate_on_container_move_assignment::value 56261378a5aeSMarshall Clow#if _LIBCPP_STD_VER > 14 56271378a5aeSMarshall Clow || _Traits::is_always_equal::value 56281378a5aeSMarshall Clow#else 56291378a5aeSMarshall Clow && is_nothrow_move_assignable<_Alloc>::value 56301378a5aeSMarshall Clow#endif 56311378a5aeSMarshall Clow > {}; 5632e3fbe143SMarshall Clow 5633dc3eb83dSMarshall Clow 5634dc3eb83dSMarshall Clow#ifndef _LIBCPP_HAS_NO_VARIADICS 5635dc3eb83dSMarshall Clowtemplate <class _Tp, class _Alloc> 5636dc3eb83dSMarshall Clowstruct __temp_value { 5637dc3eb83dSMarshall Clow typedef allocator_traits<_Alloc> _Traits; 5638dc3eb83dSMarshall Clow 5639dc3eb83dSMarshall Clow typename aligned_storage<sizeof(_Tp), alignof(_Tp)>::type __v; 5640dc3eb83dSMarshall Clow _Alloc &__a; 5641dc3eb83dSMarshall Clow 5642dc3eb83dSMarshall Clow _Tp *__addr() { return reinterpret_cast<_Tp *>(addressof(__v)); } 5643dc3eb83dSMarshall Clow _Tp & get() { return *__addr(); } 5644dc3eb83dSMarshall Clow 5645dc3eb83dSMarshall Clow template<class... _Args> 5646dc3eb83dSMarshall Clow __temp_value(_Alloc &__alloc, _Args&& ... __args) : __a(__alloc) 5647dc3eb83dSMarshall Clow { _Traits::construct(__a, __addr(), _VSTD::forward<_Args>(__args)...); } 5648dc3eb83dSMarshall Clow 5649dc3eb83dSMarshall Clow ~__temp_value() { _Traits::destroy(__a, __addr()); } 5650dc3eb83dSMarshall Clow }; 5651dc3eb83dSMarshall Clow#endif 5652dc3eb83dSMarshall Clow 56530e22bf8cSMarshall Clow#if _LIBCPP_STD_VER > 14 56540e22bf8cSMarshall Clowtemplate<typename _Alloc, typename = void> 56550e22bf8cSMarshall Clowstruct __is_allocator : false_type {}; 56560e22bf8cSMarshall Clow 56570e22bf8cSMarshall Clowtemplate<typename _Alloc> 56580e22bf8cSMarshall Clowstruct __is_allocator<_Alloc, 56590e22bf8cSMarshall Clow void_t<typename _Alloc::value_type, decltype(_VSTD::declval<_Alloc&>().allocate(size_t{}))>> 56600e22bf8cSMarshall Clow : true_type {}; 56610e22bf8cSMarshall Clow#endif 56620e22bf8cSMarshall Clow 56633e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD 56643e519524SHoward Hinnant 5665a016efb1SEric Fiselier_LIBCPP_POP_MACROS 5666a016efb1SEric Fiselier 56673e519524SHoward Hinnant#endif // _LIBCPP_MEMORY 5668