xref: /llvm-project-15.0.7/libcxx/include/memory (revision 2d0f1fa4)
13e519524SHoward Hinnant// -*- C++ -*-
23e519524SHoward Hinnant//===-------------------------- memory ------------------------------------===//
33e519524SHoward Hinnant//
457b08b09SChandler Carruth// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
557b08b09SChandler Carruth// See https://llvm.org/LICENSE.txt for license information.
657b08b09SChandler Carruth// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
73e519524SHoward Hinnant//
83e519524SHoward Hinnant//===----------------------------------------------------------------------===//
93e519524SHoward Hinnant
103e519524SHoward Hinnant#ifndef _LIBCPP_MEMORY
113e519524SHoward Hinnant#define _LIBCPP_MEMORY
123e519524SHoward Hinnant
133e519524SHoward Hinnant/*
143e519524SHoward Hinnant    memory synopsis
153e519524SHoward Hinnant
163e519524SHoward Hinnantnamespace std
173e519524SHoward Hinnant{
183e519524SHoward Hinnant
193e519524SHoward Hinnantstruct allocator_arg_t { };
2040a01d53SMarshall Clowinline constexpr allocator_arg_t allocator_arg = allocator_arg_t();
213e519524SHoward Hinnant
223e519524SHoward Hinnanttemplate <class T, class Alloc> struct uses_allocator;
233e519524SHoward Hinnant
243e519524SHoward Hinnanttemplate <class Ptr>
253e519524SHoward Hinnantstruct pointer_traits
263e519524SHoward Hinnant{
273e519524SHoward Hinnant    typedef Ptr pointer;
283e519524SHoward Hinnant    typedef <details> element_type;
293e519524SHoward Hinnant    typedef <details> difference_type;
303e519524SHoward Hinnant
313e519524SHoward Hinnant    template <class U> using rebind = <details>;
323e519524SHoward Hinnant
333e519524SHoward Hinnant    static pointer pointer_to(<details>);
343e519524SHoward Hinnant};
353e519524SHoward Hinnant
363739fe79SHoward Hinnanttemplate <class T>
373739fe79SHoward Hinnantstruct pointer_traits<T*>
383739fe79SHoward Hinnant{
393739fe79SHoward Hinnant    typedef T* pointer;
403739fe79SHoward Hinnant    typedef T element_type;
413739fe79SHoward Hinnant    typedef ptrdiff_t difference_type;
423739fe79SHoward Hinnant
433739fe79SHoward Hinnant    template <class U> using rebind = U*;
443739fe79SHoward Hinnant
4572720269SLouis Dionne    static pointer pointer_to(<details>) noexcept; // constexpr in C++20
463739fe79SHoward Hinnant};
473739fe79SHoward Hinnant
4832952747SEric Fiseliertemplate <class T> constexpr T* to_address(T* p) noexcept; // C++20
49f6326736SMarek Kurdejtemplate <class Ptr> constexpr auto to_address(const Ptr& p) noexcept; // C++20
5032952747SEric Fiselier
513e519524SHoward Hinnanttemplate <class Alloc>
523e519524SHoward Hinnantstruct allocator_traits
533e519524SHoward Hinnant{
543e519524SHoward Hinnant    typedef Alloc                        allocator_type;
553e519524SHoward Hinnant    typedef typename allocator_type::value_type
563e519524SHoward Hinnant                                         value_type;
573e519524SHoward Hinnant
583e519524SHoward Hinnant    typedef Alloc::pointer | value_type* pointer;
593e519524SHoward Hinnant    typedef Alloc::const_pointer
603e519524SHoward Hinnant          | pointer_traits<pointer>::rebind<const value_type>
613e519524SHoward Hinnant                                         const_pointer;
623e519524SHoward Hinnant    typedef Alloc::void_pointer
633e519524SHoward Hinnant          | pointer_traits<pointer>::rebind<void>
643e519524SHoward Hinnant                                         void_pointer;
653e519524SHoward Hinnant    typedef Alloc::const_void_pointer
663e519524SHoward Hinnant          | pointer_traits<pointer>::rebind<const void>
673e519524SHoward Hinnant                                         const_void_pointer;
683e519524SHoward Hinnant    typedef Alloc::difference_type
69a4a1ef1fSHoward Hinnant          | pointer_traits<pointer>::difference_type
70a4a1ef1fSHoward Hinnant                                         difference_type;
71a4a1ef1fSHoward Hinnant    typedef Alloc::size_type
72a4a1ef1fSHoward Hinnant          | make_unsigned<difference_type>::type
73a4a1ef1fSHoward Hinnant                                         size_type;
743e519524SHoward Hinnant    typedef Alloc::propagate_on_container_copy_assignment
753e519524SHoward Hinnant          | false_type                   propagate_on_container_copy_assignment;
763e519524SHoward Hinnant    typedef Alloc::propagate_on_container_move_assignment
773e519524SHoward Hinnant          | false_type                   propagate_on_container_move_assignment;
783e519524SHoward Hinnant    typedef Alloc::propagate_on_container_swap
793e519524SHoward Hinnant          | false_type                   propagate_on_container_swap;
8031a47313SMarshall Clow    typedef Alloc::is_always_equal
8131a47313SMarshall Clow          | is_empty                     is_always_equal;
823e519524SHoward Hinnant
835b1e5b43SMichael Park    template <class T> using rebind_alloc  = Alloc::rebind<T>::other | Alloc<T, Args...>;
843e519524SHoward Hinnant    template <class T> using rebind_traits = allocator_traits<rebind_alloc<T>>;
853e519524SHoward Hinnant
860724f8bfSLouis Dionne    static pointer allocate(allocator_type& a, size_type n);                          // constexpr and [[nodiscard]] in C++20
870724f8bfSLouis Dionne    static pointer allocate(allocator_type& a, size_type n, const_void_pointer hint); // constexpr and [[nodiscard]] in C++20
883e519524SHoward Hinnant
890724f8bfSLouis Dionne    static void deallocate(allocator_type& a, pointer p, size_type n) noexcept; // constexpr in C++20
903e519524SHoward Hinnant
913e519524SHoward Hinnant    template <class T, class... Args>
920724f8bfSLouis Dionne    static void construct(allocator_type& a, T* p, Args&&... args); // constexpr in C++20
933e519524SHoward Hinnant
943e519524SHoward Hinnant    template <class T>
950724f8bfSLouis Dionne    static void destroy(allocator_type& a, T* p); // constexpr in C++20
963e519524SHoward Hinnant
970724f8bfSLouis Dionne    static size_type max_size(const allocator_type& a); // noexcept in C++14, constexpr in C++20
980724f8bfSLouis Dionne    static allocator_type select_on_container_copy_construction(const allocator_type& a); // constexpr in C++20
993e519524SHoward Hinnant};
1003e519524SHoward Hinnant
1013e519524SHoward Hinnanttemplate <>
1025b1e5b43SMichael Parkclass allocator<void> // deprecated in C++17, removed in C++20
1033e519524SHoward Hinnant{
1043e519524SHoward Hinnantpublic:
1053e519524SHoward Hinnant    typedef void*                                 pointer;
1063e519524SHoward Hinnant    typedef const void*                           const_pointer;
1073e519524SHoward Hinnant    typedef void                                  value_type;
1083e519524SHoward Hinnant
1093e519524SHoward Hinnant    template <class _Up> struct rebind {typedef allocator<_Up> other;};
1103e519524SHoward Hinnant};
1113e519524SHoward Hinnant
1123e519524SHoward Hinnanttemplate <class T>
1133e519524SHoward Hinnantclass allocator
1143e519524SHoward Hinnant{
1153e519524SHoward Hinnantpublic:
116316d336dSLouis Dionne    typedef size_t    size_type;
117316d336dSLouis Dionne    typedef ptrdiff_t difference_type;
1185b1e5b43SMichael Park    typedef T*        pointer;                           // deprecated in C++17, removed in C++20
1195b1e5b43SMichael Park    typedef const T*  const_pointer;                     // deprecated in C++17, removed in C++20
1205b1e5b43SMichael Park    typedef typename add_lvalue_reference<T>::type
1215b1e5b43SMichael Park                      reference;                         // deprecated in C++17, removed in C++20
1225b1e5b43SMichael Park    typedef typename add_lvalue_reference<const T>::type
1235b1e5b43SMichael Park                      const_reference;                   // deprecated in C++17, removed in C++20
1245b1e5b43SMichael Park
1253e519524SHoward Hinnant    typedef T         value_type;
1263e519524SHoward Hinnant
1275b1e5b43SMichael Park    template <class U> struct rebind {typedef allocator<U> other;}; // deprecated in C++17, removed in C++20
1285b1e5b43SMichael Park
1295b1e5b43SMichael Park    typedef true_type propagate_on_container_move_assignment;
1305b1e5b43SMichael Park    typedef true_type is_always_equal;
1313e519524SHoward Hinnant
132e0742c4aSMarshall Clow    constexpr allocator() noexcept;                      // constexpr in C++20
133e0742c4aSMarshall Clow    constexpr allocator(const allocator&) noexcept;      // constexpr in C++20
134e0742c4aSMarshall Clow    template <class U>
135e0742c4aSMarshall Clow      constexpr allocator(const allocator<U>&) noexcept; // constexpr in C++20
1360724f8bfSLouis Dionne    ~allocator();                                        // constexpr in C++20
1375b1e5b43SMichael Park    pointer address(reference x) const noexcept;             // deprecated in C++17, removed in C++20
1385b1e5b43SMichael Park    const_pointer address(const_reference x) const noexcept; // deprecated in C++17, removed in C++20
1395b1e5b43SMichael Park    T* allocate(size_t n, const void* hint);          // deprecated in C++17, removed in C++20
1400724f8bfSLouis Dionne    T* allocate(size_t n);                              // constexpr in C++20
1410724f8bfSLouis Dionne    void deallocate(T* p, size_t n) noexcept;           // constexpr in C++20
1425b1e5b43SMichael Park    size_type max_size() const noexcept;              // deprecated in C++17, removed in C++20
1433739fe79SHoward Hinnant    template<class U, class... Args>
1445b1e5b43SMichael Park        void construct(U* p, Args&&... args);         // deprecated in C++17, removed in C++20
1453739fe79SHoward Hinnant    template <class U>
1465b1e5b43SMichael Park        void destroy(U* p);                           // deprecated in C++17, removed in C++20
1473e519524SHoward Hinnant};
1483e519524SHoward Hinnant
1493e519524SHoward Hinnanttemplate <class T, class U>
1500724f8bfSLouis Dionnebool operator==(const allocator<T>&, const allocator<U>&) noexcept; // constexpr in C++20
1513e519524SHoward Hinnant
1523e519524SHoward Hinnanttemplate <class T, class U>
1530724f8bfSLouis Dionnebool operator!=(const allocator<T>&, const allocator<U>&) noexcept; // constexpr in C++20
1543e519524SHoward Hinnant
1553e519524SHoward Hinnanttemplate <class OutputIterator, class T>
1563e519524SHoward Hinnantclass raw_storage_iterator
1573e519524SHoward Hinnant    : public iterator<output_iterator_tag,
1583e519524SHoward Hinnant                      T,                               // purposefully not C++03
1593e519524SHoward Hinnant                      ptrdiff_t,                       // purposefully not C++03
1603e519524SHoward Hinnant                      T*,                              // purposefully not C++03
1613e519524SHoward Hinnant                      raw_storage_iterator&>           // purposefully not C++03
1623e519524SHoward Hinnant{
1633e519524SHoward Hinnantpublic:
1643e519524SHoward Hinnant    explicit raw_storage_iterator(OutputIterator x);
1653e519524SHoward Hinnant    raw_storage_iterator& operator*();
1663e519524SHoward Hinnant    raw_storage_iterator& operator=(const T& element);
1673e519524SHoward Hinnant    raw_storage_iterator& operator++();
1683e519524SHoward Hinnant    raw_storage_iterator  operator++(int);
1693e519524SHoward Hinnant};
1703e519524SHoward Hinnant
1713739fe79SHoward Hinnanttemplate <class T> pair<T*,ptrdiff_t> get_temporary_buffer(ptrdiff_t n) noexcept;
1723739fe79SHoward Hinnanttemplate <class T> void               return_temporary_buffer(T* p) noexcept;
1733739fe79SHoward Hinnant
1743739fe79SHoward Hinnanttemplate <class T> T* addressof(T& r) noexcept;
1751c7fe126SMarshall Clowtemplate <class T> T* addressof(const T&& r) noexcept = delete;
1763e519524SHoward Hinnant
1773e519524SHoward Hinnanttemplate <class InputIterator, class ForwardIterator>
1783e519524SHoward HinnantForwardIterator
1793e519524SHoward Hinnantuninitialized_copy(InputIterator first, InputIterator last, ForwardIterator result);
1803e519524SHoward Hinnant
1813739fe79SHoward Hinnanttemplate <class InputIterator, class Size, class ForwardIterator>
1823739fe79SHoward HinnantForwardIterator
1833739fe79SHoward Hinnantuninitialized_copy_n(InputIterator first, Size n, ForwardIterator result);
1843739fe79SHoward Hinnant
1853e519524SHoward Hinnanttemplate <class ForwardIterator, class T>
1863e519524SHoward Hinnantvoid uninitialized_fill(ForwardIterator first, ForwardIterator last, const T& x);
1873e519524SHoward Hinnant
1883e519524SHoward Hinnanttemplate <class ForwardIterator, class Size, class T>
18948d05bd2SHoward HinnantForwardIterator
19048d05bd2SHoward Hinnantuninitialized_fill_n(ForwardIterator first, Size n, const T& x);
1913e519524SHoward Hinnant
1920724f8bfSLouis Dionnetemplate <class T, class ...Args>
1930724f8bfSLouis Dionneconstexpr T* construct_at(T* location, Args&& ...args); // since C++20
1940724f8bfSLouis Dionne
195e4d9c316SEric Fiseliertemplate <class T>
1960724f8bfSLouis Dionnevoid destroy_at(T* location); // constexpr in C++20
197e4d9c316SEric Fiselier
198e4d9c316SEric Fiseliertemplate <class ForwardIterator>
1990724f8bfSLouis Dionnevoid destroy(ForwardIterator first, ForwardIterator last); // constexpr in C++20
200e4d9c316SEric Fiselier
201e4d9c316SEric Fiseliertemplate <class ForwardIterator, class Size>
2020724f8bfSLouis DionneForwardIterator destroy_n(ForwardIterator first, Size n); // constexpr in C++20
203e4d9c316SEric Fiselier
204e4d9c316SEric Fiseliertemplate <class InputIterator, class ForwardIterator>
205e4d9c316SEric Fiselier ForwardIterator uninitialized_move(InputIterator first, InputIterator last, ForwardIterator result);
206e4d9c316SEric Fiselier
207e4d9c316SEric Fiseliertemplate <class InputIterator, class Size, class ForwardIterator>
208e4d9c316SEric Fiselier pair<InputIterator,ForwardIterator> uninitialized_move_n(InputIterator first, Size n, ForwardIterator result);
209e4d9c316SEric Fiselier
210e4d9c316SEric Fiseliertemplate <class ForwardIterator>
211e4d9c316SEric Fiselier void uninitialized_value_construct(ForwardIterator first, ForwardIterator last);
212e4d9c316SEric Fiselier
213e4d9c316SEric Fiseliertemplate <class ForwardIterator, class Size>
214e4d9c316SEric Fiselier ForwardIterator uninitialized_value_construct_n(ForwardIterator first, Size n);
215e4d9c316SEric Fiselier
216e4d9c316SEric Fiseliertemplate <class ForwardIterator>
217e4d9c316SEric Fiselier void uninitialized_default_construct(ForwardIterator first, ForwardIterator last);
218e4d9c316SEric Fiselier
219e4d9c316SEric Fiseliertemplate <class ForwardIterator, class Size>
220e4d9c316SEric Fiselier ForwardIterator uninitialized_default_construct_n(ForwardIterator first, Size n);
221e4d9c316SEric Fiselier
222ea5cd3b4SLouis Dionnetemplate <class Y> struct auto_ptr_ref {};      // deprecated in C++11, removed in C++17
2233e519524SHoward Hinnant
2243e519524SHoward Hinnanttemplate<class X>
225ea5cd3b4SLouis Dionneclass auto_ptr                                  // deprecated in C++11, removed in C++17
2263e519524SHoward Hinnant{
2273e519524SHoward Hinnantpublic:
2283e519524SHoward Hinnant    typedef X element_type;
2293e519524SHoward Hinnant
2303e519524SHoward Hinnant    explicit auto_ptr(X* p =0) throw();
2313e519524SHoward Hinnant    auto_ptr(auto_ptr&) throw();
2323e519524SHoward Hinnant    template<class Y> auto_ptr(auto_ptr<Y>&) throw();
2333e519524SHoward Hinnant    auto_ptr& operator=(auto_ptr&) throw();
2343e519524SHoward Hinnant    template<class Y> auto_ptr& operator=(auto_ptr<Y>&) throw();
2353e519524SHoward Hinnant    auto_ptr& operator=(auto_ptr_ref<X> r) throw();
2363e519524SHoward Hinnant    ~auto_ptr() throw();
2373e519524SHoward Hinnant
2383e519524SHoward Hinnant    typename add_lvalue_reference<X>::type operator*() const throw();
2393e519524SHoward Hinnant    X* operator->() const throw();
2403e519524SHoward Hinnant    X* get() const throw();
2413e519524SHoward Hinnant    X* release() throw();
2423e519524SHoward Hinnant    void reset(X* p =0) throw();
2433e519524SHoward Hinnant
2443e519524SHoward Hinnant    auto_ptr(auto_ptr_ref<X>) throw();
2453e519524SHoward Hinnant    template<class Y> operator auto_ptr_ref<Y>() throw();
2463e519524SHoward Hinnant    template<class Y> operator auto_ptr<Y>() throw();
2473e519524SHoward Hinnant};
2483e519524SHoward Hinnant
24920cc2a42SHoward Hinnanttemplate <class T>
25020cc2a42SHoward Hinnantstruct default_delete
25120cc2a42SHoward Hinnant{
2523739fe79SHoward Hinnant    constexpr default_delete() noexcept = default;
2533739fe79SHoward Hinnant    template <class U> default_delete(const default_delete<U>&) noexcept;
25420cc2a42SHoward Hinnant
2553739fe79SHoward Hinnant    void operator()(T*) const noexcept;
25620cc2a42SHoward Hinnant};
25720cc2a42SHoward Hinnant
25820cc2a42SHoward Hinnanttemplate <class T>
25920cc2a42SHoward Hinnantstruct default_delete<T[]>
26020cc2a42SHoward Hinnant{
2613739fe79SHoward Hinnant    constexpr default_delete() noexcept = default;
2623739fe79SHoward Hinnant    void operator()(T*) const noexcept;
26320cc2a42SHoward Hinnant    template <class U> void operator()(U*) const = delete;
26420cc2a42SHoward Hinnant};
26520cc2a42SHoward Hinnant
26620cc2a42SHoward Hinnanttemplate <class T, class D = default_delete<T>>
26720cc2a42SHoward Hinnantclass unique_ptr
26820cc2a42SHoward Hinnant{
26920cc2a42SHoward Hinnantpublic:
27020cc2a42SHoward Hinnant    typedef see below pointer;
27120cc2a42SHoward Hinnant    typedef T element_type;
27220cc2a42SHoward Hinnant    typedef D deleter_type;
27320cc2a42SHoward Hinnant
27420cc2a42SHoward Hinnant    // constructors
2753739fe79SHoward Hinnant    constexpr unique_ptr() noexcept;
2763739fe79SHoward Hinnant    explicit unique_ptr(pointer p) noexcept;
2773739fe79SHoward Hinnant    unique_ptr(pointer p, see below d1) noexcept;
2783739fe79SHoward Hinnant    unique_ptr(pointer p, see below d2) noexcept;
2793739fe79SHoward Hinnant    unique_ptr(unique_ptr&& u) noexcept;
2803739fe79SHoward Hinnant    unique_ptr(nullptr_t) noexcept : unique_ptr() { }
28120cc2a42SHoward Hinnant    template <class U, class E>
2823739fe79SHoward Hinnant        unique_ptr(unique_ptr<U, E>&& u) noexcept;
28320cc2a42SHoward Hinnant    template <class U>
284e67179bcSMarshall Clow        unique_ptr(auto_ptr<U>&& u) noexcept;       // removed in C++17
28520cc2a42SHoward Hinnant
28620cc2a42SHoward Hinnant    // destructor
28720cc2a42SHoward Hinnant    ~unique_ptr();
28820cc2a42SHoward Hinnant
28920cc2a42SHoward Hinnant    // assignment
2903739fe79SHoward Hinnant    unique_ptr& operator=(unique_ptr&& u) noexcept;
2913739fe79SHoward Hinnant    template <class U, class E> unique_ptr& operator=(unique_ptr<U, E>&& u) noexcept;
2923739fe79SHoward Hinnant    unique_ptr& operator=(nullptr_t) noexcept;
29320cc2a42SHoward Hinnant
29420cc2a42SHoward Hinnant    // observers
29520cc2a42SHoward Hinnant    typename add_lvalue_reference<T>::type operator*() const;
2963739fe79SHoward Hinnant    pointer operator->() const noexcept;
2973739fe79SHoward Hinnant    pointer get() const noexcept;
2983739fe79SHoward Hinnant    deleter_type& get_deleter() noexcept;
2993739fe79SHoward Hinnant    const deleter_type& get_deleter() const noexcept;
3003739fe79SHoward Hinnant    explicit operator bool() const noexcept;
30120cc2a42SHoward Hinnant
30220cc2a42SHoward Hinnant    // modifiers
3033739fe79SHoward Hinnant    pointer release() noexcept;
3043739fe79SHoward Hinnant    void reset(pointer p = pointer()) noexcept;
3053739fe79SHoward Hinnant    void swap(unique_ptr& u) noexcept;
30620cc2a42SHoward Hinnant};
30720cc2a42SHoward Hinnant
30820cc2a42SHoward Hinnanttemplate <class T, class D>
30920cc2a42SHoward Hinnantclass unique_ptr<T[], D>
31020cc2a42SHoward Hinnant{
31120cc2a42SHoward Hinnantpublic:
31220cc2a42SHoward Hinnant    typedef implementation-defined pointer;
31320cc2a42SHoward Hinnant    typedef T element_type;
31420cc2a42SHoward Hinnant    typedef D deleter_type;
31520cc2a42SHoward Hinnant
31620cc2a42SHoward Hinnant    // constructors
3173739fe79SHoward Hinnant    constexpr unique_ptr() noexcept;
3183739fe79SHoward Hinnant    explicit unique_ptr(pointer p) noexcept;
3193739fe79SHoward Hinnant    unique_ptr(pointer p, see below d) noexcept;
3203739fe79SHoward Hinnant    unique_ptr(pointer p, see below d) noexcept;
3213739fe79SHoward Hinnant    unique_ptr(unique_ptr&& u) noexcept;
3223739fe79SHoward Hinnant    unique_ptr(nullptr_t) noexcept : unique_ptr() { }
32320cc2a42SHoward Hinnant
32420cc2a42SHoward Hinnant    // destructor
325b3371f6fSHoward Hinnant    ~unique_ptr();
32620cc2a42SHoward Hinnant
32720cc2a42SHoward Hinnant    // assignment
3283739fe79SHoward Hinnant    unique_ptr& operator=(unique_ptr&& u) noexcept;
3293739fe79SHoward Hinnant    unique_ptr& operator=(nullptr_t) noexcept;
33020cc2a42SHoward Hinnant
33120cc2a42SHoward Hinnant    // observers
33220cc2a42SHoward Hinnant    T& operator[](size_t i) const;
3333739fe79SHoward Hinnant    pointer get() const noexcept;
3343739fe79SHoward Hinnant    deleter_type& get_deleter() noexcept;
3353739fe79SHoward Hinnant    const deleter_type& get_deleter() const noexcept;
3363739fe79SHoward Hinnant    explicit operator bool() const noexcept;
33720cc2a42SHoward Hinnant
33820cc2a42SHoward Hinnant    // modifiers
3393739fe79SHoward Hinnant    pointer release() noexcept;
3403739fe79SHoward Hinnant    void reset(pointer p = pointer()) noexcept;
3413739fe79SHoward Hinnant    void reset(nullptr_t) noexcept;
34220cc2a42SHoward Hinnant  template <class U> void reset(U) = delete;
3433739fe79SHoward Hinnant    void swap(unique_ptr& u) noexcept;
34420cc2a42SHoward Hinnant};
34520cc2a42SHoward Hinnant
34620cc2a42SHoward Hinnanttemplate <class T, class D>
3473739fe79SHoward Hinnant    void swap(unique_ptr<T, D>& x, unique_ptr<T, D>& y) noexcept;
34820cc2a42SHoward Hinnant
34920cc2a42SHoward Hinnanttemplate <class T1, class D1, class T2, class D2>
35020cc2a42SHoward Hinnant    bool operator==(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y);
35120cc2a42SHoward Hinnanttemplate <class T1, class D1, class T2, class D2>
35220cc2a42SHoward Hinnant    bool operator!=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y);
35320cc2a42SHoward Hinnanttemplate <class T1, class D1, class T2, class D2>
35420cc2a42SHoward Hinnant    bool operator<(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y);
35520cc2a42SHoward Hinnanttemplate <class T1, class D1, class T2, class D2>
35620cc2a42SHoward Hinnant    bool operator<=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y);
35720cc2a42SHoward Hinnanttemplate <class T1, class D1, class T2, class D2>
35820cc2a42SHoward Hinnant    bool operator>(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y);
35920cc2a42SHoward Hinnanttemplate <class T1, class D1, class T2, class D2>
36020cc2a42SHoward Hinnant    bool operator>=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y);
36120cc2a42SHoward Hinnant
3623739fe79SHoward Hinnanttemplate <class T, class D>
3633739fe79SHoward Hinnant    bool operator==(const unique_ptr<T, D>& x, nullptr_t) noexcept;
3643739fe79SHoward Hinnanttemplate <class T, class D>
3653739fe79SHoward Hinnant    bool operator==(nullptr_t, const unique_ptr<T, D>& y) noexcept;
3663739fe79SHoward Hinnanttemplate <class T, class D>
3673739fe79SHoward Hinnant    bool operator!=(const unique_ptr<T, D>& x, nullptr_t) noexcept;
3683739fe79SHoward Hinnanttemplate <class T, class D>
3693739fe79SHoward Hinnant    bool operator!=(nullptr_t, const unique_ptr<T, D>& y) noexcept;
3703739fe79SHoward Hinnant
3713739fe79SHoward Hinnanttemplate <class T, class D>
3723739fe79SHoward Hinnant    bool operator<(const unique_ptr<T, D>& x, nullptr_t);
3733739fe79SHoward Hinnanttemplate <class T, class D>
3743739fe79SHoward Hinnant    bool operator<(nullptr_t, const unique_ptr<T, D>& y);
3753739fe79SHoward Hinnanttemplate <class T, class D>
3763739fe79SHoward Hinnant    bool operator<=(const unique_ptr<T, D>& x, nullptr_t);
3773739fe79SHoward Hinnanttemplate <class T, class D>
3783739fe79SHoward Hinnant    bool operator<=(nullptr_t, const unique_ptr<T, D>& y);
3793739fe79SHoward Hinnanttemplate <class T, class D>
3803739fe79SHoward Hinnant    bool operator>(const unique_ptr<T, D>& x, nullptr_t);
3813739fe79SHoward Hinnanttemplate <class T, class D>
3823739fe79SHoward Hinnant    bool operator>(nullptr_t, const unique_ptr<T, D>& y);
3833739fe79SHoward Hinnanttemplate <class T, class D>
3843739fe79SHoward Hinnant    bool operator>=(const unique_ptr<T, D>& x, nullptr_t);
3853739fe79SHoward Hinnanttemplate <class T, class D>
3863739fe79SHoward Hinnant    bool operator>=(nullptr_t, const unique_ptr<T, D>& y);
3873739fe79SHoward Hinnant
38820cc2a42SHoward Hinnantclass bad_weak_ptr
38920cc2a42SHoward Hinnant    : public std::exception
39020cc2a42SHoward Hinnant{
3913739fe79SHoward Hinnant    bad_weak_ptr() noexcept;
39220cc2a42SHoward Hinnant};
39320cc2a42SHoward Hinnant
39428d8ba5fSMarshall Clowtemplate<class T, class... Args> unique_ptr<T> make_unique(Args&&... args);     // C++14
39528d8ba5fSMarshall Clowtemplate<class T>                unique_ptr<T> make_unique(size_t n);           // C++14
39628d8ba5fSMarshall Clowtemplate<class T, class... Args> unspecified   make_unique(Args&&...) = delete; // C++14, T == U[N]
39728d8ba5fSMarshall Clow
39848f36539SMarshall Clowtemplate<class E, class T, class Y, class D>
39948f36539SMarshall Clow    basic_ostream<E, T>& operator<< (basic_ostream<E, T>& os, unique_ptr<Y, D> const& p);
40048f36539SMarshall Clow
40120cc2a42SHoward Hinnanttemplate<class T>
40220cc2a42SHoward Hinnantclass shared_ptr
40320cc2a42SHoward Hinnant{
40420cc2a42SHoward Hinnantpublic:
40520cc2a42SHoward Hinnant    typedef T element_type;
40668436a9bSEric Fiselier    typedef weak_ptr<T> weak_type; // C++17
40720cc2a42SHoward Hinnant
40820cc2a42SHoward Hinnant    // constructors:
4093739fe79SHoward Hinnant    constexpr shared_ptr() noexcept;
41020cc2a42SHoward Hinnant    template<class Y> explicit shared_ptr(Y* p);
41120cc2a42SHoward Hinnant    template<class Y, class D> shared_ptr(Y* p, D d);
41220cc2a42SHoward Hinnant    template<class Y, class D, class A> shared_ptr(Y* p, D d, A a);
41320cc2a42SHoward Hinnant    template <class D> shared_ptr(nullptr_t p, D d);
41420cc2a42SHoward Hinnant    template <class D, class A> shared_ptr(nullptr_t p, D d, A a);
4153739fe79SHoward Hinnant    template<class Y> shared_ptr(const shared_ptr<Y>& r, T *p) noexcept;
4163739fe79SHoward Hinnant    shared_ptr(const shared_ptr& r) noexcept;
4173739fe79SHoward Hinnant    template<class Y> shared_ptr(const shared_ptr<Y>& r) noexcept;
4183739fe79SHoward Hinnant    shared_ptr(shared_ptr&& r) noexcept;
4193739fe79SHoward Hinnant    template<class Y> shared_ptr(shared_ptr<Y>&& r) noexcept;
42020cc2a42SHoward Hinnant    template<class Y> explicit shared_ptr(const weak_ptr<Y>& r);
421e67179bcSMarshall Clow    template<class Y> shared_ptr(auto_ptr<Y>&& r);          // removed in C++17
42220cc2a42SHoward Hinnant    template <class Y, class D> shared_ptr(unique_ptr<Y, D>&& r);
42320cc2a42SHoward Hinnant    shared_ptr(nullptr_t) : shared_ptr() { }
42420cc2a42SHoward Hinnant
42520cc2a42SHoward Hinnant    // destructor:
42620cc2a42SHoward Hinnant    ~shared_ptr();
42720cc2a42SHoward Hinnant
42820cc2a42SHoward Hinnant    // assignment:
4293739fe79SHoward Hinnant    shared_ptr& operator=(const shared_ptr& r) noexcept;
4303739fe79SHoward Hinnant    template<class Y> shared_ptr& operator=(const shared_ptr<Y>& r) noexcept;
4313739fe79SHoward Hinnant    shared_ptr& operator=(shared_ptr&& r) noexcept;
43220cc2a42SHoward Hinnant    template<class Y> shared_ptr& operator=(shared_ptr<Y>&& r);
433e67179bcSMarshall Clow    template<class Y> shared_ptr& operator=(auto_ptr<Y>&& r); // removed in C++17
43420cc2a42SHoward Hinnant    template <class Y, class D> shared_ptr& operator=(unique_ptr<Y, D>&& r);
43520cc2a42SHoward Hinnant
43620cc2a42SHoward Hinnant    // modifiers:
4373739fe79SHoward Hinnant    void swap(shared_ptr& r) noexcept;
4383739fe79SHoward Hinnant    void reset() noexcept;
43920cc2a42SHoward Hinnant    template<class Y> void reset(Y* p);
44020cc2a42SHoward Hinnant    template<class Y, class D> void reset(Y* p, D d);
44120cc2a42SHoward Hinnant    template<class Y, class D, class A> void reset(Y* p, D d, A a);
44220cc2a42SHoward Hinnant
4433739fe79SHoward Hinnant    // observers:
4443739fe79SHoward Hinnant    T* get() const noexcept;
4453739fe79SHoward Hinnant    T& operator*() const noexcept;
4463739fe79SHoward Hinnant    T* operator->() const noexcept;
4473739fe79SHoward Hinnant    long use_count() const noexcept;
4483739fe79SHoward Hinnant    bool unique() const noexcept;
4493739fe79SHoward Hinnant    explicit operator bool() const noexcept;
45036bc7178SMarshall Clow    template<class U> bool owner_before(shared_ptr<U> const& b) const noexcept;
45136bc7178SMarshall Clow    template<class U> bool owner_before(weak_ptr<U> const& b) const noexcept;
45220cc2a42SHoward Hinnant};
45320cc2a42SHoward Hinnant
45483564056SLogan Smithtemplate<class T>
45583564056SLogan Smithshared_ptr(weak_ptr<T>) -> shared_ptr<T>;
45683564056SLogan Smithtemplate<class T, class D>
45783564056SLogan Smithshared_ptr(unique_ptr<T, D>) -> shared_ptr<T>;
45883564056SLogan Smith
45920cc2a42SHoward Hinnant// shared_ptr comparisons:
46020cc2a42SHoward Hinnanttemplate<class T, class U>
4613739fe79SHoward Hinnant    bool operator==(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept;
46220cc2a42SHoward Hinnanttemplate<class T, class U>
4633739fe79SHoward Hinnant    bool operator!=(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept;
46420cc2a42SHoward Hinnanttemplate<class T, class U>
4653739fe79SHoward Hinnant    bool operator<(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept;
46620cc2a42SHoward Hinnanttemplate<class T, class U>
4673739fe79SHoward Hinnant    bool operator>(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept;
46820cc2a42SHoward Hinnanttemplate<class T, class U>
4693739fe79SHoward Hinnant    bool operator<=(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept;
47020cc2a42SHoward Hinnanttemplate<class T, class U>
4713739fe79SHoward Hinnant    bool operator>=(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept;
4723739fe79SHoward Hinnant
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 Hinnantbool operator<(nullptr_t, const shared_ptr<T>& y) noexcept;
4853739fe79SHoward Hinnanttemplate <class T>
4863739fe79SHoward Hinnant    bool operator<=(const shared_ptr<T>& x, nullptr_t) noexcept;
4873739fe79SHoward Hinnanttemplate <class T>
4883739fe79SHoward Hinnant    bool operator<=(nullptr_t, const shared_ptr<T>& y) noexcept;
4893739fe79SHoward Hinnanttemplate <class T>
4903739fe79SHoward Hinnant    bool operator>(const shared_ptr<T>& x, nullptr_t) noexcept;
4913739fe79SHoward Hinnanttemplate <class T>
4923739fe79SHoward Hinnant    bool operator>(nullptr_t, const shared_ptr<T>& y) noexcept;
4933739fe79SHoward Hinnanttemplate <class T>
4943739fe79SHoward Hinnant    bool operator>=(const shared_ptr<T>& x, nullptr_t) noexcept;
4953739fe79SHoward Hinnanttemplate <class T>
4963739fe79SHoward Hinnant    bool operator>=(nullptr_t, const shared_ptr<T>& y) noexcept;
49720cc2a42SHoward Hinnant
49820cc2a42SHoward Hinnant// shared_ptr specialized algorithms:
4993739fe79SHoward Hinnanttemplate<class T> void swap(shared_ptr<T>& a, shared_ptr<T>& b) noexcept;
50020cc2a42SHoward Hinnant
50120cc2a42SHoward Hinnant// shared_ptr casts:
50220cc2a42SHoward Hinnanttemplate<class T, class U>
5033739fe79SHoward Hinnant    shared_ptr<T> static_pointer_cast(shared_ptr<U> const& r) noexcept;
50420cc2a42SHoward Hinnanttemplate<class T, class U>
5053739fe79SHoward Hinnant    shared_ptr<T> dynamic_pointer_cast(shared_ptr<U> const& r) noexcept;
50620cc2a42SHoward Hinnanttemplate<class T, class U>
5073739fe79SHoward Hinnant    shared_ptr<T> const_pointer_cast(shared_ptr<U> const& r) noexcept;
50820cc2a42SHoward Hinnant
50920cc2a42SHoward Hinnant// shared_ptr I/O:
51020cc2a42SHoward Hinnanttemplate<class E, class T, class Y>
51120cc2a42SHoward Hinnant    basic_ostream<E, T>& operator<< (basic_ostream<E, T>& os, shared_ptr<Y> const& p);
51220cc2a42SHoward Hinnant
51320cc2a42SHoward Hinnant// shared_ptr get_deleter:
5143739fe79SHoward Hinnanttemplate<class D, class T> D* get_deleter(shared_ptr<T> const& p) noexcept;
51520cc2a42SHoward Hinnant
51620cc2a42SHoward Hinnanttemplate<class T, class... Args>
51720cc2a42SHoward Hinnant    shared_ptr<T> make_shared(Args&&... args);
51820cc2a42SHoward Hinnanttemplate<class T, class A, class... Args>
51920cc2a42SHoward Hinnant    shared_ptr<T> allocate_shared(const A& a, Args&&... args);
52020cc2a42SHoward Hinnant
52120cc2a42SHoward Hinnanttemplate<class T>
52220cc2a42SHoward Hinnantclass weak_ptr
52320cc2a42SHoward Hinnant{
52420cc2a42SHoward Hinnantpublic:
52520cc2a42SHoward Hinnant    typedef T element_type;
52620cc2a42SHoward Hinnant
52720cc2a42SHoward Hinnant    // constructors
5283739fe79SHoward Hinnant    constexpr weak_ptr() noexcept;
5293739fe79SHoward Hinnant    template<class Y> weak_ptr(shared_ptr<Y> const& r) noexcept;
5303739fe79SHoward Hinnant    weak_ptr(weak_ptr const& r) noexcept;
5313739fe79SHoward Hinnant    template<class Y> weak_ptr(weak_ptr<Y> const& r) noexcept;
5324703f763SMarshall Clow    weak_ptr(weak_ptr&& r) noexcept;                      // C++14
5334703f763SMarshall Clow    template<class Y> weak_ptr(weak_ptr<Y>&& r) noexcept; // C++14
53420cc2a42SHoward Hinnant
53520cc2a42SHoward Hinnant    // destructor
53620cc2a42SHoward Hinnant    ~weak_ptr();
53720cc2a42SHoward Hinnant
53820cc2a42SHoward Hinnant    // assignment
5393739fe79SHoward Hinnant    weak_ptr& operator=(weak_ptr const& r) noexcept;
5403739fe79SHoward Hinnant    template<class Y> weak_ptr& operator=(weak_ptr<Y> const& r) noexcept;
5413739fe79SHoward Hinnant    template<class Y> weak_ptr& operator=(shared_ptr<Y> const& r) noexcept;
5424703f763SMarshall Clow    weak_ptr& operator=(weak_ptr&& r) noexcept;                      // C++14
5434703f763SMarshall Clow    template<class Y> weak_ptr& operator=(weak_ptr<Y>&& r) noexcept; // C++14
54420cc2a42SHoward Hinnant
54520cc2a42SHoward Hinnant    // modifiers
5463739fe79SHoward Hinnant    void swap(weak_ptr& r) noexcept;
5473739fe79SHoward Hinnant    void reset() noexcept;
54820cc2a42SHoward Hinnant
54920cc2a42SHoward Hinnant    // observers
5503739fe79SHoward Hinnant    long use_count() const noexcept;
5513739fe79SHoward Hinnant    bool expired() const noexcept;
5523739fe79SHoward Hinnant    shared_ptr<T> lock() const noexcept;
55336bc7178SMarshall Clow    template<class U> bool owner_before(shared_ptr<U> const& b) const noexcept;
55436bc7178SMarshall Clow    template<class U> bool owner_before(weak_ptr<U> const& b) const noexcept;
55520cc2a42SHoward Hinnant};
55620cc2a42SHoward Hinnant
55783564056SLogan Smithtemplate<class T>
55883564056SLogan Smithweak_ptr(shared_ptr<T>) -> weak_ptr<T>;
55983564056SLogan Smith
56020cc2a42SHoward Hinnant// weak_ptr specialized algorithms:
5613739fe79SHoward Hinnanttemplate<class T> void swap(weak_ptr<T>& a, weak_ptr<T>& b) noexcept;
56220cc2a42SHoward Hinnant
56320cc2a42SHoward Hinnant// class owner_less:
56420cc2a42SHoward Hinnanttemplate<class T> struct owner_less;
56520cc2a42SHoward Hinnant
56620cc2a42SHoward Hinnanttemplate<class T>
56720cc2a42SHoward Hinnantstruct owner_less<shared_ptr<T> >
56820cc2a42SHoward Hinnant    : binary_function<shared_ptr<T>, shared_ptr<T>, bool>
56920cc2a42SHoward Hinnant{
57020cc2a42SHoward Hinnant    typedef bool result_type;
57136bc7178SMarshall Clow    bool operator()(shared_ptr<T> const&, shared_ptr<T> const&) const noexcept;
57236bc7178SMarshall Clow    bool operator()(shared_ptr<T> const&, weak_ptr<T> const&) const noexcept;
57336bc7178SMarshall Clow    bool operator()(weak_ptr<T> const&, shared_ptr<T> const&) const noexcept;
57420cc2a42SHoward Hinnant};
57520cc2a42SHoward Hinnant
57620cc2a42SHoward Hinnanttemplate<class T>
57720cc2a42SHoward Hinnantstruct owner_less<weak_ptr<T> >
57820cc2a42SHoward Hinnant    : binary_function<weak_ptr<T>, weak_ptr<T>, bool>
57920cc2a42SHoward Hinnant{
58020cc2a42SHoward Hinnant    typedef bool result_type;
58136bc7178SMarshall Clow    bool operator()(weak_ptr<T> const&, weak_ptr<T> const&) const noexcept;
58236bc7178SMarshall Clow    bool operator()(shared_ptr<T> const&, weak_ptr<T> const&) const noexcept;
58336bc7178SMarshall Clow    bool operator()(weak_ptr<T> const&, shared_ptr<T> const&) const noexcept;
58436bc7178SMarshall Clow};
58536bc7178SMarshall Clow
58636bc7178SMarshall Clowtemplate <>  // Added in C++14
58736bc7178SMarshall Clowstruct owner_less<void>
58836bc7178SMarshall Clow{
58936bc7178SMarshall Clow    template <class _Tp, class _Up>
59036bc7178SMarshall Clow    bool operator()( shared_ptr<_Tp> const& __x, shared_ptr<_Up> const& __y) const noexcept;
59136bc7178SMarshall Clow    template <class _Tp, class _Up>
59236bc7178SMarshall Clow    bool operator()( shared_ptr<_Tp> const& __x,   weak_ptr<_Up> const& __y) const noexcept;
59336bc7178SMarshall Clow    template <class _Tp, class _Up>
59436bc7178SMarshall Clow    bool operator()(   weak_ptr<_Tp> const& __x, shared_ptr<_Up> const& __y) const noexcept;
59536bc7178SMarshall Clow    template <class _Tp, class _Up>
59636bc7178SMarshall Clow    bool operator()(   weak_ptr<_Tp> const& __x,   weak_ptr<_Up> const& __y) const noexcept;
59736bc7178SMarshall Clow
59836bc7178SMarshall Clow    typedef void is_transparent;
59920cc2a42SHoward Hinnant};
60020cc2a42SHoward Hinnant
60120cc2a42SHoward Hinnanttemplate<class T>
60220cc2a42SHoward Hinnantclass enable_shared_from_this
60320cc2a42SHoward Hinnant{
60420cc2a42SHoward Hinnantprotected:
6053739fe79SHoward Hinnant    constexpr enable_shared_from_this() noexcept;
6063739fe79SHoward Hinnant    enable_shared_from_this(enable_shared_from_this const&) noexcept;
6073739fe79SHoward Hinnant    enable_shared_from_this& operator=(enable_shared_from_this const&) noexcept;
60820cc2a42SHoward Hinnant    ~enable_shared_from_this();
60920cc2a42SHoward Hinnantpublic:
61020cc2a42SHoward Hinnant    shared_ptr<T> shared_from_this();
61120cc2a42SHoward Hinnant    shared_ptr<T const> shared_from_this() const;
61220cc2a42SHoward Hinnant};
61320cc2a42SHoward Hinnant
61420cc2a42SHoward Hinnanttemplate<class T>
61520cc2a42SHoward Hinnant    bool atomic_is_lock_free(const shared_ptr<T>* p);
61620cc2a42SHoward Hinnanttemplate<class T>
61720cc2a42SHoward Hinnant    shared_ptr<T> atomic_load(const shared_ptr<T>* p);
61820cc2a42SHoward Hinnanttemplate<class T>
61920cc2a42SHoward Hinnant    shared_ptr<T> atomic_load_explicit(const shared_ptr<T>* p, memory_order mo);
62020cc2a42SHoward Hinnanttemplate<class T>
62120cc2a42SHoward Hinnant    void atomic_store(shared_ptr<T>* p, shared_ptr<T> r);
62220cc2a42SHoward Hinnanttemplate<class T>
62320cc2a42SHoward Hinnant    void atomic_store_explicit(shared_ptr<T>* p, shared_ptr<T> r, memory_order mo);
62420cc2a42SHoward Hinnanttemplate<class T>
62520cc2a42SHoward Hinnant    shared_ptr<T> atomic_exchange(shared_ptr<T>* p, shared_ptr<T> r);
62620cc2a42SHoward Hinnanttemplate<class T>
62720cc2a42SHoward Hinnant    shared_ptr<T>
62820cc2a42SHoward Hinnant    atomic_exchange_explicit(shared_ptr<T>* p, shared_ptr<T> r, memory_order mo);
62920cc2a42SHoward Hinnanttemplate<class T>
63020cc2a42SHoward Hinnant    bool
63120cc2a42SHoward Hinnant    atomic_compare_exchange_weak(shared_ptr<T>* p, shared_ptr<T>* v, shared_ptr<T> w);
63220cc2a42SHoward Hinnanttemplate<class T>
63320cc2a42SHoward Hinnant    bool
63420cc2a42SHoward Hinnant    atomic_compare_exchange_strong( shared_ptr<T>* p, shared_ptr<T>* v, shared_ptr<T> w);
63520cc2a42SHoward Hinnanttemplate<class T>
63620cc2a42SHoward Hinnant    bool
63720cc2a42SHoward Hinnant    atomic_compare_exchange_weak_explicit(shared_ptr<T>* p, shared_ptr<T>* v,
63820cc2a42SHoward Hinnant                                          shared_ptr<T> w, memory_order success,
63920cc2a42SHoward Hinnant                                          memory_order failure);
64020cc2a42SHoward Hinnanttemplate<class T>
64120cc2a42SHoward Hinnant    bool
64220cc2a42SHoward Hinnant    atomic_compare_exchange_strong_explicit(shared_ptr<T>* p, shared_ptr<T>* v,
64320cc2a42SHoward Hinnant                                            shared_ptr<T> w, memory_order success,
64420cc2a42SHoward Hinnant                                            memory_order failure);
64520cc2a42SHoward Hinnant// Hash support
64620cc2a42SHoward Hinnanttemplate <class T> struct hash;
64720cc2a42SHoward Hinnanttemplate <class T, class D> struct hash<unique_ptr<T, D> >;
64820cc2a42SHoward Hinnanttemplate <class T> struct hash<shared_ptr<T> >;
64920cc2a42SHoward Hinnant
65040a01d53SMarshall Clowtemplate <class T, class Alloc>
65140a01d53SMarshall Clow  inline constexpr bool uses_allocator_v = uses_allocator<T, Alloc>::value;
65240a01d53SMarshall Clow
65320cc2a42SHoward Hinnant// Pointer safety
65420cc2a42SHoward Hinnantenum class pointer_safety { relaxed, preferred, strict };
65520cc2a42SHoward Hinnantvoid declare_reachable(void *p);
65620cc2a42SHoward Hinnanttemplate <class T> T *undeclare_reachable(T *p);
65720cc2a42SHoward Hinnantvoid declare_no_pointers(char *p, size_t n);
65820cc2a42SHoward Hinnantvoid undeclare_no_pointers(char *p, size_t n);
6593739fe79SHoward Hinnantpointer_safety get_pointer_safety() noexcept;
66020cc2a42SHoward Hinnant
6613e519524SHoward Hinnantvoid* align(size_t alignment, size_t size, void*& ptr, size_t& space);
6623e519524SHoward Hinnant
6633e519524SHoward Hinnant}  // std
6643e519524SHoward Hinnant
6653e519524SHoward Hinnant*/
6663e519524SHoward Hinnant
6673e519524SHoward Hinnant#include <__config>
6682eadbc86SLouis Dionne#include <__availability>
6693e519524SHoward Hinnant#include <type_traits>
6703e519524SHoward Hinnant#include <typeinfo>
671*2d0f1fa4SArthur O'Dwyer#include <compare>
6723e519524SHoward Hinnant#include <cstddef>
6733e519524SHoward Hinnant#include <cstdint>
6743e519524SHoward Hinnant#include <new>
6753e519524SHoward Hinnant#include <utility>
6763e519524SHoward Hinnant#include <limits>
6773e519524SHoward Hinnant#include <iterator>
6783e519524SHoward Hinnant#include <__functional_base>
679e3163f5aSHoward Hinnant#include <iosfwd>
680a87b5e34SHoward Hinnant#include <tuple>
6814524d6e7SEric Fiselier#include <stdexcept>
6829741d6c9SHoward Hinnant#include <cstring>
6837ad49aecSLouis Dionne#include <__memory/allocator_traits.h>
6847ad49aecSLouis Dionne#include <__memory/base.h>
6857ad49aecSLouis Dionne#include <__memory/pointer_traits.h>
68619d57b5cSLouis Dionne#include <__memory/utilities.h>
687749adebaSEric Fiselier#if !defined(_LIBCPP_HAS_NO_ATOMIC_HEADER)
688d77851e8SHoward Hinnant#  include <atomic>
689d77851e8SHoward Hinnant#endif
690f56972e2SMarshall Clow#include <version>
691d77851e8SHoward Hinnant
692073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
6933e519524SHoward Hinnant#pragma GCC system_header
694073458b1SHoward Hinnant#endif
6953e519524SHoward Hinnant
696a016efb1SEric Fiselier_LIBCPP_PUSH_MACROS
697a016efb1SEric Fiselier#include <__undef_macros>
698a016efb1SEric Fiselier
699a016efb1SEric Fiselier
7003e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
7013e519524SHoward Hinnant
7021faf289eSEric Fiseliertemplate <class _ValueType>
703dc7200b4SLouis Dionneinline _LIBCPP_INLINE_VISIBILITY
7041faf289eSEric Fiselier_ValueType __libcpp_relaxed_load(_ValueType const* __value) {
7051faf289eSEric Fiselier#if !defined(_LIBCPP_HAS_NO_THREADS) && \
7061faf289eSEric Fiselier    defined(__ATOMIC_RELAXED) &&        \
707ae62727aSRichard Smith    (__has_builtin(__atomic_load_n) || defined(_LIBCPP_COMPILER_GCC))
7081faf289eSEric Fiselier    return __atomic_load_n(__value, __ATOMIC_RELAXED);
7091faf289eSEric Fiselier#else
7101faf289eSEric Fiselier    return *__value;
7111faf289eSEric Fiselier#endif
7121faf289eSEric Fiselier}
7131faf289eSEric Fiselier
714224264adSKuba Breckatemplate <class _ValueType>
715dc7200b4SLouis Dionneinline _LIBCPP_INLINE_VISIBILITY
716224264adSKuba Brecka_ValueType __libcpp_acquire_load(_ValueType const* __value) {
717224264adSKuba Brecka#if !defined(_LIBCPP_HAS_NO_THREADS) && \
718224264adSKuba Brecka    defined(__ATOMIC_ACQUIRE) &&        \
719ae62727aSRichard Smith    (__has_builtin(__atomic_load_n) || defined(_LIBCPP_COMPILER_GCC))
720224264adSKuba Brecka    return __atomic_load_n(__value, __ATOMIC_ACQUIRE);
721224264adSKuba Brecka#else
722224264adSKuba Brecka    return *__value;
723224264adSKuba Brecka#endif
724224264adSKuba Brecka}
725224264adSKuba Brecka
7267ad49aecSLouis Dionnetemplate <class _Tp> class allocator;
727b082f11fSMarshall Clow
7287ad49aecSLouis Dionne#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_ENABLE_CXX20_REMOVED_ALLOCATOR_MEMBERS)
7297ad49aecSLouis Dionnetemplate <>
7307ad49aecSLouis Dionneclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX17 allocator<void>
7313e519524SHoward Hinnant{
7323e519524SHoward Hinnantpublic:
7337ad49aecSLouis Dionne    typedef void*             pointer;
7347ad49aecSLouis Dionne    typedef const void*       const_pointer;
7357ad49aecSLouis Dionne    typedef void              value_type;
7367ad49aecSLouis Dionne
7377ad49aecSLouis Dionne    template <class _Up> struct rebind {typedef allocator<_Up> other;};
7383e519524SHoward Hinnant};
7393e519524SHoward Hinnant
7407ad49aecSLouis Dionnetemplate <>
7417ad49aecSLouis Dionneclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX17 allocator<const void>
7423e519524SHoward Hinnant{
7437ad49aecSLouis Dionnepublic:
7447ad49aecSLouis Dionne    typedef const void*       pointer;
7457ad49aecSLouis Dionne    typedef const void*       const_pointer;
7467ad49aecSLouis Dionne    typedef const void        value_type;
7477ad49aecSLouis Dionne
7487ad49aecSLouis Dionne    template <class _Up> struct rebind {typedef allocator<_Up> other;};
7493e519524SHoward Hinnant};
7500724f8bfSLouis Dionne#endif
7511f508014SMarshall Clow
7523e519524SHoward Hinnant// allocator
7533e519524SHoward Hinnant
7543e519524SHoward Hinnanttemplate <class _Tp>
755e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS allocator
7563e519524SHoward Hinnant{
7573e519524SHoward Hinnantpublic:
758316d336dSLouis Dionne    typedef size_t      size_type;
759316d336dSLouis Dionne    typedef ptrdiff_t   difference_type;
7603e519524SHoward Hinnant    typedef _Tp         value_type;
761b58f59cdSHoward Hinnant    typedef true_type   propagate_on_container_move_assignment;
76231a47313SMarshall Clow    typedef true_type   is_always_equal;
763b58f59cdSHoward Hinnant
764e0742c4aSMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
765e0742c4aSMarshall Clow    allocator() _NOEXCEPT { }
766e0742c4aSMarshall Clow
767e0742c4aSMarshall Clow    template <class _Up>
768e0742c4aSMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
769e0742c4aSMarshall Clow    allocator(const allocator<_Up>&) _NOEXCEPT { }
770e0742c4aSMarshall Clow
7710724f8bfSLouis Dionne    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
7722404ed02SLouis Dionne    _Tp* allocate(size_t __n) {
7730724f8bfSLouis Dionne        if (__n > allocator_traits<allocator>::max_size(*this))
7740fc8cec7SMarshall Clow            __throw_length_error("allocator<T>::allocate(size_t n)"
7750fc8cec7SMarshall Clow                                 " 'n' exceeds maximum supported size");
776d092c912SLouis Dionne        if (__libcpp_is_constant_evaluated()) {
777d092c912SLouis Dionne            return static_cast<_Tp*>(::operator new(__n * sizeof(_Tp)));
778d092c912SLouis Dionne        } else {
7795b1e5b43SMichael Park            return static_cast<_Tp*>(_VSTD::__libcpp_allocate(__n * sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp)));
7804cec709eSMarshall Clow        }
781d092c912SLouis Dionne    }
7825b1e5b43SMichael Park
7830724f8bfSLouis Dionne    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
7842404ed02SLouis Dionne    void deallocate(_Tp* __p, size_t __n) _NOEXCEPT {
785d092c912SLouis Dionne        if (__libcpp_is_constant_evaluated()) {
786d092c912SLouis Dionne            ::operator delete(__p);
787d092c912SLouis Dionne        } else {
7882404ed02SLouis Dionne            _VSTD::__libcpp_deallocate((void*)__p, __n * sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp));
7892404ed02SLouis Dionne        }
790d092c912SLouis Dionne    }
7915b1e5b43SMichael Park
7922404ed02SLouis Dionne    // C++20 Removed members
7935b1e5b43SMichael Park#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_ENABLE_CXX20_REMOVED_ALLOCATOR_MEMBERS)
7942404ed02SLouis Dionne    _LIBCPP_DEPRECATED_IN_CXX17 typedef _Tp*       pointer;
7952404ed02SLouis Dionne    _LIBCPP_DEPRECATED_IN_CXX17 typedef const _Tp* const_pointer;
7962404ed02SLouis Dionne    _LIBCPP_DEPRECATED_IN_CXX17 typedef _Tp&       reference;
7972404ed02SLouis Dionne    _LIBCPP_DEPRECATED_IN_CXX17 typedef const _Tp& const_reference;
7982404ed02SLouis Dionne
7992404ed02SLouis Dionne    template <class _Up>
8002404ed02SLouis Dionne    struct _LIBCPP_DEPRECATED_IN_CXX17 rebind {
8012404ed02SLouis Dionne        typedef allocator<_Up> other;
8022404ed02SLouis Dionne    };
8032404ed02SLouis Dionne
8042404ed02SLouis Dionne    _LIBCPP_DEPRECATED_IN_CXX17 _LIBCPP_INLINE_VISIBILITY
8052404ed02SLouis Dionne    pointer address(reference __x) const _NOEXCEPT {
8062404ed02SLouis Dionne        return _VSTD::addressof(__x);
8072404ed02SLouis Dionne    }
8082404ed02SLouis Dionne    _LIBCPP_DEPRECATED_IN_CXX17 _LIBCPP_INLINE_VISIBILITY
8092404ed02SLouis Dionne    const_pointer address(const_reference __x) const _NOEXCEPT {
8102404ed02SLouis Dionne        return _VSTD::addressof(__x);
8112404ed02SLouis Dionne    }
8122404ed02SLouis Dionne
8132404ed02SLouis Dionne    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY _LIBCPP_DEPRECATED_IN_CXX17
8142404ed02SLouis Dionne    _Tp* allocate(size_t __n, const void*) {
8152404ed02SLouis Dionne        return allocate(__n);
8162404ed02SLouis Dionne    }
8172404ed02SLouis Dionne
8182404ed02SLouis Dionne    _LIBCPP_DEPRECATED_IN_CXX17 _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT {
8192404ed02SLouis Dionne        return size_type(~0) / sizeof(_Tp);
8202404ed02SLouis Dionne    }
8215b1e5b43SMichael Park
8223e519524SHoward Hinnant    template <class _Up, class... _Args>
8235b1e5b43SMichael Park    _LIBCPP_DEPRECATED_IN_CXX17 _LIBCPP_INLINE_VISIBILITY
8242404ed02SLouis Dionne    void construct(_Up* __p, _Args&&... __args) {
825ce48a113SHoward Hinnant        ::new ((void*)__p) _Up(_VSTD::forward<_Args>(__args)...);
8263e519524SHoward Hinnant    }
8272404ed02SLouis Dionne
8282404ed02SLouis Dionne    _LIBCPP_DEPRECATED_IN_CXX17 _LIBCPP_INLINE_VISIBILITY
8292404ed02SLouis Dionne    void destroy(pointer __p) {
8302404ed02SLouis Dionne        __p->~_Tp();
8312404ed02SLouis Dionne    }
8325b1e5b43SMichael Park#endif
8333e519524SHoward Hinnant};
8343e519524SHoward Hinnant
8358e25104bSHoward Hinnanttemplate <class _Tp>
836e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS allocator<const _Tp>
8378e25104bSHoward Hinnant{
8388e25104bSHoward Hinnantpublic:
839316d336dSLouis Dionne    typedef size_t      size_type;
840316d336dSLouis Dionne    typedef ptrdiff_t   difference_type;
84130444adcSHoward Hinnant    typedef const _Tp   value_type;
8428e25104bSHoward Hinnant    typedef true_type   propagate_on_container_move_assignment;
843f43a42d5SMarshall Clow    typedef true_type   is_always_equal;
8448e25104bSHoward Hinnant
845e0742c4aSMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
846e0742c4aSMarshall Clow    allocator() _NOEXCEPT { }
847e0742c4aSMarshall Clow
848e0742c4aSMarshall Clow    template <class _Up>
849e0742c4aSMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
850e0742c4aSMarshall Clow    allocator(const allocator<_Up>&) _NOEXCEPT { }
851e0742c4aSMarshall Clow
8520724f8bfSLouis Dionne    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
8532404ed02SLouis Dionne    const _Tp* allocate(size_t __n) {
8540724f8bfSLouis Dionne        if (__n > allocator_traits<allocator>::max_size(*this))
8550fc8cec7SMarshall Clow            __throw_length_error("allocator<const T>::allocate(size_t n)"
8560fc8cec7SMarshall Clow                                 " 'n' exceeds maximum supported size");
857d092c912SLouis Dionne        if (__libcpp_is_constant_evaluated()) {
858d092c912SLouis Dionne            return static_cast<const _Tp*>(::operator new(__n * sizeof(_Tp)));
859d092c912SLouis Dionne        } else {
8605b1e5b43SMichael Park            return static_cast<const _Tp*>(_VSTD::__libcpp_allocate(__n * sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp)));
8614cec709eSMarshall Clow        }
862d092c912SLouis Dionne    }
8635b1e5b43SMichael Park
8640724f8bfSLouis Dionne    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
8652404ed02SLouis Dionne    void deallocate(const _Tp* __p, size_t __n) {
866d092c912SLouis Dionne        if (__libcpp_is_constant_evaluated()) {
867d092c912SLouis Dionne            ::operator delete(const_cast<_Tp*>(__p));
868d092c912SLouis Dionne        } else {
8692404ed02SLouis Dionne            _VSTD::__libcpp_deallocate((void*) const_cast<_Tp *>(__p), __n * sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp));
8702404ed02SLouis Dionne        }
871d092c912SLouis Dionne    }
8725b1e5b43SMichael Park
8732404ed02SLouis Dionne    // C++20 Removed members
8745b1e5b43SMichael Park#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_ENABLE_CXX20_REMOVED_ALLOCATOR_MEMBERS)
8752404ed02SLouis Dionne    _LIBCPP_DEPRECATED_IN_CXX17 typedef const _Tp* pointer;
8762404ed02SLouis Dionne    _LIBCPP_DEPRECATED_IN_CXX17 typedef const _Tp* const_pointer;
8772404ed02SLouis Dionne    _LIBCPP_DEPRECATED_IN_CXX17 typedef const _Tp& reference;
8782404ed02SLouis Dionne    _LIBCPP_DEPRECATED_IN_CXX17 typedef const _Tp& const_reference;
8792404ed02SLouis Dionne
8802404ed02SLouis Dionne    template <class _Up>
8812404ed02SLouis Dionne    struct _LIBCPP_DEPRECATED_IN_CXX17 rebind {
8822404ed02SLouis Dionne        typedef allocator<_Up> other;
8832404ed02SLouis Dionne    };
8842404ed02SLouis Dionne
8852404ed02SLouis Dionne    _LIBCPP_DEPRECATED_IN_CXX17 _LIBCPP_INLINE_VISIBILITY
8862404ed02SLouis Dionne    const_pointer address(const_reference __x) const _NOEXCEPT {
8872404ed02SLouis Dionne        return _VSTD::addressof(__x);
8882404ed02SLouis Dionne    }
8892404ed02SLouis Dionne
8902404ed02SLouis Dionne    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY _LIBCPP_DEPRECATED_IN_CXX17
8912404ed02SLouis Dionne    const _Tp* allocate(size_t __n, const void*) {
8922404ed02SLouis Dionne        return allocate(__n);
8932404ed02SLouis Dionne    }
8942404ed02SLouis Dionne
8952404ed02SLouis Dionne    _LIBCPP_DEPRECATED_IN_CXX17 _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT {
8962404ed02SLouis Dionne        return size_type(~0) / sizeof(_Tp);
8972404ed02SLouis Dionne    }
8985b1e5b43SMichael Park
8998e25104bSHoward Hinnant    template <class _Up, class... _Args>
9005b1e5b43SMichael Park    _LIBCPP_DEPRECATED_IN_CXX17 _LIBCPP_INLINE_VISIBILITY
9012404ed02SLouis Dionne    void construct(_Up* __p, _Args&&... __args) {
9028e25104bSHoward Hinnant        ::new ((void*)__p) _Up(_VSTD::forward<_Args>(__args)...);
9038e25104bSHoward Hinnant    }
904bff1bfc6SHoward Hinnant
9052404ed02SLouis Dionne    _LIBCPP_DEPRECATED_IN_CXX17 _LIBCPP_INLINE_VISIBILITY
9062404ed02SLouis Dionne    void destroy(pointer __p) {
9072404ed02SLouis Dionne        __p->~_Tp();
9082404ed02SLouis Dionne    }
9095b1e5b43SMichael Park#endif
9108e25104bSHoward Hinnant};
9118e25104bSHoward Hinnant
9123e519524SHoward Hinnanttemplate <class _Tp, class _Up>
9130724f8bfSLouis Dionneinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
9143739fe79SHoward Hinnantbool operator==(const allocator<_Tp>&, const allocator<_Up>&) _NOEXCEPT {return true;}
9153e519524SHoward Hinnant
9163e519524SHoward Hinnanttemplate <class _Tp, class _Up>
9170724f8bfSLouis Dionneinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
9183739fe79SHoward Hinnantbool operator!=(const allocator<_Tp>&, const allocator<_Up>&) _NOEXCEPT {return false;}
9193e519524SHoward Hinnant
920d9a4f936SLouis Dionnetemplate <class _Alloc, class _Ptr>
921d9a4f936SLouis Dionne_LIBCPP_INLINE_VISIBILITY
922d9a4f936SLouis Dionnevoid __construct_forward_with_exception_guarantees(_Alloc& __a, _Ptr __begin1, _Ptr __end1, _Ptr& __begin2) {
923d9a4f936SLouis Dionne    static_assert(__is_cpp17_move_insertable<_Alloc>::value,
924e9eb9999SArthur O'Dwyer        "The specified type does not meet the requirements of Cpp17MoveInsertable");
925d9a4f936SLouis Dionne    typedef allocator_traits<_Alloc> _Traits;
926d9a4f936SLouis Dionne    for (; __begin1 != __end1; ++__begin1, (void)++__begin2) {
927d9a4f936SLouis Dionne        _Traits::construct(__a, _VSTD::__to_address(__begin2),
928d9a4f936SLouis Dionne#ifdef _LIBCPP_NO_EXCEPTIONS
929d9a4f936SLouis Dionne            _VSTD::move(*__begin1)
930d9a4f936SLouis Dionne#else
931d9a4f936SLouis Dionne            _VSTD::move_if_noexcept(*__begin1)
932d9a4f936SLouis Dionne#endif
933d9a4f936SLouis Dionne        );
934d9a4f936SLouis Dionne    }
935d9a4f936SLouis Dionne}
936d9a4f936SLouis Dionne
937d9a4f936SLouis Dionnetemplate <class _Alloc, class _Tp, typename enable_if<
938d9a4f936SLouis Dionne    (__is_default_allocator<_Alloc>::value || !__has_construct<_Alloc, _Tp*, _Tp>::value) &&
939d9a4f936SLouis Dionne    is_trivially_move_constructible<_Tp>::value
940d9a4f936SLouis Dionne>::type>
941d9a4f936SLouis Dionne_LIBCPP_INLINE_VISIBILITY
942d9a4f936SLouis Dionnevoid __construct_forward_with_exception_guarantees(_Alloc&, _Tp* __begin1, _Tp* __end1, _Tp*& __begin2) {
943d9a4f936SLouis Dionne    ptrdiff_t _Np = __end1 - __begin1;
944d9a4f936SLouis Dionne    if (_Np > 0) {
945d9a4f936SLouis Dionne        _VSTD::memcpy(__begin2, __begin1, _Np * sizeof(_Tp));
946d9a4f936SLouis Dionne        __begin2 += _Np;
947d9a4f936SLouis Dionne    }
948d9a4f936SLouis Dionne}
949d9a4f936SLouis Dionne
950d9a4f936SLouis Dionnetemplate <class _Alloc, class _Iter, class _Ptr>
951d9a4f936SLouis Dionne_LIBCPP_INLINE_VISIBILITY
952d9a4f936SLouis Dionnevoid __construct_range_forward(_Alloc& __a, _Iter __begin1, _Iter __end1, _Ptr& __begin2) {
953d9a4f936SLouis Dionne    typedef allocator_traits<_Alloc> _Traits;
954d9a4f936SLouis Dionne    for (; __begin1 != __end1; ++__begin1, (void) ++__begin2) {
955d9a4f936SLouis Dionne        _Traits::construct(__a, _VSTD::__to_address(__begin2), *__begin1);
956d9a4f936SLouis Dionne    }
957d9a4f936SLouis Dionne}
958d9a4f936SLouis Dionne
959d9a4f936SLouis Dionnetemplate <class _Alloc, class _Source, class _Dest,
960d9a4f936SLouis Dionne          class _RawSource = typename remove_const<_Source>::type,
961d9a4f936SLouis Dionne          class _RawDest = typename remove_const<_Dest>::type,
962d9a4f936SLouis Dionne          class =
963d9a4f936SLouis Dionne    typename enable_if<
964d9a4f936SLouis Dionne        is_trivially_copy_constructible<_Dest>::value &&
965d9a4f936SLouis Dionne        is_same<_RawSource, _RawDest>::value &&
966d9a4f936SLouis Dionne        (__is_default_allocator<_Alloc>::value || !__has_construct<_Alloc, _Dest*, _Source&>::value)
967d9a4f936SLouis Dionne    >::type>
968d9a4f936SLouis Dionne_LIBCPP_INLINE_VISIBILITY
969d9a4f936SLouis Dionnevoid __construct_range_forward(_Alloc&, _Source* __begin1, _Source* __end1, _Dest*& __begin2) {
970d9a4f936SLouis Dionne    ptrdiff_t _Np = __end1 - __begin1;
971d9a4f936SLouis Dionne    if (_Np > 0) {
972d9a4f936SLouis Dionne        _VSTD::memcpy(const_cast<_RawDest*>(__begin2), __begin1, _Np * sizeof(_Dest));
973d9a4f936SLouis Dionne        __begin2 += _Np;
974d9a4f936SLouis Dionne    }
975d9a4f936SLouis Dionne}
976d9a4f936SLouis Dionne
977d9a4f936SLouis Dionnetemplate <class _Alloc, class _Ptr>
978d9a4f936SLouis Dionne_LIBCPP_INLINE_VISIBILITY
979d9a4f936SLouis Dionnevoid __construct_backward_with_exception_guarantees(_Alloc& __a, _Ptr __begin1, _Ptr __end1, _Ptr& __end2) {
980d9a4f936SLouis Dionne    static_assert(__is_cpp17_move_insertable<_Alloc>::value,
981d9a4f936SLouis Dionne        "The specified type does not meet the requirements of Cpp17MoveInsertable");
982d9a4f936SLouis Dionne    typedef allocator_traits<_Alloc> _Traits;
983d9a4f936SLouis Dionne    while (__end1 != __begin1) {
984d9a4f936SLouis Dionne        _Traits::construct(__a, _VSTD::__to_address(__end2 - 1),
985d9a4f936SLouis Dionne#ifdef _LIBCPP_NO_EXCEPTIONS
986d9a4f936SLouis Dionne            _VSTD::move(*--__end1)
987d9a4f936SLouis Dionne#else
988d9a4f936SLouis Dionne            _VSTD::move_if_noexcept(*--__end1)
989d9a4f936SLouis Dionne#endif
990d9a4f936SLouis Dionne        );
991d9a4f936SLouis Dionne        --__end2;
992d9a4f936SLouis Dionne    }
993d9a4f936SLouis Dionne}
994d9a4f936SLouis Dionne
995d9a4f936SLouis Dionnetemplate <class _Alloc, class _Tp, class = typename enable_if<
996d9a4f936SLouis Dionne    (__is_default_allocator<_Alloc>::value || !__has_construct<_Alloc, _Tp*, _Tp>::value) &&
997d9a4f936SLouis Dionne    is_trivially_move_constructible<_Tp>::value
998d9a4f936SLouis Dionne>::type>
999d9a4f936SLouis Dionne_LIBCPP_INLINE_VISIBILITY
1000d9a4f936SLouis Dionnevoid __construct_backward_with_exception_guarantees(_Alloc&, _Tp* __begin1, _Tp* __end1, _Tp*& __end2) {
1001d9a4f936SLouis Dionne    ptrdiff_t _Np = __end1 - __begin1;
1002d9a4f936SLouis Dionne    __end2 -= _Np;
1003d9a4f936SLouis Dionne    if (_Np > 0)
1004d9a4f936SLouis Dionne        _VSTD::memcpy(__end2, __begin1, _Np * sizeof(_Tp));
1005d9a4f936SLouis Dionne}
1006d9a4f936SLouis Dionne
10073e519524SHoward Hinnanttemplate <class _OutputIterator, class _Tp>
1008e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS raw_storage_iterator
10093e519524SHoward Hinnant    : public iterator<output_iterator_tag,
10103e519524SHoward Hinnant                      _Tp,                                         // purposefully not C++03
10113e519524SHoward Hinnant                      ptrdiff_t,                                   // purposefully not C++03
10123e519524SHoward Hinnant                      _Tp*,                                        // purposefully not C++03
10133e519524SHoward Hinnant                      raw_storage_iterator<_OutputIterator, _Tp>&> // purposefully not C++03
10143e519524SHoward Hinnant{
10153e519524SHoward Hinnantprivate:
10163e519524SHoward Hinnant    _OutputIterator __x_;
10173e519524SHoward Hinnantpublic:
10183e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit raw_storage_iterator(_OutputIterator __x) : __x_(__x) {}
10193e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator*() {return *this;}
10203e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator=(const _Tp& __element)
1021be4c657bSArthur O'Dwyer        {::new ((void*)_VSTD::addressof(*__x_)) _Tp(__element); return *this;}
10222603b075SMarshall Clow#if _LIBCPP_STD_VER >= 14
10232603b075SMarshall Clow    _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator=(_Tp&& __element)
1024be4c657bSArthur O'Dwyer        {::new ((void*)_VSTD::addressof(*__x_)) _Tp(_VSTD::move(__element)); return *this;}
10252603b075SMarshall Clow#endif
10263e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator++() {++__x_; return *this;}
10273e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY raw_storage_iterator  operator++(int)
10283e519524SHoward Hinnant        {raw_storage_iterator __t(*this); ++__x_; return __t;}
1029783b372aSMarshall Clow#if _LIBCPP_STD_VER >= 14
1030783b372aSMarshall Clow    _LIBCPP_INLINE_VISIBILITY _OutputIterator base() const { return __x_; }
1031783b372aSMarshall Clow#endif
10323e519524SHoward Hinnant};
10333e519524SHoward Hinnant
10343e519524SHoward Hinnanttemplate <class _Tp>
1035c65d39a4SRoman Lebedev_LIBCPP_NODISCARD_EXT _LIBCPP_NO_CFI
10363e519524SHoward Hinnantpair<_Tp*, ptrdiff_t>
10373739fe79SHoward Hinnantget_temporary_buffer(ptrdiff_t __n) _NOEXCEPT
10383e519524SHoward Hinnant{
10393e519524SHoward Hinnant    pair<_Tp*, ptrdiff_t> __r(0, 0);
10403e519524SHoward Hinnant    const ptrdiff_t __m = (~ptrdiff_t(0) ^
10413e519524SHoward Hinnant                           ptrdiff_t(ptrdiff_t(1) << (sizeof(ptrdiff_t) * __CHAR_BIT__ - 1)))
10423e519524SHoward Hinnant                           / sizeof(_Tp);
10433e519524SHoward Hinnant    if (__n > __m)
10443e519524SHoward Hinnant        __n = __m;
10453e519524SHoward Hinnant    while (__n > 0)
10463e519524SHoward Hinnant    {
104743245b1fSEric Fiselier#if !defined(_LIBCPP_HAS_NO_ALIGNED_ALLOCATION)
1048d108bf85SEric Fiselier    if (__is_overaligned_for_new(_LIBCPP_ALIGNOF(_Tp)))
10494e3195c9SRichard Smith        {
1050d586f92cSArthur O'Dwyer            align_val_t __al =
1051d586f92cSArthur O'Dwyer                align_val_t(alignment_of<_Tp>::value);
10524e3195c9SRichard Smith            __r.first = static_cast<_Tp*>(::operator new(
10534e3195c9SRichard Smith                __n * sizeof(_Tp), __al, nothrow));
10544e3195c9SRichard Smith        } else {
10554e3195c9SRichard Smith            __r.first = static_cast<_Tp*>(::operator new(
10564e3195c9SRichard Smith                __n * sizeof(_Tp), nothrow));
10574e3195c9SRichard Smith        }
10584e3195c9SRichard Smith#else
1059d108bf85SEric Fiselier    if (__is_overaligned_for_new(_LIBCPP_ALIGNOF(_Tp)))
10604e3195c9SRichard Smith        {
10614e3195c9SRichard Smith            // Since aligned operator new is unavailable, return an empty
10624e3195c9SRichard Smith            // buffer rather than one with invalid alignment.
10634e3195c9SRichard Smith            return __r;
10644e3195c9SRichard Smith        }
10654e3195c9SRichard Smith
10663e519524SHoward Hinnant        __r.first = static_cast<_Tp*>(::operator new(__n * sizeof(_Tp), nothrow));
10674e3195c9SRichard Smith#endif
10684e3195c9SRichard Smith
10693e519524SHoward Hinnant        if (__r.first)
10703e519524SHoward Hinnant        {
10713e519524SHoward Hinnant            __r.second = __n;
10723e519524SHoward Hinnant            break;
10733e519524SHoward Hinnant        }
10743e519524SHoward Hinnant        __n /= 2;
10753e519524SHoward Hinnant    }
10763e519524SHoward Hinnant    return __r;
10773e519524SHoward Hinnant}
10783e519524SHoward Hinnant
10793e519524SHoward Hinnanttemplate <class _Tp>
10803e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
10814e3195c9SRichard Smithvoid return_temporary_buffer(_Tp* __p) _NOEXCEPT
10824e3195c9SRichard Smith{
1083d108bf85SEric Fiselier  _VSTD::__libcpp_deallocate_unsized((void*)__p, _LIBCPP_ALIGNOF(_Tp));
10844e3195c9SRichard Smith}
10853e519524SHoward Hinnant
1086e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR)
10873e519524SHoward Hinnanttemplate <class _Tp>
1088ea5cd3b4SLouis Dionnestruct _LIBCPP_DEPRECATED_IN_CXX11 auto_ptr_ref
10893e519524SHoward Hinnant{
10903e519524SHoward Hinnant    _Tp* __ptr_;
10913e519524SHoward Hinnant};
10923e519524SHoward Hinnant
10933e519524SHoward Hinnanttemplate<class _Tp>
1094ea5cd3b4SLouis Dionneclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 auto_ptr
10953e519524SHoward Hinnant{
10963e519524SHoward Hinnantprivate:
10973e519524SHoward Hinnant    _Tp* __ptr_;
10983e519524SHoward Hinnantpublic:
10993e519524SHoward Hinnant    typedef _Tp element_type;
11003e519524SHoward Hinnant
1101585a3cc3SDimitry Andric    _LIBCPP_INLINE_VISIBILITY explicit auto_ptr(_Tp* __p = 0) _NOEXCEPT : __ptr_(__p) {}
1102585a3cc3SDimitry Andric    _LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr& __p) _NOEXCEPT : __ptr_(__p.release()) {}
1103585a3cc3SDimitry Andric    template<class _Up> _LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr<_Up>& __p) _NOEXCEPT
11043e519524SHoward Hinnant        : __ptr_(__p.release()) {}
1105585a3cc3SDimitry Andric    _LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr& __p) _NOEXCEPT
11063e519524SHoward Hinnant        {reset(__p.release()); return *this;}
1107585a3cc3SDimitry Andric    template<class _Up> _LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr<_Up>& __p) _NOEXCEPT
11083e519524SHoward Hinnant        {reset(__p.release()); return *this;}
1109585a3cc3SDimitry Andric    _LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr_ref<_Tp> __p) _NOEXCEPT
11103e519524SHoward Hinnant        {reset(__p.__ptr_); return *this;}
1111585a3cc3SDimitry Andric    _LIBCPP_INLINE_VISIBILITY ~auto_ptr() _NOEXCEPT {delete __ptr_;}
11123e519524SHoward Hinnant
1113585a3cc3SDimitry Andric    _LIBCPP_INLINE_VISIBILITY _Tp& operator*() const _NOEXCEPT
11143e519524SHoward Hinnant        {return *__ptr_;}
1115585a3cc3SDimitry Andric    _LIBCPP_INLINE_VISIBILITY _Tp* operator->() const _NOEXCEPT {return __ptr_;}
1116585a3cc3SDimitry Andric    _LIBCPP_INLINE_VISIBILITY _Tp* get() const _NOEXCEPT {return __ptr_;}
1117585a3cc3SDimitry Andric    _LIBCPP_INLINE_VISIBILITY _Tp* release() _NOEXCEPT
11183e519524SHoward Hinnant    {
11193e519524SHoward Hinnant        _Tp* __t = __ptr_;
1120527a7fdfSBruce Mitchener        __ptr_ = nullptr;
11213e519524SHoward Hinnant        return __t;
11223e519524SHoward Hinnant    }
1123585a3cc3SDimitry Andric    _LIBCPP_INLINE_VISIBILITY void reset(_Tp* __p = 0) _NOEXCEPT
11243e519524SHoward Hinnant    {
11253e519524SHoward Hinnant        if (__ptr_ != __p)
11263e519524SHoward Hinnant            delete __ptr_;
11273e519524SHoward Hinnant        __ptr_ = __p;
11283e519524SHoward Hinnant    }
11293e519524SHoward Hinnant
1130585a3cc3SDimitry Andric    _LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr_ref<_Tp> __p) _NOEXCEPT : __ptr_(__p.__ptr_) {}
1131585a3cc3SDimitry Andric    template<class _Up> _LIBCPP_INLINE_VISIBILITY operator auto_ptr_ref<_Up>() _NOEXCEPT
11323e519524SHoward Hinnant        {auto_ptr_ref<_Up> __t; __t.__ptr_ = release(); return __t;}
1133585a3cc3SDimitry Andric    template<class _Up> _LIBCPP_INLINE_VISIBILITY operator auto_ptr<_Up>() _NOEXCEPT
11343e519524SHoward Hinnant        {return auto_ptr<_Up>(release());}
11353e519524SHoward Hinnant};
11363e519524SHoward Hinnant
11373e519524SHoward Hinnanttemplate <>
1138ea5cd3b4SLouis Dionneclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 auto_ptr<void>
11393e519524SHoward Hinnant{
11403e519524SHoward Hinnantpublic:
11413e519524SHoward Hinnant    typedef void element_type;
11423e519524SHoward Hinnant};
1143e67179bcSMarshall Clow#endif
11443e519524SHoward Hinnant
11450fa118a9SEric Fiselier// Tag used to default initialize one or both of the pair's elements.
11460fa118a9SEric Fiselierstruct __default_init_tag {};
1147549545b6SEric Fiselierstruct __value_init_tag {};
11480fa118a9SEric Fiselier
1149c88580c4SEric Fiseliertemplate <class _Tp, int _Idx,
1150c88580c4SEric Fiselier          bool _CanBeEmptyBase =
1151c88580c4SEric Fiselier              is_empty<_Tp>::value && !__libcpp_is_final<_Tp>::value>
1152c88580c4SEric Fiselierstruct __compressed_pair_elem {
1153c88580c4SEric Fiselier  typedef _Tp _ParamT;
1154c88580c4SEric Fiselier  typedef _Tp& reference;
1155c88580c4SEric Fiselier  typedef const _Tp& const_reference;
11563e519524SHoward Hinnant
1157549545b6SEric Fiselier  _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
11580fa118a9SEric Fiselier  __compressed_pair_elem(__default_init_tag) {}
1159549545b6SEric Fiselier  _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
1160549545b6SEric Fiselier  __compressed_pair_elem(__value_init_tag) : __value_() {}
11613e519524SHoward Hinnant
1162c88580c4SEric Fiselier  template <class _Up, class = typename enable_if<
11638948264eSEric Fiselier      !is_same<__compressed_pair_elem, typename decay<_Up>::type>::value
11648948264eSEric Fiselier  >::type>
11659dae972cSAlex Lorenz  _LIBCPP_INLINE_VISIBILITY
1166549545b6SEric Fiselier  _LIBCPP_CONSTEXPR explicit
1167c88580c4SEric Fiselier  __compressed_pair_elem(_Up&& __u)
11680b485f3eSEric Fiselier      : __value_(_VSTD::forward<_Up>(__u))
11690b485f3eSEric Fiselier    {
11700b485f3eSEric Fiselier    }
11713e519524SHoward Hinnant
1172549545b6SEric Fiselier
1173549545b6SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
1174c88580c4SEric Fiselier  template <class... _Args, size_t... _Indexes>
1175c88580c4SEric Fiselier  _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
1176c88580c4SEric Fiselier  __compressed_pair_elem(piecewise_construct_t, tuple<_Args...> __args,
1177c88580c4SEric Fiselier                         __tuple_indices<_Indexes...>)
1178c88580c4SEric Fiselier      : __value_(_VSTD::forward<_Args>(_VSTD::get<_Indexes>(__args))...) {}
1179c88580c4SEric Fiselier#endif
11803e519524SHoward Hinnant
1181549545b6SEric Fiselier
11829dae972cSAlex Lorenz  _LIBCPP_INLINE_VISIBILITY reference __get() _NOEXCEPT { return __value_; }
11839dae972cSAlex Lorenz  _LIBCPP_INLINE_VISIBILITY
1184c88580c4SEric Fiselier  const_reference __get() const _NOEXCEPT { return __value_; }
11853e519524SHoward Hinnant
11863e519524SHoward Hinnantprivate:
1187c88580c4SEric Fiselier  _Tp __value_;
11883e519524SHoward Hinnant};
11893e519524SHoward Hinnant
1190c88580c4SEric Fiseliertemplate <class _Tp, int _Idx>
1191c88580c4SEric Fiselierstruct __compressed_pair_elem<_Tp, _Idx, true> : private _Tp {
1192c88580c4SEric Fiselier  typedef _Tp _ParamT;
1193c88580c4SEric Fiselier  typedef _Tp& reference;
1194c88580c4SEric Fiselier  typedef const _Tp& const_reference;
1195c88580c4SEric Fiselier  typedef _Tp __value_type;
11963e519524SHoward Hinnant
1197549545b6SEric Fiselier  _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR __compressed_pair_elem() = default;
1198549545b6SEric Fiselier  _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
1199549545b6SEric Fiselier  __compressed_pair_elem(__default_init_tag) {}
1200549545b6SEric Fiselier  _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
1201549545b6SEric Fiselier  __compressed_pair_elem(__value_init_tag) : __value_type() {}
12023e519524SHoward Hinnant
1203c88580c4SEric Fiselier  template <class _Up, class = typename enable_if<
12048948264eSEric Fiselier        !is_same<__compressed_pair_elem, typename decay<_Up>::type>::value
12058948264eSEric Fiselier  >::type>
12069dae972cSAlex Lorenz  _LIBCPP_INLINE_VISIBILITY
1207549545b6SEric Fiselier  _LIBCPP_CONSTEXPR explicit
1208c88580c4SEric Fiselier  __compressed_pair_elem(_Up&& __u)
12090b485f3eSEric Fiselier      : __value_type(_VSTD::forward<_Up>(__u))
12100b485f3eSEric Fiselier  {}
12113e519524SHoward Hinnant
1212549545b6SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
1213c88580c4SEric Fiselier  template <class... _Args, size_t... _Indexes>
1214c88580c4SEric Fiselier  _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
1215c88580c4SEric Fiselier  __compressed_pair_elem(piecewise_construct_t, tuple<_Args...> __args,
1216c88580c4SEric Fiselier                         __tuple_indices<_Indexes...>)
1217c88580c4SEric Fiselier      : __value_type(_VSTD::forward<_Args>(_VSTD::get<_Indexes>(__args))...) {}
1218c88580c4SEric Fiselier#endif
12193e519524SHoward Hinnant
12209dae972cSAlex Lorenz  _LIBCPP_INLINE_VISIBILITY reference __get() _NOEXCEPT { return *this; }
12219dae972cSAlex Lorenz  _LIBCPP_INLINE_VISIBILITY
1222c88580c4SEric Fiselier  const_reference __get() const _NOEXCEPT { return *this; }
12233e519524SHoward Hinnant};
12243e519524SHoward Hinnant
12253e519524SHoward Hinnanttemplate <class _T1, class _T2>
1226c88580c4SEric Fiselierclass __compressed_pair : private __compressed_pair_elem<_T1, 0>,
1227c88580c4SEric Fiselier                          private __compressed_pair_elem<_T2, 1> {
1228955dd7b7SLouis Dionnepublic:
1229c88580c4SEric Fiselier  // NOTE: This static assert should never fire because __compressed_pair
1230c88580c4SEric Fiselier  // is *almost never* used in a scenario where it's possible for T1 == T2.
1231c88580c4SEric Fiselier  // (The exception is std::function where it is possible that the function
1232c88580c4SEric Fiselier  //  object and the allocator have the same type).
1233b411e9ceSEric Fiselier  static_assert((!is_same<_T1, _T2>::value),
1234e181a6aeSArthur O'Dwyer    "__compressed_pair cannot be instantiated when T1 and T2 are the same type; "
1235c88580c4SEric Fiselier    "The current implementation is NOT ABI-compatible with the previous "
1236c88580c4SEric Fiselier    "implementation for this configuration");
1237c88580c4SEric Fiselier
1238955dd7b7SLouis Dionne    typedef _LIBCPP_NODEBUG_TYPE __compressed_pair_elem<_T1, 0> _Base1;
1239955dd7b7SLouis Dionne    typedef _LIBCPP_NODEBUG_TYPE __compressed_pair_elem<_T2, 1> _Base2;
1240955dd7b7SLouis Dionne
12418948264eSEric Fiselier    template <bool _Dummy = true,
12428948264eSEric Fiselier      class = typename enable_if<
12438948264eSEric Fiselier          __dependent_type<is_default_constructible<_T1>, _Dummy>::value &&
12448948264eSEric Fiselier          __dependent_type<is_default_constructible<_T2>, _Dummy>::value
12458948264eSEric Fiselier      >::type
12468948264eSEric Fiselier  >
1247a87b5e34SHoward Hinnant  _LIBCPP_INLINE_VISIBILITY
1248549545b6SEric Fiselier  _LIBCPP_CONSTEXPR __compressed_pair() : _Base1(__value_init_tag()), _Base2(__value_init_tag()) {}
1249a87b5e34SHoward Hinnant
1250c88580c4SEric Fiselier  template <class _U1, class _U2>
1251549545b6SEric Fiselier  _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
1252c88580c4SEric Fiselier  __compressed_pair(_U1&& __t1, _U2&& __t2)
1253d586f92cSArthur O'Dwyer      : _Base1(_VSTD::forward<_U1>(__t1)), _Base2(_VSTD::forward<_U2>(__t2)) {}
1254a87b5e34SHoward Hinnant
1255549545b6SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
1256a87b5e34SHoward Hinnant  template <class... _Args1, class... _Args2>
1257c88580c4SEric Fiselier  _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
1258a87b5e34SHoward Hinnant  __compressed_pair(piecewise_construct_t __pc, tuple<_Args1...> __first_args,
1259a87b5e34SHoward Hinnant                    tuple<_Args2...> __second_args)
1260c88580c4SEric Fiselier      : _Base1(__pc, _VSTD::move(__first_args),
1261c88580c4SEric Fiselier               typename __make_tuple_indices<sizeof...(_Args1)>::type()),
1262c88580c4SEric Fiselier        _Base2(__pc, _VSTD::move(__second_args),
1263c88580c4SEric Fiselier               typename __make_tuple_indices<sizeof...(_Args2)>::type()) {}
1264c88580c4SEric Fiselier#endif
1265c88580c4SEric Fiselier
1266c88580c4SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1267c88580c4SEric Fiselier  typename _Base1::reference first() _NOEXCEPT {
1268c88580c4SEric Fiselier    return static_cast<_Base1&>(*this).__get();
1269c88580c4SEric Fiselier  }
1270c88580c4SEric Fiselier
1271c88580c4SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1272c88580c4SEric Fiselier  typename _Base1::const_reference first() const _NOEXCEPT {
1273c88580c4SEric Fiselier    return static_cast<_Base1 const&>(*this).__get();
1274c88580c4SEric Fiselier  }
1275c88580c4SEric Fiselier
1276c88580c4SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1277c88580c4SEric Fiselier  typename _Base2::reference second() _NOEXCEPT {
1278c88580c4SEric Fiselier    return static_cast<_Base2&>(*this).__get();
1279c88580c4SEric Fiselier  }
1280c88580c4SEric Fiselier
1281c88580c4SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1282c88580c4SEric Fiselier  typename _Base2::const_reference second() const _NOEXCEPT {
1283c88580c4SEric Fiselier    return static_cast<_Base2 const&>(*this).__get();
1284c88580c4SEric Fiselier  }
1285c88580c4SEric Fiselier
1286955dd7b7SLouis Dionne  _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
1287955dd7b7SLouis Dionne  static _Base1* __get_first_base(__compressed_pair* __pair) _NOEXCEPT {
1288955dd7b7SLouis Dionne    return static_cast<_Base1*>(__pair);
1289955dd7b7SLouis Dionne  }
1290955dd7b7SLouis Dionne  _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
1291955dd7b7SLouis Dionne  static _Base2* __get_second_base(__compressed_pair* __pair) _NOEXCEPT {
1292955dd7b7SLouis Dionne    return static_cast<_Base2*>(__pair);
1293955dd7b7SLouis Dionne  }
1294955dd7b7SLouis Dionne
1295c88580c4SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1296c88580c4SEric Fiselier  void swap(__compressed_pair& __x)
12973739fe79SHoward Hinnant    _NOEXCEPT_(__is_nothrow_swappable<_T1>::value &&
1298afa72ed4SMarshall Clow               __is_nothrow_swappable<_T2>::value)
1299c88580c4SEric Fiselier  {
1300d586f92cSArthur O'Dwyer    using _VSTD::swap;
1301c88580c4SEric Fiselier    swap(first(), __x.first());
1302c88580c4SEric Fiselier    swap(second(), __x.second());
1303c88580c4SEric Fiselier  }
13043e519524SHoward Hinnant};
13053e519524SHoward Hinnant
13063e519524SHoward Hinnanttemplate <class _T1, class _T2>
13073e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1308c88580c4SEric Fiseliervoid swap(__compressed_pair<_T1, _T2>& __x, __compressed_pair<_T1, _T2>& __y)
13093739fe79SHoward Hinnant    _NOEXCEPT_(__is_nothrow_swappable<_T1>::value &&
1310c88580c4SEric Fiselier               __is_nothrow_swappable<_T2>::value) {
1311c88580c4SEric Fiselier  __x.swap(__y);
1312c88580c4SEric Fiselier}
13133e519524SHoward Hinnant
13148e25104bSHoward Hinnant// default_delete
13158e25104bSHoward Hinnant
13163e519524SHoward Hinnanttemplate <class _Tp>
1317030d19bdSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS default_delete {
131872d0d603SErik Pilkington    static_assert(!is_function<_Tp>::value,
131972d0d603SErik Pilkington                  "default_delete cannot be instantiated for function types");
1320030d19bdSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
1321fb2bd4a9SEric Fiselier  _LIBCPP_INLINE_VISIBILITY constexpr default_delete() _NOEXCEPT = default;
1322c0937e8aSHoward Hinnant#else
1323030d19bdSEric Fiselier  _LIBCPP_INLINE_VISIBILITY default_delete() {}
1324c0937e8aSHoward Hinnant#endif
13253e519524SHoward Hinnant  template <class _Up>
1326030d19bdSEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1327030d19bdSEric Fiselier  default_delete(const default_delete<_Up>&,
1328030d19bdSEric Fiselier                 typename enable_if<is_convertible<_Up*, _Tp*>::value>::type* =
1329030d19bdSEric Fiselier                     0) _NOEXCEPT {}
1330030d19bdSEric Fiselier
1331030d19bdSEric Fiselier  _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __ptr) const _NOEXCEPT {
1332030d19bdSEric Fiselier    static_assert(sizeof(_Tp) > 0,
1333030d19bdSEric Fiselier                  "default_delete can not delete incomplete type");
1334030d19bdSEric Fiselier    static_assert(!is_void<_Tp>::value,
1335030d19bdSEric Fiselier                  "default_delete can not delete incomplete type");
13363e519524SHoward Hinnant    delete __ptr;
13373e519524SHoward Hinnant  }
13383e519524SHoward Hinnant};
13393e519524SHoward Hinnant
13403e519524SHoward Hinnanttemplate <class _Tp>
1341030d19bdSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS default_delete<_Tp[]> {
1342030d19bdSEric Fiselierprivate:
1343e4097ad7SHoward Hinnant  template <class _Up>
1344030d19bdSEric Fiselier  struct _EnableIfConvertible
1345030d19bdSEric Fiselier      : enable_if<is_convertible<_Up(*)[], _Tp(*)[]>::value> {};
1346030d19bdSEric Fiselier
1347030d19bdSEric Fiselierpublic:
1348030d19bdSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
1349fb2bd4a9SEric Fiselier  _LIBCPP_INLINE_VISIBILITY constexpr default_delete() _NOEXCEPT = default;
1350030d19bdSEric Fiselier#else
1351030d19bdSEric Fiselier  _LIBCPP_INLINE_VISIBILITY default_delete() {}
1352030d19bdSEric Fiselier#endif
1353030d19bdSEric Fiselier
1354e4097ad7SHoward Hinnant  template <class _Up>
1355e4097ad7SHoward Hinnant  _LIBCPP_INLINE_VISIBILITY
1356030d19bdSEric Fiselier  default_delete(const default_delete<_Up[]>&,
1357030d19bdSEric Fiselier                 typename _EnableIfConvertible<_Up>::type* = 0) _NOEXCEPT {}
1358030d19bdSEric Fiselier
1359030d19bdSEric Fiselier  template <class _Up>
1360030d19bdSEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1361030d19bdSEric Fiselier  typename _EnableIfConvertible<_Up>::type
1362030d19bdSEric Fiselier  operator()(_Up* __ptr) const _NOEXCEPT {
1363030d19bdSEric Fiselier    static_assert(sizeof(_Tp) > 0,
1364030d19bdSEric Fiselier                  "default_delete can not delete incomplete type");
1365030d19bdSEric Fiselier    static_assert(!is_void<_Tp>::value,
1366030d19bdSEric Fiselier                  "default_delete can not delete void type");
13673e519524SHoward Hinnant    delete[] __ptr;
13683e519524SHoward Hinnant  }
13693e519524SHoward Hinnant};
13703e519524SHoward Hinnant
137147272722SEric Fiseliertemplate <class _Deleter>
137247272722SEric Fiselierstruct __unique_ptr_deleter_sfinae {
137347272722SEric Fiselier  static_assert(!is_reference<_Deleter>::value, "incorrect specialization");
137447272722SEric Fiselier  typedef const _Deleter& __lval_ref_type;
137547272722SEric Fiselier  typedef _Deleter&& __good_rval_ref_type;
137647272722SEric Fiselier  typedef true_type __enable_rval_overload;
137747272722SEric Fiselier};
137847272722SEric Fiselier
137947272722SEric Fiseliertemplate <class _Deleter>
138047272722SEric Fiselierstruct __unique_ptr_deleter_sfinae<_Deleter const&> {
138147272722SEric Fiselier  typedef const _Deleter& __lval_ref_type;
138247272722SEric Fiselier  typedef const _Deleter&& __bad_rval_ref_type;
138347272722SEric Fiselier  typedef false_type __enable_rval_overload;
138447272722SEric Fiselier};
138547272722SEric Fiselier
138647272722SEric Fiseliertemplate <class _Deleter>
138747272722SEric Fiselierstruct __unique_ptr_deleter_sfinae<_Deleter&> {
138847272722SEric Fiselier  typedef _Deleter& __lval_ref_type;
138947272722SEric Fiselier  typedef _Deleter&& __bad_rval_ref_type;
139047272722SEric Fiselier  typedef false_type __enable_rval_overload;
139147272722SEric Fiselier};
139247272722SEric Fiselier
139376887bc4SVy Nguyen#if defined(_LIBCPP_ABI_ENABLE_UNIQUE_PTR_TRIVIAL_ABI)
139476887bc4SVy Nguyen#  define _LIBCPP_UNIQUE_PTR_TRIVIAL_ABI __attribute__((trivial_abi))
139576887bc4SVy Nguyen#else
139676887bc4SVy Nguyen#  define _LIBCPP_UNIQUE_PTR_TRIVIAL_ABI
139776887bc4SVy Nguyen#endif
139876887bc4SVy Nguyen
13993e519524SHoward Hinnanttemplate <class _Tp, class _Dp = default_delete<_Tp> >
140076887bc4SVy Nguyenclass _LIBCPP_UNIQUE_PTR_TRIVIAL_ABI _LIBCPP_TEMPLATE_VIS unique_ptr {
14013e519524SHoward Hinnantpublic:
14023e519524SHoward Hinnant  typedef _Tp element_type;
14033e519524SHoward Hinnant  typedef _Dp deleter_type;
14042cb4a96aSLouis Dionne  typedef _LIBCPP_NODEBUG_TYPE typename __pointer<_Tp, deleter_type>::type pointer;
140547272722SEric Fiselier
140647272722SEric Fiselier  static_assert(!is_rvalue_reference<deleter_type>::value,
140747272722SEric Fiselier                "the specified deleter type cannot be an rvalue reference");
140847272722SEric Fiselier
14093e519524SHoward Hinnantprivate:
14103e519524SHoward Hinnant  __compressed_pair<pointer, deleter_type> __ptr_;
14113e519524SHoward Hinnant
14123e519524SHoward Hinnant  struct __nat { int __for_bool_; };
14133e519524SHoward Hinnant
141414d48692SEric Fiselier  typedef _LIBCPP_NODEBUG_TYPE __unique_ptr_deleter_sfinae<_Dp> _DeleterSFINAE;
14153e519524SHoward Hinnant
141647272722SEric Fiselier  template <bool _Dummy>
141714d48692SEric Fiselier  using _LValRefType _LIBCPP_NODEBUG_TYPE =
141892e61e93SEric Fiselier      typename __dependent_type<_DeleterSFINAE, _Dummy>::__lval_ref_type;
141947272722SEric Fiselier
142047272722SEric Fiselier  template <bool _Dummy>
142114d48692SEric Fiselier  using _GoodRValRefType _LIBCPP_NODEBUG_TYPE =
142292e61e93SEric Fiselier      typename __dependent_type<_DeleterSFINAE, _Dummy>::__good_rval_ref_type;
142347272722SEric Fiselier
142447272722SEric Fiselier  template <bool _Dummy>
142514d48692SEric Fiselier  using _BadRValRefType _LIBCPP_NODEBUG_TYPE  =
142692e61e93SEric Fiselier      typename __dependent_type<_DeleterSFINAE, _Dummy>::__bad_rval_ref_type;
142747272722SEric Fiselier
142847272722SEric Fiselier  template <bool _Dummy, class _Deleter = typename __dependent_type<
142947272722SEric Fiselier                             __identity<deleter_type>, _Dummy>::type>
143014d48692SEric Fiselier  using _EnableIfDeleterDefaultConstructible _LIBCPP_NODEBUG_TYPE =
143147272722SEric Fiselier      typename enable_if<is_default_constructible<_Deleter>::value &&
143247272722SEric Fiselier                         !is_pointer<_Deleter>::value>::type;
143347272722SEric Fiselier
143447272722SEric Fiselier  template <class _ArgType>
143514d48692SEric Fiselier  using _EnableIfDeleterConstructible _LIBCPP_NODEBUG_TYPE  =
143647272722SEric Fiselier      typename enable_if<is_constructible<deleter_type, _ArgType>::value>::type;
143747272722SEric Fiselier
143847272722SEric Fiselier  template <class _UPtr, class _Up>
143914d48692SEric Fiselier  using _EnableIfMoveConvertible _LIBCPP_NODEBUG_TYPE  = typename enable_if<
144047272722SEric Fiselier      is_convertible<typename _UPtr::pointer, pointer>::value &&
144147272722SEric Fiselier      !is_array<_Up>::value
144247272722SEric Fiselier  >::type;
144347272722SEric Fiselier
144447272722SEric Fiselier  template <class _UDel>
144514d48692SEric Fiselier  using _EnableIfDeleterConvertible _LIBCPP_NODEBUG_TYPE  = typename enable_if<
144647272722SEric Fiselier      (is_reference<_Dp>::value && is_same<_Dp, _UDel>::value) ||
144747272722SEric Fiselier      (!is_reference<_Dp>::value && is_convertible<_UDel, _Dp>::value)
144847272722SEric Fiselier    >::type;
144947272722SEric Fiselier
145047272722SEric Fiselier  template <class _UDel>
145147272722SEric Fiselier  using _EnableIfDeleterAssignable = typename enable_if<
145247272722SEric Fiselier      is_assignable<_Dp&, _UDel&&>::value
145347272722SEric Fiselier    >::type;
145447272722SEric Fiselier
145547272722SEric Fiselierpublic:
145647272722SEric Fiselier  template <bool _Dummy = true,
145747272722SEric Fiselier            class = _EnableIfDeleterDefaultConstructible<_Dummy> >
145847272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1459549545b6SEric Fiselier  _LIBCPP_CONSTEXPR unique_ptr() _NOEXCEPT : __ptr_(pointer(), __default_init_tag()) {}
146047272722SEric Fiselier
146147272722SEric Fiselier  template <bool _Dummy = true,
146247272722SEric Fiselier            class = _EnableIfDeleterDefaultConstructible<_Dummy> >
146347272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1464549545b6SEric Fiselier  _LIBCPP_CONSTEXPR unique_ptr(nullptr_t) _NOEXCEPT : __ptr_(pointer(), __default_init_tag()) {}
146547272722SEric Fiselier
146647272722SEric Fiselier  template <bool _Dummy = true,
146747272722SEric Fiselier            class = _EnableIfDeleterDefaultConstructible<_Dummy> >
146847272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1469549545b6SEric Fiselier  explicit unique_ptr(pointer __p) _NOEXCEPT : __ptr_(__p, __default_init_tag()) {}
147047272722SEric Fiselier
147147272722SEric Fiselier  template <bool _Dummy = true,
147247272722SEric Fiselier            class = _EnableIfDeleterConstructible<_LValRefType<_Dummy> > >
147347272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1474fb2bd4a9SEric Fiselier  unique_ptr(pointer __p, _LValRefType<_Dummy> __d) _NOEXCEPT
14753e519524SHoward Hinnant      : __ptr_(__p, __d) {}
14763e519524SHoward Hinnant
147747272722SEric Fiselier  template <bool _Dummy = true,
147847272722SEric Fiselier            class = _EnableIfDeleterConstructible<_GoodRValRefType<_Dummy> > >
14793e519524SHoward Hinnant  _LIBCPP_INLINE_VISIBILITY
1480fb2bd4a9SEric Fiselier  unique_ptr(pointer __p, _GoodRValRefType<_Dummy> __d) _NOEXCEPT
148147272722SEric Fiselier      : __ptr_(__p, _VSTD::move(__d)) {
148247272722SEric Fiselier    static_assert(!is_reference<deleter_type>::value,
148347272722SEric Fiselier                  "rvalue deleter bound to reference");
148447272722SEric Fiselier  }
148547272722SEric Fiselier
148647272722SEric Fiselier  template <bool _Dummy = true,
148747272722SEric Fiselier            class = _EnableIfDeleterConstructible<_BadRValRefType<_Dummy> > >
148847272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
148947272722SEric Fiselier  unique_ptr(pointer __p, _BadRValRefType<_Dummy> __d) = delete;
149047272722SEric Fiselier
149147272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1492fb2bd4a9SEric Fiselier  unique_ptr(unique_ptr&& __u) _NOEXCEPT
149347272722SEric Fiselier      : __ptr_(__u.release(), _VSTD::forward<deleter_type>(__u.get_deleter())) {
149447272722SEric Fiselier  }
149547272722SEric Fiselier
149647272722SEric Fiselier  template <class _Up, class _Ep,
149747272722SEric Fiselier      class = _EnableIfMoveConvertible<unique_ptr<_Up, _Ep>, _Up>,
149847272722SEric Fiselier      class = _EnableIfDeleterConvertible<_Ep>
149947272722SEric Fiselier  >
150047272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
150147272722SEric Fiselier  unique_ptr(unique_ptr<_Up, _Ep>&& __u) _NOEXCEPT
1502ce48a113SHoward Hinnant      : __ptr_(__u.release(), _VSTD::forward<_Ep>(__u.get_deleter())) {}
15033e519524SHoward Hinnant
1504e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR)
15053e519524SHoward Hinnant  template <class _Up>
150647272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
150747272722SEric Fiselier  unique_ptr(auto_ptr<_Up>&& __p,
150847272722SEric Fiselier             typename enable_if<is_convertible<_Up*, _Tp*>::value &&
15093e519524SHoward Hinnant                                    is_same<_Dp, default_delete<_Tp> >::value,
151047272722SEric Fiselier                                __nat>::type = __nat()) _NOEXCEPT
1511549545b6SEric Fiselier      : __ptr_(__p.release(), __default_init_tag()) {}
1512e67179bcSMarshall Clow#endif
15133e519524SHoward Hinnant
151447272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
151547272722SEric Fiselier  unique_ptr& operator=(unique_ptr&& __u) _NOEXCEPT {
15163e519524SHoward Hinnant    reset(__u.release());
1517ce48a113SHoward Hinnant    __ptr_.second() = _VSTD::forward<deleter_type>(__u.get_deleter());
15183e519524SHoward Hinnant    return *this;
15193e519524SHoward Hinnant  }
15203e519524SHoward Hinnant
152147272722SEric Fiselier  template <class _Up, class _Ep,
152247272722SEric Fiselier      class = _EnableIfMoveConvertible<unique_ptr<_Up, _Ep>, _Up>,
152347272722SEric Fiselier      class = _EnableIfDeleterAssignable<_Ep>
152447272722SEric Fiselier  >
15253e519524SHoward Hinnant  _LIBCPP_INLINE_VISIBILITY
152647272722SEric Fiselier  unique_ptr& operator=(unique_ptr<_Up, _Ep>&& __u) _NOEXCEPT {
15273e519524SHoward Hinnant    reset(__u.release());
1528ce48a113SHoward Hinnant    __ptr_.second() = _VSTD::forward<_Ep>(__u.get_deleter());
15293e519524SHoward Hinnant    return *this;
15303e519524SHoward Hinnant  }
15313e519524SHoward Hinnant
1532e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR)
15333e519524SHoward Hinnant  template <class _Up>
15343e519524SHoward Hinnant  _LIBCPP_INLINE_VISIBILITY
153547272722SEric Fiselier      typename enable_if<is_convertible<_Up*, _Tp*>::value &&
15363e519524SHoward Hinnant                             is_same<_Dp, default_delete<_Tp> >::value,
153747272722SEric Fiselier                         unique_ptr&>::type
153847272722SEric Fiselier      operator=(auto_ptr<_Up> __p) {
153947272722SEric Fiselier    reset(__p.release());
154047272722SEric Fiselier    return *this;
154147272722SEric Fiselier  }
1542e67179bcSMarshall Clow#endif
15433e519524SHoward Hinnant
1544fb2bd4a9SEric Fiselier#ifdef _LIBCPP_CXX03_LANG
1545fb2bd4a9SEric Fiselier  unique_ptr(unique_ptr const&) = delete;
1546fb2bd4a9SEric Fiselier  unique_ptr& operator=(unique_ptr const&) = delete;
1547fb2bd4a9SEric Fiselier#endif
1548fb2bd4a9SEric Fiselier
1549fb2bd4a9SEric Fiselier
155047272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
155147272722SEric Fiselier  ~unique_ptr() { reset(); }
155247272722SEric Fiselier
155347272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
155447272722SEric Fiselier  unique_ptr& operator=(nullptr_t) _NOEXCEPT {
15553e519524SHoward Hinnant    reset();
15563e519524SHoward Hinnant    return *this;
15573e519524SHoward Hinnant  }
15583e519524SHoward Hinnant
1559f2f2d8b9SHoward Hinnant  _LIBCPP_INLINE_VISIBILITY
156047272722SEric Fiselier  typename add_lvalue_reference<_Tp>::type
156147272722SEric Fiselier  operator*() const {
156247272722SEric Fiselier    return *__ptr_.first();
156347272722SEric Fiselier  }
156447272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
156547272722SEric Fiselier  pointer operator->() const _NOEXCEPT {
156647272722SEric Fiselier    return __ptr_.first();
156747272722SEric Fiselier  }
156847272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
156947272722SEric Fiselier  pointer get() const _NOEXCEPT {
157047272722SEric Fiselier    return __ptr_.first();
157147272722SEric Fiselier  }
157247272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
157347272722SEric Fiselier  deleter_type& get_deleter() _NOEXCEPT {
157447272722SEric Fiselier    return __ptr_.second();
157547272722SEric Fiselier  }
157647272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
157747272722SEric Fiselier  const deleter_type& get_deleter() const _NOEXCEPT {
157847272722SEric Fiselier    return __ptr_.second();
157947272722SEric Fiselier  }
158047272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
158147272722SEric Fiselier  _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT {
158247272722SEric Fiselier    return __ptr_.first() != nullptr;
158347272722SEric Fiselier  }
15843e519524SHoward Hinnant
158547272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
158647272722SEric Fiselier  pointer release() _NOEXCEPT {
15873e519524SHoward Hinnant    pointer __t = __ptr_.first();
15883e519524SHoward Hinnant    __ptr_.first() = pointer();
15893e519524SHoward Hinnant    return __t;
15903e519524SHoward Hinnant  }
15913e519524SHoward Hinnant
159247272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
159347272722SEric Fiselier  void reset(pointer __p = pointer()) _NOEXCEPT {
15943e519524SHoward Hinnant    pointer __tmp = __ptr_.first();
15953e519524SHoward Hinnant    __ptr_.first() = __p;
15963e519524SHoward Hinnant    if (__tmp)
15973e519524SHoward Hinnant      __ptr_.second()(__tmp);
15983e519524SHoward Hinnant  }
15993e519524SHoward Hinnant
160047272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
160147272722SEric Fiselier  void swap(unique_ptr& __u) _NOEXCEPT {
160247272722SEric Fiselier    __ptr_.swap(__u.__ptr_);
160347272722SEric Fiselier  }
16043e519524SHoward Hinnant};
16053e519524SHoward Hinnant
160647272722SEric Fiselier
16073e519524SHoward Hinnanttemplate <class _Tp, class _Dp>
160876887bc4SVy Nguyenclass _LIBCPP_UNIQUE_PTR_TRIVIAL_ABI _LIBCPP_TEMPLATE_VIS unique_ptr<_Tp[], _Dp> {
16093e519524SHoward Hinnantpublic:
16103e519524SHoward Hinnant  typedef _Tp element_type;
16113e519524SHoward Hinnant  typedef _Dp deleter_type;
16122cb4a96aSLouis Dionne  typedef typename __pointer<_Tp, deleter_type>::type pointer;
161347272722SEric Fiselier
16143e519524SHoward Hinnantprivate:
16153e519524SHoward Hinnant  __compressed_pair<pointer, deleter_type> __ptr_;
16163e519524SHoward Hinnant
161792e61e93SEric Fiselier  template <class _From>
161892e61e93SEric Fiselier  struct _CheckArrayPointerConversion : is_same<_From, pointer> {};
16193e519524SHoward Hinnant
162092e61e93SEric Fiselier  template <class _FromElem>
162192e61e93SEric Fiselier  struct _CheckArrayPointerConversion<_FromElem*>
162292e61e93SEric Fiselier      : integral_constant<bool,
162392e61e93SEric Fiselier          is_same<_FromElem*, pointer>::value ||
162492e61e93SEric Fiselier            (is_same<pointer, element_type*>::value &&
162592e61e93SEric Fiselier             is_convertible<_FromElem(*)[], element_type(*)[]>::value)
162692e61e93SEric Fiselier      >
162792e61e93SEric Fiselier  {};
162847272722SEric Fiselier
162992e61e93SEric Fiselier  typedef __unique_ptr_deleter_sfinae<_Dp> _DeleterSFINAE;
163047272722SEric Fiselier
163147272722SEric Fiselier  template <bool _Dummy>
163214d48692SEric Fiselier  using _LValRefType _LIBCPP_NODEBUG_TYPE =
163392e61e93SEric Fiselier      typename __dependent_type<_DeleterSFINAE, _Dummy>::__lval_ref_type;
163447272722SEric Fiselier
163547272722SEric Fiselier  template <bool _Dummy>
163614d48692SEric Fiselier  using _GoodRValRefType _LIBCPP_NODEBUG_TYPE =
163792e61e93SEric Fiselier      typename __dependent_type<_DeleterSFINAE, _Dummy>::__good_rval_ref_type;
163847272722SEric Fiselier
163947272722SEric Fiselier  template <bool _Dummy>
164014d48692SEric Fiselier  using _BadRValRefType _LIBCPP_NODEBUG_TYPE =
164192e61e93SEric Fiselier      typename __dependent_type<_DeleterSFINAE, _Dummy>::__bad_rval_ref_type;
164247272722SEric Fiselier
164347272722SEric Fiselier  template <bool _Dummy, class _Deleter = typename __dependent_type<
164447272722SEric Fiselier                             __identity<deleter_type>, _Dummy>::type>
164514d48692SEric Fiselier  using _EnableIfDeleterDefaultConstructible _LIBCPP_NODEBUG_TYPE  =
164647272722SEric Fiselier      typename enable_if<is_default_constructible<_Deleter>::value &&
164747272722SEric Fiselier                         !is_pointer<_Deleter>::value>::type;
164847272722SEric Fiselier
164947272722SEric Fiselier  template <class _ArgType>
165014d48692SEric Fiselier  using _EnableIfDeleterConstructible _LIBCPP_NODEBUG_TYPE  =
165147272722SEric Fiselier      typename enable_if<is_constructible<deleter_type, _ArgType>::value>::type;
16523e519524SHoward Hinnant
165322747e62SLogan Chien  template <class _Pp>
165414d48692SEric Fiselier  using _EnableIfPointerConvertible _LIBCPP_NODEBUG_TYPE  = typename enable_if<
165592e61e93SEric Fiselier      _CheckArrayPointerConversion<_Pp>::value
165647272722SEric Fiselier  >::type;
165747272722SEric Fiselier
165847272722SEric Fiselier  template <class _UPtr, class _Up,
165947272722SEric Fiselier        class _ElemT = typename _UPtr::element_type>
166014d48692SEric Fiselier  using _EnableIfMoveConvertible _LIBCPP_NODEBUG_TYPE  = typename enable_if<
166147272722SEric Fiselier      is_array<_Up>::value &&
166247272722SEric Fiselier      is_same<pointer, element_type*>::value &&
166347272722SEric Fiselier      is_same<typename _UPtr::pointer, _ElemT*>::value &&
166447272722SEric Fiselier      is_convertible<_ElemT(*)[], element_type(*)[]>::value
166547272722SEric Fiselier    >::type;
166647272722SEric Fiselier
166747272722SEric Fiselier  template <class _UDel>
166814d48692SEric Fiselier  using _EnableIfDeleterConvertible _LIBCPP_NODEBUG_TYPE  = typename enable_if<
166947272722SEric Fiselier      (is_reference<_Dp>::value && is_same<_Dp, _UDel>::value) ||
167047272722SEric Fiselier      (!is_reference<_Dp>::value && is_convertible<_UDel, _Dp>::value)
167147272722SEric Fiselier    >::type;
167247272722SEric Fiselier
167347272722SEric Fiselier  template <class _UDel>
167414d48692SEric Fiselier  using _EnableIfDeleterAssignable _LIBCPP_NODEBUG_TYPE  = typename enable_if<
167547272722SEric Fiselier      is_assignable<_Dp&, _UDel&&>::value
167647272722SEric Fiselier    >::type;
167747272722SEric Fiselier
167847272722SEric Fiselierpublic:
167947272722SEric Fiselier  template <bool _Dummy = true,
168047272722SEric Fiselier            class = _EnableIfDeleterDefaultConstructible<_Dummy> >
168147272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1682549545b6SEric Fiselier  _LIBCPP_CONSTEXPR unique_ptr() _NOEXCEPT : __ptr_(pointer(), __default_init_tag()) {}
168347272722SEric Fiselier
168447272722SEric Fiselier  template <bool _Dummy = true,
168547272722SEric Fiselier            class = _EnableIfDeleterDefaultConstructible<_Dummy> >
168647272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1687549545b6SEric Fiselier  _LIBCPP_CONSTEXPR unique_ptr(nullptr_t) _NOEXCEPT : __ptr_(pointer(), __default_init_tag()) {}
168847272722SEric Fiselier
168947272722SEric Fiselier  template <class _Pp, bool _Dummy = true,
169047272722SEric Fiselier            class = _EnableIfDeleterDefaultConstructible<_Dummy>,
169147272722SEric Fiselier            class = _EnableIfPointerConvertible<_Pp> >
169247272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1693fb2bd4a9SEric Fiselier  explicit unique_ptr(_Pp __p) _NOEXCEPT
1694549545b6SEric Fiselier      : __ptr_(__p, __default_init_tag()) {}
169547272722SEric Fiselier
169647272722SEric Fiselier  template <class _Pp, bool _Dummy = true,
169747272722SEric Fiselier            class = _EnableIfDeleterConstructible<_LValRefType<_Dummy> >,
169847272722SEric Fiselier            class = _EnableIfPointerConvertible<_Pp> >
169947272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1700fb2bd4a9SEric Fiselier  unique_ptr(_Pp __p, _LValRefType<_Dummy> __d) _NOEXCEPT
17013e519524SHoward Hinnant      : __ptr_(__p, __d) {}
17023e519524SHoward Hinnant
170347272722SEric Fiselier  template <bool _Dummy = true,
170447272722SEric Fiselier            class = _EnableIfDeleterConstructible<_LValRefType<_Dummy> > >
170547272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1706fb2bd4a9SEric Fiselier  unique_ptr(nullptr_t, _LValRefType<_Dummy> __d) _NOEXCEPT
170747272722SEric Fiselier      : __ptr_(nullptr, __d) {}
17083e519524SHoward Hinnant
170947272722SEric Fiselier  template <class _Pp, bool _Dummy = true,
171047272722SEric Fiselier            class = _EnableIfDeleterConstructible<_GoodRValRefType<_Dummy> >,
171147272722SEric Fiselier            class = _EnableIfPointerConvertible<_Pp> >
171247272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1713fb2bd4a9SEric Fiselier  unique_ptr(_Pp __p, _GoodRValRefType<_Dummy> __d) _NOEXCEPT
171447272722SEric Fiselier      : __ptr_(__p, _VSTD::move(__d)) {
171547272722SEric Fiselier    static_assert(!is_reference<deleter_type>::value,
171647272722SEric Fiselier                  "rvalue deleter bound to reference");
17173e519524SHoward Hinnant  }
17183e519524SHoward Hinnant
171947272722SEric Fiselier  template <bool _Dummy = true,
172047272722SEric Fiselier            class = _EnableIfDeleterConstructible<_GoodRValRefType<_Dummy> > >
172147272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1722fb2bd4a9SEric Fiselier  unique_ptr(nullptr_t, _GoodRValRefType<_Dummy> __d) _NOEXCEPT
172347272722SEric Fiselier      : __ptr_(nullptr, _VSTD::move(__d)) {
172447272722SEric Fiselier    static_assert(!is_reference<deleter_type>::value,
172547272722SEric Fiselier                  "rvalue deleter bound to reference");
17263e519524SHoward Hinnant  }
17273e519524SHoward Hinnant
172847272722SEric Fiselier  template <class _Pp, bool _Dummy = true,
172947272722SEric Fiselier            class = _EnableIfDeleterConstructible<_BadRValRefType<_Dummy> >,
173047272722SEric Fiselier            class = _EnableIfPointerConvertible<_Pp> >
173147272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
173247272722SEric Fiselier  unique_ptr(_Pp __p, _BadRValRefType<_Dummy> __d) = delete;
17333e519524SHoward Hinnant
173447272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1735fb2bd4a9SEric Fiselier  unique_ptr(unique_ptr&& __u) _NOEXCEPT
173647272722SEric Fiselier      : __ptr_(__u.release(), _VSTD::forward<deleter_type>(__u.get_deleter())) {
173747272722SEric Fiselier  }
173847272722SEric Fiselier
173947272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1740fb2bd4a9SEric Fiselier  unique_ptr& operator=(unique_ptr&& __u) _NOEXCEPT {
17413e519524SHoward Hinnant    reset(__u.release());
1742ce48a113SHoward Hinnant    __ptr_.second() = _VSTD::forward<deleter_type>(__u.get_deleter());
17433e519524SHoward Hinnant    return *this;
17443e519524SHoward Hinnant  }
1745e4097ad7SHoward Hinnant
174647272722SEric Fiselier  template <class _Up, class _Ep,
174747272722SEric Fiselier      class = _EnableIfMoveConvertible<unique_ptr<_Up, _Ep>, _Up>,
174847272722SEric Fiselier      class = _EnableIfDeleterConvertible<_Ep>
174947272722SEric Fiselier  >
1750e4097ad7SHoward Hinnant  _LIBCPP_INLINE_VISIBILITY
1751fb2bd4a9SEric Fiselier  unique_ptr(unique_ptr<_Up, _Ep>&& __u) _NOEXCEPT
175286321b2bSEric Fiselier      : __ptr_(__u.release(), _VSTD::forward<_Ep>(__u.get_deleter())) {
175347272722SEric Fiselier  }
1754e4097ad7SHoward Hinnant
175547272722SEric Fiselier  template <class _Up, class _Ep,
175647272722SEric Fiselier      class = _EnableIfMoveConvertible<unique_ptr<_Up, _Ep>, _Up>,
175747272722SEric Fiselier      class = _EnableIfDeleterAssignable<_Ep>
175847272722SEric Fiselier  >
1759e4097ad7SHoward Hinnant  _LIBCPP_INLINE_VISIBILITY
1760e4097ad7SHoward Hinnant  unique_ptr&
1761fb2bd4a9SEric Fiselier  operator=(unique_ptr<_Up, _Ep>&& __u) _NOEXCEPT {
1762e4097ad7SHoward Hinnant    reset(__u.release());
1763e4097ad7SHoward Hinnant    __ptr_.second() = _VSTD::forward<_Ep>(__u.get_deleter());
1764e4097ad7SHoward Hinnant    return *this;
1765e4097ad7SHoward Hinnant  }
17663e519524SHoward Hinnant
1767fb2bd4a9SEric Fiselier#ifdef _LIBCPP_CXX03_LANG
1768fb2bd4a9SEric Fiselier  unique_ptr(unique_ptr const&) = delete;
1769fb2bd4a9SEric Fiselier  unique_ptr& operator=(unique_ptr const&) = delete;
1770fb2bd4a9SEric Fiselier#endif
17713e519524SHoward Hinnant
177247272722SEric Fiselierpublic:
177347272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
177447272722SEric Fiselier  ~unique_ptr() { reset(); }
177547272722SEric Fiselier
177647272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
177747272722SEric Fiselier  unique_ptr& operator=(nullptr_t) _NOEXCEPT {
17783e519524SHoward Hinnant    reset();
17793e519524SHoward Hinnant    return *this;
17803e519524SHoward Hinnant  }
17813e519524SHoward Hinnant
1782f2f2d8b9SHoward Hinnant  _LIBCPP_INLINE_VISIBILITY
178347272722SEric Fiselier  typename add_lvalue_reference<_Tp>::type
178447272722SEric Fiselier  operator[](size_t __i) const {
178547272722SEric Fiselier    return __ptr_.first()[__i];
178647272722SEric Fiselier  }
178747272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
178847272722SEric Fiselier  pointer get() const _NOEXCEPT {
178947272722SEric Fiselier    return __ptr_.first();
179047272722SEric Fiselier  }
17913e519524SHoward Hinnant
179247272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
179347272722SEric Fiselier  deleter_type& get_deleter() _NOEXCEPT {
179447272722SEric Fiselier    return __ptr_.second();
179547272722SEric Fiselier  }
179647272722SEric Fiselier
179747272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
179847272722SEric Fiselier  const deleter_type& get_deleter() const _NOEXCEPT {
179947272722SEric Fiselier    return __ptr_.second();
180047272722SEric Fiselier  }
180147272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
180247272722SEric Fiselier  _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT {
180347272722SEric Fiselier    return __ptr_.first() != nullptr;
180447272722SEric Fiselier  }
180547272722SEric Fiselier
180647272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
180747272722SEric Fiselier  pointer release() _NOEXCEPT {
18083e519524SHoward Hinnant    pointer __t = __ptr_.first();
18093e519524SHoward Hinnant    __ptr_.first() = pointer();
18103e519524SHoward Hinnant    return __t;
18113e519524SHoward Hinnant  }
18123e519524SHoward Hinnant
181322747e62SLogan Chien  template <class _Pp>
181422747e62SLogan Chien  _LIBCPP_INLINE_VISIBILITY
181547272722SEric Fiselier  typename enable_if<
181692e61e93SEric Fiselier      _CheckArrayPointerConversion<_Pp>::value
181747272722SEric Fiselier  >::type
181847272722SEric Fiselier  reset(_Pp __p) _NOEXCEPT {
18193e519524SHoward Hinnant    pointer __tmp = __ptr_.first();
18203e519524SHoward Hinnant    __ptr_.first() = __p;
18213e519524SHoward Hinnant    if (__tmp)
18223e519524SHoward Hinnant      __ptr_.second()(__tmp);
18233e519524SHoward Hinnant  }
182447272722SEric Fiselier
182547272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
182647272722SEric Fiselier  void reset(nullptr_t = nullptr) _NOEXCEPT {
18273e519524SHoward Hinnant    pointer __tmp = __ptr_.first();
18283e519524SHoward Hinnant    __ptr_.first() = nullptr;
18293e519524SHoward Hinnant    if (__tmp)
18303e519524SHoward Hinnant      __ptr_.second()(__tmp);
18313e519524SHoward Hinnant  }
18323e519524SHoward Hinnant
183347272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
183447272722SEric Fiselier  void swap(unique_ptr& __u) _NOEXCEPT {
183547272722SEric Fiselier    __ptr_.swap(__u.__ptr_);
183647272722SEric Fiselier  }
18373e519524SHoward Hinnant
18383e519524SHoward Hinnant};
18393e519524SHoward Hinnant
18403e519524SHoward Hinnanttemplate <class _Tp, class _Dp>
18413e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1842f07dd8d0SEric Fiseliertypename enable_if<
1843f07dd8d0SEric Fiselier    __is_swappable<_Dp>::value,
18443e519524SHoward Hinnant    void
1845f07dd8d0SEric Fiselier>::type
18463739fe79SHoward Hinnantswap(unique_ptr<_Tp, _Dp>& __x, unique_ptr<_Tp, _Dp>& __y) _NOEXCEPT {__x.swap(__y);}
18473e519524SHoward Hinnant
18483e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2>
18493e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
18503e519524SHoward Hinnantbool
18513e519524SHoward Hinnantoperator==(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return __x.get() == __y.get();}
18523e519524SHoward Hinnant
18533e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2>
18543e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
18553e519524SHoward Hinnantbool
18563e519524SHoward Hinnantoperator!=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__x == __y);}
18573e519524SHoward Hinnant
18583e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2>
18593e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
18603e519524SHoward Hinnantbool
186167f39647SHoward Hinnantoperator< (const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y)
186267f39647SHoward Hinnant{
186367f39647SHoward Hinnant    typedef typename unique_ptr<_T1, _D1>::pointer _P1;
186467f39647SHoward Hinnant    typedef typename unique_ptr<_T2, _D2>::pointer _P2;
18656fe361c1SEric Fiselier    typedef typename common_type<_P1, _P2>::type _Vp;
18666fe361c1SEric Fiselier    return less<_Vp>()(__x.get(), __y.get());
186767f39647SHoward Hinnant}
18683e519524SHoward Hinnant
18693e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2>
18703e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
18713e519524SHoward Hinnantbool
18723e519524SHoward Hinnantoperator> (const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return __y < __x;}
18733e519524SHoward Hinnant
18743e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2>
18753e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
18763e519524SHoward Hinnantbool
18773e519524SHoward Hinnantoperator<=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__y < __x);}
18783e519524SHoward Hinnant
18793e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2>
18803e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
18813e519524SHoward Hinnantbool
18823e519524SHoward Hinnantoperator>=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__x < __y);}
18833e519524SHoward Hinnant
188467f39647SHoward Hinnanttemplate <class _T1, class _D1>
188567f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
188667f39647SHoward Hinnantbool
1887c0937e8aSHoward Hinnantoperator==(const unique_ptr<_T1, _D1>& __x, nullptr_t) _NOEXCEPT
188867f39647SHoward Hinnant{
188967f39647SHoward Hinnant    return !__x;
189067f39647SHoward Hinnant}
189167f39647SHoward Hinnant
189267f39647SHoward Hinnanttemplate <class _T1, class _D1>
189367f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
189467f39647SHoward Hinnantbool
1895c0937e8aSHoward Hinnantoperator==(nullptr_t, const unique_ptr<_T1, _D1>& __x) _NOEXCEPT
189667f39647SHoward Hinnant{
189767f39647SHoward Hinnant    return !__x;
189867f39647SHoward Hinnant}
189967f39647SHoward Hinnant
190067f39647SHoward Hinnanttemplate <class _T1, class _D1>
190167f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
190267f39647SHoward Hinnantbool
1903c0937e8aSHoward Hinnantoperator!=(const unique_ptr<_T1, _D1>& __x, nullptr_t) _NOEXCEPT
190467f39647SHoward Hinnant{
190567f39647SHoward Hinnant    return static_cast<bool>(__x);
190667f39647SHoward Hinnant}
190767f39647SHoward Hinnant
190867f39647SHoward Hinnanttemplate <class _T1, class _D1>
190967f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
191067f39647SHoward Hinnantbool
1911c0937e8aSHoward Hinnantoperator!=(nullptr_t, const unique_ptr<_T1, _D1>& __x) _NOEXCEPT
191267f39647SHoward Hinnant{
191367f39647SHoward Hinnant    return static_cast<bool>(__x);
191467f39647SHoward Hinnant}
191567f39647SHoward Hinnant
191667f39647SHoward Hinnanttemplate <class _T1, class _D1>
191767f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
191867f39647SHoward Hinnantbool
191967f39647SHoward Hinnantoperator<(const unique_ptr<_T1, _D1>& __x, nullptr_t)
192067f39647SHoward Hinnant{
192167f39647SHoward Hinnant    typedef typename unique_ptr<_T1, _D1>::pointer _P1;
192267f39647SHoward Hinnant    return less<_P1>()(__x.get(), nullptr);
192367f39647SHoward Hinnant}
192467f39647SHoward Hinnant
192567f39647SHoward Hinnanttemplate <class _T1, class _D1>
192667f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
192767f39647SHoward Hinnantbool
192867f39647SHoward Hinnantoperator<(nullptr_t, const unique_ptr<_T1, _D1>& __x)
192967f39647SHoward Hinnant{
193067f39647SHoward Hinnant    typedef typename unique_ptr<_T1, _D1>::pointer _P1;
193167f39647SHoward Hinnant    return less<_P1>()(nullptr, __x.get());
193267f39647SHoward Hinnant}
193367f39647SHoward Hinnant
193467f39647SHoward Hinnanttemplate <class _T1, class _D1>
193567f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
193667f39647SHoward Hinnantbool
193767f39647SHoward Hinnantoperator>(const unique_ptr<_T1, _D1>& __x, nullptr_t)
193867f39647SHoward Hinnant{
193967f39647SHoward Hinnant    return nullptr < __x;
194067f39647SHoward Hinnant}
194167f39647SHoward Hinnant
194267f39647SHoward Hinnanttemplate <class _T1, class _D1>
194367f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
194467f39647SHoward Hinnantbool
194567f39647SHoward Hinnantoperator>(nullptr_t, const unique_ptr<_T1, _D1>& __x)
194667f39647SHoward Hinnant{
194767f39647SHoward Hinnant    return __x < nullptr;
194867f39647SHoward Hinnant}
194967f39647SHoward Hinnant
195067f39647SHoward Hinnanttemplate <class _T1, class _D1>
195167f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
195267f39647SHoward Hinnantbool
195367f39647SHoward Hinnantoperator<=(const unique_ptr<_T1, _D1>& __x, nullptr_t)
195467f39647SHoward Hinnant{
195567f39647SHoward Hinnant    return !(nullptr < __x);
195667f39647SHoward Hinnant}
195767f39647SHoward Hinnant
195867f39647SHoward Hinnanttemplate <class _T1, class _D1>
195967f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
196067f39647SHoward Hinnantbool
196167f39647SHoward Hinnantoperator<=(nullptr_t, const unique_ptr<_T1, _D1>& __x)
196267f39647SHoward Hinnant{
196367f39647SHoward Hinnant    return !(__x < nullptr);
196467f39647SHoward Hinnant}
196567f39647SHoward Hinnant
196667f39647SHoward Hinnanttemplate <class _T1, class _D1>
196767f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
196867f39647SHoward Hinnantbool
196967f39647SHoward Hinnantoperator>=(const unique_ptr<_T1, _D1>& __x, nullptr_t)
197067f39647SHoward Hinnant{
197167f39647SHoward Hinnant    return !(__x < nullptr);
197267f39647SHoward Hinnant}
197367f39647SHoward Hinnant
197467f39647SHoward Hinnanttemplate <class _T1, class _D1>
197567f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
197667f39647SHoward Hinnantbool
197767f39647SHoward Hinnantoperator>=(nullptr_t, const unique_ptr<_T1, _D1>& __x)
197867f39647SHoward Hinnant{
197967f39647SHoward Hinnant    return !(nullptr < __x);
198067f39647SHoward Hinnant}
198167f39647SHoward Hinnant
198228d8ba5fSMarshall Clow#if _LIBCPP_STD_VER > 11
198328d8ba5fSMarshall Clow
198428d8ba5fSMarshall Clowtemplate<class _Tp>
198528d8ba5fSMarshall Clowstruct __unique_if
198628d8ba5fSMarshall Clow{
198728d8ba5fSMarshall Clow    typedef unique_ptr<_Tp> __unique_single;
198828d8ba5fSMarshall Clow};
198928d8ba5fSMarshall Clow
199028d8ba5fSMarshall Clowtemplate<class _Tp>
199128d8ba5fSMarshall Clowstruct __unique_if<_Tp[]>
199228d8ba5fSMarshall Clow{
199328d8ba5fSMarshall Clow    typedef unique_ptr<_Tp[]> __unique_array_unknown_bound;
199428d8ba5fSMarshall Clow};
199528d8ba5fSMarshall Clow
199628d8ba5fSMarshall Clowtemplate<class _Tp, size_t _Np>
199728d8ba5fSMarshall Clowstruct __unique_if<_Tp[_Np]>
199828d8ba5fSMarshall Clow{
199928d8ba5fSMarshall Clow    typedef void __unique_array_known_bound;
200028d8ba5fSMarshall Clow};
200128d8ba5fSMarshall Clow
200228d8ba5fSMarshall Clowtemplate<class _Tp, class... _Args>
200395ddb530SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
200428d8ba5fSMarshall Clowtypename __unique_if<_Tp>::__unique_single
200528d8ba5fSMarshall Clowmake_unique(_Args&&... __args)
200628d8ba5fSMarshall Clow{
200728d8ba5fSMarshall Clow    return unique_ptr<_Tp>(new _Tp(_VSTD::forward<_Args>(__args)...));
200828d8ba5fSMarshall Clow}
200928d8ba5fSMarshall Clow
201028d8ba5fSMarshall Clowtemplate<class _Tp>
201195ddb530SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
201228d8ba5fSMarshall Clowtypename __unique_if<_Tp>::__unique_array_unknown_bound
201328d8ba5fSMarshall Clowmake_unique(size_t __n)
201428d8ba5fSMarshall Clow{
201528d8ba5fSMarshall Clow    typedef typename remove_extent<_Tp>::type _Up;
201628d8ba5fSMarshall Clow    return unique_ptr<_Tp>(new _Up[__n]());
201728d8ba5fSMarshall Clow}
201828d8ba5fSMarshall Clow
201928d8ba5fSMarshall Clowtemplate<class _Tp, class... _Args>
202028d8ba5fSMarshall Clow    typename __unique_if<_Tp>::__unique_array_known_bound
202128d8ba5fSMarshall Clow    make_unique(_Args&&...) = delete;
202228d8ba5fSMarshall Clow
202328d8ba5fSMarshall Clow#endif  // _LIBCPP_STD_VER > 11
202428d8ba5fSMarshall Clow
2025d1803b6cSHoward Hinnanttemplate <class _Tp, class _Dp>
2026f9127593SEric Fiselier#ifdef _LIBCPP_CXX03_LANG
2027e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS hash<unique_ptr<_Tp, _Dp> >
2028f9127593SEric Fiselier#else
2029f9127593SEric Fiselierstruct _LIBCPP_TEMPLATE_VIS hash<__enable_hash_helper<
2030f9127593SEric Fiselier    unique_ptr<_Tp, _Dp>, typename unique_ptr<_Tp, _Dp>::pointer> >
2031f9127593SEric Fiselier#endif
2032d1803b6cSHoward Hinnant{
2033d1803b6cSHoward Hinnant    typedef unique_ptr<_Tp, _Dp> argument_type;
2034d1803b6cSHoward Hinnant    typedef size_t               result_type;
2035848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20367c803385SMarshall Clow    result_type operator()(const argument_type& __ptr) const
2037d1803b6cSHoward Hinnant    {
2038d1803b6cSHoward Hinnant        typedef typename argument_type::pointer pointer;
2039d1803b6cSHoward Hinnant        return hash<pointer>()(__ptr.get());
2040d1803b6cSHoward Hinnant    }
2041d1803b6cSHoward Hinnant};
2042d1803b6cSHoward Hinnant
20433e519524SHoward Hinnantstruct __destruct_n
20443e519524SHoward Hinnant{
20453e519524SHoward Hinnantprivate:
20469ffacf3dSEric Fiselier    size_t __size_;
20473e519524SHoward Hinnant
20483e519524SHoward Hinnant    template <class _Tp>
20493739fe79SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY void __process(_Tp* __p, false_type) _NOEXCEPT
20509ffacf3dSEric Fiselier        {for (size_t __i = 0; __i < __size_; ++__i, ++__p) __p->~_Tp();}
20513e519524SHoward Hinnant
20523e519524SHoward Hinnant    template <class _Tp>
20533739fe79SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY void __process(_Tp*, true_type) _NOEXCEPT
20543e519524SHoward Hinnant        {}
20553e519524SHoward Hinnant
20563739fe79SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY void __incr(false_type) _NOEXCEPT
20579ffacf3dSEric Fiselier        {++__size_;}
20583739fe79SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY void __incr(true_type) _NOEXCEPT
20593e519524SHoward Hinnant        {}
20603e519524SHoward Hinnant
20613739fe79SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY void __set(size_t __s, false_type) _NOEXCEPT
20629ffacf3dSEric Fiselier        {__size_ = __s;}
20633739fe79SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY void __set(size_t, true_type) _NOEXCEPT
20643e519524SHoward Hinnant        {}
20653e519524SHoward Hinnantpublic:
20663739fe79SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit __destruct_n(size_t __s) _NOEXCEPT
20679ffacf3dSEric Fiselier        : __size_(__s) {}
20683e519524SHoward Hinnant
20693e519524SHoward Hinnant    template <class _Tp>
2070527a7fdfSBruce Mitchener    _LIBCPP_INLINE_VISIBILITY void __incr() _NOEXCEPT
2071ca740483SHoward Hinnant        {__incr(integral_constant<bool, is_trivially_destructible<_Tp>::value>());}
20723e519524SHoward Hinnant
20733e519524SHoward Hinnant    template <class _Tp>
20743739fe79SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY void __set(size_t __s, _Tp*) _NOEXCEPT
2075ca740483SHoward Hinnant        {__set(__s, integral_constant<bool, is_trivially_destructible<_Tp>::value>());}
20763e519524SHoward Hinnant
20773e519524SHoward Hinnant    template <class _Tp>
20783739fe79SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __p) _NOEXCEPT
2079ca740483SHoward Hinnant        {__process(__p, integral_constant<bool, is_trivially_destructible<_Tp>::value>());}
20803e519524SHoward Hinnant};
20813e519524SHoward Hinnant
20823e519524SHoward Hinnanttemplate <class _Alloc>
20833e519524SHoward Hinnantclass __allocator_destructor
20843e519524SHoward Hinnant{
208514d48692SEric Fiselier    typedef _LIBCPP_NODEBUG_TYPE allocator_traits<_Alloc> __alloc_traits;
20863e519524SHoward Hinnantpublic:
208714d48692SEric Fiselier    typedef _LIBCPP_NODEBUG_TYPE typename __alloc_traits::pointer pointer;
208814d48692SEric Fiselier    typedef _LIBCPP_NODEBUG_TYPE typename __alloc_traits::size_type size_type;
20893e519524SHoward Hinnantprivate:
20903e519524SHoward Hinnant    _Alloc& __alloc_;
20913e519524SHoward Hinnant    size_type __s_;
20923e519524SHoward Hinnantpublic:
20933e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __allocator_destructor(_Alloc& __a, size_type __s)
20943739fe79SHoward Hinnant             _NOEXCEPT
20953e519524SHoward Hinnant        : __alloc_(__a), __s_(__s) {}
2096848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20973739fe79SHoward Hinnant    void operator()(pointer __p) _NOEXCEPT
20983739fe79SHoward Hinnant        {__alloc_traits::deallocate(__alloc_, __p, __s_);}
20993e519524SHoward Hinnant};
21003e519524SHoward Hinnant
21013e519524SHoward Hinnanttemplate <class _InputIterator, class _ForwardIterator>
21023e519524SHoward Hinnant_ForwardIterator
21033e519524SHoward Hinnantuninitialized_copy(_InputIterator __f, _InputIterator __l, _ForwardIterator __r)
21043e519524SHoward Hinnant{
21053e519524SHoward Hinnant    typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
2106b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
2107b34b4819SHoward Hinnant    _ForwardIterator __s = __r;
2108b34b4819SHoward Hinnant    try
2109b34b4819SHoward Hinnant    {
2110b34b4819SHoward Hinnant#endif
2111a00932bdSMarshall Clow        for (; __f != __l; ++__f, (void) ++__r)
2112be4c657bSArthur O'Dwyer            ::new ((void*)_VSTD::addressof(*__r)) value_type(*__f);
2113b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
2114b34b4819SHoward Hinnant    }
2115b34b4819SHoward Hinnant    catch (...)
2116b34b4819SHoward Hinnant    {
2117b34b4819SHoward Hinnant        for (; __s != __r; ++__s)
2118b34b4819SHoward Hinnant            __s->~value_type();
2119b34b4819SHoward Hinnant        throw;
2120b34b4819SHoward Hinnant    }
2121b34b4819SHoward Hinnant#endif
21223e519524SHoward Hinnant    return __r;
21233e519524SHoward Hinnant}
21243e519524SHoward Hinnant
21253e519524SHoward Hinnanttemplate <class _InputIterator, class _Size, class _ForwardIterator>
21263e519524SHoward Hinnant_ForwardIterator
21273e519524SHoward Hinnantuninitialized_copy_n(_InputIterator __f, _Size __n, _ForwardIterator __r)
21283e519524SHoward Hinnant{
21293e519524SHoward Hinnant    typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
2130b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
2131b34b4819SHoward Hinnant    _ForwardIterator __s = __r;
2132b34b4819SHoward Hinnant    try
2133b34b4819SHoward Hinnant    {
2134b34b4819SHoward Hinnant#endif
2135a00932bdSMarshall Clow        for (; __n > 0; ++__f, (void) ++__r, (void) --__n)
2136be4c657bSArthur O'Dwyer            ::new ((void*)_VSTD::addressof(*__r)) value_type(*__f);
2137b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
2138b34b4819SHoward Hinnant    }
2139b34b4819SHoward Hinnant    catch (...)
2140b34b4819SHoward Hinnant    {
2141b34b4819SHoward Hinnant        for (; __s != __r; ++__s)
2142b34b4819SHoward Hinnant            __s->~value_type();
2143b34b4819SHoward Hinnant        throw;
2144b34b4819SHoward Hinnant    }
2145b34b4819SHoward Hinnant#endif
21463e519524SHoward Hinnant    return __r;
21473e519524SHoward Hinnant}
21483e519524SHoward Hinnant
21493e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Tp>
21503e519524SHoward Hinnantvoid
21513e519524SHoward Hinnantuninitialized_fill(_ForwardIterator __f, _ForwardIterator __l, const _Tp& __x)
21523e519524SHoward Hinnant{
21533e519524SHoward Hinnant    typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
2154b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
2155b34b4819SHoward Hinnant    _ForwardIterator __s = __f;
2156b34b4819SHoward Hinnant    try
2157b34b4819SHoward Hinnant    {
2158b34b4819SHoward Hinnant#endif
2159b34b4819SHoward Hinnant        for (; __f != __l; ++__f)
2160be4c657bSArthur O'Dwyer            ::new ((void*)_VSTD::addressof(*__f)) value_type(__x);
2161b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
2162b34b4819SHoward Hinnant    }
2163b34b4819SHoward Hinnant    catch (...)
2164b34b4819SHoward Hinnant    {
2165b34b4819SHoward Hinnant        for (; __s != __f; ++__s)
2166b34b4819SHoward Hinnant            __s->~value_type();
2167b34b4819SHoward Hinnant        throw;
2168b34b4819SHoward Hinnant    }
2169b34b4819SHoward Hinnant#endif
21703e519524SHoward Hinnant}
21713e519524SHoward Hinnant
21723e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Size, class _Tp>
217348d05bd2SHoward Hinnant_ForwardIterator
21743e519524SHoward Hinnantuninitialized_fill_n(_ForwardIterator __f, _Size __n, const _Tp& __x)
21753e519524SHoward Hinnant{
21763e519524SHoward Hinnant    typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
2177b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
2178b34b4819SHoward Hinnant    _ForwardIterator __s = __f;
2179b34b4819SHoward Hinnant    try
2180b34b4819SHoward Hinnant    {
2181b34b4819SHoward Hinnant#endif
2182a00932bdSMarshall Clow        for (; __n > 0; ++__f, (void) --__n)
2183be4c657bSArthur O'Dwyer            ::new ((void*)_VSTD::addressof(*__f)) value_type(__x);
2184b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
2185b34b4819SHoward Hinnant    }
2186b34b4819SHoward Hinnant    catch (...)
2187b34b4819SHoward Hinnant    {
2188b34b4819SHoward Hinnant        for (; __s != __f; ++__s)
2189b34b4819SHoward Hinnant            __s->~value_type();
2190b34b4819SHoward Hinnant        throw;
2191b34b4819SHoward Hinnant    }
2192b34b4819SHoward Hinnant#endif
219348d05bd2SHoward Hinnant    return __f;
21943e519524SHoward Hinnant}
21953e519524SHoward Hinnant
2196e4d9c316SEric Fiselier#if _LIBCPP_STD_VER > 14
2197e4d9c316SEric Fiselier
2198e4d9c316SEric Fiseliertemplate <class _ForwardIterator>
21990724f8bfSLouis Dionneinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
2200e4d9c316SEric Fiseliervoid destroy(_ForwardIterator __first, _ForwardIterator __last) {
2201e4d9c316SEric Fiselier    for (; __first != __last; ++__first)
2202e4d9c316SEric Fiselier        _VSTD::destroy_at(_VSTD::addressof(*__first));
2203e4d9c316SEric Fiselier}
2204e4d9c316SEric Fiselier
2205e4d9c316SEric Fiseliertemplate <class _ForwardIterator, class _Size>
22060724f8bfSLouis Dionneinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
2207e4d9c316SEric Fiselier_ForwardIterator destroy_n(_ForwardIterator __first, _Size __n) {
2208e4d9c316SEric Fiselier    for (; __n > 0; (void)++__first, --__n)
2209e4d9c316SEric Fiselier        _VSTD::destroy_at(_VSTD::addressof(*__first));
2210e4d9c316SEric Fiselier    return __first;
2211e4d9c316SEric Fiselier}
2212e4d9c316SEric Fiselier
2213e778d10cSEric Fiseliertemplate <class _ForwardIterator>
2214e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY
2215e778d10cSEric Fiseliervoid uninitialized_default_construct(_ForwardIterator __first, _ForwardIterator __last) {
2216e778d10cSEric Fiselier    using _Vt = typename iterator_traits<_ForwardIterator>::value_type;
2217e778d10cSEric Fiselier    auto __idx = __first;
2218e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS
2219e778d10cSEric Fiselier    try {
2220e778d10cSEric Fiselier#endif
2221e778d10cSEric Fiselier    for (; __idx != __last; ++__idx)
2222e778d10cSEric Fiselier        ::new ((void*)_VSTD::addressof(*__idx)) _Vt;
2223e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS
2224e778d10cSEric Fiselier    } catch (...) {
2225e778d10cSEric Fiselier        _VSTD::destroy(__first, __idx);
2226e778d10cSEric Fiselier        throw;
2227e778d10cSEric Fiselier    }
2228e778d10cSEric Fiselier#endif
2229e778d10cSEric Fiselier}
2230e778d10cSEric Fiselier
2231e778d10cSEric Fiseliertemplate <class _ForwardIterator, class _Size>
2232e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY
2233e778d10cSEric Fiselier_ForwardIterator uninitialized_default_construct_n(_ForwardIterator __first, _Size __n) {
2234e778d10cSEric Fiselier    using _Vt = typename iterator_traits<_ForwardIterator>::value_type;
2235e778d10cSEric Fiselier    auto __idx = __first;
2236e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS
2237e778d10cSEric Fiselier    try {
2238e778d10cSEric Fiselier#endif
2239e778d10cSEric Fiselier    for (; __n > 0; (void)++__idx, --__n)
2240e778d10cSEric Fiselier        ::new ((void*)_VSTD::addressof(*__idx)) _Vt;
2241e778d10cSEric Fiselier    return __idx;
2242e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS
2243e778d10cSEric Fiselier    } catch (...) {
2244e778d10cSEric Fiselier        _VSTD::destroy(__first, __idx);
2245e778d10cSEric Fiselier        throw;
2246e778d10cSEric Fiselier    }
2247e778d10cSEric Fiselier#endif
2248e778d10cSEric Fiselier}
2249e778d10cSEric Fiselier
2250e778d10cSEric Fiselier
2251e778d10cSEric Fiseliertemplate <class _ForwardIterator>
2252e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY
2253e778d10cSEric Fiseliervoid uninitialized_value_construct(_ForwardIterator __first, _ForwardIterator __last) {
2254e778d10cSEric Fiselier    using _Vt = typename iterator_traits<_ForwardIterator>::value_type;
2255e778d10cSEric Fiselier    auto __idx = __first;
2256e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS
2257e778d10cSEric Fiselier    try {
2258e778d10cSEric Fiselier#endif
2259e778d10cSEric Fiselier    for (; __idx != __last; ++__idx)
2260e778d10cSEric Fiselier        ::new ((void*)_VSTD::addressof(*__idx)) _Vt();
2261e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS
2262e778d10cSEric Fiselier    } catch (...) {
2263e778d10cSEric Fiselier        _VSTD::destroy(__first, __idx);
2264e778d10cSEric Fiselier        throw;
2265e778d10cSEric Fiselier    }
2266e778d10cSEric Fiselier#endif
2267e778d10cSEric Fiselier}
2268e778d10cSEric Fiselier
2269e778d10cSEric Fiseliertemplate <class _ForwardIterator, class _Size>
2270e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY
2271e778d10cSEric Fiselier_ForwardIterator uninitialized_value_construct_n(_ForwardIterator __first, _Size __n) {
2272e778d10cSEric Fiselier    using _Vt = typename iterator_traits<_ForwardIterator>::value_type;
2273e778d10cSEric Fiselier    auto __idx = __first;
2274e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS
2275e778d10cSEric Fiselier    try {
2276e778d10cSEric Fiselier#endif
2277e778d10cSEric Fiselier    for (; __n > 0; (void)++__idx, --__n)
2278e778d10cSEric Fiselier        ::new ((void*)_VSTD::addressof(*__idx)) _Vt();
2279e778d10cSEric Fiselier    return __idx;
2280e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS
2281e778d10cSEric Fiselier    } catch (...) {
2282e778d10cSEric Fiselier        _VSTD::destroy(__first, __idx);
2283e778d10cSEric Fiselier        throw;
2284e778d10cSEric Fiselier    }
2285e778d10cSEric Fiselier#endif
2286e778d10cSEric Fiselier}
2287e778d10cSEric Fiselier
2288e778d10cSEric Fiselier
2289e778d10cSEric Fiseliertemplate <class _InputIt, class _ForwardIt>
2290e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY
2291e778d10cSEric Fiselier_ForwardIt uninitialized_move(_InputIt __first, _InputIt __last, _ForwardIt __first_res) {
2292e778d10cSEric Fiselier    using _Vt = typename iterator_traits<_ForwardIt>::value_type;
2293e778d10cSEric Fiselier    auto __idx = __first_res;
2294e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS
2295e778d10cSEric Fiselier    try {
2296e778d10cSEric Fiselier#endif
2297e778d10cSEric Fiselier    for (; __first != __last; (void)++__idx, ++__first)
2298d586f92cSArthur O'Dwyer        ::new ((void*)_VSTD::addressof(*__idx)) _Vt(_VSTD::move(*__first));
2299e778d10cSEric Fiselier    return __idx;
2300e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS
2301e778d10cSEric Fiselier    } catch (...) {
2302e778d10cSEric Fiselier        _VSTD::destroy(__first_res, __idx);
2303e778d10cSEric Fiselier        throw;
2304e778d10cSEric Fiselier    }
2305e778d10cSEric Fiselier#endif
2306e778d10cSEric Fiselier}
2307e778d10cSEric Fiselier
2308e778d10cSEric Fiseliertemplate <class _InputIt, class _Size, class _ForwardIt>
2309e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY
2310e778d10cSEric Fiselierpair<_InputIt, _ForwardIt>
2311e778d10cSEric Fiselieruninitialized_move_n(_InputIt __first, _Size __n, _ForwardIt __first_res) {
2312e778d10cSEric Fiselier    using _Vt = typename iterator_traits<_ForwardIt>::value_type;
2313e778d10cSEric Fiselier    auto __idx = __first_res;
2314e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS
2315e778d10cSEric Fiselier    try {
2316e778d10cSEric Fiselier#endif
2317e778d10cSEric Fiselier    for (; __n > 0; ++__idx, (void)++__first, --__n)
2318d586f92cSArthur O'Dwyer        ::new ((void*)_VSTD::addressof(*__idx)) _Vt(_VSTD::move(*__first));
2319e778d10cSEric Fiselier    return {__first, __idx};
2320e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS
2321e778d10cSEric Fiselier    } catch (...) {
2322e778d10cSEric Fiselier        _VSTD::destroy(__first_res, __idx);
2323e778d10cSEric Fiselier        throw;
2324e778d10cSEric Fiselier    }
2325e778d10cSEric Fiselier#endif
2326e778d10cSEric Fiselier}
2327e778d10cSEric Fiselier
2328e778d10cSEric Fiselier
2329e4d9c316SEric Fiselier#endif // _LIBCPP_STD_VER > 14
2330e4d9c316SEric Fiselier
2331f08de52dSKevin Hu// NOTE: Relaxed and acq/rel atomics (for increment and decrement respectively)
2332f08de52dSKevin Hu// should be sufficient for thread safety.
23333c62198cSLouis Dionne// See https://llvm.org/PR22803
2334f08de52dSKevin Hu#if defined(__clang__) && __has_builtin(__atomic_add_fetch)          \
2335f08de52dSKevin Hu                       && defined(__ATOMIC_RELAXED)                  \
2336f08de52dSKevin Hu                       && defined(__ATOMIC_ACQ_REL)
2337f08de52dSKevin Hu#   define _LIBCPP_HAS_BUILTIN_ATOMIC_SUPPORT
2338ae62727aSRichard Smith#elif defined(_LIBCPP_COMPILER_GCC)
2339f08de52dSKevin Hu#   define _LIBCPP_HAS_BUILTIN_ATOMIC_SUPPORT
2340f08de52dSKevin Hu#endif
2341f08de52dSKevin Hu
2342f08de52dSKevin Hutemplate <class _Tp>
2343f08de52dSKevin Huinline _LIBCPP_INLINE_VISIBILITY _Tp
2344f08de52dSKevin Hu__libcpp_atomic_refcount_increment(_Tp& __t) _NOEXCEPT
2345f08de52dSKevin Hu{
2346f08de52dSKevin Hu#if defined(_LIBCPP_HAS_BUILTIN_ATOMIC_SUPPORT) && !defined(_LIBCPP_HAS_NO_THREADS)
2347f08de52dSKevin Hu    return __atomic_add_fetch(&__t, 1, __ATOMIC_RELAXED);
2348f08de52dSKevin Hu#else
2349f08de52dSKevin Hu    return __t += 1;
2350f08de52dSKevin Hu#endif
2351f08de52dSKevin Hu}
2352f08de52dSKevin Hu
2353f08de52dSKevin Hutemplate <class _Tp>
2354f08de52dSKevin Huinline _LIBCPP_INLINE_VISIBILITY _Tp
2355f08de52dSKevin Hu__libcpp_atomic_refcount_decrement(_Tp& __t) _NOEXCEPT
2356f08de52dSKevin Hu{
2357f08de52dSKevin Hu#if defined(_LIBCPP_HAS_BUILTIN_ATOMIC_SUPPORT) && !defined(_LIBCPP_HAS_NO_THREADS)
2358f08de52dSKevin Hu    return __atomic_add_fetch(&__t, -1, __ATOMIC_ACQ_REL);
2359f08de52dSKevin Hu#else
2360f08de52dSKevin Hu    return __t -= 1;
2361f08de52dSKevin Hu#endif
2362f08de52dSKevin Hu}
2363f08de52dSKevin Hu
2364848a5374SHoward Hinnantclass _LIBCPP_EXCEPTION_ABI bad_weak_ptr
23653e519524SHoward Hinnant    : public std::exception
23663e519524SHoward Hinnant{
23673e519524SHoward Hinnantpublic:
2368585a3cc3SDimitry Andric    bad_weak_ptr() _NOEXCEPT = default;
2369585a3cc3SDimitry Andric    bad_weak_ptr(const bad_weak_ptr&) _NOEXCEPT = default;
23703739fe79SHoward Hinnant    virtual ~bad_weak_ptr() _NOEXCEPT;
23713739fe79SHoward Hinnant    virtual const char* what() const  _NOEXCEPT;
23723e519524SHoward Hinnant};
23733e519524SHoward Hinnant
2374dc7200b4SLouis Dionne_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
2375d437fa5cSMarshall Clowvoid __throw_bad_weak_ptr()
2376d437fa5cSMarshall Clow{
2377d437fa5cSMarshall Clow#ifndef _LIBCPP_NO_EXCEPTIONS
2378d437fa5cSMarshall Clow    throw bad_weak_ptr();
2379d437fa5cSMarshall Clow#else
2380d437fa5cSMarshall Clow    _VSTD::abort();
2381d437fa5cSMarshall Clow#endif
2382d437fa5cSMarshall Clow}
2383d437fa5cSMarshall Clow
2384e2f2d1edSEric Fiseliertemplate<class _Tp> class _LIBCPP_TEMPLATE_VIS weak_ptr;
23853e519524SHoward Hinnant
2386f0544c20SHoward Hinnantclass _LIBCPP_TYPE_VIS __shared_count
23873e519524SHoward Hinnant{
23883e519524SHoward Hinnant    __shared_count(const __shared_count&);
23893e519524SHoward Hinnant    __shared_count& operator=(const __shared_count&);
23903e519524SHoward Hinnant
23913e519524SHoward Hinnantprotected:
23923e519524SHoward Hinnant    long __shared_owners_;
23933e519524SHoward Hinnant    virtual ~__shared_count();
23943e519524SHoward Hinnantprivate:
23953739fe79SHoward Hinnant    virtual void __on_zero_shared() _NOEXCEPT = 0;
23963e519524SHoward Hinnant
23973e519524SHoward Hinnantpublic:
2398848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
23993739fe79SHoward Hinnant    explicit __shared_count(long __refs = 0) _NOEXCEPT
24003e519524SHoward Hinnant        : __shared_owners_(__refs) {}
24013e519524SHoward Hinnant
2402c8e84ff2SLouis Dionne#if defined(_LIBCPP_BUILDING_LIBRARY) && \
240311f60453SEric Fiselier    defined(_LIBCPP_DEPRECATED_ABI_LEGACY_LIBRARY_DEFINITIONS_FOR_INLINE_FUNCTIONS)
2404a480c28bSEric Fiselier    void __add_shared() _NOEXCEPT;
2405a480c28bSEric Fiselier    bool __release_shared() _NOEXCEPT;
2406f08de52dSKevin Hu#else
2407f08de52dSKevin Hu    _LIBCPP_INLINE_VISIBILITY
2408f08de52dSKevin Hu    void __add_shared() _NOEXCEPT {
2409f08de52dSKevin Hu      __libcpp_atomic_refcount_increment(__shared_owners_);
2410f08de52dSKevin Hu    }
2411f08de52dSKevin Hu    _LIBCPP_INLINE_VISIBILITY
2412f08de52dSKevin Hu    bool __release_shared() _NOEXCEPT {
2413f08de52dSKevin Hu      if (__libcpp_atomic_refcount_decrement(__shared_owners_) == -1) {
2414f08de52dSKevin Hu        __on_zero_shared();
2415f08de52dSKevin Hu        return true;
2416f08de52dSKevin Hu      }
2417f08de52dSKevin Hu      return false;
2418f08de52dSKevin Hu    }
2419f08de52dSKevin Hu#endif
2420848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
24211faf289eSEric Fiselier    long use_count() const _NOEXCEPT {
24221faf289eSEric Fiselier        return __libcpp_relaxed_load(&__shared_owners_) + 1;
24231faf289eSEric Fiselier    }
24243e519524SHoward Hinnant};
24253e519524SHoward Hinnant
2426f0544c20SHoward Hinnantclass _LIBCPP_TYPE_VIS __shared_weak_count
24273e519524SHoward Hinnant    : private __shared_count
24283e519524SHoward Hinnant{
24293e519524SHoward Hinnant    long __shared_weak_owners_;
24303e519524SHoward Hinnant
24313e519524SHoward Hinnantpublic:
2432848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
24333739fe79SHoward Hinnant    explicit __shared_weak_count(long __refs = 0) _NOEXCEPT
24343e519524SHoward Hinnant        : __shared_count(__refs),
24353e519524SHoward Hinnant          __shared_weak_owners_(__refs) {}
24363e519524SHoward Hinnantprotected:
24373e519524SHoward Hinnant    virtual ~__shared_weak_count();
24383e519524SHoward Hinnant
24393e519524SHoward Hinnantpublic:
2440c8e84ff2SLouis Dionne#if defined(_LIBCPP_BUILDING_LIBRARY) && \
244111f60453SEric Fiselier    defined(_LIBCPP_DEPRECATED_ABI_LEGACY_LIBRARY_DEFINITIONS_FOR_INLINE_FUNCTIONS)
2442a480c28bSEric Fiselier    void __add_shared() _NOEXCEPT;
2443a480c28bSEric Fiselier    void __add_weak() _NOEXCEPT;
2444a480c28bSEric Fiselier    void __release_shared() _NOEXCEPT;
2445f08de52dSKevin Hu#else
2446f08de52dSKevin Hu    _LIBCPP_INLINE_VISIBILITY
2447f08de52dSKevin Hu    void __add_shared() _NOEXCEPT {
2448f08de52dSKevin Hu      __shared_count::__add_shared();
2449f08de52dSKevin Hu    }
2450f08de52dSKevin Hu    _LIBCPP_INLINE_VISIBILITY
2451f08de52dSKevin Hu    void __add_weak() _NOEXCEPT {
2452f08de52dSKevin Hu      __libcpp_atomic_refcount_increment(__shared_weak_owners_);
2453f08de52dSKevin Hu    }
2454f08de52dSKevin Hu    _LIBCPP_INLINE_VISIBILITY
2455f08de52dSKevin Hu    void __release_shared() _NOEXCEPT {
2456f08de52dSKevin Hu      if (__shared_count::__release_shared())
2457f08de52dSKevin Hu        __release_weak();
2458f08de52dSKevin Hu    }
2459f08de52dSKevin Hu#endif
24603739fe79SHoward Hinnant    void __release_weak() _NOEXCEPT;
2461848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
24623739fe79SHoward Hinnant    long use_count() const _NOEXCEPT {return __shared_count::use_count();}
24633739fe79SHoward Hinnant    __shared_weak_count* lock() _NOEXCEPT;
24643e519524SHoward Hinnant
24653739fe79SHoward Hinnant    virtual const void* __get_deleter(const type_info&) const _NOEXCEPT;
24663e519524SHoward Hinnantprivate:
24673739fe79SHoward Hinnant    virtual void __on_zero_shared_weak() _NOEXCEPT = 0;
24683e519524SHoward Hinnant};
24693e519524SHoward Hinnant
24703e519524SHoward Hinnanttemplate <class _Tp, class _Dp, class _Alloc>
24713e519524SHoward Hinnantclass __shared_ptr_pointer
24723e519524SHoward Hinnant    : public __shared_weak_count
24733e519524SHoward Hinnant{
24743e519524SHoward Hinnant    __compressed_pair<__compressed_pair<_Tp, _Dp>, _Alloc> __data_;
24753e519524SHoward Hinnantpublic:
2476848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
24773e519524SHoward Hinnant    __shared_ptr_pointer(_Tp __p, _Dp __d, _Alloc __a)
2478ce48a113SHoward Hinnant        :  __data_(__compressed_pair<_Tp, _Dp>(__p, _VSTD::move(__d)), _VSTD::move(__a)) {}
24793e519524SHoward Hinnant
248054b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI
24813739fe79SHoward Hinnant    virtual const void* __get_deleter(const type_info&) const _NOEXCEPT;
248254b409fdSHoward Hinnant#endif
24833e519524SHoward Hinnant
24843e519524SHoward Hinnantprivate:
24853739fe79SHoward Hinnant    virtual void __on_zero_shared() _NOEXCEPT;
24863739fe79SHoward Hinnant    virtual void __on_zero_shared_weak() _NOEXCEPT;
24873e519524SHoward Hinnant};
24883e519524SHoward Hinnant
248954b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI
249054b409fdSHoward Hinnant
24913e519524SHoward Hinnanttemplate <class _Tp, class _Dp, class _Alloc>
24923e519524SHoward Hinnantconst void*
24933739fe79SHoward Hinnant__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__get_deleter(const type_info& __t) const _NOEXCEPT
24943e519524SHoward Hinnant{
24959c973b9fSEric Fiselier    return __t == typeid(_Dp) ? _VSTD::addressof(__data_.first().second()) : nullptr;
24963e519524SHoward Hinnant}
24973e519524SHoward Hinnant
2498b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_RTTI
249954b409fdSHoward Hinnant
25003e519524SHoward Hinnanttemplate <class _Tp, class _Dp, class _Alloc>
25013e519524SHoward Hinnantvoid
25023739fe79SHoward Hinnant__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__on_zero_shared() _NOEXCEPT
25033e519524SHoward Hinnant{
25043e519524SHoward Hinnant    __data_.first().second()(__data_.first().first());
25053e519524SHoward Hinnant    __data_.first().second().~_Dp();
25063e519524SHoward Hinnant}
25073e519524SHoward Hinnant
25083e519524SHoward Hinnanttemplate <class _Tp, class _Dp, class _Alloc>
25093e519524SHoward Hinnantvoid
25103739fe79SHoward Hinnant__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__on_zero_shared_weak() _NOEXCEPT
25113e519524SHoward Hinnant{
25126fe361c1SEric Fiselier    typedef typename __allocator_traits_rebind<_Alloc, __shared_ptr_pointer>::type _Al;
25136fe361c1SEric Fiselier    typedef allocator_traits<_Al> _ATraits;
2514319be722SEric Fiselier    typedef pointer_traits<typename _ATraits::pointer> _PTraits;
2515319be722SEric Fiselier
25166fe361c1SEric Fiselier    _Al __a(__data_.second());
25173e519524SHoward Hinnant    __data_.second().~_Alloc();
2518319be722SEric Fiselier    __a.deallocate(_PTraits::pointer_to(*this), 1);
25193e519524SHoward Hinnant}
25203e519524SHoward Hinnant
25213e519524SHoward Hinnanttemplate <class _Tp, class _Alloc>
2522092e8a7eSLouis Dionnestruct __shared_ptr_emplace
2523092e8a7eSLouis Dionne    : __shared_weak_count
25243e519524SHoward Hinnant{
2525092e8a7eSLouis Dionne    template<class ..._Args>
2526092e8a7eSLouis Dionne    _LIBCPP_HIDE_FROM_ABI
2527092e8a7eSLouis Dionne    explicit __shared_ptr_emplace(_Alloc __a, _Args&& ...__args)
2528955dd7b7SLouis Dionne        : __storage_(_VSTD::move(__a))
2529955dd7b7SLouis Dionne    {
2530955dd7b7SLouis Dionne#if _LIBCPP_STD_VER > 17
2531955dd7b7SLouis Dionne        using _TpAlloc = typename __allocator_traits_rebind<_Alloc, _Tp>::type;
2532955dd7b7SLouis Dionne        _TpAlloc __tmp(*__get_alloc());
2533955dd7b7SLouis Dionne        allocator_traits<_TpAlloc>::construct(__tmp, __get_elem(), _VSTD::forward<_Args>(__args)...);
2534a3c28ccdSLouis Dionne#else
2535955dd7b7SLouis Dionne        ::new ((void*)__get_elem()) _Tp(_VSTD::forward<_Args>(__args)...);
2536a3c28ccdSLouis Dionne#endif
2537955dd7b7SLouis Dionne    }
2538092e8a7eSLouis Dionne
2539092e8a7eSLouis Dionne    _LIBCPP_HIDE_FROM_ABI
2540955dd7b7SLouis Dionne    _Alloc* __get_alloc() _NOEXCEPT { return __storage_.__get_alloc(); }
2541092e8a7eSLouis Dionne
2542092e8a7eSLouis Dionne    _LIBCPP_HIDE_FROM_ABI
2543955dd7b7SLouis Dionne    _Tp* __get_elem() _NOEXCEPT { return __storage_.__get_elem(); }
25443e519524SHoward Hinnant
25453e519524SHoward Hinnantprivate:
2546092e8a7eSLouis Dionne    virtual void __on_zero_shared() _NOEXCEPT {
2547955dd7b7SLouis Dionne#if _LIBCPP_STD_VER > 17
2548955dd7b7SLouis Dionne        using _TpAlloc = typename __allocator_traits_rebind<_Alloc, _Tp>::type;
2549955dd7b7SLouis Dionne        _TpAlloc __tmp(*__get_alloc());
2550955dd7b7SLouis Dionne        allocator_traits<_TpAlloc>::destroy(__tmp, __get_elem());
2551955dd7b7SLouis Dionne#else
255202af1109SLouis Dionne        __get_elem()->~_Tp();
2553955dd7b7SLouis Dionne#endif
25543e519524SHoward Hinnant    }
25553e519524SHoward Hinnant
2556092e8a7eSLouis Dionne    virtual void __on_zero_shared_weak() _NOEXCEPT {
2557092e8a7eSLouis Dionne        using _ControlBlockAlloc = typename __allocator_traits_rebind<_Alloc, __shared_ptr_emplace>::type;
2558092e8a7eSLouis Dionne        using _ControlBlockPointer = typename allocator_traits<_ControlBlockAlloc>::pointer;
25593b7280f5SLouis Dionne        _ControlBlockAlloc __tmp(*__get_alloc());
2560955dd7b7SLouis Dionne        __storage_.~_Storage();
2561092e8a7eSLouis Dionne        allocator_traits<_ControlBlockAlloc>::deallocate(__tmp,
2562092e8a7eSLouis Dionne            pointer_traits<_ControlBlockPointer>::pointer_to(*this), 1);
25633e519524SHoward Hinnant    }
25643e519524SHoward Hinnant
2565955dd7b7SLouis Dionne    // This class implements the control block for non-array shared pointers created
2566955dd7b7SLouis Dionne    // through `std::allocate_shared` and `std::make_shared`.
2567955dd7b7SLouis Dionne    //
2568955dd7b7SLouis Dionne    // In previous versions of the library, we used a compressed pair to store
2569955dd7b7SLouis Dionne    // both the _Alloc and the _Tp. This implies using EBO, which is incompatible
2570955dd7b7SLouis Dionne    // with Allocator construction for _Tp. To allow implementing P0674 in C++20,
2571955dd7b7SLouis Dionne    // we now use a properly aligned char buffer while making sure that we maintain
2572955dd7b7SLouis Dionne    // the same layout that we had when we used a compressed pair.
2573955dd7b7SLouis Dionne    using _CompressedPair = __compressed_pair<_Alloc, _Tp>;
2574955dd7b7SLouis Dionne    struct _ALIGNAS_TYPE(_CompressedPair) _Storage {
2575955dd7b7SLouis Dionne        char __blob_[sizeof(_CompressedPair)];
2576955dd7b7SLouis Dionne
2577955dd7b7SLouis Dionne        _LIBCPP_HIDE_FROM_ABI explicit _Storage(_Alloc&& __a) {
2578955dd7b7SLouis Dionne            ::new ((void*)__get_alloc()) _Alloc(_VSTD::move(__a));
2579955dd7b7SLouis Dionne        }
2580955dd7b7SLouis Dionne        _LIBCPP_HIDE_FROM_ABI ~_Storage() {
2581955dd7b7SLouis Dionne            __get_alloc()->~_Alloc();
2582955dd7b7SLouis Dionne        }
2583955dd7b7SLouis Dionne        _Alloc* __get_alloc() _NOEXCEPT {
2584955dd7b7SLouis Dionne            _CompressedPair *__as_pair = reinterpret_cast<_CompressedPair*>(__blob_);
2585955dd7b7SLouis Dionne            typename _CompressedPair::_Base1* __first = _CompressedPair::__get_first_base(__as_pair);
2586955dd7b7SLouis Dionne            _Alloc *__alloc = reinterpret_cast<_Alloc*>(__first);
2587955dd7b7SLouis Dionne            return __alloc;
2588955dd7b7SLouis Dionne        }
2589bab74864SReid Kleckner        _LIBCPP_NO_CFI _Tp* __get_elem() _NOEXCEPT {
2590955dd7b7SLouis Dionne            _CompressedPair *__as_pair = reinterpret_cast<_CompressedPair*>(__blob_);
2591955dd7b7SLouis Dionne            typename _CompressedPair::_Base2* __second = _CompressedPair::__get_second_base(__as_pair);
2592955dd7b7SLouis Dionne            _Tp *__elem = reinterpret_cast<_Tp*>(__second);
2593955dd7b7SLouis Dionne            return __elem;
2594955dd7b7SLouis Dionne        }
2595955dd7b7SLouis Dionne    };
2596955dd7b7SLouis Dionne
2597955dd7b7SLouis Dionne    static_assert(_LIBCPP_ALIGNOF(_Storage) == _LIBCPP_ALIGNOF(_CompressedPair), "");
2598955dd7b7SLouis Dionne    static_assert(sizeof(_Storage) == sizeof(_CompressedPair), "");
2599955dd7b7SLouis Dionne    _Storage __storage_;
2600092e8a7eSLouis Dionne};
2601092e8a7eSLouis Dionne
260272d0d603SErik Pilkingtonstruct __shared_ptr_dummy_rebind_allocator_type;
260372d0d603SErik Pilkingtontemplate <>
260472d0d603SErik Pilkingtonclass _LIBCPP_TEMPLATE_VIS allocator<__shared_ptr_dummy_rebind_allocator_type>
260572d0d603SErik Pilkington{
260672d0d603SErik Pilkingtonpublic:
260772d0d603SErik Pilkington    template <class _Other>
260872d0d603SErik Pilkington    struct rebind
260972d0d603SErik Pilkington    {
261072d0d603SErik Pilkington        typedef allocator<_Other> other;
261172d0d603SErik Pilkington    };
261272d0d603SErik Pilkington};
261372d0d603SErik Pilkington
2614e2f2d1edSEric Fiseliertemplate<class _Tp> class _LIBCPP_TEMPLATE_VIS enable_shared_from_this;
26153e519524SHoward Hinnant
2616ce195fb2Szoecarvertemplate<class _Tp, class _Up>
2617ce195fb2Szoecarverstruct __compatible_with
2618ce195fb2Szoecarver#if _LIBCPP_STD_VER > 14
2619ce195fb2Szoecarver    : is_convertible<remove_extent_t<_Tp>*, remove_extent_t<_Up>*> {};
2620ce195fb2Szoecarver#else
2621ce195fb2Szoecarver    : is_convertible<_Tp*, _Up*> {};
2622ce195fb2Szoecarver#endif // _LIBCPP_STD_VER > 14
2623ce195fb2Szoecarver
2624dbc89028Szoecarvertemplate <class _Dp, class _Pt,
2625dbc89028Szoecarver    class = decltype(_VSTD::declval<_Dp>()(_VSTD::declval<_Pt>()))>
2626dbc89028Szoecarverstatic true_type __well_formed_deleter_test(int);
2627dbc89028Szoecarver
2628dbc89028Szoecarvertemplate <class, class>
2629dbc89028Szoecarverstatic false_type __well_formed_deleter_test(...);
2630dbc89028Szoecarver
2631dbc89028Szoecarvertemplate <class _Dp, class _Pt>
2632dbc89028Szoecarverstruct __well_formed_deleter : decltype(__well_formed_deleter_test<_Dp, _Pt>(0)) {};
2633dbc89028Szoecarver
2634dbc89028Szoecarvertemplate<class _Dp, class _Tp, class _Yp>
2635dbc89028Szoecarverstruct __shared_ptr_deleter_ctor_reqs
2636dbc89028Szoecarver{
2637dbc89028Szoecarver    static const bool value = __compatible_with<_Tp, _Yp>::value &&
2638dbc89028Szoecarver                              is_move_constructible<_Dp>::value &&
2639dbc89028Szoecarver                              __well_formed_deleter<_Dp, _Tp*>::value;
2640dbc89028Szoecarver};
2641dbc89028Szoecarver
264276887bc4SVy Nguyen#if defined(_LIBCPP_ABI_ENABLE_SHARED_PTR_TRIVIAL_ABI)
264376887bc4SVy Nguyen#  define _LIBCPP_SHARED_PTR_TRIVIAL_ABI __attribute__((trivial_abi))
264476887bc4SVy Nguyen#else
264576887bc4SVy Nguyen#  define _LIBCPP_SHARED_PTR_TRIVIAL_ABI
264676887bc4SVy Nguyen#endif
264776887bc4SVy Nguyen
26483e519524SHoward Hinnanttemplate<class _Tp>
264976887bc4SVy Nguyenclass _LIBCPP_SHARED_PTR_TRIVIAL_ABI _LIBCPP_TEMPLATE_VIS shared_ptr
26503e519524SHoward Hinnant{
26513e519524SHoward Hinnantpublic:
265268436a9bSEric Fiselier#if _LIBCPP_STD_VER > 14
265368436a9bSEric Fiselier    typedef weak_ptr<_Tp> weak_type;
2654ce195fb2Szoecarver    typedef remove_extent_t<_Tp> element_type;
2655ce195fb2Szoecarver#else
2656ce195fb2Szoecarver    typedef _Tp element_type;
265768436a9bSEric Fiselier#endif
2658ce195fb2Szoecarver
26593e519524SHoward Hinnantprivate:
26603e519524SHoward Hinnant    element_type*      __ptr_;
26613e519524SHoward Hinnant    __shared_weak_count* __cntrl_;
26623e519524SHoward Hinnant
26633e519524SHoward Hinnant    struct __nat {int __for_bool_;};
26643e519524SHoward Hinnantpublic:
2665906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
2666c0937e8aSHoward Hinnant    _LIBCPP_CONSTEXPR shared_ptr() _NOEXCEPT;
2667906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
2668c0937e8aSHoward Hinnant    _LIBCPP_CONSTEXPR shared_ptr(nullptr_t) _NOEXCEPT;
266922747e62SLogan Chien    template<class _Yp>
267022747e62SLogan Chien        explicit shared_ptr(_Yp* __p,
2671ce195fb2Szoecarver                            typename enable_if<__compatible_with<_Yp, element_type>::value, __nat>::type = __nat());
267222747e62SLogan Chien    template<class _Yp, class _Dp>
267322747e62SLogan Chien        shared_ptr(_Yp* __p, _Dp __d,
2674dbc89028Szoecarver                   typename enable_if<__shared_ptr_deleter_ctor_reqs<_Dp, _Yp, element_type>::value, __nat>::type = __nat());
267522747e62SLogan Chien    template<class _Yp, class _Dp, class _Alloc>
267622747e62SLogan Chien        shared_ptr(_Yp* __p, _Dp __d, _Alloc __a,
2677dbc89028Szoecarver                   typename enable_if<__shared_ptr_deleter_ctor_reqs<_Dp, _Yp, element_type>::value, __nat>::type = __nat());
26783e519524SHoward Hinnant    template <class _Dp> shared_ptr(nullptr_t __p, _Dp __d);
26793e519524SHoward Hinnant    template <class _Dp, class _Alloc> shared_ptr(nullptr_t __p, _Dp __d, _Alloc __a);
2680906c872dSEvgeniy Stepanov    template<class _Yp> _LIBCPP_INLINE_VISIBILITY shared_ptr(const shared_ptr<_Yp>& __r, element_type* __p) _NOEXCEPT;
2681906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
26823739fe79SHoward Hinnant    shared_ptr(const shared_ptr& __r) _NOEXCEPT;
26833e519524SHoward Hinnant    template<class _Yp>
2684906c872dSEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
26853e519524SHoward Hinnant        shared_ptr(const shared_ptr<_Yp>& __r,
2686ce195fb2Szoecarver                   typename enable_if<__compatible_with<_Yp, element_type>::value, __nat>::type = __nat())
26873739fe79SHoward Hinnant                       _NOEXCEPT;
2688906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
26893739fe79SHoward Hinnant    shared_ptr(shared_ptr&& __r) _NOEXCEPT;
2690906c872dSEvgeniy Stepanov    template<class _Yp> _LIBCPP_INLINE_VISIBILITY  shared_ptr(shared_ptr<_Yp>&& __r,
2691ce195fb2Szoecarver                   typename enable_if<__compatible_with<_Yp, element_type>::value, __nat>::type = __nat())
26923739fe79SHoward Hinnant                       _NOEXCEPT;
26933e519524SHoward Hinnant    template<class _Yp> explicit shared_ptr(const weak_ptr<_Yp>& __r,
2694dc83e779SMarshall Clow                   typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type= __nat());
2695e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR)
269622747e62SLogan Chien    template<class _Yp>
269722747e62SLogan Chien        shared_ptr(auto_ptr<_Yp>&& __r,
269822747e62SLogan Chien                   typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat());
2699e67179bcSMarshall Clow#endif
270022747e62SLogan Chien    template <class _Yp, class _Dp>
27018e25104bSHoward Hinnant        shared_ptr(unique_ptr<_Yp, _Dp>&&,
270222747e62SLogan Chien                   typename enable_if
27038e25104bSHoward Hinnant                   <
270422747e62SLogan Chien                       !is_lvalue_reference<_Dp>::value &&
27058e25104bSHoward Hinnant                       !is_array<_Yp>::value &&
270622747e62SLogan Chien                       is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value,
270722747e62SLogan Chien                       __nat
270822747e62SLogan Chien                   >::type = __nat());
270922747e62SLogan Chien    template <class _Yp, class _Dp>
27108e25104bSHoward Hinnant        shared_ptr(unique_ptr<_Yp, _Dp>&&,
271122747e62SLogan Chien                   typename enable_if
271222747e62SLogan Chien                   <
271322747e62SLogan Chien                       is_lvalue_reference<_Dp>::value &&
271422747e62SLogan Chien                       !is_array<_Yp>::value &&
271522747e62SLogan Chien                       is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value,
271622747e62SLogan Chien                       __nat
271722747e62SLogan Chien                   >::type = __nat());
27183e519524SHoward Hinnant
27193e519524SHoward Hinnant    ~shared_ptr();
27203e519524SHoward Hinnant
2721906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
27223739fe79SHoward Hinnant    shared_ptr& operator=(const shared_ptr& __r) _NOEXCEPT;
27238e25104bSHoward Hinnant    template<class _Yp>
27248e25104bSHoward Hinnant        typename enable_if
27258e25104bSHoward Hinnant        <
2726ce195fb2Szoecarver            __compatible_with<_Yp, element_type>::value,
27278e25104bSHoward Hinnant            shared_ptr&
27288e25104bSHoward Hinnant        >::type
2729906c872dSEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
27308e25104bSHoward Hinnant        operator=(const shared_ptr<_Yp>& __r) _NOEXCEPT;
2731906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
27323739fe79SHoward Hinnant    shared_ptr& operator=(shared_ptr&& __r) _NOEXCEPT;
27338e25104bSHoward Hinnant    template<class _Yp>
27348e25104bSHoward Hinnant        typename enable_if
27358e25104bSHoward Hinnant        <
2736ce195fb2Szoecarver            __compatible_with<_Yp, element_type>::value,
2737ce195fb2Szoecarver            shared_ptr&
27388e25104bSHoward Hinnant        >::type
2739906c872dSEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
27408e25104bSHoward Hinnant        operator=(shared_ptr<_Yp>&& __r);
2741e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR)
27428e25104bSHoward Hinnant    template<class _Yp>
274389dd1dd2SEric Fiselier        _LIBCPP_INLINE_VISIBILITY
27448e25104bSHoward Hinnant        typename enable_if
27458e25104bSHoward Hinnant        <
27468e25104bSHoward Hinnant            !is_array<_Yp>::value &&
27478e25104bSHoward Hinnant            is_convertible<_Yp*, element_type*>::value,
274884f996fbSHoward Hinnant            shared_ptr
274984f996fbSHoward Hinnant        >::type&
27508e25104bSHoward Hinnant        operator=(auto_ptr<_Yp>&& __r);
2751e67179bcSMarshall Clow#endif
27528e25104bSHoward Hinnant    template <class _Yp, class _Dp>
27538e25104bSHoward Hinnant        typename enable_if
27548e25104bSHoward Hinnant        <
27558e25104bSHoward Hinnant            !is_array<_Yp>::value &&
27568e25104bSHoward Hinnant            is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value,
27578e25104bSHoward Hinnant            shared_ptr&
27588e25104bSHoward Hinnant        >::type
2759906c872dSEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
27608e25104bSHoward Hinnant        operator=(unique_ptr<_Yp, _Dp>&& __r);
27613e519524SHoward Hinnant
2762906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
27633739fe79SHoward Hinnant    void swap(shared_ptr& __r) _NOEXCEPT;
2764906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
27653739fe79SHoward Hinnant    void reset() _NOEXCEPT;
27668e25104bSHoward Hinnant    template<class _Yp>
27678e25104bSHoward Hinnant        typename enable_if
27688e25104bSHoward Hinnant        <
2769ce195fb2Szoecarver            __compatible_with<_Yp, element_type>::value,
27708e25104bSHoward Hinnant            void
27718e25104bSHoward Hinnant        >::type
2772906c872dSEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
27738e25104bSHoward Hinnant        reset(_Yp* __p);
27748e25104bSHoward Hinnant    template<class _Yp, class _Dp>
27758e25104bSHoward Hinnant        typename enable_if
27768e25104bSHoward Hinnant        <
2777ce195fb2Szoecarver            __compatible_with<_Yp, element_type>::value,
27788e25104bSHoward Hinnant            void
27798e25104bSHoward Hinnant        >::type
2780906c872dSEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
27818e25104bSHoward Hinnant        reset(_Yp* __p, _Dp __d);
27828e25104bSHoward Hinnant    template<class _Yp, class _Dp, class _Alloc>
27838e25104bSHoward Hinnant        typename enable_if
27848e25104bSHoward Hinnant        <
2785ce195fb2Szoecarver            __compatible_with<_Yp, element_type>::value,
27868e25104bSHoward Hinnant            void
27878e25104bSHoward Hinnant        >::type
2788906c872dSEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
27898e25104bSHoward Hinnant        reset(_Yp* __p, _Dp __d, _Alloc __a);
27903e519524SHoward Hinnant
2791848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
27923739fe79SHoward Hinnant    element_type* get() const _NOEXCEPT {return __ptr_;}
2793848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
27943739fe79SHoward Hinnant    typename add_lvalue_reference<element_type>::type operator*() const _NOEXCEPT
27953739fe79SHoward Hinnant        {return *__ptr_;}
2796848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2797ce195fb2Szoecarver    element_type* operator->() const _NOEXCEPT
2798ce195fb2Szoecarver    {
2799ce195fb2Szoecarver        static_assert(!_VSTD::is_array<_Tp>::value,
2800ce195fb2Szoecarver                      "std::shared_ptr<T>::operator-> is only valid when T is not an array type.");
2801ce195fb2Szoecarver        return __ptr_;
2802ce195fb2Szoecarver    }
2803848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
28043739fe79SHoward Hinnant    long use_count() const _NOEXCEPT {return __cntrl_ ? __cntrl_->use_count() : 0;}
2805848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
28063739fe79SHoward Hinnant    bool unique() const _NOEXCEPT {return use_count() == 1;}
2807848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2808527a7fdfSBruce Mitchener    _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT {return get() != nullptr;}
2809c003db1fSHoward Hinnant    template <class _Up>
2810848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
281136bc7178SMarshall Clow        bool owner_before(shared_ptr<_Up> const& __p) const _NOEXCEPT
28123e519524SHoward Hinnant        {return __cntrl_ < __p.__cntrl_;}
2813c003db1fSHoward Hinnant    template <class _Up>
2814848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
281536bc7178SMarshall Clow        bool owner_before(weak_ptr<_Up> const& __p) const _NOEXCEPT
28163e519524SHoward Hinnant        {return __cntrl_ < __p.__cntrl_;}
2817d77851e8SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2818d77851e8SHoward Hinnant    bool
2819d77851e8SHoward Hinnant    __owner_equivalent(const shared_ptr& __p) const
2820d77851e8SHoward Hinnant        {return __cntrl_ == __p.__cntrl_;}
28213e519524SHoward Hinnant
2822ce195fb2Szoecarver#if _LIBCPP_STD_VER > 14
2823ce195fb2Szoecarver    typename add_lvalue_reference<element_type>::type
2824ce195fb2Szoecarver    _LIBCPP_INLINE_VISIBILITY
2825ce195fb2Szoecarver    operator[](ptrdiff_t __i) const
2826ce195fb2Szoecarver    {
2827ce195fb2Szoecarver            static_assert(_VSTD::is_array<_Tp>::value,
2828ce195fb2Szoecarver                          "std::shared_ptr<T>::operator[] is only valid when T is an array type.");
2829ce195fb2Szoecarver            return __ptr_[__i];
2830ce195fb2Szoecarver    }
2831ce195fb2Szoecarver#endif
2832ce195fb2Szoecarver
283354b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI
28343e519524SHoward Hinnant    template <class _Dp>
2835848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
28363739fe79SHoward Hinnant        _Dp* __get_deleter() const _NOEXCEPT
28374a911c86SMarshall Clow            {return static_cast<_Dp*>(__cntrl_
28384a911c86SMarshall Clow                    ? const_cast<void *>(__cntrl_->__get_deleter(typeid(_Dp)))
28394a911c86SMarshall Clow                      : nullptr);}
2840b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_RTTI
28413e519524SHoward Hinnant
284240c47680SZoe Carver    template<class _Yp, class _CntrlBlk>
284340c47680SZoe Carver    static shared_ptr<_Tp>
284421d4050eSzoecarver    __create_with_control_block(_Yp* __p, _CntrlBlk* __cntrl) _NOEXCEPT
284540c47680SZoe Carver    {
284640c47680SZoe Carver        shared_ptr<_Tp> __r;
284740c47680SZoe Carver        __r.__ptr_ = __p;
284840c47680SZoe Carver        __r.__cntrl_ = __cntrl;
284940c47680SZoe Carver        __r.__enable_weak_this(__r.__ptr_, __r.__ptr_);
285040c47680SZoe Carver        return __r;
285140c47680SZoe Carver    }
2852471bbb6eSZoe Carver
28533e519524SHoward Hinnantprivate:
285472d0d603SErik Pilkington    template <class _Yp, bool = is_function<_Yp>::value>
285572d0d603SErik Pilkington        struct __shared_ptr_default_allocator
285672d0d603SErik Pilkington        {
285772d0d603SErik Pilkington            typedef allocator<_Yp> type;
285872d0d603SErik Pilkington        };
285972d0d603SErik Pilkington
286072d0d603SErik Pilkington    template <class _Yp>
286172d0d603SErik Pilkington        struct __shared_ptr_default_allocator<_Yp, true>
286272d0d603SErik Pilkington        {
286372d0d603SErik Pilkington            typedef allocator<__shared_ptr_dummy_rebind_allocator_type> type;
286472d0d603SErik Pilkington        };
28653e519524SHoward Hinnant
286639005d30SEric Fiselier    template <class _Yp, class _OrigPtr>
2867848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2868f09df772SEric Fiselier        typename enable_if<is_convertible<_OrigPtr*,
2869f09df772SEric Fiselier                                          const enable_shared_from_this<_Yp>*
2870f09df772SEric Fiselier        >::value,
2871f09df772SEric Fiselier            void>::type
287239005d30SEric Fiselier        __enable_weak_this(const enable_shared_from_this<_Yp>* __e,
287339005d30SEric Fiselier                           _OrigPtr* __ptr) _NOEXCEPT
28743e519524SHoward Hinnant        {
287539005d30SEric Fiselier            typedef typename remove_cv<_Yp>::type _RawYp;
287688f5bfdcSEric Fiselier            if (__e && __e->__weak_this_.expired())
287755112defSMarshall Clow            {
287839005d30SEric Fiselier                __e->__weak_this_ = shared_ptr<_RawYp>(*this,
287939005d30SEric Fiselier                    const_cast<_RawYp*>(static_cast<const _Yp*>(__ptr)));
288055112defSMarshall Clow            }
28813e519524SHoward Hinnant        }
28823e519524SHoward Hinnant
288372d0d603SErik Pilkington    _LIBCPP_INLINE_VISIBILITY void __enable_weak_this(...) _NOEXCEPT {}
28843e519524SHoward Hinnant
2885ce195fb2Szoecarver    template <class, class _Yp>
2886ce195fb2Szoecarver        struct __shared_ptr_default_delete
2887ce195fb2Szoecarver            : default_delete<_Yp> {};
2888ce195fb2Szoecarver
2889ce195fb2Szoecarver    template <class _Yp, class _Un, size_t _Sz>
2890ce195fb2Szoecarver        struct __shared_ptr_default_delete<_Yp[_Sz], _Un>
2891ce195fb2Szoecarver            : default_delete<_Yp[]> {};
2892ce195fb2Szoecarver
2893ce195fb2Szoecarver    template <class _Yp, class _Un>
2894ce195fb2Szoecarver        struct __shared_ptr_default_delete<_Yp[], _Un>
2895ce195fb2Szoecarver            : default_delete<_Yp[]> {};
2896ce195fb2Szoecarver
2897e2f2d1edSEric Fiselier    template <class _Up> friend class _LIBCPP_TEMPLATE_VIS shared_ptr;
2898e2f2d1edSEric Fiselier    template <class _Up> friend class _LIBCPP_TEMPLATE_VIS weak_ptr;
28993e519524SHoward Hinnant};
29003e519524SHoward Hinnant
290183564056SLogan Smith#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
290283564056SLogan Smithtemplate<class _Tp>
290383564056SLogan Smithshared_ptr(weak_ptr<_Tp>) -> shared_ptr<_Tp>;
290483564056SLogan Smithtemplate<class _Tp, class _Dp>
290583564056SLogan Smithshared_ptr(unique_ptr<_Tp, _Dp>) -> shared_ptr<_Tp>;
290683564056SLogan Smith#endif
2907f09df772SEric Fiselier
29083e519524SHoward Hinnanttemplate<class _Tp>
2909906c872dSEvgeniy Stepanovinline
2910c0937e8aSHoward Hinnant_LIBCPP_CONSTEXPR
29113739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr() _NOEXCEPT
2912527a7fdfSBruce Mitchener    : __ptr_(nullptr),
2913527a7fdfSBruce Mitchener      __cntrl_(nullptr)
29143e519524SHoward Hinnant{
29153e519524SHoward Hinnant}
29163e519524SHoward Hinnant
29173e519524SHoward Hinnanttemplate<class _Tp>
2918906c872dSEvgeniy Stepanovinline
2919c0937e8aSHoward Hinnant_LIBCPP_CONSTEXPR
29203739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr(nullptr_t) _NOEXCEPT
2921527a7fdfSBruce Mitchener    : __ptr_(nullptr),
2922527a7fdfSBruce Mitchener      __cntrl_(nullptr)
29233e519524SHoward Hinnant{
29243e519524SHoward Hinnant}
29253e519524SHoward Hinnant
29263e519524SHoward Hinnanttemplate<class _Tp>
292722747e62SLogan Chientemplate<class _Yp>
292822747e62SLogan Chienshared_ptr<_Tp>::shared_ptr(_Yp* __p,
2929ce195fb2Szoecarver                            typename enable_if<__compatible_with<_Yp, element_type>::value, __nat>::type)
29303e519524SHoward Hinnant    : __ptr_(__p)
29313e519524SHoward Hinnant{
29323e519524SHoward Hinnant    unique_ptr<_Yp> __hold(__p);
293372d0d603SErik Pilkington    typedef typename __shared_ptr_default_allocator<_Yp>::type _AllocT;
2934ce195fb2Szoecarver    typedef __shared_ptr_pointer<_Yp*, __shared_ptr_default_delete<_Tp, _Yp>, _AllocT > _CntrlBlk;
2935ce195fb2Szoecarver    __cntrl_ = new _CntrlBlk(__p, __shared_ptr_default_delete<_Tp, _Yp>(), _AllocT());
29363e519524SHoward Hinnant    __hold.release();
293739005d30SEric Fiselier    __enable_weak_this(__p, __p);
29383e519524SHoward Hinnant}
29393e519524SHoward Hinnant
29403e519524SHoward Hinnanttemplate<class _Tp>
294122747e62SLogan Chientemplate<class _Yp, class _Dp>
294222747e62SLogan Chienshared_ptr<_Tp>::shared_ptr(_Yp* __p, _Dp __d,
2943dbc89028Szoecarver                            typename enable_if<__shared_ptr_deleter_ctor_reqs<_Dp, _Yp, element_type>::value, __nat>::type)
29443e519524SHoward Hinnant    : __ptr_(__p)
29453e519524SHoward Hinnant{
29463e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
29473e519524SHoward Hinnant    try
29483e519524SHoward Hinnant    {
2949b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
295072d0d603SErik Pilkington        typedef typename __shared_ptr_default_allocator<_Yp>::type _AllocT;
295172d0d603SErik Pilkington        typedef __shared_ptr_pointer<_Yp*, _Dp, _AllocT > _CntrlBlk;
29526a328c66Szoecarver#ifndef _LIBCPP_CXX03_LANG
29536a328c66Szoecarver        __cntrl_ = new _CntrlBlk(__p, _VSTD::move(__d), _AllocT());
29546a328c66Szoecarver#else
295572d0d603SErik Pilkington        __cntrl_ = new _CntrlBlk(__p, __d, _AllocT());
29566a328c66Szoecarver#endif // not _LIBCPP_CXX03_LANG
295739005d30SEric Fiselier        __enable_weak_this(__p, __p);
29583e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
29593e519524SHoward Hinnant    }
29603e519524SHoward Hinnant    catch (...)
29613e519524SHoward Hinnant    {
29623e519524SHoward Hinnant        __d(__p);
29633e519524SHoward Hinnant        throw;
29643e519524SHoward Hinnant    }
2965b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
29663e519524SHoward Hinnant}
29673e519524SHoward Hinnant
29683e519524SHoward Hinnanttemplate<class _Tp>
29693e519524SHoward Hinnanttemplate<class _Dp>
29703e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(nullptr_t __p, _Dp __d)
2971527a7fdfSBruce Mitchener    : __ptr_(nullptr)
29723e519524SHoward Hinnant{
29733e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
29743e519524SHoward Hinnant    try
29753e519524SHoward Hinnant    {
2976b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
297772d0d603SErik Pilkington        typedef typename __shared_ptr_default_allocator<_Tp>::type _AllocT;
297872d0d603SErik Pilkington        typedef __shared_ptr_pointer<nullptr_t, _Dp, _AllocT > _CntrlBlk;
29796a328c66Szoecarver#ifndef _LIBCPP_CXX03_LANG
29806a328c66Szoecarver        __cntrl_ = new _CntrlBlk(__p, _VSTD::move(__d), _AllocT());
29816a328c66Szoecarver#else
298272d0d603SErik Pilkington        __cntrl_ = new _CntrlBlk(__p, __d, _AllocT());
29836a328c66Szoecarver#endif // not _LIBCPP_CXX03_LANG
29843e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
29853e519524SHoward Hinnant    }
29863e519524SHoward Hinnant    catch (...)
29873e519524SHoward Hinnant    {
29883e519524SHoward Hinnant        __d(__p);
29893e519524SHoward Hinnant        throw;
29903e519524SHoward Hinnant    }
2991b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
29923e519524SHoward Hinnant}
29933e519524SHoward Hinnant
29943e519524SHoward Hinnanttemplate<class _Tp>
299522747e62SLogan Chientemplate<class _Yp, class _Dp, class _Alloc>
299622747e62SLogan Chienshared_ptr<_Tp>::shared_ptr(_Yp* __p, _Dp __d, _Alloc __a,
2997dbc89028Szoecarver                            typename enable_if<__shared_ptr_deleter_ctor_reqs<_Dp, _Yp, element_type>::value, __nat>::type)
29983e519524SHoward Hinnant    : __ptr_(__p)
29993e519524SHoward Hinnant{
30003e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
30013e519524SHoward Hinnant    try
30023e519524SHoward Hinnant    {
3003b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
30043e519524SHoward Hinnant        typedef __shared_ptr_pointer<_Yp*, _Dp, _Alloc> _CntrlBlk;
3005319be722SEric Fiselier        typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _A2;
30063e519524SHoward Hinnant        typedef __allocator_destructor<_A2> _D2;
30073e519524SHoward Hinnant        _A2 __a2(__a);
30083e519524SHoward Hinnant        unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1));
30096a328c66Szoecarver        ::new ((void*)_VSTD::addressof(*__hold2.get()))
30106a328c66Szoecarver#ifndef _LIBCPP_CXX03_LANG
30116a328c66Szoecarver            _CntrlBlk(__p, _VSTD::move(__d), __a);
30126a328c66Szoecarver#else
30136a328c66Szoecarver            _CntrlBlk(__p, __d, __a);
30146a328c66Szoecarver#endif // not _LIBCPP_CXX03_LANG
3015319be722SEric Fiselier        __cntrl_ = _VSTD::addressof(*__hold2.release());
301639005d30SEric Fiselier        __enable_weak_this(__p, __p);
30173e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
30183e519524SHoward Hinnant    }
30193e519524SHoward Hinnant    catch (...)
30203e519524SHoward Hinnant    {
30213e519524SHoward Hinnant        __d(__p);
30223e519524SHoward Hinnant        throw;
30233e519524SHoward Hinnant    }
3024b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
30253e519524SHoward Hinnant}
30263e519524SHoward Hinnant
30273e519524SHoward Hinnanttemplate<class _Tp>
30283e519524SHoward Hinnanttemplate<class _Dp, class _Alloc>
30293e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(nullptr_t __p, _Dp __d, _Alloc __a)
3030527a7fdfSBruce Mitchener    : __ptr_(nullptr)
30313e519524SHoward Hinnant{
30323e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
30333e519524SHoward Hinnant    try
30343e519524SHoward Hinnant    {
3035b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
30363e519524SHoward Hinnant        typedef __shared_ptr_pointer<nullptr_t, _Dp, _Alloc> _CntrlBlk;
3037319be722SEric Fiselier        typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _A2;
30383e519524SHoward Hinnant        typedef __allocator_destructor<_A2> _D2;
30393e519524SHoward Hinnant        _A2 __a2(__a);
30403e519524SHoward Hinnant        unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1));
30416a328c66Szoecarver        ::new ((void*)_VSTD::addressof(*__hold2.get()))
30426a328c66Szoecarver#ifndef _LIBCPP_CXX03_LANG
30436a328c66Szoecarver            _CntrlBlk(__p, _VSTD::move(__d), __a);
30446a328c66Szoecarver#else
30456a328c66Szoecarver            _CntrlBlk(__p, __d, __a);
30466a328c66Szoecarver#endif // not _LIBCPP_CXX03_LANG
3047319be722SEric Fiselier        __cntrl_ = _VSTD::addressof(*__hold2.release());
30483e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
30493e519524SHoward Hinnant    }
30503e519524SHoward Hinnant    catch (...)
30513e519524SHoward Hinnant    {
30523e519524SHoward Hinnant        __d(__p);
30533e519524SHoward Hinnant        throw;
30543e519524SHoward Hinnant    }
3055b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
30563e519524SHoward Hinnant}
30573e519524SHoward Hinnant
30583e519524SHoward Hinnanttemplate<class _Tp>
30593e519524SHoward Hinnanttemplate<class _Yp>
3060906c872dSEvgeniy Stepanovinline
30613739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr(const shared_ptr<_Yp>& __r, element_type *__p) _NOEXCEPT
30623e519524SHoward Hinnant    : __ptr_(__p),
30633e519524SHoward Hinnant      __cntrl_(__r.__cntrl_)
30643e519524SHoward Hinnant{
30653e519524SHoward Hinnant    if (__cntrl_)
30663e519524SHoward Hinnant        __cntrl_->__add_shared();
30673e519524SHoward Hinnant}
30683e519524SHoward Hinnant
30693e519524SHoward Hinnanttemplate<class _Tp>
3070906c872dSEvgeniy Stepanovinline
30713739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr(const shared_ptr& __r) _NOEXCEPT
30723e519524SHoward Hinnant    : __ptr_(__r.__ptr_),
30733e519524SHoward Hinnant      __cntrl_(__r.__cntrl_)
30743e519524SHoward Hinnant{
30753e519524SHoward Hinnant    if (__cntrl_)
30763e519524SHoward Hinnant        __cntrl_->__add_shared();
30773e519524SHoward Hinnant}
30783e519524SHoward Hinnant
30793e519524SHoward Hinnanttemplate<class _Tp>
30803e519524SHoward Hinnanttemplate<class _Yp>
3081906c872dSEvgeniy Stepanovinline
30823e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(const shared_ptr<_Yp>& __r,
3083ce195fb2Szoecarver                            typename enable_if<__compatible_with<_Yp, element_type>::value, __nat>::type)
30843739fe79SHoward Hinnant         _NOEXCEPT
30853e519524SHoward Hinnant    : __ptr_(__r.__ptr_),
30863e519524SHoward Hinnant      __cntrl_(__r.__cntrl_)
30873e519524SHoward Hinnant{
30883e519524SHoward Hinnant    if (__cntrl_)
30893e519524SHoward Hinnant        __cntrl_->__add_shared();
30903e519524SHoward Hinnant}
30913e519524SHoward Hinnant
30923e519524SHoward Hinnanttemplate<class _Tp>
3093906c872dSEvgeniy Stepanovinline
30943739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr(shared_ptr&& __r) _NOEXCEPT
30953e519524SHoward Hinnant    : __ptr_(__r.__ptr_),
30963e519524SHoward Hinnant      __cntrl_(__r.__cntrl_)
30973e519524SHoward Hinnant{
3098527a7fdfSBruce Mitchener    __r.__ptr_ = nullptr;
3099527a7fdfSBruce Mitchener    __r.__cntrl_ = nullptr;
31003e519524SHoward Hinnant}
31013e519524SHoward Hinnant
31023e519524SHoward Hinnanttemplate<class _Tp>
31033e519524SHoward Hinnanttemplate<class _Yp>
3104906c872dSEvgeniy Stepanovinline
31053e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(shared_ptr<_Yp>&& __r,
3106ce195fb2Szoecarver                            typename enable_if<__compatible_with<_Yp, element_type>::value, __nat>::type)
31073739fe79SHoward Hinnant         _NOEXCEPT
31083e519524SHoward Hinnant    : __ptr_(__r.__ptr_),
31093e519524SHoward Hinnant      __cntrl_(__r.__cntrl_)
31103e519524SHoward Hinnant{
3111527a7fdfSBruce Mitchener    __r.__ptr_ = nullptr;
3112527a7fdfSBruce Mitchener    __r.__cntrl_ = nullptr;
31133e519524SHoward Hinnant}
31143e519524SHoward Hinnant
3115e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR)
31163e519524SHoward Hinnanttemplate<class _Tp>
311722747e62SLogan Chientemplate<class _Yp>
311822747e62SLogan Chienshared_ptr<_Tp>::shared_ptr(auto_ptr<_Yp>&& __r,
311922747e62SLogan Chien                            typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type)
31203e519524SHoward Hinnant    : __ptr_(__r.get())
31213e519524SHoward Hinnant{
31223e519524SHoward Hinnant    typedef __shared_ptr_pointer<_Yp*, default_delete<_Yp>, allocator<_Yp> > _CntrlBlk;
31233e519524SHoward Hinnant    __cntrl_ = new _CntrlBlk(__r.get(), default_delete<_Yp>(), allocator<_Yp>());
312439005d30SEric Fiselier    __enable_weak_this(__r.get(), __r.get());
31253e519524SHoward Hinnant    __r.release();
31263e519524SHoward Hinnant}
3127e67179bcSMarshall Clow#endif
31283e519524SHoward Hinnant
31293e519524SHoward Hinnanttemplate<class _Tp>
313022747e62SLogan Chientemplate <class _Yp, class _Dp>
31313e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp>&& __r,
313222747e62SLogan Chien                            typename enable_if
313322747e62SLogan Chien                            <
313422747e62SLogan Chien                                !is_lvalue_reference<_Dp>::value &&
313522747e62SLogan Chien                                !is_array<_Yp>::value &&
313622747e62SLogan Chien                                is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value,
313722747e62SLogan Chien                                __nat
313822747e62SLogan Chien                            >::type)
31393e519524SHoward Hinnant    : __ptr_(__r.get())
31403e519524SHoward Hinnant{
3141c34f847bSMarshall Clow#if _LIBCPP_STD_VER > 11
3142c34f847bSMarshall Clow    if (__ptr_ == nullptr)
3143c34f847bSMarshall Clow        __cntrl_ = nullptr;
3144c34f847bSMarshall Clow    else
3145c34f847bSMarshall Clow#endif
3146c34f847bSMarshall Clow    {
314772d0d603SErik Pilkington        typedef typename __shared_ptr_default_allocator<_Yp>::type _AllocT;
314872d0d603SErik Pilkington        typedef __shared_ptr_pointer<_Yp*, _Dp, _AllocT > _CntrlBlk;
314972d0d603SErik Pilkington        __cntrl_ = new _CntrlBlk(__r.get(), __r.get_deleter(), _AllocT());
315039005d30SEric Fiselier        __enable_weak_this(__r.get(), __r.get());
3151c34f847bSMarshall Clow    }
31523e519524SHoward Hinnant    __r.release();
31533e519524SHoward Hinnant}
31543e519524SHoward Hinnant
31553e519524SHoward Hinnanttemplate<class _Tp>
315622747e62SLogan Chientemplate <class _Yp, class _Dp>
31573e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp>&& __r,
315822747e62SLogan Chien                            typename enable_if
315922747e62SLogan Chien                            <
316022747e62SLogan Chien                                is_lvalue_reference<_Dp>::value &&
316122747e62SLogan Chien                                !is_array<_Yp>::value &&
316222747e62SLogan Chien                                is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value,
316322747e62SLogan Chien                                __nat
316422747e62SLogan Chien                            >::type)
31653e519524SHoward Hinnant    : __ptr_(__r.get())
31663e519524SHoward Hinnant{
3167c34f847bSMarshall Clow#if _LIBCPP_STD_VER > 11
3168c34f847bSMarshall Clow    if (__ptr_ == nullptr)
3169c34f847bSMarshall Clow        __cntrl_ = nullptr;
3170c34f847bSMarshall Clow    else
3171c34f847bSMarshall Clow#endif
3172c34f847bSMarshall Clow    {
317372d0d603SErik Pilkington        typedef typename __shared_ptr_default_allocator<_Yp>::type _AllocT;
31743e519524SHoward Hinnant        typedef __shared_ptr_pointer<_Yp*,
31753e519524SHoward Hinnant                                     reference_wrapper<typename remove_reference<_Dp>::type>,
317672d0d603SErik Pilkington                                     _AllocT > _CntrlBlk;
3177092a57f5SLogan Smith        __cntrl_ = new _CntrlBlk(__r.get(), _VSTD::ref(__r.get_deleter()), _AllocT());
317839005d30SEric Fiselier        __enable_weak_this(__r.get(), __r.get());
3179c34f847bSMarshall Clow    }
31803e519524SHoward Hinnant    __r.release();
31813e519524SHoward Hinnant}
31823e519524SHoward Hinnant
3183471bbb6eSZoe Carvertemplate<class _Tp>
31843e519524SHoward Hinnantshared_ptr<_Tp>::~shared_ptr()
31853e519524SHoward Hinnant{
31863e519524SHoward Hinnant    if (__cntrl_)
31873e519524SHoward Hinnant        __cntrl_->__release_shared();
31883e519524SHoward Hinnant}
31893e519524SHoward Hinnant
31903e519524SHoward Hinnanttemplate<class _Tp>
3191906c872dSEvgeniy Stepanovinline
31923e519524SHoward Hinnantshared_ptr<_Tp>&
31933739fe79SHoward Hinnantshared_ptr<_Tp>::operator=(const shared_ptr& __r) _NOEXCEPT
31943e519524SHoward Hinnant{
31953e519524SHoward Hinnant    shared_ptr(__r).swap(*this);
31963e519524SHoward Hinnant    return *this;
31973e519524SHoward Hinnant}
31983e519524SHoward Hinnant
31993e519524SHoward Hinnanttemplate<class _Tp>
32003e519524SHoward Hinnanttemplate<class _Yp>
3201906c872dSEvgeniy Stepanovinline
32028e25104bSHoward Hinnanttypename enable_if
32038e25104bSHoward Hinnant<
3204ce195fb2Szoecarver    __compatible_with<_Yp, typename shared_ptr<_Tp>::element_type>::value,
32053e519524SHoward Hinnant    shared_ptr<_Tp>&
32068e25104bSHoward Hinnant>::type
32073739fe79SHoward Hinnantshared_ptr<_Tp>::operator=(const shared_ptr<_Yp>& __r) _NOEXCEPT
32083e519524SHoward Hinnant{
32093e519524SHoward Hinnant    shared_ptr(__r).swap(*this);
32103e519524SHoward Hinnant    return *this;
32113e519524SHoward Hinnant}
32123e519524SHoward Hinnant
32133e519524SHoward Hinnanttemplate<class _Tp>
3214906c872dSEvgeniy Stepanovinline
32153e519524SHoward Hinnantshared_ptr<_Tp>&
32163739fe79SHoward Hinnantshared_ptr<_Tp>::operator=(shared_ptr&& __r) _NOEXCEPT
32173e519524SHoward Hinnant{
3218ce48a113SHoward Hinnant    shared_ptr(_VSTD::move(__r)).swap(*this);
32193e519524SHoward Hinnant    return *this;
32203e519524SHoward Hinnant}
32213e519524SHoward Hinnant
32223e519524SHoward Hinnanttemplate<class _Tp>
32233e519524SHoward Hinnanttemplate<class _Yp>
3224906c872dSEvgeniy Stepanovinline
32258e25104bSHoward Hinnanttypename enable_if
32268e25104bSHoward Hinnant<
3227ce195fb2Szoecarver    __compatible_with<_Yp, typename shared_ptr<_Tp>::element_type>::value,
32283e519524SHoward Hinnant    shared_ptr<_Tp>&
32298e25104bSHoward Hinnant>::type
32303e519524SHoward Hinnantshared_ptr<_Tp>::operator=(shared_ptr<_Yp>&& __r)
32313e519524SHoward Hinnant{
3232ce48a113SHoward Hinnant    shared_ptr(_VSTD::move(__r)).swap(*this);
32333e519524SHoward Hinnant    return *this;
32343e519524SHoward Hinnant}
32353e519524SHoward Hinnant
3236e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR)
32373e519524SHoward Hinnanttemplate<class _Tp>
32383e519524SHoward Hinnanttemplate<class _Yp>
3239906c872dSEvgeniy Stepanovinline
32408e25104bSHoward Hinnanttypename enable_if
32418e25104bSHoward Hinnant<
32428e25104bSHoward Hinnant    !is_array<_Yp>::value &&
3243dc83e779SMarshall Clow    is_convertible<_Yp*, typename shared_ptr<_Tp>::element_type*>::value,
324484f996fbSHoward Hinnant    shared_ptr<_Tp>
324584f996fbSHoward Hinnant>::type&
32463e519524SHoward Hinnantshared_ptr<_Tp>::operator=(auto_ptr<_Yp>&& __r)
32473e519524SHoward Hinnant{
3248ce48a113SHoward Hinnant    shared_ptr(_VSTD::move(__r)).swap(*this);
32493e519524SHoward Hinnant    return *this;
32503e519524SHoward Hinnant}
3251e67179bcSMarshall Clow#endif
32523e519524SHoward Hinnant
32533e519524SHoward Hinnanttemplate<class _Tp>
32543e519524SHoward Hinnanttemplate <class _Yp, class _Dp>
3255906c872dSEvgeniy Stepanovinline
32568e25104bSHoward Hinnanttypename enable_if
32578e25104bSHoward Hinnant<
32588e25104bSHoward Hinnant    !is_array<_Yp>::value &&
3259dc83e779SMarshall Clow    is_convertible<typename unique_ptr<_Yp, _Dp>::pointer,
3260dc83e779SMarshall Clow                   typename shared_ptr<_Tp>::element_type*>::value,
32613e519524SHoward Hinnant    shared_ptr<_Tp>&
32628e25104bSHoward Hinnant>::type
32633e519524SHoward Hinnantshared_ptr<_Tp>::operator=(unique_ptr<_Yp, _Dp>&& __r)
32643e519524SHoward Hinnant{
3265ce48a113SHoward Hinnant    shared_ptr(_VSTD::move(__r)).swap(*this);
32663e519524SHoward Hinnant    return *this;
32673e519524SHoward Hinnant}
32683e519524SHoward Hinnant
32693e519524SHoward Hinnanttemplate<class _Tp>
3270906c872dSEvgeniy Stepanovinline
32713e519524SHoward Hinnantvoid
32723739fe79SHoward Hinnantshared_ptr<_Tp>::swap(shared_ptr& __r) _NOEXCEPT
32733e519524SHoward Hinnant{
3274ce48a113SHoward Hinnant    _VSTD::swap(__ptr_, __r.__ptr_);
3275ce48a113SHoward Hinnant    _VSTD::swap(__cntrl_, __r.__cntrl_);
32763e519524SHoward Hinnant}
32773e519524SHoward Hinnant
32783e519524SHoward Hinnanttemplate<class _Tp>
3279906c872dSEvgeniy Stepanovinline
32803e519524SHoward Hinnantvoid
32813739fe79SHoward Hinnantshared_ptr<_Tp>::reset() _NOEXCEPT
32823e519524SHoward Hinnant{
32833e519524SHoward Hinnant    shared_ptr().swap(*this);
32843e519524SHoward Hinnant}
32853e519524SHoward Hinnant
32863e519524SHoward Hinnanttemplate<class _Tp>
32873e519524SHoward Hinnanttemplate<class _Yp>
3288906c872dSEvgeniy Stepanovinline
32898e25104bSHoward Hinnanttypename enable_if
32908e25104bSHoward Hinnant<
3291ce195fb2Szoecarver    __compatible_with<_Yp, typename shared_ptr<_Tp>::element_type>::value,
32923e519524SHoward Hinnant    void
32938e25104bSHoward Hinnant>::type
32943e519524SHoward Hinnantshared_ptr<_Tp>::reset(_Yp* __p)
32953e519524SHoward Hinnant{
32963e519524SHoward Hinnant    shared_ptr(__p).swap(*this);
32973e519524SHoward Hinnant}
32983e519524SHoward Hinnant
32993e519524SHoward Hinnanttemplate<class _Tp>
33003e519524SHoward Hinnanttemplate<class _Yp, class _Dp>
3301906c872dSEvgeniy Stepanovinline
33028e25104bSHoward Hinnanttypename enable_if
33038e25104bSHoward Hinnant<
3304ce195fb2Szoecarver    __compatible_with<_Yp, typename shared_ptr<_Tp>::element_type>::value,
33053e519524SHoward Hinnant    void
33068e25104bSHoward Hinnant>::type
33073e519524SHoward Hinnantshared_ptr<_Tp>::reset(_Yp* __p, _Dp __d)
33083e519524SHoward Hinnant{
33093e519524SHoward Hinnant    shared_ptr(__p, __d).swap(*this);
33103e519524SHoward Hinnant}
33113e519524SHoward Hinnant
33123e519524SHoward Hinnanttemplate<class _Tp>
33133e519524SHoward Hinnanttemplate<class _Yp, class _Dp, class _Alloc>
3314906c872dSEvgeniy Stepanovinline
33158e25104bSHoward Hinnanttypename enable_if
33168e25104bSHoward Hinnant<
3317ce195fb2Szoecarver    __compatible_with<_Yp, typename shared_ptr<_Tp>::element_type>::value,
33183e519524SHoward Hinnant    void
33198e25104bSHoward Hinnant>::type
33203e519524SHoward Hinnantshared_ptr<_Tp>::reset(_Yp* __p, _Dp __d, _Alloc __a)
33213e519524SHoward Hinnant{
33223e519524SHoward Hinnant    shared_ptr(__p, __d, __a).swap(*this);
33233e519524SHoward Hinnant}
33243e519524SHoward Hinnant
332519d57b5cSLouis Dionne//
332619d57b5cSLouis Dionne// std::allocate_shared and std::make_shared
332719d57b5cSLouis Dionne//
332819d57b5cSLouis Dionnetemplate<class _Tp, class _Alloc, class ..._Args, class = _EnableIf<!is_array<_Tp>::value> >
332919d57b5cSLouis Dionne_LIBCPP_HIDE_FROM_ABI
333019d57b5cSLouis Dionneshared_ptr<_Tp> allocate_shared(const _Alloc& __a, _Args&& ...__args)
33313e519524SHoward Hinnant{
333219d57b5cSLouis Dionne    using _ControlBlock = __shared_ptr_emplace<_Tp, _Alloc>;
333319d57b5cSLouis Dionne    using _ControlBlockAllocator = typename __allocator_traits_rebind<_Alloc, _ControlBlock>::type;
333419d57b5cSLouis Dionne    __allocation_guard<_ControlBlockAllocator> __guard(__a, 1);
333519d57b5cSLouis Dionne    ::new ((void*)_VSTD::addressof(*__guard.__get())) _ControlBlock(__a, _VSTD::forward<_Args>(__args)...);
333619d57b5cSLouis Dionne    auto __control_block = __guard.__release_ptr();
333719d57b5cSLouis Dionne    return shared_ptr<_Tp>::__create_with_control_block((*__control_block).__get_elem(), _VSTD::addressof(*__control_block));
33383e519524SHoward Hinnant}
33393e519524SHoward Hinnant
3340ece3e5bbSLouis Dionnetemplate<class _Tp, class ..._Args, class = _EnableIf<!is_array<_Tp>::value> >
3341ece3e5bbSLouis Dionne_LIBCPP_HIDE_FROM_ABI
3342ece3e5bbSLouis Dionneshared_ptr<_Tp> make_shared(_Args&& ...__args)
3343ece3e5bbSLouis Dionne{
3344ece3e5bbSLouis Dionne    return _VSTD::allocate_shared<_Tp>(allocator<_Tp>(), _VSTD::forward<_Args>(__args)...);
3345ece3e5bbSLouis Dionne}
3346ece3e5bbSLouis Dionne
33473e519524SHoward Hinnanttemplate<class _Tp, class _Up>
33483e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
33493e519524SHoward Hinnantbool
33503739fe79SHoward Hinnantoperator==(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT
33513e519524SHoward Hinnant{
33523e519524SHoward Hinnant    return __x.get() == __y.get();
33533e519524SHoward Hinnant}
33543e519524SHoward Hinnant
33553e519524SHoward Hinnanttemplate<class _Tp, class _Up>
33563e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
33573e519524SHoward Hinnantbool
33583739fe79SHoward Hinnantoperator!=(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT
33593e519524SHoward Hinnant{
33603e519524SHoward Hinnant    return !(__x == __y);
33613e519524SHoward Hinnant}
33623e519524SHoward Hinnant
33633e519524SHoward Hinnanttemplate<class _Tp, class _Up>
33643e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
33653e519524SHoward Hinnantbool
33663739fe79SHoward Hinnantoperator<(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT
33673e519524SHoward Hinnant{
3368c0db0729SMarshall Clow#if _LIBCPP_STD_VER <= 11
33696fe361c1SEric Fiselier    typedef typename common_type<_Tp*, _Up*>::type _Vp;
33706fe361c1SEric Fiselier    return less<_Vp>()(__x.get(), __y.get());
3371c0db0729SMarshall Clow#else
3372c0db0729SMarshall Clow    return less<>()(__x.get(), __y.get());
3373c0db0729SMarshall Clow#endif
3374c0db0729SMarshall Clow
337567f39647SHoward Hinnant}
337667f39647SHoward Hinnant
337767f39647SHoward Hinnanttemplate<class _Tp, class _Up>
337867f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
337967f39647SHoward Hinnantbool
338067f39647SHoward Hinnantoperator>(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT
338167f39647SHoward Hinnant{
338267f39647SHoward Hinnant    return __y < __x;
338367f39647SHoward Hinnant}
338467f39647SHoward Hinnant
338567f39647SHoward Hinnanttemplate<class _Tp, class _Up>
338667f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
338767f39647SHoward Hinnantbool
338867f39647SHoward Hinnantoperator<=(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT
338967f39647SHoward Hinnant{
339067f39647SHoward Hinnant    return !(__y < __x);
339167f39647SHoward Hinnant}
339267f39647SHoward Hinnant
339367f39647SHoward Hinnanttemplate<class _Tp, class _Up>
339467f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
339567f39647SHoward Hinnantbool
339667f39647SHoward Hinnantoperator>=(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT
339767f39647SHoward Hinnant{
339867f39647SHoward Hinnant    return !(__x < __y);
339967f39647SHoward Hinnant}
340067f39647SHoward Hinnant
340167f39647SHoward Hinnanttemplate<class _Tp>
340267f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
340367f39647SHoward Hinnantbool
340467f39647SHoward Hinnantoperator==(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT
340567f39647SHoward Hinnant{
340667f39647SHoward Hinnant    return !__x;
340767f39647SHoward Hinnant}
340867f39647SHoward Hinnant
340967f39647SHoward Hinnanttemplate<class _Tp>
341067f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
341167f39647SHoward Hinnantbool
341267f39647SHoward Hinnantoperator==(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT
341367f39647SHoward Hinnant{
341467f39647SHoward Hinnant    return !__x;
341567f39647SHoward Hinnant}
341667f39647SHoward Hinnant
341767f39647SHoward Hinnanttemplate<class _Tp>
341867f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
341967f39647SHoward Hinnantbool
342067f39647SHoward Hinnantoperator!=(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT
342167f39647SHoward Hinnant{
342267f39647SHoward Hinnant    return static_cast<bool>(__x);
342367f39647SHoward Hinnant}
342467f39647SHoward Hinnant
342567f39647SHoward Hinnanttemplate<class _Tp>
342667f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
342767f39647SHoward Hinnantbool
342867f39647SHoward Hinnantoperator!=(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT
342967f39647SHoward Hinnant{
343067f39647SHoward Hinnant    return static_cast<bool>(__x);
343167f39647SHoward Hinnant}
343267f39647SHoward Hinnant
343367f39647SHoward Hinnanttemplate<class _Tp>
343467f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
343567f39647SHoward Hinnantbool
343667f39647SHoward Hinnantoperator<(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT
343767f39647SHoward Hinnant{
343867f39647SHoward Hinnant    return less<_Tp*>()(__x.get(), nullptr);
343967f39647SHoward Hinnant}
344067f39647SHoward Hinnant
344167f39647SHoward Hinnanttemplate<class _Tp>
344267f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
344367f39647SHoward Hinnantbool
344467f39647SHoward Hinnantoperator<(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT
344567f39647SHoward Hinnant{
344667f39647SHoward Hinnant    return less<_Tp*>()(nullptr, __x.get());
344767f39647SHoward Hinnant}
344867f39647SHoward Hinnant
344967f39647SHoward Hinnanttemplate<class _Tp>
345067f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
345167f39647SHoward Hinnantbool
345267f39647SHoward Hinnantoperator>(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT
345367f39647SHoward Hinnant{
345467f39647SHoward Hinnant    return nullptr < __x;
345567f39647SHoward Hinnant}
345667f39647SHoward Hinnant
345767f39647SHoward Hinnanttemplate<class _Tp>
345867f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
345967f39647SHoward Hinnantbool
346067f39647SHoward Hinnantoperator>(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT
346167f39647SHoward Hinnant{
346267f39647SHoward Hinnant    return __x < nullptr;
346367f39647SHoward Hinnant}
346467f39647SHoward Hinnant
346567f39647SHoward Hinnanttemplate<class _Tp>
346667f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
346767f39647SHoward Hinnantbool
346867f39647SHoward Hinnantoperator<=(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT
346967f39647SHoward Hinnant{
347067f39647SHoward Hinnant    return !(nullptr < __x);
347167f39647SHoward Hinnant}
347267f39647SHoward Hinnant
347367f39647SHoward Hinnanttemplate<class _Tp>
347467f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
347567f39647SHoward Hinnantbool
347667f39647SHoward Hinnantoperator<=(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT
347767f39647SHoward Hinnant{
347867f39647SHoward Hinnant    return !(__x < nullptr);
347967f39647SHoward Hinnant}
348067f39647SHoward Hinnant
348167f39647SHoward Hinnanttemplate<class _Tp>
348267f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
348367f39647SHoward Hinnantbool
348467f39647SHoward Hinnantoperator>=(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT
348567f39647SHoward Hinnant{
348667f39647SHoward Hinnant    return !(__x < nullptr);
348767f39647SHoward Hinnant}
348867f39647SHoward Hinnant
348967f39647SHoward Hinnanttemplate<class _Tp>
349067f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
349167f39647SHoward Hinnantbool
349267f39647SHoward Hinnantoperator>=(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT
349367f39647SHoward Hinnant{
349467f39647SHoward Hinnant    return !(nullptr < __x);
34953e519524SHoward Hinnant}
34963e519524SHoward Hinnant
34973e519524SHoward Hinnanttemplate<class _Tp>
34983e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
34993e519524SHoward Hinnantvoid
35003739fe79SHoward Hinnantswap(shared_ptr<_Tp>& __x, shared_ptr<_Tp>& __y) _NOEXCEPT
35013e519524SHoward Hinnant{
35023e519524SHoward Hinnant    __x.swap(__y);
35033e519524SHoward Hinnant}
35043e519524SHoward Hinnant
35053e519524SHoward Hinnanttemplate<class _Tp, class _Up>
35063e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
35073e519524SHoward Hinnantshared_ptr<_Tp>
35083739fe79SHoward Hinnantstatic_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT
35093e519524SHoward Hinnant{
3510ce195fb2Szoecarver    return shared_ptr<_Tp>(__r,
3511ce195fb2Szoecarver                           static_cast<
3512ce195fb2Szoecarver                               typename shared_ptr<_Tp>::element_type*>(__r.get()));
35133e519524SHoward Hinnant}
35143e519524SHoward Hinnant
35153e519524SHoward Hinnanttemplate<class _Tp, class _Up>
35163e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
35173e519524SHoward Hinnantshared_ptr<_Tp>
35183739fe79SHoward Hinnantdynamic_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT
35193e519524SHoward Hinnant{
3520ce195fb2Szoecarver    typedef typename shared_ptr<_Tp>::element_type _ET;
3521ce195fb2Szoecarver    _ET* __p = dynamic_cast<_ET*>(__r.get());
35223e519524SHoward Hinnant    return __p ? shared_ptr<_Tp>(__r, __p) : shared_ptr<_Tp>();
35233e519524SHoward Hinnant}
35243e519524SHoward Hinnant
35253e519524SHoward Hinnanttemplate<class _Tp, class _Up>
35263e519524SHoward Hinnantshared_ptr<_Tp>
35273739fe79SHoward Hinnantconst_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT
35283e519524SHoward Hinnant{
3529ce195fb2Szoecarver    typedef typename shared_ptr<_Tp>::element_type _RTp;
35308e25104bSHoward Hinnant    return shared_ptr<_Tp>(__r, const_cast<_RTp*>(__r.get()));
35313e519524SHoward Hinnant}
35323e519524SHoward Hinnant
3533ce195fb2Szoecarvertemplate<class _Tp, class _Up>
3534ce195fb2Szoecarvershared_ptr<_Tp>
3535ce195fb2Szoecarverreinterpret_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT
3536ce195fb2Szoecarver{
3537ce195fb2Szoecarver    return shared_ptr<_Tp>(__r,
3538ce195fb2Szoecarver                           reinterpret_cast<
3539ce195fb2Szoecarver                               typename shared_ptr<_Tp>::element_type*>(__r.get()));
3540ce195fb2Szoecarver}
3541ce195fb2Szoecarver
354254b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI
354354b409fdSHoward Hinnant
35443e519524SHoward Hinnanttemplate<class _Dp, class _Tp>
35453e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
35463e519524SHoward Hinnant_Dp*
35473739fe79SHoward Hinnantget_deleter(const shared_ptr<_Tp>& __p) _NOEXCEPT
35483e519524SHoward Hinnant{
35493e519524SHoward Hinnant    return __p.template __get_deleter<_Dp>();
35503e519524SHoward Hinnant}
35513e519524SHoward Hinnant
3552b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_RTTI
355354b409fdSHoward Hinnant
35543e519524SHoward Hinnanttemplate<class _Tp>
355576887bc4SVy Nguyenclass _LIBCPP_SHARED_PTR_TRIVIAL_ABI _LIBCPP_TEMPLATE_VIS weak_ptr
35563e519524SHoward Hinnant{
35573e519524SHoward Hinnantpublic:
35583e519524SHoward Hinnant    typedef _Tp element_type;
35593e519524SHoward Hinnantprivate:
35603e519524SHoward Hinnant    element_type*        __ptr_;
35613e519524SHoward Hinnant    __shared_weak_count* __cntrl_;
35623e519524SHoward Hinnant
35633e519524SHoward Hinnantpublic:
3564906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
3565c0937e8aSHoward Hinnant    _LIBCPP_CONSTEXPR weak_ptr() _NOEXCEPT;
3566906c872dSEvgeniy Stepanov    template<class _Yp> _LIBCPP_INLINE_VISIBILITY weak_ptr(shared_ptr<_Yp> const& __r,
35673739fe79SHoward Hinnant                   typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0)
35683739fe79SHoward Hinnant                        _NOEXCEPT;
3569906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
35703739fe79SHoward Hinnant    weak_ptr(weak_ptr const& __r) _NOEXCEPT;
3571906c872dSEvgeniy Stepanov    template<class _Yp> _LIBCPP_INLINE_VISIBILITY weak_ptr(weak_ptr<_Yp> const& __r,
35723739fe79SHoward Hinnant                   typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0)
35733739fe79SHoward Hinnant                         _NOEXCEPT;
35743e519524SHoward Hinnant
3575906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
35768e25104bSHoward Hinnant    weak_ptr(weak_ptr&& __r) _NOEXCEPT;
3577906c872dSEvgeniy Stepanov    template<class _Yp> _LIBCPP_INLINE_VISIBILITY weak_ptr(weak_ptr<_Yp>&& __r,
35788e25104bSHoward Hinnant                   typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0)
35798e25104bSHoward Hinnant                         _NOEXCEPT;
35803e519524SHoward Hinnant    ~weak_ptr();
35813e519524SHoward Hinnant
3582906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
35833739fe79SHoward Hinnant    weak_ptr& operator=(weak_ptr const& __r) _NOEXCEPT;
35848e25104bSHoward Hinnant    template<class _Yp>
35858e25104bSHoward Hinnant        typename enable_if
35868e25104bSHoward Hinnant        <
35878e25104bSHoward Hinnant            is_convertible<_Yp*, element_type*>::value,
35888e25104bSHoward Hinnant            weak_ptr&
35898e25104bSHoward Hinnant        >::type
3590906c872dSEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
35918e25104bSHoward Hinnant        operator=(weak_ptr<_Yp> const& __r) _NOEXCEPT;
35928e25104bSHoward Hinnant
3593906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
35948e25104bSHoward Hinnant    weak_ptr& operator=(weak_ptr&& __r) _NOEXCEPT;
35958e25104bSHoward Hinnant    template<class _Yp>
35968e25104bSHoward Hinnant        typename enable_if
35978e25104bSHoward Hinnant        <
35988e25104bSHoward Hinnant            is_convertible<_Yp*, element_type*>::value,
35998e25104bSHoward Hinnant            weak_ptr&
36008e25104bSHoward Hinnant        >::type
3601906c872dSEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
36028e25104bSHoward Hinnant        operator=(weak_ptr<_Yp>&& __r) _NOEXCEPT;
36038e25104bSHoward Hinnant
36048e25104bSHoward Hinnant    template<class _Yp>
36058e25104bSHoward Hinnant        typename enable_if
36068e25104bSHoward Hinnant        <
36078e25104bSHoward Hinnant            is_convertible<_Yp*, element_type*>::value,
36088e25104bSHoward Hinnant            weak_ptr&
36098e25104bSHoward Hinnant        >::type
3610906c872dSEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
36118e25104bSHoward Hinnant        operator=(shared_ptr<_Yp> const& __r) _NOEXCEPT;
36123e519524SHoward Hinnant
3613906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
36143739fe79SHoward Hinnant    void swap(weak_ptr& __r) _NOEXCEPT;
3615906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
36163739fe79SHoward Hinnant    void reset() _NOEXCEPT;
36173e519524SHoward Hinnant
3618848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
36193739fe79SHoward Hinnant    long use_count() const _NOEXCEPT
36203739fe79SHoward Hinnant        {return __cntrl_ ? __cntrl_->use_count() : 0;}
3621848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
36223739fe79SHoward Hinnant    bool expired() const _NOEXCEPT
3623527a7fdfSBruce Mitchener        {return __cntrl_ == nullptr || __cntrl_->use_count() == 0;}
36243739fe79SHoward Hinnant    shared_ptr<_Tp> lock() const _NOEXCEPT;
3625848a5374SHoward Hinnant    template<class _Up>
3626848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
362736bc7178SMarshall Clow        bool owner_before(const shared_ptr<_Up>& __r) const _NOEXCEPT
36283e519524SHoward Hinnant        {return __cntrl_ < __r.__cntrl_;}
3629848a5374SHoward Hinnant    template<class _Up>
3630848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
363136bc7178SMarshall Clow        bool owner_before(const weak_ptr<_Up>& __r) const _NOEXCEPT
36323e519524SHoward Hinnant        {return __cntrl_ < __r.__cntrl_;}
36333e519524SHoward Hinnant
3634e2f2d1edSEric Fiselier    template <class _Up> friend class _LIBCPP_TEMPLATE_VIS weak_ptr;
3635e2f2d1edSEric Fiselier    template <class _Up> friend class _LIBCPP_TEMPLATE_VIS shared_ptr;
36363e519524SHoward Hinnant};
36373e519524SHoward Hinnant
363883564056SLogan Smith#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
363983564056SLogan Smithtemplate<class _Tp>
364083564056SLogan Smithweak_ptr(shared_ptr<_Tp>) -> weak_ptr<_Tp>;
364183564056SLogan Smith#endif
364283564056SLogan Smith
36433e519524SHoward Hinnanttemplate<class _Tp>
3644906c872dSEvgeniy Stepanovinline
3645c0937e8aSHoward Hinnant_LIBCPP_CONSTEXPR
36463739fe79SHoward Hinnantweak_ptr<_Tp>::weak_ptr() _NOEXCEPT
3647527a7fdfSBruce Mitchener    : __ptr_(nullptr),
3648527a7fdfSBruce Mitchener      __cntrl_(nullptr)
36493e519524SHoward Hinnant{
36503e519524SHoward Hinnant}
36513e519524SHoward Hinnant
36523e519524SHoward Hinnanttemplate<class _Tp>
3653906c872dSEvgeniy Stepanovinline
36543739fe79SHoward Hinnantweak_ptr<_Tp>::weak_ptr(weak_ptr const& __r) _NOEXCEPT
36553e519524SHoward Hinnant    : __ptr_(__r.__ptr_),
36563e519524SHoward Hinnant      __cntrl_(__r.__cntrl_)
36573e519524SHoward Hinnant{
36583e519524SHoward Hinnant    if (__cntrl_)
36593e519524SHoward Hinnant        __cntrl_->__add_weak();
36603e519524SHoward Hinnant}
36613e519524SHoward Hinnant
36623e519524SHoward Hinnanttemplate<class _Tp>
36633e519524SHoward Hinnanttemplate<class _Yp>
3664906c872dSEvgeniy Stepanovinline
36653e519524SHoward Hinnantweak_ptr<_Tp>::weak_ptr(shared_ptr<_Yp> const& __r,
36665eb6bdfaSHoward Hinnant                        typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type)
36673739fe79SHoward Hinnant                         _NOEXCEPT
36683e519524SHoward Hinnant    : __ptr_(__r.__ptr_),
36693e519524SHoward Hinnant      __cntrl_(__r.__cntrl_)
36703e519524SHoward Hinnant{
36713e519524SHoward Hinnant    if (__cntrl_)
36723e519524SHoward Hinnant        __cntrl_->__add_weak();
36733e519524SHoward Hinnant}
36743e519524SHoward Hinnant
36753e519524SHoward Hinnanttemplate<class _Tp>
36763e519524SHoward Hinnanttemplate<class _Yp>
3677906c872dSEvgeniy Stepanovinline
36783e519524SHoward Hinnantweak_ptr<_Tp>::weak_ptr(weak_ptr<_Yp> const& __r,
36795eb6bdfaSHoward Hinnant                        typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type)
36803739fe79SHoward Hinnant         _NOEXCEPT
36813e519524SHoward Hinnant    : __ptr_(__r.__ptr_),
36823e519524SHoward Hinnant      __cntrl_(__r.__cntrl_)
36833e519524SHoward Hinnant{
36843e519524SHoward Hinnant    if (__cntrl_)
36853e519524SHoward Hinnant        __cntrl_->__add_weak();
36863e519524SHoward Hinnant}
36873e519524SHoward Hinnant
36888e25104bSHoward Hinnanttemplate<class _Tp>
3689906c872dSEvgeniy Stepanovinline
36908e25104bSHoward Hinnantweak_ptr<_Tp>::weak_ptr(weak_ptr&& __r) _NOEXCEPT
36918e25104bSHoward Hinnant    : __ptr_(__r.__ptr_),
36928e25104bSHoward Hinnant      __cntrl_(__r.__cntrl_)
36938e25104bSHoward Hinnant{
3694527a7fdfSBruce Mitchener    __r.__ptr_ = nullptr;
3695527a7fdfSBruce Mitchener    __r.__cntrl_ = nullptr;
36968e25104bSHoward Hinnant}
36978e25104bSHoward Hinnant
36988e25104bSHoward Hinnanttemplate<class _Tp>
36998e25104bSHoward Hinnanttemplate<class _Yp>
3700906c872dSEvgeniy Stepanovinline
37018e25104bSHoward Hinnantweak_ptr<_Tp>::weak_ptr(weak_ptr<_Yp>&& __r,
37028e25104bSHoward Hinnant                        typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type)
37038e25104bSHoward Hinnant         _NOEXCEPT
37048e25104bSHoward Hinnant    : __ptr_(__r.__ptr_),
37058e25104bSHoward Hinnant      __cntrl_(__r.__cntrl_)
37068e25104bSHoward Hinnant{
3707527a7fdfSBruce Mitchener    __r.__ptr_ = nullptr;
3708527a7fdfSBruce Mitchener    __r.__cntrl_ = nullptr;
37098e25104bSHoward Hinnant}
37108e25104bSHoward Hinnant
37113e519524SHoward Hinnanttemplate<class _Tp>
37123e519524SHoward Hinnantweak_ptr<_Tp>::~weak_ptr()
37133e519524SHoward Hinnant{
37143e519524SHoward Hinnant    if (__cntrl_)
37153e519524SHoward Hinnant        __cntrl_->__release_weak();
37163e519524SHoward Hinnant}
37173e519524SHoward Hinnant
37183e519524SHoward Hinnanttemplate<class _Tp>
3719906c872dSEvgeniy Stepanovinline
37203e519524SHoward Hinnantweak_ptr<_Tp>&
37213739fe79SHoward Hinnantweak_ptr<_Tp>::operator=(weak_ptr const& __r) _NOEXCEPT
37223e519524SHoward Hinnant{
37233e519524SHoward Hinnant    weak_ptr(__r).swap(*this);
37243e519524SHoward Hinnant    return *this;
37253e519524SHoward Hinnant}
37263e519524SHoward Hinnant
37273e519524SHoward Hinnanttemplate<class _Tp>
37283e519524SHoward Hinnanttemplate<class _Yp>
3729906c872dSEvgeniy Stepanovinline
37308e25104bSHoward Hinnanttypename enable_if
37318e25104bSHoward Hinnant<
37328e25104bSHoward Hinnant    is_convertible<_Yp*, _Tp*>::value,
37333e519524SHoward Hinnant    weak_ptr<_Tp>&
37348e25104bSHoward Hinnant>::type
37353739fe79SHoward Hinnantweak_ptr<_Tp>::operator=(weak_ptr<_Yp> const& __r) _NOEXCEPT
37363e519524SHoward Hinnant{
37373e519524SHoward Hinnant    weak_ptr(__r).swap(*this);
37383e519524SHoward Hinnant    return *this;
37393e519524SHoward Hinnant}
37403e519524SHoward Hinnant
37418e25104bSHoward Hinnanttemplate<class _Tp>
3742906c872dSEvgeniy Stepanovinline
37438e25104bSHoward Hinnantweak_ptr<_Tp>&
37448e25104bSHoward Hinnantweak_ptr<_Tp>::operator=(weak_ptr&& __r) _NOEXCEPT
37458e25104bSHoward Hinnant{
37468e25104bSHoward Hinnant    weak_ptr(_VSTD::move(__r)).swap(*this);
37478e25104bSHoward Hinnant    return *this;
37488e25104bSHoward Hinnant}
37498e25104bSHoward Hinnant
37503e519524SHoward Hinnanttemplate<class _Tp>
37513e519524SHoward Hinnanttemplate<class _Yp>
3752906c872dSEvgeniy Stepanovinline
37538e25104bSHoward Hinnanttypename enable_if
37548e25104bSHoward Hinnant<
37558e25104bSHoward Hinnant    is_convertible<_Yp*, _Tp*>::value,
37563e519524SHoward Hinnant    weak_ptr<_Tp>&
37578e25104bSHoward Hinnant>::type
37588e25104bSHoward Hinnantweak_ptr<_Tp>::operator=(weak_ptr<_Yp>&& __r) _NOEXCEPT
37598e25104bSHoward Hinnant{
37608e25104bSHoward Hinnant    weak_ptr(_VSTD::move(__r)).swap(*this);
37618e25104bSHoward Hinnant    return *this;
37628e25104bSHoward Hinnant}
37638e25104bSHoward Hinnant
37648e25104bSHoward Hinnanttemplate<class _Tp>
37658e25104bSHoward Hinnanttemplate<class _Yp>
3766906c872dSEvgeniy Stepanovinline
37678e25104bSHoward Hinnanttypename enable_if
37688e25104bSHoward Hinnant<
37698e25104bSHoward Hinnant    is_convertible<_Yp*, _Tp*>::value,
37708e25104bSHoward Hinnant    weak_ptr<_Tp>&
37718e25104bSHoward Hinnant>::type
37723739fe79SHoward Hinnantweak_ptr<_Tp>::operator=(shared_ptr<_Yp> const& __r) _NOEXCEPT
37733e519524SHoward Hinnant{
37743e519524SHoward Hinnant    weak_ptr(__r).swap(*this);
37753e519524SHoward Hinnant    return *this;
37763e519524SHoward Hinnant}
37773e519524SHoward Hinnant
37783e519524SHoward Hinnanttemplate<class _Tp>
3779906c872dSEvgeniy Stepanovinline
37803e519524SHoward Hinnantvoid
37813739fe79SHoward Hinnantweak_ptr<_Tp>::swap(weak_ptr& __r) _NOEXCEPT
37823e519524SHoward Hinnant{
3783ce48a113SHoward Hinnant    _VSTD::swap(__ptr_, __r.__ptr_);
3784ce48a113SHoward Hinnant    _VSTD::swap(__cntrl_, __r.__cntrl_);
37853e519524SHoward Hinnant}
37863e519524SHoward Hinnant
37873e519524SHoward Hinnanttemplate<class _Tp>
37883e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
37893e519524SHoward Hinnantvoid
37903739fe79SHoward Hinnantswap(weak_ptr<_Tp>& __x, weak_ptr<_Tp>& __y) _NOEXCEPT
37913e519524SHoward Hinnant{
37923e519524SHoward Hinnant    __x.swap(__y);
37933e519524SHoward Hinnant}
37943e519524SHoward Hinnant
37953e519524SHoward Hinnanttemplate<class _Tp>
3796906c872dSEvgeniy Stepanovinline
37973e519524SHoward Hinnantvoid
37983739fe79SHoward Hinnantweak_ptr<_Tp>::reset() _NOEXCEPT
37993e519524SHoward Hinnant{
38003e519524SHoward Hinnant    weak_ptr().swap(*this);
38013e519524SHoward Hinnant}
38023e519524SHoward Hinnant
38033e519524SHoward Hinnanttemplate<class _Tp>
38043e519524SHoward Hinnanttemplate<class _Yp>
38053e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(const weak_ptr<_Yp>& __r,
3806dc83e779SMarshall Clow                            typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type)
38073e519524SHoward Hinnant    : __ptr_(__r.__ptr_),
38083e519524SHoward Hinnant      __cntrl_(__r.__cntrl_ ? __r.__cntrl_->lock() : __r.__cntrl_)
38093e519524SHoward Hinnant{
3810527a7fdfSBruce Mitchener    if (__cntrl_ == nullptr)
3811d437fa5cSMarshall Clow        __throw_bad_weak_ptr();
38123e519524SHoward Hinnant}
38133e519524SHoward Hinnant
38143e519524SHoward Hinnanttemplate<class _Tp>
38153e519524SHoward Hinnantshared_ptr<_Tp>
38163739fe79SHoward Hinnantweak_ptr<_Tp>::lock() const _NOEXCEPT
38173e519524SHoward Hinnant{
38183e519524SHoward Hinnant    shared_ptr<_Tp> __r;
38193e519524SHoward Hinnant    __r.__cntrl_ = __cntrl_ ? __cntrl_->lock() : __cntrl_;
38203e519524SHoward Hinnant    if (__r.__cntrl_)
38213e519524SHoward Hinnant        __r.__ptr_ = __ptr_;
38223e519524SHoward Hinnant    return __r;
38233e519524SHoward Hinnant}
38243e519524SHoward Hinnant
3825183c010cSMarshall Clow#if _LIBCPP_STD_VER > 14
3826183c010cSMarshall Clowtemplate <class _Tp = void> struct owner_less;
3827183c010cSMarshall Clow#else
38283e519524SHoward Hinnanttemplate <class _Tp> struct owner_less;
3829183c010cSMarshall Clow#endif
38303e519524SHoward Hinnant
38313e519524SHoward Hinnanttemplate <class _Tp>
3832e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS owner_less<shared_ptr<_Tp> >
38333e519524SHoward Hinnant    : binary_function<shared_ptr<_Tp>, shared_ptr<_Tp>, bool>
38343e519524SHoward Hinnant{
38353e519524SHoward Hinnant    typedef bool result_type;
3836848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
383736bc7178SMarshall Clow    bool operator()(shared_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const _NOEXCEPT
38383e519524SHoward Hinnant        {return __x.owner_before(__y);}
3839848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
384036bc7178SMarshall Clow    bool operator()(shared_ptr<_Tp> const& __x,   weak_ptr<_Tp> const& __y) const _NOEXCEPT
38413e519524SHoward Hinnant        {return __x.owner_before(__y);}
3842848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
384336bc7178SMarshall Clow    bool operator()(  weak_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const _NOEXCEPT
38443e519524SHoward Hinnant        {return __x.owner_before(__y);}
38453e519524SHoward Hinnant};
38463e519524SHoward Hinnant
38473e519524SHoward Hinnanttemplate <class _Tp>
3848e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS owner_less<weak_ptr<_Tp> >
38493e519524SHoward Hinnant    : binary_function<weak_ptr<_Tp>, weak_ptr<_Tp>, bool>
38503e519524SHoward Hinnant{
38513e519524SHoward Hinnant    typedef bool result_type;
3852848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
385336bc7178SMarshall Clow    bool operator()(  weak_ptr<_Tp> const& __x,   weak_ptr<_Tp> const& __y) const _NOEXCEPT
38543e519524SHoward Hinnant        {return __x.owner_before(__y);}
3855848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
385636bc7178SMarshall Clow    bool operator()(shared_ptr<_Tp> const& __x,   weak_ptr<_Tp> const& __y) const _NOEXCEPT
38573e519524SHoward Hinnant        {return __x.owner_before(__y);}
3858848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
385936bc7178SMarshall Clow    bool operator()(  weak_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const _NOEXCEPT
38603e519524SHoward Hinnant        {return __x.owner_before(__y);}
38613e519524SHoward Hinnant};
38623e519524SHoward Hinnant
3863183c010cSMarshall Clow#if _LIBCPP_STD_VER > 14
3864183c010cSMarshall Clowtemplate <>
3865e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS owner_less<void>
3866183c010cSMarshall Clow{
3867183c010cSMarshall Clow    template <class _Tp, class _Up>
3868183c010cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
386936bc7178SMarshall Clow    bool operator()( shared_ptr<_Tp> const& __x, shared_ptr<_Up> const& __y) const _NOEXCEPT
3870183c010cSMarshall Clow        {return __x.owner_before(__y);}
3871183c010cSMarshall Clow    template <class _Tp, class _Up>
3872183c010cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
387336bc7178SMarshall Clow    bool operator()( shared_ptr<_Tp> const& __x,   weak_ptr<_Up> const& __y) const _NOEXCEPT
3874183c010cSMarshall Clow        {return __x.owner_before(__y);}
3875183c010cSMarshall Clow    template <class _Tp, class _Up>
3876183c010cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
387736bc7178SMarshall Clow    bool operator()(   weak_ptr<_Tp> const& __x, shared_ptr<_Up> const& __y) const _NOEXCEPT
3878183c010cSMarshall Clow        {return __x.owner_before(__y);}
3879183c010cSMarshall Clow    template <class _Tp, class _Up>
3880183c010cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
388136bc7178SMarshall Clow    bool operator()(   weak_ptr<_Tp> const& __x,   weak_ptr<_Up> const& __y) const _NOEXCEPT
3882183c010cSMarshall Clow        {return __x.owner_before(__y);}
3883183c010cSMarshall Clow    typedef void is_transparent;
3884183c010cSMarshall Clow};
3885183c010cSMarshall Clow#endif
3886183c010cSMarshall Clow
38873e519524SHoward Hinnanttemplate<class _Tp>
3888e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS enable_shared_from_this
38893e519524SHoward Hinnant{
38903e519524SHoward Hinnant    mutable weak_ptr<_Tp> __weak_this_;
38913e519524SHoward Hinnantprotected:
3892c0937e8aSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
38933739fe79SHoward Hinnant    enable_shared_from_this() _NOEXCEPT {}
3894848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
38953739fe79SHoward Hinnant    enable_shared_from_this(enable_shared_from_this const&) _NOEXCEPT {}
3896848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
38973739fe79SHoward Hinnant    enable_shared_from_this& operator=(enable_shared_from_this const&) _NOEXCEPT
38983739fe79SHoward Hinnant        {return *this;}
3899848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
39003e519524SHoward Hinnant    ~enable_shared_from_this() {}
39013e519524SHoward Hinnantpublic:
3902848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
39033739fe79SHoward Hinnant    shared_ptr<_Tp> shared_from_this()
39043739fe79SHoward Hinnant        {return shared_ptr<_Tp>(__weak_this_);}
3905848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
39063739fe79SHoward Hinnant    shared_ptr<_Tp const> shared_from_this() const
39073739fe79SHoward Hinnant        {return shared_ptr<const _Tp>(__weak_this_);}
39083e519524SHoward Hinnant
390988f5bfdcSEric Fiselier#if _LIBCPP_STD_VER > 14
391088f5bfdcSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
391188f5bfdcSEric Fiselier    weak_ptr<_Tp> weak_from_this() _NOEXCEPT
391288f5bfdcSEric Fiselier       { return __weak_this_; }
391388f5bfdcSEric Fiselier
391488f5bfdcSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
391588f5bfdcSEric Fiselier    weak_ptr<const _Tp> weak_from_this() const _NOEXCEPT
391688f5bfdcSEric Fiselier        { return __weak_this_; }
391788f5bfdcSEric Fiselier#endif // _LIBCPP_STD_VER > 14
391888f5bfdcSEric Fiselier
39193e519524SHoward Hinnant    template <class _Up> friend class shared_ptr;
39203e519524SHoward Hinnant};
39213e519524SHoward Hinnant
3922d1803b6cSHoward Hinnanttemplate <class _Tp>
3923e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS hash<shared_ptr<_Tp> >
3924d1803b6cSHoward Hinnant{
3925d1803b6cSHoward Hinnant    typedef shared_ptr<_Tp>      argument_type;
3926d1803b6cSHoward Hinnant    typedef size_t               result_type;
3927f9127593SEric Fiselier
3928848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
39293739fe79SHoward Hinnant    result_type operator()(const argument_type& __ptr) const _NOEXCEPT
3930d1803b6cSHoward Hinnant    {
3931ce195fb2Szoecarver        return hash<typename shared_ptr<_Tp>::element_type*>()(__ptr.get());
3932d1803b6cSHoward Hinnant    }
3933d1803b6cSHoward Hinnant};
3934d1803b6cSHoward Hinnant
3935c003db1fSHoward Hinnanttemplate<class _CharT, class _Traits, class _Yp>
3936e3163f5aSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3937e3163f5aSHoward Hinnantbasic_ostream<_CharT, _Traits>&
3938c003db1fSHoward Hinnantoperator<<(basic_ostream<_CharT, _Traits>& __os, shared_ptr<_Yp> const& __p);
3939e3163f5aSHoward Hinnant
3940df93bad1SEric Fiselier
3941df93bad1SEric Fiselier#if !defined(_LIBCPP_HAS_NO_ATOMIC_HEADER)
3942d77851e8SHoward Hinnant
3943f0544c20SHoward Hinnantclass _LIBCPP_TYPE_VIS __sp_mut
3944d77851e8SHoward Hinnant{
394554d333a6SHoward Hinnant    void* __lx;
3946d77851e8SHoward Hinnantpublic:
3947d77851e8SHoward Hinnant    void lock() _NOEXCEPT;
3948d77851e8SHoward Hinnant    void unlock() _NOEXCEPT;
3949d77851e8SHoward Hinnant
3950d77851e8SHoward Hinnantprivate:
3951d77851e8SHoward Hinnant    _LIBCPP_CONSTEXPR __sp_mut(void*) _NOEXCEPT;
3952d77851e8SHoward Hinnant    __sp_mut(const __sp_mut&);
3953d77851e8SHoward Hinnant    __sp_mut& operator=(const __sp_mut&);
3954d77851e8SHoward Hinnant
39556e41256fSHoward Hinnant    friend _LIBCPP_FUNC_VIS __sp_mut& __get_sp_mut(const void*);
3956d77851e8SHoward Hinnant};
3957d77851e8SHoward Hinnant
3958e9c66ad9SMehdi Amini_LIBCPP_FUNC_VIS _LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR
3959e9c66ad9SMehdi Amini__sp_mut& __get_sp_mut(const void*);
3960d77851e8SHoward Hinnant
3961d77851e8SHoward Hinnanttemplate <class _Tp>
3962d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3963d77851e8SHoward Hinnantbool
3964d77851e8SHoward Hinnantatomic_is_lock_free(const shared_ptr<_Tp>*)
3965d77851e8SHoward Hinnant{
3966d77851e8SHoward Hinnant    return false;
3967d77851e8SHoward Hinnant}
3968d77851e8SHoward Hinnant
3969d77851e8SHoward Hinnanttemplate <class _Tp>
3970e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR
3971d77851e8SHoward Hinnantshared_ptr<_Tp>
3972d77851e8SHoward Hinnantatomic_load(const shared_ptr<_Tp>* __p)
3973d77851e8SHoward Hinnant{
3974d77851e8SHoward Hinnant    __sp_mut& __m = __get_sp_mut(__p);
3975d77851e8SHoward Hinnant    __m.lock();
3976d77851e8SHoward Hinnant    shared_ptr<_Tp> __q = *__p;
3977d77851e8SHoward Hinnant    __m.unlock();
3978d77851e8SHoward Hinnant    return __q;
3979d77851e8SHoward Hinnant}
3980d77851e8SHoward Hinnant
3981d77851e8SHoward Hinnanttemplate <class _Tp>
3982d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3983e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR
3984d77851e8SHoward Hinnantshared_ptr<_Tp>
3985d77851e8SHoward Hinnantatomic_load_explicit(const shared_ptr<_Tp>* __p, memory_order)
3986d77851e8SHoward Hinnant{
3987d77851e8SHoward Hinnant    return atomic_load(__p);
3988d77851e8SHoward Hinnant}
3989d77851e8SHoward Hinnant
3990d77851e8SHoward Hinnanttemplate <class _Tp>
3991e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR
3992d77851e8SHoward Hinnantvoid
3993d77851e8SHoward Hinnantatomic_store(shared_ptr<_Tp>* __p, shared_ptr<_Tp> __r)
3994d77851e8SHoward Hinnant{
3995d77851e8SHoward Hinnant    __sp_mut& __m = __get_sp_mut(__p);
3996d77851e8SHoward Hinnant    __m.lock();
3997d77851e8SHoward Hinnant    __p->swap(__r);
3998d77851e8SHoward Hinnant    __m.unlock();
3999d77851e8SHoward Hinnant}
4000d77851e8SHoward Hinnant
4001d77851e8SHoward Hinnanttemplate <class _Tp>
4002d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4003e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR
4004d77851e8SHoward Hinnantvoid
4005d77851e8SHoward Hinnantatomic_store_explicit(shared_ptr<_Tp>* __p, shared_ptr<_Tp> __r, memory_order)
4006d77851e8SHoward Hinnant{
4007d77851e8SHoward Hinnant    atomic_store(__p, __r);
4008d77851e8SHoward Hinnant}
4009d77851e8SHoward Hinnant
4010d77851e8SHoward Hinnanttemplate <class _Tp>
4011e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR
4012d77851e8SHoward Hinnantshared_ptr<_Tp>
4013d77851e8SHoward Hinnantatomic_exchange(shared_ptr<_Tp>* __p, shared_ptr<_Tp> __r)
4014d77851e8SHoward Hinnant{
4015d77851e8SHoward Hinnant    __sp_mut& __m = __get_sp_mut(__p);
4016d77851e8SHoward Hinnant    __m.lock();
4017d77851e8SHoward Hinnant    __p->swap(__r);
4018d77851e8SHoward Hinnant    __m.unlock();
4019d77851e8SHoward Hinnant    return __r;
4020d77851e8SHoward Hinnant}
4021d77851e8SHoward Hinnant
4022d77851e8SHoward Hinnanttemplate <class _Tp>
4023d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4024e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR
4025d77851e8SHoward Hinnantshared_ptr<_Tp>
4026d77851e8SHoward Hinnantatomic_exchange_explicit(shared_ptr<_Tp>* __p, shared_ptr<_Tp> __r, memory_order)
4027d77851e8SHoward Hinnant{
4028d77851e8SHoward Hinnant    return atomic_exchange(__p, __r);
4029d77851e8SHoward Hinnant}
4030d77851e8SHoward Hinnant
4031d77851e8SHoward Hinnanttemplate <class _Tp>
4032e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR
4033d77851e8SHoward Hinnantbool
4034d77851e8SHoward Hinnantatomic_compare_exchange_strong(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v, shared_ptr<_Tp> __w)
4035d77851e8SHoward Hinnant{
40363379baebSMarshall Clow    shared_ptr<_Tp> __temp;
4037d77851e8SHoward Hinnant    __sp_mut& __m = __get_sp_mut(__p);
4038d77851e8SHoward Hinnant    __m.lock();
4039d77851e8SHoward Hinnant    if (__p->__owner_equivalent(*__v))
4040d77851e8SHoward Hinnant    {
40413379baebSMarshall Clow        _VSTD::swap(__temp, *__p);
4042d77851e8SHoward Hinnant        *__p = __w;
4043d77851e8SHoward Hinnant        __m.unlock();
4044d77851e8SHoward Hinnant        return true;
4045d77851e8SHoward Hinnant    }
40463379baebSMarshall Clow    _VSTD::swap(__temp, *__v);
4047d77851e8SHoward Hinnant    *__v = *__p;
4048d77851e8SHoward Hinnant    __m.unlock();
4049d77851e8SHoward Hinnant    return false;
4050d77851e8SHoward Hinnant}
4051d77851e8SHoward Hinnant
4052d77851e8SHoward Hinnanttemplate <class _Tp>
4053d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4054e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR
4055d77851e8SHoward Hinnantbool
4056d77851e8SHoward Hinnantatomic_compare_exchange_weak(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v, shared_ptr<_Tp> __w)
4057d77851e8SHoward Hinnant{
4058d77851e8SHoward Hinnant    return atomic_compare_exchange_strong(__p, __v, __w);
4059d77851e8SHoward Hinnant}
4060d77851e8SHoward Hinnant
4061d77851e8SHoward Hinnanttemplate <class _Tp>
4062d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4063e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR
4064d77851e8SHoward Hinnantbool
4065d77851e8SHoward Hinnantatomic_compare_exchange_strong_explicit(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v,
4066d77851e8SHoward Hinnant                                        shared_ptr<_Tp> __w, memory_order, memory_order)
4067d77851e8SHoward Hinnant{
4068d77851e8SHoward Hinnant    return atomic_compare_exchange_strong(__p, __v, __w);
4069d77851e8SHoward Hinnant}
4070d77851e8SHoward Hinnant
4071d77851e8SHoward Hinnanttemplate <class _Tp>
4072d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4073e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR
4074d77851e8SHoward Hinnantbool
4075d77851e8SHoward Hinnantatomic_compare_exchange_weak_explicit(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v,
4076d77851e8SHoward Hinnant                                      shared_ptr<_Tp> __w, memory_order, memory_order)
4077d77851e8SHoward Hinnant{
4078d77851e8SHoward Hinnant    return atomic_compare_exchange_weak(__p, __v, __w);
4079d77851e8SHoward Hinnant}
4080d77851e8SHoward Hinnant
4081df93bad1SEric Fiselier#endif  // !defined(_LIBCPP_HAS_NO_ATOMIC_HEADER)
4082d77851e8SHoward Hinnant
40833e519524SHoward Hinnant//enum class
4084528600c4SEric Fiselier#if defined(_LIBCPP_ABI_POINTER_SAFETY_ENUM_TYPE)
4085528600c4SEric Fiselier# ifndef _LIBCPP_CXX03_LANG
4086528600c4SEric Fiselierenum class pointer_safety : unsigned char {
4087528600c4SEric Fiselier  relaxed,
4088528600c4SEric Fiselier  preferred,
4089528600c4SEric Fiselier  strict
4090528600c4SEric Fiselier};
4091528600c4SEric Fiselier# endif
4092528600c4SEric Fiselier#else
40936e41256fSHoward Hinnantstruct _LIBCPP_TYPE_VIS pointer_safety
40943e519524SHoward Hinnant{
409554d333a6SHoward Hinnant    enum __lx
40963e519524SHoward Hinnant    {
40973e519524SHoward Hinnant        relaxed,
40983e519524SHoward Hinnant        preferred,
40993e519524SHoward Hinnant        strict
41003e519524SHoward Hinnant    };
41013e519524SHoward Hinnant
410254d333a6SHoward Hinnant    __lx __v_;
41033e519524SHoward Hinnant
4104848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
410576a01ea3SEric Fiselier    pointer_safety() : __v_() {}
410676a01ea3SEric Fiselier
410776a01ea3SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
410854d333a6SHoward Hinnant    pointer_safety(__lx __v) : __v_(__v) {}
4109848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
41103e519524SHoward Hinnant    operator int() const {return __v_;}
41113e519524SHoward Hinnant};
4112528600c4SEric Fiselier#endif
4113528600c4SEric Fiselier
4114528600c4SEric Fiselier#if !defined(_LIBCPP_ABI_POINTER_SAFETY_ENUM_TYPE) && \
4115c8e84ff2SLouis Dionne    defined(_LIBCPP_BUILDING_LIBRARY)
4116528600c4SEric Fiselier_LIBCPP_FUNC_VIS pointer_safety get_pointer_safety() _NOEXCEPT;
4117528600c4SEric Fiselier#else
4118528600c4SEric Fiselier// This function is only offered in C++03 under ABI v1.
4119528600c4SEric Fiselier# if !defined(_LIBCPP_ABI_POINTER_SAFETY_ENUM_TYPE) || !defined(_LIBCPP_CXX03_LANG)
4120528600c4SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY
4121528600c4SEric Fiselierpointer_safety get_pointer_safety() _NOEXCEPT {
4122528600c4SEric Fiselier  return pointer_safety::relaxed;
4123528600c4SEric Fiselier}
4124528600c4SEric Fiselier# endif
4125528600c4SEric Fiselier#endif
4126528600c4SEric Fiselier
41273e519524SHoward Hinnant
4128f0544c20SHoward Hinnant_LIBCPP_FUNC_VIS void declare_reachable(void* __p);
4129f0544c20SHoward Hinnant_LIBCPP_FUNC_VIS void declare_no_pointers(char* __p, size_t __n);
4130f0544c20SHoward Hinnant_LIBCPP_FUNC_VIS void undeclare_no_pointers(char* __p, size_t __n);
4131f0544c20SHoward Hinnant_LIBCPP_FUNC_VIS void* __undeclare_reachable(void* __p);
41323e519524SHoward Hinnant
41333e519524SHoward Hinnanttemplate <class _Tp>
41343e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
41353e519524SHoward Hinnant_Tp*
41363e519524SHoward Hinnantundeclare_reachable(_Tp* __p)
41373e519524SHoward Hinnant{
41383e519524SHoward Hinnant    return static_cast<_Tp*>(__undeclare_reachable(__p));
41393e519524SHoward Hinnant}
41403e519524SHoward Hinnant
4141f0544c20SHoward Hinnant_LIBCPP_FUNC_VIS void* align(size_t __align, size_t __sz, void*& __ptr, size_t& __space);
41423e519524SHoward Hinnant
4143e3fbe143SMarshall Clow// --- Helper for container swap --
4144e3fbe143SMarshall Clowtemplate <typename _Alloc>
4145e3fbe143SMarshall Clow_LIBCPP_INLINE_VISIBILITY
4146e3fbe143SMarshall Clowvoid __swap_allocator(_Alloc & __a1, _Alloc & __a2, true_type)
4147e3fbe143SMarshall Clow#if _LIBCPP_STD_VER >= 14
4148e3fbe143SMarshall Clow    _NOEXCEPT
4149e3fbe143SMarshall Clow#else
4150e3fbe143SMarshall Clow    _NOEXCEPT_(__is_nothrow_swappable<_Alloc>::value)
4151e3fbe143SMarshall Clow#endif
4152e3fbe143SMarshall Clow{
4153e3fbe143SMarshall Clow    using _VSTD::swap;
4154e3fbe143SMarshall Clow    swap(__a1, __a2);
4155e3fbe143SMarshall Clow}
4156e3fbe143SMarshall Clow
4157e3fbe143SMarshall Clowtemplate <typename _Alloc>
415889dd1dd2SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY
4159e3fbe143SMarshall Clowvoid __swap_allocator(_Alloc &, _Alloc &, false_type) _NOEXCEPT {}
4160e3fbe143SMarshall Clow
41616e965df6SArthur O'Dwyertemplate <typename _Alloc>
41626e965df6SArthur O'Dwyerinline _LIBCPP_INLINE_VISIBILITY
41636e965df6SArthur O'Dwyervoid __swap_allocator(_Alloc & __a1, _Alloc & __a2)
41646e965df6SArthur O'Dwyer#if _LIBCPP_STD_VER >= 14
41656e965df6SArthur O'Dwyer    _NOEXCEPT
41666e965df6SArthur O'Dwyer#else
41676e965df6SArthur O'Dwyer    _NOEXCEPT_(__is_nothrow_swappable<_Alloc>::value)
41686e965df6SArthur O'Dwyer#endif
41696e965df6SArthur O'Dwyer{
41706e965df6SArthur O'Dwyer    _VSTD::__swap_allocator(__a1, __a2,
41716e965df6SArthur O'Dwyer      integral_constant<bool, _VSTD::allocator_traits<_Alloc>::propagate_on_container_swap::value>());
41726e965df6SArthur O'Dwyer}
41736e965df6SArthur O'Dwyer
41741378a5aeSMarshall Clowtemplate <typename _Alloc, typename _Traits=allocator_traits<_Alloc> >
41751378a5aeSMarshall Clowstruct __noexcept_move_assign_container : public integral_constant<bool,
41761378a5aeSMarshall Clow    _Traits::propagate_on_container_move_assignment::value
41771378a5aeSMarshall Clow#if _LIBCPP_STD_VER > 14
41781378a5aeSMarshall Clow        || _Traits::is_always_equal::value
41791378a5aeSMarshall Clow#else
41801378a5aeSMarshall Clow        && is_nothrow_move_assignable<_Alloc>::value
41811378a5aeSMarshall Clow#endif
41821378a5aeSMarshall Clow    > {};
4183e3fbe143SMarshall Clow
4184dc3eb83dSMarshall Clow
4185dc3eb83dSMarshall Clowtemplate <class _Tp, class _Alloc>
4186dc3eb83dSMarshall Clowstruct __temp_value {
4187dc3eb83dSMarshall Clow    typedef allocator_traits<_Alloc> _Traits;
4188dc3eb83dSMarshall Clow
4189d108bf85SEric Fiselier    typename aligned_storage<sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp)>::type __v;
4190dc3eb83dSMarshall Clow    _Alloc &__a;
4191dc3eb83dSMarshall Clow
4192dc3eb83dSMarshall Clow    _Tp *__addr() { return reinterpret_cast<_Tp *>(addressof(__v)); }
4193dc3eb83dSMarshall Clow    _Tp &   get() { return *__addr(); }
4194dc3eb83dSMarshall Clow
4195dc3eb83dSMarshall Clow    template<class... _Args>
4196f11c00d7SPeter Collingbourne    _LIBCPP_NO_CFI
4197f11c00d7SPeter Collingbourne    __temp_value(_Alloc &__alloc, _Args&& ... __args) : __a(__alloc) {
4198f11c00d7SPeter Collingbourne      _Traits::construct(__a, reinterpret_cast<_Tp*>(addressof(__v)),
4199f11c00d7SPeter Collingbourne                         _VSTD::forward<_Args>(__args)...);
4200f11c00d7SPeter Collingbourne    }
4201dc3eb83dSMarshall Clow
4202dc3eb83dSMarshall Clow    ~__temp_value() { _Traits::destroy(__a, __addr()); }
4203dc3eb83dSMarshall Clow    };
4204dc3eb83dSMarshall Clow
420576b26852SMarshall Clowtemplate<typename _Alloc, typename = void, typename = void>
42060e22bf8cSMarshall Clowstruct __is_allocator : false_type {};
42070e22bf8cSMarshall Clow
42080e22bf8cSMarshall Clowtemplate<typename _Alloc>
42090e22bf8cSMarshall Clowstruct __is_allocator<_Alloc,
421076b26852SMarshall Clow       typename __void_t<typename _Alloc::value_type>::type,
421176b26852SMarshall Clow       typename __void_t<decltype(_VSTD::declval<_Alloc&>().allocate(size_t(0)))>::type
421276b26852SMarshall Clow     >
42130e22bf8cSMarshall Clow   : true_type {};
42140e22bf8cSMarshall Clow
4215d63dd874SEric Fiselier// __builtin_new_allocator -- A non-templated helper for allocating and
4216d63dd874SEric Fiselier// deallocating memory using __builtin_operator_new and
4217d63dd874SEric Fiselier// __builtin_operator_delete. It should be used in preference to
4218d63dd874SEric Fiselier// `std::allocator<T>` to avoid additional instantiations.
4219d63dd874SEric Fiselierstruct __builtin_new_allocator {
4220d63dd874SEric Fiselier  struct __builtin_new_deleter {
4221d63dd874SEric Fiselier    typedef void* pointer_type;
4222d63dd874SEric Fiselier
4223d63dd874SEric Fiselier    _LIBCPP_CONSTEXPR explicit __builtin_new_deleter(size_t __size, size_t __align)
4224d63dd874SEric Fiselier        : __size_(__size), __align_(__align) {}
4225d63dd874SEric Fiselier
4226d63dd874SEric Fiselier    void operator()(void* p) const _NOEXCEPT {
4227d586f92cSArthur O'Dwyer        _VSTD::__libcpp_deallocate(p, __size_, __align_);
4228d63dd874SEric Fiselier    }
4229d63dd874SEric Fiselier
4230d63dd874SEric Fiselier   private:
4231d63dd874SEric Fiselier    size_t __size_;
4232d63dd874SEric Fiselier    size_t __align_;
4233d63dd874SEric Fiselier  };
4234d63dd874SEric Fiselier
4235d63dd874SEric Fiselier  typedef unique_ptr<void, __builtin_new_deleter> __holder_t;
4236d63dd874SEric Fiselier
4237d63dd874SEric Fiselier  static __holder_t __allocate_bytes(size_t __s, size_t __align) {
4238d586f92cSArthur O'Dwyer      return __holder_t(_VSTD::__libcpp_allocate(__s, __align),
4239d63dd874SEric Fiselier                     __builtin_new_deleter(__s, __align));
4240d63dd874SEric Fiselier  }
4241d63dd874SEric Fiselier
4242d63dd874SEric Fiselier  static void __deallocate_bytes(void* __p, size_t __s,
4243d63dd874SEric Fiselier                                 size_t __align) _NOEXCEPT {
4244d586f92cSArthur O'Dwyer      _VSTD::__libcpp_deallocate(__p, __s, __align);
4245d63dd874SEric Fiselier  }
4246d63dd874SEric Fiselier
4247d63dd874SEric Fiselier  template <class _Tp>
4248d63dd874SEric Fiselier  _LIBCPP_NODEBUG _LIBCPP_ALWAYS_INLINE
4249d63dd874SEric Fiselier  static __holder_t __allocate_type(size_t __n) {
4250d63dd874SEric Fiselier      return __allocate_bytes(__n * sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp));
4251d63dd874SEric Fiselier  }
4252d63dd874SEric Fiselier
4253d63dd874SEric Fiselier  template <class _Tp>
4254d63dd874SEric Fiselier  _LIBCPP_NODEBUG _LIBCPP_ALWAYS_INLINE
4255d63dd874SEric Fiselier  static void __deallocate_type(void* __p, size_t __n) _NOEXCEPT {
4256d63dd874SEric Fiselier      __deallocate_bytes(__p, __n * sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp));
4257d63dd874SEric Fiselier  }
4258d63dd874SEric Fiselier};
4259d63dd874SEric Fiselier
4260d63dd874SEric Fiselier
42613e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
42623e519524SHoward Hinnant
4263a016efb1SEric Fiselier_LIBCPP_POP_MACROS
4264a016efb1SEric Fiselier
42650a06eb91SLouis Dionne#if defined(_LIBCPP_HAS_PARALLEL_ALGORITHMS) && _LIBCPP_STD_VER >= 17
426695689243SLouis Dionne#   include <__pstl_memory>
42670a06eb91SLouis Dionne#endif
42680a06eb91SLouis Dionne
42693e519524SHoward Hinnant#endif  // _LIBCPP_MEMORY
4270