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 4672720269SLouis Dionne static pointer pointer_to(<details>) noexcept; // constexpr in C++20 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 129e0742c4aSMarshall Clow constexpr allocator() noexcept; // constexpr in C++20 130e0742c4aSMarshall Clow constexpr allocator(const allocator&) noexcept; // constexpr in C++20 131e0742c4aSMarshall Clow template <class U> 132e0742c4aSMarshall Clow constexpr allocator(const allocator<U>&) noexcept; // constexpr in C++20 1333739fe79SHoward Hinnant ~allocator(); 1343739fe79SHoward Hinnant pointer address(reference x) const noexcept; 1353739fe79SHoward Hinnant const_pointer address(const_reference x) const noexcept; 1363e519524SHoward Hinnant pointer allocate(size_type, allocator<void>::const_pointer hint = 0); 1373739fe79SHoward Hinnant void deallocate(pointer p, size_type n) noexcept; 1383739fe79SHoward Hinnant size_type max_size() const noexcept; 1393739fe79SHoward Hinnant template<class U, class... Args> 1403739fe79SHoward Hinnant void construct(U* p, Args&&... args); 1413739fe79SHoward Hinnant template <class U> 1423739fe79SHoward Hinnant void destroy(U* p); 1433e519524SHoward Hinnant}; 1443e519524SHoward Hinnant 1453e519524SHoward Hinnanttemplate <class T, class U> 1463739fe79SHoward Hinnantbool operator==(const allocator<T>&, const allocator<U>&) noexcept; 1473e519524SHoward Hinnant 1483e519524SHoward Hinnanttemplate <class T, class U> 1493739fe79SHoward Hinnantbool operator!=(const allocator<T>&, const allocator<U>&) noexcept; 1503e519524SHoward Hinnant 1513e519524SHoward Hinnanttemplate <class OutputIterator, class T> 1523e519524SHoward Hinnantclass raw_storage_iterator 1533e519524SHoward Hinnant : public iterator<output_iterator_tag, 1543e519524SHoward Hinnant T, // purposefully not C++03 1553e519524SHoward Hinnant ptrdiff_t, // purposefully not C++03 1563e519524SHoward Hinnant T*, // purposefully not C++03 1573e519524SHoward Hinnant raw_storage_iterator&> // purposefully not C++03 1583e519524SHoward Hinnant{ 1593e519524SHoward Hinnantpublic: 1603e519524SHoward Hinnant explicit raw_storage_iterator(OutputIterator x); 1613e519524SHoward Hinnant raw_storage_iterator& operator*(); 1623e519524SHoward Hinnant raw_storage_iterator& operator=(const T& element); 1633e519524SHoward Hinnant raw_storage_iterator& operator++(); 1643e519524SHoward Hinnant raw_storage_iterator operator++(int); 1653e519524SHoward Hinnant}; 1663e519524SHoward Hinnant 1673739fe79SHoward Hinnanttemplate <class T> pair<T*,ptrdiff_t> get_temporary_buffer(ptrdiff_t n) noexcept; 1683739fe79SHoward Hinnanttemplate <class T> void return_temporary_buffer(T* p) noexcept; 1693739fe79SHoward Hinnant 1703739fe79SHoward Hinnanttemplate <class T> T* addressof(T& r) noexcept; 1711c7fe126SMarshall Clowtemplate <class T> T* addressof(const T&& r) noexcept = delete; 1723e519524SHoward Hinnant 1733e519524SHoward Hinnanttemplate <class InputIterator, class ForwardIterator> 1743e519524SHoward HinnantForwardIterator 1753e519524SHoward Hinnantuninitialized_copy(InputIterator first, InputIterator last, ForwardIterator result); 1763e519524SHoward Hinnant 1773739fe79SHoward Hinnanttemplate <class InputIterator, class Size, class ForwardIterator> 1783739fe79SHoward HinnantForwardIterator 1793739fe79SHoward Hinnantuninitialized_copy_n(InputIterator first, Size n, ForwardIterator result); 1803739fe79SHoward Hinnant 1813e519524SHoward Hinnanttemplate <class ForwardIterator, class T> 1823e519524SHoward Hinnantvoid uninitialized_fill(ForwardIterator first, ForwardIterator last, const T& x); 1833e519524SHoward Hinnant 1843e519524SHoward Hinnanttemplate <class ForwardIterator, class Size, class T> 18548d05bd2SHoward HinnantForwardIterator 18648d05bd2SHoward Hinnantuninitialized_fill_n(ForwardIterator first, Size n, const T& x); 1873e519524SHoward Hinnant 188e4d9c316SEric Fiseliertemplate <class T> 189e4d9c316SEric Fiseliervoid destroy_at(T* location); 190e4d9c316SEric Fiselier 191e4d9c316SEric Fiseliertemplate <class ForwardIterator> 192e4d9c316SEric Fiselier void destroy(ForwardIterator first, ForwardIterator last); 193e4d9c316SEric Fiselier 194e4d9c316SEric Fiseliertemplate <class ForwardIterator, class Size> 195e4d9c316SEric Fiselier ForwardIterator destroy_n(ForwardIterator first, Size n); 196e4d9c316SEric Fiselier 197e4d9c316SEric Fiseliertemplate <class InputIterator, class ForwardIterator> 198e4d9c316SEric Fiselier ForwardIterator uninitialized_move(InputIterator first, InputIterator last, ForwardIterator result); 199e4d9c316SEric Fiselier 200e4d9c316SEric Fiseliertemplate <class InputIterator, class Size, class ForwardIterator> 201e4d9c316SEric Fiselier pair<InputIterator,ForwardIterator> uninitialized_move_n(InputIterator first, Size n, ForwardIterator result); 202e4d9c316SEric Fiselier 203e4d9c316SEric Fiseliertemplate <class ForwardIterator> 204e4d9c316SEric Fiselier void uninitialized_value_construct(ForwardIterator first, ForwardIterator last); 205e4d9c316SEric Fiselier 206e4d9c316SEric Fiseliertemplate <class ForwardIterator, class Size> 207e4d9c316SEric Fiselier ForwardIterator uninitialized_value_construct_n(ForwardIterator first, Size n); 208e4d9c316SEric Fiselier 209e4d9c316SEric Fiseliertemplate <class ForwardIterator> 210e4d9c316SEric Fiselier void uninitialized_default_construct(ForwardIterator first, ForwardIterator last); 211e4d9c316SEric Fiselier 212e4d9c316SEric Fiseliertemplate <class ForwardIterator, class Size> 213e4d9c316SEric Fiselier ForwardIterator uninitialized_default_construct_n(ForwardIterator first, Size n); 214e4d9c316SEric Fiselier 215ea5cd3b4SLouis Dionnetemplate <class Y> struct auto_ptr_ref {}; // deprecated in C++11, removed in C++17 2163e519524SHoward Hinnant 2173e519524SHoward Hinnanttemplate<class X> 218ea5cd3b4SLouis Dionneclass auto_ptr // deprecated in C++11, removed in C++17 2193e519524SHoward Hinnant{ 2203e519524SHoward Hinnantpublic: 2213e519524SHoward Hinnant typedef X element_type; 2223e519524SHoward Hinnant 2233e519524SHoward Hinnant explicit auto_ptr(X* p =0) throw(); 2243e519524SHoward Hinnant auto_ptr(auto_ptr&) throw(); 2253e519524SHoward Hinnant template<class Y> auto_ptr(auto_ptr<Y>&) throw(); 2263e519524SHoward Hinnant auto_ptr& operator=(auto_ptr&) throw(); 2273e519524SHoward Hinnant template<class Y> auto_ptr& operator=(auto_ptr<Y>&) throw(); 2283e519524SHoward Hinnant auto_ptr& operator=(auto_ptr_ref<X> r) throw(); 2293e519524SHoward Hinnant ~auto_ptr() throw(); 2303e519524SHoward Hinnant 2313e519524SHoward Hinnant typename add_lvalue_reference<X>::type operator*() const throw(); 2323e519524SHoward Hinnant X* operator->() const throw(); 2333e519524SHoward Hinnant X* get() const throw(); 2343e519524SHoward Hinnant X* release() throw(); 2353e519524SHoward Hinnant void reset(X* p =0) throw(); 2363e519524SHoward Hinnant 2373e519524SHoward Hinnant auto_ptr(auto_ptr_ref<X>) throw(); 2383e519524SHoward Hinnant template<class Y> operator auto_ptr_ref<Y>() throw(); 2393e519524SHoward Hinnant template<class Y> operator auto_ptr<Y>() throw(); 2403e519524SHoward Hinnant}; 2413e519524SHoward Hinnant 24220cc2a42SHoward Hinnanttemplate <class T> 24320cc2a42SHoward Hinnantstruct default_delete 24420cc2a42SHoward Hinnant{ 2453739fe79SHoward Hinnant constexpr default_delete() noexcept = default; 2463739fe79SHoward Hinnant template <class U> default_delete(const default_delete<U>&) noexcept; 24720cc2a42SHoward Hinnant 2483739fe79SHoward Hinnant void operator()(T*) const noexcept; 24920cc2a42SHoward Hinnant}; 25020cc2a42SHoward Hinnant 25120cc2a42SHoward Hinnanttemplate <class T> 25220cc2a42SHoward Hinnantstruct default_delete<T[]> 25320cc2a42SHoward Hinnant{ 2543739fe79SHoward Hinnant constexpr default_delete() noexcept = default; 2553739fe79SHoward Hinnant void operator()(T*) const noexcept; 25620cc2a42SHoward Hinnant template <class U> void operator()(U*) const = delete; 25720cc2a42SHoward Hinnant}; 25820cc2a42SHoward Hinnant 25920cc2a42SHoward Hinnanttemplate <class T, class D = default_delete<T>> 26020cc2a42SHoward Hinnantclass unique_ptr 26120cc2a42SHoward Hinnant{ 26220cc2a42SHoward Hinnantpublic: 26320cc2a42SHoward Hinnant typedef see below pointer; 26420cc2a42SHoward Hinnant typedef T element_type; 26520cc2a42SHoward Hinnant typedef D deleter_type; 26620cc2a42SHoward Hinnant 26720cc2a42SHoward Hinnant // constructors 2683739fe79SHoward Hinnant constexpr unique_ptr() noexcept; 2693739fe79SHoward Hinnant explicit unique_ptr(pointer p) noexcept; 2703739fe79SHoward Hinnant unique_ptr(pointer p, see below d1) noexcept; 2713739fe79SHoward Hinnant unique_ptr(pointer p, see below d2) noexcept; 2723739fe79SHoward Hinnant unique_ptr(unique_ptr&& u) noexcept; 2733739fe79SHoward Hinnant unique_ptr(nullptr_t) noexcept : unique_ptr() { } 27420cc2a42SHoward Hinnant template <class U, class E> 2753739fe79SHoward Hinnant unique_ptr(unique_ptr<U, E>&& u) noexcept; 27620cc2a42SHoward Hinnant template <class U> 277e67179bcSMarshall Clow unique_ptr(auto_ptr<U>&& u) noexcept; // removed in C++17 27820cc2a42SHoward Hinnant 27920cc2a42SHoward Hinnant // destructor 28020cc2a42SHoward Hinnant ~unique_ptr(); 28120cc2a42SHoward Hinnant 28220cc2a42SHoward Hinnant // assignment 2833739fe79SHoward Hinnant unique_ptr& operator=(unique_ptr&& u) noexcept; 2843739fe79SHoward Hinnant template <class U, class E> unique_ptr& operator=(unique_ptr<U, E>&& u) noexcept; 2853739fe79SHoward Hinnant unique_ptr& operator=(nullptr_t) noexcept; 28620cc2a42SHoward Hinnant 28720cc2a42SHoward Hinnant // observers 28820cc2a42SHoward Hinnant typename add_lvalue_reference<T>::type operator*() const; 2893739fe79SHoward Hinnant pointer operator->() const noexcept; 2903739fe79SHoward Hinnant pointer get() const noexcept; 2913739fe79SHoward Hinnant deleter_type& get_deleter() noexcept; 2923739fe79SHoward Hinnant const deleter_type& get_deleter() const noexcept; 2933739fe79SHoward Hinnant explicit operator bool() const noexcept; 29420cc2a42SHoward Hinnant 29520cc2a42SHoward Hinnant // modifiers 2963739fe79SHoward Hinnant pointer release() noexcept; 2973739fe79SHoward Hinnant void reset(pointer p = pointer()) noexcept; 2983739fe79SHoward Hinnant void swap(unique_ptr& u) noexcept; 29920cc2a42SHoward Hinnant}; 30020cc2a42SHoward Hinnant 30120cc2a42SHoward Hinnanttemplate <class T, class D> 30220cc2a42SHoward Hinnantclass unique_ptr<T[], D> 30320cc2a42SHoward Hinnant{ 30420cc2a42SHoward Hinnantpublic: 30520cc2a42SHoward Hinnant typedef implementation-defined pointer; 30620cc2a42SHoward Hinnant typedef T element_type; 30720cc2a42SHoward Hinnant typedef D deleter_type; 30820cc2a42SHoward Hinnant 30920cc2a42SHoward Hinnant // constructors 3103739fe79SHoward Hinnant constexpr unique_ptr() noexcept; 3113739fe79SHoward Hinnant explicit unique_ptr(pointer p) noexcept; 3123739fe79SHoward Hinnant unique_ptr(pointer p, see below d) noexcept; 3133739fe79SHoward Hinnant unique_ptr(pointer p, see below d) noexcept; 3143739fe79SHoward Hinnant unique_ptr(unique_ptr&& u) noexcept; 3153739fe79SHoward Hinnant unique_ptr(nullptr_t) noexcept : unique_ptr() { } 31620cc2a42SHoward Hinnant 31720cc2a42SHoward Hinnant // destructor 318b3371f6fSHoward Hinnant ~unique_ptr(); 31920cc2a42SHoward Hinnant 32020cc2a42SHoward Hinnant // assignment 3213739fe79SHoward Hinnant unique_ptr& operator=(unique_ptr&& u) noexcept; 3223739fe79SHoward Hinnant unique_ptr& operator=(nullptr_t) noexcept; 32320cc2a42SHoward Hinnant 32420cc2a42SHoward Hinnant // observers 32520cc2a42SHoward Hinnant T& operator[](size_t i) const; 3263739fe79SHoward Hinnant pointer get() const noexcept; 3273739fe79SHoward Hinnant deleter_type& get_deleter() noexcept; 3283739fe79SHoward Hinnant const deleter_type& get_deleter() const noexcept; 3293739fe79SHoward Hinnant explicit operator bool() const noexcept; 33020cc2a42SHoward Hinnant 33120cc2a42SHoward Hinnant // modifiers 3323739fe79SHoward Hinnant pointer release() noexcept; 3333739fe79SHoward Hinnant void reset(pointer p = pointer()) noexcept; 3343739fe79SHoward Hinnant void reset(nullptr_t) noexcept; 33520cc2a42SHoward Hinnant template <class U> void reset(U) = delete; 3363739fe79SHoward Hinnant void swap(unique_ptr& u) noexcept; 33720cc2a42SHoward Hinnant}; 33820cc2a42SHoward Hinnant 33920cc2a42SHoward Hinnanttemplate <class T, class D> 3403739fe79SHoward Hinnant void swap(unique_ptr<T, D>& x, unique_ptr<T, D>& y) noexcept; 34120cc2a42SHoward Hinnant 34220cc2a42SHoward Hinnanttemplate <class T1, class D1, class T2, class D2> 34320cc2a42SHoward Hinnant bool operator==(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 34420cc2a42SHoward Hinnanttemplate <class T1, class D1, class T2, class D2> 34520cc2a42SHoward Hinnant bool operator!=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 34620cc2a42SHoward Hinnanttemplate <class T1, class D1, class T2, class D2> 34720cc2a42SHoward Hinnant bool operator<(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 34820cc2a42SHoward Hinnanttemplate <class T1, class D1, class T2, class D2> 34920cc2a42SHoward Hinnant bool operator<=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 35020cc2a42SHoward Hinnanttemplate <class T1, class D1, class T2, class D2> 35120cc2a42SHoward Hinnant bool operator>(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 35220cc2a42SHoward Hinnanttemplate <class T1, class D1, class T2, class D2> 35320cc2a42SHoward Hinnant bool operator>=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 35420cc2a42SHoward Hinnant 3553739fe79SHoward Hinnanttemplate <class T, class D> 3563739fe79SHoward Hinnant bool operator==(const unique_ptr<T, D>& x, nullptr_t) noexcept; 3573739fe79SHoward Hinnanttemplate <class T, class D> 3583739fe79SHoward Hinnant bool operator==(nullptr_t, const unique_ptr<T, D>& y) noexcept; 3593739fe79SHoward Hinnanttemplate <class T, class D> 3603739fe79SHoward Hinnant bool operator!=(const unique_ptr<T, D>& x, nullptr_t) noexcept; 3613739fe79SHoward Hinnanttemplate <class T, class D> 3623739fe79SHoward Hinnant bool operator!=(nullptr_t, const unique_ptr<T, D>& y) noexcept; 3633739fe79SHoward Hinnant 3643739fe79SHoward Hinnanttemplate <class T, class D> 3653739fe79SHoward Hinnant bool operator<(const unique_ptr<T, D>& x, nullptr_t); 3663739fe79SHoward Hinnanttemplate <class T, class D> 3673739fe79SHoward Hinnant bool operator<(nullptr_t, const unique_ptr<T, D>& y); 3683739fe79SHoward Hinnanttemplate <class T, class D> 3693739fe79SHoward Hinnant bool operator<=(const unique_ptr<T, D>& x, nullptr_t); 3703739fe79SHoward Hinnanttemplate <class T, class D> 3713739fe79SHoward Hinnant bool operator<=(nullptr_t, const unique_ptr<T, D>& y); 3723739fe79SHoward Hinnanttemplate <class T, class D> 3733739fe79SHoward Hinnant bool operator>(const unique_ptr<T, D>& x, nullptr_t); 3743739fe79SHoward Hinnanttemplate <class T, class D> 3753739fe79SHoward Hinnant bool operator>(nullptr_t, const unique_ptr<T, D>& y); 3763739fe79SHoward Hinnanttemplate <class T, class D> 3773739fe79SHoward Hinnant bool operator>=(const unique_ptr<T, D>& x, nullptr_t); 3783739fe79SHoward Hinnanttemplate <class T, class D> 3793739fe79SHoward Hinnant bool operator>=(nullptr_t, const unique_ptr<T, D>& y); 3803739fe79SHoward Hinnant 38120cc2a42SHoward Hinnantclass bad_weak_ptr 38220cc2a42SHoward Hinnant : public std::exception 38320cc2a42SHoward Hinnant{ 3843739fe79SHoward Hinnant bad_weak_ptr() noexcept; 38520cc2a42SHoward Hinnant}; 38620cc2a42SHoward Hinnant 38728d8ba5fSMarshall Clowtemplate<class T, class... Args> unique_ptr<T> make_unique(Args&&... args); // C++14 38828d8ba5fSMarshall Clowtemplate<class T> unique_ptr<T> make_unique(size_t n); // C++14 38928d8ba5fSMarshall Clowtemplate<class T, class... Args> unspecified make_unique(Args&&...) = delete; // C++14, T == U[N] 39028d8ba5fSMarshall Clow 39148f36539SMarshall Clowtemplate<class E, class T, class Y, class D> 39248f36539SMarshall Clow basic_ostream<E, T>& operator<< (basic_ostream<E, T>& os, unique_ptr<Y, D> const& p); 39348f36539SMarshall Clow 39420cc2a42SHoward Hinnanttemplate<class T> 39520cc2a42SHoward Hinnantclass shared_ptr 39620cc2a42SHoward Hinnant{ 39720cc2a42SHoward Hinnantpublic: 39820cc2a42SHoward Hinnant typedef T element_type; 39968436a9bSEric Fiselier typedef weak_ptr<T> weak_type; // C++17 40020cc2a42SHoward Hinnant 40120cc2a42SHoward Hinnant // constructors: 4023739fe79SHoward Hinnant constexpr shared_ptr() noexcept; 40320cc2a42SHoward Hinnant template<class Y> explicit shared_ptr(Y* p); 40420cc2a42SHoward Hinnant template<class Y, class D> shared_ptr(Y* p, D d); 40520cc2a42SHoward Hinnant template<class Y, class D, class A> shared_ptr(Y* p, D d, A a); 40620cc2a42SHoward Hinnant template <class D> shared_ptr(nullptr_t p, D d); 40720cc2a42SHoward Hinnant template <class D, class A> shared_ptr(nullptr_t p, D d, A a); 4083739fe79SHoward Hinnant template<class Y> shared_ptr(const shared_ptr<Y>& r, T *p) noexcept; 4093739fe79SHoward Hinnant shared_ptr(const shared_ptr& r) noexcept; 4103739fe79SHoward Hinnant template<class Y> shared_ptr(const shared_ptr<Y>& r) noexcept; 4113739fe79SHoward Hinnant shared_ptr(shared_ptr&& r) noexcept; 4123739fe79SHoward Hinnant template<class Y> shared_ptr(shared_ptr<Y>&& r) noexcept; 41320cc2a42SHoward Hinnant template<class Y> explicit shared_ptr(const weak_ptr<Y>& r); 414e67179bcSMarshall Clow template<class Y> shared_ptr(auto_ptr<Y>&& r); // removed in C++17 41520cc2a42SHoward Hinnant template <class Y, class D> shared_ptr(unique_ptr<Y, D>&& r); 41620cc2a42SHoward Hinnant shared_ptr(nullptr_t) : shared_ptr() { } 41720cc2a42SHoward Hinnant 41820cc2a42SHoward Hinnant // destructor: 41920cc2a42SHoward Hinnant ~shared_ptr(); 42020cc2a42SHoward Hinnant 42120cc2a42SHoward Hinnant // assignment: 4223739fe79SHoward Hinnant shared_ptr& operator=(const shared_ptr& r) noexcept; 4233739fe79SHoward Hinnant template<class Y> shared_ptr& operator=(const shared_ptr<Y>& r) noexcept; 4243739fe79SHoward Hinnant shared_ptr& operator=(shared_ptr&& r) noexcept; 42520cc2a42SHoward Hinnant template<class Y> shared_ptr& operator=(shared_ptr<Y>&& r); 426e67179bcSMarshall Clow template<class Y> shared_ptr& operator=(auto_ptr<Y>&& r); // removed in C++17 42720cc2a42SHoward Hinnant template <class Y, class D> shared_ptr& operator=(unique_ptr<Y, D>&& r); 42820cc2a42SHoward Hinnant 42920cc2a42SHoward Hinnant // modifiers: 4303739fe79SHoward Hinnant void swap(shared_ptr& r) noexcept; 4313739fe79SHoward Hinnant void reset() noexcept; 43220cc2a42SHoward Hinnant template<class Y> void reset(Y* p); 43320cc2a42SHoward Hinnant template<class Y, class D> void reset(Y* p, D d); 43420cc2a42SHoward Hinnant template<class Y, class D, class A> void reset(Y* p, D d, A a); 43520cc2a42SHoward Hinnant 4363739fe79SHoward Hinnant // observers: 4373739fe79SHoward Hinnant T* get() const noexcept; 4383739fe79SHoward Hinnant T& operator*() const noexcept; 4393739fe79SHoward Hinnant T* operator->() const noexcept; 4403739fe79SHoward Hinnant long use_count() const noexcept; 4413739fe79SHoward Hinnant bool unique() const noexcept; 4423739fe79SHoward Hinnant explicit operator bool() const noexcept; 44336bc7178SMarshall Clow template<class U> bool owner_before(shared_ptr<U> const& b) const noexcept; 44436bc7178SMarshall Clow template<class U> bool owner_before(weak_ptr<U> const& b) const noexcept; 44520cc2a42SHoward Hinnant}; 44620cc2a42SHoward Hinnant 44720cc2a42SHoward Hinnant// shared_ptr comparisons: 44820cc2a42SHoward Hinnanttemplate<class T, class U> 4493739fe79SHoward Hinnant bool operator==(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; 45020cc2a42SHoward Hinnanttemplate<class T, class U> 4513739fe79SHoward Hinnant bool operator!=(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; 45220cc2a42SHoward Hinnanttemplate<class T, class U> 4533739fe79SHoward Hinnant bool operator<(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; 45420cc2a42SHoward Hinnanttemplate<class T, class U> 4553739fe79SHoward Hinnant bool operator>(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; 45620cc2a42SHoward Hinnanttemplate<class T, class U> 4573739fe79SHoward Hinnant bool operator<=(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; 45820cc2a42SHoward Hinnanttemplate<class T, class U> 4593739fe79SHoward Hinnant bool operator>=(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; 4603739fe79SHoward Hinnant 4613739fe79SHoward Hinnanttemplate <class T> 4623739fe79SHoward Hinnant bool operator==(const shared_ptr<T>& x, nullptr_t) noexcept; 4633739fe79SHoward Hinnanttemplate <class T> 4643739fe79SHoward Hinnant bool operator==(nullptr_t, const shared_ptr<T>& y) noexcept; 4653739fe79SHoward Hinnanttemplate <class T> 4663739fe79SHoward Hinnant bool operator!=(const shared_ptr<T>& x, nullptr_t) noexcept; 4673739fe79SHoward Hinnanttemplate <class T> 4683739fe79SHoward Hinnant bool operator!=(nullptr_t, const shared_ptr<T>& y) noexcept; 4693739fe79SHoward Hinnanttemplate <class T> 4703739fe79SHoward Hinnant bool operator<(const shared_ptr<T>& x, nullptr_t) noexcept; 4713739fe79SHoward Hinnanttemplate <class T> 4723739fe79SHoward Hinnantbool operator<(nullptr_t, const shared_ptr<T>& y) noexcept; 4733739fe79SHoward Hinnanttemplate <class T> 4743739fe79SHoward Hinnant bool operator<=(const shared_ptr<T>& x, nullptr_t) noexcept; 4753739fe79SHoward Hinnanttemplate <class T> 4763739fe79SHoward Hinnant bool operator<=(nullptr_t, const shared_ptr<T>& y) noexcept; 4773739fe79SHoward Hinnanttemplate <class T> 4783739fe79SHoward Hinnant bool operator>(const shared_ptr<T>& x, nullptr_t) noexcept; 4793739fe79SHoward Hinnanttemplate <class T> 4803739fe79SHoward Hinnant bool operator>(nullptr_t, const shared_ptr<T>& y) noexcept; 4813739fe79SHoward Hinnanttemplate <class T> 4823739fe79SHoward Hinnant bool operator>=(const shared_ptr<T>& x, nullptr_t) noexcept; 4833739fe79SHoward Hinnanttemplate <class T> 4843739fe79SHoward Hinnant bool operator>=(nullptr_t, const shared_ptr<T>& y) noexcept; 48520cc2a42SHoward Hinnant 48620cc2a42SHoward Hinnant// shared_ptr specialized algorithms: 4873739fe79SHoward Hinnanttemplate<class T> void swap(shared_ptr<T>& a, shared_ptr<T>& b) noexcept; 48820cc2a42SHoward Hinnant 48920cc2a42SHoward Hinnant// shared_ptr casts: 49020cc2a42SHoward Hinnanttemplate<class T, class U> 4913739fe79SHoward Hinnant shared_ptr<T> static_pointer_cast(shared_ptr<U> const& r) noexcept; 49220cc2a42SHoward Hinnanttemplate<class T, class U> 4933739fe79SHoward Hinnant shared_ptr<T> dynamic_pointer_cast(shared_ptr<U> const& r) noexcept; 49420cc2a42SHoward Hinnanttemplate<class T, class U> 4953739fe79SHoward Hinnant shared_ptr<T> const_pointer_cast(shared_ptr<U> const& r) noexcept; 49620cc2a42SHoward Hinnant 49720cc2a42SHoward Hinnant// shared_ptr I/O: 49820cc2a42SHoward Hinnanttemplate<class E, class T, class Y> 49920cc2a42SHoward Hinnant basic_ostream<E, T>& operator<< (basic_ostream<E, T>& os, shared_ptr<Y> const& p); 50020cc2a42SHoward Hinnant 50120cc2a42SHoward Hinnant// shared_ptr get_deleter: 5023739fe79SHoward Hinnanttemplate<class D, class T> D* get_deleter(shared_ptr<T> const& p) noexcept; 50320cc2a42SHoward Hinnant 50420cc2a42SHoward Hinnanttemplate<class T, class... Args> 50520cc2a42SHoward Hinnant shared_ptr<T> make_shared(Args&&... args); 50620cc2a42SHoward Hinnanttemplate<class T, class A, class... Args> 50720cc2a42SHoward Hinnant shared_ptr<T> allocate_shared(const A& a, Args&&... args); 50820cc2a42SHoward Hinnant 50920cc2a42SHoward Hinnanttemplate<class T> 51020cc2a42SHoward Hinnantclass weak_ptr 51120cc2a42SHoward Hinnant{ 51220cc2a42SHoward Hinnantpublic: 51320cc2a42SHoward Hinnant typedef T element_type; 51420cc2a42SHoward Hinnant 51520cc2a42SHoward Hinnant // constructors 5163739fe79SHoward Hinnant constexpr weak_ptr() noexcept; 5173739fe79SHoward Hinnant template<class Y> weak_ptr(shared_ptr<Y> const& r) noexcept; 5183739fe79SHoward Hinnant weak_ptr(weak_ptr const& r) noexcept; 5193739fe79SHoward Hinnant template<class Y> weak_ptr(weak_ptr<Y> const& r) noexcept; 5204703f763SMarshall Clow weak_ptr(weak_ptr&& r) noexcept; // C++14 5214703f763SMarshall Clow template<class Y> weak_ptr(weak_ptr<Y>&& r) noexcept; // C++14 52220cc2a42SHoward Hinnant 52320cc2a42SHoward Hinnant // destructor 52420cc2a42SHoward Hinnant ~weak_ptr(); 52520cc2a42SHoward Hinnant 52620cc2a42SHoward Hinnant // assignment 5273739fe79SHoward Hinnant weak_ptr& operator=(weak_ptr const& r) noexcept; 5283739fe79SHoward Hinnant template<class Y> weak_ptr& operator=(weak_ptr<Y> const& r) noexcept; 5293739fe79SHoward Hinnant template<class Y> weak_ptr& operator=(shared_ptr<Y> const& r) noexcept; 5304703f763SMarshall Clow weak_ptr& operator=(weak_ptr&& r) noexcept; // C++14 5314703f763SMarshall Clow template<class Y> weak_ptr& operator=(weak_ptr<Y>&& r) noexcept; // C++14 53220cc2a42SHoward Hinnant 53320cc2a42SHoward Hinnant // modifiers 5343739fe79SHoward Hinnant void swap(weak_ptr& r) noexcept; 5353739fe79SHoward Hinnant void reset() noexcept; 53620cc2a42SHoward Hinnant 53720cc2a42SHoward Hinnant // observers 5383739fe79SHoward Hinnant long use_count() const noexcept; 5393739fe79SHoward Hinnant bool expired() const noexcept; 5403739fe79SHoward Hinnant shared_ptr<T> lock() const noexcept; 54136bc7178SMarshall Clow template<class U> bool owner_before(shared_ptr<U> const& b) const noexcept; 54236bc7178SMarshall Clow template<class U> bool owner_before(weak_ptr<U> const& b) const noexcept; 54320cc2a42SHoward Hinnant}; 54420cc2a42SHoward Hinnant 54520cc2a42SHoward Hinnant// weak_ptr specialized algorithms: 5463739fe79SHoward Hinnanttemplate<class T> void swap(weak_ptr<T>& a, weak_ptr<T>& b) noexcept; 54720cc2a42SHoward Hinnant 54820cc2a42SHoward Hinnant// class owner_less: 54920cc2a42SHoward Hinnanttemplate<class T> struct owner_less; 55020cc2a42SHoward Hinnant 55120cc2a42SHoward Hinnanttemplate<class T> 55220cc2a42SHoward Hinnantstruct owner_less<shared_ptr<T>> 55320cc2a42SHoward Hinnant : binary_function<shared_ptr<T>, shared_ptr<T>, bool> 55420cc2a42SHoward Hinnant{ 55520cc2a42SHoward Hinnant typedef bool result_type; 55636bc7178SMarshall Clow bool operator()(shared_ptr<T> const&, shared_ptr<T> const&) const noexcept; 55736bc7178SMarshall Clow bool operator()(shared_ptr<T> const&, weak_ptr<T> const&) const noexcept; 55836bc7178SMarshall Clow bool operator()(weak_ptr<T> const&, shared_ptr<T> const&) const noexcept; 55920cc2a42SHoward Hinnant}; 56020cc2a42SHoward Hinnant 56120cc2a42SHoward Hinnanttemplate<class T> 56220cc2a42SHoward Hinnantstruct owner_less<weak_ptr<T>> 56320cc2a42SHoward Hinnant : binary_function<weak_ptr<T>, weak_ptr<T>, bool> 56420cc2a42SHoward Hinnant{ 56520cc2a42SHoward Hinnant typedef bool result_type; 56636bc7178SMarshall Clow bool operator()(weak_ptr<T> const&, weak_ptr<T> const&) const noexcept; 56736bc7178SMarshall Clow bool operator()(shared_ptr<T> const&, weak_ptr<T> const&) const noexcept; 56836bc7178SMarshall Clow bool operator()(weak_ptr<T> const&, shared_ptr<T> const&) const noexcept; 56936bc7178SMarshall Clow}; 57036bc7178SMarshall Clow 57136bc7178SMarshall Clowtemplate <> // Added in C++14 57236bc7178SMarshall Clowstruct owner_less<void> 57336bc7178SMarshall Clow{ 57436bc7178SMarshall Clow template <class _Tp, class _Up> 57536bc7178SMarshall Clow bool operator()( shared_ptr<_Tp> const& __x, shared_ptr<_Up> const& __y) const noexcept; 57636bc7178SMarshall Clow template <class _Tp, class _Up> 57736bc7178SMarshall Clow bool operator()( shared_ptr<_Tp> const& __x, weak_ptr<_Up> const& __y) const noexcept; 57836bc7178SMarshall Clow template <class _Tp, class _Up> 57936bc7178SMarshall Clow bool operator()( weak_ptr<_Tp> const& __x, shared_ptr<_Up> const& __y) const noexcept; 58036bc7178SMarshall Clow template <class _Tp, class _Up> 58136bc7178SMarshall Clow bool operator()( weak_ptr<_Tp> const& __x, weak_ptr<_Up> const& __y) const noexcept; 58236bc7178SMarshall Clow 58336bc7178SMarshall Clow typedef void is_transparent; 58420cc2a42SHoward Hinnant}; 58520cc2a42SHoward Hinnant 58620cc2a42SHoward Hinnanttemplate<class T> 58720cc2a42SHoward Hinnantclass enable_shared_from_this 58820cc2a42SHoward Hinnant{ 58920cc2a42SHoward Hinnantprotected: 5903739fe79SHoward Hinnant constexpr enable_shared_from_this() noexcept; 5913739fe79SHoward Hinnant enable_shared_from_this(enable_shared_from_this const&) noexcept; 5923739fe79SHoward Hinnant enable_shared_from_this& operator=(enable_shared_from_this const&) noexcept; 59320cc2a42SHoward Hinnant ~enable_shared_from_this(); 59420cc2a42SHoward Hinnantpublic: 59520cc2a42SHoward Hinnant shared_ptr<T> shared_from_this(); 59620cc2a42SHoward Hinnant shared_ptr<T const> shared_from_this() const; 59720cc2a42SHoward Hinnant}; 59820cc2a42SHoward Hinnant 59920cc2a42SHoward Hinnanttemplate<class T> 60020cc2a42SHoward Hinnant bool atomic_is_lock_free(const shared_ptr<T>* p); 60120cc2a42SHoward Hinnanttemplate<class T> 60220cc2a42SHoward Hinnant shared_ptr<T> atomic_load(const shared_ptr<T>* p); 60320cc2a42SHoward Hinnanttemplate<class T> 60420cc2a42SHoward Hinnant shared_ptr<T> atomic_load_explicit(const shared_ptr<T>* p, memory_order mo); 60520cc2a42SHoward Hinnanttemplate<class T> 60620cc2a42SHoward Hinnant void atomic_store(shared_ptr<T>* p, shared_ptr<T> r); 60720cc2a42SHoward Hinnanttemplate<class T> 60820cc2a42SHoward Hinnant void atomic_store_explicit(shared_ptr<T>* p, shared_ptr<T> r, memory_order mo); 60920cc2a42SHoward Hinnanttemplate<class T> 61020cc2a42SHoward Hinnant shared_ptr<T> atomic_exchange(shared_ptr<T>* p, shared_ptr<T> r); 61120cc2a42SHoward Hinnanttemplate<class T> 61220cc2a42SHoward Hinnant shared_ptr<T> 61320cc2a42SHoward Hinnant atomic_exchange_explicit(shared_ptr<T>* p, shared_ptr<T> r, memory_order mo); 61420cc2a42SHoward Hinnanttemplate<class T> 61520cc2a42SHoward Hinnant bool 61620cc2a42SHoward Hinnant atomic_compare_exchange_weak(shared_ptr<T>* p, shared_ptr<T>* v, shared_ptr<T> w); 61720cc2a42SHoward Hinnanttemplate<class T> 61820cc2a42SHoward Hinnant bool 61920cc2a42SHoward Hinnant atomic_compare_exchange_strong( shared_ptr<T>* p, shared_ptr<T>* v, shared_ptr<T> w); 62020cc2a42SHoward Hinnanttemplate<class T> 62120cc2a42SHoward Hinnant bool 62220cc2a42SHoward Hinnant atomic_compare_exchange_weak_explicit(shared_ptr<T>* p, shared_ptr<T>* v, 62320cc2a42SHoward Hinnant shared_ptr<T> w, memory_order success, 62420cc2a42SHoward Hinnant memory_order failure); 62520cc2a42SHoward Hinnanttemplate<class T> 62620cc2a42SHoward Hinnant bool 62720cc2a42SHoward Hinnant atomic_compare_exchange_strong_explicit(shared_ptr<T>* p, shared_ptr<T>* v, 62820cc2a42SHoward Hinnant shared_ptr<T> w, memory_order success, 62920cc2a42SHoward Hinnant memory_order failure); 63020cc2a42SHoward Hinnant// Hash support 63120cc2a42SHoward Hinnanttemplate <class T> struct hash; 63220cc2a42SHoward Hinnanttemplate <class T, class D> struct hash<unique_ptr<T, D> >; 63320cc2a42SHoward Hinnanttemplate <class T> struct hash<shared_ptr<T> >; 63420cc2a42SHoward Hinnant 63540a01d53SMarshall Clowtemplate <class T, class Alloc> 63640a01d53SMarshall Clow inline constexpr bool uses_allocator_v = uses_allocator<T, Alloc>::value; 63740a01d53SMarshall Clow 63820cc2a42SHoward Hinnant// Pointer safety 63920cc2a42SHoward Hinnantenum class pointer_safety { relaxed, preferred, strict }; 64020cc2a42SHoward Hinnantvoid declare_reachable(void *p); 64120cc2a42SHoward Hinnanttemplate <class T> T *undeclare_reachable(T *p); 64220cc2a42SHoward Hinnantvoid declare_no_pointers(char *p, size_t n); 64320cc2a42SHoward Hinnantvoid undeclare_no_pointers(char *p, size_t n); 6443739fe79SHoward Hinnantpointer_safety get_pointer_safety() noexcept; 64520cc2a42SHoward Hinnant 6463e519524SHoward Hinnantvoid* align(size_t alignment, size_t size, void*& ptr, size_t& space); 6473e519524SHoward Hinnant 6483e519524SHoward Hinnant} // std 6493e519524SHoward Hinnant 6503e519524SHoward Hinnant*/ 6513e519524SHoward Hinnant 6523e519524SHoward Hinnant#include <__config> 6533e519524SHoward Hinnant#include <type_traits> 6543e519524SHoward Hinnant#include <typeinfo> 6553e519524SHoward Hinnant#include <cstddef> 6563e519524SHoward Hinnant#include <cstdint> 6573e519524SHoward Hinnant#include <new> 6583e519524SHoward Hinnant#include <utility> 6593e519524SHoward Hinnant#include <limits> 6603e519524SHoward Hinnant#include <iterator> 6613e519524SHoward Hinnant#include <__functional_base> 662e3163f5aSHoward Hinnant#include <iosfwd> 663a87b5e34SHoward Hinnant#include <tuple> 6644524d6e7SEric Fiselier#include <stdexcept> 6659741d6c9SHoward Hinnant#include <cstring> 666c88580c4SEric Fiselier#include <cassert> 667749adebaSEric Fiselier#if !defined(_LIBCPP_HAS_NO_ATOMIC_HEADER) 668d77851e8SHoward Hinnant# include <atomic> 669d77851e8SHoward Hinnant#endif 670f56972e2SMarshall Clow#include <version> 671d77851e8SHoward Hinnant 672073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 6733e519524SHoward Hinnant#pragma GCC system_header 674073458b1SHoward Hinnant#endif 6753e519524SHoward Hinnant 676a016efb1SEric Fiselier_LIBCPP_PUSH_MACROS 677a016efb1SEric Fiselier#include <__undef_macros> 678a016efb1SEric Fiselier 679a016efb1SEric Fiselier 6803e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 6813e519524SHoward Hinnant 6821faf289eSEric Fiseliertemplate <class _ValueType> 683dc7200b4SLouis Dionneinline _LIBCPP_INLINE_VISIBILITY 6841faf289eSEric Fiselier_ValueType __libcpp_relaxed_load(_ValueType const* __value) { 6851faf289eSEric Fiselier#if !defined(_LIBCPP_HAS_NO_THREADS) && \ 6861faf289eSEric Fiselier defined(__ATOMIC_RELAXED) && \ 6871faf289eSEric Fiselier (__has_builtin(__atomic_load_n) || _GNUC_VER >= 407) 6881faf289eSEric Fiselier return __atomic_load_n(__value, __ATOMIC_RELAXED); 6891faf289eSEric Fiselier#else 6901faf289eSEric Fiselier return *__value; 6911faf289eSEric Fiselier#endif 6921faf289eSEric Fiselier} 6931faf289eSEric Fiselier 694224264adSKuba Breckatemplate <class _ValueType> 695dc7200b4SLouis Dionneinline _LIBCPP_INLINE_VISIBILITY 696224264adSKuba Brecka_ValueType __libcpp_acquire_load(_ValueType const* __value) { 697224264adSKuba Brecka#if !defined(_LIBCPP_HAS_NO_THREADS) && \ 698224264adSKuba Brecka defined(__ATOMIC_ACQUIRE) && \ 699224264adSKuba Brecka (__has_builtin(__atomic_load_n) || _GNUC_VER >= 407) 700224264adSKuba Brecka return __atomic_load_n(__value, __ATOMIC_ACQUIRE); 701224264adSKuba Brecka#else 702224264adSKuba Brecka return *__value; 703224264adSKuba Brecka#endif 704224264adSKuba Brecka} 705224264adSKuba Brecka 7061c7fe126SMarshall Clow// addressof moved to <type_traits> 70764ec101eSDouglas Gregor 7083e519524SHoward Hinnanttemplate <class _Tp> class allocator; 7093e519524SHoward Hinnant 7103e519524SHoward Hinnanttemplate <> 711e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS allocator<void> 7123e519524SHoward Hinnant{ 7133e519524SHoward Hinnantpublic: 7143e519524SHoward Hinnant typedef void* pointer; 7153e519524SHoward Hinnant typedef const void* const_pointer; 7163e519524SHoward Hinnant typedef void value_type; 7173e519524SHoward Hinnant 7183e519524SHoward Hinnant template <class _Up> struct rebind {typedef allocator<_Up> other;}; 7193e519524SHoward Hinnant}; 7203e519524SHoward Hinnant 72121fa1887SHoward Hinnanttemplate <> 722e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS allocator<const void> 72321fa1887SHoward Hinnant{ 72421fa1887SHoward Hinnantpublic: 72521fa1887SHoward Hinnant typedef const void* pointer; 72621fa1887SHoward Hinnant typedef const void* const_pointer; 72721fa1887SHoward Hinnant typedef const void value_type; 72821fa1887SHoward Hinnant 72921fa1887SHoward Hinnant template <class _Up> struct rebind {typedef allocator<_Up> other;}; 73021fa1887SHoward Hinnant}; 73121fa1887SHoward Hinnant 7323e519524SHoward Hinnant// pointer_traits 7333e519524SHoward Hinnant 734b082f11fSMarshall Clowtemplate <class _Tp, class = void> 735b082f11fSMarshall Clowstruct __has_element_type : false_type {}; 736b082f11fSMarshall Clow 7373e519524SHoward Hinnanttemplate <class _Tp> 738b082f11fSMarshall Clowstruct __has_element_type<_Tp, 739b082f11fSMarshall Clow typename __void_t<typename _Tp::element_type>::type> : true_type {}; 7403e519524SHoward Hinnant 7413e519524SHoward Hinnanttemplate <class _Ptr, bool = __has_element_type<_Ptr>::value> 7423e519524SHoward Hinnantstruct __pointer_traits_element_type; 7433e519524SHoward Hinnant 7443e519524SHoward Hinnanttemplate <class _Ptr> 7453e519524SHoward Hinnantstruct __pointer_traits_element_type<_Ptr, true> 7463e519524SHoward Hinnant{ 7473e519524SHoward Hinnant typedef typename _Ptr::element_type type; 7483e519524SHoward Hinnant}; 7493e519524SHoward Hinnant 7503e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 7513e519524SHoward Hinnant 7523e519524SHoward Hinnanttemplate <template <class, class...> class _Sp, class _Tp, class ..._Args> 7533e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _Args...>, true> 7543e519524SHoward Hinnant{ 7553e519524SHoward Hinnant typedef typename _Sp<_Tp, _Args...>::element_type type; 7563e519524SHoward Hinnant}; 7573e519524SHoward Hinnant 7583e519524SHoward Hinnanttemplate <template <class, class...> class _Sp, class _Tp, class ..._Args> 7593e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _Args...>, false> 7603e519524SHoward Hinnant{ 7613e519524SHoward Hinnant typedef _Tp type; 7623e519524SHoward Hinnant}; 7633e519524SHoward Hinnant 764b3371f6fSHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 7653e519524SHoward Hinnant 7663e519524SHoward Hinnanttemplate <template <class> class _Sp, class _Tp> 7673e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp>, true> 7683e519524SHoward Hinnant{ 7693e519524SHoward Hinnant typedef typename _Sp<_Tp>::element_type type; 7703e519524SHoward Hinnant}; 7713e519524SHoward Hinnant 7723e519524SHoward Hinnanttemplate <template <class> class _Sp, class _Tp> 7733e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp>, false> 7743e519524SHoward Hinnant{ 7753e519524SHoward Hinnant typedef _Tp type; 7763e519524SHoward Hinnant}; 7773e519524SHoward Hinnant 7783e519524SHoward Hinnanttemplate <template <class, class> class _Sp, class _Tp, class _A0> 7793e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0>, true> 7803e519524SHoward Hinnant{ 7813e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0>::element_type type; 7823e519524SHoward Hinnant}; 7833e519524SHoward Hinnant 7843e519524SHoward Hinnanttemplate <template <class, class> class _Sp, class _Tp, class _A0> 7853e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0>, false> 7863e519524SHoward Hinnant{ 7873e519524SHoward Hinnant typedef _Tp type; 7883e519524SHoward Hinnant}; 7893e519524SHoward Hinnant 7903e519524SHoward Hinnanttemplate <template <class, class, class> class _Sp, class _Tp, class _A0, class _A1> 7913e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1>, true> 7923e519524SHoward Hinnant{ 7933e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1>::element_type type; 7943e519524SHoward Hinnant}; 7953e519524SHoward Hinnant 7963e519524SHoward Hinnanttemplate <template <class, class, class> class _Sp, class _Tp, class _A0, class _A1> 7973e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1>, false> 7983e519524SHoward Hinnant{ 7993e519524SHoward Hinnant typedef _Tp type; 8003e519524SHoward Hinnant}; 8013e519524SHoward Hinnant 8023e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Sp, class _Tp, class _A0, 8033e519524SHoward Hinnant class _A1, class _A2> 8043e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1, _A2>, true> 8053e519524SHoward Hinnant{ 8063e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1, _A2>::element_type type; 8073e519524SHoward Hinnant}; 8083e519524SHoward Hinnant 8093e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Sp, class _Tp, class _A0, 8103e519524SHoward Hinnant class _A1, class _A2> 8113e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1, _A2>, false> 8123e519524SHoward Hinnant{ 8133e519524SHoward Hinnant typedef _Tp type; 8143e519524SHoward Hinnant}; 8153e519524SHoward Hinnant 816b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 8173e519524SHoward Hinnant 818b082f11fSMarshall Clowtemplate <class _Tp, class = void> 819b082f11fSMarshall Clowstruct __has_difference_type : false_type {}; 820b082f11fSMarshall Clow 8213e519524SHoward Hinnanttemplate <class _Tp> 822b082f11fSMarshall Clowstruct __has_difference_type<_Tp, 823b082f11fSMarshall Clow typename __void_t<typename _Tp::difference_type>::type> : true_type {}; 8243e519524SHoward Hinnant 8253e519524SHoward Hinnanttemplate <class _Ptr, bool = __has_difference_type<_Ptr>::value> 8263e519524SHoward Hinnantstruct __pointer_traits_difference_type 8273e519524SHoward Hinnant{ 8283e519524SHoward Hinnant typedef ptrdiff_t type; 8293e519524SHoward Hinnant}; 8303e519524SHoward Hinnant 8313e519524SHoward Hinnanttemplate <class _Ptr> 8323e519524SHoward Hinnantstruct __pointer_traits_difference_type<_Ptr, true> 8333e519524SHoward Hinnant{ 8343e519524SHoward Hinnant typedef typename _Ptr::difference_type type; 8353e519524SHoward Hinnant}; 8363e519524SHoward Hinnant 8373e519524SHoward Hinnanttemplate <class _Tp, class _Up> 8383e519524SHoward Hinnantstruct __has_rebind 8393e519524SHoward Hinnant{ 8403e519524SHoward Hinnantprivate: 84154d333a6SHoward Hinnant struct __two {char __lx; char __lxx;}; 8423e519524SHoward Hinnant template <class _Xp> static __two __test(...); 8433e519524SHoward Hinnant template <class _Xp> static char __test(typename _Xp::template rebind<_Up>* = 0); 8443e519524SHoward Hinnantpublic: 8453e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 8463e519524SHoward Hinnant}; 8473e519524SHoward Hinnant 8483e519524SHoward Hinnanttemplate <class _Tp, class _Up, bool = __has_rebind<_Tp, _Up>::value> 8493e519524SHoward Hinnantstruct __pointer_traits_rebind 8503e519524SHoward Hinnant{ 85154613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 8523e519524SHoward Hinnant typedef typename _Tp::template rebind<_Up> type; 8533e519524SHoward Hinnant#else 8543e519524SHoward Hinnant typedef typename _Tp::template rebind<_Up>::other type; 8553e519524SHoward Hinnant#endif 8563e519524SHoward Hinnant}; 8573e519524SHoward Hinnant 8583e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 8593e519524SHoward Hinnant 8603e519524SHoward Hinnanttemplate <template <class, class...> class _Sp, class _Tp, class ..._Args, class _Up> 8613e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _Args...>, _Up, true> 8623e519524SHoward Hinnant{ 86354613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 8643e519524SHoward Hinnant typedef typename _Sp<_Tp, _Args...>::template rebind<_Up> type; 8653e519524SHoward Hinnant#else 8663e519524SHoward Hinnant typedef typename _Sp<_Tp, _Args...>::template rebind<_Up>::other type; 8673e519524SHoward Hinnant#endif 8683e519524SHoward Hinnant}; 8693e519524SHoward Hinnant 8703e519524SHoward Hinnanttemplate <template <class, class...> class _Sp, class _Tp, class ..._Args, class _Up> 8713e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _Args...>, _Up, false> 8723e519524SHoward Hinnant{ 8733e519524SHoward Hinnant typedef _Sp<_Up, _Args...> type; 8743e519524SHoward Hinnant}; 8753e519524SHoward Hinnant 876b3371f6fSHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 8773e519524SHoward Hinnant 8783e519524SHoward Hinnanttemplate <template <class> class _Sp, class _Tp, class _Up> 8793e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp>, _Up, true> 8803e519524SHoward Hinnant{ 88154613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 8823e519524SHoward Hinnant typedef typename _Sp<_Tp>::template rebind<_Up> type; 8833e519524SHoward Hinnant#else 8843e519524SHoward Hinnant typedef typename _Sp<_Tp>::template rebind<_Up>::other type; 8853e519524SHoward Hinnant#endif 8863e519524SHoward Hinnant}; 8873e519524SHoward Hinnant 8883e519524SHoward Hinnanttemplate <template <class> class _Sp, class _Tp, class _Up> 8893e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp>, _Up, false> 8903e519524SHoward Hinnant{ 8913e519524SHoward Hinnant typedef _Sp<_Up> type; 8923e519524SHoward Hinnant}; 8933e519524SHoward Hinnant 8943e519524SHoward Hinnanttemplate <template <class, class> class _Sp, class _Tp, class _A0, class _Up> 8953e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0>, _Up, true> 8963e519524SHoward Hinnant{ 89754613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 8983e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0>::template rebind<_Up> type; 8993e519524SHoward Hinnant#else 9003e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0>::template rebind<_Up>::other type; 9013e519524SHoward Hinnant#endif 9023e519524SHoward Hinnant}; 9033e519524SHoward Hinnant 9043e519524SHoward Hinnanttemplate <template <class, class> class _Sp, class _Tp, class _A0, class _Up> 9053e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0>, _Up, false> 9063e519524SHoward Hinnant{ 9073e519524SHoward Hinnant typedef _Sp<_Up, _A0> type; 9083e519524SHoward Hinnant}; 9093e519524SHoward Hinnant 9103e519524SHoward Hinnanttemplate <template <class, class, class> class _Sp, class _Tp, class _A0, 9113e519524SHoward Hinnant class _A1, class _Up> 9123e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1>, _Up, true> 9133e519524SHoward Hinnant{ 91454613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 9153e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1>::template rebind<_Up> type; 9163e519524SHoward Hinnant#else 9173e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1>::template rebind<_Up>::other type; 9183e519524SHoward Hinnant#endif 9193e519524SHoward Hinnant}; 9203e519524SHoward Hinnant 9213e519524SHoward Hinnanttemplate <template <class, class, class> class _Sp, class _Tp, class _A0, 9223e519524SHoward Hinnant class _A1, class _Up> 9233e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1>, _Up, false> 9243e519524SHoward Hinnant{ 9253e519524SHoward Hinnant typedef _Sp<_Up, _A0, _A1> type; 9263e519524SHoward Hinnant}; 9273e519524SHoward Hinnant 9283e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Sp, class _Tp, class _A0, 9293e519524SHoward Hinnant class _A1, class _A2, class _Up> 9303e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1, _A2>, _Up, true> 9313e519524SHoward Hinnant{ 93254613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 9333e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1, _A2>::template rebind<_Up> type; 9343e519524SHoward Hinnant#else 9353e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1, _A2>::template rebind<_Up>::other type; 9363e519524SHoward Hinnant#endif 9373e519524SHoward Hinnant}; 9383e519524SHoward Hinnant 9393e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Sp, class _Tp, class _A0, 9403e519524SHoward Hinnant class _A1, class _A2, class _Up> 9413e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1, _A2>, _Up, false> 9423e519524SHoward Hinnant{ 9433e519524SHoward Hinnant typedef _Sp<_Up, _A0, _A1, _A2> type; 9443e519524SHoward Hinnant}; 9453e519524SHoward Hinnant 946b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 9473e519524SHoward Hinnant 9483e519524SHoward Hinnanttemplate <class _Ptr> 949e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS pointer_traits 9503e519524SHoward Hinnant{ 9513e519524SHoward Hinnant typedef _Ptr pointer; 9523e519524SHoward Hinnant typedef typename __pointer_traits_element_type<pointer>::type element_type; 9533e519524SHoward Hinnant typedef typename __pointer_traits_difference_type<pointer>::type difference_type; 9543e519524SHoward Hinnant 95554613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 956f7384975SHoward Hinnant template <class _Up> using rebind = typename __pointer_traits_rebind<pointer, _Up>::type; 9573e519524SHoward Hinnant#else 9583e519524SHoward Hinnant template <class _Up> struct rebind 9593e519524SHoward Hinnant {typedef typename __pointer_traits_rebind<pointer, _Up>::type other;}; 96054613ab4SEric Fiselier#endif // _LIBCPP_CXX03_LANG 9613e519524SHoward Hinnant 9623e519524SHoward Hinnantprivate: 9633e519524SHoward Hinnant struct __nat {}; 9643e519524SHoward Hinnantpublic: 965848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9663e519524SHoward Hinnant static pointer pointer_to(typename conditional<is_void<element_type>::value, 9673e519524SHoward Hinnant __nat, element_type>::type& __r) 9683e519524SHoward Hinnant {return pointer::pointer_to(__r);} 9693e519524SHoward Hinnant}; 9703e519524SHoward Hinnant 9713e519524SHoward Hinnanttemplate <class _Tp> 972e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS pointer_traits<_Tp*> 9733e519524SHoward Hinnant{ 9743e519524SHoward Hinnant typedef _Tp* pointer; 9753e519524SHoward Hinnant typedef _Tp element_type; 9763e519524SHoward Hinnant typedef ptrdiff_t difference_type; 9773e519524SHoward Hinnant 97854613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 9793e519524SHoward Hinnant template <class _Up> using rebind = _Up*; 9803e519524SHoward Hinnant#else 9813e519524SHoward Hinnant template <class _Up> struct rebind {typedef _Up* other;}; 9823e519524SHoward Hinnant#endif 9833e519524SHoward Hinnant 9843e519524SHoward Hinnantprivate: 9853e519524SHoward Hinnant struct __nat {}; 9863e519524SHoward Hinnantpublic: 98772720269SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 9883e519524SHoward Hinnant static pointer pointer_to(typename conditional<is_void<element_type>::value, 9893739fe79SHoward Hinnant __nat, element_type>::type& __r) _NOEXCEPT 990ce48a113SHoward Hinnant {return _VSTD::addressof(__r);} 9913e519524SHoward Hinnant}; 9923e519524SHoward Hinnant 9931c813407SEric Fiseliertemplate <class _From, class _To> 9941c813407SEric Fiselierstruct __rebind_pointer { 99554613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 9961c813407SEric Fiselier typedef typename pointer_traits<_From>::template rebind<_To> type; 9971c813407SEric Fiselier#else 9981c813407SEric Fiselier typedef typename pointer_traits<_From>::template rebind<_To>::other type; 9991c813407SEric Fiselier#endif 10001c813407SEric Fiselier}; 10011c813407SEric Fiselier 10023e519524SHoward Hinnant// allocator_traits 10033e519524SHoward Hinnant 1004b082f11fSMarshall Clowtemplate <class _Tp, class = void> 1005b082f11fSMarshall Clowstruct __has_pointer_type : false_type {}; 10063e519524SHoward Hinnant 10073e519524SHoward Hinnanttemplate <class _Tp> 1008b082f11fSMarshall Clowstruct __has_pointer_type<_Tp, 1009b082f11fSMarshall Clow typename __void_t<typename _Tp::pointer>::type> : true_type {}; 10103e519524SHoward Hinnant 10113e519524SHoward Hinnantnamespace __pointer_type_imp 10123e519524SHoward Hinnant{ 10133e519524SHoward Hinnant 10143e519524SHoward Hinnanttemplate <class _Tp, class _Dp, bool = __has_pointer_type<_Dp>::value> 10153e519524SHoward Hinnantstruct __pointer_type 10163e519524SHoward Hinnant{ 10173e519524SHoward Hinnant typedef typename _Dp::pointer type; 10183e519524SHoward Hinnant}; 10193e519524SHoward Hinnant 10203e519524SHoward Hinnanttemplate <class _Tp, class _Dp> 10213e519524SHoward Hinnantstruct __pointer_type<_Tp, _Dp, false> 10223e519524SHoward Hinnant{ 10233e519524SHoward Hinnant typedef _Tp* type; 10243e519524SHoward Hinnant}; 10253e519524SHoward Hinnant 1026a4a1ef1fSHoward Hinnant} // __pointer_type_imp 10273e519524SHoward Hinnant 10283e519524SHoward Hinnanttemplate <class _Tp, class _Dp> 10293e519524SHoward Hinnantstruct __pointer_type 10303e519524SHoward Hinnant{ 10313e519524SHoward Hinnant typedef typename __pointer_type_imp::__pointer_type<_Tp, typename remove_reference<_Dp>::type>::type type; 10323e519524SHoward Hinnant}; 10333e519524SHoward Hinnant 1034b082f11fSMarshall Clowtemplate <class _Tp, class = void> 1035b082f11fSMarshall Clowstruct __has_const_pointer : false_type {}; 1036b082f11fSMarshall Clow 10373e519524SHoward Hinnanttemplate <class _Tp> 1038b082f11fSMarshall Clowstruct __has_const_pointer<_Tp, 1039b082f11fSMarshall Clow typename __void_t<typename _Tp::const_pointer>::type> : true_type {}; 10403e519524SHoward Hinnant 10413e519524SHoward Hinnanttemplate <class _Tp, class _Ptr, class _Alloc, bool = __has_const_pointer<_Alloc>::value> 10423e519524SHoward Hinnantstruct __const_pointer 10433e519524SHoward Hinnant{ 10443e519524SHoward Hinnant typedef typename _Alloc::const_pointer type; 10453e519524SHoward Hinnant}; 10463e519524SHoward Hinnant 10473e519524SHoward Hinnanttemplate <class _Tp, class _Ptr, class _Alloc> 10483e519524SHoward Hinnantstruct __const_pointer<_Tp, _Ptr, _Alloc, false> 10493e519524SHoward Hinnant{ 105054613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 10513e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<const _Tp> type; 10523e519524SHoward Hinnant#else 10533e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<const _Tp>::other type; 10543e519524SHoward Hinnant#endif 10553e519524SHoward Hinnant}; 10563e519524SHoward Hinnant 1057b082f11fSMarshall Clowtemplate <class _Tp, class = void> 1058b082f11fSMarshall Clowstruct __has_void_pointer : false_type {}; 1059b082f11fSMarshall Clow 10603e519524SHoward Hinnanttemplate <class _Tp> 1061b082f11fSMarshall Clowstruct __has_void_pointer<_Tp, 1062b082f11fSMarshall Clow typename __void_t<typename _Tp::void_pointer>::type> : true_type {}; 10633e519524SHoward Hinnant 10643e519524SHoward Hinnanttemplate <class _Ptr, class _Alloc, bool = __has_void_pointer<_Alloc>::value> 10653e519524SHoward Hinnantstruct __void_pointer 10663e519524SHoward Hinnant{ 10673e519524SHoward Hinnant typedef typename _Alloc::void_pointer type; 10683e519524SHoward Hinnant}; 10693e519524SHoward Hinnant 10703e519524SHoward Hinnanttemplate <class _Ptr, class _Alloc> 10713e519524SHoward Hinnantstruct __void_pointer<_Ptr, _Alloc, false> 10723e519524SHoward Hinnant{ 107354613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 10743e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<void> type; 10753e519524SHoward Hinnant#else 10763e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<void>::other type; 10773e519524SHoward Hinnant#endif 10783e519524SHoward Hinnant}; 10793e519524SHoward Hinnant 1080b082f11fSMarshall Clowtemplate <class _Tp, class = void> 1081b082f11fSMarshall Clowstruct __has_const_void_pointer : false_type {}; 1082b082f11fSMarshall Clow 10833e519524SHoward Hinnanttemplate <class _Tp> 1084b082f11fSMarshall Clowstruct __has_const_void_pointer<_Tp, 1085b082f11fSMarshall Clow typename __void_t<typename _Tp::const_void_pointer>::type> : true_type {}; 10863e519524SHoward Hinnant 10873e519524SHoward Hinnanttemplate <class _Ptr, class _Alloc, bool = __has_const_void_pointer<_Alloc>::value> 10883e519524SHoward Hinnantstruct __const_void_pointer 10893e519524SHoward Hinnant{ 10903e519524SHoward Hinnant typedef typename _Alloc::const_void_pointer type; 10913e519524SHoward Hinnant}; 10923e519524SHoward Hinnant 10933e519524SHoward Hinnanttemplate <class _Ptr, class _Alloc> 10943e519524SHoward Hinnantstruct __const_void_pointer<_Ptr, _Alloc, false> 10953e519524SHoward Hinnant{ 109654613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 10973e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<const void> type; 10983e519524SHoward Hinnant#else 10993e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<const void>::other type; 11003e519524SHoward Hinnant#endif 11013e519524SHoward Hinnant}; 11023e519524SHoward Hinnant 1103c003db1fSHoward Hinnanttemplate <class _Tp> 110432952747SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 1105c003db1fSHoward Hinnant_Tp* 1106c003db1fSHoward Hinnant__to_raw_pointer(_Tp* __p) _NOEXCEPT 11073e519524SHoward Hinnant{ 11083e519524SHoward Hinnant return __p; 11093e519524SHoward Hinnant} 11103e519524SHoward Hinnant 111132952747SEric Fiselier#if _LIBCPP_STD_VER <= 17 11123e519524SHoward Hinnanttemplate <class _Pointer> 11133e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 11143e519524SHoward Hinnanttypename pointer_traits<_Pointer>::element_type* 11153739fe79SHoward Hinnant__to_raw_pointer(_Pointer __p) _NOEXCEPT 11163e519524SHoward Hinnant{ 1117ce48a113SHoward Hinnant return _VSTD::__to_raw_pointer(__p.operator->()); 11183e519524SHoward Hinnant} 111932952747SEric Fiselier#else 112032952747SEric Fiseliertemplate <class _Pointer> 112132952747SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 112232952747SEric Fiselierauto 112332952747SEric Fiselier__to_raw_pointer(const _Pointer& __p) _NOEXCEPT 112432952747SEric Fiselier-> decltype(pointer_traits<_Pointer>::to_address(__p)) 112532952747SEric Fiselier{ 112632952747SEric Fiselier return pointer_traits<_Pointer>::to_address(__p); 112732952747SEric Fiselier} 112832952747SEric Fiselier 112932952747SEric Fiseliertemplate <class _Pointer, class... _None> 113032952747SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 113132952747SEric Fiselierauto 113232952747SEric Fiselier__to_raw_pointer(const _Pointer& __p, _None...) _NOEXCEPT 113332952747SEric Fiselier{ 113432952747SEric Fiselier return _VSTD::__to_raw_pointer(__p.operator->()); 113532952747SEric Fiselier} 113632952747SEric Fiselier 113732952747SEric Fiseliertemplate <class _Tp> 113832952747SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY constexpr 113932952747SEric Fiselier_Tp* 114032952747SEric Fiselierto_address(_Tp* __p) _NOEXCEPT 114132952747SEric Fiselier{ 114232952747SEric Fiselier static_assert(!is_function_v<_Tp>, "_Tp is a function type"); 114332952747SEric Fiselier return __p; 114432952747SEric Fiselier} 114532952747SEric Fiselier 114632952747SEric Fiseliertemplate <class _Pointer> 114732952747SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 114832952747SEric Fiselierauto 114932952747SEric Fiselierto_address(const _Pointer& __p) _NOEXCEPT 115032952747SEric Fiselier{ 115132952747SEric Fiselier return _VSTD::__to_raw_pointer(__p); 115232952747SEric Fiselier} 115332952747SEric Fiselier#endif 11543e519524SHoward Hinnant 1155b082f11fSMarshall Clowtemplate <class _Tp, class = void> 1156b082f11fSMarshall Clowstruct __has_size_type : false_type {}; 1157b082f11fSMarshall Clow 11583e519524SHoward Hinnanttemplate <class _Tp> 1159b082f11fSMarshall Clowstruct __has_size_type<_Tp, 1160b082f11fSMarshall Clow typename __void_t<typename _Tp::size_type>::type> : true_type {}; 11613e519524SHoward Hinnant 1162a4a1ef1fSHoward Hinnanttemplate <class _Alloc, class _DiffType, bool = __has_size_type<_Alloc>::value> 11633e519524SHoward Hinnantstruct __size_type 11643e519524SHoward Hinnant{ 1165a4a1ef1fSHoward Hinnant typedef typename make_unsigned<_DiffType>::type type; 11663e519524SHoward Hinnant}; 11673e519524SHoward Hinnant 1168a4a1ef1fSHoward Hinnanttemplate <class _Alloc, class _DiffType> 1169a4a1ef1fSHoward Hinnantstruct __size_type<_Alloc, _DiffType, true> 11703e519524SHoward Hinnant{ 11713e519524SHoward Hinnant typedef typename _Alloc::size_type type; 11723e519524SHoward Hinnant}; 11733e519524SHoward Hinnant 1174b082f11fSMarshall Clowtemplate <class _Tp, class = void> 1175b082f11fSMarshall Clowstruct __has_propagate_on_container_copy_assignment : false_type {}; 1176b082f11fSMarshall Clow 11773e519524SHoward Hinnanttemplate <class _Tp> 1178b082f11fSMarshall Clowstruct __has_propagate_on_container_copy_assignment<_Tp, 1179b082f11fSMarshall Clow typename __void_t<typename _Tp::propagate_on_container_copy_assignment>::type> 1180b082f11fSMarshall Clow : true_type {}; 11813e519524SHoward Hinnant 11823e519524SHoward Hinnanttemplate <class _Alloc, bool = __has_propagate_on_container_copy_assignment<_Alloc>::value> 11833e519524SHoward Hinnantstruct __propagate_on_container_copy_assignment 11843e519524SHoward Hinnant{ 11853e519524SHoward Hinnant typedef false_type type; 11863e519524SHoward Hinnant}; 11873e519524SHoward Hinnant 11883e519524SHoward Hinnanttemplate <class _Alloc> 11893e519524SHoward Hinnantstruct __propagate_on_container_copy_assignment<_Alloc, true> 11903e519524SHoward Hinnant{ 11913e519524SHoward Hinnant typedef typename _Alloc::propagate_on_container_copy_assignment type; 11923e519524SHoward Hinnant}; 11933e519524SHoward Hinnant 1194b082f11fSMarshall Clowtemplate <class _Tp, class = void> 1195b082f11fSMarshall Clowstruct __has_propagate_on_container_move_assignment : false_type {}; 1196b082f11fSMarshall Clow 11973e519524SHoward Hinnanttemplate <class _Tp> 1198b082f11fSMarshall Clowstruct __has_propagate_on_container_move_assignment<_Tp, 1199b082f11fSMarshall Clow typename __void_t<typename _Tp::propagate_on_container_move_assignment>::type> 1200b082f11fSMarshall Clow : true_type {}; 12013e519524SHoward Hinnant 12023e519524SHoward Hinnanttemplate <class _Alloc, bool = __has_propagate_on_container_move_assignment<_Alloc>::value> 12033e519524SHoward Hinnantstruct __propagate_on_container_move_assignment 12043e519524SHoward Hinnant{ 12053e519524SHoward Hinnant typedef false_type type; 12063e519524SHoward Hinnant}; 12073e519524SHoward Hinnant 12083e519524SHoward Hinnanttemplate <class _Alloc> 12093e519524SHoward Hinnantstruct __propagate_on_container_move_assignment<_Alloc, true> 12103e519524SHoward Hinnant{ 12113e519524SHoward Hinnant typedef typename _Alloc::propagate_on_container_move_assignment type; 12123e519524SHoward Hinnant}; 12133e519524SHoward Hinnant 1214b082f11fSMarshall Clowtemplate <class _Tp, class = void> 1215b082f11fSMarshall Clowstruct __has_propagate_on_container_swap : false_type {}; 1216b082f11fSMarshall Clow 12173e519524SHoward Hinnanttemplate <class _Tp> 1218b082f11fSMarshall Clowstruct __has_propagate_on_container_swap<_Tp, 1219b082f11fSMarshall Clow typename __void_t<typename _Tp::propagate_on_container_swap>::type> 1220b082f11fSMarshall Clow : true_type {}; 12213e519524SHoward Hinnant 12223e519524SHoward Hinnanttemplate <class _Alloc, bool = __has_propagate_on_container_swap<_Alloc>::value> 12233e519524SHoward Hinnantstruct __propagate_on_container_swap 12243e519524SHoward Hinnant{ 12253e519524SHoward Hinnant typedef false_type type; 12263e519524SHoward Hinnant}; 12273e519524SHoward Hinnant 12283e519524SHoward Hinnanttemplate <class _Alloc> 12293e519524SHoward Hinnantstruct __propagate_on_container_swap<_Alloc, true> 12303e519524SHoward Hinnant{ 12313e519524SHoward Hinnant typedef typename _Alloc::propagate_on_container_swap type; 12323e519524SHoward Hinnant}; 12333e519524SHoward Hinnant 1234b082f11fSMarshall Clowtemplate <class _Tp, class = void> 1235b082f11fSMarshall Clowstruct __has_is_always_equal : false_type {}; 1236b082f11fSMarshall Clow 123731a47313SMarshall Clowtemplate <class _Tp> 1238b082f11fSMarshall Clowstruct __has_is_always_equal<_Tp, 1239b082f11fSMarshall Clow typename __void_t<typename _Tp::is_always_equal>::type> 1240b082f11fSMarshall Clow : true_type {}; 124131a47313SMarshall Clow 124231a47313SMarshall Clowtemplate <class _Alloc, bool = __has_is_always_equal<_Alloc>::value> 124331a47313SMarshall Clowstruct __is_always_equal 124431a47313SMarshall Clow{ 124531a47313SMarshall Clow typedef typename _VSTD::is_empty<_Alloc>::type type; 124631a47313SMarshall Clow}; 124731a47313SMarshall Clow 124831a47313SMarshall Clowtemplate <class _Alloc> 124931a47313SMarshall Clowstruct __is_always_equal<_Alloc, true> 125031a47313SMarshall Clow{ 125131a47313SMarshall Clow typedef typename _Alloc::is_always_equal type; 125231a47313SMarshall Clow}; 125331a47313SMarshall Clow 12543e519524SHoward Hinnanttemplate <class _Tp, class _Up, bool = __has_rebind<_Tp, _Up>::value> 12553e519524SHoward Hinnantstruct __has_rebind_other 12563e519524SHoward Hinnant{ 12573e519524SHoward Hinnantprivate: 125854d333a6SHoward Hinnant struct __two {char __lx; char __lxx;}; 12593e519524SHoward Hinnant template <class _Xp> static __two __test(...); 12603e519524SHoward Hinnant template <class _Xp> static char __test(typename _Xp::template rebind<_Up>::other* = 0); 12613e519524SHoward Hinnantpublic: 12623e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 12633e519524SHoward Hinnant}; 12643e519524SHoward Hinnant 12653e519524SHoward Hinnanttemplate <class _Tp, class _Up> 12663e519524SHoward Hinnantstruct __has_rebind_other<_Tp, _Up, false> 12673e519524SHoward Hinnant{ 12683e519524SHoward Hinnant static const bool value = false; 12693e519524SHoward Hinnant}; 12703e519524SHoward Hinnant 12713e519524SHoward Hinnanttemplate <class _Tp, class _Up, bool = __has_rebind_other<_Tp, _Up>::value> 12723e519524SHoward Hinnantstruct __allocator_traits_rebind 12733e519524SHoward Hinnant{ 12743e519524SHoward Hinnant typedef typename _Tp::template rebind<_Up>::other type; 12753e519524SHoward Hinnant}; 12763e519524SHoward Hinnant 12773e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 12783e519524SHoward Hinnant 12793e519524SHoward Hinnanttemplate <template <class, class...> class _Alloc, class _Tp, class ..._Args, class _Up> 12803e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _Args...>, _Up, true> 12813e519524SHoward Hinnant{ 12823e519524SHoward Hinnant typedef typename _Alloc<_Tp, _Args...>::template rebind<_Up>::other type; 12833e519524SHoward Hinnant}; 12843e519524SHoward Hinnant 12853e519524SHoward Hinnanttemplate <template <class, class...> class _Alloc, class _Tp, class ..._Args, class _Up> 12863e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _Args...>, _Up, false> 12873e519524SHoward Hinnant{ 12883e519524SHoward Hinnant typedef _Alloc<_Up, _Args...> type; 12893e519524SHoward Hinnant}; 12903e519524SHoward Hinnant 1291b3371f6fSHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 12923e519524SHoward Hinnant 12933e519524SHoward Hinnanttemplate <template <class> class _Alloc, class _Tp, class _Up> 12943e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp>, _Up, true> 12953e519524SHoward Hinnant{ 12963e519524SHoward Hinnant typedef typename _Alloc<_Tp>::template rebind<_Up>::other type; 12973e519524SHoward Hinnant}; 12983e519524SHoward Hinnant 12993e519524SHoward Hinnanttemplate <template <class> class _Alloc, class _Tp, class _Up> 13003e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp>, _Up, false> 13013e519524SHoward Hinnant{ 13023e519524SHoward Hinnant typedef _Alloc<_Up> type; 13033e519524SHoward Hinnant}; 13043e519524SHoward Hinnant 13053e519524SHoward Hinnanttemplate <template <class, class> class _Alloc, class _Tp, class _A0, class _Up> 13063e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0>, _Up, true> 13073e519524SHoward Hinnant{ 13083e519524SHoward Hinnant typedef typename _Alloc<_Tp, _A0>::template rebind<_Up>::other type; 13093e519524SHoward Hinnant}; 13103e519524SHoward Hinnant 13113e519524SHoward Hinnanttemplate <template <class, class> class _Alloc, class _Tp, class _A0, class _Up> 13123e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0>, _Up, false> 13133e519524SHoward Hinnant{ 13143e519524SHoward Hinnant typedef _Alloc<_Up, _A0> type; 13153e519524SHoward Hinnant}; 13163e519524SHoward Hinnant 13173e519524SHoward Hinnanttemplate <template <class, class, class> class _Alloc, class _Tp, class _A0, 13183e519524SHoward Hinnant class _A1, class _Up> 13193e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1>, _Up, true> 13203e519524SHoward Hinnant{ 13213e519524SHoward Hinnant typedef typename _Alloc<_Tp, _A0, _A1>::template rebind<_Up>::other type; 13223e519524SHoward Hinnant}; 13233e519524SHoward Hinnant 13243e519524SHoward Hinnanttemplate <template <class, class, class> class _Alloc, class _Tp, class _A0, 13253e519524SHoward Hinnant class _A1, class _Up> 13263e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1>, _Up, false> 13273e519524SHoward Hinnant{ 13283e519524SHoward Hinnant typedef _Alloc<_Up, _A0, _A1> type; 13293e519524SHoward Hinnant}; 13303e519524SHoward Hinnant 13313e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Alloc, class _Tp, class _A0, 13323e519524SHoward Hinnant class _A1, class _A2, class _Up> 13333e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1, _A2>, _Up, true> 13343e519524SHoward Hinnant{ 13353e519524SHoward Hinnant typedef typename _Alloc<_Tp, _A0, _A1, _A2>::template rebind<_Up>::other type; 13363e519524SHoward Hinnant}; 13373e519524SHoward Hinnant 13383e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Alloc, class _Tp, class _A0, 13393e519524SHoward Hinnant class _A1, class _A2, class _Up> 13403e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1, _A2>, _Up, false> 13413e519524SHoward Hinnant{ 13423e519524SHoward Hinnant typedef _Alloc<_Up, _A0, _A1, _A2> type; 13433e519524SHoward Hinnant}; 13443e519524SHoward Hinnant 1345b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 13463e519524SHoward Hinnant 134754613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 13483e519524SHoward Hinnant 13493e519524SHoward Hinnanttemplate <class _Alloc, class _SizeType, class _ConstVoidPtr> 13503e519524SHoward Hinnantauto 13513e519524SHoward Hinnant__has_allocate_hint_test(_Alloc&& __a, _SizeType&& __sz, _ConstVoidPtr&& __p) 13529f8fef95SEric Fiselier -> decltype((void)__a.allocate(__sz, __p), true_type()); 13533e519524SHoward Hinnant 13543e519524SHoward Hinnanttemplate <class _Alloc, class _SizeType, class _ConstVoidPtr> 13553e519524SHoward Hinnantauto 13563e519524SHoward Hinnant__has_allocate_hint_test(const _Alloc& __a, _SizeType&& __sz, _ConstVoidPtr&& __p) 13573e519524SHoward Hinnant -> false_type; 13583e519524SHoward Hinnant 13593e519524SHoward Hinnanttemplate <class _Alloc, class _SizeType, class _ConstVoidPtr> 13603e519524SHoward Hinnantstruct __has_allocate_hint 13613e519524SHoward Hinnant : integral_constant<bool, 13623e519524SHoward Hinnant is_same< 13639f8fef95SEric Fiselier decltype(_VSTD::__has_allocate_hint_test(declval<_Alloc>(), 13643e519524SHoward Hinnant declval<_SizeType>(), 13653e519524SHoward Hinnant declval<_ConstVoidPtr>())), 13663e519524SHoward Hinnant true_type>::value> 13673e519524SHoward Hinnant{ 13683e519524SHoward Hinnant}; 13693e519524SHoward Hinnant 137054613ab4SEric Fiselier#else // _LIBCPP_CXX03_LANG 13713e519524SHoward Hinnant 13723e519524SHoward Hinnanttemplate <class _Alloc, class _SizeType, class _ConstVoidPtr> 13733e519524SHoward Hinnantstruct __has_allocate_hint 13743e519524SHoward Hinnant : true_type 13753e519524SHoward Hinnant{ 13763e519524SHoward Hinnant}; 13773e519524SHoward Hinnant 137854613ab4SEric Fiselier#endif // _LIBCPP_CXX03_LANG 13793e519524SHoward Hinnant 138054613ab4SEric Fiselier#if !defined(_LIBCPP_CXX03_LANG) 13813e519524SHoward Hinnant 13823e519524SHoward Hinnanttemplate <class _Alloc, class _Tp, class ..._Args> 1383ce48a113SHoward Hinnantdecltype(_VSTD::declval<_Alloc>().construct(_VSTD::declval<_Tp*>(), 1384ce48a113SHoward Hinnant _VSTD::declval<_Args>()...), 13853e519524SHoward Hinnant true_type()) 13863e519524SHoward Hinnant__has_construct_test(_Alloc&& __a, _Tp* __p, _Args&& ...__args); 13873e519524SHoward Hinnant 13883e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer, class ..._Args> 13893e519524SHoward Hinnantfalse_type 13903e519524SHoward Hinnant__has_construct_test(const _Alloc& __a, _Pointer&& __p, _Args&& ...__args); 13913e519524SHoward Hinnant 13923e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer, class ..._Args> 13933e519524SHoward Hinnantstruct __has_construct 13943e519524SHoward Hinnant : integral_constant<bool, 13953e519524SHoward Hinnant is_same< 13969f8fef95SEric Fiselier decltype(_VSTD::__has_construct_test(declval<_Alloc>(), 13973e519524SHoward Hinnant declval<_Pointer>(), 13983e519524SHoward Hinnant declval<_Args>()...)), 13993e519524SHoward Hinnant true_type>::value> 14003e519524SHoward Hinnant{ 14013e519524SHoward Hinnant}; 14023e519524SHoward Hinnant 14033e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer> 14043e519524SHoward Hinnantauto 14053e519524SHoward Hinnant__has_destroy_test(_Alloc&& __a, _Pointer&& __p) 14063e519524SHoward Hinnant -> decltype(__a.destroy(__p), true_type()); 14073e519524SHoward Hinnant 14083e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer> 14093e519524SHoward Hinnantauto 14103e519524SHoward Hinnant__has_destroy_test(const _Alloc& __a, _Pointer&& __p) 14113e519524SHoward Hinnant -> false_type; 14123e519524SHoward Hinnant 14133e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer> 14143e519524SHoward Hinnantstruct __has_destroy 14153e519524SHoward Hinnant : integral_constant<bool, 14163e519524SHoward Hinnant is_same< 14179f8fef95SEric Fiselier decltype(_VSTD::__has_destroy_test(declval<_Alloc>(), 14183e519524SHoward Hinnant declval<_Pointer>())), 14193e519524SHoward Hinnant true_type>::value> 14203e519524SHoward Hinnant{ 14213e519524SHoward Hinnant}; 14223e519524SHoward Hinnant 14233e519524SHoward Hinnanttemplate <class _Alloc> 14243e519524SHoward Hinnantauto 14253e519524SHoward Hinnant__has_max_size_test(_Alloc&& __a) 14263e519524SHoward Hinnant -> decltype(__a.max_size(), true_type()); 14273e519524SHoward Hinnant 14283e519524SHoward Hinnanttemplate <class _Alloc> 14293e519524SHoward Hinnantauto 14303e519524SHoward Hinnant__has_max_size_test(const volatile _Alloc& __a) 14313e519524SHoward Hinnant -> false_type; 14323e519524SHoward Hinnant 14333e519524SHoward Hinnanttemplate <class _Alloc> 14343e519524SHoward Hinnantstruct __has_max_size 14353e519524SHoward Hinnant : integral_constant<bool, 14363e519524SHoward Hinnant is_same< 14379f8fef95SEric Fiselier decltype(_VSTD::__has_max_size_test(declval<_Alloc&>())), 14383e519524SHoward Hinnant true_type>::value> 14393e519524SHoward Hinnant{ 14403e519524SHoward Hinnant}; 14413e519524SHoward Hinnant 14423e519524SHoward Hinnanttemplate <class _Alloc> 14433e519524SHoward Hinnantauto 14443e519524SHoward Hinnant__has_select_on_container_copy_construction_test(_Alloc&& __a) 14453e519524SHoward Hinnant -> decltype(__a.select_on_container_copy_construction(), true_type()); 14463e519524SHoward Hinnant 14473e519524SHoward Hinnanttemplate <class _Alloc> 14483e519524SHoward Hinnantauto 14493e519524SHoward Hinnant__has_select_on_container_copy_construction_test(const volatile _Alloc& __a) 14503e519524SHoward Hinnant -> false_type; 14513e519524SHoward Hinnant 14523e519524SHoward Hinnanttemplate <class _Alloc> 14533e519524SHoward Hinnantstruct __has_select_on_container_copy_construction 14543e519524SHoward Hinnant : integral_constant<bool, 14553e519524SHoward Hinnant is_same< 14569f8fef95SEric Fiselier decltype(_VSTD::__has_select_on_container_copy_construction_test(declval<_Alloc&>())), 14573e519524SHoward Hinnant true_type>::value> 14583e519524SHoward Hinnant{ 14593e519524SHoward Hinnant}; 14603e519524SHoward Hinnant 146154613ab4SEric Fiselier#else // _LIBCPP_CXX03_LANG 14623e519524SHoward Hinnant 1463e7652f5cSVolodymyr Sapsaitemplate <class _Alloc, class _Pointer, class _Tp, class = void> 1464e7652f5cSVolodymyr Sapsaistruct __has_construct : std::false_type {}; 14653e519524SHoward Hinnant 1466e7652f5cSVolodymyr Sapsaitemplate <class _Alloc, class _Pointer, class _Tp> 1467e7652f5cSVolodymyr Sapsaistruct __has_construct<_Alloc, _Pointer, _Tp, typename __void_t< 1468e7652f5cSVolodymyr Sapsai decltype(_VSTD::declval<_Alloc>().construct(_VSTD::declval<_Pointer>(), _VSTD::declval<_Tp>())) 1469e7652f5cSVolodymyr Sapsai>::type> : std::true_type {}; 14703e519524SHoward Hinnant 1471e7652f5cSVolodymyr Sapsaitemplate <class _Alloc, class _Pointer, class = void> 1472e7652f5cSVolodymyr Sapsaistruct __has_destroy : false_type {}; 14733e519524SHoward Hinnant 14743e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer> 1475e7652f5cSVolodymyr Sapsaistruct __has_destroy<_Alloc, _Pointer, typename __void_t< 1476e7652f5cSVolodymyr Sapsai decltype(_VSTD::declval<_Alloc>().destroy(_VSTD::declval<_Pointer>())) 1477e7652f5cSVolodymyr Sapsai>::type> : std::true_type {}; 14783e519524SHoward Hinnant 14793e519524SHoward Hinnanttemplate <class _Alloc> 14803e519524SHoward Hinnantstruct __has_max_size 14813e519524SHoward Hinnant : true_type 14823e519524SHoward Hinnant{ 14833e519524SHoward Hinnant}; 14843e519524SHoward Hinnant 14853e519524SHoward Hinnanttemplate <class _Alloc> 14863e519524SHoward Hinnantstruct __has_select_on_container_copy_construction 14873e519524SHoward Hinnant : false_type 14883e519524SHoward Hinnant{ 14893e519524SHoward Hinnant}; 14903e519524SHoward Hinnant 149154613ab4SEric Fiselier#endif // _LIBCPP_CXX03_LANG 14923e519524SHoward Hinnant 1493a4a1ef1fSHoward Hinnanttemplate <class _Alloc, class _Ptr, bool = __has_difference_type<_Alloc>::value> 1494a4a1ef1fSHoward Hinnantstruct __alloc_traits_difference_type 1495a4a1ef1fSHoward Hinnant{ 1496a4a1ef1fSHoward Hinnant typedef typename pointer_traits<_Ptr>::difference_type type; 1497a4a1ef1fSHoward Hinnant}; 1498a4a1ef1fSHoward Hinnant 1499a4a1ef1fSHoward Hinnanttemplate <class _Alloc, class _Ptr> 1500a4a1ef1fSHoward Hinnantstruct __alloc_traits_difference_type<_Alloc, _Ptr, true> 1501a4a1ef1fSHoward Hinnant{ 1502a4a1ef1fSHoward Hinnant typedef typename _Alloc::difference_type type; 1503a4a1ef1fSHoward Hinnant}; 1504a4a1ef1fSHoward Hinnant 1505*fb0e1908SVolodymyr Sapsaitemplate <class _Tp> 1506*fb0e1908SVolodymyr Sapsaistruct __is_default_allocator : false_type {}; 1507*fb0e1908SVolodymyr Sapsai 1508*fb0e1908SVolodymyr Sapsaitemplate <class _Tp> 1509*fb0e1908SVolodymyr Sapsaistruct __is_default_allocator<_VSTD::allocator<_Tp> > : true_type {}; 1510*fb0e1908SVolodymyr Sapsai 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 1572e7652f5cSVolodymyr Sapsai static void construct(allocator_type& __a, _Tp* __p, const _A0& __a0) 15733e519524SHoward Hinnant { 1574e7652f5cSVolodymyr Sapsai __construct(__has_construct<allocator_type, _Tp*, const _A0&>(), 1575e7652f5cSVolodymyr Sapsai __a, __p, __a0); 15763e519524SHoward Hinnant } 15773e519524SHoward Hinnant template <class _Tp, class _A0, class _A1> 1578848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1579a595b7f0SEric Fiselier static void construct(allocator_type&, _Tp* __p, const _A0& __a0, 15803e519524SHoward Hinnant const _A1& __a1) 15813e519524SHoward Hinnant { 15823e519524SHoward Hinnant ::new ((void*)__p) _Tp(__a0, __a1); 15833e519524SHoward Hinnant } 15843e519524SHoward Hinnant template <class _Tp, class _A0, class _A1, class _A2> 1585848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1586a595b7f0SEric Fiselier static void construct(allocator_type&, _Tp* __p, const _A0& __a0, 15873e519524SHoward Hinnant const _A1& __a1, const _A2& __a2) 15883e519524SHoward Hinnant { 15893e519524SHoward Hinnant ::new ((void*)__p) _Tp(__a0, __a1, __a2); 15903e519524SHoward Hinnant } 1591b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 15923e519524SHoward Hinnant 15933e519524SHoward Hinnant template <class _Tp> 1594848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15953e519524SHoward Hinnant static void destroy(allocator_type& __a, _Tp* __p) 15963e519524SHoward Hinnant {__destroy(__has_destroy<allocator_type, _Tp*>(), __a, __p);} 15973e519524SHoward Hinnant 1598848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 159906fbed03SMarshall Clow static size_type max_size(const allocator_type& __a) _NOEXCEPT 16003e519524SHoward Hinnant {return __max_size(__has_max_size<const allocator_type>(), __a);} 16013e519524SHoward Hinnant 1602848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16033e519524SHoward Hinnant static allocator_type 16043e519524SHoward Hinnant select_on_container_copy_construction(const allocator_type& __a) 16059ffacf3dSEric Fiselier {return __select_on_container_copy_construction( 16063e519524SHoward Hinnant __has_select_on_container_copy_construction<const allocator_type>(), 16073e519524SHoward Hinnant __a);} 16083e519524SHoward Hinnant 16099741d6c9SHoward Hinnant template <class _Ptr> 16109741d6c9SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16119741d6c9SHoward Hinnant static 16129741d6c9SHoward Hinnant void 16139741d6c9SHoward Hinnant __construct_forward(allocator_type& __a, _Ptr __begin1, _Ptr __end1, _Ptr& __begin2) 16149741d6c9SHoward Hinnant { 1615036a9a04SLouis Dionne for (; __begin1 != __end1; ++__begin1, (void) ++__begin2) 16169741d6c9SHoward Hinnant construct(__a, _VSTD::__to_raw_pointer(__begin2), _VSTD::move_if_noexcept(*__begin1)); 16179741d6c9SHoward Hinnant } 16189741d6c9SHoward Hinnant 16199741d6c9SHoward Hinnant template <class _Tp> 16209741d6c9SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16219741d6c9SHoward Hinnant static 16229741d6c9SHoward Hinnant typename enable_if 16239741d6c9SHoward Hinnant < 1624*fb0e1908SVolodymyr Sapsai (__is_default_allocator<allocator_type>::value 16259741d6c9SHoward Hinnant || !__has_construct<allocator_type, _Tp*, _Tp>::value) && 16269741d6c9SHoward Hinnant is_trivially_move_constructible<_Tp>::value, 16279741d6c9SHoward Hinnant void 16289741d6c9SHoward Hinnant >::type 1629fd838227SEric Fiselier __construct_forward(allocator_type&, _Tp* __begin1, _Tp* __end1, _Tp*& __begin2) 16309741d6c9SHoward Hinnant { 16319741d6c9SHoward Hinnant ptrdiff_t _Np = __end1 - __begin1; 163287601befSMarshall Clow if (_Np > 0) 1633e6230742SMarshall Clow { 16349741d6c9SHoward Hinnant _VSTD::memcpy(__begin2, __begin1, _Np * sizeof(_Tp)); 16359741d6c9SHoward Hinnant __begin2 += _Np; 16369741d6c9SHoward Hinnant } 1637e6230742SMarshall Clow } 16389741d6c9SHoward Hinnant 1639e782178eSEric Fiselier template <class _Iter, class _Ptr> 1640e782178eSEric Fiselier _LIBCPP_INLINE_VISIBILITY 1641e782178eSEric Fiselier static 1642e782178eSEric Fiselier void 1643e782178eSEric Fiselier __construct_range_forward(allocator_type& __a, _Iter __begin1, _Iter __end1, _Ptr& __begin2) 1644e782178eSEric Fiselier { 1645e782178eSEric Fiselier for (; __begin1 != __end1; ++__begin1, (void) ++__begin2) 1646e782178eSEric Fiselier construct(__a, _VSTD::__to_raw_pointer(__begin2), *__begin1); 1647e782178eSEric Fiselier } 1648e782178eSEric Fiselier 1649*fb0e1908SVolodymyr Sapsai template <class _SourceTp, class _DestTp, 1650*fb0e1908SVolodymyr Sapsai class _RawSourceTp = typename remove_const<_SourceTp>::type, 1651*fb0e1908SVolodymyr Sapsai class _RawDestTp = typename remove_const<_DestTp>::type> 1652e782178eSEric Fiselier _LIBCPP_INLINE_VISIBILITY 1653e782178eSEric Fiselier static 1654e782178eSEric Fiselier typename enable_if 1655e782178eSEric Fiselier < 1656*fb0e1908SVolodymyr Sapsai is_trivially_move_constructible<_DestTp>::value && 1657*fb0e1908SVolodymyr Sapsai is_same<_RawSourceTp, _RawDestTp>::value && 1658*fb0e1908SVolodymyr Sapsai (__is_default_allocator<allocator_type>::value || 1659*fb0e1908SVolodymyr Sapsai !__has_construct<allocator_type, _DestTp*, _SourceTp&>::value), 1660e782178eSEric Fiselier void 1661e782178eSEric Fiselier >::type 1662*fb0e1908SVolodymyr Sapsai __construct_range_forward(allocator_type&, _SourceTp* __begin1, _SourceTp* __end1, _DestTp*& __begin2) 1663e782178eSEric Fiselier { 1664e782178eSEric Fiselier ptrdiff_t _Np = __end1 - __begin1; 166587601befSMarshall Clow if (_Np > 0) 1666e6230742SMarshall Clow { 1667*fb0e1908SVolodymyr Sapsai _VSTD::memcpy(const_cast<_RawDestTp*>(__begin2), __begin1, _Np * sizeof(_DestTp)); 1668e782178eSEric Fiselier __begin2 += _Np; 1669e782178eSEric Fiselier } 1670e6230742SMarshall Clow } 1671e782178eSEric Fiselier 16729741d6c9SHoward Hinnant template <class _Ptr> 16739741d6c9SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16749741d6c9SHoward Hinnant static 16759741d6c9SHoward Hinnant void 16769741d6c9SHoward Hinnant __construct_backward(allocator_type& __a, _Ptr __begin1, _Ptr __end1, _Ptr& __end2) 16779741d6c9SHoward Hinnant { 16789741d6c9SHoward Hinnant while (__end1 != __begin1) 16798d9aec88SHoward Hinnant { 16808d9aec88SHoward Hinnant construct(__a, _VSTD::__to_raw_pointer(__end2-1), _VSTD::move_if_noexcept(*--__end1)); 16818d9aec88SHoward Hinnant --__end2; 16828d9aec88SHoward Hinnant } 16839741d6c9SHoward Hinnant } 16849741d6c9SHoward Hinnant 16859741d6c9SHoward Hinnant template <class _Tp> 16869741d6c9SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16879741d6c9SHoward Hinnant static 16889741d6c9SHoward Hinnant typename enable_if 16899741d6c9SHoward Hinnant < 1690*fb0e1908SVolodymyr Sapsai (__is_default_allocator<allocator_type>::value 16919741d6c9SHoward Hinnant || !__has_construct<allocator_type, _Tp*, _Tp>::value) && 16929741d6c9SHoward Hinnant is_trivially_move_constructible<_Tp>::value, 16939741d6c9SHoward Hinnant void 16949741d6c9SHoward Hinnant >::type 1695fd838227SEric Fiselier __construct_backward(allocator_type&, _Tp* __begin1, _Tp* __end1, _Tp*& __end2) 16969741d6c9SHoward Hinnant { 16979741d6c9SHoward Hinnant ptrdiff_t _Np = __end1 - __begin1; 16989741d6c9SHoward Hinnant __end2 -= _Np; 169987601befSMarshall Clow if (_Np > 0) 17009741d6c9SHoward Hinnant _VSTD::memcpy(__end2, __begin1, _Np * sizeof(_Tp)); 17019741d6c9SHoward Hinnant } 17029741d6c9SHoward Hinnant 17033e519524SHoward Hinnantprivate: 17043e519524SHoward Hinnant 1705848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17069ffacf3dSEric Fiselier static pointer __allocate(allocator_type& __a, size_type __n, 17073e519524SHoward Hinnant const_void_pointer __hint, true_type) 17083e519524SHoward Hinnant {return __a.allocate(__n, __hint);} 1709848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17109ffacf3dSEric Fiselier static pointer __allocate(allocator_type& __a, size_type __n, 1711c206366fSHoward Hinnant const_void_pointer, false_type) 17123e519524SHoward Hinnant {return __a.allocate(__n);} 17133e519524SHoward Hinnant 17143e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 17153e519524SHoward Hinnant template <class _Tp, class... _Args> 1716848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17173e519524SHoward Hinnant static void __construct(true_type, allocator_type& __a, _Tp* __p, _Args&&... __args) 1718ce48a113SHoward Hinnant {__a.construct(__p, _VSTD::forward<_Args>(__args)...);} 17193e519524SHoward Hinnant template <class _Tp, class... _Args> 1720848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17213e519524SHoward Hinnant static void __construct(false_type, allocator_type&, _Tp* __p, _Args&&... __args) 17223e519524SHoward Hinnant { 1723ce48a113SHoward Hinnant ::new ((void*)__p) _Tp(_VSTD::forward<_Args>(__args)...); 17243e519524SHoward Hinnant } 1725e7652f5cSVolodymyr Sapsai#else // _LIBCPP_HAS_NO_VARIADICS 1726e7652f5cSVolodymyr Sapsai template <class _Tp, class _A0> 1727e7652f5cSVolodymyr Sapsai _LIBCPP_INLINE_VISIBILITY 1728e7652f5cSVolodymyr Sapsai static void __construct(true_type, allocator_type& __a, _Tp* __p, 1729e7652f5cSVolodymyr Sapsai const _A0& __a0) 1730e7652f5cSVolodymyr Sapsai {__a.construct(__p, __a0);} 1731e7652f5cSVolodymyr Sapsai template <class _Tp, class _A0> 1732e7652f5cSVolodymyr Sapsai _LIBCPP_INLINE_VISIBILITY 1733e7652f5cSVolodymyr Sapsai static void __construct(false_type, allocator_type&, _Tp* __p, 1734e7652f5cSVolodymyr Sapsai const _A0& __a0) 1735e7652f5cSVolodymyr Sapsai { 1736e7652f5cSVolodymyr Sapsai ::new ((void*)__p) _Tp(__a0); 1737e7652f5cSVolodymyr Sapsai } 1738b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 17393e519524SHoward Hinnant 17403e519524SHoward Hinnant template <class _Tp> 1741848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17423e519524SHoward Hinnant static void __destroy(true_type, allocator_type& __a, _Tp* __p) 17433e519524SHoward Hinnant {__a.destroy(__p);} 17443e519524SHoward Hinnant template <class _Tp> 1745848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17463e519524SHoward Hinnant static void __destroy(false_type, allocator_type&, _Tp* __p) 17473e519524SHoward Hinnant { 17483e519524SHoward Hinnant __p->~_Tp(); 17493e519524SHoward Hinnant } 17503e519524SHoward Hinnant 1751848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1752fa40ee77SMarshall Clow static size_type __max_size(true_type, const allocator_type& __a) _NOEXCEPT 17533e519524SHoward Hinnant {return __a.max_size();} 1754848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1755fa40ee77SMarshall Clow static size_type __max_size(false_type, const allocator_type&) _NOEXCEPT 1756b631c243SMarshall Clow {return numeric_limits<size_type>::max() / sizeof(value_type);} 17573e519524SHoward Hinnant 1758848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17593e519524SHoward Hinnant static allocator_type 17609ffacf3dSEric Fiselier __select_on_container_copy_construction(true_type, const allocator_type& __a) 17613e519524SHoward Hinnant {return __a.select_on_container_copy_construction();} 1762848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17633e519524SHoward Hinnant static allocator_type 17649ffacf3dSEric Fiselier __select_on_container_copy_construction(false_type, const allocator_type& __a) 17653e519524SHoward Hinnant {return __a;} 17663e519524SHoward Hinnant}; 17673e519524SHoward Hinnant 17681f508014SMarshall Clowtemplate <class _Traits, class _Tp> 17691f508014SMarshall Clowstruct __rebind_alloc_helper 17701f508014SMarshall Clow{ 177154613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 17721f508014SMarshall Clow typedef typename _Traits::template rebind_alloc<_Tp> type; 17731f508014SMarshall Clow#else 17741f508014SMarshall Clow typedef typename _Traits::template rebind_alloc<_Tp>::other type; 17751f508014SMarshall Clow#endif 17761f508014SMarshall Clow}; 17771f508014SMarshall Clow 17783e519524SHoward Hinnant// allocator 17793e519524SHoward Hinnant 17803e519524SHoward Hinnanttemplate <class _Tp> 1781e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS allocator 17823e519524SHoward Hinnant{ 17833e519524SHoward Hinnantpublic: 17843e519524SHoward Hinnant typedef size_t size_type; 17853e519524SHoward Hinnant typedef ptrdiff_t difference_type; 17863e519524SHoward Hinnant typedef _Tp* pointer; 17873e519524SHoward Hinnant typedef const _Tp* const_pointer; 17883e519524SHoward Hinnant typedef _Tp& reference; 17893e519524SHoward Hinnant typedef const _Tp& const_reference; 17903e519524SHoward Hinnant typedef _Tp value_type; 17913e519524SHoward Hinnant 1792b58f59cdSHoward Hinnant typedef true_type propagate_on_container_move_assignment; 179331a47313SMarshall Clow typedef true_type is_always_equal; 1794b58f59cdSHoward Hinnant 17953e519524SHoward Hinnant template <class _Up> struct rebind {typedef allocator<_Up> other;}; 17963e519524SHoward Hinnant 1797e0742c4aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 1798e0742c4aSMarshall Clow allocator() _NOEXCEPT {} 1799e0742c4aSMarshall Clow 1800e0742c4aSMarshall Clow template <class _Up> 1801e0742c4aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 1802e0742c4aSMarshall Clow allocator(const allocator<_Up>&) _NOEXCEPT {} 1803e0742c4aSMarshall Clow 18043739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer address(reference __x) const _NOEXCEPT 1805ce48a113SHoward Hinnant {return _VSTD::addressof(__x);} 18063739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY const_pointer address(const_reference __x) const _NOEXCEPT 1807ce48a113SHoward Hinnant {return _VSTD::addressof(__x);} 18083fddff51SMarshall Clow _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 18093fddff51SMarshall Clow pointer allocate(size_type __n, allocator<void>::const_pointer = 0) 18104cec709eSMarshall Clow { 18114cec709eSMarshall Clow if (__n > max_size()) 18120fc8cec7SMarshall Clow __throw_length_error("allocator<T>::allocate(size_t n)" 18130fc8cec7SMarshall Clow " 'n' exceeds maximum supported size"); 18149d25ada4SEric Fiselier return static_cast<pointer>(_VSTD::__libcpp_allocate(__n * sizeof(_Tp), __alignof(_Tp))); 18154cec709eSMarshall Clow } 1816f25b75b9SEric Fiselier _LIBCPP_INLINE_VISIBILITY void deallocate(pointer __p, size_type __n) _NOEXCEPT 18179d25ada4SEric Fiselier {_VSTD::__libcpp_deallocate((void*)__p, __n * sizeof(_Tp), __alignof(_Tp));} 18183739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT 18193739fe79SHoward Hinnant {return size_type(~0) / sizeof(_Tp);} 18207609c9b6SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 18213e519524SHoward Hinnant template <class _Up, class... _Args> 18223e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18233e519524SHoward Hinnant void 18243e519524SHoward Hinnant construct(_Up* __p, _Args&&... __args) 18253e519524SHoward Hinnant { 1826ce48a113SHoward Hinnant ::new((void*)__p) _Up(_VSTD::forward<_Args>(__args)...); 18273e519524SHoward Hinnant } 18287609c9b6SHoward Hinnant#else // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 18293e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18303e519524SHoward Hinnant void 18313e519524SHoward Hinnant construct(pointer __p) 18323e519524SHoward Hinnant { 18333e519524SHoward Hinnant ::new((void*)__p) _Tp(); 18343e519524SHoward Hinnant } 1835f5799be4SMichael J. Spencer# if defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) 1836bff1bfc6SHoward Hinnant 18373e519524SHoward Hinnant template <class _A0> 18383e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18393e519524SHoward Hinnant void 18403e519524SHoward Hinnant construct(pointer __p, _A0& __a0) 18413e519524SHoward Hinnant { 18423e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0); 18433e519524SHoward Hinnant } 18443e519524SHoward Hinnant template <class _A0> 18453e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18463e519524SHoward Hinnant void 18473e519524SHoward Hinnant construct(pointer __p, const _A0& __a0) 18483e519524SHoward Hinnant { 18493e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0); 18503e519524SHoward Hinnant } 1851f5799be4SMichael J. Spencer# endif // defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) 18523e519524SHoward Hinnant template <class _A0, class _A1> 18533e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18543e519524SHoward Hinnant void 18553e519524SHoward Hinnant construct(pointer __p, _A0& __a0, _A1& __a1) 18563e519524SHoward Hinnant { 18573e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 18583e519524SHoward Hinnant } 18593e519524SHoward Hinnant template <class _A0, class _A1> 18603e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18613e519524SHoward Hinnant void 18623e519524SHoward Hinnant construct(pointer __p, const _A0& __a0, _A1& __a1) 18633e519524SHoward Hinnant { 18643e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 18653e519524SHoward Hinnant } 18663e519524SHoward Hinnant template <class _A0, class _A1> 18673e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18683e519524SHoward Hinnant void 18693e519524SHoward Hinnant construct(pointer __p, _A0& __a0, const _A1& __a1) 18703e519524SHoward Hinnant { 18713e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 18723e519524SHoward Hinnant } 18733e519524SHoward Hinnant template <class _A0, class _A1> 18743e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18753e519524SHoward Hinnant void 18763e519524SHoward Hinnant construct(pointer __p, const _A0& __a0, const _A1& __a1) 18773e519524SHoward Hinnant { 18783e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 18793e519524SHoward Hinnant } 18807609c9b6SHoward Hinnant#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 18813e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void destroy(pointer __p) {__p->~_Tp();} 18823e519524SHoward Hinnant}; 18833e519524SHoward Hinnant 18848e25104bSHoward Hinnanttemplate <class _Tp> 1885e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS allocator<const _Tp> 18868e25104bSHoward Hinnant{ 18878e25104bSHoward Hinnantpublic: 18888e25104bSHoward Hinnant typedef size_t size_type; 18898e25104bSHoward Hinnant typedef ptrdiff_t difference_type; 18908e25104bSHoward Hinnant typedef const _Tp* pointer; 18918e25104bSHoward Hinnant typedef const _Tp* const_pointer; 18928e25104bSHoward Hinnant typedef const _Tp& reference; 18938e25104bSHoward Hinnant typedef const _Tp& const_reference; 189430444adcSHoward Hinnant typedef const _Tp value_type; 18958e25104bSHoward Hinnant 18968e25104bSHoward Hinnant typedef true_type propagate_on_container_move_assignment; 1897f43a42d5SMarshall Clow typedef true_type is_always_equal; 18988e25104bSHoward Hinnant 18998e25104bSHoward Hinnant template <class _Up> struct rebind {typedef allocator<_Up> other;}; 19008e25104bSHoward Hinnant 1901e0742c4aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 1902e0742c4aSMarshall Clow allocator() _NOEXCEPT {} 1903e0742c4aSMarshall Clow 1904e0742c4aSMarshall Clow template <class _Up> 1905e0742c4aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 1906e0742c4aSMarshall Clow allocator(const allocator<_Up>&) _NOEXCEPT {} 1907e0742c4aSMarshall Clow 19088e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY const_pointer address(const_reference __x) const _NOEXCEPT 19098e25104bSHoward Hinnant {return _VSTD::addressof(__x);} 19108e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer allocate(size_type __n, allocator<void>::const_pointer = 0) 19114cec709eSMarshall Clow { 19124cec709eSMarshall Clow if (__n > max_size()) 19130fc8cec7SMarshall Clow __throw_length_error("allocator<const T>::allocate(size_t n)" 19140fc8cec7SMarshall Clow " 'n' exceeds maximum supported size"); 19159d25ada4SEric Fiselier return static_cast<pointer>(_VSTD::__libcpp_allocate(__n * sizeof(_Tp), __alignof(_Tp))); 19164cec709eSMarshall Clow } 1917f25b75b9SEric Fiselier _LIBCPP_INLINE_VISIBILITY void deallocate(pointer __p, size_type __n) _NOEXCEPT 19189d25ada4SEric Fiselier {_VSTD::__libcpp_deallocate((void*) const_cast<_Tp *>(__p), __n * sizeof(_Tp), __alignof(_Tp));} 19198e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT 19208e25104bSHoward Hinnant {return size_type(~0) / sizeof(_Tp);} 19218e25104bSHoward Hinnant#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 19228e25104bSHoward Hinnant template <class _Up, class... _Args> 19238e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19248e25104bSHoward Hinnant void 19258e25104bSHoward Hinnant construct(_Up* __p, _Args&&... __args) 19268e25104bSHoward Hinnant { 19278e25104bSHoward Hinnant ::new((void*)__p) _Up(_VSTD::forward<_Args>(__args)...); 19288e25104bSHoward Hinnant } 19298e25104bSHoward Hinnant#else // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 19308e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19318e25104bSHoward Hinnant void 19328e25104bSHoward Hinnant construct(pointer __p) 19338e25104bSHoward Hinnant { 19344a911c86SMarshall Clow ::new((void*) const_cast<_Tp *>(__p)) _Tp(); 19358e25104bSHoward Hinnant } 19368e25104bSHoward Hinnant# if defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) 1937bff1bfc6SHoward Hinnant 19388e25104bSHoward Hinnant template <class _A0> 19398e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19408e25104bSHoward Hinnant void 19418e25104bSHoward Hinnant construct(pointer __p, _A0& __a0) 19428e25104bSHoward Hinnant { 19434a911c86SMarshall Clow ::new((void*) const_cast<_Tp *>(__p)) _Tp(__a0); 19448e25104bSHoward Hinnant } 19458e25104bSHoward Hinnant template <class _A0> 19468e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19478e25104bSHoward Hinnant void 19488e25104bSHoward Hinnant construct(pointer __p, const _A0& __a0) 19498e25104bSHoward Hinnant { 19504a911c86SMarshall Clow ::new((void*) const_cast<_Tp *>(__p)) _Tp(__a0); 19518e25104bSHoward Hinnant } 19528e25104bSHoward Hinnant# endif // defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) 19538e25104bSHoward Hinnant template <class _A0, class _A1> 19548e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19558e25104bSHoward Hinnant void 19568e25104bSHoward Hinnant construct(pointer __p, _A0& __a0, _A1& __a1) 19578e25104bSHoward Hinnant { 19584a911c86SMarshall Clow ::new((void*) const_cast<_Tp *>(__p)) _Tp(__a0, __a1); 19598e25104bSHoward Hinnant } 19608e25104bSHoward Hinnant template <class _A0, class _A1> 19618e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19628e25104bSHoward Hinnant void 19638e25104bSHoward Hinnant construct(pointer __p, const _A0& __a0, _A1& __a1) 19648e25104bSHoward Hinnant { 19654a911c86SMarshall Clow ::new((void*) const_cast<_Tp *>(__p)) _Tp(__a0, __a1); 19668e25104bSHoward Hinnant } 19678e25104bSHoward Hinnant template <class _A0, class _A1> 19688e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19698e25104bSHoward Hinnant void 19708e25104bSHoward Hinnant construct(pointer __p, _A0& __a0, const _A1& __a1) 19718e25104bSHoward Hinnant { 19724a911c86SMarshall Clow ::new((void*) const_cast<_Tp *>(__p)) _Tp(__a0, __a1); 19738e25104bSHoward Hinnant } 19748e25104bSHoward Hinnant template <class _A0, class _A1> 19758e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19768e25104bSHoward Hinnant void 19778e25104bSHoward Hinnant construct(pointer __p, const _A0& __a0, const _A1& __a1) 19788e25104bSHoward Hinnant { 19794a911c86SMarshall Clow ::new((void*) const_cast<_Tp *>(__p)) _Tp(__a0, __a1); 19808e25104bSHoward Hinnant } 19818e25104bSHoward Hinnant#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 19828e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY void destroy(pointer __p) {__p->~_Tp();} 19838e25104bSHoward Hinnant}; 19848e25104bSHoward Hinnant 19853e519524SHoward Hinnanttemplate <class _Tp, class _Up> 19863e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 19873739fe79SHoward Hinnantbool operator==(const allocator<_Tp>&, const allocator<_Up>&) _NOEXCEPT {return true;} 19883e519524SHoward Hinnant 19893e519524SHoward Hinnanttemplate <class _Tp, class _Up> 19903e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 19913739fe79SHoward Hinnantbool operator!=(const allocator<_Tp>&, const allocator<_Up>&) _NOEXCEPT {return false;} 19923e519524SHoward Hinnant 19933e519524SHoward Hinnanttemplate <class _OutputIterator, class _Tp> 1994e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS raw_storage_iterator 19953e519524SHoward Hinnant : public iterator<output_iterator_tag, 19963e519524SHoward Hinnant _Tp, // purposefully not C++03 19973e519524SHoward Hinnant ptrdiff_t, // purposefully not C++03 19983e519524SHoward Hinnant _Tp*, // purposefully not C++03 19993e519524SHoward Hinnant raw_storage_iterator<_OutputIterator, _Tp>&> // purposefully not C++03 20003e519524SHoward Hinnant{ 20013e519524SHoward Hinnantprivate: 20023e519524SHoward Hinnant _OutputIterator __x_; 20033e519524SHoward Hinnantpublic: 20043e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit raw_storage_iterator(_OutputIterator __x) : __x_(__x) {} 20053e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator*() {return *this;} 20063e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator=(const _Tp& __element) 2007fa8ce345SMarshall Clow {::new(_VSTD::addressof(*__x_)) _Tp(__element); return *this;} 20082603b075SMarshall Clow#if _LIBCPP_STD_VER >= 14 20092603b075SMarshall Clow _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator=(_Tp&& __element) 2010fa8ce345SMarshall Clow {::new(_VSTD::addressof(*__x_)) _Tp(_VSTD::move(__element)); return *this;} 20112603b075SMarshall Clow#endif 20123e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator++() {++__x_; return *this;} 20133e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY raw_storage_iterator operator++(int) 20143e519524SHoward Hinnant {raw_storage_iterator __t(*this); ++__x_; return __t;} 2015783b372aSMarshall Clow#if _LIBCPP_STD_VER >= 14 2016783b372aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _OutputIterator base() const { return __x_; } 2017783b372aSMarshall Clow#endif 20183e519524SHoward Hinnant}; 20193e519524SHoward Hinnant 20203e519524SHoward Hinnanttemplate <class _Tp> 2021c65d39a4SRoman Lebedev_LIBCPP_NODISCARD_EXT _LIBCPP_NO_CFI 20223e519524SHoward Hinnantpair<_Tp*, ptrdiff_t> 20233739fe79SHoward Hinnantget_temporary_buffer(ptrdiff_t __n) _NOEXCEPT 20243e519524SHoward Hinnant{ 20253e519524SHoward Hinnant pair<_Tp*, ptrdiff_t> __r(0, 0); 20263e519524SHoward Hinnant const ptrdiff_t __m = (~ptrdiff_t(0) ^ 20273e519524SHoward Hinnant ptrdiff_t(ptrdiff_t(1) << (sizeof(ptrdiff_t) * __CHAR_BIT__ - 1))) 20283e519524SHoward Hinnant / sizeof(_Tp); 20293e519524SHoward Hinnant if (__n > __m) 20303e519524SHoward Hinnant __n = __m; 20313e519524SHoward Hinnant while (__n > 0) 20323e519524SHoward Hinnant { 203343245b1fSEric Fiselier#if !defined(_LIBCPP_HAS_NO_ALIGNED_ALLOCATION) 20349d25ada4SEric Fiselier if (__is_overaligned_for_new(__alignof(_Tp))) 20354e3195c9SRichard Smith { 20364e3195c9SRichard Smith std::align_val_t __al = 20374e3195c9SRichard Smith std::align_val_t(std::alignment_of<_Tp>::value); 20384e3195c9SRichard Smith __r.first = static_cast<_Tp*>(::operator new( 20394e3195c9SRichard Smith __n * sizeof(_Tp), __al, nothrow)); 20404e3195c9SRichard Smith } else { 20414e3195c9SRichard Smith __r.first = static_cast<_Tp*>(::operator new( 20424e3195c9SRichard Smith __n * sizeof(_Tp), nothrow)); 20434e3195c9SRichard Smith } 20444e3195c9SRichard Smith#else 20459d25ada4SEric Fiselier if (__is_overaligned_for_new(__alignof(_Tp))) 20464e3195c9SRichard Smith { 20474e3195c9SRichard Smith // Since aligned operator new is unavailable, return an empty 20484e3195c9SRichard Smith // buffer rather than one with invalid alignment. 20494e3195c9SRichard Smith return __r; 20504e3195c9SRichard Smith } 20514e3195c9SRichard Smith 20523e519524SHoward Hinnant __r.first = static_cast<_Tp*>(::operator new(__n * sizeof(_Tp), nothrow)); 20534e3195c9SRichard Smith#endif 20544e3195c9SRichard Smith 20553e519524SHoward Hinnant if (__r.first) 20563e519524SHoward Hinnant { 20573e519524SHoward Hinnant __r.second = __n; 20583e519524SHoward Hinnant break; 20593e519524SHoward Hinnant } 20603e519524SHoward Hinnant __n /= 2; 20613e519524SHoward Hinnant } 20623e519524SHoward Hinnant return __r; 20633e519524SHoward Hinnant} 20643e519524SHoward Hinnant 20653e519524SHoward Hinnanttemplate <class _Tp> 20663e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 20674e3195c9SRichard Smithvoid return_temporary_buffer(_Tp* __p) _NOEXCEPT 20684e3195c9SRichard Smith{ 20699d25ada4SEric Fiselier _VSTD::__libcpp_deallocate_unsized((void*)__p, __alignof(_Tp)); 20704e3195c9SRichard Smith} 20713e519524SHoward Hinnant 2072e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR) 20733e519524SHoward Hinnanttemplate <class _Tp> 2074ea5cd3b4SLouis Dionnestruct _LIBCPP_DEPRECATED_IN_CXX11 auto_ptr_ref 20753e519524SHoward Hinnant{ 20763e519524SHoward Hinnant _Tp* __ptr_; 20773e519524SHoward Hinnant}; 20783e519524SHoward Hinnant 20793e519524SHoward Hinnanttemplate<class _Tp> 2080ea5cd3b4SLouis Dionneclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 auto_ptr 20813e519524SHoward Hinnant{ 20823e519524SHoward Hinnantprivate: 20833e519524SHoward Hinnant _Tp* __ptr_; 20843e519524SHoward Hinnantpublic: 20853e519524SHoward Hinnant typedef _Tp element_type; 20863e519524SHoward Hinnant 20873e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit auto_ptr(_Tp* __p = 0) throw() : __ptr_(__p) {} 20883e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr& __p) throw() : __ptr_(__p.release()) {} 20893e519524SHoward Hinnant template<class _Up> _LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr<_Up>& __p) throw() 20903e519524SHoward Hinnant : __ptr_(__p.release()) {} 20913e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr& __p) throw() 20923e519524SHoward Hinnant {reset(__p.release()); return *this;} 20933e519524SHoward Hinnant template<class _Up> _LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr<_Up>& __p) throw() 20943e519524SHoward Hinnant {reset(__p.release()); return *this;} 20953e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr_ref<_Tp> __p) throw() 20963e519524SHoward Hinnant {reset(__p.__ptr_); return *this;} 20973e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY ~auto_ptr() throw() {delete __ptr_;} 20983e519524SHoward Hinnant 20993e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Tp& operator*() const throw() 21003e519524SHoward Hinnant {return *__ptr_;} 21013e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Tp* operator->() const throw() {return __ptr_;} 21023e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Tp* get() const throw() {return __ptr_;} 21033e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Tp* release() throw() 21043e519524SHoward Hinnant { 21053e519524SHoward Hinnant _Tp* __t = __ptr_; 21063e519524SHoward Hinnant __ptr_ = 0; 21073e519524SHoward Hinnant return __t; 21083e519524SHoward Hinnant } 21093e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void reset(_Tp* __p = 0) throw() 21103e519524SHoward Hinnant { 21113e519524SHoward Hinnant if (__ptr_ != __p) 21123e519524SHoward Hinnant delete __ptr_; 21133e519524SHoward Hinnant __ptr_ = __p; 21143e519524SHoward Hinnant } 21153e519524SHoward Hinnant 21163e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr_ref<_Tp> __p) throw() : __ptr_(__p.__ptr_) {} 21173e519524SHoward Hinnant template<class _Up> _LIBCPP_INLINE_VISIBILITY operator auto_ptr_ref<_Up>() throw() 21183e519524SHoward Hinnant {auto_ptr_ref<_Up> __t; __t.__ptr_ = release(); return __t;} 21193e519524SHoward Hinnant template<class _Up> _LIBCPP_INLINE_VISIBILITY operator auto_ptr<_Up>() throw() 21203e519524SHoward Hinnant {return auto_ptr<_Up>(release());} 21213e519524SHoward Hinnant}; 21223e519524SHoward Hinnant 21233e519524SHoward Hinnanttemplate <> 2124ea5cd3b4SLouis Dionneclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 auto_ptr<void> 21253e519524SHoward Hinnant{ 21263e519524SHoward Hinnantpublic: 21273e519524SHoward Hinnant typedef void element_type; 21283e519524SHoward Hinnant}; 2129e67179bcSMarshall Clow#endif 21303e519524SHoward Hinnant 2131c88580c4SEric Fiseliertemplate <class _Tp, int _Idx, 2132c88580c4SEric Fiselier bool _CanBeEmptyBase = 2133c88580c4SEric Fiselier is_empty<_Tp>::value && !__libcpp_is_final<_Tp>::value> 2134c88580c4SEric Fiselierstruct __compressed_pair_elem { 2135c88580c4SEric Fiselier typedef _Tp _ParamT; 2136c88580c4SEric Fiselier typedef _Tp& reference; 2137c88580c4SEric Fiselier typedef const _Tp& const_reference; 21383e519524SHoward Hinnant 2139c88580c4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 21409dae972cSAlex Lorenz _LIBCPP_INLINE_VISIBILITY constexpr __compressed_pair_elem() : __value_() {} 21413e519524SHoward Hinnant 2142c88580c4SEric Fiselier template <class _Up, class = typename enable_if< 21438948264eSEric Fiselier !is_same<__compressed_pair_elem, typename decay<_Up>::type>::value 21448948264eSEric Fiselier >::type> 21459dae972cSAlex Lorenz _LIBCPP_INLINE_VISIBILITY 21468948264eSEric Fiselier constexpr explicit 2147c88580c4SEric Fiselier __compressed_pair_elem(_Up&& __u) 21480b485f3eSEric Fiselier : __value_(_VSTD::forward<_Up>(__u)) 21490b485f3eSEric Fiselier { 21500b485f3eSEric Fiselier } 21513e519524SHoward Hinnant 2152c88580c4SEric Fiselier template <class... _Args, size_t... _Indexes> 2153c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 2154c88580c4SEric Fiselier __compressed_pair_elem(piecewise_construct_t, tuple<_Args...> __args, 2155c88580c4SEric Fiselier __tuple_indices<_Indexes...>) 2156c88580c4SEric Fiselier : __value_(_VSTD::forward<_Args>(_VSTD::get<_Indexes>(__args))...) {} 2157c88580c4SEric Fiselier#else 21589dae972cSAlex Lorenz _LIBCPP_INLINE_VISIBILITY __compressed_pair_elem() : __value_() {} 21599dae972cSAlex Lorenz _LIBCPP_INLINE_VISIBILITY 2160c88580c4SEric Fiselier __compressed_pair_elem(_ParamT __p) : __value_(std::forward<_ParamT>(__p)) {} 2161c88580c4SEric Fiselier#endif 21623e519524SHoward Hinnant 21639dae972cSAlex Lorenz _LIBCPP_INLINE_VISIBILITY reference __get() _NOEXCEPT { return __value_; } 21649dae972cSAlex Lorenz _LIBCPP_INLINE_VISIBILITY 2165c88580c4SEric Fiselier const_reference __get() const _NOEXCEPT { return __value_; } 21663e519524SHoward Hinnant 21673e519524SHoward Hinnantprivate: 2168c88580c4SEric Fiselier _Tp __value_; 21693e519524SHoward Hinnant}; 21703e519524SHoward Hinnant 2171c88580c4SEric Fiseliertemplate <class _Tp, int _Idx> 2172c88580c4SEric Fiselierstruct __compressed_pair_elem<_Tp, _Idx, true> : private _Tp { 2173c88580c4SEric Fiselier typedef _Tp _ParamT; 2174c88580c4SEric Fiselier typedef _Tp& reference; 2175c88580c4SEric Fiselier typedef const _Tp& const_reference; 2176c88580c4SEric Fiselier typedef _Tp __value_type; 21773e519524SHoward Hinnant 2178c88580c4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 21799dae972cSAlex Lorenz _LIBCPP_INLINE_VISIBILITY constexpr __compressed_pair_elem() = default; 21803e519524SHoward Hinnant 2181c88580c4SEric Fiselier template <class _Up, class = typename enable_if< 21828948264eSEric Fiselier !is_same<__compressed_pair_elem, typename decay<_Up>::type>::value 21838948264eSEric Fiselier >::type> 21849dae972cSAlex Lorenz _LIBCPP_INLINE_VISIBILITY 21858948264eSEric Fiselier constexpr explicit 2186c88580c4SEric Fiselier __compressed_pair_elem(_Up&& __u) 21870b485f3eSEric Fiselier : __value_type(_VSTD::forward<_Up>(__u)) 21880b485f3eSEric Fiselier {} 21893e519524SHoward Hinnant 2190c88580c4SEric Fiselier template <class... _Args, size_t... _Indexes> 2191c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 2192c88580c4SEric Fiselier __compressed_pair_elem(piecewise_construct_t, tuple<_Args...> __args, 2193c88580c4SEric Fiselier __tuple_indices<_Indexes...>) 2194c88580c4SEric Fiselier : __value_type(_VSTD::forward<_Args>(_VSTD::get<_Indexes>(__args))...) {} 2195c88580c4SEric Fiselier#else 21969dae972cSAlex Lorenz _LIBCPP_INLINE_VISIBILITY __compressed_pair_elem() : __value_type() {} 21979dae972cSAlex Lorenz _LIBCPP_INLINE_VISIBILITY 2198c88580c4SEric Fiselier __compressed_pair_elem(_ParamT __p) 2199c88580c4SEric Fiselier : __value_type(std::forward<_ParamT>(__p)) {} 2200c88580c4SEric Fiselier#endif 22013e519524SHoward Hinnant 22029dae972cSAlex Lorenz _LIBCPP_INLINE_VISIBILITY reference __get() _NOEXCEPT { return *this; } 22039dae972cSAlex Lorenz _LIBCPP_INLINE_VISIBILITY 2204c88580c4SEric Fiselier const_reference __get() const _NOEXCEPT { return *this; } 22053e519524SHoward Hinnant}; 22063e519524SHoward Hinnant 2207c88580c4SEric Fiselier// Tag used to construct the second element of the compressed pair. 2208c88580c4SEric Fiselierstruct __second_tag {}; 2209c88580c4SEric Fiselier 22103e519524SHoward Hinnanttemplate <class _T1, class _T2> 2211c88580c4SEric Fiselierclass __compressed_pair : private __compressed_pair_elem<_T1, 0>, 2212c88580c4SEric Fiselier private __compressed_pair_elem<_T2, 1> { 2213c88580c4SEric Fiselier typedef __compressed_pair_elem<_T1, 0> _Base1; 2214c88580c4SEric Fiselier typedef __compressed_pair_elem<_T2, 1> _Base2; 2215c88580c4SEric Fiselier 2216c88580c4SEric Fiselier // NOTE: This static assert should never fire because __compressed_pair 2217c88580c4SEric Fiselier // is *almost never* used in a scenario where it's possible for T1 == T2. 2218c88580c4SEric Fiselier // (The exception is std::function where it is possible that the function 2219c88580c4SEric Fiselier // object and the allocator have the same type). 2220b411e9ceSEric Fiselier static_assert((!is_same<_T1, _T2>::value), 2221c88580c4SEric Fiselier "__compressed_pair cannot be instantated when T1 and T2 are the same type; " 2222c88580c4SEric Fiselier "The current implementation is NOT ABI-compatible with the previous " 2223c88580c4SEric Fiselier "implementation for this configuration"); 2224c88580c4SEric Fiselier 22253e519524SHoward Hinnantpublic: 2226c88580c4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 22278948264eSEric Fiselier template <bool _Dummy = true, 22288948264eSEric Fiselier class = typename enable_if< 22298948264eSEric Fiselier __dependent_type<is_default_constructible<_T1>, _Dummy>::value && 22308948264eSEric Fiselier __dependent_type<is_default_constructible<_T2>, _Dummy>::value 22318948264eSEric Fiselier >::type 22328948264eSEric Fiselier > 2233a87b5e34SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 22348948264eSEric Fiselier constexpr __compressed_pair() {} 2235a87b5e34SHoward Hinnant 2236c88580c4SEric Fiselier template <class _Tp, typename enable_if<!is_same<typename decay<_Tp>::type, 2237c88580c4SEric Fiselier __compressed_pair>::value, 2238c88580c4SEric Fiselier bool>::type = true> 2239c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY constexpr explicit 2240c88580c4SEric Fiselier __compressed_pair(_Tp&& __t) 2241c88580c4SEric Fiselier : _Base1(std::forward<_Tp>(__t)), _Base2() {} 2242a87b5e34SHoward Hinnant 2243c88580c4SEric Fiselier template <class _Tp> 2244c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY constexpr 2245c88580c4SEric Fiselier __compressed_pair(__second_tag, _Tp&& __t) 2246c88580c4SEric Fiselier : _Base1(), _Base2(std::forward<_Tp>(__t)) {} 2247a87b5e34SHoward Hinnant 2248c88580c4SEric Fiselier template <class _U1, class _U2> 2249c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY constexpr 2250c88580c4SEric Fiselier __compressed_pair(_U1&& __t1, _U2&& __t2) 2251c88580c4SEric Fiselier : _Base1(std::forward<_U1>(__t1)), _Base2(std::forward<_U2>(__t2)) {} 2252a87b5e34SHoward Hinnant 2253a87b5e34SHoward Hinnant template <class... _Args1, class... _Args2> 2254c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 2255a87b5e34SHoward Hinnant __compressed_pair(piecewise_construct_t __pc, tuple<_Args1...> __first_args, 2256a87b5e34SHoward Hinnant tuple<_Args2...> __second_args) 2257c88580c4SEric Fiselier : _Base1(__pc, _VSTD::move(__first_args), 2258c88580c4SEric Fiselier typename __make_tuple_indices<sizeof...(_Args1)>::type()), 2259c88580c4SEric Fiselier _Base2(__pc, _VSTD::move(__second_args), 2260c88580c4SEric Fiselier typename __make_tuple_indices<sizeof...(_Args2)>::type()) {} 2261a87b5e34SHoward Hinnant 2262c88580c4SEric Fiselier#else 2263c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY 2264c88580c4SEric Fiselier __compressed_pair() {} 2265a87b5e34SHoward Hinnant 2266c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY explicit 2267c88580c4SEric Fiselier __compressed_pair(_T1 __t1) : _Base1(_VSTD::forward<_T1>(__t1)) {} 22683e519524SHoward Hinnant 2269c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY 2270c88580c4SEric Fiselier __compressed_pair(__second_tag, _T2 __t2) 2271c88580c4SEric Fiselier : _Base1(), _Base2(_VSTD::forward<_T2>(__t2)) {} 22723e519524SHoward Hinnant 2273c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY 2274c88580c4SEric Fiselier __compressed_pair(_T1 __t1, _T2 __t2) 2275c88580c4SEric Fiselier : _Base1(_VSTD::forward<_T1>(__t1)), _Base2(_VSTD::forward<_T2>(__t2)) {} 2276c88580c4SEric Fiselier#endif 2277c88580c4SEric Fiselier 2278c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY 2279c88580c4SEric Fiselier typename _Base1::reference first() _NOEXCEPT { 2280c88580c4SEric Fiselier return static_cast<_Base1&>(*this).__get(); 2281c88580c4SEric Fiselier } 2282c88580c4SEric Fiselier 2283c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY 2284c88580c4SEric Fiselier typename _Base1::const_reference first() const _NOEXCEPT { 2285c88580c4SEric Fiselier return static_cast<_Base1 const&>(*this).__get(); 2286c88580c4SEric Fiselier } 2287c88580c4SEric Fiselier 2288c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY 2289c88580c4SEric Fiselier typename _Base2::reference second() _NOEXCEPT { 2290c88580c4SEric Fiselier return static_cast<_Base2&>(*this).__get(); 2291c88580c4SEric Fiselier } 2292c88580c4SEric Fiselier 2293c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY 2294c88580c4SEric Fiselier typename _Base2::const_reference second() const _NOEXCEPT { 2295c88580c4SEric Fiselier return static_cast<_Base2 const&>(*this).__get(); 2296c88580c4SEric Fiselier } 2297c88580c4SEric Fiselier 2298c88580c4SEric Fiselier _LIBCPP_INLINE_VISIBILITY 2299c88580c4SEric Fiselier void swap(__compressed_pair& __x) 23003739fe79SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && 2301afa72ed4SMarshall Clow __is_nothrow_swappable<_T2>::value) 2302c88580c4SEric Fiselier { 2303c88580c4SEric Fiselier using std::swap; 2304c88580c4SEric Fiselier swap(first(), __x.first()); 2305c88580c4SEric Fiselier swap(second(), __x.second()); 2306c88580c4SEric Fiselier } 23073e519524SHoward Hinnant}; 23083e519524SHoward Hinnant 23093e519524SHoward Hinnanttemplate <class _T1, class _T2> 23103e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 2311c88580c4SEric Fiseliervoid swap(__compressed_pair<_T1, _T2>& __x, __compressed_pair<_T1, _T2>& __y) 23123739fe79SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && 2313c88580c4SEric Fiselier __is_nothrow_swappable<_T2>::value) { 2314c88580c4SEric Fiselier __x.swap(__y); 2315c88580c4SEric Fiselier} 23163e519524SHoward Hinnant 23178e25104bSHoward Hinnant// default_delete 23188e25104bSHoward Hinnant 23193e519524SHoward Hinnanttemplate <class _Tp> 2320030d19bdSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS default_delete { 232172d0d603SErik Pilkington static_assert(!is_function<_Tp>::value, 232272d0d603SErik Pilkington "default_delete cannot be instantiated for function types"); 2323030d19bdSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 2324030d19bdSEric Fiselier _LIBCPP_INLINE_VISIBILITY constexpr default_delete() noexcept = default; 2325c0937e8aSHoward Hinnant#else 2326030d19bdSEric Fiselier _LIBCPP_INLINE_VISIBILITY default_delete() {} 2327c0937e8aSHoward Hinnant#endif 23283e519524SHoward Hinnant template <class _Up> 2329030d19bdSEric Fiselier _LIBCPP_INLINE_VISIBILITY 2330030d19bdSEric Fiselier default_delete(const default_delete<_Up>&, 2331030d19bdSEric Fiselier typename enable_if<is_convertible<_Up*, _Tp*>::value>::type* = 2332030d19bdSEric Fiselier 0) _NOEXCEPT {} 2333030d19bdSEric Fiselier 2334030d19bdSEric Fiselier _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __ptr) const _NOEXCEPT { 2335030d19bdSEric Fiselier static_assert(sizeof(_Tp) > 0, 2336030d19bdSEric Fiselier "default_delete can not delete incomplete type"); 2337030d19bdSEric Fiselier static_assert(!is_void<_Tp>::value, 2338030d19bdSEric Fiselier "default_delete can not delete incomplete type"); 23393e519524SHoward Hinnant delete __ptr; 23403e519524SHoward Hinnant } 23413e519524SHoward Hinnant}; 23423e519524SHoward Hinnant 23433e519524SHoward Hinnanttemplate <class _Tp> 2344030d19bdSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS default_delete<_Tp[]> { 2345030d19bdSEric Fiselierprivate: 2346e4097ad7SHoward Hinnant template <class _Up> 2347030d19bdSEric Fiselier struct _EnableIfConvertible 2348030d19bdSEric Fiselier : enable_if<is_convertible<_Up(*)[], _Tp(*)[]>::value> {}; 2349030d19bdSEric Fiselier 2350030d19bdSEric Fiselierpublic: 2351030d19bdSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 2352030d19bdSEric Fiselier _LIBCPP_INLINE_VISIBILITY constexpr default_delete() noexcept = default; 2353030d19bdSEric Fiselier#else 2354030d19bdSEric Fiselier _LIBCPP_INLINE_VISIBILITY default_delete() {} 2355030d19bdSEric Fiselier#endif 2356030d19bdSEric Fiselier 2357e4097ad7SHoward Hinnant template <class _Up> 2358e4097ad7SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2359030d19bdSEric Fiselier default_delete(const default_delete<_Up[]>&, 2360030d19bdSEric Fiselier typename _EnableIfConvertible<_Up>::type* = 0) _NOEXCEPT {} 2361030d19bdSEric Fiselier 2362030d19bdSEric Fiselier template <class _Up> 2363030d19bdSEric Fiselier _LIBCPP_INLINE_VISIBILITY 2364030d19bdSEric Fiselier typename _EnableIfConvertible<_Up>::type 2365030d19bdSEric Fiselier operator()(_Up* __ptr) const _NOEXCEPT { 2366030d19bdSEric Fiselier static_assert(sizeof(_Tp) > 0, 2367030d19bdSEric Fiselier "default_delete can not delete incomplete type"); 2368030d19bdSEric Fiselier static_assert(!is_void<_Tp>::value, 2369030d19bdSEric Fiselier "default_delete can not delete void type"); 23703e519524SHoward Hinnant delete[] __ptr; 23713e519524SHoward Hinnant } 23723e519524SHoward Hinnant}; 23733e519524SHoward Hinnant 237447272722SEric Fiselier 2375030d19bdSEric Fiselier 237647272722SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 237747272722SEric Fiseliertemplate <class _Deleter> 237847272722SEric Fiselierstruct __unique_ptr_deleter_sfinae { 237947272722SEric Fiselier static_assert(!is_reference<_Deleter>::value, "incorrect specialization"); 238047272722SEric Fiselier typedef const _Deleter& __lval_ref_type; 238147272722SEric Fiselier typedef _Deleter&& __good_rval_ref_type; 238247272722SEric Fiselier typedef true_type __enable_rval_overload; 238347272722SEric Fiselier}; 238447272722SEric Fiselier 238547272722SEric Fiseliertemplate <class _Deleter> 238647272722SEric Fiselierstruct __unique_ptr_deleter_sfinae<_Deleter const&> { 238747272722SEric Fiselier typedef const _Deleter& __lval_ref_type; 238847272722SEric Fiselier typedef const _Deleter&& __bad_rval_ref_type; 238947272722SEric Fiselier typedef false_type __enable_rval_overload; 239047272722SEric Fiselier}; 239147272722SEric Fiselier 239247272722SEric Fiseliertemplate <class _Deleter> 239347272722SEric Fiselierstruct __unique_ptr_deleter_sfinae<_Deleter&> { 239447272722SEric Fiselier typedef _Deleter& __lval_ref_type; 239547272722SEric Fiselier typedef _Deleter&& __bad_rval_ref_type; 239647272722SEric Fiselier typedef false_type __enable_rval_overload; 239747272722SEric Fiselier}; 239847272722SEric Fiselier#endif // !defined(_LIBCPP_CXX03_LANG) 239947272722SEric Fiselier 24003e519524SHoward Hinnanttemplate <class _Tp, class _Dp = default_delete<_Tp> > 240147272722SEric Fiselierclass _LIBCPP_TEMPLATE_VIS unique_ptr { 24023e519524SHoward Hinnantpublic: 24033e519524SHoward Hinnant typedef _Tp element_type; 24043e519524SHoward Hinnant typedef _Dp deleter_type; 24053e519524SHoward Hinnant typedef typename __pointer_type<_Tp, deleter_type>::type pointer; 240647272722SEric Fiselier 240747272722SEric Fiselier static_assert(!is_rvalue_reference<deleter_type>::value, 240847272722SEric Fiselier "the specified deleter type cannot be an rvalue reference"); 240947272722SEric Fiselier 24103e519524SHoward Hinnantprivate: 24113e519524SHoward Hinnant __compressed_pair<pointer, deleter_type> __ptr_; 24123e519524SHoward Hinnant 24133e519524SHoward Hinnant struct __nat { int __for_bool_; }; 24143e519524SHoward Hinnant 241547272722SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 241692e61e93SEric Fiselier typedef __unique_ptr_deleter_sfinae<_Dp> _DeleterSFINAE; 24173e519524SHoward Hinnant 241847272722SEric Fiselier template <bool _Dummy> 241947272722SEric Fiselier using _LValRefType = 242092e61e93SEric Fiselier typename __dependent_type<_DeleterSFINAE, _Dummy>::__lval_ref_type; 242147272722SEric Fiselier 242247272722SEric Fiselier template <bool _Dummy> 242347272722SEric Fiselier using _GoodRValRefType = 242492e61e93SEric Fiselier typename __dependent_type<_DeleterSFINAE, _Dummy>::__good_rval_ref_type; 242547272722SEric Fiselier 242647272722SEric Fiselier template <bool _Dummy> 242747272722SEric Fiselier using _BadRValRefType = 242892e61e93SEric Fiselier typename __dependent_type<_DeleterSFINAE, _Dummy>::__bad_rval_ref_type; 242947272722SEric Fiselier 243047272722SEric Fiselier template <bool _Dummy, class _Deleter = typename __dependent_type< 243147272722SEric Fiselier __identity<deleter_type>, _Dummy>::type> 243247272722SEric Fiselier using _EnableIfDeleterDefaultConstructible = 243347272722SEric Fiselier typename enable_if<is_default_constructible<_Deleter>::value && 243447272722SEric Fiselier !is_pointer<_Deleter>::value>::type; 243547272722SEric Fiselier 243647272722SEric Fiselier template <class _ArgType> 243747272722SEric Fiselier using _EnableIfDeleterConstructible = 243847272722SEric Fiselier typename enable_if<is_constructible<deleter_type, _ArgType>::value>::type; 243947272722SEric Fiselier 244047272722SEric Fiselier template <class _UPtr, class _Up> 244147272722SEric Fiselier using _EnableIfMoveConvertible = typename enable_if< 244247272722SEric Fiselier is_convertible<typename _UPtr::pointer, pointer>::value && 244347272722SEric Fiselier !is_array<_Up>::value 244447272722SEric Fiselier >::type; 244547272722SEric Fiselier 244647272722SEric Fiselier template <class _UDel> 244747272722SEric Fiselier using _EnableIfDeleterConvertible = typename enable_if< 244847272722SEric Fiselier (is_reference<_Dp>::value && is_same<_Dp, _UDel>::value) || 244947272722SEric Fiselier (!is_reference<_Dp>::value && is_convertible<_UDel, _Dp>::value) 245047272722SEric Fiselier >::type; 245147272722SEric Fiselier 245247272722SEric Fiselier template <class _UDel> 245347272722SEric Fiselier using _EnableIfDeleterAssignable = typename enable_if< 245447272722SEric Fiselier is_assignable<_Dp&, _UDel&&>::value 245547272722SEric Fiselier >::type; 245647272722SEric Fiselier 245747272722SEric Fiselierpublic: 245847272722SEric Fiselier template <bool _Dummy = true, 245947272722SEric Fiselier class = _EnableIfDeleterDefaultConstructible<_Dummy>> 246047272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 246147272722SEric Fiselier constexpr unique_ptr() noexcept : __ptr_(pointer()) {} 246247272722SEric Fiselier 246347272722SEric Fiselier template <bool _Dummy = true, 246447272722SEric Fiselier class = _EnableIfDeleterDefaultConstructible<_Dummy>> 246547272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 246647272722SEric Fiselier constexpr unique_ptr(nullptr_t) noexcept : __ptr_(pointer()) {} 246747272722SEric Fiselier 246847272722SEric Fiselier template <bool _Dummy = true, 246947272722SEric Fiselier class = _EnableIfDeleterDefaultConstructible<_Dummy>> 247047272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 247147272722SEric Fiselier explicit unique_ptr(pointer __p) noexcept : __ptr_(__p) {} 247247272722SEric Fiselier 247347272722SEric Fiselier template <bool _Dummy = true, 247447272722SEric Fiselier class = _EnableIfDeleterConstructible<_LValRefType<_Dummy>>> 247547272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 247647272722SEric Fiselier unique_ptr(pointer __p, _LValRefType<_Dummy> __d) noexcept 24773e519524SHoward Hinnant : __ptr_(__p, __d) {} 24783e519524SHoward Hinnant 247947272722SEric Fiselier template <bool _Dummy = true, 248047272722SEric Fiselier class = _EnableIfDeleterConstructible<_GoodRValRefType<_Dummy>>> 24813e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 248247272722SEric Fiselier unique_ptr(pointer __p, _GoodRValRefType<_Dummy> __d) noexcept 248347272722SEric Fiselier : __ptr_(__p, _VSTD::move(__d)) { 248447272722SEric Fiselier static_assert(!is_reference<deleter_type>::value, 248547272722SEric Fiselier "rvalue deleter bound to reference"); 248647272722SEric Fiselier } 248747272722SEric Fiselier 248847272722SEric Fiselier template <bool _Dummy = true, 248947272722SEric Fiselier class = _EnableIfDeleterConstructible<_BadRValRefType<_Dummy>>> 249047272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 249147272722SEric Fiselier unique_ptr(pointer __p, _BadRValRefType<_Dummy> __d) = delete; 249247272722SEric Fiselier 249347272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 249447272722SEric Fiselier unique_ptr(unique_ptr&& __u) noexcept 249547272722SEric Fiselier : __ptr_(__u.release(), _VSTD::forward<deleter_type>(__u.get_deleter())) { 249647272722SEric Fiselier } 249747272722SEric Fiselier 249847272722SEric Fiselier template <class _Up, class _Ep, 249947272722SEric Fiselier class = _EnableIfMoveConvertible<unique_ptr<_Up, _Ep>, _Up>, 250047272722SEric Fiselier class = _EnableIfDeleterConvertible<_Ep> 250147272722SEric Fiselier > 250247272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 250347272722SEric Fiselier unique_ptr(unique_ptr<_Up, _Ep>&& __u) _NOEXCEPT 2504ce48a113SHoward Hinnant : __ptr_(__u.release(), _VSTD::forward<_Ep>(__u.get_deleter())) {} 25053e519524SHoward Hinnant 2506e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR) 25073e519524SHoward Hinnant template <class _Up> 250847272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 250947272722SEric Fiselier unique_ptr(auto_ptr<_Up>&& __p, 251047272722SEric Fiselier typename enable_if<is_convertible<_Up*, _Tp*>::value && 25113e519524SHoward Hinnant is_same<_Dp, default_delete<_Tp>>::value, 251247272722SEric Fiselier __nat>::type = __nat()) _NOEXCEPT 251347272722SEric Fiselier : __ptr_(__p.release()) {} 2514e67179bcSMarshall Clow#endif 25153e519524SHoward Hinnant 251647272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 251747272722SEric Fiselier unique_ptr& operator=(unique_ptr&& __u) _NOEXCEPT { 25183e519524SHoward Hinnant reset(__u.release()); 2519ce48a113SHoward Hinnant __ptr_.second() = _VSTD::forward<deleter_type>(__u.get_deleter()); 25203e519524SHoward Hinnant return *this; 25213e519524SHoward Hinnant } 25223e519524SHoward Hinnant 252347272722SEric Fiselier template <class _Up, class _Ep, 252447272722SEric Fiselier class = _EnableIfMoveConvertible<unique_ptr<_Up, _Ep>, _Up>, 252547272722SEric Fiselier class = _EnableIfDeleterAssignable<_Ep> 252647272722SEric Fiselier > 25273e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 252847272722SEric Fiselier unique_ptr& operator=(unique_ptr<_Up, _Ep>&& __u) _NOEXCEPT { 25293e519524SHoward Hinnant reset(__u.release()); 2530ce48a113SHoward Hinnant __ptr_.second() = _VSTD::forward<_Ep>(__u.get_deleter()); 25313e519524SHoward Hinnant return *this; 25323e519524SHoward Hinnant } 25333e519524SHoward Hinnant 253447272722SEric Fiselier#else // _LIBCPP_CXX03_LANG 253547272722SEric Fiselierprivate: 253647272722SEric Fiselier unique_ptr(unique_ptr&); 253747272722SEric Fiselier template <class _Up, class _Ep> unique_ptr(unique_ptr<_Up, _Ep>&); 253847272722SEric Fiselier 253947272722SEric Fiselier unique_ptr& operator=(unique_ptr&); 254047272722SEric Fiselier template <class _Up, class _Ep> unique_ptr& operator=(unique_ptr<_Up, _Ep>&); 254147272722SEric Fiselier 254247272722SEric Fiselierpublic: 254347272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 254447272722SEric Fiselier unique_ptr() : __ptr_(pointer()) 25453e519524SHoward Hinnant { 254647272722SEric Fiselier static_assert(!is_pointer<deleter_type>::value, 254747272722SEric Fiselier "unique_ptr constructed with null function pointer deleter"); 254847272722SEric Fiselier static_assert(is_default_constructible<deleter_type>::value, 254947272722SEric Fiselier "unique_ptr::deleter_type is not default constructible"); 255047272722SEric Fiselier } 255147272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 255247272722SEric Fiselier unique_ptr(nullptr_t) : __ptr_(pointer()) 255347272722SEric Fiselier { 255447272722SEric Fiselier static_assert(!is_pointer<deleter_type>::value, 255547272722SEric Fiselier "unique_ptr constructed with null function pointer deleter"); 255647272722SEric Fiselier } 255747272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 255847272722SEric Fiselier explicit unique_ptr(pointer __p) 255947272722SEric Fiselier : __ptr_(_VSTD::move(__p)) { 256047272722SEric Fiselier static_assert(!is_pointer<deleter_type>::value, 256147272722SEric Fiselier "unique_ptr constructed with null function pointer deleter"); 256247272722SEric Fiselier } 256347272722SEric Fiselier 256447272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 256547272722SEric Fiselier operator __rv<unique_ptr>() { 25663e519524SHoward Hinnant return __rv<unique_ptr>(*this); 25673e519524SHoward Hinnant } 25683e519524SHoward Hinnant 256947272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 257047272722SEric Fiselier unique_ptr(__rv<unique_ptr> __u) 257147272722SEric Fiselier : __ptr_(__u->release(), 257247272722SEric Fiselier _VSTD::forward<deleter_type>(__u->get_deleter())) {} 25733e519524SHoward Hinnant 25743e519524SHoward Hinnant template <class _Up, class _Ep> 2575d48306e7SEric Fiselier _LIBCPP_INLINE_VISIBILITY 2576d48306e7SEric Fiselier typename enable_if< 2577d48306e7SEric Fiselier !is_array<_Up>::value && 257847272722SEric Fiselier is_convertible<typename unique_ptr<_Up, _Ep>::pointer, 257947272722SEric Fiselier pointer>::value && 2580d48306e7SEric Fiselier is_assignable<deleter_type&, _Ep&>::value, 258147272722SEric Fiselier unique_ptr&>::type 258247272722SEric Fiselier operator=(unique_ptr<_Up, _Ep> __u) { 25833e519524SHoward Hinnant reset(__u.release()); 2584d48306e7SEric Fiselier __ptr_.second() = _VSTD::forward<_Ep>(__u.get_deleter()); 25853e519524SHoward Hinnant return *this; 25863e519524SHoward Hinnant } 25873e519524SHoward Hinnant 258847272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 258947272722SEric Fiselier unique_ptr(pointer __p, deleter_type __d) 2590ce48a113SHoward Hinnant : __ptr_(_VSTD::move(__p), _VSTD::move(__d)) {} 259147272722SEric Fiselier#endif // _LIBCPP_CXX03_LANG 25923e519524SHoward Hinnant 2593e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR) 25943e519524SHoward Hinnant template <class _Up> 25953e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 259647272722SEric Fiselier typename enable_if<is_convertible<_Up*, _Tp*>::value && 25973e519524SHoward Hinnant is_same<_Dp, default_delete<_Tp> >::value, 259847272722SEric Fiselier unique_ptr&>::type 259947272722SEric Fiselier operator=(auto_ptr<_Up> __p) { 260047272722SEric Fiselier reset(__p.release()); 260147272722SEric Fiselier return *this; 260247272722SEric Fiselier } 2603e67179bcSMarshall Clow#endif 26043e519524SHoward Hinnant 260547272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 260647272722SEric Fiselier ~unique_ptr() { reset(); } 260747272722SEric Fiselier 260847272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 260947272722SEric Fiselier unique_ptr& operator=(nullptr_t) _NOEXCEPT { 26103e519524SHoward Hinnant reset(); 26113e519524SHoward Hinnant return *this; 26123e519524SHoward Hinnant } 26133e519524SHoward Hinnant 2614f2f2d8b9SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 261547272722SEric Fiselier typename add_lvalue_reference<_Tp>::type 261647272722SEric Fiselier operator*() const { 261747272722SEric Fiselier return *__ptr_.first(); 261847272722SEric Fiselier } 261947272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 262047272722SEric Fiselier pointer operator->() const _NOEXCEPT { 262147272722SEric Fiselier return __ptr_.first(); 262247272722SEric Fiselier } 262347272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 262447272722SEric Fiselier pointer get() const _NOEXCEPT { 262547272722SEric Fiselier return __ptr_.first(); 262647272722SEric Fiselier } 262747272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 262847272722SEric Fiselier deleter_type& get_deleter() _NOEXCEPT { 262947272722SEric Fiselier return __ptr_.second(); 263047272722SEric Fiselier } 263147272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 263247272722SEric Fiselier const deleter_type& get_deleter() const _NOEXCEPT { 263347272722SEric Fiselier return __ptr_.second(); 263447272722SEric Fiselier } 263547272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 263647272722SEric Fiselier _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT { 263747272722SEric Fiselier return __ptr_.first() != nullptr; 263847272722SEric Fiselier } 26393e519524SHoward Hinnant 264047272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 264147272722SEric Fiselier pointer release() _NOEXCEPT { 26423e519524SHoward Hinnant pointer __t = __ptr_.first(); 26433e519524SHoward Hinnant __ptr_.first() = pointer(); 26443e519524SHoward Hinnant return __t; 26453e519524SHoward Hinnant } 26463e519524SHoward Hinnant 264747272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 264847272722SEric Fiselier void reset(pointer __p = pointer()) _NOEXCEPT { 26493e519524SHoward Hinnant pointer __tmp = __ptr_.first(); 26503e519524SHoward Hinnant __ptr_.first() = __p; 26513e519524SHoward Hinnant if (__tmp) 26523e519524SHoward Hinnant __ptr_.second()(__tmp); 26533e519524SHoward Hinnant } 26543e519524SHoward Hinnant 265547272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 265647272722SEric Fiselier void swap(unique_ptr& __u) _NOEXCEPT { 265747272722SEric Fiselier __ptr_.swap(__u.__ptr_); 265847272722SEric Fiselier } 26593e519524SHoward Hinnant}; 26603e519524SHoward Hinnant 266147272722SEric Fiselier 26623e519524SHoward Hinnanttemplate <class _Tp, class _Dp> 266347272722SEric Fiselierclass _LIBCPP_TEMPLATE_VIS unique_ptr<_Tp[], _Dp> { 26643e519524SHoward Hinnantpublic: 26653e519524SHoward Hinnant typedef _Tp element_type; 26663e519524SHoward Hinnant typedef _Dp deleter_type; 26673e519524SHoward Hinnant typedef typename __pointer_type<_Tp, deleter_type>::type pointer; 266847272722SEric Fiselier 26693e519524SHoward Hinnantprivate: 26703e519524SHoward Hinnant __compressed_pair<pointer, deleter_type> __ptr_; 26713e519524SHoward Hinnant 267292e61e93SEric Fiselier template <class _From> 267392e61e93SEric Fiselier struct _CheckArrayPointerConversion : is_same<_From, pointer> {}; 26743e519524SHoward Hinnant 267592e61e93SEric Fiselier template <class _FromElem> 267692e61e93SEric Fiselier struct _CheckArrayPointerConversion<_FromElem*> 267792e61e93SEric Fiselier : integral_constant<bool, 267892e61e93SEric Fiselier is_same<_FromElem*, pointer>::value || 267992e61e93SEric Fiselier (is_same<pointer, element_type*>::value && 268092e61e93SEric Fiselier is_convertible<_FromElem(*)[], element_type(*)[]>::value) 268192e61e93SEric Fiselier > 268292e61e93SEric Fiselier {}; 268347272722SEric Fiselier 268447272722SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 268592e61e93SEric Fiselier typedef __unique_ptr_deleter_sfinae<_Dp> _DeleterSFINAE; 268647272722SEric Fiselier 268747272722SEric Fiselier template <bool _Dummy> 268847272722SEric Fiselier using _LValRefType = 268992e61e93SEric Fiselier typename __dependent_type<_DeleterSFINAE, _Dummy>::__lval_ref_type; 269047272722SEric Fiselier 269147272722SEric Fiselier template <bool _Dummy> 269247272722SEric Fiselier using _GoodRValRefType = 269392e61e93SEric Fiselier typename __dependent_type<_DeleterSFINAE, _Dummy>::__good_rval_ref_type; 269447272722SEric Fiselier 269547272722SEric Fiselier template <bool _Dummy> 269647272722SEric Fiselier using _BadRValRefType = 269792e61e93SEric Fiselier typename __dependent_type<_DeleterSFINAE, _Dummy>::__bad_rval_ref_type; 269847272722SEric Fiselier 269947272722SEric Fiselier template <bool _Dummy, class _Deleter = typename __dependent_type< 270047272722SEric Fiselier __identity<deleter_type>, _Dummy>::type> 270147272722SEric Fiselier using _EnableIfDeleterDefaultConstructible = 270247272722SEric Fiselier typename enable_if<is_default_constructible<_Deleter>::value && 270347272722SEric Fiselier !is_pointer<_Deleter>::value>::type; 270447272722SEric Fiselier 270547272722SEric Fiselier template <class _ArgType> 270647272722SEric Fiselier using _EnableIfDeleterConstructible = 270747272722SEric Fiselier typename enable_if<is_constructible<deleter_type, _ArgType>::value>::type; 27083e519524SHoward Hinnant 270922747e62SLogan Chien template <class _Pp> 271047272722SEric Fiselier using _EnableIfPointerConvertible = typename enable_if< 271192e61e93SEric Fiselier _CheckArrayPointerConversion<_Pp>::value 271247272722SEric Fiselier >::type; 271347272722SEric Fiselier 271447272722SEric Fiselier template <class _UPtr, class _Up, 271547272722SEric Fiselier class _ElemT = typename _UPtr::element_type> 271647272722SEric Fiselier using _EnableIfMoveConvertible = typename enable_if< 271747272722SEric Fiselier is_array<_Up>::value && 271847272722SEric Fiselier is_same<pointer, element_type*>::value && 271947272722SEric Fiselier is_same<typename _UPtr::pointer, _ElemT*>::value && 272047272722SEric Fiselier is_convertible<_ElemT(*)[], element_type(*)[]>::value 272147272722SEric Fiselier >::type; 272247272722SEric Fiselier 272347272722SEric Fiselier template <class _UDel> 272447272722SEric Fiselier using _EnableIfDeleterConvertible = typename enable_if< 272547272722SEric Fiselier (is_reference<_Dp>::value && is_same<_Dp, _UDel>::value) || 272647272722SEric Fiselier (!is_reference<_Dp>::value && is_convertible<_UDel, _Dp>::value) 272747272722SEric Fiselier >::type; 272847272722SEric Fiselier 272947272722SEric Fiselier template <class _UDel> 273047272722SEric Fiselier using _EnableIfDeleterAssignable = typename enable_if< 273147272722SEric Fiselier is_assignable<_Dp&, _UDel&&>::value 273247272722SEric Fiselier >::type; 273347272722SEric Fiselier 273447272722SEric Fiselierpublic: 273547272722SEric Fiselier template <bool _Dummy = true, 273647272722SEric Fiselier class = _EnableIfDeleterDefaultConstructible<_Dummy>> 273747272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 273847272722SEric Fiselier constexpr unique_ptr() noexcept : __ptr_(pointer()) {} 273947272722SEric Fiselier 274047272722SEric Fiselier template <bool _Dummy = true, 274147272722SEric Fiselier class = _EnableIfDeleterDefaultConstructible<_Dummy>> 274247272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 274347272722SEric Fiselier constexpr unique_ptr(nullptr_t) noexcept : __ptr_(pointer()) {} 274447272722SEric Fiselier 274547272722SEric Fiselier template <class _Pp, bool _Dummy = true, 274647272722SEric Fiselier class = _EnableIfDeleterDefaultConstructible<_Dummy>, 274747272722SEric Fiselier class = _EnableIfPointerConvertible<_Pp>> 274847272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 274947272722SEric Fiselier explicit unique_ptr(_Pp __p) noexcept 275047272722SEric Fiselier : __ptr_(__p) {} 275147272722SEric Fiselier 275247272722SEric Fiselier template <class _Pp, bool _Dummy = true, 275347272722SEric Fiselier class = _EnableIfDeleterConstructible<_LValRefType<_Dummy>>, 275447272722SEric Fiselier class = _EnableIfPointerConvertible<_Pp>> 275547272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 275647272722SEric Fiselier unique_ptr(_Pp __p, _LValRefType<_Dummy> __d) noexcept 27573e519524SHoward Hinnant : __ptr_(__p, __d) {} 27583e519524SHoward Hinnant 275947272722SEric Fiselier template <bool _Dummy = true, 276047272722SEric Fiselier class = _EnableIfDeleterConstructible<_LValRefType<_Dummy>>> 276147272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 276247272722SEric Fiselier unique_ptr(nullptr_t, _LValRefType<_Dummy> __d) noexcept 276347272722SEric Fiselier : __ptr_(nullptr, __d) {} 27643e519524SHoward Hinnant 276547272722SEric Fiselier template <class _Pp, bool _Dummy = true, 276647272722SEric Fiselier class = _EnableIfDeleterConstructible<_GoodRValRefType<_Dummy>>, 276747272722SEric Fiselier class = _EnableIfPointerConvertible<_Pp>> 276847272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 276947272722SEric Fiselier unique_ptr(_Pp __p, _GoodRValRefType<_Dummy> __d) noexcept 277047272722SEric Fiselier : __ptr_(__p, _VSTD::move(__d)) { 277147272722SEric Fiselier static_assert(!is_reference<deleter_type>::value, 277247272722SEric Fiselier "rvalue deleter bound to reference"); 27733e519524SHoward Hinnant } 27743e519524SHoward Hinnant 277547272722SEric Fiselier template <bool _Dummy = true, 277647272722SEric Fiselier class = _EnableIfDeleterConstructible<_GoodRValRefType<_Dummy>>> 277747272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 277847272722SEric Fiselier unique_ptr(nullptr_t, _GoodRValRefType<_Dummy> __d) noexcept 277947272722SEric Fiselier : __ptr_(nullptr, _VSTD::move(__d)) { 278047272722SEric Fiselier static_assert(!is_reference<deleter_type>::value, 278147272722SEric Fiselier "rvalue deleter bound to reference"); 27823e519524SHoward Hinnant } 27833e519524SHoward Hinnant 278447272722SEric Fiselier template <class _Pp, bool _Dummy = true, 278547272722SEric Fiselier class = _EnableIfDeleterConstructible<_BadRValRefType<_Dummy>>, 278647272722SEric Fiselier class = _EnableIfPointerConvertible<_Pp>> 278747272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 278847272722SEric Fiselier unique_ptr(_Pp __p, _BadRValRefType<_Dummy> __d) = delete; 27893e519524SHoward Hinnant 279047272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 279147272722SEric Fiselier unique_ptr(unique_ptr&& __u) noexcept 279247272722SEric Fiselier : __ptr_(__u.release(), _VSTD::forward<deleter_type>(__u.get_deleter())) { 279347272722SEric Fiselier } 279447272722SEric Fiselier 279547272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 279647272722SEric Fiselier unique_ptr& operator=(unique_ptr&& __u) noexcept { 27973e519524SHoward Hinnant reset(__u.release()); 2798ce48a113SHoward Hinnant __ptr_.second() = _VSTD::forward<deleter_type>(__u.get_deleter()); 27993e519524SHoward Hinnant return *this; 28003e519524SHoward Hinnant } 2801e4097ad7SHoward Hinnant 280247272722SEric Fiselier template <class _Up, class _Ep, 280347272722SEric Fiselier class = _EnableIfMoveConvertible<unique_ptr<_Up, _Ep>, _Up>, 280447272722SEric Fiselier class = _EnableIfDeleterConvertible<_Ep> 280547272722SEric Fiselier > 2806e4097ad7SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 280747272722SEric Fiselier unique_ptr(unique_ptr<_Up, _Ep>&& __u) noexcept 280886321b2bSEric Fiselier : __ptr_(__u.release(), _VSTD::forward<_Ep>(__u.get_deleter())) { 280947272722SEric Fiselier } 2810e4097ad7SHoward Hinnant 281147272722SEric Fiselier template <class _Up, class _Ep, 281247272722SEric Fiselier class = _EnableIfMoveConvertible<unique_ptr<_Up, _Ep>, _Up>, 281347272722SEric Fiselier class = _EnableIfDeleterAssignable<_Ep> 281447272722SEric Fiselier > 2815e4097ad7SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2816e4097ad7SHoward Hinnant unique_ptr& 281747272722SEric Fiselier operator=(unique_ptr<_Up, _Ep>&& __u) noexcept { 2818e4097ad7SHoward Hinnant reset(__u.release()); 2819e4097ad7SHoward Hinnant __ptr_.second() = _VSTD::forward<_Ep>(__u.get_deleter()); 2820e4097ad7SHoward Hinnant return *this; 2821e4097ad7SHoward Hinnant } 28223e519524SHoward Hinnant 282347272722SEric Fiselier#else // _LIBCPP_CXX03_LANG 282447272722SEric Fiselierprivate: 282547272722SEric Fiselier template <class _Up> explicit unique_ptr(_Up); 282647272722SEric Fiselier 282747272722SEric Fiselier unique_ptr(unique_ptr&); 282847272722SEric Fiselier template <class _Up> unique_ptr(unique_ptr<_Up>&); 282947272722SEric Fiselier 283047272722SEric Fiselier unique_ptr& operator=(unique_ptr&); 283147272722SEric Fiselier template <class _Up> unique_ptr& operator=(unique_ptr<_Up>&); 283247272722SEric Fiselier 283347272722SEric Fiselier template <class _Up> 283447272722SEric Fiselier unique_ptr(_Up __u, 283547272722SEric Fiselier typename conditional< 283647272722SEric Fiselier is_reference<deleter_type>::value, deleter_type, 283747272722SEric Fiselier typename add_lvalue_reference<const deleter_type>::type>::type, 283847272722SEric Fiselier typename enable_if<is_convertible<_Up, pointer>::value, 283947272722SEric Fiselier __nat>::type = __nat()); 284047272722SEric Fiselierpublic: 284147272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 284247272722SEric Fiselier unique_ptr() : __ptr_(pointer()) { 284347272722SEric Fiselier static_assert(!is_pointer<deleter_type>::value, 284447272722SEric Fiselier "unique_ptr constructed with null function pointer deleter"); 284547272722SEric Fiselier } 284647272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 284747272722SEric Fiselier unique_ptr(nullptr_t) : __ptr_(pointer()) { 28483e519524SHoward Hinnant static_assert(!is_pointer<deleter_type>::value, 28493e519524SHoward Hinnant "unique_ptr constructed with null function pointer deleter"); 28503e519524SHoward Hinnant } 28513e519524SHoward Hinnant 285247272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 285347272722SEric Fiselier explicit unique_ptr(pointer __p) : __ptr_(__p) { 285447272722SEric Fiselier static_assert(!is_pointer<deleter_type>::value, 285547272722SEric Fiselier "unique_ptr constructed with null function pointer deleter"); 285647272722SEric Fiselier } 285747272722SEric Fiselier 285847272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 285947272722SEric Fiselier unique_ptr(pointer __p, deleter_type __d) 2860ce48a113SHoward Hinnant : __ptr_(__p, _VSTD::forward<deleter_type>(__d)) {} 28613e519524SHoward Hinnant 286247272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 286347272722SEric Fiselier unique_ptr(nullptr_t, deleter_type __d) 2864ce48a113SHoward Hinnant : __ptr_(pointer(), _VSTD::forward<deleter_type>(__d)) {} 28653e519524SHoward Hinnant 286647272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 286747272722SEric Fiselier operator __rv<unique_ptr>() { 28683e519524SHoward Hinnant return __rv<unique_ptr>(*this); 28693e519524SHoward Hinnant } 28703e519524SHoward Hinnant 287147272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 287247272722SEric Fiselier unique_ptr(__rv<unique_ptr> __u) 287347272722SEric Fiselier : __ptr_(__u->release(), 287447272722SEric Fiselier _VSTD::forward<deleter_type>(__u->get_deleter())) {} 28753e519524SHoward Hinnant 287647272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 287747272722SEric Fiselier unique_ptr& operator=(__rv<unique_ptr> __u) { 28783e519524SHoward Hinnant reset(__u->release()); 2879ce48a113SHoward Hinnant __ptr_.second() = _VSTD::forward<deleter_type>(__u->get_deleter()); 28803e519524SHoward Hinnant return *this; 28813e519524SHoward Hinnant } 28823e519524SHoward Hinnant 288347272722SEric Fiselier#endif // _LIBCPP_CXX03_LANG 28843e519524SHoward Hinnant 288547272722SEric Fiselierpublic: 288647272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 288747272722SEric Fiselier ~unique_ptr() { reset(); } 288847272722SEric Fiselier 288947272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 289047272722SEric Fiselier unique_ptr& operator=(nullptr_t) _NOEXCEPT { 28913e519524SHoward Hinnant reset(); 28923e519524SHoward Hinnant return *this; 28933e519524SHoward Hinnant } 28943e519524SHoward Hinnant 2895f2f2d8b9SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 289647272722SEric Fiselier typename add_lvalue_reference<_Tp>::type 289747272722SEric Fiselier operator[](size_t __i) const { 289847272722SEric Fiselier return __ptr_.first()[__i]; 289947272722SEric Fiselier } 290047272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 290147272722SEric Fiselier pointer get() const _NOEXCEPT { 290247272722SEric Fiselier return __ptr_.first(); 290347272722SEric Fiselier } 29043e519524SHoward Hinnant 290547272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 290647272722SEric Fiselier deleter_type& get_deleter() _NOEXCEPT { 290747272722SEric Fiselier return __ptr_.second(); 290847272722SEric Fiselier } 290947272722SEric Fiselier 291047272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 291147272722SEric Fiselier const deleter_type& get_deleter() const _NOEXCEPT { 291247272722SEric Fiselier return __ptr_.second(); 291347272722SEric Fiselier } 291447272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 291547272722SEric Fiselier _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT { 291647272722SEric Fiselier return __ptr_.first() != nullptr; 291747272722SEric Fiselier } 291847272722SEric Fiselier 291947272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 292047272722SEric Fiselier pointer release() _NOEXCEPT { 29213e519524SHoward Hinnant pointer __t = __ptr_.first(); 29223e519524SHoward Hinnant __ptr_.first() = pointer(); 29233e519524SHoward Hinnant return __t; 29243e519524SHoward Hinnant } 29253e519524SHoward Hinnant 292622747e62SLogan Chien template <class _Pp> 292722747e62SLogan Chien _LIBCPP_INLINE_VISIBILITY 292847272722SEric Fiselier typename enable_if< 292992e61e93SEric Fiselier _CheckArrayPointerConversion<_Pp>::value 293047272722SEric Fiselier >::type 293147272722SEric Fiselier reset(_Pp __p) _NOEXCEPT { 29323e519524SHoward Hinnant pointer __tmp = __ptr_.first(); 29333e519524SHoward Hinnant __ptr_.first() = __p; 29343e519524SHoward Hinnant if (__tmp) 29353e519524SHoward Hinnant __ptr_.second()(__tmp); 29363e519524SHoward Hinnant } 293747272722SEric Fiselier 293847272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 293947272722SEric Fiselier void reset(nullptr_t = nullptr) _NOEXCEPT { 29403e519524SHoward Hinnant pointer __tmp = __ptr_.first(); 29413e519524SHoward Hinnant __ptr_.first() = nullptr; 29423e519524SHoward Hinnant if (__tmp) 29433e519524SHoward Hinnant __ptr_.second()(__tmp); 29443e519524SHoward Hinnant } 29453e519524SHoward Hinnant 294647272722SEric Fiselier _LIBCPP_INLINE_VISIBILITY 294747272722SEric Fiselier void swap(unique_ptr& __u) _NOEXCEPT { 294847272722SEric Fiselier __ptr_.swap(__u.__ptr_); 294947272722SEric Fiselier } 29503e519524SHoward Hinnant 29513e519524SHoward Hinnant}; 29523e519524SHoward Hinnant 29533e519524SHoward Hinnanttemplate <class _Tp, class _Dp> 29543e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 2955f07dd8d0SEric Fiseliertypename enable_if< 2956f07dd8d0SEric Fiselier __is_swappable<_Dp>::value, 29573e519524SHoward Hinnant void 2958f07dd8d0SEric Fiselier>::type 29593739fe79SHoward Hinnantswap(unique_ptr<_Tp, _Dp>& __x, unique_ptr<_Tp, _Dp>& __y) _NOEXCEPT {__x.swap(__y);} 29603e519524SHoward Hinnant 29613e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 29623e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 29633e519524SHoward Hinnantbool 29643e519524SHoward Hinnantoperator==(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return __x.get() == __y.get();} 29653e519524SHoward Hinnant 29663e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 29673e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 29683e519524SHoward Hinnantbool 29693e519524SHoward Hinnantoperator!=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__x == __y);} 29703e519524SHoward Hinnant 29713e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 29723e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 29733e519524SHoward Hinnantbool 297467f39647SHoward Hinnantoperator< (const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) 297567f39647SHoward Hinnant{ 297667f39647SHoward Hinnant typedef typename unique_ptr<_T1, _D1>::pointer _P1; 297767f39647SHoward Hinnant typedef typename unique_ptr<_T2, _D2>::pointer _P2; 29786fe361c1SEric Fiselier typedef typename common_type<_P1, _P2>::type _Vp; 29796fe361c1SEric Fiselier return less<_Vp>()(__x.get(), __y.get()); 298067f39647SHoward Hinnant} 29813e519524SHoward Hinnant 29823e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 29833e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 29843e519524SHoward Hinnantbool 29853e519524SHoward Hinnantoperator> (const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return __y < __x;} 29863e519524SHoward Hinnant 29873e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 29883e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 29893e519524SHoward Hinnantbool 29903e519524SHoward Hinnantoperator<=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__y < __x);} 29913e519524SHoward Hinnant 29923e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 29933e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 29943e519524SHoward Hinnantbool 29953e519524SHoward Hinnantoperator>=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__x < __y);} 29963e519524SHoward Hinnant 299767f39647SHoward Hinnanttemplate <class _T1, class _D1> 299867f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 299967f39647SHoward Hinnantbool 3000c0937e8aSHoward Hinnantoperator==(const unique_ptr<_T1, _D1>& __x, nullptr_t) _NOEXCEPT 300167f39647SHoward Hinnant{ 300267f39647SHoward Hinnant return !__x; 300367f39647SHoward Hinnant} 300467f39647SHoward Hinnant 300567f39647SHoward Hinnanttemplate <class _T1, class _D1> 300667f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 300767f39647SHoward Hinnantbool 3008c0937e8aSHoward Hinnantoperator==(nullptr_t, const unique_ptr<_T1, _D1>& __x) _NOEXCEPT 300967f39647SHoward Hinnant{ 301067f39647SHoward Hinnant return !__x; 301167f39647SHoward Hinnant} 301267f39647SHoward Hinnant 301367f39647SHoward Hinnanttemplate <class _T1, class _D1> 301467f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 301567f39647SHoward Hinnantbool 3016c0937e8aSHoward Hinnantoperator!=(const unique_ptr<_T1, _D1>& __x, nullptr_t) _NOEXCEPT 301767f39647SHoward Hinnant{ 301867f39647SHoward Hinnant return static_cast<bool>(__x); 301967f39647SHoward Hinnant} 302067f39647SHoward Hinnant 302167f39647SHoward Hinnanttemplate <class _T1, class _D1> 302267f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 302367f39647SHoward Hinnantbool 3024c0937e8aSHoward Hinnantoperator!=(nullptr_t, const unique_ptr<_T1, _D1>& __x) _NOEXCEPT 302567f39647SHoward Hinnant{ 302667f39647SHoward Hinnant return static_cast<bool>(__x); 302767f39647SHoward Hinnant} 302867f39647SHoward Hinnant 302967f39647SHoward Hinnanttemplate <class _T1, class _D1> 303067f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 303167f39647SHoward Hinnantbool 303267f39647SHoward Hinnantoperator<(const unique_ptr<_T1, _D1>& __x, nullptr_t) 303367f39647SHoward Hinnant{ 303467f39647SHoward Hinnant typedef typename unique_ptr<_T1, _D1>::pointer _P1; 303567f39647SHoward Hinnant return less<_P1>()(__x.get(), nullptr); 303667f39647SHoward Hinnant} 303767f39647SHoward Hinnant 303867f39647SHoward Hinnanttemplate <class _T1, class _D1> 303967f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 304067f39647SHoward Hinnantbool 304167f39647SHoward Hinnantoperator<(nullptr_t, const unique_ptr<_T1, _D1>& __x) 304267f39647SHoward Hinnant{ 304367f39647SHoward Hinnant typedef typename unique_ptr<_T1, _D1>::pointer _P1; 304467f39647SHoward Hinnant return less<_P1>()(nullptr, __x.get()); 304567f39647SHoward Hinnant} 304667f39647SHoward Hinnant 304767f39647SHoward Hinnanttemplate <class _T1, class _D1> 304867f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 304967f39647SHoward Hinnantbool 305067f39647SHoward Hinnantoperator>(const unique_ptr<_T1, _D1>& __x, nullptr_t) 305167f39647SHoward Hinnant{ 305267f39647SHoward Hinnant return nullptr < __x; 305367f39647SHoward Hinnant} 305467f39647SHoward Hinnant 305567f39647SHoward Hinnanttemplate <class _T1, class _D1> 305667f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 305767f39647SHoward Hinnantbool 305867f39647SHoward Hinnantoperator>(nullptr_t, const unique_ptr<_T1, _D1>& __x) 305967f39647SHoward Hinnant{ 306067f39647SHoward Hinnant return __x < nullptr; 306167f39647SHoward Hinnant} 306267f39647SHoward Hinnant 306367f39647SHoward Hinnanttemplate <class _T1, class _D1> 306467f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 306567f39647SHoward Hinnantbool 306667f39647SHoward Hinnantoperator<=(const unique_ptr<_T1, _D1>& __x, nullptr_t) 306767f39647SHoward Hinnant{ 306867f39647SHoward Hinnant return !(nullptr < __x); 306967f39647SHoward Hinnant} 307067f39647SHoward Hinnant 307167f39647SHoward Hinnanttemplate <class _T1, class _D1> 307267f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 307367f39647SHoward Hinnantbool 307467f39647SHoward Hinnantoperator<=(nullptr_t, const unique_ptr<_T1, _D1>& __x) 307567f39647SHoward Hinnant{ 307667f39647SHoward Hinnant return !(__x < nullptr); 307767f39647SHoward Hinnant} 307867f39647SHoward Hinnant 307967f39647SHoward Hinnanttemplate <class _T1, class _D1> 308067f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 308167f39647SHoward Hinnantbool 308267f39647SHoward Hinnantoperator>=(const unique_ptr<_T1, _D1>& __x, nullptr_t) 308367f39647SHoward Hinnant{ 308467f39647SHoward Hinnant return !(__x < nullptr); 308567f39647SHoward Hinnant} 308667f39647SHoward Hinnant 308767f39647SHoward Hinnanttemplate <class _T1, class _D1> 308867f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 308967f39647SHoward Hinnantbool 309067f39647SHoward Hinnantoperator>=(nullptr_t, const unique_ptr<_T1, _D1>& __x) 309167f39647SHoward Hinnant{ 309267f39647SHoward Hinnant return !(nullptr < __x); 309367f39647SHoward Hinnant} 309467f39647SHoward Hinnant 3095bff1bfc6SHoward Hinnant#ifdef _LIBCPP_HAS_NO_RVALUE_REFERENCES 3096bff1bfc6SHoward Hinnant 3097bff1bfc6SHoward Hinnanttemplate <class _Tp, class _Dp> 3098bff1bfc6SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 3099bff1bfc6SHoward Hinnantunique_ptr<_Tp, _Dp> 3100bff1bfc6SHoward Hinnantmove(unique_ptr<_Tp, _Dp>& __t) 3101bff1bfc6SHoward Hinnant{ 3102bff1bfc6SHoward Hinnant return unique_ptr<_Tp, _Dp>(__rv<unique_ptr<_Tp, _Dp> >(__t)); 3103bff1bfc6SHoward Hinnant} 3104bff1bfc6SHoward Hinnant 3105bff1bfc6SHoward Hinnant#endif 3106bff1bfc6SHoward Hinnant 310728d8ba5fSMarshall Clow#if _LIBCPP_STD_VER > 11 310828d8ba5fSMarshall Clow 310928d8ba5fSMarshall Clowtemplate<class _Tp> 311028d8ba5fSMarshall Clowstruct __unique_if 311128d8ba5fSMarshall Clow{ 311228d8ba5fSMarshall Clow typedef unique_ptr<_Tp> __unique_single; 311328d8ba5fSMarshall Clow}; 311428d8ba5fSMarshall Clow 311528d8ba5fSMarshall Clowtemplate<class _Tp> 311628d8ba5fSMarshall Clowstruct __unique_if<_Tp[]> 311728d8ba5fSMarshall Clow{ 311828d8ba5fSMarshall Clow typedef unique_ptr<_Tp[]> __unique_array_unknown_bound; 311928d8ba5fSMarshall Clow}; 312028d8ba5fSMarshall Clow 312128d8ba5fSMarshall Clowtemplate<class _Tp, size_t _Np> 312228d8ba5fSMarshall Clowstruct __unique_if<_Tp[_Np]> 312328d8ba5fSMarshall Clow{ 312428d8ba5fSMarshall Clow typedef void __unique_array_known_bound; 312528d8ba5fSMarshall Clow}; 312628d8ba5fSMarshall Clow 312728d8ba5fSMarshall Clowtemplate<class _Tp, class... _Args> 312895ddb530SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 312928d8ba5fSMarshall Clowtypename __unique_if<_Tp>::__unique_single 313028d8ba5fSMarshall Clowmake_unique(_Args&&... __args) 313128d8ba5fSMarshall Clow{ 313228d8ba5fSMarshall Clow return unique_ptr<_Tp>(new _Tp(_VSTD::forward<_Args>(__args)...)); 313328d8ba5fSMarshall Clow} 313428d8ba5fSMarshall Clow 313528d8ba5fSMarshall Clowtemplate<class _Tp> 313695ddb530SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 313728d8ba5fSMarshall Clowtypename __unique_if<_Tp>::__unique_array_unknown_bound 313828d8ba5fSMarshall Clowmake_unique(size_t __n) 313928d8ba5fSMarshall Clow{ 314028d8ba5fSMarshall Clow typedef typename remove_extent<_Tp>::type _Up; 314128d8ba5fSMarshall Clow return unique_ptr<_Tp>(new _Up[__n]()); 314228d8ba5fSMarshall Clow} 314328d8ba5fSMarshall Clow 314428d8ba5fSMarshall Clowtemplate<class _Tp, class... _Args> 314528d8ba5fSMarshall Clow typename __unique_if<_Tp>::__unique_array_known_bound 314628d8ba5fSMarshall Clow make_unique(_Args&&...) = delete; 314728d8ba5fSMarshall Clow 314828d8ba5fSMarshall Clow#endif // _LIBCPP_STD_VER > 11 314928d8ba5fSMarshall Clow 3150d1803b6cSHoward Hinnanttemplate <class _Tp, class _Dp> 3151f9127593SEric Fiselier#ifdef _LIBCPP_CXX03_LANG 3152e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS hash<unique_ptr<_Tp, _Dp> > 3153f9127593SEric Fiselier#else 3154f9127593SEric Fiselierstruct _LIBCPP_TEMPLATE_VIS hash<__enable_hash_helper< 3155f9127593SEric Fiselier unique_ptr<_Tp, _Dp>, typename unique_ptr<_Tp, _Dp>::pointer>> 3156f9127593SEric Fiselier#endif 3157d1803b6cSHoward Hinnant{ 3158d1803b6cSHoward Hinnant typedef unique_ptr<_Tp, _Dp> argument_type; 3159d1803b6cSHoward Hinnant typedef size_t result_type; 3160848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 31617c803385SMarshall Clow result_type operator()(const argument_type& __ptr) const 3162d1803b6cSHoward Hinnant { 3163d1803b6cSHoward Hinnant typedef typename argument_type::pointer pointer; 3164d1803b6cSHoward Hinnant return hash<pointer>()(__ptr.get()); 3165d1803b6cSHoward Hinnant } 3166d1803b6cSHoward Hinnant}; 3167d1803b6cSHoward Hinnant 31683e519524SHoward Hinnantstruct __destruct_n 31693e519524SHoward Hinnant{ 31703e519524SHoward Hinnantprivate: 31719ffacf3dSEric Fiselier size_t __size_; 31723e519524SHoward Hinnant 31733e519524SHoward Hinnant template <class _Tp> 31743739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __process(_Tp* __p, false_type) _NOEXCEPT 31759ffacf3dSEric Fiselier {for (size_t __i = 0; __i < __size_; ++__i, ++__p) __p->~_Tp();} 31763e519524SHoward Hinnant 31773e519524SHoward Hinnant template <class _Tp> 31783739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __process(_Tp*, true_type) _NOEXCEPT 31793e519524SHoward Hinnant {} 31803e519524SHoward Hinnant 31813739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __incr(false_type) _NOEXCEPT 31829ffacf3dSEric Fiselier {++__size_;} 31833739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __incr(true_type) _NOEXCEPT 31843e519524SHoward Hinnant {} 31853e519524SHoward Hinnant 31863739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __set(size_t __s, false_type) _NOEXCEPT 31879ffacf3dSEric Fiselier {__size_ = __s;} 31883739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __set(size_t, true_type) _NOEXCEPT 31893e519524SHoward Hinnant {} 31903e519524SHoward Hinnantpublic: 31913739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __destruct_n(size_t __s) _NOEXCEPT 31929ffacf3dSEric Fiselier : __size_(__s) {} 31933e519524SHoward Hinnant 31943e519524SHoward Hinnant template <class _Tp> 31953739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __incr(_Tp*) _NOEXCEPT 3196ca740483SHoward Hinnant {__incr(integral_constant<bool, is_trivially_destructible<_Tp>::value>());} 31973e519524SHoward Hinnant 31983e519524SHoward Hinnant template <class _Tp> 31993739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __set(size_t __s, _Tp*) _NOEXCEPT 3200ca740483SHoward Hinnant {__set(__s, integral_constant<bool, is_trivially_destructible<_Tp>::value>());} 32013e519524SHoward Hinnant 32023e519524SHoward Hinnant template <class _Tp> 32033739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __p) _NOEXCEPT 3204ca740483SHoward Hinnant {__process(__p, integral_constant<bool, is_trivially_destructible<_Tp>::value>());} 32053e519524SHoward Hinnant}; 32063e519524SHoward Hinnant 32073e519524SHoward Hinnanttemplate <class _Alloc> 32083e519524SHoward Hinnantclass __allocator_destructor 32093e519524SHoward Hinnant{ 32103e519524SHoward Hinnant typedef allocator_traits<_Alloc> __alloc_traits; 32113e519524SHoward Hinnantpublic: 32123e519524SHoward Hinnant typedef typename __alloc_traits::pointer pointer; 32133e519524SHoward Hinnant typedef typename __alloc_traits::size_type size_type; 32143e519524SHoward Hinnantprivate: 32153e519524SHoward Hinnant _Alloc& __alloc_; 32163e519524SHoward Hinnant size_type __s_; 32173e519524SHoward Hinnantpublic: 32183e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __allocator_destructor(_Alloc& __a, size_type __s) 32193739fe79SHoward Hinnant _NOEXCEPT 32203e519524SHoward Hinnant : __alloc_(__a), __s_(__s) {} 3221848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 32223739fe79SHoward Hinnant void operator()(pointer __p) _NOEXCEPT 32233739fe79SHoward Hinnant {__alloc_traits::deallocate(__alloc_, __p, __s_);} 32243e519524SHoward Hinnant}; 32253e519524SHoward Hinnant 32263e519524SHoward Hinnanttemplate <class _InputIterator, class _ForwardIterator> 32273e519524SHoward Hinnant_ForwardIterator 32283e519524SHoward Hinnantuninitialized_copy(_InputIterator __f, _InputIterator __l, _ForwardIterator __r) 32293e519524SHoward Hinnant{ 32303e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 3231b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3232b34b4819SHoward Hinnant _ForwardIterator __s = __r; 3233b34b4819SHoward Hinnant try 3234b34b4819SHoward Hinnant { 3235b34b4819SHoward Hinnant#endif 3236a00932bdSMarshall Clow for (; __f != __l; ++__f, (void) ++__r) 3237a00932bdSMarshall Clow ::new (static_cast<void*>(_VSTD::addressof(*__r))) value_type(*__f); 3238b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3239b34b4819SHoward Hinnant } 3240b34b4819SHoward Hinnant catch (...) 3241b34b4819SHoward Hinnant { 3242b34b4819SHoward Hinnant for (; __s != __r; ++__s) 3243b34b4819SHoward Hinnant __s->~value_type(); 3244b34b4819SHoward Hinnant throw; 3245b34b4819SHoward Hinnant } 3246b34b4819SHoward Hinnant#endif 32473e519524SHoward Hinnant return __r; 32483e519524SHoward Hinnant} 32493e519524SHoward Hinnant 32503e519524SHoward Hinnanttemplate <class _InputIterator, class _Size, class _ForwardIterator> 32513e519524SHoward Hinnant_ForwardIterator 32523e519524SHoward Hinnantuninitialized_copy_n(_InputIterator __f, _Size __n, _ForwardIterator __r) 32533e519524SHoward Hinnant{ 32543e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 3255b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3256b34b4819SHoward Hinnant _ForwardIterator __s = __r; 3257b34b4819SHoward Hinnant try 3258b34b4819SHoward Hinnant { 3259b34b4819SHoward Hinnant#endif 3260a00932bdSMarshall Clow for (; __n > 0; ++__f, (void) ++__r, (void) --__n) 3261a00932bdSMarshall Clow ::new (static_cast<void*>(_VSTD::addressof(*__r))) value_type(*__f); 3262b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3263b34b4819SHoward Hinnant } 3264b34b4819SHoward Hinnant catch (...) 3265b34b4819SHoward Hinnant { 3266b34b4819SHoward Hinnant for (; __s != __r; ++__s) 3267b34b4819SHoward Hinnant __s->~value_type(); 3268b34b4819SHoward Hinnant throw; 3269b34b4819SHoward Hinnant } 3270b34b4819SHoward Hinnant#endif 32713e519524SHoward Hinnant return __r; 32723e519524SHoward Hinnant} 32733e519524SHoward Hinnant 32743e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Tp> 32753e519524SHoward Hinnantvoid 32763e519524SHoward Hinnantuninitialized_fill(_ForwardIterator __f, _ForwardIterator __l, const _Tp& __x) 32773e519524SHoward Hinnant{ 32783e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 3279b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3280b34b4819SHoward Hinnant _ForwardIterator __s = __f; 3281b34b4819SHoward Hinnant try 3282b34b4819SHoward Hinnant { 3283b34b4819SHoward Hinnant#endif 3284b34b4819SHoward Hinnant for (; __f != __l; ++__f) 3285a00932bdSMarshall Clow ::new (static_cast<void*>(_VSTD::addressof(*__f))) value_type(__x); 3286b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3287b34b4819SHoward Hinnant } 3288b34b4819SHoward Hinnant catch (...) 3289b34b4819SHoward Hinnant { 3290b34b4819SHoward Hinnant for (; __s != __f; ++__s) 3291b34b4819SHoward Hinnant __s->~value_type(); 3292b34b4819SHoward Hinnant throw; 3293b34b4819SHoward Hinnant } 3294b34b4819SHoward Hinnant#endif 32953e519524SHoward Hinnant} 32963e519524SHoward Hinnant 32973e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Size, class _Tp> 329848d05bd2SHoward Hinnant_ForwardIterator 32993e519524SHoward Hinnantuninitialized_fill_n(_ForwardIterator __f, _Size __n, const _Tp& __x) 33003e519524SHoward Hinnant{ 33013e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 3302b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3303b34b4819SHoward Hinnant _ForwardIterator __s = __f; 3304b34b4819SHoward Hinnant try 3305b34b4819SHoward Hinnant { 3306b34b4819SHoward Hinnant#endif 3307a00932bdSMarshall Clow for (; __n > 0; ++__f, (void) --__n) 3308a00932bdSMarshall Clow ::new (static_cast<void*>(_VSTD::addressof(*__f))) value_type(__x); 3309b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3310b34b4819SHoward Hinnant } 3311b34b4819SHoward Hinnant catch (...) 3312b34b4819SHoward Hinnant { 3313b34b4819SHoward Hinnant for (; __s != __f; ++__s) 3314b34b4819SHoward Hinnant __s->~value_type(); 3315b34b4819SHoward Hinnant throw; 3316b34b4819SHoward Hinnant } 3317b34b4819SHoward Hinnant#endif 331848d05bd2SHoward Hinnant return __f; 33193e519524SHoward Hinnant} 33203e519524SHoward Hinnant 3321e4d9c316SEric Fiselier#if _LIBCPP_STD_VER > 14 3322e4d9c316SEric Fiselier 3323e4d9c316SEric Fiseliertemplate <class _Tp> 3324e4d9c316SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3325e4d9c316SEric Fiseliervoid destroy_at(_Tp* __loc) { 3326e4d9c316SEric Fiselier _LIBCPP_ASSERT(__loc, "null pointer given to destroy_at"); 3327e4d9c316SEric Fiselier __loc->~_Tp(); 3328e4d9c316SEric Fiselier} 3329e4d9c316SEric Fiselier 3330e4d9c316SEric Fiseliertemplate <class _ForwardIterator> 3331e4d9c316SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3332e4d9c316SEric Fiseliervoid destroy(_ForwardIterator __first, _ForwardIterator __last) { 3333e4d9c316SEric Fiselier for (; __first != __last; ++__first) 3334e4d9c316SEric Fiselier _VSTD::destroy_at(_VSTD::addressof(*__first)); 3335e4d9c316SEric Fiselier} 3336e4d9c316SEric Fiselier 3337e4d9c316SEric Fiseliertemplate <class _ForwardIterator, class _Size> 3338e4d9c316SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3339e4d9c316SEric Fiselier_ForwardIterator destroy_n(_ForwardIterator __first, _Size __n) { 3340e4d9c316SEric Fiselier for (; __n > 0; (void)++__first, --__n) 3341e4d9c316SEric Fiselier _VSTD::destroy_at(_VSTD::addressof(*__first)); 3342e4d9c316SEric Fiselier return __first; 3343e4d9c316SEric Fiselier} 3344e4d9c316SEric Fiselier 3345e778d10cSEric Fiseliertemplate <class _ForwardIterator> 3346e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3347e778d10cSEric Fiseliervoid uninitialized_default_construct(_ForwardIterator __first, _ForwardIterator __last) { 3348e778d10cSEric Fiselier using _Vt = typename iterator_traits<_ForwardIterator>::value_type; 3349e778d10cSEric Fiselier auto __idx = __first; 3350e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3351e778d10cSEric Fiselier try { 3352e778d10cSEric Fiselier#endif 3353e778d10cSEric Fiselier for (; __idx != __last; ++__idx) 3354e778d10cSEric Fiselier ::new((void*)_VSTD::addressof(*__idx)) _Vt; 3355e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3356e778d10cSEric Fiselier } catch (...) { 3357e778d10cSEric Fiselier _VSTD::destroy(__first, __idx); 3358e778d10cSEric Fiselier throw; 3359e778d10cSEric Fiselier } 3360e778d10cSEric Fiselier#endif 3361e778d10cSEric Fiselier} 3362e778d10cSEric Fiselier 3363e778d10cSEric Fiseliertemplate <class _ForwardIterator, class _Size> 3364e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3365e778d10cSEric Fiselier_ForwardIterator uninitialized_default_construct_n(_ForwardIterator __first, _Size __n) { 3366e778d10cSEric Fiselier using _Vt = typename iterator_traits<_ForwardIterator>::value_type; 3367e778d10cSEric Fiselier auto __idx = __first; 3368e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3369e778d10cSEric Fiselier try { 3370e778d10cSEric Fiselier#endif 3371e778d10cSEric Fiselier for (; __n > 0; (void)++__idx, --__n) 3372e778d10cSEric Fiselier ::new((void*)_VSTD::addressof(*__idx)) _Vt; 3373e778d10cSEric Fiselier return __idx; 3374e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3375e778d10cSEric Fiselier } catch (...) { 3376e778d10cSEric Fiselier _VSTD::destroy(__first, __idx); 3377e778d10cSEric Fiselier throw; 3378e778d10cSEric Fiselier } 3379e778d10cSEric Fiselier#endif 3380e778d10cSEric Fiselier} 3381e778d10cSEric Fiselier 3382e778d10cSEric Fiselier 3383e778d10cSEric Fiseliertemplate <class _ForwardIterator> 3384e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3385e778d10cSEric Fiseliervoid uninitialized_value_construct(_ForwardIterator __first, _ForwardIterator __last) { 3386e778d10cSEric Fiselier using _Vt = typename iterator_traits<_ForwardIterator>::value_type; 3387e778d10cSEric Fiselier auto __idx = __first; 3388e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3389e778d10cSEric Fiselier try { 3390e778d10cSEric Fiselier#endif 3391e778d10cSEric Fiselier for (; __idx != __last; ++__idx) 3392e778d10cSEric Fiselier ::new((void*)_VSTD::addressof(*__idx)) _Vt(); 3393e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3394e778d10cSEric Fiselier } catch (...) { 3395e778d10cSEric Fiselier _VSTD::destroy(__first, __idx); 3396e778d10cSEric Fiselier throw; 3397e778d10cSEric Fiselier } 3398e778d10cSEric Fiselier#endif 3399e778d10cSEric Fiselier} 3400e778d10cSEric Fiselier 3401e778d10cSEric Fiseliertemplate <class _ForwardIterator, class _Size> 3402e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3403e778d10cSEric Fiselier_ForwardIterator uninitialized_value_construct_n(_ForwardIterator __first, _Size __n) { 3404e778d10cSEric Fiselier using _Vt = typename iterator_traits<_ForwardIterator>::value_type; 3405e778d10cSEric Fiselier auto __idx = __first; 3406e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3407e778d10cSEric Fiselier try { 3408e778d10cSEric Fiselier#endif 3409e778d10cSEric Fiselier for (; __n > 0; (void)++__idx, --__n) 3410e778d10cSEric Fiselier ::new((void*)_VSTD::addressof(*__idx)) _Vt(); 3411e778d10cSEric Fiselier return __idx; 3412e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3413e778d10cSEric Fiselier } catch (...) { 3414e778d10cSEric Fiselier _VSTD::destroy(__first, __idx); 3415e778d10cSEric Fiselier throw; 3416e778d10cSEric Fiselier } 3417e778d10cSEric Fiselier#endif 3418e778d10cSEric Fiselier} 3419e778d10cSEric Fiselier 3420e778d10cSEric Fiselier 3421e778d10cSEric Fiseliertemplate <class _InputIt, class _ForwardIt> 3422e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3423e778d10cSEric Fiselier_ForwardIt uninitialized_move(_InputIt __first, _InputIt __last, _ForwardIt __first_res) { 3424e778d10cSEric Fiselier using _Vt = typename iterator_traits<_ForwardIt>::value_type; 3425e778d10cSEric Fiselier auto __idx = __first_res; 3426e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3427e778d10cSEric Fiselier try { 3428e778d10cSEric Fiselier#endif 3429e778d10cSEric Fiselier for (; __first != __last; (void)++__idx, ++__first) 3430e778d10cSEric Fiselier ::new((void*)_VSTD::addressof(*__idx)) _Vt(std::move(*__first)); 3431e778d10cSEric Fiselier return __idx; 3432e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3433e778d10cSEric Fiselier } catch (...) { 3434e778d10cSEric Fiselier _VSTD::destroy(__first_res, __idx); 3435e778d10cSEric Fiselier throw; 3436e778d10cSEric Fiselier } 3437e778d10cSEric Fiselier#endif 3438e778d10cSEric Fiselier} 3439e778d10cSEric Fiselier 3440e778d10cSEric Fiseliertemplate <class _InputIt, class _Size, class _ForwardIt> 3441e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3442e778d10cSEric Fiselierpair<_InputIt, _ForwardIt> 3443e778d10cSEric Fiselieruninitialized_move_n(_InputIt __first, _Size __n, _ForwardIt __first_res) { 3444e778d10cSEric Fiselier using _Vt = typename iterator_traits<_ForwardIt>::value_type; 3445e778d10cSEric Fiselier auto __idx = __first_res; 3446e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3447e778d10cSEric Fiselier try { 3448e778d10cSEric Fiselier#endif 3449e778d10cSEric Fiselier for (; __n > 0; ++__idx, (void)++__first, --__n) 3450e778d10cSEric Fiselier ::new((void*)_VSTD::addressof(*__idx)) _Vt(std::move(*__first)); 3451e778d10cSEric Fiselier return {__first, __idx}; 3452e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3453e778d10cSEric Fiselier } catch (...) { 3454e778d10cSEric Fiselier _VSTD::destroy(__first_res, __idx); 3455e778d10cSEric Fiselier throw; 3456e778d10cSEric Fiselier } 3457e778d10cSEric Fiselier#endif 3458e778d10cSEric Fiselier} 3459e778d10cSEric Fiselier 3460e778d10cSEric Fiselier 3461e4d9c316SEric Fiselier#endif // _LIBCPP_STD_VER > 14 3462e4d9c316SEric Fiselier 3463f08de52dSKevin Hu// NOTE: Relaxed and acq/rel atomics (for increment and decrement respectively) 3464f08de52dSKevin Hu// should be sufficient for thread safety. 34653c35491fSEric Fiselier// See https://bugs.llvm.org/show_bug.cgi?id=22803 3466f08de52dSKevin Hu#if defined(__clang__) && __has_builtin(__atomic_add_fetch) \ 3467f08de52dSKevin Hu && defined(__ATOMIC_RELAXED) \ 3468f08de52dSKevin Hu && defined(__ATOMIC_ACQ_REL) 3469f08de52dSKevin Hu# define _LIBCPP_HAS_BUILTIN_ATOMIC_SUPPORT 3470f08de52dSKevin Hu#elif !defined(__clang__) && defined(_GNUC_VER) && _GNUC_VER >= 407 3471f08de52dSKevin Hu# define _LIBCPP_HAS_BUILTIN_ATOMIC_SUPPORT 3472f08de52dSKevin Hu#endif 3473f08de52dSKevin Hu 3474f08de52dSKevin Hutemplate <class _Tp> 3475f08de52dSKevin Huinline _LIBCPP_INLINE_VISIBILITY _Tp 3476f08de52dSKevin Hu__libcpp_atomic_refcount_increment(_Tp& __t) _NOEXCEPT 3477f08de52dSKevin Hu{ 3478f08de52dSKevin Hu#if defined(_LIBCPP_HAS_BUILTIN_ATOMIC_SUPPORT) && !defined(_LIBCPP_HAS_NO_THREADS) 3479f08de52dSKevin Hu return __atomic_add_fetch(&__t, 1, __ATOMIC_RELAXED); 3480f08de52dSKevin Hu#else 3481f08de52dSKevin Hu return __t += 1; 3482f08de52dSKevin Hu#endif 3483f08de52dSKevin Hu} 3484f08de52dSKevin Hu 3485f08de52dSKevin Hutemplate <class _Tp> 3486f08de52dSKevin Huinline _LIBCPP_INLINE_VISIBILITY _Tp 3487f08de52dSKevin Hu__libcpp_atomic_refcount_decrement(_Tp& __t) _NOEXCEPT 3488f08de52dSKevin Hu{ 3489f08de52dSKevin Hu#if defined(_LIBCPP_HAS_BUILTIN_ATOMIC_SUPPORT) && !defined(_LIBCPP_HAS_NO_THREADS) 3490f08de52dSKevin Hu return __atomic_add_fetch(&__t, -1, __ATOMIC_ACQ_REL); 3491f08de52dSKevin Hu#else 3492f08de52dSKevin Hu return __t -= 1; 3493f08de52dSKevin Hu#endif 3494f08de52dSKevin Hu} 3495f08de52dSKevin Hu 3496848a5374SHoward Hinnantclass _LIBCPP_EXCEPTION_ABI bad_weak_ptr 34973e519524SHoward Hinnant : public std::exception 34983e519524SHoward Hinnant{ 34993e519524SHoward Hinnantpublic: 35003739fe79SHoward Hinnant virtual ~bad_weak_ptr() _NOEXCEPT; 35013739fe79SHoward Hinnant virtual const char* what() const _NOEXCEPT; 35023e519524SHoward Hinnant}; 35033e519524SHoward Hinnant 3504dc7200b4SLouis Dionne_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY 3505d437fa5cSMarshall Clowvoid __throw_bad_weak_ptr() 3506d437fa5cSMarshall Clow{ 3507d437fa5cSMarshall Clow#ifndef _LIBCPP_NO_EXCEPTIONS 3508d437fa5cSMarshall Clow throw bad_weak_ptr(); 3509d437fa5cSMarshall Clow#else 3510d437fa5cSMarshall Clow _VSTD::abort(); 3511d437fa5cSMarshall Clow#endif 3512d437fa5cSMarshall Clow} 3513d437fa5cSMarshall Clow 3514e2f2d1edSEric Fiseliertemplate<class _Tp> class _LIBCPP_TEMPLATE_VIS weak_ptr; 35153e519524SHoward Hinnant 3516f0544c20SHoward Hinnantclass _LIBCPP_TYPE_VIS __shared_count 35173e519524SHoward Hinnant{ 35183e519524SHoward Hinnant __shared_count(const __shared_count&); 35193e519524SHoward Hinnant __shared_count& operator=(const __shared_count&); 35203e519524SHoward Hinnant 35213e519524SHoward Hinnantprotected: 35223e519524SHoward Hinnant long __shared_owners_; 35233e519524SHoward Hinnant virtual ~__shared_count(); 35243e519524SHoward Hinnantprivate: 35253739fe79SHoward Hinnant virtual void __on_zero_shared() _NOEXCEPT = 0; 35263e519524SHoward Hinnant 35273e519524SHoward Hinnantpublic: 3528848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 35293739fe79SHoward Hinnant explicit __shared_count(long __refs = 0) _NOEXCEPT 35303e519524SHoward Hinnant : __shared_owners_(__refs) {} 35313e519524SHoward Hinnant 3532c8e84ff2SLouis Dionne#if defined(_LIBCPP_BUILDING_LIBRARY) && \ 353311f60453SEric Fiselier defined(_LIBCPP_DEPRECATED_ABI_LEGACY_LIBRARY_DEFINITIONS_FOR_INLINE_FUNCTIONS) 3534a480c28bSEric Fiselier void __add_shared() _NOEXCEPT; 3535a480c28bSEric Fiselier bool __release_shared() _NOEXCEPT; 3536f08de52dSKevin Hu#else 3537f08de52dSKevin Hu _LIBCPP_INLINE_VISIBILITY 3538f08de52dSKevin Hu void __add_shared() _NOEXCEPT { 3539f08de52dSKevin Hu __libcpp_atomic_refcount_increment(__shared_owners_); 3540f08de52dSKevin Hu } 3541f08de52dSKevin Hu _LIBCPP_INLINE_VISIBILITY 3542f08de52dSKevin Hu bool __release_shared() _NOEXCEPT { 3543f08de52dSKevin Hu if (__libcpp_atomic_refcount_decrement(__shared_owners_) == -1) { 3544f08de52dSKevin Hu __on_zero_shared(); 3545f08de52dSKevin Hu return true; 3546f08de52dSKevin Hu } 3547f08de52dSKevin Hu return false; 3548f08de52dSKevin Hu } 3549f08de52dSKevin Hu#endif 3550848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 35511faf289eSEric Fiselier long use_count() const _NOEXCEPT { 35521faf289eSEric Fiselier return __libcpp_relaxed_load(&__shared_owners_) + 1; 35531faf289eSEric Fiselier } 35543e519524SHoward Hinnant}; 35553e519524SHoward Hinnant 3556f0544c20SHoward Hinnantclass _LIBCPP_TYPE_VIS __shared_weak_count 35573e519524SHoward Hinnant : private __shared_count 35583e519524SHoward Hinnant{ 35593e519524SHoward Hinnant long __shared_weak_owners_; 35603e519524SHoward Hinnant 35613e519524SHoward Hinnantpublic: 3562848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 35633739fe79SHoward Hinnant explicit __shared_weak_count(long __refs = 0) _NOEXCEPT 35643e519524SHoward Hinnant : __shared_count(__refs), 35653e519524SHoward Hinnant __shared_weak_owners_(__refs) {} 35663e519524SHoward Hinnantprotected: 35673e519524SHoward Hinnant virtual ~__shared_weak_count(); 35683e519524SHoward Hinnant 35693e519524SHoward Hinnantpublic: 3570c8e84ff2SLouis Dionne#if defined(_LIBCPP_BUILDING_LIBRARY) && \ 357111f60453SEric Fiselier defined(_LIBCPP_DEPRECATED_ABI_LEGACY_LIBRARY_DEFINITIONS_FOR_INLINE_FUNCTIONS) 3572a480c28bSEric Fiselier void __add_shared() _NOEXCEPT; 3573a480c28bSEric Fiselier void __add_weak() _NOEXCEPT; 3574a480c28bSEric Fiselier void __release_shared() _NOEXCEPT; 3575f08de52dSKevin Hu#else 3576f08de52dSKevin Hu _LIBCPP_INLINE_VISIBILITY 3577f08de52dSKevin Hu void __add_shared() _NOEXCEPT { 3578f08de52dSKevin Hu __shared_count::__add_shared(); 3579f08de52dSKevin Hu } 3580f08de52dSKevin Hu _LIBCPP_INLINE_VISIBILITY 3581f08de52dSKevin Hu void __add_weak() _NOEXCEPT { 3582f08de52dSKevin Hu __libcpp_atomic_refcount_increment(__shared_weak_owners_); 3583f08de52dSKevin Hu } 3584f08de52dSKevin Hu _LIBCPP_INLINE_VISIBILITY 3585f08de52dSKevin Hu void __release_shared() _NOEXCEPT { 3586f08de52dSKevin Hu if (__shared_count::__release_shared()) 3587f08de52dSKevin Hu __release_weak(); 3588f08de52dSKevin Hu } 3589f08de52dSKevin Hu#endif 35903739fe79SHoward Hinnant void __release_weak() _NOEXCEPT; 3591848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 35923739fe79SHoward Hinnant long use_count() const _NOEXCEPT {return __shared_count::use_count();} 35933739fe79SHoward Hinnant __shared_weak_count* lock() _NOEXCEPT; 35943e519524SHoward Hinnant 3595a9f69800SHoward Hinnant // Define the function out only if we build static libc++ without RTTI. 3596a9f69800SHoward Hinnant // Otherwise we may break clients who need to compile their projects with 3597a9f69800SHoward Hinnant // -fno-rtti and yet link against a libc++.dylib compiled 3598a9f69800SHoward Hinnant // without -fno-rtti. 3599a9f69800SHoward Hinnant#if !defined(_LIBCPP_NO_RTTI) || !defined(_LIBCPP_BUILD_STATIC) 36003739fe79SHoward Hinnant virtual const void* __get_deleter(const type_info&) const _NOEXCEPT; 3601a9f69800SHoward Hinnant#endif 36023e519524SHoward Hinnantprivate: 36033739fe79SHoward Hinnant virtual void __on_zero_shared_weak() _NOEXCEPT = 0; 36043e519524SHoward Hinnant}; 36053e519524SHoward Hinnant 36063e519524SHoward Hinnanttemplate <class _Tp, class _Dp, class _Alloc> 36073e519524SHoward Hinnantclass __shared_ptr_pointer 36083e519524SHoward Hinnant : public __shared_weak_count 36093e519524SHoward Hinnant{ 36103e519524SHoward Hinnant __compressed_pair<__compressed_pair<_Tp, _Dp>, _Alloc> __data_; 36113e519524SHoward Hinnantpublic: 3612848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 36133e519524SHoward Hinnant __shared_ptr_pointer(_Tp __p, _Dp __d, _Alloc __a) 3614ce48a113SHoward Hinnant : __data_(__compressed_pair<_Tp, _Dp>(__p, _VSTD::move(__d)), _VSTD::move(__a)) {} 36153e519524SHoward Hinnant 361654b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI 36173739fe79SHoward Hinnant virtual const void* __get_deleter(const type_info&) const _NOEXCEPT; 361854b409fdSHoward Hinnant#endif 36193e519524SHoward Hinnant 36203e519524SHoward Hinnantprivate: 36213739fe79SHoward Hinnant virtual void __on_zero_shared() _NOEXCEPT; 36223739fe79SHoward Hinnant virtual void __on_zero_shared_weak() _NOEXCEPT; 36233e519524SHoward Hinnant}; 36243e519524SHoward Hinnant 362554b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI 362654b409fdSHoward Hinnant 36273e519524SHoward Hinnanttemplate <class _Tp, class _Dp, class _Alloc> 36283e519524SHoward Hinnantconst void* 36293739fe79SHoward Hinnant__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__get_deleter(const type_info& __t) const _NOEXCEPT 36303e519524SHoward Hinnant{ 36319c973b9fSEric Fiselier return __t == typeid(_Dp) ? _VSTD::addressof(__data_.first().second()) : nullptr; 36323e519524SHoward Hinnant} 36333e519524SHoward Hinnant 3634b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_RTTI 363554b409fdSHoward Hinnant 36363e519524SHoward Hinnanttemplate <class _Tp, class _Dp, class _Alloc> 36373e519524SHoward Hinnantvoid 36383739fe79SHoward Hinnant__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__on_zero_shared() _NOEXCEPT 36393e519524SHoward Hinnant{ 36403e519524SHoward Hinnant __data_.first().second()(__data_.first().first()); 36413e519524SHoward Hinnant __data_.first().second().~_Dp(); 36423e519524SHoward Hinnant} 36433e519524SHoward Hinnant 36443e519524SHoward Hinnanttemplate <class _Tp, class _Dp, class _Alloc> 36453e519524SHoward Hinnantvoid 36463739fe79SHoward Hinnant__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__on_zero_shared_weak() _NOEXCEPT 36473e519524SHoward Hinnant{ 36486fe361c1SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, __shared_ptr_pointer>::type _Al; 36496fe361c1SEric Fiselier typedef allocator_traits<_Al> _ATraits; 3650319be722SEric Fiselier typedef pointer_traits<typename _ATraits::pointer> _PTraits; 3651319be722SEric Fiselier 36526fe361c1SEric Fiselier _Al __a(__data_.second()); 36533e519524SHoward Hinnant __data_.second().~_Alloc(); 3654319be722SEric Fiselier __a.deallocate(_PTraits::pointer_to(*this), 1); 36553e519524SHoward Hinnant} 36563e519524SHoward Hinnant 36573e519524SHoward Hinnanttemplate <class _Tp, class _Alloc> 36583e519524SHoward Hinnantclass __shared_ptr_emplace 36593e519524SHoward Hinnant : public __shared_weak_count 36603e519524SHoward Hinnant{ 36613e519524SHoward Hinnant __compressed_pair<_Alloc, _Tp> __data_; 36623e519524SHoward Hinnantpublic: 36633e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 36643e519524SHoward Hinnant 3665848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 36663e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a) 3667ce48a113SHoward Hinnant : __data_(_VSTD::move(__a)) {} 36683e519524SHoward Hinnant 36693e519524SHoward Hinnant template <class ..._Args> 3670848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 36713e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a, _Args&& ...__args) 3672a87b5e34SHoward Hinnant : __data_(piecewise_construct, _VSTD::forward_as_tuple(__a), 3673a87b5e34SHoward Hinnant _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)) {} 36743e519524SHoward Hinnant 36753e519524SHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 36763e519524SHoward Hinnant 3677848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 36783e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a) 36793e519524SHoward Hinnant : __data_(__a) {} 36803e519524SHoward Hinnant 36813e519524SHoward Hinnant template <class _A0> 3682848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 36833e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a, _A0& __a0) 36843e519524SHoward Hinnant : __data_(__a, _Tp(__a0)) {} 36853e519524SHoward Hinnant 36863e519524SHoward Hinnant template <class _A0, class _A1> 3687848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 36883e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a, _A0& __a0, _A1& __a1) 36893e519524SHoward Hinnant : __data_(__a, _Tp(__a0, __a1)) {} 36903e519524SHoward Hinnant 36913e519524SHoward Hinnant template <class _A0, class _A1, class _A2> 3692848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 36933e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a, _A0& __a0, _A1& __a1, _A2& __a2) 36943e519524SHoward Hinnant : __data_(__a, _Tp(__a0, __a1, __a2)) {} 36953e519524SHoward Hinnant 36963e519524SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 36973e519524SHoward Hinnant 36983e519524SHoward Hinnantprivate: 36993739fe79SHoward Hinnant virtual void __on_zero_shared() _NOEXCEPT; 37003739fe79SHoward Hinnant virtual void __on_zero_shared_weak() _NOEXCEPT; 37013e519524SHoward Hinnantpublic: 3702848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 3703fa8ce345SMarshall Clow _Tp* get() _NOEXCEPT {return _VSTD::addressof(__data_.second());} 37043e519524SHoward Hinnant}; 37053e519524SHoward Hinnant 37063e519524SHoward Hinnanttemplate <class _Tp, class _Alloc> 37073e519524SHoward Hinnantvoid 37083739fe79SHoward Hinnant__shared_ptr_emplace<_Tp, _Alloc>::__on_zero_shared() _NOEXCEPT 37093e519524SHoward Hinnant{ 37103e519524SHoward Hinnant __data_.second().~_Tp(); 37113e519524SHoward Hinnant} 37123e519524SHoward Hinnant 37133e519524SHoward Hinnanttemplate <class _Tp, class _Alloc> 37143e519524SHoward Hinnantvoid 37153739fe79SHoward Hinnant__shared_ptr_emplace<_Tp, _Alloc>::__on_zero_shared_weak() _NOEXCEPT 37163e519524SHoward Hinnant{ 37176fe361c1SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, __shared_ptr_emplace>::type _Al; 37186fe361c1SEric Fiselier typedef allocator_traits<_Al> _ATraits; 3719319be722SEric Fiselier typedef pointer_traits<typename _ATraits::pointer> _PTraits; 37206fe361c1SEric Fiselier _Al __a(__data_.first()); 37213e519524SHoward Hinnant __data_.first().~_Alloc(); 3722319be722SEric Fiselier __a.deallocate(_PTraits::pointer_to(*this), 1); 37233e519524SHoward Hinnant} 37243e519524SHoward Hinnant 372572d0d603SErik Pilkingtonstruct __shared_ptr_dummy_rebind_allocator_type; 372672d0d603SErik Pilkingtontemplate <> 372772d0d603SErik Pilkingtonclass _LIBCPP_TEMPLATE_VIS allocator<__shared_ptr_dummy_rebind_allocator_type> 372872d0d603SErik Pilkington{ 372972d0d603SErik Pilkingtonpublic: 373072d0d603SErik Pilkington template <class _Other> 373172d0d603SErik Pilkington struct rebind 373272d0d603SErik Pilkington { 373372d0d603SErik Pilkington typedef allocator<_Other> other; 373472d0d603SErik Pilkington }; 373572d0d603SErik Pilkington}; 373672d0d603SErik Pilkington 3737e2f2d1edSEric Fiseliertemplate<class _Tp> class _LIBCPP_TEMPLATE_VIS enable_shared_from_this; 37383e519524SHoward Hinnant 37393e519524SHoward Hinnanttemplate<class _Tp> 3740e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS shared_ptr 37413e519524SHoward Hinnant{ 37423e519524SHoward Hinnantpublic: 37433e519524SHoward Hinnant typedef _Tp element_type; 3744dc83e779SMarshall Clow 374568436a9bSEric Fiselier#if _LIBCPP_STD_VER > 14 374668436a9bSEric Fiselier typedef weak_ptr<_Tp> weak_type; 374768436a9bSEric Fiselier#endif 37483e519524SHoward Hinnantprivate: 37493e519524SHoward Hinnant element_type* __ptr_; 37503e519524SHoward Hinnant __shared_weak_count* __cntrl_; 37513e519524SHoward Hinnant 37523e519524SHoward Hinnant struct __nat {int __for_bool_;}; 37533e519524SHoward Hinnantpublic: 3754906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 3755c0937e8aSHoward Hinnant _LIBCPP_CONSTEXPR shared_ptr() _NOEXCEPT; 3756906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 3757c0937e8aSHoward Hinnant _LIBCPP_CONSTEXPR shared_ptr(nullptr_t) _NOEXCEPT; 375822747e62SLogan Chien template<class _Yp> 375922747e62SLogan Chien explicit shared_ptr(_Yp* __p, 376022747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat()); 376122747e62SLogan Chien template<class _Yp, class _Dp> 376222747e62SLogan Chien shared_ptr(_Yp* __p, _Dp __d, 376322747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat()); 376422747e62SLogan Chien template<class _Yp, class _Dp, class _Alloc> 376522747e62SLogan Chien shared_ptr(_Yp* __p, _Dp __d, _Alloc __a, 376622747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat()); 37673e519524SHoward Hinnant template <class _Dp> shared_ptr(nullptr_t __p, _Dp __d); 37683e519524SHoward Hinnant template <class _Dp, class _Alloc> shared_ptr(nullptr_t __p, _Dp __d, _Alloc __a); 3769906c872dSEvgeniy Stepanov template<class _Yp> _LIBCPP_INLINE_VISIBILITY shared_ptr(const shared_ptr<_Yp>& __r, element_type* __p) _NOEXCEPT; 3770906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 37713739fe79SHoward Hinnant shared_ptr(const shared_ptr& __r) _NOEXCEPT; 37723e519524SHoward Hinnant template<class _Yp> 3773906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 37743e519524SHoward Hinnant shared_ptr(const shared_ptr<_Yp>& __r, 3775dc83e779SMarshall Clow typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat()) 37763739fe79SHoward Hinnant _NOEXCEPT; 37777609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 3778906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 37793739fe79SHoward Hinnant shared_ptr(shared_ptr&& __r) _NOEXCEPT; 3780906c872dSEvgeniy Stepanov template<class _Yp> _LIBCPP_INLINE_VISIBILITY shared_ptr(shared_ptr<_Yp>&& __r, 3781dc83e779SMarshall Clow typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat()) 37823739fe79SHoward Hinnant _NOEXCEPT; 37837609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 37843e519524SHoward Hinnant template<class _Yp> explicit shared_ptr(const weak_ptr<_Yp>& __r, 3785dc83e779SMarshall Clow typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type= __nat()); 3786e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR) 37877609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 378822747e62SLogan Chien template<class _Yp> 378922747e62SLogan Chien shared_ptr(auto_ptr<_Yp>&& __r, 379022747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat()); 3791b3371f6fSHoward Hinnant#else 379222747e62SLogan Chien template<class _Yp> 379322747e62SLogan Chien shared_ptr(auto_ptr<_Yp> __r, 379422747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat()); 37953e519524SHoward Hinnant#endif 3796e67179bcSMarshall Clow#endif 37977609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 379822747e62SLogan Chien template <class _Yp, class _Dp> 37998e25104bSHoward Hinnant shared_ptr(unique_ptr<_Yp, _Dp>&&, 380022747e62SLogan Chien typename enable_if 38018e25104bSHoward Hinnant < 380222747e62SLogan Chien !is_lvalue_reference<_Dp>::value && 38038e25104bSHoward Hinnant !is_array<_Yp>::value && 380422747e62SLogan Chien is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 380522747e62SLogan Chien __nat 380622747e62SLogan Chien >::type = __nat()); 380722747e62SLogan Chien template <class _Yp, class _Dp> 38088e25104bSHoward Hinnant shared_ptr(unique_ptr<_Yp, _Dp>&&, 380922747e62SLogan Chien typename enable_if 381022747e62SLogan Chien < 381122747e62SLogan Chien is_lvalue_reference<_Dp>::value && 381222747e62SLogan Chien !is_array<_Yp>::value && 381322747e62SLogan Chien is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 381422747e62SLogan Chien __nat 381522747e62SLogan Chien >::type = __nat()); 38167609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 381722747e62SLogan Chien template <class _Yp, class _Dp> 38188e25104bSHoward Hinnant shared_ptr(unique_ptr<_Yp, _Dp>, 381922747e62SLogan Chien typename enable_if 382022747e62SLogan Chien < 382122747e62SLogan Chien !is_lvalue_reference<_Dp>::value && 382222747e62SLogan Chien !is_array<_Yp>::value && 382322747e62SLogan Chien is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 382422747e62SLogan Chien __nat 382522747e62SLogan Chien >::type = __nat()); 382622747e62SLogan Chien template <class _Yp, class _Dp> 382722747e62SLogan Chien shared_ptr(unique_ptr<_Yp, _Dp>, 382822747e62SLogan Chien typename enable_if 382922747e62SLogan Chien < 383022747e62SLogan Chien is_lvalue_reference<_Dp>::value && 383122747e62SLogan Chien !is_array<_Yp>::value && 383222747e62SLogan Chien is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 383322747e62SLogan Chien __nat 383422747e62SLogan Chien >::type = __nat()); 38357609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 38363e519524SHoward Hinnant 38373e519524SHoward Hinnant ~shared_ptr(); 38383e519524SHoward Hinnant 3839906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 38403739fe79SHoward Hinnant shared_ptr& operator=(const shared_ptr& __r) _NOEXCEPT; 38418e25104bSHoward Hinnant template<class _Yp> 38428e25104bSHoward Hinnant typename enable_if 38438e25104bSHoward Hinnant < 38448e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 38458e25104bSHoward Hinnant shared_ptr& 38468e25104bSHoward Hinnant >::type 3847906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 38488e25104bSHoward Hinnant operator=(const shared_ptr<_Yp>& __r) _NOEXCEPT; 38497609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 3850906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 38513739fe79SHoward Hinnant shared_ptr& operator=(shared_ptr&& __r) _NOEXCEPT; 38528e25104bSHoward Hinnant template<class _Yp> 38538e25104bSHoward Hinnant typename enable_if 38548e25104bSHoward Hinnant < 38558e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 38568e25104bSHoward Hinnant shared_ptr<_Tp>& 38578e25104bSHoward Hinnant >::type 3858906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 38598e25104bSHoward Hinnant operator=(shared_ptr<_Yp>&& __r); 3860e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR) 38618e25104bSHoward Hinnant template<class _Yp> 386289dd1dd2SEric Fiselier _LIBCPP_INLINE_VISIBILITY 38638e25104bSHoward Hinnant typename enable_if 38648e25104bSHoward Hinnant < 38658e25104bSHoward Hinnant !is_array<_Yp>::value && 38668e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 386784f996fbSHoward Hinnant shared_ptr 386884f996fbSHoward Hinnant >::type& 38698e25104bSHoward Hinnant operator=(auto_ptr<_Yp>&& __r); 3870e67179bcSMarshall Clow#endif 38717609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 3872e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR) 38738e25104bSHoward Hinnant template<class _Yp> 387489dd1dd2SEric Fiselier _LIBCPP_INLINE_VISIBILITY 38758e25104bSHoward Hinnant typename enable_if 38768e25104bSHoward Hinnant < 38778e25104bSHoward Hinnant !is_array<_Yp>::value && 38788e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 38798e25104bSHoward Hinnant shared_ptr& 38808e25104bSHoward Hinnant >::type 38818e25104bSHoward Hinnant operator=(auto_ptr<_Yp> __r); 38823e519524SHoward Hinnant#endif 3883e67179bcSMarshall Clow#endif 38848e25104bSHoward Hinnant template <class _Yp, class _Dp> 38858e25104bSHoward Hinnant typename enable_if 38868e25104bSHoward Hinnant < 38878e25104bSHoward Hinnant !is_array<_Yp>::value && 38888e25104bSHoward Hinnant is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 38898e25104bSHoward Hinnant shared_ptr& 38908e25104bSHoward Hinnant >::type 38917609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 3892906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 38938e25104bSHoward Hinnant operator=(unique_ptr<_Yp, _Dp>&& __r); 38947609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 389502b8e949SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 38968e25104bSHoward Hinnant operator=(unique_ptr<_Yp, _Dp> __r); 38973e519524SHoward Hinnant#endif 38983e519524SHoward Hinnant 3899906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 39003739fe79SHoward Hinnant void swap(shared_ptr& __r) _NOEXCEPT; 3901906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 39023739fe79SHoward Hinnant void reset() _NOEXCEPT; 39038e25104bSHoward Hinnant template<class _Yp> 39048e25104bSHoward Hinnant typename enable_if 39058e25104bSHoward Hinnant < 39068e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 39078e25104bSHoward Hinnant void 39088e25104bSHoward Hinnant >::type 3909906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 39108e25104bSHoward Hinnant reset(_Yp* __p); 39118e25104bSHoward Hinnant template<class _Yp, class _Dp> 39128e25104bSHoward Hinnant typename enable_if 39138e25104bSHoward Hinnant < 39148e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 39158e25104bSHoward Hinnant void 39168e25104bSHoward Hinnant >::type 3917906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 39188e25104bSHoward Hinnant reset(_Yp* __p, _Dp __d); 39198e25104bSHoward Hinnant template<class _Yp, class _Dp, class _Alloc> 39208e25104bSHoward Hinnant typename enable_if 39218e25104bSHoward Hinnant < 39228e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 39238e25104bSHoward Hinnant void 39248e25104bSHoward Hinnant >::type 3925906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 39268e25104bSHoward Hinnant reset(_Yp* __p, _Dp __d, _Alloc __a); 39273e519524SHoward Hinnant 3928848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 39293739fe79SHoward Hinnant element_type* get() const _NOEXCEPT {return __ptr_;} 3930848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 39313739fe79SHoward Hinnant typename add_lvalue_reference<element_type>::type operator*() const _NOEXCEPT 39323739fe79SHoward Hinnant {return *__ptr_;} 3933848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 39343739fe79SHoward Hinnant element_type* operator->() const _NOEXCEPT {return __ptr_;} 3935848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 39363739fe79SHoward Hinnant long use_count() const _NOEXCEPT {return __cntrl_ ? __cntrl_->use_count() : 0;} 3937848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 39383739fe79SHoward Hinnant bool unique() const _NOEXCEPT {return use_count() == 1;} 3939848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 3940f2f2d8b9SHoward Hinnant _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT {return get() != 0;} 3941c003db1fSHoward Hinnant template <class _Up> 3942848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 394336bc7178SMarshall Clow bool owner_before(shared_ptr<_Up> const& __p) const _NOEXCEPT 39443e519524SHoward Hinnant {return __cntrl_ < __p.__cntrl_;} 3945c003db1fSHoward Hinnant template <class _Up> 3946848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 394736bc7178SMarshall Clow bool owner_before(weak_ptr<_Up> const& __p) const _NOEXCEPT 39483e519524SHoward Hinnant {return __cntrl_ < __p.__cntrl_;} 3949d77851e8SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 3950d77851e8SHoward Hinnant bool 3951d77851e8SHoward Hinnant __owner_equivalent(const shared_ptr& __p) const 3952d77851e8SHoward Hinnant {return __cntrl_ == __p.__cntrl_;} 39533e519524SHoward Hinnant 395454b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI 39553e519524SHoward Hinnant template <class _Dp> 3956848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 39573739fe79SHoward Hinnant _Dp* __get_deleter() const _NOEXCEPT 39584a911c86SMarshall Clow {return static_cast<_Dp*>(__cntrl_ 39594a911c86SMarshall Clow ? const_cast<void *>(__cntrl_->__get_deleter(typeid(_Dp))) 39604a911c86SMarshall Clow : nullptr);} 3961b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_RTTI 39623e519524SHoward Hinnant 39633e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 39643e519524SHoward Hinnant 39653e519524SHoward Hinnant template<class ..._Args> 39663e519524SHoward Hinnant static 39673e519524SHoward Hinnant shared_ptr<_Tp> 39683e519524SHoward Hinnant make_shared(_Args&& ...__args); 39693e519524SHoward Hinnant 39703e519524SHoward Hinnant template<class _Alloc, class ..._Args> 39713e519524SHoward Hinnant static 39723e519524SHoward Hinnant shared_ptr<_Tp> 39733e519524SHoward Hinnant allocate_shared(const _Alloc& __a, _Args&& ...__args); 39743e519524SHoward Hinnant 39753e519524SHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 39763e519524SHoward Hinnant 39773e519524SHoward Hinnant static shared_ptr<_Tp> make_shared(); 39783e519524SHoward Hinnant 39793e519524SHoward Hinnant template<class _A0> 39803e519524SHoward Hinnant static shared_ptr<_Tp> make_shared(_A0&); 39813e519524SHoward Hinnant 39823e519524SHoward Hinnant template<class _A0, class _A1> 39833e519524SHoward Hinnant static shared_ptr<_Tp> make_shared(_A0&, _A1&); 39843e519524SHoward Hinnant 39853e519524SHoward Hinnant template<class _A0, class _A1, class _A2> 39863e519524SHoward Hinnant static shared_ptr<_Tp> make_shared(_A0&, _A1&, _A2&); 39873e519524SHoward Hinnant 39883e519524SHoward Hinnant template<class _Alloc> 39893e519524SHoward Hinnant static shared_ptr<_Tp> 39903e519524SHoward Hinnant allocate_shared(const _Alloc& __a); 39913e519524SHoward Hinnant 39923e519524SHoward Hinnant template<class _Alloc, class _A0> 39933e519524SHoward Hinnant static shared_ptr<_Tp> 39943e519524SHoward Hinnant allocate_shared(const _Alloc& __a, _A0& __a0); 39953e519524SHoward Hinnant 39963e519524SHoward Hinnant template<class _Alloc, class _A0, class _A1> 39973e519524SHoward Hinnant static shared_ptr<_Tp> 39983e519524SHoward Hinnant allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1); 39993e519524SHoward Hinnant 40003e519524SHoward Hinnant template<class _Alloc, class _A0, class _A1, class _A2> 40013e519524SHoward Hinnant static shared_ptr<_Tp> 40023e519524SHoward Hinnant allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1, _A2& __a2); 40033e519524SHoward Hinnant 40043e519524SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 40053e519524SHoward Hinnant 40063e519524SHoward Hinnantprivate: 400772d0d603SErik Pilkington template <class _Yp, bool = is_function<_Yp>::value> 400872d0d603SErik Pilkington struct __shared_ptr_default_allocator 400972d0d603SErik Pilkington { 401072d0d603SErik Pilkington typedef allocator<_Yp> type; 401172d0d603SErik Pilkington }; 401272d0d603SErik Pilkington 401372d0d603SErik Pilkington template <class _Yp> 401472d0d603SErik Pilkington struct __shared_ptr_default_allocator<_Yp, true> 401572d0d603SErik Pilkington { 401672d0d603SErik Pilkington typedef allocator<__shared_ptr_dummy_rebind_allocator_type> type; 401772d0d603SErik Pilkington }; 40183e519524SHoward Hinnant 401939005d30SEric Fiselier template <class _Yp, class _OrigPtr> 4020848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4021f09df772SEric Fiselier typename enable_if<is_convertible<_OrigPtr*, 4022f09df772SEric Fiselier const enable_shared_from_this<_Yp>* 4023f09df772SEric Fiselier >::value, 4024f09df772SEric Fiselier void>::type 402539005d30SEric Fiselier __enable_weak_this(const enable_shared_from_this<_Yp>* __e, 402639005d30SEric Fiselier _OrigPtr* __ptr) _NOEXCEPT 40273e519524SHoward Hinnant { 402839005d30SEric Fiselier typedef typename remove_cv<_Yp>::type _RawYp; 402988f5bfdcSEric Fiselier if (__e && __e->__weak_this_.expired()) 403055112defSMarshall Clow { 403139005d30SEric Fiselier __e->__weak_this_ = shared_ptr<_RawYp>(*this, 403239005d30SEric Fiselier const_cast<_RawYp*>(static_cast<const _Yp*>(__ptr))); 403355112defSMarshall Clow } 40343e519524SHoward Hinnant } 40353e519524SHoward Hinnant 403672d0d603SErik Pilkington _LIBCPP_INLINE_VISIBILITY void __enable_weak_this(...) _NOEXCEPT {} 40373e519524SHoward Hinnant 4038e2f2d1edSEric Fiselier template <class _Up> friend class _LIBCPP_TEMPLATE_VIS shared_ptr; 4039e2f2d1edSEric Fiselier template <class _Up> friend class _LIBCPP_TEMPLATE_VIS weak_ptr; 40403e519524SHoward Hinnant}; 40413e519524SHoward Hinnant 4042f09df772SEric Fiselier 40433e519524SHoward Hinnanttemplate<class _Tp> 4044906c872dSEvgeniy Stepanovinline 4045c0937e8aSHoward Hinnant_LIBCPP_CONSTEXPR 40463739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr() _NOEXCEPT 40473e519524SHoward Hinnant : __ptr_(0), 40483e519524SHoward Hinnant __cntrl_(0) 40493e519524SHoward Hinnant{ 40503e519524SHoward Hinnant} 40513e519524SHoward Hinnant 40523e519524SHoward Hinnanttemplate<class _Tp> 4053906c872dSEvgeniy Stepanovinline 4054c0937e8aSHoward Hinnant_LIBCPP_CONSTEXPR 40553739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr(nullptr_t) _NOEXCEPT 40563e519524SHoward Hinnant : __ptr_(0), 40573e519524SHoward Hinnant __cntrl_(0) 40583e519524SHoward Hinnant{ 40593e519524SHoward Hinnant} 40603e519524SHoward Hinnant 40613e519524SHoward Hinnanttemplate<class _Tp> 406222747e62SLogan Chientemplate<class _Yp> 406322747e62SLogan Chienshared_ptr<_Tp>::shared_ptr(_Yp* __p, 406422747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type) 40653e519524SHoward Hinnant : __ptr_(__p) 40663e519524SHoward Hinnant{ 40673e519524SHoward Hinnant unique_ptr<_Yp> __hold(__p); 406872d0d603SErik Pilkington typedef typename __shared_ptr_default_allocator<_Yp>::type _AllocT; 406972d0d603SErik Pilkington typedef __shared_ptr_pointer<_Yp*, default_delete<_Yp>, _AllocT > _CntrlBlk; 407072d0d603SErik Pilkington __cntrl_ = new _CntrlBlk(__p, default_delete<_Yp>(), _AllocT()); 40713e519524SHoward Hinnant __hold.release(); 407239005d30SEric Fiselier __enable_weak_this(__p, __p); 40733e519524SHoward Hinnant} 40743e519524SHoward Hinnant 40753e519524SHoward Hinnanttemplate<class _Tp> 407622747e62SLogan Chientemplate<class _Yp, class _Dp> 407722747e62SLogan Chienshared_ptr<_Tp>::shared_ptr(_Yp* __p, _Dp __d, 407822747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type) 40793e519524SHoward Hinnant : __ptr_(__p) 40803e519524SHoward Hinnant{ 40813e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 40823e519524SHoward Hinnant try 40833e519524SHoward Hinnant { 4084b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 408572d0d603SErik Pilkington typedef typename __shared_ptr_default_allocator<_Yp>::type _AllocT; 408672d0d603SErik Pilkington typedef __shared_ptr_pointer<_Yp*, _Dp, _AllocT > _CntrlBlk; 408772d0d603SErik Pilkington __cntrl_ = new _CntrlBlk(__p, __d, _AllocT()); 408839005d30SEric Fiselier __enable_weak_this(__p, __p); 40893e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 40903e519524SHoward Hinnant } 40913e519524SHoward Hinnant catch (...) 40923e519524SHoward Hinnant { 40933e519524SHoward Hinnant __d(__p); 40943e519524SHoward Hinnant throw; 40953e519524SHoward Hinnant } 4096b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 40973e519524SHoward Hinnant} 40983e519524SHoward Hinnant 40993e519524SHoward Hinnanttemplate<class _Tp> 41003e519524SHoward Hinnanttemplate<class _Dp> 41013e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(nullptr_t __p, _Dp __d) 41023e519524SHoward Hinnant : __ptr_(0) 41033e519524SHoward Hinnant{ 41043e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 41053e519524SHoward Hinnant try 41063e519524SHoward Hinnant { 4107b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 410872d0d603SErik Pilkington typedef typename __shared_ptr_default_allocator<_Tp>::type _AllocT; 410972d0d603SErik Pilkington typedef __shared_ptr_pointer<nullptr_t, _Dp, _AllocT > _CntrlBlk; 411072d0d603SErik Pilkington __cntrl_ = new _CntrlBlk(__p, __d, _AllocT()); 41113e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 41123e519524SHoward Hinnant } 41133e519524SHoward Hinnant catch (...) 41143e519524SHoward Hinnant { 41153e519524SHoward Hinnant __d(__p); 41163e519524SHoward Hinnant throw; 41173e519524SHoward Hinnant } 4118b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 41193e519524SHoward Hinnant} 41203e519524SHoward Hinnant 41213e519524SHoward Hinnanttemplate<class _Tp> 412222747e62SLogan Chientemplate<class _Yp, class _Dp, class _Alloc> 412322747e62SLogan Chienshared_ptr<_Tp>::shared_ptr(_Yp* __p, _Dp __d, _Alloc __a, 412422747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type) 41253e519524SHoward Hinnant : __ptr_(__p) 41263e519524SHoward Hinnant{ 41273e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 41283e519524SHoward Hinnant try 41293e519524SHoward Hinnant { 4130b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 41313e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, _Dp, _Alloc> _CntrlBlk; 4132319be722SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _A2; 41333e519524SHoward Hinnant typedef __allocator_destructor<_A2> _D2; 41343e519524SHoward Hinnant _A2 __a2(__a); 41353e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); 4136319be722SEric Fiselier ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4137319be722SEric Fiselier _CntrlBlk(__p, __d, __a); 4138319be722SEric Fiselier __cntrl_ = _VSTD::addressof(*__hold2.release()); 413939005d30SEric Fiselier __enable_weak_this(__p, __p); 41403e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 41413e519524SHoward Hinnant } 41423e519524SHoward Hinnant catch (...) 41433e519524SHoward Hinnant { 41443e519524SHoward Hinnant __d(__p); 41453e519524SHoward Hinnant throw; 41463e519524SHoward Hinnant } 4147b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 41483e519524SHoward Hinnant} 41493e519524SHoward Hinnant 41503e519524SHoward Hinnanttemplate<class _Tp> 41513e519524SHoward Hinnanttemplate<class _Dp, class _Alloc> 41523e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(nullptr_t __p, _Dp __d, _Alloc __a) 41533e519524SHoward Hinnant : __ptr_(0) 41543e519524SHoward Hinnant{ 41553e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 41563e519524SHoward Hinnant try 41573e519524SHoward Hinnant { 4158b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 41593e519524SHoward Hinnant typedef __shared_ptr_pointer<nullptr_t, _Dp, _Alloc> _CntrlBlk; 4160319be722SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _A2; 41613e519524SHoward Hinnant typedef __allocator_destructor<_A2> _D2; 41623e519524SHoward Hinnant _A2 __a2(__a); 41633e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); 4164319be722SEric Fiselier ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4165319be722SEric Fiselier _CntrlBlk(__p, __d, __a); 4166319be722SEric Fiselier __cntrl_ = _VSTD::addressof(*__hold2.release()); 41673e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 41683e519524SHoward Hinnant } 41693e519524SHoward Hinnant catch (...) 41703e519524SHoward Hinnant { 41713e519524SHoward Hinnant __d(__p); 41723e519524SHoward Hinnant throw; 41733e519524SHoward Hinnant } 4174b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 41753e519524SHoward Hinnant} 41763e519524SHoward Hinnant 41773e519524SHoward Hinnanttemplate<class _Tp> 41783e519524SHoward Hinnanttemplate<class _Yp> 4179906c872dSEvgeniy Stepanovinline 41803739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr(const shared_ptr<_Yp>& __r, element_type *__p) _NOEXCEPT 41813e519524SHoward Hinnant : __ptr_(__p), 41823e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 41833e519524SHoward Hinnant{ 41843e519524SHoward Hinnant if (__cntrl_) 41853e519524SHoward Hinnant __cntrl_->__add_shared(); 41863e519524SHoward Hinnant} 41873e519524SHoward Hinnant 41883e519524SHoward Hinnanttemplate<class _Tp> 4189906c872dSEvgeniy Stepanovinline 41903739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr(const shared_ptr& __r) _NOEXCEPT 41913e519524SHoward Hinnant : __ptr_(__r.__ptr_), 41923e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 41933e519524SHoward Hinnant{ 41943e519524SHoward Hinnant if (__cntrl_) 41953e519524SHoward Hinnant __cntrl_->__add_shared(); 41963e519524SHoward Hinnant} 41973e519524SHoward Hinnant 41983e519524SHoward Hinnanttemplate<class _Tp> 41993e519524SHoward Hinnanttemplate<class _Yp> 4200906c872dSEvgeniy Stepanovinline 42013e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(const shared_ptr<_Yp>& __r, 4202dc83e779SMarshall Clow typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type) 42033739fe79SHoward Hinnant _NOEXCEPT 42043e519524SHoward Hinnant : __ptr_(__r.__ptr_), 42053e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 42063e519524SHoward Hinnant{ 42073e519524SHoward Hinnant if (__cntrl_) 42083e519524SHoward Hinnant __cntrl_->__add_shared(); 42093e519524SHoward Hinnant} 42103e519524SHoward Hinnant 42117609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 42123e519524SHoward Hinnant 42133e519524SHoward Hinnanttemplate<class _Tp> 4214906c872dSEvgeniy Stepanovinline 42153739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr(shared_ptr&& __r) _NOEXCEPT 42163e519524SHoward Hinnant : __ptr_(__r.__ptr_), 42173e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 42183e519524SHoward Hinnant{ 42193e519524SHoward Hinnant __r.__ptr_ = 0; 42203e519524SHoward Hinnant __r.__cntrl_ = 0; 42213e519524SHoward Hinnant} 42223e519524SHoward Hinnant 42233e519524SHoward Hinnanttemplate<class _Tp> 42243e519524SHoward Hinnanttemplate<class _Yp> 4225906c872dSEvgeniy Stepanovinline 42263e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(shared_ptr<_Yp>&& __r, 4227dc83e779SMarshall Clow typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type) 42283739fe79SHoward Hinnant _NOEXCEPT 42293e519524SHoward Hinnant : __ptr_(__r.__ptr_), 42303e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 42313e519524SHoward Hinnant{ 42323e519524SHoward Hinnant __r.__ptr_ = 0; 42333e519524SHoward Hinnant __r.__cntrl_ = 0; 42343e519524SHoward Hinnant} 42353e519524SHoward Hinnant 42367609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 42373e519524SHoward Hinnant 4238e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR) 42393e519524SHoward Hinnanttemplate<class _Tp> 424022747e62SLogan Chientemplate<class _Yp> 42417609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 424222747e62SLogan Chienshared_ptr<_Tp>::shared_ptr(auto_ptr<_Yp>&& __r, 42433e519524SHoward Hinnant#else 424422747e62SLogan Chienshared_ptr<_Tp>::shared_ptr(auto_ptr<_Yp> __r, 42453e519524SHoward Hinnant#endif 424622747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type) 42473e519524SHoward Hinnant : __ptr_(__r.get()) 42483e519524SHoward Hinnant{ 42493e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, default_delete<_Yp>, allocator<_Yp> > _CntrlBlk; 42503e519524SHoward Hinnant __cntrl_ = new _CntrlBlk(__r.get(), default_delete<_Yp>(), allocator<_Yp>()); 425139005d30SEric Fiselier __enable_weak_this(__r.get(), __r.get()); 42523e519524SHoward Hinnant __r.release(); 42533e519524SHoward Hinnant} 4254e67179bcSMarshall Clow#endif 42553e519524SHoward Hinnant 42563e519524SHoward Hinnanttemplate<class _Tp> 425722747e62SLogan Chientemplate <class _Yp, class _Dp> 42587609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 42593e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp>&& __r, 42603e519524SHoward Hinnant#else 42613e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp> __r, 42623e519524SHoward Hinnant#endif 426322747e62SLogan Chien typename enable_if 426422747e62SLogan Chien < 426522747e62SLogan Chien !is_lvalue_reference<_Dp>::value && 426622747e62SLogan Chien !is_array<_Yp>::value && 426722747e62SLogan Chien is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 426822747e62SLogan Chien __nat 426922747e62SLogan Chien >::type) 42703e519524SHoward Hinnant : __ptr_(__r.get()) 42713e519524SHoward Hinnant{ 4272c34f847bSMarshall Clow#if _LIBCPP_STD_VER > 11 4273c34f847bSMarshall Clow if (__ptr_ == nullptr) 4274c34f847bSMarshall Clow __cntrl_ = nullptr; 4275c34f847bSMarshall Clow else 4276c34f847bSMarshall Clow#endif 4277c34f847bSMarshall Clow { 427872d0d603SErik Pilkington typedef typename __shared_ptr_default_allocator<_Yp>::type _AllocT; 427972d0d603SErik Pilkington typedef __shared_ptr_pointer<_Yp*, _Dp, _AllocT > _CntrlBlk; 428072d0d603SErik Pilkington __cntrl_ = new _CntrlBlk(__r.get(), __r.get_deleter(), _AllocT()); 428139005d30SEric Fiselier __enable_weak_this(__r.get(), __r.get()); 4282c34f847bSMarshall Clow } 42833e519524SHoward Hinnant __r.release(); 42843e519524SHoward Hinnant} 42853e519524SHoward Hinnant 42863e519524SHoward Hinnanttemplate<class _Tp> 428722747e62SLogan Chientemplate <class _Yp, class _Dp> 42887609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 42893e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp>&& __r, 42903e519524SHoward Hinnant#else 42913e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp> __r, 42923e519524SHoward Hinnant#endif 429322747e62SLogan Chien typename enable_if 429422747e62SLogan Chien < 429522747e62SLogan Chien is_lvalue_reference<_Dp>::value && 429622747e62SLogan Chien !is_array<_Yp>::value && 429722747e62SLogan Chien is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 429822747e62SLogan Chien __nat 429922747e62SLogan Chien >::type) 43003e519524SHoward Hinnant : __ptr_(__r.get()) 43013e519524SHoward Hinnant{ 4302c34f847bSMarshall Clow#if _LIBCPP_STD_VER > 11 4303c34f847bSMarshall Clow if (__ptr_ == nullptr) 4304c34f847bSMarshall Clow __cntrl_ = nullptr; 4305c34f847bSMarshall Clow else 4306c34f847bSMarshall Clow#endif 4307c34f847bSMarshall Clow { 430872d0d603SErik Pilkington typedef typename __shared_ptr_default_allocator<_Yp>::type _AllocT; 43093e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, 43103e519524SHoward Hinnant reference_wrapper<typename remove_reference<_Dp>::type>, 431172d0d603SErik Pilkington _AllocT > _CntrlBlk; 431272d0d603SErik Pilkington __cntrl_ = new _CntrlBlk(__r.get(), ref(__r.get_deleter()), _AllocT()); 431339005d30SEric Fiselier __enable_weak_this(__r.get(), __r.get()); 4314c34f847bSMarshall Clow } 43153e519524SHoward Hinnant __r.release(); 43163e519524SHoward Hinnant} 43173e519524SHoward Hinnant 43183e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 43193e519524SHoward Hinnant 43203e519524SHoward Hinnanttemplate<class _Tp> 43213e519524SHoward Hinnanttemplate<class ..._Args> 43223e519524SHoward Hinnantshared_ptr<_Tp> 43233e519524SHoward Hinnantshared_ptr<_Tp>::make_shared(_Args&& ...__args) 43243e519524SHoward Hinnant{ 432577009129SMarshall Clow static_assert( is_constructible<_Tp, _Args...>::value, "Can't construct object in make_shared" ); 43263e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 43273e519524SHoward Hinnant typedef allocator<_CntrlBlk> _A2; 43283e519524SHoward Hinnant typedef __allocator_destructor<_A2> _D2; 43293e519524SHoward Hinnant _A2 __a2; 43303e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); 4331ce48a113SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__a2, _VSTD::forward<_Args>(__args)...); 43323e519524SHoward Hinnant shared_ptr<_Tp> __r; 43333e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 43343e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 433539005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 43363e519524SHoward Hinnant return __r; 43373e519524SHoward Hinnant} 43383e519524SHoward Hinnant 43393e519524SHoward Hinnanttemplate<class _Tp> 43403e519524SHoward Hinnanttemplate<class _Alloc, class ..._Args> 43413e519524SHoward Hinnantshared_ptr<_Tp> 43423e519524SHoward Hinnantshared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _Args&& ...__args) 43433e519524SHoward Hinnant{ 434477009129SMarshall Clow static_assert( is_constructible<_Tp, _Args...>::value, "Can't construct object in allocate_shared" ); 43453e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 4346319be722SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _A2; 43473e519524SHoward Hinnant typedef __allocator_destructor<_A2> _D2; 43483e519524SHoward Hinnant _A2 __a2(__a); 43493e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); 4350319be722SEric Fiselier ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4351319be722SEric Fiselier _CntrlBlk(__a, _VSTD::forward<_Args>(__args)...); 43523e519524SHoward Hinnant shared_ptr<_Tp> __r; 43533e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 4354319be722SEric Fiselier __r.__cntrl_ = _VSTD::addressof(*__hold2.release()); 435539005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 43563e519524SHoward Hinnant return __r; 43573e519524SHoward Hinnant} 43583e519524SHoward Hinnant 43593e519524SHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 43603e519524SHoward Hinnant 43613e519524SHoward Hinnanttemplate<class _Tp> 43623e519524SHoward Hinnantshared_ptr<_Tp> 43633e519524SHoward Hinnantshared_ptr<_Tp>::make_shared() 43643e519524SHoward Hinnant{ 436577009129SMarshall Clow static_assert((is_constructible<_Tp>::value), "Can't construct object in make_shared" ); 43663e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 43673e519524SHoward Hinnant typedef allocator<_CntrlBlk> _Alloc2; 43683e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 43693e519524SHoward Hinnant _Alloc2 __alloc2; 43703e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 43713e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__alloc2); 43723e519524SHoward Hinnant shared_ptr<_Tp> __r; 43733e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 43743e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 437539005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 43763e519524SHoward Hinnant return __r; 43773e519524SHoward Hinnant} 43783e519524SHoward Hinnant 43793e519524SHoward Hinnanttemplate<class _Tp> 43803e519524SHoward Hinnanttemplate<class _A0> 43813e519524SHoward Hinnantshared_ptr<_Tp> 43823e519524SHoward Hinnantshared_ptr<_Tp>::make_shared(_A0& __a0) 43833e519524SHoward Hinnant{ 438477009129SMarshall Clow static_assert((is_constructible<_Tp, _A0>::value), "Can't construct object in make_shared" ); 43853e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 43863e519524SHoward Hinnant typedef allocator<_CntrlBlk> _Alloc2; 43873e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 43883e519524SHoward Hinnant _Alloc2 __alloc2; 43893e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 43903e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__alloc2, __a0); 43913e519524SHoward Hinnant shared_ptr<_Tp> __r; 43923e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 43933e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 439439005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 43953e519524SHoward Hinnant return __r; 43963e519524SHoward Hinnant} 43973e519524SHoward Hinnant 43983e519524SHoward Hinnanttemplate<class _Tp> 43993e519524SHoward Hinnanttemplate<class _A0, class _A1> 44003e519524SHoward Hinnantshared_ptr<_Tp> 44013e519524SHoward Hinnantshared_ptr<_Tp>::make_shared(_A0& __a0, _A1& __a1) 44023e519524SHoward Hinnant{ 440377009129SMarshall Clow static_assert((is_constructible<_Tp, _A0, _A1>::value), "Can't construct object in make_shared" ); 44043e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 44053e519524SHoward Hinnant typedef allocator<_CntrlBlk> _Alloc2; 44063e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 44073e519524SHoward Hinnant _Alloc2 __alloc2; 44083e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 44093e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__alloc2, __a0, __a1); 44103e519524SHoward Hinnant shared_ptr<_Tp> __r; 44113e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 44123e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 441339005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 44143e519524SHoward Hinnant return __r; 44153e519524SHoward Hinnant} 44163e519524SHoward Hinnant 44173e519524SHoward Hinnanttemplate<class _Tp> 44183e519524SHoward Hinnanttemplate<class _A0, class _A1, class _A2> 44193e519524SHoward Hinnantshared_ptr<_Tp> 44203e519524SHoward Hinnantshared_ptr<_Tp>::make_shared(_A0& __a0, _A1& __a1, _A2& __a2) 44213e519524SHoward Hinnant{ 442277009129SMarshall Clow static_assert((is_constructible<_Tp, _A0, _A1, _A2>::value), "Can't construct object in make_shared" ); 44233e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 44243e519524SHoward Hinnant typedef allocator<_CntrlBlk> _Alloc2; 44253e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 44263e519524SHoward Hinnant _Alloc2 __alloc2; 44273e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 44283e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__alloc2, __a0, __a1, __a2); 44293e519524SHoward Hinnant shared_ptr<_Tp> __r; 44303e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 44313e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 443239005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 44333e519524SHoward Hinnant return __r; 44343e519524SHoward Hinnant} 44353e519524SHoward Hinnant 44363e519524SHoward Hinnanttemplate<class _Tp> 44373e519524SHoward Hinnanttemplate<class _Alloc> 44383e519524SHoward Hinnantshared_ptr<_Tp> 44393e519524SHoward Hinnantshared_ptr<_Tp>::allocate_shared(const _Alloc& __a) 44403e519524SHoward Hinnant{ 444177009129SMarshall Clow static_assert((is_constructible<_Tp>::value), "Can't construct object in allocate_shared" ); 44423e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 4443319be722SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _Alloc2; 44443e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 44453e519524SHoward Hinnant _Alloc2 __alloc2(__a); 44463e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 4447319be722SEric Fiselier ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4448319be722SEric Fiselier _CntrlBlk(__a); 44493e519524SHoward Hinnant shared_ptr<_Tp> __r; 44503e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 4451319be722SEric Fiselier __r.__cntrl_ = _VSTD::addressof(*__hold2.release()); 445239005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 44533e519524SHoward Hinnant return __r; 44543e519524SHoward Hinnant} 44553e519524SHoward Hinnant 44563e519524SHoward Hinnanttemplate<class _Tp> 44573e519524SHoward Hinnanttemplate<class _Alloc, class _A0> 44583e519524SHoward Hinnantshared_ptr<_Tp> 44593e519524SHoward Hinnantshared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _A0& __a0) 44603e519524SHoward Hinnant{ 446177009129SMarshall Clow static_assert((is_constructible<_Tp, _A0>::value), "Can't construct object in allocate_shared" ); 44623e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 4463319be722SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _Alloc2; 44643e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 44653e519524SHoward Hinnant _Alloc2 __alloc2(__a); 44663e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 4467319be722SEric Fiselier ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4468319be722SEric Fiselier _CntrlBlk(__a, __a0); 44693e519524SHoward Hinnant shared_ptr<_Tp> __r; 44703e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 4471319be722SEric Fiselier __r.__cntrl_ = _VSTD::addressof(*__hold2.release()); 447239005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 44733e519524SHoward Hinnant return __r; 44743e519524SHoward Hinnant} 44753e519524SHoward Hinnant 44763e519524SHoward Hinnanttemplate<class _Tp> 44773e519524SHoward Hinnanttemplate<class _Alloc, class _A0, class _A1> 44783e519524SHoward Hinnantshared_ptr<_Tp> 44793e519524SHoward Hinnantshared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1) 44803e519524SHoward Hinnant{ 448177009129SMarshall Clow static_assert((is_constructible<_Tp, _A0, _A1>::value), "Can't construct object in allocate_shared" ); 44823e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 4483319be722SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _Alloc2; 44843e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 44853e519524SHoward Hinnant _Alloc2 __alloc2(__a); 44863e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 4487319be722SEric Fiselier ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4488319be722SEric Fiselier _CntrlBlk(__a, __a0, __a1); 44893e519524SHoward Hinnant shared_ptr<_Tp> __r; 44903e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 4491319be722SEric Fiselier __r.__cntrl_ = _VSTD::addressof(*__hold2.release()); 449239005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 44933e519524SHoward Hinnant return __r; 44943e519524SHoward Hinnant} 44953e519524SHoward Hinnant 44963e519524SHoward Hinnanttemplate<class _Tp> 44973e519524SHoward Hinnanttemplate<class _Alloc, class _A0, class _A1, class _A2> 44983e519524SHoward Hinnantshared_ptr<_Tp> 44993e519524SHoward Hinnantshared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1, _A2& __a2) 45003e519524SHoward Hinnant{ 450177009129SMarshall Clow static_assert((is_constructible<_Tp, _A0, _A1, _A2>::value), "Can't construct object in allocate_shared" ); 45023e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 4503319be722SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _Alloc2; 45043e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 45053e519524SHoward Hinnant _Alloc2 __alloc2(__a); 45063e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 4507319be722SEric Fiselier ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4508319be722SEric Fiselier _CntrlBlk(__a, __a0, __a1, __a2); 45093e519524SHoward Hinnant shared_ptr<_Tp> __r; 45103e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 4511319be722SEric Fiselier __r.__cntrl_ = _VSTD::addressof(*__hold2.release()); 451239005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 45133e519524SHoward Hinnant return __r; 45143e519524SHoward Hinnant} 45153e519524SHoward Hinnant 45163e519524SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 45173e519524SHoward Hinnant 45183e519524SHoward Hinnanttemplate<class _Tp> 45193e519524SHoward Hinnantshared_ptr<_Tp>::~shared_ptr() 45203e519524SHoward Hinnant{ 45213e519524SHoward Hinnant if (__cntrl_) 45223e519524SHoward Hinnant __cntrl_->__release_shared(); 45233e519524SHoward Hinnant} 45243e519524SHoward Hinnant 45253e519524SHoward Hinnanttemplate<class _Tp> 4526906c872dSEvgeniy Stepanovinline 45273e519524SHoward Hinnantshared_ptr<_Tp>& 45283739fe79SHoward Hinnantshared_ptr<_Tp>::operator=(const shared_ptr& __r) _NOEXCEPT 45293e519524SHoward Hinnant{ 45303e519524SHoward Hinnant shared_ptr(__r).swap(*this); 45313e519524SHoward Hinnant return *this; 45323e519524SHoward Hinnant} 45333e519524SHoward Hinnant 45343e519524SHoward Hinnanttemplate<class _Tp> 45353e519524SHoward Hinnanttemplate<class _Yp> 4536906c872dSEvgeniy Stepanovinline 45378e25104bSHoward Hinnanttypename enable_if 45388e25104bSHoward Hinnant< 4539dc83e779SMarshall Clow is_convertible<_Yp*, typename shared_ptr<_Tp>::element_type*>::value, 45403e519524SHoward Hinnant shared_ptr<_Tp>& 45418e25104bSHoward Hinnant>::type 45423739fe79SHoward Hinnantshared_ptr<_Tp>::operator=(const shared_ptr<_Yp>& __r) _NOEXCEPT 45433e519524SHoward Hinnant{ 45443e519524SHoward Hinnant shared_ptr(__r).swap(*this); 45453e519524SHoward Hinnant return *this; 45463e519524SHoward Hinnant} 45473e519524SHoward Hinnant 45487609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 45493e519524SHoward Hinnant 45503e519524SHoward Hinnanttemplate<class _Tp> 4551906c872dSEvgeniy Stepanovinline 45523e519524SHoward Hinnantshared_ptr<_Tp>& 45533739fe79SHoward Hinnantshared_ptr<_Tp>::operator=(shared_ptr&& __r) _NOEXCEPT 45543e519524SHoward Hinnant{ 4555ce48a113SHoward Hinnant shared_ptr(_VSTD::move(__r)).swap(*this); 45563e519524SHoward Hinnant return *this; 45573e519524SHoward Hinnant} 45583e519524SHoward Hinnant 45593e519524SHoward Hinnanttemplate<class _Tp> 45603e519524SHoward Hinnanttemplate<class _Yp> 4561906c872dSEvgeniy Stepanovinline 45628e25104bSHoward Hinnanttypename enable_if 45638e25104bSHoward Hinnant< 4564dc83e779SMarshall Clow is_convertible<_Yp*, typename shared_ptr<_Tp>::element_type*>::value, 45653e519524SHoward Hinnant shared_ptr<_Tp>& 45668e25104bSHoward Hinnant>::type 45673e519524SHoward Hinnantshared_ptr<_Tp>::operator=(shared_ptr<_Yp>&& __r) 45683e519524SHoward Hinnant{ 4569ce48a113SHoward Hinnant shared_ptr(_VSTD::move(__r)).swap(*this); 45703e519524SHoward Hinnant return *this; 45713e519524SHoward Hinnant} 45723e519524SHoward Hinnant 4573e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR) 45743e519524SHoward Hinnanttemplate<class _Tp> 45753e519524SHoward Hinnanttemplate<class _Yp> 4576906c872dSEvgeniy Stepanovinline 45778e25104bSHoward Hinnanttypename enable_if 45788e25104bSHoward Hinnant< 45798e25104bSHoward Hinnant !is_array<_Yp>::value && 4580dc83e779SMarshall Clow is_convertible<_Yp*, typename shared_ptr<_Tp>::element_type*>::value, 458184f996fbSHoward Hinnant shared_ptr<_Tp> 458284f996fbSHoward Hinnant>::type& 45833e519524SHoward Hinnantshared_ptr<_Tp>::operator=(auto_ptr<_Yp>&& __r) 45843e519524SHoward Hinnant{ 4585ce48a113SHoward Hinnant shared_ptr(_VSTD::move(__r)).swap(*this); 45863e519524SHoward Hinnant return *this; 45873e519524SHoward Hinnant} 4588e67179bcSMarshall Clow#endif 45893e519524SHoward Hinnant 45903e519524SHoward Hinnanttemplate<class _Tp> 45913e519524SHoward Hinnanttemplate <class _Yp, class _Dp> 4592906c872dSEvgeniy Stepanovinline 45938e25104bSHoward Hinnanttypename enable_if 45948e25104bSHoward Hinnant< 45958e25104bSHoward Hinnant !is_array<_Yp>::value && 4596dc83e779SMarshall Clow is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, 4597dc83e779SMarshall Clow typename shared_ptr<_Tp>::element_type*>::value, 45983e519524SHoward Hinnant shared_ptr<_Tp>& 45998e25104bSHoward Hinnant>::type 46003e519524SHoward Hinnantshared_ptr<_Tp>::operator=(unique_ptr<_Yp, _Dp>&& __r) 46013e519524SHoward Hinnant{ 4602ce48a113SHoward Hinnant shared_ptr(_VSTD::move(__r)).swap(*this); 46033e519524SHoward Hinnant return *this; 46043e519524SHoward Hinnant} 46053e519524SHoward Hinnant 46067609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 46073e519524SHoward Hinnant 4608e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR) 46093e519524SHoward Hinnanttemplate<class _Tp> 46103e519524SHoward Hinnanttemplate<class _Yp> 46113e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 46128e25104bSHoward Hinnanttypename enable_if 46138e25104bSHoward Hinnant< 46148e25104bSHoward Hinnant !is_array<_Yp>::value && 46153a6474ecSMarshall Clow is_convertible<_Yp*, typename shared_ptr<_Tp>::element_type*>::value, 46163e519524SHoward Hinnant shared_ptr<_Tp>& 46178e25104bSHoward Hinnant>::type 4618b3371f6fSHoward Hinnantshared_ptr<_Tp>::operator=(auto_ptr<_Yp> __r) 46193e519524SHoward Hinnant{ 46203e519524SHoward Hinnant shared_ptr(__r).swap(*this); 46213e519524SHoward Hinnant return *this; 46223e519524SHoward Hinnant} 4623e67179bcSMarshall Clow#endif 46243e519524SHoward Hinnant 46253e519524SHoward Hinnanttemplate<class _Tp> 46263e519524SHoward Hinnanttemplate <class _Yp, class _Dp> 46273e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 46288e25104bSHoward Hinnanttypename enable_if 46298e25104bSHoward Hinnant< 46308e25104bSHoward Hinnant !is_array<_Yp>::value && 46313a6474ecSMarshall Clow is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, 46323a6474ecSMarshall Clow typename shared_ptr<_Tp>::element_type*>::value, 46333e519524SHoward Hinnant shared_ptr<_Tp>& 46348e25104bSHoward Hinnant>::type 46353e519524SHoward Hinnantshared_ptr<_Tp>::operator=(unique_ptr<_Yp, _Dp> __r) 46363e519524SHoward Hinnant{ 4637ce48a113SHoward Hinnant shared_ptr(_VSTD::move(__r)).swap(*this); 46383e519524SHoward Hinnant return *this; 46393e519524SHoward Hinnant} 46403e519524SHoward Hinnant 46417609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 46423e519524SHoward Hinnant 46433e519524SHoward Hinnanttemplate<class _Tp> 4644906c872dSEvgeniy Stepanovinline 46453e519524SHoward Hinnantvoid 46463739fe79SHoward Hinnantshared_ptr<_Tp>::swap(shared_ptr& __r) _NOEXCEPT 46473e519524SHoward Hinnant{ 4648ce48a113SHoward Hinnant _VSTD::swap(__ptr_, __r.__ptr_); 4649ce48a113SHoward Hinnant _VSTD::swap(__cntrl_, __r.__cntrl_); 46503e519524SHoward Hinnant} 46513e519524SHoward Hinnant 46523e519524SHoward Hinnanttemplate<class _Tp> 4653906c872dSEvgeniy Stepanovinline 46543e519524SHoward Hinnantvoid 46553739fe79SHoward Hinnantshared_ptr<_Tp>::reset() _NOEXCEPT 46563e519524SHoward Hinnant{ 46573e519524SHoward Hinnant shared_ptr().swap(*this); 46583e519524SHoward Hinnant} 46593e519524SHoward Hinnant 46603e519524SHoward Hinnanttemplate<class _Tp> 46613e519524SHoward Hinnanttemplate<class _Yp> 4662906c872dSEvgeniy Stepanovinline 46638e25104bSHoward Hinnanttypename enable_if 46648e25104bSHoward Hinnant< 4665dc83e779SMarshall Clow is_convertible<_Yp*, typename shared_ptr<_Tp>::element_type*>::value, 46663e519524SHoward Hinnant void 46678e25104bSHoward Hinnant>::type 46683e519524SHoward Hinnantshared_ptr<_Tp>::reset(_Yp* __p) 46693e519524SHoward Hinnant{ 46703e519524SHoward Hinnant shared_ptr(__p).swap(*this); 46713e519524SHoward Hinnant} 46723e519524SHoward Hinnant 46733e519524SHoward Hinnanttemplate<class _Tp> 46743e519524SHoward Hinnanttemplate<class _Yp, class _Dp> 4675906c872dSEvgeniy Stepanovinline 46768e25104bSHoward Hinnanttypename enable_if 46778e25104bSHoward Hinnant< 4678dc83e779SMarshall Clow is_convertible<_Yp*, typename shared_ptr<_Tp>::element_type*>::value, 46793e519524SHoward Hinnant void 46808e25104bSHoward Hinnant>::type 46813e519524SHoward Hinnantshared_ptr<_Tp>::reset(_Yp* __p, _Dp __d) 46823e519524SHoward Hinnant{ 46833e519524SHoward Hinnant shared_ptr(__p, __d).swap(*this); 46843e519524SHoward Hinnant} 46853e519524SHoward Hinnant 46863e519524SHoward Hinnanttemplate<class _Tp> 46873e519524SHoward Hinnanttemplate<class _Yp, class _Dp, class _Alloc> 4688906c872dSEvgeniy Stepanovinline 46898e25104bSHoward Hinnanttypename enable_if 46908e25104bSHoward Hinnant< 4691dc83e779SMarshall Clow is_convertible<_Yp*, typename shared_ptr<_Tp>::element_type*>::value, 46923e519524SHoward Hinnant void 46938e25104bSHoward Hinnant>::type 46943e519524SHoward Hinnantshared_ptr<_Tp>::reset(_Yp* __p, _Dp __d, _Alloc __a) 46953e519524SHoward Hinnant{ 46963e519524SHoward Hinnant shared_ptr(__p, __d, __a).swap(*this); 46973e519524SHoward Hinnant} 46983e519524SHoward Hinnant 46993e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 47003e519524SHoward Hinnant 47013e519524SHoward Hinnanttemplate<class _Tp, class ..._Args> 47023e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 47038e25104bSHoward Hinnanttypename enable_if 47048e25104bSHoward Hinnant< 47058e25104bSHoward Hinnant !is_array<_Tp>::value, 47063e519524SHoward Hinnant shared_ptr<_Tp> 47078e25104bSHoward Hinnant>::type 47083e519524SHoward Hinnantmake_shared(_Args&& ...__args) 47093e519524SHoward Hinnant{ 4710ce48a113SHoward Hinnant return shared_ptr<_Tp>::make_shared(_VSTD::forward<_Args>(__args)...); 47113e519524SHoward Hinnant} 47123e519524SHoward Hinnant 47133e519524SHoward Hinnanttemplate<class _Tp, class _Alloc, class ..._Args> 47143e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 47158e25104bSHoward Hinnanttypename enable_if 47168e25104bSHoward Hinnant< 47178e25104bSHoward Hinnant !is_array<_Tp>::value, 47183e519524SHoward Hinnant shared_ptr<_Tp> 47198e25104bSHoward Hinnant>::type 47203e519524SHoward Hinnantallocate_shared(const _Alloc& __a, _Args&& ...__args) 47213e519524SHoward Hinnant{ 4722ce48a113SHoward Hinnant return shared_ptr<_Tp>::allocate_shared(__a, _VSTD::forward<_Args>(__args)...); 47233e519524SHoward Hinnant} 47243e519524SHoward Hinnant 47253e519524SHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 47263e519524SHoward Hinnant 47273e519524SHoward Hinnanttemplate<class _Tp> 47283e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 47293e519524SHoward Hinnantshared_ptr<_Tp> 47303e519524SHoward Hinnantmake_shared() 47313e519524SHoward Hinnant{ 47323e519524SHoward Hinnant return shared_ptr<_Tp>::make_shared(); 47333e519524SHoward Hinnant} 47343e519524SHoward Hinnant 47353e519524SHoward Hinnanttemplate<class _Tp, class _A0> 47363e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 47373e519524SHoward Hinnantshared_ptr<_Tp> 47383e519524SHoward Hinnantmake_shared(_A0& __a0) 47393e519524SHoward Hinnant{ 47403e519524SHoward Hinnant return shared_ptr<_Tp>::make_shared(__a0); 47413e519524SHoward Hinnant} 47423e519524SHoward Hinnant 47433e519524SHoward Hinnanttemplate<class _Tp, class _A0, class _A1> 47443e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 47453e519524SHoward Hinnantshared_ptr<_Tp> 47463e519524SHoward Hinnantmake_shared(_A0& __a0, _A1& __a1) 47473e519524SHoward Hinnant{ 47483e519524SHoward Hinnant return shared_ptr<_Tp>::make_shared(__a0, __a1); 47493e519524SHoward Hinnant} 47503e519524SHoward Hinnant 47513e519524SHoward Hinnanttemplate<class _Tp, class _A0, class _A1, class _A2> 47523e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 47533e519524SHoward Hinnantshared_ptr<_Tp> 47543e519524SHoward Hinnantmake_shared(_A0& __a0, _A1& __a1, _A2& __a2) 47553e519524SHoward Hinnant{ 47563e519524SHoward Hinnant return shared_ptr<_Tp>::make_shared(__a0, __a1, __a2); 47573e519524SHoward Hinnant} 47583e519524SHoward Hinnant 47593e519524SHoward Hinnanttemplate<class _Tp, class _Alloc> 47603e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 47613e519524SHoward Hinnantshared_ptr<_Tp> 47623e519524SHoward Hinnantallocate_shared(const _Alloc& __a) 47633e519524SHoward Hinnant{ 47643e519524SHoward Hinnant return shared_ptr<_Tp>::allocate_shared(__a); 47653e519524SHoward Hinnant} 47663e519524SHoward Hinnant 47673e519524SHoward Hinnanttemplate<class _Tp, class _Alloc, class _A0> 47683e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 47693e519524SHoward Hinnantshared_ptr<_Tp> 47703e519524SHoward Hinnantallocate_shared(const _Alloc& __a, _A0& __a0) 47713e519524SHoward Hinnant{ 47723e519524SHoward Hinnant return shared_ptr<_Tp>::allocate_shared(__a, __a0); 47733e519524SHoward Hinnant} 47743e519524SHoward Hinnant 47753e519524SHoward Hinnanttemplate<class _Tp, class _Alloc, class _A0, class _A1> 47763e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 47773e519524SHoward Hinnantshared_ptr<_Tp> 47783e519524SHoward Hinnantallocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1) 47793e519524SHoward Hinnant{ 47803e519524SHoward Hinnant return shared_ptr<_Tp>::allocate_shared(__a, __a0, __a1); 47813e519524SHoward Hinnant} 47823e519524SHoward Hinnant 47833e519524SHoward Hinnanttemplate<class _Tp, class _Alloc, class _A0, class _A1, class _A2> 47843e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 47853e519524SHoward Hinnantshared_ptr<_Tp> 47863e519524SHoward Hinnantallocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1, _A2& __a2) 47873e519524SHoward Hinnant{ 47883e519524SHoward Hinnant return shared_ptr<_Tp>::allocate_shared(__a, __a0, __a1, __a2); 47893e519524SHoward Hinnant} 47903e519524SHoward Hinnant 47913e519524SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 47923e519524SHoward Hinnant 47933e519524SHoward Hinnanttemplate<class _Tp, class _Up> 47943e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 47953e519524SHoward Hinnantbool 47963739fe79SHoward Hinnantoperator==(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 47973e519524SHoward Hinnant{ 47983e519524SHoward Hinnant return __x.get() == __y.get(); 47993e519524SHoward Hinnant} 48003e519524SHoward Hinnant 48013e519524SHoward Hinnanttemplate<class _Tp, class _Up> 48023e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 48033e519524SHoward Hinnantbool 48043739fe79SHoward Hinnantoperator!=(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 48053e519524SHoward Hinnant{ 48063e519524SHoward Hinnant return !(__x == __y); 48073e519524SHoward Hinnant} 48083e519524SHoward Hinnant 48093e519524SHoward Hinnanttemplate<class _Tp, class _Up> 48103e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 48113e519524SHoward Hinnantbool 48123739fe79SHoward Hinnantoperator<(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 48133e519524SHoward Hinnant{ 4814c0db0729SMarshall Clow#if _LIBCPP_STD_VER <= 11 48156fe361c1SEric Fiselier typedef typename common_type<_Tp*, _Up*>::type _Vp; 48166fe361c1SEric Fiselier return less<_Vp>()(__x.get(), __y.get()); 4817c0db0729SMarshall Clow#else 4818c0db0729SMarshall Clow return less<>()(__x.get(), __y.get()); 4819c0db0729SMarshall Clow#endif 4820c0db0729SMarshall Clow 482167f39647SHoward Hinnant} 482267f39647SHoward Hinnant 482367f39647SHoward Hinnanttemplate<class _Tp, class _Up> 482467f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 482567f39647SHoward Hinnantbool 482667f39647SHoward Hinnantoperator>(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 482767f39647SHoward Hinnant{ 482867f39647SHoward Hinnant return __y < __x; 482967f39647SHoward Hinnant} 483067f39647SHoward Hinnant 483167f39647SHoward Hinnanttemplate<class _Tp, class _Up> 483267f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 483367f39647SHoward Hinnantbool 483467f39647SHoward Hinnantoperator<=(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 483567f39647SHoward Hinnant{ 483667f39647SHoward Hinnant return !(__y < __x); 483767f39647SHoward Hinnant} 483867f39647SHoward Hinnant 483967f39647SHoward Hinnanttemplate<class _Tp, class _Up> 484067f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 484167f39647SHoward Hinnantbool 484267f39647SHoward Hinnantoperator>=(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 484367f39647SHoward Hinnant{ 484467f39647SHoward Hinnant return !(__x < __y); 484567f39647SHoward Hinnant} 484667f39647SHoward Hinnant 484767f39647SHoward Hinnanttemplate<class _Tp> 484867f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 484967f39647SHoward Hinnantbool 485067f39647SHoward Hinnantoperator==(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 485167f39647SHoward Hinnant{ 485267f39647SHoward Hinnant return !__x; 485367f39647SHoward Hinnant} 485467f39647SHoward Hinnant 485567f39647SHoward Hinnanttemplate<class _Tp> 485667f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 485767f39647SHoward Hinnantbool 485867f39647SHoward Hinnantoperator==(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 485967f39647SHoward Hinnant{ 486067f39647SHoward Hinnant return !__x; 486167f39647SHoward Hinnant} 486267f39647SHoward Hinnant 486367f39647SHoward Hinnanttemplate<class _Tp> 486467f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 486567f39647SHoward Hinnantbool 486667f39647SHoward Hinnantoperator!=(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 486767f39647SHoward Hinnant{ 486867f39647SHoward Hinnant return static_cast<bool>(__x); 486967f39647SHoward Hinnant} 487067f39647SHoward Hinnant 487167f39647SHoward Hinnanttemplate<class _Tp> 487267f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 487367f39647SHoward Hinnantbool 487467f39647SHoward Hinnantoperator!=(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 487567f39647SHoward Hinnant{ 487667f39647SHoward Hinnant return static_cast<bool>(__x); 487767f39647SHoward Hinnant} 487867f39647SHoward Hinnant 487967f39647SHoward Hinnanttemplate<class _Tp> 488067f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 488167f39647SHoward Hinnantbool 488267f39647SHoward Hinnantoperator<(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 488367f39647SHoward Hinnant{ 488467f39647SHoward Hinnant return less<_Tp*>()(__x.get(), nullptr); 488567f39647SHoward Hinnant} 488667f39647SHoward Hinnant 488767f39647SHoward Hinnanttemplate<class _Tp> 488867f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 488967f39647SHoward Hinnantbool 489067f39647SHoward Hinnantoperator<(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 489167f39647SHoward Hinnant{ 489267f39647SHoward Hinnant return less<_Tp*>()(nullptr, __x.get()); 489367f39647SHoward Hinnant} 489467f39647SHoward Hinnant 489567f39647SHoward Hinnanttemplate<class _Tp> 489667f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 489767f39647SHoward Hinnantbool 489867f39647SHoward Hinnantoperator>(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 489967f39647SHoward Hinnant{ 490067f39647SHoward Hinnant return nullptr < __x; 490167f39647SHoward Hinnant} 490267f39647SHoward Hinnant 490367f39647SHoward Hinnanttemplate<class _Tp> 490467f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 490567f39647SHoward Hinnantbool 490667f39647SHoward Hinnantoperator>(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 490767f39647SHoward Hinnant{ 490867f39647SHoward Hinnant return __x < nullptr; 490967f39647SHoward Hinnant} 491067f39647SHoward Hinnant 491167f39647SHoward Hinnanttemplate<class _Tp> 491267f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 491367f39647SHoward Hinnantbool 491467f39647SHoward Hinnantoperator<=(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 491567f39647SHoward Hinnant{ 491667f39647SHoward Hinnant return !(nullptr < __x); 491767f39647SHoward Hinnant} 491867f39647SHoward Hinnant 491967f39647SHoward Hinnanttemplate<class _Tp> 492067f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 492167f39647SHoward Hinnantbool 492267f39647SHoward Hinnantoperator<=(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 492367f39647SHoward Hinnant{ 492467f39647SHoward Hinnant return !(__x < nullptr); 492567f39647SHoward Hinnant} 492667f39647SHoward Hinnant 492767f39647SHoward Hinnanttemplate<class _Tp> 492867f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 492967f39647SHoward Hinnantbool 493067f39647SHoward Hinnantoperator>=(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 493167f39647SHoward Hinnant{ 493267f39647SHoward Hinnant return !(__x < nullptr); 493367f39647SHoward Hinnant} 493467f39647SHoward Hinnant 493567f39647SHoward Hinnanttemplate<class _Tp> 493667f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 493767f39647SHoward Hinnantbool 493867f39647SHoward Hinnantoperator>=(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 493967f39647SHoward Hinnant{ 494067f39647SHoward Hinnant return !(nullptr < __x); 49413e519524SHoward Hinnant} 49423e519524SHoward Hinnant 49433e519524SHoward Hinnanttemplate<class _Tp> 49443e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 49453e519524SHoward Hinnantvoid 49463739fe79SHoward Hinnantswap(shared_ptr<_Tp>& __x, shared_ptr<_Tp>& __y) _NOEXCEPT 49473e519524SHoward Hinnant{ 49483e519524SHoward Hinnant __x.swap(__y); 49493e519524SHoward Hinnant} 49503e519524SHoward Hinnant 49513e519524SHoward Hinnanttemplate<class _Tp, class _Up> 49523e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 49538e25104bSHoward Hinnanttypename enable_if 49548e25104bSHoward Hinnant< 49558e25104bSHoward Hinnant !is_array<_Tp>::value && !is_array<_Up>::value, 49563e519524SHoward Hinnant shared_ptr<_Tp> 49578e25104bSHoward Hinnant>::type 49583739fe79SHoward Hinnantstatic_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT 49593e519524SHoward Hinnant{ 49603e519524SHoward Hinnant return shared_ptr<_Tp>(__r, static_cast<_Tp*>(__r.get())); 49613e519524SHoward Hinnant} 49623e519524SHoward Hinnant 49633e519524SHoward Hinnanttemplate<class _Tp, class _Up> 49643e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 49658e25104bSHoward Hinnanttypename enable_if 49668e25104bSHoward Hinnant< 49678e25104bSHoward Hinnant !is_array<_Tp>::value && !is_array<_Up>::value, 49683e519524SHoward Hinnant shared_ptr<_Tp> 49698e25104bSHoward Hinnant>::type 49703739fe79SHoward Hinnantdynamic_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT 49713e519524SHoward Hinnant{ 49723e519524SHoward Hinnant _Tp* __p = dynamic_cast<_Tp*>(__r.get()); 49733e519524SHoward Hinnant return __p ? shared_ptr<_Tp>(__r, __p) : shared_ptr<_Tp>(); 49743e519524SHoward Hinnant} 49753e519524SHoward Hinnant 49763e519524SHoward Hinnanttemplate<class _Tp, class _Up> 49778e25104bSHoward Hinnanttypename enable_if 49788e25104bSHoward Hinnant< 49798e25104bSHoward Hinnant is_array<_Tp>::value == is_array<_Up>::value, 49803e519524SHoward Hinnant shared_ptr<_Tp> 49818e25104bSHoward Hinnant>::type 49823739fe79SHoward Hinnantconst_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT 49833e519524SHoward Hinnant{ 49848e25104bSHoward Hinnant typedef typename remove_extent<_Tp>::type _RTp; 49858e25104bSHoward Hinnant return shared_ptr<_Tp>(__r, const_cast<_RTp*>(__r.get())); 49863e519524SHoward Hinnant} 49873e519524SHoward Hinnant 498854b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI 498954b409fdSHoward Hinnant 49903e519524SHoward Hinnanttemplate<class _Dp, class _Tp> 49913e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 49923e519524SHoward Hinnant_Dp* 49933739fe79SHoward Hinnantget_deleter(const shared_ptr<_Tp>& __p) _NOEXCEPT 49943e519524SHoward Hinnant{ 49953e519524SHoward Hinnant return __p.template __get_deleter<_Dp>(); 49963e519524SHoward Hinnant} 49973e519524SHoward Hinnant 4998b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_RTTI 499954b409fdSHoward Hinnant 50003e519524SHoward Hinnanttemplate<class _Tp> 5001e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS weak_ptr 50023e519524SHoward Hinnant{ 50033e519524SHoward Hinnantpublic: 50043e519524SHoward Hinnant typedef _Tp element_type; 50053e519524SHoward Hinnantprivate: 50063e519524SHoward Hinnant element_type* __ptr_; 50073e519524SHoward Hinnant __shared_weak_count* __cntrl_; 50083e519524SHoward Hinnant 50093e519524SHoward Hinnantpublic: 5010906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 5011c0937e8aSHoward Hinnant _LIBCPP_CONSTEXPR weak_ptr() _NOEXCEPT; 5012906c872dSEvgeniy Stepanov template<class _Yp> _LIBCPP_INLINE_VISIBILITY weak_ptr(shared_ptr<_Yp> const& __r, 50133739fe79SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0) 50143739fe79SHoward Hinnant _NOEXCEPT; 5015906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 50163739fe79SHoward Hinnant weak_ptr(weak_ptr const& __r) _NOEXCEPT; 5017906c872dSEvgeniy Stepanov template<class _Yp> _LIBCPP_INLINE_VISIBILITY weak_ptr(weak_ptr<_Yp> const& __r, 50183739fe79SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0) 50193739fe79SHoward Hinnant _NOEXCEPT; 50203e519524SHoward Hinnant 50218e25104bSHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 5022906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 50238e25104bSHoward Hinnant weak_ptr(weak_ptr&& __r) _NOEXCEPT; 5024906c872dSEvgeniy Stepanov template<class _Yp> _LIBCPP_INLINE_VISIBILITY weak_ptr(weak_ptr<_Yp>&& __r, 50258e25104bSHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0) 50268e25104bSHoward Hinnant _NOEXCEPT; 50278e25104bSHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 50283e519524SHoward Hinnant ~weak_ptr(); 50293e519524SHoward Hinnant 5030906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 50313739fe79SHoward Hinnant weak_ptr& operator=(weak_ptr const& __r) _NOEXCEPT; 50328e25104bSHoward Hinnant template<class _Yp> 50338e25104bSHoward Hinnant typename enable_if 50348e25104bSHoward Hinnant < 50358e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 50368e25104bSHoward Hinnant weak_ptr& 50378e25104bSHoward Hinnant >::type 5038906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 50398e25104bSHoward Hinnant operator=(weak_ptr<_Yp> const& __r) _NOEXCEPT; 50408e25104bSHoward Hinnant 50418e25104bSHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 50428e25104bSHoward Hinnant 5043906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 50448e25104bSHoward Hinnant weak_ptr& operator=(weak_ptr&& __r) _NOEXCEPT; 50458e25104bSHoward Hinnant template<class _Yp> 50468e25104bSHoward Hinnant typename enable_if 50478e25104bSHoward Hinnant < 50488e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 50498e25104bSHoward Hinnant weak_ptr& 50508e25104bSHoward Hinnant >::type 5051906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 50528e25104bSHoward Hinnant operator=(weak_ptr<_Yp>&& __r) _NOEXCEPT; 50538e25104bSHoward Hinnant 50548e25104bSHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 50558e25104bSHoward Hinnant 50568e25104bSHoward Hinnant template<class _Yp> 50578e25104bSHoward Hinnant typename enable_if 50588e25104bSHoward Hinnant < 50598e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 50608e25104bSHoward Hinnant weak_ptr& 50618e25104bSHoward Hinnant >::type 5062906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 50638e25104bSHoward Hinnant operator=(shared_ptr<_Yp> const& __r) _NOEXCEPT; 50643e519524SHoward Hinnant 5065906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 50663739fe79SHoward Hinnant void swap(weak_ptr& __r) _NOEXCEPT; 5067906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 50683739fe79SHoward Hinnant void reset() _NOEXCEPT; 50693e519524SHoward Hinnant 5070848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 50713739fe79SHoward Hinnant long use_count() const _NOEXCEPT 50723739fe79SHoward Hinnant {return __cntrl_ ? __cntrl_->use_count() : 0;} 5073848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 50743739fe79SHoward Hinnant bool expired() const _NOEXCEPT 50753739fe79SHoward Hinnant {return __cntrl_ == 0 || __cntrl_->use_count() == 0;} 50763739fe79SHoward Hinnant shared_ptr<_Tp> lock() const _NOEXCEPT; 5077848a5374SHoward Hinnant template<class _Up> 5078848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 507936bc7178SMarshall Clow bool owner_before(const shared_ptr<_Up>& __r) const _NOEXCEPT 50803e519524SHoward Hinnant {return __cntrl_ < __r.__cntrl_;} 5081848a5374SHoward Hinnant template<class _Up> 5082848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 508336bc7178SMarshall Clow bool owner_before(const weak_ptr<_Up>& __r) const _NOEXCEPT 50843e519524SHoward Hinnant {return __cntrl_ < __r.__cntrl_;} 50853e519524SHoward Hinnant 5086e2f2d1edSEric Fiselier template <class _Up> friend class _LIBCPP_TEMPLATE_VIS weak_ptr; 5087e2f2d1edSEric Fiselier template <class _Up> friend class _LIBCPP_TEMPLATE_VIS shared_ptr; 50883e519524SHoward Hinnant}; 50893e519524SHoward Hinnant 50903e519524SHoward Hinnanttemplate<class _Tp> 5091906c872dSEvgeniy Stepanovinline 5092c0937e8aSHoward Hinnant_LIBCPP_CONSTEXPR 50933739fe79SHoward Hinnantweak_ptr<_Tp>::weak_ptr() _NOEXCEPT 50943e519524SHoward Hinnant : __ptr_(0), 50953e519524SHoward Hinnant __cntrl_(0) 50963e519524SHoward Hinnant{ 50973e519524SHoward Hinnant} 50983e519524SHoward Hinnant 50993e519524SHoward Hinnanttemplate<class _Tp> 5100906c872dSEvgeniy Stepanovinline 51013739fe79SHoward Hinnantweak_ptr<_Tp>::weak_ptr(weak_ptr const& __r) _NOEXCEPT 51023e519524SHoward Hinnant : __ptr_(__r.__ptr_), 51033e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 51043e519524SHoward Hinnant{ 51053e519524SHoward Hinnant if (__cntrl_) 51063e519524SHoward Hinnant __cntrl_->__add_weak(); 51073e519524SHoward Hinnant} 51083e519524SHoward Hinnant 51093e519524SHoward Hinnanttemplate<class _Tp> 51103e519524SHoward Hinnanttemplate<class _Yp> 5111906c872dSEvgeniy Stepanovinline 51123e519524SHoward Hinnantweak_ptr<_Tp>::weak_ptr(shared_ptr<_Yp> const& __r, 51135eb6bdfaSHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type) 51143739fe79SHoward Hinnant _NOEXCEPT 51153e519524SHoward Hinnant : __ptr_(__r.__ptr_), 51163e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 51173e519524SHoward Hinnant{ 51183e519524SHoward Hinnant if (__cntrl_) 51193e519524SHoward Hinnant __cntrl_->__add_weak(); 51203e519524SHoward Hinnant} 51213e519524SHoward Hinnant 51223e519524SHoward Hinnanttemplate<class _Tp> 51233e519524SHoward Hinnanttemplate<class _Yp> 5124906c872dSEvgeniy Stepanovinline 51253e519524SHoward Hinnantweak_ptr<_Tp>::weak_ptr(weak_ptr<_Yp> const& __r, 51265eb6bdfaSHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type) 51273739fe79SHoward Hinnant _NOEXCEPT 51283e519524SHoward Hinnant : __ptr_(__r.__ptr_), 51293e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 51303e519524SHoward Hinnant{ 51313e519524SHoward Hinnant if (__cntrl_) 51323e519524SHoward Hinnant __cntrl_->__add_weak(); 51333e519524SHoward Hinnant} 51343e519524SHoward Hinnant 51358e25104bSHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 51368e25104bSHoward Hinnant 51378e25104bSHoward Hinnanttemplate<class _Tp> 5138906c872dSEvgeniy Stepanovinline 51398e25104bSHoward Hinnantweak_ptr<_Tp>::weak_ptr(weak_ptr&& __r) _NOEXCEPT 51408e25104bSHoward Hinnant : __ptr_(__r.__ptr_), 51418e25104bSHoward Hinnant __cntrl_(__r.__cntrl_) 51428e25104bSHoward Hinnant{ 51438e25104bSHoward Hinnant __r.__ptr_ = 0; 51448e25104bSHoward Hinnant __r.__cntrl_ = 0; 51458e25104bSHoward Hinnant} 51468e25104bSHoward Hinnant 51478e25104bSHoward Hinnanttemplate<class _Tp> 51488e25104bSHoward Hinnanttemplate<class _Yp> 5149906c872dSEvgeniy Stepanovinline 51508e25104bSHoward Hinnantweak_ptr<_Tp>::weak_ptr(weak_ptr<_Yp>&& __r, 51518e25104bSHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type) 51528e25104bSHoward Hinnant _NOEXCEPT 51538e25104bSHoward Hinnant : __ptr_(__r.__ptr_), 51548e25104bSHoward Hinnant __cntrl_(__r.__cntrl_) 51558e25104bSHoward Hinnant{ 51568e25104bSHoward Hinnant __r.__ptr_ = 0; 51578e25104bSHoward Hinnant __r.__cntrl_ = 0; 51588e25104bSHoward Hinnant} 51598e25104bSHoward Hinnant 51608e25104bSHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 51618e25104bSHoward Hinnant 51623e519524SHoward Hinnanttemplate<class _Tp> 51633e519524SHoward Hinnantweak_ptr<_Tp>::~weak_ptr() 51643e519524SHoward Hinnant{ 51653e519524SHoward Hinnant if (__cntrl_) 51663e519524SHoward Hinnant __cntrl_->__release_weak(); 51673e519524SHoward Hinnant} 51683e519524SHoward Hinnant 51693e519524SHoward Hinnanttemplate<class _Tp> 5170906c872dSEvgeniy Stepanovinline 51713e519524SHoward Hinnantweak_ptr<_Tp>& 51723739fe79SHoward Hinnantweak_ptr<_Tp>::operator=(weak_ptr const& __r) _NOEXCEPT 51733e519524SHoward Hinnant{ 51743e519524SHoward Hinnant weak_ptr(__r).swap(*this); 51753e519524SHoward Hinnant return *this; 51763e519524SHoward Hinnant} 51773e519524SHoward Hinnant 51783e519524SHoward Hinnanttemplate<class _Tp> 51793e519524SHoward Hinnanttemplate<class _Yp> 5180906c872dSEvgeniy Stepanovinline 51818e25104bSHoward Hinnanttypename enable_if 51828e25104bSHoward Hinnant< 51838e25104bSHoward Hinnant is_convertible<_Yp*, _Tp*>::value, 51843e519524SHoward Hinnant weak_ptr<_Tp>& 51858e25104bSHoward Hinnant>::type 51863739fe79SHoward Hinnantweak_ptr<_Tp>::operator=(weak_ptr<_Yp> const& __r) _NOEXCEPT 51873e519524SHoward Hinnant{ 51883e519524SHoward Hinnant weak_ptr(__r).swap(*this); 51893e519524SHoward Hinnant return *this; 51903e519524SHoward Hinnant} 51913e519524SHoward Hinnant 51928e25104bSHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 51938e25104bSHoward Hinnant 51948e25104bSHoward Hinnanttemplate<class _Tp> 5195906c872dSEvgeniy Stepanovinline 51968e25104bSHoward Hinnantweak_ptr<_Tp>& 51978e25104bSHoward Hinnantweak_ptr<_Tp>::operator=(weak_ptr&& __r) _NOEXCEPT 51988e25104bSHoward Hinnant{ 51998e25104bSHoward Hinnant weak_ptr(_VSTD::move(__r)).swap(*this); 52008e25104bSHoward Hinnant return *this; 52018e25104bSHoward Hinnant} 52028e25104bSHoward Hinnant 52033e519524SHoward Hinnanttemplate<class _Tp> 52043e519524SHoward Hinnanttemplate<class _Yp> 5205906c872dSEvgeniy Stepanovinline 52068e25104bSHoward Hinnanttypename enable_if 52078e25104bSHoward Hinnant< 52088e25104bSHoward Hinnant is_convertible<_Yp*, _Tp*>::value, 52093e519524SHoward Hinnant weak_ptr<_Tp>& 52108e25104bSHoward Hinnant>::type 52118e25104bSHoward Hinnantweak_ptr<_Tp>::operator=(weak_ptr<_Yp>&& __r) _NOEXCEPT 52128e25104bSHoward Hinnant{ 52138e25104bSHoward Hinnant weak_ptr(_VSTD::move(__r)).swap(*this); 52148e25104bSHoward Hinnant return *this; 52158e25104bSHoward Hinnant} 52168e25104bSHoward Hinnant 52178e25104bSHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 52188e25104bSHoward Hinnant 52198e25104bSHoward Hinnanttemplate<class _Tp> 52208e25104bSHoward Hinnanttemplate<class _Yp> 5221906c872dSEvgeniy Stepanovinline 52228e25104bSHoward Hinnanttypename enable_if 52238e25104bSHoward Hinnant< 52248e25104bSHoward Hinnant is_convertible<_Yp*, _Tp*>::value, 52258e25104bSHoward Hinnant weak_ptr<_Tp>& 52268e25104bSHoward Hinnant>::type 52273739fe79SHoward Hinnantweak_ptr<_Tp>::operator=(shared_ptr<_Yp> const& __r) _NOEXCEPT 52283e519524SHoward Hinnant{ 52293e519524SHoward Hinnant weak_ptr(__r).swap(*this); 52303e519524SHoward Hinnant return *this; 52313e519524SHoward Hinnant} 52323e519524SHoward Hinnant 52333e519524SHoward Hinnanttemplate<class _Tp> 5234906c872dSEvgeniy Stepanovinline 52353e519524SHoward Hinnantvoid 52363739fe79SHoward Hinnantweak_ptr<_Tp>::swap(weak_ptr& __r) _NOEXCEPT 52373e519524SHoward Hinnant{ 5238ce48a113SHoward Hinnant _VSTD::swap(__ptr_, __r.__ptr_); 5239ce48a113SHoward Hinnant _VSTD::swap(__cntrl_, __r.__cntrl_); 52403e519524SHoward Hinnant} 52413e519524SHoward Hinnant 52423e519524SHoward Hinnanttemplate<class _Tp> 52433e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 52443e519524SHoward Hinnantvoid 52453739fe79SHoward Hinnantswap(weak_ptr<_Tp>& __x, weak_ptr<_Tp>& __y) _NOEXCEPT 52463e519524SHoward Hinnant{ 52473e519524SHoward Hinnant __x.swap(__y); 52483e519524SHoward Hinnant} 52493e519524SHoward Hinnant 52503e519524SHoward Hinnanttemplate<class _Tp> 5251906c872dSEvgeniy Stepanovinline 52523e519524SHoward Hinnantvoid 52533739fe79SHoward Hinnantweak_ptr<_Tp>::reset() _NOEXCEPT 52543e519524SHoward Hinnant{ 52553e519524SHoward Hinnant weak_ptr().swap(*this); 52563e519524SHoward Hinnant} 52573e519524SHoward Hinnant 52583e519524SHoward Hinnanttemplate<class _Tp> 52593e519524SHoward Hinnanttemplate<class _Yp> 52603e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(const weak_ptr<_Yp>& __r, 5261dc83e779SMarshall Clow typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type) 52623e519524SHoward Hinnant : __ptr_(__r.__ptr_), 52633e519524SHoward Hinnant __cntrl_(__r.__cntrl_ ? __r.__cntrl_->lock() : __r.__cntrl_) 52643e519524SHoward Hinnant{ 52653e519524SHoward Hinnant if (__cntrl_ == 0) 5266d437fa5cSMarshall Clow __throw_bad_weak_ptr(); 52673e519524SHoward Hinnant} 52683e519524SHoward Hinnant 52693e519524SHoward Hinnanttemplate<class _Tp> 52703e519524SHoward Hinnantshared_ptr<_Tp> 52713739fe79SHoward Hinnantweak_ptr<_Tp>::lock() const _NOEXCEPT 52723e519524SHoward Hinnant{ 52733e519524SHoward Hinnant shared_ptr<_Tp> __r; 52743e519524SHoward Hinnant __r.__cntrl_ = __cntrl_ ? __cntrl_->lock() : __cntrl_; 52753e519524SHoward Hinnant if (__r.__cntrl_) 52763e519524SHoward Hinnant __r.__ptr_ = __ptr_; 52773e519524SHoward Hinnant return __r; 52783e519524SHoward Hinnant} 52793e519524SHoward Hinnant 5280183c010cSMarshall Clow#if _LIBCPP_STD_VER > 14 5281183c010cSMarshall Clowtemplate <class _Tp = void> struct owner_less; 5282183c010cSMarshall Clow#else 52833e519524SHoward Hinnanttemplate <class _Tp> struct owner_less; 5284183c010cSMarshall Clow#endif 52853e519524SHoward Hinnant 52863e519524SHoward Hinnanttemplate <class _Tp> 5287e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS owner_less<shared_ptr<_Tp> > 52883e519524SHoward Hinnant : binary_function<shared_ptr<_Tp>, shared_ptr<_Tp>, bool> 52893e519524SHoward Hinnant{ 52903e519524SHoward Hinnant typedef bool result_type; 5291848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 529236bc7178SMarshall Clow bool operator()(shared_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const _NOEXCEPT 52933e519524SHoward Hinnant {return __x.owner_before(__y);} 5294848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 529536bc7178SMarshall Clow bool operator()(shared_ptr<_Tp> const& __x, weak_ptr<_Tp> const& __y) const _NOEXCEPT 52963e519524SHoward Hinnant {return __x.owner_before(__y);} 5297848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 529836bc7178SMarshall Clow bool operator()( weak_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const _NOEXCEPT 52993e519524SHoward Hinnant {return __x.owner_before(__y);} 53003e519524SHoward Hinnant}; 53013e519524SHoward Hinnant 53023e519524SHoward Hinnanttemplate <class _Tp> 5303e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS owner_less<weak_ptr<_Tp> > 53043e519524SHoward Hinnant : binary_function<weak_ptr<_Tp>, weak_ptr<_Tp>, bool> 53053e519524SHoward Hinnant{ 53063e519524SHoward Hinnant typedef bool result_type; 5307848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 530836bc7178SMarshall Clow bool operator()( weak_ptr<_Tp> const& __x, weak_ptr<_Tp> const& __y) const _NOEXCEPT 53093e519524SHoward Hinnant {return __x.owner_before(__y);} 5310848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 531136bc7178SMarshall Clow bool operator()(shared_ptr<_Tp> const& __x, weak_ptr<_Tp> const& __y) const _NOEXCEPT 53123e519524SHoward Hinnant {return __x.owner_before(__y);} 5313848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 531436bc7178SMarshall Clow bool operator()( weak_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const _NOEXCEPT 53153e519524SHoward Hinnant {return __x.owner_before(__y);} 53163e519524SHoward Hinnant}; 53173e519524SHoward Hinnant 5318183c010cSMarshall Clow#if _LIBCPP_STD_VER > 14 5319183c010cSMarshall Clowtemplate <> 5320e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS owner_less<void> 5321183c010cSMarshall Clow{ 5322183c010cSMarshall Clow template <class _Tp, class _Up> 5323183c010cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 532436bc7178SMarshall Clow bool operator()( shared_ptr<_Tp> const& __x, shared_ptr<_Up> const& __y) const _NOEXCEPT 5325183c010cSMarshall Clow {return __x.owner_before(__y);} 5326183c010cSMarshall Clow template <class _Tp, class _Up> 5327183c010cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 532836bc7178SMarshall Clow bool operator()( shared_ptr<_Tp> const& __x, weak_ptr<_Up> const& __y) const _NOEXCEPT 5329183c010cSMarshall Clow {return __x.owner_before(__y);} 5330183c010cSMarshall Clow template <class _Tp, class _Up> 5331183c010cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 533236bc7178SMarshall Clow bool operator()( weak_ptr<_Tp> const& __x, shared_ptr<_Up> const& __y) const _NOEXCEPT 5333183c010cSMarshall Clow {return __x.owner_before(__y);} 5334183c010cSMarshall Clow template <class _Tp, class _Up> 5335183c010cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 533636bc7178SMarshall Clow bool operator()( weak_ptr<_Tp> const& __x, weak_ptr<_Up> const& __y) const _NOEXCEPT 5337183c010cSMarshall Clow {return __x.owner_before(__y);} 5338183c010cSMarshall Clow typedef void is_transparent; 5339183c010cSMarshall Clow}; 5340183c010cSMarshall Clow#endif 5341183c010cSMarshall Clow 53423e519524SHoward Hinnanttemplate<class _Tp> 5343e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS enable_shared_from_this 53443e519524SHoward Hinnant{ 53453e519524SHoward Hinnant mutable weak_ptr<_Tp> __weak_this_; 53463e519524SHoward Hinnantprotected: 5347c0937e8aSHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 53483739fe79SHoward Hinnant enable_shared_from_this() _NOEXCEPT {} 5349848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 53503739fe79SHoward Hinnant enable_shared_from_this(enable_shared_from_this const&) _NOEXCEPT {} 5351848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 53523739fe79SHoward Hinnant enable_shared_from_this& operator=(enable_shared_from_this const&) _NOEXCEPT 53533739fe79SHoward Hinnant {return *this;} 5354848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 53553e519524SHoward Hinnant ~enable_shared_from_this() {} 53563e519524SHoward Hinnantpublic: 5357848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 53583739fe79SHoward Hinnant shared_ptr<_Tp> shared_from_this() 53593739fe79SHoward Hinnant {return shared_ptr<_Tp>(__weak_this_);} 5360848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 53613739fe79SHoward Hinnant shared_ptr<_Tp const> shared_from_this() const 53623739fe79SHoward Hinnant {return shared_ptr<const _Tp>(__weak_this_);} 53633e519524SHoward Hinnant 536488f5bfdcSEric Fiselier#if _LIBCPP_STD_VER > 14 536588f5bfdcSEric Fiselier _LIBCPP_INLINE_VISIBILITY 536688f5bfdcSEric Fiselier weak_ptr<_Tp> weak_from_this() _NOEXCEPT 536788f5bfdcSEric Fiselier { return __weak_this_; } 536888f5bfdcSEric Fiselier 536988f5bfdcSEric Fiselier _LIBCPP_INLINE_VISIBILITY 537088f5bfdcSEric Fiselier weak_ptr<const _Tp> weak_from_this() const _NOEXCEPT 537188f5bfdcSEric Fiselier { return __weak_this_; } 537288f5bfdcSEric Fiselier#endif // _LIBCPP_STD_VER > 14 537388f5bfdcSEric Fiselier 53743e519524SHoward Hinnant template <class _Up> friend class shared_ptr; 53753e519524SHoward Hinnant}; 53763e519524SHoward Hinnant 5377d1803b6cSHoward Hinnanttemplate <class _Tp> 5378e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS hash<shared_ptr<_Tp> > 5379d1803b6cSHoward Hinnant{ 5380d1803b6cSHoward Hinnant typedef shared_ptr<_Tp> argument_type; 5381d1803b6cSHoward Hinnant typedef size_t result_type; 5382f9127593SEric Fiselier 5383848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 53843739fe79SHoward Hinnant result_type operator()(const argument_type& __ptr) const _NOEXCEPT 5385d1803b6cSHoward Hinnant { 5386d1803b6cSHoward Hinnant return hash<_Tp*>()(__ptr.get()); 5387d1803b6cSHoward Hinnant } 5388d1803b6cSHoward Hinnant}; 5389d1803b6cSHoward Hinnant 5390c003db1fSHoward Hinnanttemplate<class _CharT, class _Traits, class _Yp> 5391e3163f5aSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5392e3163f5aSHoward Hinnantbasic_ostream<_CharT, _Traits>& 5393c003db1fSHoward Hinnantoperator<<(basic_ostream<_CharT, _Traits>& __os, shared_ptr<_Yp> const& __p); 5394e3163f5aSHoward Hinnant 5395df93bad1SEric Fiselier 5396df93bad1SEric Fiselier#if !defined(_LIBCPP_HAS_NO_ATOMIC_HEADER) 5397d77851e8SHoward Hinnant 5398f0544c20SHoward Hinnantclass _LIBCPP_TYPE_VIS __sp_mut 5399d77851e8SHoward Hinnant{ 540054d333a6SHoward Hinnant void* __lx; 5401d77851e8SHoward Hinnantpublic: 5402d77851e8SHoward Hinnant void lock() _NOEXCEPT; 5403d77851e8SHoward Hinnant void unlock() _NOEXCEPT; 5404d77851e8SHoward Hinnant 5405d77851e8SHoward Hinnantprivate: 5406d77851e8SHoward Hinnant _LIBCPP_CONSTEXPR __sp_mut(void*) _NOEXCEPT; 5407d77851e8SHoward Hinnant __sp_mut(const __sp_mut&); 5408d77851e8SHoward Hinnant __sp_mut& operator=(const __sp_mut&); 5409d77851e8SHoward Hinnant 54106e41256fSHoward Hinnant friend _LIBCPP_FUNC_VIS __sp_mut& __get_sp_mut(const void*); 5411d77851e8SHoward Hinnant}; 5412d77851e8SHoward Hinnant 5413e9c66ad9SMehdi Amini_LIBCPP_FUNC_VIS _LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR 5414e9c66ad9SMehdi Amini__sp_mut& __get_sp_mut(const void*); 5415d77851e8SHoward Hinnant 5416d77851e8SHoward Hinnanttemplate <class _Tp> 5417d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5418d77851e8SHoward Hinnantbool 5419d77851e8SHoward Hinnantatomic_is_lock_free(const shared_ptr<_Tp>*) 5420d77851e8SHoward Hinnant{ 5421d77851e8SHoward Hinnant return false; 5422d77851e8SHoward Hinnant} 5423d77851e8SHoward Hinnant 5424d77851e8SHoward Hinnanttemplate <class _Tp> 5425e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR 5426d77851e8SHoward Hinnantshared_ptr<_Tp> 5427d77851e8SHoward Hinnantatomic_load(const shared_ptr<_Tp>* __p) 5428d77851e8SHoward Hinnant{ 5429d77851e8SHoward Hinnant __sp_mut& __m = __get_sp_mut(__p); 5430d77851e8SHoward Hinnant __m.lock(); 5431d77851e8SHoward Hinnant shared_ptr<_Tp> __q = *__p; 5432d77851e8SHoward Hinnant __m.unlock(); 5433d77851e8SHoward Hinnant return __q; 5434d77851e8SHoward Hinnant} 5435d77851e8SHoward Hinnant 5436d77851e8SHoward Hinnanttemplate <class _Tp> 5437d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5438e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR 5439d77851e8SHoward Hinnantshared_ptr<_Tp> 5440d77851e8SHoward Hinnantatomic_load_explicit(const shared_ptr<_Tp>* __p, memory_order) 5441d77851e8SHoward Hinnant{ 5442d77851e8SHoward Hinnant return atomic_load(__p); 5443d77851e8SHoward Hinnant} 5444d77851e8SHoward Hinnant 5445d77851e8SHoward Hinnanttemplate <class _Tp> 5446e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR 5447d77851e8SHoward Hinnantvoid 5448d77851e8SHoward Hinnantatomic_store(shared_ptr<_Tp>* __p, shared_ptr<_Tp> __r) 5449d77851e8SHoward Hinnant{ 5450d77851e8SHoward Hinnant __sp_mut& __m = __get_sp_mut(__p); 5451d77851e8SHoward Hinnant __m.lock(); 5452d77851e8SHoward Hinnant __p->swap(__r); 5453d77851e8SHoward Hinnant __m.unlock(); 5454d77851e8SHoward Hinnant} 5455d77851e8SHoward Hinnant 5456d77851e8SHoward Hinnanttemplate <class _Tp> 5457d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5458e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR 5459d77851e8SHoward Hinnantvoid 5460d77851e8SHoward Hinnantatomic_store_explicit(shared_ptr<_Tp>* __p, shared_ptr<_Tp> __r, memory_order) 5461d77851e8SHoward Hinnant{ 5462d77851e8SHoward Hinnant atomic_store(__p, __r); 5463d77851e8SHoward Hinnant} 5464d77851e8SHoward Hinnant 5465d77851e8SHoward Hinnanttemplate <class _Tp> 5466e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR 5467d77851e8SHoward Hinnantshared_ptr<_Tp> 5468d77851e8SHoward Hinnantatomic_exchange(shared_ptr<_Tp>* __p, shared_ptr<_Tp> __r) 5469d77851e8SHoward Hinnant{ 5470d77851e8SHoward Hinnant __sp_mut& __m = __get_sp_mut(__p); 5471d77851e8SHoward Hinnant __m.lock(); 5472d77851e8SHoward Hinnant __p->swap(__r); 5473d77851e8SHoward Hinnant __m.unlock(); 5474d77851e8SHoward Hinnant return __r; 5475d77851e8SHoward Hinnant} 5476d77851e8SHoward Hinnant 5477d77851e8SHoward Hinnanttemplate <class _Tp> 5478d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5479e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR 5480d77851e8SHoward Hinnantshared_ptr<_Tp> 5481d77851e8SHoward Hinnantatomic_exchange_explicit(shared_ptr<_Tp>* __p, shared_ptr<_Tp> __r, memory_order) 5482d77851e8SHoward Hinnant{ 5483d77851e8SHoward Hinnant return atomic_exchange(__p, __r); 5484d77851e8SHoward Hinnant} 5485d77851e8SHoward Hinnant 5486d77851e8SHoward Hinnanttemplate <class _Tp> 5487e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR 5488d77851e8SHoward Hinnantbool 5489d77851e8SHoward Hinnantatomic_compare_exchange_strong(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v, shared_ptr<_Tp> __w) 5490d77851e8SHoward Hinnant{ 54913379baebSMarshall Clow shared_ptr<_Tp> __temp; 5492d77851e8SHoward Hinnant __sp_mut& __m = __get_sp_mut(__p); 5493d77851e8SHoward Hinnant __m.lock(); 5494d77851e8SHoward Hinnant if (__p->__owner_equivalent(*__v)) 5495d77851e8SHoward Hinnant { 54963379baebSMarshall Clow _VSTD::swap(__temp, *__p); 5497d77851e8SHoward Hinnant *__p = __w; 5498d77851e8SHoward Hinnant __m.unlock(); 5499d77851e8SHoward Hinnant return true; 5500d77851e8SHoward Hinnant } 55013379baebSMarshall Clow _VSTD::swap(__temp, *__v); 5502d77851e8SHoward Hinnant *__v = *__p; 5503d77851e8SHoward Hinnant __m.unlock(); 5504d77851e8SHoward Hinnant return false; 5505d77851e8SHoward Hinnant} 5506d77851e8SHoward Hinnant 5507d77851e8SHoward Hinnanttemplate <class _Tp> 5508d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5509e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR 5510d77851e8SHoward Hinnantbool 5511d77851e8SHoward Hinnantatomic_compare_exchange_weak(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v, shared_ptr<_Tp> __w) 5512d77851e8SHoward Hinnant{ 5513d77851e8SHoward Hinnant return atomic_compare_exchange_strong(__p, __v, __w); 5514d77851e8SHoward Hinnant} 5515d77851e8SHoward Hinnant 5516d77851e8SHoward Hinnanttemplate <class _Tp> 5517d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5518e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR 5519d77851e8SHoward Hinnantbool 5520d77851e8SHoward Hinnantatomic_compare_exchange_strong_explicit(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v, 5521d77851e8SHoward Hinnant shared_ptr<_Tp> __w, memory_order, memory_order) 5522d77851e8SHoward Hinnant{ 5523d77851e8SHoward Hinnant return atomic_compare_exchange_strong(__p, __v, __w); 5524d77851e8SHoward Hinnant} 5525d77851e8SHoward Hinnant 5526d77851e8SHoward Hinnanttemplate <class _Tp> 5527d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5528e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR 5529d77851e8SHoward Hinnantbool 5530d77851e8SHoward Hinnantatomic_compare_exchange_weak_explicit(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v, 5531d77851e8SHoward Hinnant shared_ptr<_Tp> __w, memory_order, memory_order) 5532d77851e8SHoward Hinnant{ 5533d77851e8SHoward Hinnant return atomic_compare_exchange_weak(__p, __v, __w); 5534d77851e8SHoward Hinnant} 5535d77851e8SHoward Hinnant 5536df93bad1SEric Fiselier#endif // !defined(_LIBCPP_HAS_NO_ATOMIC_HEADER) 5537d77851e8SHoward Hinnant 55383e519524SHoward Hinnant//enum class 5539528600c4SEric Fiselier#if defined(_LIBCPP_ABI_POINTER_SAFETY_ENUM_TYPE) 5540528600c4SEric Fiselier# ifndef _LIBCPP_CXX03_LANG 5541528600c4SEric Fiselierenum class pointer_safety : unsigned char { 5542528600c4SEric Fiselier relaxed, 5543528600c4SEric Fiselier preferred, 5544528600c4SEric Fiselier strict 5545528600c4SEric Fiselier}; 5546528600c4SEric Fiselier# endif 5547528600c4SEric Fiselier#else 55486e41256fSHoward Hinnantstruct _LIBCPP_TYPE_VIS pointer_safety 55493e519524SHoward Hinnant{ 555054d333a6SHoward Hinnant enum __lx 55513e519524SHoward Hinnant { 55523e519524SHoward Hinnant relaxed, 55533e519524SHoward Hinnant preferred, 55543e519524SHoward Hinnant strict 55553e519524SHoward Hinnant }; 55563e519524SHoward Hinnant 555754d333a6SHoward Hinnant __lx __v_; 55583e519524SHoward Hinnant 5559848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 556076a01ea3SEric Fiselier pointer_safety() : __v_() {} 556176a01ea3SEric Fiselier 556276a01ea3SEric Fiselier _LIBCPP_INLINE_VISIBILITY 556354d333a6SHoward Hinnant pointer_safety(__lx __v) : __v_(__v) {} 5564848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 55653e519524SHoward Hinnant operator int() const {return __v_;} 55663e519524SHoward Hinnant}; 5567528600c4SEric Fiselier#endif 5568528600c4SEric Fiselier 5569528600c4SEric Fiselier#if !defined(_LIBCPP_ABI_POINTER_SAFETY_ENUM_TYPE) && \ 5570c8e84ff2SLouis Dionne defined(_LIBCPP_BUILDING_LIBRARY) 5571528600c4SEric Fiselier_LIBCPP_FUNC_VIS pointer_safety get_pointer_safety() _NOEXCEPT; 5572528600c4SEric Fiselier#else 5573528600c4SEric Fiselier// This function is only offered in C++03 under ABI v1. 5574528600c4SEric Fiselier# if !defined(_LIBCPP_ABI_POINTER_SAFETY_ENUM_TYPE) || !defined(_LIBCPP_CXX03_LANG) 5575528600c4SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 5576528600c4SEric Fiselierpointer_safety get_pointer_safety() _NOEXCEPT { 5577528600c4SEric Fiselier return pointer_safety::relaxed; 5578528600c4SEric Fiselier} 5579528600c4SEric Fiselier# endif 5580528600c4SEric Fiselier#endif 5581528600c4SEric Fiselier 55823e519524SHoward Hinnant 5583f0544c20SHoward Hinnant_LIBCPP_FUNC_VIS void declare_reachable(void* __p); 5584f0544c20SHoward Hinnant_LIBCPP_FUNC_VIS void declare_no_pointers(char* __p, size_t __n); 5585f0544c20SHoward Hinnant_LIBCPP_FUNC_VIS void undeclare_no_pointers(char* __p, size_t __n); 5586f0544c20SHoward Hinnant_LIBCPP_FUNC_VIS void* __undeclare_reachable(void* __p); 55873e519524SHoward Hinnant 55883e519524SHoward Hinnanttemplate <class _Tp> 55893e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 55903e519524SHoward Hinnant_Tp* 55913e519524SHoward Hinnantundeclare_reachable(_Tp* __p) 55923e519524SHoward Hinnant{ 55933e519524SHoward Hinnant return static_cast<_Tp*>(__undeclare_reachable(__p)); 55943e519524SHoward Hinnant} 55953e519524SHoward Hinnant 5596f0544c20SHoward Hinnant_LIBCPP_FUNC_VIS void* align(size_t __align, size_t __sz, void*& __ptr, size_t& __space); 55973e519524SHoward Hinnant 5598e3fbe143SMarshall Clow// --- Helper for container swap -- 5599e3fbe143SMarshall Clowtemplate <typename _Alloc> 560089dd1dd2SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 5601e3fbe143SMarshall Clowvoid __swap_allocator(_Alloc & __a1, _Alloc & __a2) 5602e3fbe143SMarshall Clow#if _LIBCPP_STD_VER >= 14 5603e3fbe143SMarshall Clow _NOEXCEPT 5604e3fbe143SMarshall Clow#else 5605e3fbe143SMarshall Clow _NOEXCEPT_(__is_nothrow_swappable<_Alloc>::value) 5606e3fbe143SMarshall Clow#endif 5607e3fbe143SMarshall Clow{ 5608e3fbe143SMarshall Clow __swap_allocator(__a1, __a2, 5609e3fbe143SMarshall Clow integral_constant<bool, _VSTD::allocator_traits<_Alloc>::propagate_on_container_swap::value>()); 5610e3fbe143SMarshall Clow} 5611e3fbe143SMarshall Clow 5612e3fbe143SMarshall Clowtemplate <typename _Alloc> 5613e3fbe143SMarshall Clow_LIBCPP_INLINE_VISIBILITY 5614e3fbe143SMarshall Clowvoid __swap_allocator(_Alloc & __a1, _Alloc & __a2, true_type) 5615e3fbe143SMarshall Clow#if _LIBCPP_STD_VER >= 14 5616e3fbe143SMarshall Clow _NOEXCEPT 5617e3fbe143SMarshall Clow#else 5618e3fbe143SMarshall Clow _NOEXCEPT_(__is_nothrow_swappable<_Alloc>::value) 5619e3fbe143SMarshall Clow#endif 5620e3fbe143SMarshall Clow{ 5621e3fbe143SMarshall Clow using _VSTD::swap; 5622e3fbe143SMarshall Clow swap(__a1, __a2); 5623e3fbe143SMarshall Clow} 5624e3fbe143SMarshall Clow 5625e3fbe143SMarshall Clowtemplate <typename _Alloc> 562689dd1dd2SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 5627e3fbe143SMarshall Clowvoid __swap_allocator(_Alloc &, _Alloc &, false_type) _NOEXCEPT {} 5628e3fbe143SMarshall Clow 56291378a5aeSMarshall Clowtemplate <typename _Alloc, typename _Traits=allocator_traits<_Alloc> > 56301378a5aeSMarshall Clowstruct __noexcept_move_assign_container : public integral_constant<bool, 56311378a5aeSMarshall Clow _Traits::propagate_on_container_move_assignment::value 56321378a5aeSMarshall Clow#if _LIBCPP_STD_VER > 14 56331378a5aeSMarshall Clow || _Traits::is_always_equal::value 56341378a5aeSMarshall Clow#else 56351378a5aeSMarshall Clow && is_nothrow_move_assignable<_Alloc>::value 56361378a5aeSMarshall Clow#endif 56371378a5aeSMarshall Clow > {}; 5638e3fbe143SMarshall Clow 5639dc3eb83dSMarshall Clow 5640dc3eb83dSMarshall Clow#ifndef _LIBCPP_HAS_NO_VARIADICS 5641dc3eb83dSMarshall Clowtemplate <class _Tp, class _Alloc> 5642dc3eb83dSMarshall Clowstruct __temp_value { 5643dc3eb83dSMarshall Clow typedef allocator_traits<_Alloc> _Traits; 5644dc3eb83dSMarshall Clow 5645dc3eb83dSMarshall Clow typename aligned_storage<sizeof(_Tp), alignof(_Tp)>::type __v; 5646dc3eb83dSMarshall Clow _Alloc &__a; 5647dc3eb83dSMarshall Clow 5648dc3eb83dSMarshall Clow _Tp *__addr() { return reinterpret_cast<_Tp *>(addressof(__v)); } 5649dc3eb83dSMarshall Clow _Tp & get() { return *__addr(); } 5650dc3eb83dSMarshall Clow 5651dc3eb83dSMarshall Clow template<class... _Args> 5652f11c00d7SPeter Collingbourne _LIBCPP_NO_CFI 5653f11c00d7SPeter Collingbourne __temp_value(_Alloc &__alloc, _Args&& ... __args) : __a(__alloc) { 5654f11c00d7SPeter Collingbourne _Traits::construct(__a, reinterpret_cast<_Tp*>(addressof(__v)), 5655f11c00d7SPeter Collingbourne _VSTD::forward<_Args>(__args)...); 5656f11c00d7SPeter Collingbourne } 5657dc3eb83dSMarshall Clow 5658dc3eb83dSMarshall Clow ~__temp_value() { _Traits::destroy(__a, __addr()); } 5659dc3eb83dSMarshall Clow }; 5660dc3eb83dSMarshall Clow#endif 5661dc3eb83dSMarshall Clow 566276b26852SMarshall Clowtemplate<typename _Alloc, typename = void, typename = void> 56630e22bf8cSMarshall Clowstruct __is_allocator : false_type {}; 56640e22bf8cSMarshall Clow 56650e22bf8cSMarshall Clowtemplate<typename _Alloc> 56660e22bf8cSMarshall Clowstruct __is_allocator<_Alloc, 566776b26852SMarshall Clow typename __void_t<typename _Alloc::value_type>::type, 566876b26852SMarshall Clow typename __void_t<decltype(_VSTD::declval<_Alloc&>().allocate(size_t(0)))>::type 566976b26852SMarshall Clow > 56700e22bf8cSMarshall Clow : true_type {}; 56710e22bf8cSMarshall Clow 56723e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD 56733e519524SHoward Hinnant 5674a016efb1SEric Fiselier_LIBCPP_POP_MACROS 5675a016efb1SEric Fiselier 56763e519524SHoward Hinnant#endif // _LIBCPP_MEMORY 5677