xref: /llvm-project-15.0.7/libcxx/include/memory (revision dbc89028)
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>
6713e519524SHoward Hinnant#include <cstddef>
6723e519524SHoward Hinnant#include <cstdint>
6733e519524SHoward Hinnant#include <new>
6743e519524SHoward Hinnant#include <utility>
6753e519524SHoward Hinnant#include <limits>
6763e519524SHoward Hinnant#include <iterator>
6773e519524SHoward Hinnant#include <__functional_base>
678e3163f5aSHoward Hinnant#include <iosfwd>
679a87b5e34SHoward Hinnant#include <tuple>
6804524d6e7SEric Fiselier#include <stdexcept>
6819741d6c9SHoward Hinnant#include <cstring>
6827ad49aecSLouis Dionne#include <__memory/allocator_traits.h>
6837ad49aecSLouis Dionne#include <__memory/base.h>
6847ad49aecSLouis Dionne#include <__memory/pointer_traits.h>
68519d57b5cSLouis Dionne#include <__memory/utilities.h>
686749adebaSEric Fiselier#if !defined(_LIBCPP_HAS_NO_ATOMIC_HEADER)
687d77851e8SHoward Hinnant#  include <atomic>
688d77851e8SHoward Hinnant#endif
689f56972e2SMarshall Clow#include <version>
690d77851e8SHoward Hinnant
691073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
6923e519524SHoward Hinnant#pragma GCC system_header
693073458b1SHoward Hinnant#endif
6943e519524SHoward Hinnant
695a016efb1SEric Fiselier_LIBCPP_PUSH_MACROS
696a016efb1SEric Fiselier#include <__undef_macros>
697a016efb1SEric Fiselier
698a016efb1SEric Fiselier
6993e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
7003e519524SHoward Hinnant
7011faf289eSEric Fiseliertemplate <class _ValueType>
702dc7200b4SLouis Dionneinline _LIBCPP_INLINE_VISIBILITY
7031faf289eSEric Fiselier_ValueType __libcpp_relaxed_load(_ValueType const* __value) {
7041faf289eSEric Fiselier#if !defined(_LIBCPP_HAS_NO_THREADS) && \
7051faf289eSEric Fiselier    defined(__ATOMIC_RELAXED) &&        \
706ae62727aSRichard Smith    (__has_builtin(__atomic_load_n) || defined(_LIBCPP_COMPILER_GCC))
7071faf289eSEric Fiselier    return __atomic_load_n(__value, __ATOMIC_RELAXED);
7081faf289eSEric Fiselier#else
7091faf289eSEric Fiselier    return *__value;
7101faf289eSEric Fiselier#endif
7111faf289eSEric Fiselier}
7121faf289eSEric Fiselier
713224264adSKuba Breckatemplate <class _ValueType>
714dc7200b4SLouis Dionneinline _LIBCPP_INLINE_VISIBILITY
715224264adSKuba Brecka_ValueType __libcpp_acquire_load(_ValueType const* __value) {
716224264adSKuba Brecka#if !defined(_LIBCPP_HAS_NO_THREADS) && \
717224264adSKuba Brecka    defined(__ATOMIC_ACQUIRE) &&        \
718ae62727aSRichard Smith    (__has_builtin(__atomic_load_n) || defined(_LIBCPP_COMPILER_GCC))
719224264adSKuba Brecka    return __atomic_load_n(__value, __ATOMIC_ACQUIRE);
720224264adSKuba Brecka#else
721224264adSKuba Brecka    return *__value;
722224264adSKuba Brecka#endif
723224264adSKuba Brecka}
724224264adSKuba Brecka
7257ad49aecSLouis Dionnetemplate <class _Tp> class allocator;
726b082f11fSMarshall Clow
7277ad49aecSLouis Dionne#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_ENABLE_CXX20_REMOVED_ALLOCATOR_MEMBERS)
7287ad49aecSLouis Dionnetemplate <>
7297ad49aecSLouis Dionneclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX17 allocator<void>
7303e519524SHoward Hinnant{
7313e519524SHoward Hinnantpublic:
7327ad49aecSLouis Dionne    typedef void*             pointer;
7337ad49aecSLouis Dionne    typedef const void*       const_pointer;
7347ad49aecSLouis Dionne    typedef void              value_type;
7357ad49aecSLouis Dionne
7367ad49aecSLouis Dionne    template <class _Up> struct rebind {typedef allocator<_Up> other;};
7373e519524SHoward Hinnant};
7383e519524SHoward Hinnant
7397ad49aecSLouis Dionnetemplate <>
7407ad49aecSLouis Dionneclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX17 allocator<const void>
7413e519524SHoward Hinnant{
7427ad49aecSLouis Dionnepublic:
7437ad49aecSLouis Dionne    typedef const void*       pointer;
7447ad49aecSLouis Dionne    typedef const void*       const_pointer;
7457ad49aecSLouis Dionne    typedef const void        value_type;
7467ad49aecSLouis Dionne
7477ad49aecSLouis Dionne    template <class _Up> struct rebind {typedef allocator<_Up> other;};
7483e519524SHoward Hinnant};
7490724f8bfSLouis Dionne#endif
7501f508014SMarshall Clow
7513e519524SHoward Hinnant// allocator
7523e519524SHoward Hinnant
7533e519524SHoward Hinnanttemplate <class _Tp>
754e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS allocator
7553e519524SHoward Hinnant{
7563e519524SHoward Hinnantpublic:
757316d336dSLouis Dionne    typedef size_t      size_type;
758316d336dSLouis Dionne    typedef ptrdiff_t   difference_type;
7593e519524SHoward Hinnant    typedef _Tp         value_type;
760b58f59cdSHoward Hinnant    typedef true_type   propagate_on_container_move_assignment;
76131a47313SMarshall Clow    typedef true_type   is_always_equal;
762b58f59cdSHoward Hinnant
763e0742c4aSMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
764e0742c4aSMarshall Clow    allocator() _NOEXCEPT { }
765e0742c4aSMarshall Clow
766e0742c4aSMarshall Clow    template <class _Up>
767e0742c4aSMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
768e0742c4aSMarshall Clow    allocator(const allocator<_Up>&) _NOEXCEPT { }
769e0742c4aSMarshall Clow
7700724f8bfSLouis Dionne    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
7712404ed02SLouis Dionne    _Tp* allocate(size_t __n) {
7720724f8bfSLouis Dionne        if (__n > allocator_traits<allocator>::max_size(*this))
7730fc8cec7SMarshall Clow            __throw_length_error("allocator<T>::allocate(size_t n)"
7740fc8cec7SMarshall Clow                                 " 'n' exceeds maximum supported size");
775d092c912SLouis Dionne        if (__libcpp_is_constant_evaluated()) {
776d092c912SLouis Dionne            return static_cast<_Tp*>(::operator new(__n * sizeof(_Tp)));
777d092c912SLouis Dionne        } else {
7785b1e5b43SMichael Park            return static_cast<_Tp*>(_VSTD::__libcpp_allocate(__n * sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp)));
7794cec709eSMarshall Clow        }
780d092c912SLouis Dionne    }
7815b1e5b43SMichael Park
7820724f8bfSLouis Dionne    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
7832404ed02SLouis Dionne    void deallocate(_Tp* __p, size_t __n) _NOEXCEPT {
784d092c912SLouis Dionne        if (__libcpp_is_constant_evaluated()) {
785d092c912SLouis Dionne            ::operator delete(__p);
786d092c912SLouis Dionne        } else {
7872404ed02SLouis Dionne            _VSTD::__libcpp_deallocate((void*)__p, __n * sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp));
7882404ed02SLouis Dionne        }
789d092c912SLouis Dionne    }
7905b1e5b43SMichael Park
7912404ed02SLouis Dionne    // C++20 Removed members
7925b1e5b43SMichael Park#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_ENABLE_CXX20_REMOVED_ALLOCATOR_MEMBERS)
7932404ed02SLouis Dionne    _LIBCPP_DEPRECATED_IN_CXX17 typedef _Tp*       pointer;
7942404ed02SLouis Dionne    _LIBCPP_DEPRECATED_IN_CXX17 typedef const _Tp* const_pointer;
7952404ed02SLouis Dionne    _LIBCPP_DEPRECATED_IN_CXX17 typedef _Tp&       reference;
7962404ed02SLouis Dionne    _LIBCPP_DEPRECATED_IN_CXX17 typedef const _Tp& const_reference;
7972404ed02SLouis Dionne
7982404ed02SLouis Dionne    template <class _Up>
7992404ed02SLouis Dionne    struct _LIBCPP_DEPRECATED_IN_CXX17 rebind {
8002404ed02SLouis Dionne        typedef allocator<_Up> other;
8012404ed02SLouis Dionne    };
8022404ed02SLouis Dionne
8032404ed02SLouis Dionne    _LIBCPP_DEPRECATED_IN_CXX17 _LIBCPP_INLINE_VISIBILITY
8042404ed02SLouis Dionne    pointer address(reference __x) const _NOEXCEPT {
8052404ed02SLouis Dionne        return _VSTD::addressof(__x);
8062404ed02SLouis Dionne    }
8072404ed02SLouis Dionne    _LIBCPP_DEPRECATED_IN_CXX17 _LIBCPP_INLINE_VISIBILITY
8082404ed02SLouis Dionne    const_pointer address(const_reference __x) const _NOEXCEPT {
8092404ed02SLouis Dionne        return _VSTD::addressof(__x);
8102404ed02SLouis Dionne    }
8112404ed02SLouis Dionne
8122404ed02SLouis Dionne    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY _LIBCPP_DEPRECATED_IN_CXX17
8132404ed02SLouis Dionne    _Tp* allocate(size_t __n, const void*) {
8142404ed02SLouis Dionne        return allocate(__n);
8152404ed02SLouis Dionne    }
8162404ed02SLouis Dionne
8172404ed02SLouis Dionne    _LIBCPP_DEPRECATED_IN_CXX17 _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT {
8182404ed02SLouis Dionne        return size_type(~0) / sizeof(_Tp);
8192404ed02SLouis Dionne    }
8205b1e5b43SMichael Park
8213e519524SHoward Hinnant    template <class _Up, class... _Args>
8225b1e5b43SMichael Park    _LIBCPP_DEPRECATED_IN_CXX17 _LIBCPP_INLINE_VISIBILITY
8232404ed02SLouis Dionne    void construct(_Up* __p, _Args&&... __args) {
824ce48a113SHoward Hinnant        ::new ((void*)__p) _Up(_VSTD::forward<_Args>(__args)...);
8253e519524SHoward Hinnant    }
8262404ed02SLouis Dionne
8272404ed02SLouis Dionne    _LIBCPP_DEPRECATED_IN_CXX17 _LIBCPP_INLINE_VISIBILITY
8282404ed02SLouis Dionne    void destroy(pointer __p) {
8292404ed02SLouis Dionne        __p->~_Tp();
8302404ed02SLouis Dionne    }
8315b1e5b43SMichael Park#endif
8323e519524SHoward Hinnant};
8333e519524SHoward Hinnant
8348e25104bSHoward Hinnanttemplate <class _Tp>
835e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS allocator<const _Tp>
8368e25104bSHoward Hinnant{
8378e25104bSHoward Hinnantpublic:
838316d336dSLouis Dionne    typedef size_t      size_type;
839316d336dSLouis Dionne    typedef ptrdiff_t   difference_type;
84030444adcSHoward Hinnant    typedef const _Tp   value_type;
8418e25104bSHoward Hinnant    typedef true_type   propagate_on_container_move_assignment;
842f43a42d5SMarshall Clow    typedef true_type   is_always_equal;
8438e25104bSHoward Hinnant
844e0742c4aSMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
845e0742c4aSMarshall Clow    allocator() _NOEXCEPT { }
846e0742c4aSMarshall Clow
847e0742c4aSMarshall Clow    template <class _Up>
848e0742c4aSMarshall Clow    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
849e0742c4aSMarshall Clow    allocator(const allocator<_Up>&) _NOEXCEPT { }
850e0742c4aSMarshall Clow
8510724f8bfSLouis Dionne    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
8522404ed02SLouis Dionne    const _Tp* allocate(size_t __n) {
8530724f8bfSLouis Dionne        if (__n > allocator_traits<allocator>::max_size(*this))
8540fc8cec7SMarshall Clow            __throw_length_error("allocator<const T>::allocate(size_t n)"
8550fc8cec7SMarshall Clow                                 " 'n' exceeds maximum supported size");
856d092c912SLouis Dionne        if (__libcpp_is_constant_evaluated()) {
857d092c912SLouis Dionne            return static_cast<const _Tp*>(::operator new(__n * sizeof(_Tp)));
858d092c912SLouis Dionne        } else {
8595b1e5b43SMichael Park            return static_cast<const _Tp*>(_VSTD::__libcpp_allocate(__n * sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp)));
8604cec709eSMarshall Clow        }
861d092c912SLouis Dionne    }
8625b1e5b43SMichael Park
8630724f8bfSLouis Dionne    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
8642404ed02SLouis Dionne    void deallocate(const _Tp* __p, size_t __n) {
865d092c912SLouis Dionne        if (__libcpp_is_constant_evaluated()) {
866d092c912SLouis Dionne            ::operator delete(const_cast<_Tp*>(__p));
867d092c912SLouis Dionne        } else {
8682404ed02SLouis Dionne            _VSTD::__libcpp_deallocate((void*) const_cast<_Tp *>(__p), __n * sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp));
8692404ed02SLouis Dionne        }
870d092c912SLouis Dionne    }
8715b1e5b43SMichael Park
8722404ed02SLouis Dionne    // C++20 Removed members
8735b1e5b43SMichael Park#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_ENABLE_CXX20_REMOVED_ALLOCATOR_MEMBERS)
8742404ed02SLouis Dionne    _LIBCPP_DEPRECATED_IN_CXX17 typedef const _Tp* pointer;
8752404ed02SLouis Dionne    _LIBCPP_DEPRECATED_IN_CXX17 typedef const _Tp* const_pointer;
8762404ed02SLouis Dionne    _LIBCPP_DEPRECATED_IN_CXX17 typedef const _Tp& reference;
8772404ed02SLouis Dionne    _LIBCPP_DEPRECATED_IN_CXX17 typedef const _Tp& const_reference;
8782404ed02SLouis Dionne
8792404ed02SLouis Dionne    template <class _Up>
8802404ed02SLouis Dionne    struct _LIBCPP_DEPRECATED_IN_CXX17 rebind {
8812404ed02SLouis Dionne        typedef allocator<_Up> other;
8822404ed02SLouis Dionne    };
8832404ed02SLouis Dionne
8842404ed02SLouis Dionne    _LIBCPP_DEPRECATED_IN_CXX17 _LIBCPP_INLINE_VISIBILITY
8852404ed02SLouis Dionne    const_pointer address(const_reference __x) const _NOEXCEPT {
8862404ed02SLouis Dionne        return _VSTD::addressof(__x);
8872404ed02SLouis Dionne    }
8882404ed02SLouis Dionne
8892404ed02SLouis Dionne    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY _LIBCPP_DEPRECATED_IN_CXX17
8902404ed02SLouis Dionne    const _Tp* allocate(size_t __n, const void*) {
8912404ed02SLouis Dionne        return allocate(__n);
8922404ed02SLouis Dionne    }
8932404ed02SLouis Dionne
8942404ed02SLouis Dionne    _LIBCPP_DEPRECATED_IN_CXX17 _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT {
8952404ed02SLouis Dionne        return size_type(~0) / sizeof(_Tp);
8962404ed02SLouis Dionne    }
8975b1e5b43SMichael Park
8988e25104bSHoward Hinnant    template <class _Up, class... _Args>
8995b1e5b43SMichael Park    _LIBCPP_DEPRECATED_IN_CXX17 _LIBCPP_INLINE_VISIBILITY
9002404ed02SLouis Dionne    void construct(_Up* __p, _Args&&... __args) {
9018e25104bSHoward Hinnant        ::new ((void*)__p) _Up(_VSTD::forward<_Args>(__args)...);
9028e25104bSHoward Hinnant    }
903bff1bfc6SHoward Hinnant
9042404ed02SLouis Dionne    _LIBCPP_DEPRECATED_IN_CXX17 _LIBCPP_INLINE_VISIBILITY
9052404ed02SLouis Dionne    void destroy(pointer __p) {
9062404ed02SLouis Dionne        __p->~_Tp();
9072404ed02SLouis Dionne    }
9085b1e5b43SMichael Park#endif
9098e25104bSHoward Hinnant};
9108e25104bSHoward Hinnant
9113e519524SHoward Hinnanttemplate <class _Tp, class _Up>
9120724f8bfSLouis Dionneinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
9133739fe79SHoward Hinnantbool operator==(const allocator<_Tp>&, const allocator<_Up>&) _NOEXCEPT {return true;}
9143e519524SHoward Hinnant
9153e519524SHoward Hinnanttemplate <class _Tp, class _Up>
9160724f8bfSLouis Dionneinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
9173739fe79SHoward Hinnantbool operator!=(const allocator<_Tp>&, const allocator<_Up>&) _NOEXCEPT {return false;}
9183e519524SHoward Hinnant
919d9a4f936SLouis Dionnetemplate <class _Alloc, class _Ptr>
920d9a4f936SLouis Dionne_LIBCPP_INLINE_VISIBILITY
921d9a4f936SLouis Dionnevoid __construct_forward_with_exception_guarantees(_Alloc& __a, _Ptr __begin1, _Ptr __end1, _Ptr& __begin2) {
922d9a4f936SLouis Dionne    static_assert(__is_cpp17_move_insertable<_Alloc>::value,
923e9eb9999SArthur O'Dwyer        "The specified type does not meet the requirements of Cpp17MoveInsertable");
924d9a4f936SLouis Dionne    typedef allocator_traits<_Alloc> _Traits;
925d9a4f936SLouis Dionne    for (; __begin1 != __end1; ++__begin1, (void)++__begin2) {
926d9a4f936SLouis Dionne        _Traits::construct(__a, _VSTD::__to_address(__begin2),
927d9a4f936SLouis Dionne#ifdef _LIBCPP_NO_EXCEPTIONS
928d9a4f936SLouis Dionne            _VSTD::move(*__begin1)
929d9a4f936SLouis Dionne#else
930d9a4f936SLouis Dionne            _VSTD::move_if_noexcept(*__begin1)
931d9a4f936SLouis Dionne#endif
932d9a4f936SLouis Dionne        );
933d9a4f936SLouis Dionne    }
934d9a4f936SLouis Dionne}
935d9a4f936SLouis Dionne
936d9a4f936SLouis Dionnetemplate <class _Alloc, class _Tp, typename enable_if<
937d9a4f936SLouis Dionne    (__is_default_allocator<_Alloc>::value || !__has_construct<_Alloc, _Tp*, _Tp>::value) &&
938d9a4f936SLouis Dionne    is_trivially_move_constructible<_Tp>::value
939d9a4f936SLouis Dionne>::type>
940d9a4f936SLouis Dionne_LIBCPP_INLINE_VISIBILITY
941d9a4f936SLouis Dionnevoid __construct_forward_with_exception_guarantees(_Alloc&, _Tp* __begin1, _Tp* __end1, _Tp*& __begin2) {
942d9a4f936SLouis Dionne    ptrdiff_t _Np = __end1 - __begin1;
943d9a4f936SLouis Dionne    if (_Np > 0) {
944d9a4f936SLouis Dionne        _VSTD::memcpy(__begin2, __begin1, _Np * sizeof(_Tp));
945d9a4f936SLouis Dionne        __begin2 += _Np;
946d9a4f936SLouis Dionne    }
947d9a4f936SLouis Dionne}
948d9a4f936SLouis Dionne
949d9a4f936SLouis Dionnetemplate <class _Alloc, class _Iter, class _Ptr>
950d9a4f936SLouis Dionne_LIBCPP_INLINE_VISIBILITY
951d9a4f936SLouis Dionnevoid __construct_range_forward(_Alloc& __a, _Iter __begin1, _Iter __end1, _Ptr& __begin2) {
952d9a4f936SLouis Dionne    typedef allocator_traits<_Alloc> _Traits;
953d9a4f936SLouis Dionne    for (; __begin1 != __end1; ++__begin1, (void) ++__begin2) {
954d9a4f936SLouis Dionne        _Traits::construct(__a, _VSTD::__to_address(__begin2), *__begin1);
955d9a4f936SLouis Dionne    }
956d9a4f936SLouis Dionne}
957d9a4f936SLouis Dionne
958d9a4f936SLouis Dionnetemplate <class _Alloc, class _Source, class _Dest,
959d9a4f936SLouis Dionne          class _RawSource = typename remove_const<_Source>::type,
960d9a4f936SLouis Dionne          class _RawDest = typename remove_const<_Dest>::type,
961d9a4f936SLouis Dionne          class =
962d9a4f936SLouis Dionne    typename enable_if<
963d9a4f936SLouis Dionne        is_trivially_copy_constructible<_Dest>::value &&
964d9a4f936SLouis Dionne        is_same<_RawSource, _RawDest>::value &&
965d9a4f936SLouis Dionne        (__is_default_allocator<_Alloc>::value || !__has_construct<_Alloc, _Dest*, _Source&>::value)
966d9a4f936SLouis Dionne    >::type>
967d9a4f936SLouis Dionne_LIBCPP_INLINE_VISIBILITY
968d9a4f936SLouis Dionnevoid __construct_range_forward(_Alloc&, _Source* __begin1, _Source* __end1, _Dest*& __begin2) {
969d9a4f936SLouis Dionne    ptrdiff_t _Np = __end1 - __begin1;
970d9a4f936SLouis Dionne    if (_Np > 0) {
971d9a4f936SLouis Dionne        _VSTD::memcpy(const_cast<_RawDest*>(__begin2), __begin1, _Np * sizeof(_Dest));
972d9a4f936SLouis Dionne        __begin2 += _Np;
973d9a4f936SLouis Dionne    }
974d9a4f936SLouis Dionne}
975d9a4f936SLouis Dionne
976d9a4f936SLouis Dionnetemplate <class _Alloc, class _Ptr>
977d9a4f936SLouis Dionne_LIBCPP_INLINE_VISIBILITY
978d9a4f936SLouis Dionnevoid __construct_backward_with_exception_guarantees(_Alloc& __a, _Ptr __begin1, _Ptr __end1, _Ptr& __end2) {
979d9a4f936SLouis Dionne    static_assert(__is_cpp17_move_insertable<_Alloc>::value,
980d9a4f936SLouis Dionne        "The specified type does not meet the requirements of Cpp17MoveInsertable");
981d9a4f936SLouis Dionne    typedef allocator_traits<_Alloc> _Traits;
982d9a4f936SLouis Dionne    while (__end1 != __begin1) {
983d9a4f936SLouis Dionne        _Traits::construct(__a, _VSTD::__to_address(__end2 - 1),
984d9a4f936SLouis Dionne#ifdef _LIBCPP_NO_EXCEPTIONS
985d9a4f936SLouis Dionne            _VSTD::move(*--__end1)
986d9a4f936SLouis Dionne#else
987d9a4f936SLouis Dionne            _VSTD::move_if_noexcept(*--__end1)
988d9a4f936SLouis Dionne#endif
989d9a4f936SLouis Dionne        );
990d9a4f936SLouis Dionne        --__end2;
991d9a4f936SLouis Dionne    }
992d9a4f936SLouis Dionne}
993d9a4f936SLouis Dionne
994d9a4f936SLouis Dionnetemplate <class _Alloc, class _Tp, class = typename enable_if<
995d9a4f936SLouis Dionne    (__is_default_allocator<_Alloc>::value || !__has_construct<_Alloc, _Tp*, _Tp>::value) &&
996d9a4f936SLouis Dionne    is_trivially_move_constructible<_Tp>::value
997d9a4f936SLouis Dionne>::type>
998d9a4f936SLouis Dionne_LIBCPP_INLINE_VISIBILITY
999d9a4f936SLouis Dionnevoid __construct_backward_with_exception_guarantees(_Alloc&, _Tp* __begin1, _Tp* __end1, _Tp*& __end2) {
1000d9a4f936SLouis Dionne    ptrdiff_t _Np = __end1 - __begin1;
1001d9a4f936SLouis Dionne    __end2 -= _Np;
1002d9a4f936SLouis Dionne    if (_Np > 0)
1003d9a4f936SLouis Dionne        _VSTD::memcpy(__end2, __begin1, _Np * sizeof(_Tp));
1004d9a4f936SLouis Dionne}
1005d9a4f936SLouis Dionne
10063e519524SHoward Hinnanttemplate <class _OutputIterator, class _Tp>
1007e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS raw_storage_iterator
10083e519524SHoward Hinnant    : public iterator<output_iterator_tag,
10093e519524SHoward Hinnant                      _Tp,                                         // purposefully not C++03
10103e519524SHoward Hinnant                      ptrdiff_t,                                   // purposefully not C++03
10113e519524SHoward Hinnant                      _Tp*,                                        // purposefully not C++03
10123e519524SHoward Hinnant                      raw_storage_iterator<_OutputIterator, _Tp>&> // purposefully not C++03
10133e519524SHoward Hinnant{
10143e519524SHoward Hinnantprivate:
10153e519524SHoward Hinnant    _OutputIterator __x_;
10163e519524SHoward Hinnantpublic:
10173e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit raw_storage_iterator(_OutputIterator __x) : __x_(__x) {}
10183e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator*() {return *this;}
10193e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator=(const _Tp& __element)
1020be4c657bSArthur O'Dwyer        {::new ((void*)_VSTD::addressof(*__x_)) _Tp(__element); return *this;}
10212603b075SMarshall Clow#if _LIBCPP_STD_VER >= 14
10222603b075SMarshall Clow    _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator=(_Tp&& __element)
1023be4c657bSArthur O'Dwyer        {::new ((void*)_VSTD::addressof(*__x_)) _Tp(_VSTD::move(__element)); return *this;}
10242603b075SMarshall Clow#endif
10253e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator++() {++__x_; return *this;}
10263e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY raw_storage_iterator  operator++(int)
10273e519524SHoward Hinnant        {raw_storage_iterator __t(*this); ++__x_; return __t;}
1028783b372aSMarshall Clow#if _LIBCPP_STD_VER >= 14
1029783b372aSMarshall Clow    _LIBCPP_INLINE_VISIBILITY _OutputIterator base() const { return __x_; }
1030783b372aSMarshall Clow#endif
10313e519524SHoward Hinnant};
10323e519524SHoward Hinnant
10333e519524SHoward Hinnanttemplate <class _Tp>
1034c65d39a4SRoman Lebedev_LIBCPP_NODISCARD_EXT _LIBCPP_NO_CFI
10353e519524SHoward Hinnantpair<_Tp*, ptrdiff_t>
10363739fe79SHoward Hinnantget_temporary_buffer(ptrdiff_t __n) _NOEXCEPT
10373e519524SHoward Hinnant{
10383e519524SHoward Hinnant    pair<_Tp*, ptrdiff_t> __r(0, 0);
10393e519524SHoward Hinnant    const ptrdiff_t __m = (~ptrdiff_t(0) ^
10403e519524SHoward Hinnant                           ptrdiff_t(ptrdiff_t(1) << (sizeof(ptrdiff_t) * __CHAR_BIT__ - 1)))
10413e519524SHoward Hinnant                           / sizeof(_Tp);
10423e519524SHoward Hinnant    if (__n > __m)
10433e519524SHoward Hinnant        __n = __m;
10443e519524SHoward Hinnant    while (__n > 0)
10453e519524SHoward Hinnant    {
104643245b1fSEric Fiselier#if !defined(_LIBCPP_HAS_NO_ALIGNED_ALLOCATION)
1047d108bf85SEric Fiselier    if (__is_overaligned_for_new(_LIBCPP_ALIGNOF(_Tp)))
10484e3195c9SRichard Smith        {
1049d586f92cSArthur O'Dwyer            align_val_t __al =
1050d586f92cSArthur O'Dwyer                align_val_t(alignment_of<_Tp>::value);
10514e3195c9SRichard Smith            __r.first = static_cast<_Tp*>(::operator new(
10524e3195c9SRichard Smith                __n * sizeof(_Tp), __al, nothrow));
10534e3195c9SRichard Smith        } else {
10544e3195c9SRichard Smith            __r.first = static_cast<_Tp*>(::operator new(
10554e3195c9SRichard Smith                __n * sizeof(_Tp), nothrow));
10564e3195c9SRichard Smith        }
10574e3195c9SRichard Smith#else
1058d108bf85SEric Fiselier    if (__is_overaligned_for_new(_LIBCPP_ALIGNOF(_Tp)))
10594e3195c9SRichard Smith        {
10604e3195c9SRichard Smith            // Since aligned operator new is unavailable, return an empty
10614e3195c9SRichard Smith            // buffer rather than one with invalid alignment.
10624e3195c9SRichard Smith            return __r;
10634e3195c9SRichard Smith        }
10644e3195c9SRichard Smith
10653e519524SHoward Hinnant        __r.first = static_cast<_Tp*>(::operator new(__n * sizeof(_Tp), nothrow));
10664e3195c9SRichard Smith#endif
10674e3195c9SRichard Smith
10683e519524SHoward Hinnant        if (__r.first)
10693e519524SHoward Hinnant        {
10703e519524SHoward Hinnant            __r.second = __n;
10713e519524SHoward Hinnant            break;
10723e519524SHoward Hinnant        }
10733e519524SHoward Hinnant        __n /= 2;
10743e519524SHoward Hinnant    }
10753e519524SHoward Hinnant    return __r;
10763e519524SHoward Hinnant}
10773e519524SHoward Hinnant
10783e519524SHoward Hinnanttemplate <class _Tp>
10793e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
10804e3195c9SRichard Smithvoid return_temporary_buffer(_Tp* __p) _NOEXCEPT
10814e3195c9SRichard Smith{
1082d108bf85SEric Fiselier  _VSTD::__libcpp_deallocate_unsized((void*)__p, _LIBCPP_ALIGNOF(_Tp));
10834e3195c9SRichard Smith}
10843e519524SHoward Hinnant
1085e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR)
10863e519524SHoward Hinnanttemplate <class _Tp>
1087ea5cd3b4SLouis Dionnestruct _LIBCPP_DEPRECATED_IN_CXX11 auto_ptr_ref
10883e519524SHoward Hinnant{
10893e519524SHoward Hinnant    _Tp* __ptr_;
10903e519524SHoward Hinnant};
10913e519524SHoward Hinnant
10923e519524SHoward Hinnanttemplate<class _Tp>
1093ea5cd3b4SLouis Dionneclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 auto_ptr
10943e519524SHoward Hinnant{
10953e519524SHoward Hinnantprivate:
10963e519524SHoward Hinnant    _Tp* __ptr_;
10973e519524SHoward Hinnantpublic:
10983e519524SHoward Hinnant    typedef _Tp element_type;
10993e519524SHoward Hinnant
1100585a3cc3SDimitry Andric    _LIBCPP_INLINE_VISIBILITY explicit auto_ptr(_Tp* __p = 0) _NOEXCEPT : __ptr_(__p) {}
1101585a3cc3SDimitry Andric    _LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr& __p) _NOEXCEPT : __ptr_(__p.release()) {}
1102585a3cc3SDimitry Andric    template<class _Up> _LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr<_Up>& __p) _NOEXCEPT
11033e519524SHoward Hinnant        : __ptr_(__p.release()) {}
1104585a3cc3SDimitry Andric    _LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr& __p) _NOEXCEPT
11053e519524SHoward Hinnant        {reset(__p.release()); return *this;}
1106585a3cc3SDimitry Andric    template<class _Up> _LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr<_Up>& __p) _NOEXCEPT
11073e519524SHoward Hinnant        {reset(__p.release()); return *this;}
1108585a3cc3SDimitry Andric    _LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr_ref<_Tp> __p) _NOEXCEPT
11093e519524SHoward Hinnant        {reset(__p.__ptr_); return *this;}
1110585a3cc3SDimitry Andric    _LIBCPP_INLINE_VISIBILITY ~auto_ptr() _NOEXCEPT {delete __ptr_;}
11113e519524SHoward Hinnant
1112585a3cc3SDimitry Andric    _LIBCPP_INLINE_VISIBILITY _Tp& operator*() const _NOEXCEPT
11133e519524SHoward Hinnant        {return *__ptr_;}
1114585a3cc3SDimitry Andric    _LIBCPP_INLINE_VISIBILITY _Tp* operator->() const _NOEXCEPT {return __ptr_;}
1115585a3cc3SDimitry Andric    _LIBCPP_INLINE_VISIBILITY _Tp* get() const _NOEXCEPT {return __ptr_;}
1116585a3cc3SDimitry Andric    _LIBCPP_INLINE_VISIBILITY _Tp* release() _NOEXCEPT
11173e519524SHoward Hinnant    {
11183e519524SHoward Hinnant        _Tp* __t = __ptr_;
1119527a7fdfSBruce Mitchener        __ptr_ = nullptr;
11203e519524SHoward Hinnant        return __t;
11213e519524SHoward Hinnant    }
1122585a3cc3SDimitry Andric    _LIBCPP_INLINE_VISIBILITY void reset(_Tp* __p = 0) _NOEXCEPT
11233e519524SHoward Hinnant    {
11243e519524SHoward Hinnant        if (__ptr_ != __p)
11253e519524SHoward Hinnant            delete __ptr_;
11263e519524SHoward Hinnant        __ptr_ = __p;
11273e519524SHoward Hinnant    }
11283e519524SHoward Hinnant
1129585a3cc3SDimitry Andric    _LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr_ref<_Tp> __p) _NOEXCEPT : __ptr_(__p.__ptr_) {}
1130585a3cc3SDimitry Andric    template<class _Up> _LIBCPP_INLINE_VISIBILITY operator auto_ptr_ref<_Up>() _NOEXCEPT
11313e519524SHoward Hinnant        {auto_ptr_ref<_Up> __t; __t.__ptr_ = release(); return __t;}
1132585a3cc3SDimitry Andric    template<class _Up> _LIBCPP_INLINE_VISIBILITY operator auto_ptr<_Up>() _NOEXCEPT
11333e519524SHoward Hinnant        {return auto_ptr<_Up>(release());}
11343e519524SHoward Hinnant};
11353e519524SHoward Hinnant
11363e519524SHoward Hinnanttemplate <>
1137ea5cd3b4SLouis Dionneclass _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 auto_ptr<void>
11383e519524SHoward Hinnant{
11393e519524SHoward Hinnantpublic:
11403e519524SHoward Hinnant    typedef void element_type;
11413e519524SHoward Hinnant};
1142e67179bcSMarshall Clow#endif
11433e519524SHoward Hinnant
11440fa118a9SEric Fiselier// Tag used to default initialize one or both of the pair's elements.
11450fa118a9SEric Fiselierstruct __default_init_tag {};
1146549545b6SEric Fiselierstruct __value_init_tag {};
11470fa118a9SEric Fiselier
1148c88580c4SEric Fiseliertemplate <class _Tp, int _Idx,
1149c88580c4SEric Fiselier          bool _CanBeEmptyBase =
1150c88580c4SEric Fiselier              is_empty<_Tp>::value && !__libcpp_is_final<_Tp>::value>
1151c88580c4SEric Fiselierstruct __compressed_pair_elem {
1152c88580c4SEric Fiselier  typedef _Tp _ParamT;
1153c88580c4SEric Fiselier  typedef _Tp& reference;
1154c88580c4SEric Fiselier  typedef const _Tp& const_reference;
11553e519524SHoward Hinnant
1156549545b6SEric Fiselier  _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
11570fa118a9SEric Fiselier  __compressed_pair_elem(__default_init_tag) {}
1158549545b6SEric Fiselier  _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
1159549545b6SEric Fiselier  __compressed_pair_elem(__value_init_tag) : __value_() {}
11603e519524SHoward Hinnant
1161c88580c4SEric Fiselier  template <class _Up, class = typename enable_if<
11628948264eSEric Fiselier      !is_same<__compressed_pair_elem, typename decay<_Up>::type>::value
11638948264eSEric Fiselier  >::type>
11649dae972cSAlex Lorenz  _LIBCPP_INLINE_VISIBILITY
1165549545b6SEric Fiselier  _LIBCPP_CONSTEXPR explicit
1166c88580c4SEric Fiselier  __compressed_pair_elem(_Up&& __u)
11670b485f3eSEric Fiselier      : __value_(_VSTD::forward<_Up>(__u))
11680b485f3eSEric Fiselier    {
11690b485f3eSEric Fiselier    }
11703e519524SHoward Hinnant
1171549545b6SEric Fiselier
1172549545b6SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
1173c88580c4SEric Fiselier  template <class... _Args, size_t... _Indexes>
1174c88580c4SEric Fiselier  _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
1175c88580c4SEric Fiselier  __compressed_pair_elem(piecewise_construct_t, tuple<_Args...> __args,
1176c88580c4SEric Fiselier                         __tuple_indices<_Indexes...>)
1177c88580c4SEric Fiselier      : __value_(_VSTD::forward<_Args>(_VSTD::get<_Indexes>(__args))...) {}
1178c88580c4SEric Fiselier#endif
11793e519524SHoward Hinnant
1180549545b6SEric Fiselier
11819dae972cSAlex Lorenz  _LIBCPP_INLINE_VISIBILITY reference __get() _NOEXCEPT { return __value_; }
11829dae972cSAlex Lorenz  _LIBCPP_INLINE_VISIBILITY
1183c88580c4SEric Fiselier  const_reference __get() const _NOEXCEPT { return __value_; }
11843e519524SHoward Hinnant
11853e519524SHoward Hinnantprivate:
1186c88580c4SEric Fiselier  _Tp __value_;
11873e519524SHoward Hinnant};
11883e519524SHoward Hinnant
1189c88580c4SEric Fiseliertemplate <class _Tp, int _Idx>
1190c88580c4SEric Fiselierstruct __compressed_pair_elem<_Tp, _Idx, true> : private _Tp {
1191c88580c4SEric Fiselier  typedef _Tp _ParamT;
1192c88580c4SEric Fiselier  typedef _Tp& reference;
1193c88580c4SEric Fiselier  typedef const _Tp& const_reference;
1194c88580c4SEric Fiselier  typedef _Tp __value_type;
11953e519524SHoward Hinnant
1196549545b6SEric Fiselier  _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR __compressed_pair_elem() = default;
1197549545b6SEric Fiselier  _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
1198549545b6SEric Fiselier  __compressed_pair_elem(__default_init_tag) {}
1199549545b6SEric Fiselier  _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
1200549545b6SEric Fiselier  __compressed_pair_elem(__value_init_tag) : __value_type() {}
12013e519524SHoward Hinnant
1202c88580c4SEric Fiselier  template <class _Up, class = typename enable_if<
12038948264eSEric Fiselier        !is_same<__compressed_pair_elem, typename decay<_Up>::type>::value
12048948264eSEric Fiselier  >::type>
12059dae972cSAlex Lorenz  _LIBCPP_INLINE_VISIBILITY
1206549545b6SEric Fiselier  _LIBCPP_CONSTEXPR explicit
1207c88580c4SEric Fiselier  __compressed_pair_elem(_Up&& __u)
12080b485f3eSEric Fiselier      : __value_type(_VSTD::forward<_Up>(__u))
12090b485f3eSEric Fiselier  {}
12103e519524SHoward Hinnant
1211549545b6SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
1212c88580c4SEric Fiselier  template <class... _Args, size_t... _Indexes>
1213c88580c4SEric Fiselier  _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
1214c88580c4SEric Fiselier  __compressed_pair_elem(piecewise_construct_t, tuple<_Args...> __args,
1215c88580c4SEric Fiselier                         __tuple_indices<_Indexes...>)
1216c88580c4SEric Fiselier      : __value_type(_VSTD::forward<_Args>(_VSTD::get<_Indexes>(__args))...) {}
1217c88580c4SEric Fiselier#endif
12183e519524SHoward Hinnant
12199dae972cSAlex Lorenz  _LIBCPP_INLINE_VISIBILITY reference __get() _NOEXCEPT { return *this; }
12209dae972cSAlex Lorenz  _LIBCPP_INLINE_VISIBILITY
1221c88580c4SEric Fiselier  const_reference __get() const _NOEXCEPT { return *this; }
12223e519524SHoward Hinnant};
12233e519524SHoward Hinnant
12243e519524SHoward Hinnanttemplate <class _T1, class _T2>
1225c88580c4SEric Fiselierclass __compressed_pair : private __compressed_pair_elem<_T1, 0>,
1226c88580c4SEric Fiselier                          private __compressed_pair_elem<_T2, 1> {
1227955dd7b7SLouis Dionnepublic:
1228c88580c4SEric Fiselier  // NOTE: This static assert should never fire because __compressed_pair
1229c88580c4SEric Fiselier  // is *almost never* used in a scenario where it's possible for T1 == T2.
1230c88580c4SEric Fiselier  // (The exception is std::function where it is possible that the function
1231c88580c4SEric Fiselier  //  object and the allocator have the same type).
1232b411e9ceSEric Fiselier  static_assert((!is_same<_T1, _T2>::value),
1233e181a6aeSArthur O'Dwyer    "__compressed_pair cannot be instantiated when T1 and T2 are the same type; "
1234c88580c4SEric Fiselier    "The current implementation is NOT ABI-compatible with the previous "
1235c88580c4SEric Fiselier    "implementation for this configuration");
1236c88580c4SEric Fiselier
1237955dd7b7SLouis Dionne    typedef _LIBCPP_NODEBUG_TYPE __compressed_pair_elem<_T1, 0> _Base1;
1238955dd7b7SLouis Dionne    typedef _LIBCPP_NODEBUG_TYPE __compressed_pair_elem<_T2, 1> _Base2;
1239955dd7b7SLouis Dionne
12408948264eSEric Fiselier    template <bool _Dummy = true,
12418948264eSEric Fiselier      class = typename enable_if<
12428948264eSEric Fiselier          __dependent_type<is_default_constructible<_T1>, _Dummy>::value &&
12438948264eSEric Fiselier          __dependent_type<is_default_constructible<_T2>, _Dummy>::value
12448948264eSEric Fiselier      >::type
12458948264eSEric Fiselier  >
1246a87b5e34SHoward Hinnant  _LIBCPP_INLINE_VISIBILITY
1247549545b6SEric Fiselier  _LIBCPP_CONSTEXPR __compressed_pair() : _Base1(__value_init_tag()), _Base2(__value_init_tag()) {}
1248a87b5e34SHoward Hinnant
1249c88580c4SEric Fiselier  template <class _U1, class _U2>
1250549545b6SEric Fiselier  _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
1251c88580c4SEric Fiselier  __compressed_pair(_U1&& __t1, _U2&& __t2)
1252d586f92cSArthur O'Dwyer      : _Base1(_VSTD::forward<_U1>(__t1)), _Base2(_VSTD::forward<_U2>(__t2)) {}
1253a87b5e34SHoward Hinnant
1254549545b6SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
1255a87b5e34SHoward Hinnant  template <class... _Args1, class... _Args2>
1256c88580c4SEric Fiselier  _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
1257a87b5e34SHoward Hinnant  __compressed_pair(piecewise_construct_t __pc, tuple<_Args1...> __first_args,
1258a87b5e34SHoward Hinnant                    tuple<_Args2...> __second_args)
1259c88580c4SEric Fiselier      : _Base1(__pc, _VSTD::move(__first_args),
1260c88580c4SEric Fiselier               typename __make_tuple_indices<sizeof...(_Args1)>::type()),
1261c88580c4SEric Fiselier        _Base2(__pc, _VSTD::move(__second_args),
1262c88580c4SEric Fiselier               typename __make_tuple_indices<sizeof...(_Args2)>::type()) {}
1263c88580c4SEric Fiselier#endif
1264c88580c4SEric Fiselier
1265c88580c4SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1266c88580c4SEric Fiselier  typename _Base1::reference first() _NOEXCEPT {
1267c88580c4SEric Fiselier    return static_cast<_Base1&>(*this).__get();
1268c88580c4SEric Fiselier  }
1269c88580c4SEric Fiselier
1270c88580c4SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1271c88580c4SEric Fiselier  typename _Base1::const_reference first() const _NOEXCEPT {
1272c88580c4SEric Fiselier    return static_cast<_Base1 const&>(*this).__get();
1273c88580c4SEric Fiselier  }
1274c88580c4SEric Fiselier
1275c88580c4SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1276c88580c4SEric Fiselier  typename _Base2::reference second() _NOEXCEPT {
1277c88580c4SEric Fiselier    return static_cast<_Base2&>(*this).__get();
1278c88580c4SEric Fiselier  }
1279c88580c4SEric Fiselier
1280c88580c4SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1281c88580c4SEric Fiselier  typename _Base2::const_reference second() const _NOEXCEPT {
1282c88580c4SEric Fiselier    return static_cast<_Base2 const&>(*this).__get();
1283c88580c4SEric Fiselier  }
1284c88580c4SEric Fiselier
1285955dd7b7SLouis Dionne  _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
1286955dd7b7SLouis Dionne  static _Base1* __get_first_base(__compressed_pair* __pair) _NOEXCEPT {
1287955dd7b7SLouis Dionne    return static_cast<_Base1*>(__pair);
1288955dd7b7SLouis Dionne  }
1289955dd7b7SLouis Dionne  _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
1290955dd7b7SLouis Dionne  static _Base2* __get_second_base(__compressed_pair* __pair) _NOEXCEPT {
1291955dd7b7SLouis Dionne    return static_cast<_Base2*>(__pair);
1292955dd7b7SLouis Dionne  }
1293955dd7b7SLouis Dionne
1294c88580c4SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1295c88580c4SEric Fiselier  void swap(__compressed_pair& __x)
12963739fe79SHoward Hinnant    _NOEXCEPT_(__is_nothrow_swappable<_T1>::value &&
1297afa72ed4SMarshall Clow               __is_nothrow_swappable<_T2>::value)
1298c88580c4SEric Fiselier  {
1299d586f92cSArthur O'Dwyer    using _VSTD::swap;
1300c88580c4SEric Fiselier    swap(first(), __x.first());
1301c88580c4SEric Fiselier    swap(second(), __x.second());
1302c88580c4SEric Fiselier  }
13033e519524SHoward Hinnant};
13043e519524SHoward Hinnant
13053e519524SHoward Hinnanttemplate <class _T1, class _T2>
13063e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1307c88580c4SEric Fiseliervoid swap(__compressed_pair<_T1, _T2>& __x, __compressed_pair<_T1, _T2>& __y)
13083739fe79SHoward Hinnant    _NOEXCEPT_(__is_nothrow_swappable<_T1>::value &&
1309c88580c4SEric Fiselier               __is_nothrow_swappable<_T2>::value) {
1310c88580c4SEric Fiselier  __x.swap(__y);
1311c88580c4SEric Fiselier}
13123e519524SHoward Hinnant
13138e25104bSHoward Hinnant// default_delete
13148e25104bSHoward Hinnant
13153e519524SHoward Hinnanttemplate <class _Tp>
1316030d19bdSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS default_delete {
131772d0d603SErik Pilkington    static_assert(!is_function<_Tp>::value,
131872d0d603SErik Pilkington                  "default_delete cannot be instantiated for function types");
1319030d19bdSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
1320fb2bd4a9SEric Fiselier  _LIBCPP_INLINE_VISIBILITY constexpr default_delete() _NOEXCEPT = default;
1321c0937e8aSHoward Hinnant#else
1322030d19bdSEric Fiselier  _LIBCPP_INLINE_VISIBILITY default_delete() {}
1323c0937e8aSHoward Hinnant#endif
13243e519524SHoward Hinnant  template <class _Up>
1325030d19bdSEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1326030d19bdSEric Fiselier  default_delete(const default_delete<_Up>&,
1327030d19bdSEric Fiselier                 typename enable_if<is_convertible<_Up*, _Tp*>::value>::type* =
1328030d19bdSEric Fiselier                     0) _NOEXCEPT {}
1329030d19bdSEric Fiselier
1330030d19bdSEric Fiselier  _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __ptr) const _NOEXCEPT {
1331030d19bdSEric Fiselier    static_assert(sizeof(_Tp) > 0,
1332030d19bdSEric Fiselier                  "default_delete can not delete incomplete type");
1333030d19bdSEric Fiselier    static_assert(!is_void<_Tp>::value,
1334030d19bdSEric Fiselier                  "default_delete can not delete incomplete type");
13353e519524SHoward Hinnant    delete __ptr;
13363e519524SHoward Hinnant  }
13373e519524SHoward Hinnant};
13383e519524SHoward Hinnant
13393e519524SHoward Hinnanttemplate <class _Tp>
1340030d19bdSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS default_delete<_Tp[]> {
1341030d19bdSEric Fiselierprivate:
1342e4097ad7SHoward Hinnant  template <class _Up>
1343030d19bdSEric Fiselier  struct _EnableIfConvertible
1344030d19bdSEric Fiselier      : enable_if<is_convertible<_Up(*)[], _Tp(*)[]>::value> {};
1345030d19bdSEric Fiselier
1346030d19bdSEric Fiselierpublic:
1347030d19bdSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
1348fb2bd4a9SEric Fiselier  _LIBCPP_INLINE_VISIBILITY constexpr default_delete() _NOEXCEPT = default;
1349030d19bdSEric Fiselier#else
1350030d19bdSEric Fiselier  _LIBCPP_INLINE_VISIBILITY default_delete() {}
1351030d19bdSEric Fiselier#endif
1352030d19bdSEric Fiselier
1353e4097ad7SHoward Hinnant  template <class _Up>
1354e4097ad7SHoward Hinnant  _LIBCPP_INLINE_VISIBILITY
1355030d19bdSEric Fiselier  default_delete(const default_delete<_Up[]>&,
1356030d19bdSEric Fiselier                 typename _EnableIfConvertible<_Up>::type* = 0) _NOEXCEPT {}
1357030d19bdSEric Fiselier
1358030d19bdSEric Fiselier  template <class _Up>
1359030d19bdSEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1360030d19bdSEric Fiselier  typename _EnableIfConvertible<_Up>::type
1361030d19bdSEric Fiselier  operator()(_Up* __ptr) const _NOEXCEPT {
1362030d19bdSEric Fiselier    static_assert(sizeof(_Tp) > 0,
1363030d19bdSEric Fiselier                  "default_delete can not delete incomplete type");
1364030d19bdSEric Fiselier    static_assert(!is_void<_Tp>::value,
1365030d19bdSEric Fiselier                  "default_delete can not delete void type");
13663e519524SHoward Hinnant    delete[] __ptr;
13673e519524SHoward Hinnant  }
13683e519524SHoward Hinnant};
13693e519524SHoward Hinnant
137047272722SEric Fiseliertemplate <class _Deleter>
137147272722SEric Fiselierstruct __unique_ptr_deleter_sfinae {
137247272722SEric Fiselier  static_assert(!is_reference<_Deleter>::value, "incorrect specialization");
137347272722SEric Fiselier  typedef const _Deleter& __lval_ref_type;
137447272722SEric Fiselier  typedef _Deleter&& __good_rval_ref_type;
137547272722SEric Fiselier  typedef true_type __enable_rval_overload;
137647272722SEric Fiselier};
137747272722SEric Fiselier
137847272722SEric Fiseliertemplate <class _Deleter>
137947272722SEric Fiselierstruct __unique_ptr_deleter_sfinae<_Deleter const&> {
138047272722SEric Fiselier  typedef const _Deleter& __lval_ref_type;
138147272722SEric Fiselier  typedef const _Deleter&& __bad_rval_ref_type;
138247272722SEric Fiselier  typedef false_type __enable_rval_overload;
138347272722SEric Fiselier};
138447272722SEric Fiselier
138547272722SEric Fiseliertemplate <class _Deleter>
138647272722SEric Fiselierstruct __unique_ptr_deleter_sfinae<_Deleter&> {
138747272722SEric Fiselier  typedef _Deleter& __lval_ref_type;
138847272722SEric Fiselier  typedef _Deleter&& __bad_rval_ref_type;
138947272722SEric Fiselier  typedef false_type __enable_rval_overload;
139047272722SEric Fiselier};
139147272722SEric Fiselier
139276887bc4SVy Nguyen#if defined(_LIBCPP_ABI_ENABLE_UNIQUE_PTR_TRIVIAL_ABI)
139376887bc4SVy Nguyen#  define _LIBCPP_UNIQUE_PTR_TRIVIAL_ABI __attribute__((trivial_abi))
139476887bc4SVy Nguyen#else
139576887bc4SVy Nguyen#  define _LIBCPP_UNIQUE_PTR_TRIVIAL_ABI
139676887bc4SVy Nguyen#endif
139776887bc4SVy Nguyen
13983e519524SHoward Hinnanttemplate <class _Tp, class _Dp = default_delete<_Tp> >
139976887bc4SVy Nguyenclass _LIBCPP_UNIQUE_PTR_TRIVIAL_ABI _LIBCPP_TEMPLATE_VIS unique_ptr {
14003e519524SHoward Hinnantpublic:
14013e519524SHoward Hinnant  typedef _Tp element_type;
14023e519524SHoward Hinnant  typedef _Dp deleter_type;
14032cb4a96aSLouis Dionne  typedef _LIBCPP_NODEBUG_TYPE typename __pointer<_Tp, deleter_type>::type pointer;
140447272722SEric Fiselier
140547272722SEric Fiselier  static_assert(!is_rvalue_reference<deleter_type>::value,
140647272722SEric Fiselier                "the specified deleter type cannot be an rvalue reference");
140747272722SEric Fiselier
14083e519524SHoward Hinnantprivate:
14093e519524SHoward Hinnant  __compressed_pair<pointer, deleter_type> __ptr_;
14103e519524SHoward Hinnant
14113e519524SHoward Hinnant  struct __nat { int __for_bool_; };
14123e519524SHoward Hinnant
141314d48692SEric Fiselier  typedef _LIBCPP_NODEBUG_TYPE __unique_ptr_deleter_sfinae<_Dp> _DeleterSFINAE;
14143e519524SHoward Hinnant
141547272722SEric Fiselier  template <bool _Dummy>
141614d48692SEric Fiselier  using _LValRefType _LIBCPP_NODEBUG_TYPE =
141792e61e93SEric Fiselier      typename __dependent_type<_DeleterSFINAE, _Dummy>::__lval_ref_type;
141847272722SEric Fiselier
141947272722SEric Fiselier  template <bool _Dummy>
142014d48692SEric Fiselier  using _GoodRValRefType _LIBCPP_NODEBUG_TYPE =
142192e61e93SEric Fiselier      typename __dependent_type<_DeleterSFINAE, _Dummy>::__good_rval_ref_type;
142247272722SEric Fiselier
142347272722SEric Fiselier  template <bool _Dummy>
142414d48692SEric Fiselier  using _BadRValRefType _LIBCPP_NODEBUG_TYPE  =
142592e61e93SEric Fiselier      typename __dependent_type<_DeleterSFINAE, _Dummy>::__bad_rval_ref_type;
142647272722SEric Fiselier
142747272722SEric Fiselier  template <bool _Dummy, class _Deleter = typename __dependent_type<
142847272722SEric Fiselier                             __identity<deleter_type>, _Dummy>::type>
142914d48692SEric Fiselier  using _EnableIfDeleterDefaultConstructible _LIBCPP_NODEBUG_TYPE =
143047272722SEric Fiselier      typename enable_if<is_default_constructible<_Deleter>::value &&
143147272722SEric Fiselier                         !is_pointer<_Deleter>::value>::type;
143247272722SEric Fiselier
143347272722SEric Fiselier  template <class _ArgType>
143414d48692SEric Fiselier  using _EnableIfDeleterConstructible _LIBCPP_NODEBUG_TYPE  =
143547272722SEric Fiselier      typename enable_if<is_constructible<deleter_type, _ArgType>::value>::type;
143647272722SEric Fiselier
143747272722SEric Fiselier  template <class _UPtr, class _Up>
143814d48692SEric Fiselier  using _EnableIfMoveConvertible _LIBCPP_NODEBUG_TYPE  = typename enable_if<
143947272722SEric Fiselier      is_convertible<typename _UPtr::pointer, pointer>::value &&
144047272722SEric Fiselier      !is_array<_Up>::value
144147272722SEric Fiselier  >::type;
144247272722SEric Fiselier
144347272722SEric Fiselier  template <class _UDel>
144414d48692SEric Fiselier  using _EnableIfDeleterConvertible _LIBCPP_NODEBUG_TYPE  = typename enable_if<
144547272722SEric Fiselier      (is_reference<_Dp>::value && is_same<_Dp, _UDel>::value) ||
144647272722SEric Fiselier      (!is_reference<_Dp>::value && is_convertible<_UDel, _Dp>::value)
144747272722SEric Fiselier    >::type;
144847272722SEric Fiselier
144947272722SEric Fiselier  template <class _UDel>
145047272722SEric Fiselier  using _EnableIfDeleterAssignable = typename enable_if<
145147272722SEric Fiselier      is_assignable<_Dp&, _UDel&&>::value
145247272722SEric Fiselier    >::type;
145347272722SEric Fiselier
145447272722SEric Fiselierpublic:
145547272722SEric Fiselier  template <bool _Dummy = true,
145647272722SEric Fiselier            class = _EnableIfDeleterDefaultConstructible<_Dummy> >
145747272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1458549545b6SEric Fiselier  _LIBCPP_CONSTEXPR unique_ptr() _NOEXCEPT : __ptr_(pointer(), __default_init_tag()) {}
145947272722SEric Fiselier
146047272722SEric Fiselier  template <bool _Dummy = true,
146147272722SEric Fiselier            class = _EnableIfDeleterDefaultConstructible<_Dummy> >
146247272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1463549545b6SEric Fiselier  _LIBCPP_CONSTEXPR unique_ptr(nullptr_t) _NOEXCEPT : __ptr_(pointer(), __default_init_tag()) {}
146447272722SEric Fiselier
146547272722SEric Fiselier  template <bool _Dummy = true,
146647272722SEric Fiselier            class = _EnableIfDeleterDefaultConstructible<_Dummy> >
146747272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1468549545b6SEric Fiselier  explicit unique_ptr(pointer __p) _NOEXCEPT : __ptr_(__p, __default_init_tag()) {}
146947272722SEric Fiselier
147047272722SEric Fiselier  template <bool _Dummy = true,
147147272722SEric Fiselier            class = _EnableIfDeleterConstructible<_LValRefType<_Dummy> > >
147247272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1473fb2bd4a9SEric Fiselier  unique_ptr(pointer __p, _LValRefType<_Dummy> __d) _NOEXCEPT
14743e519524SHoward Hinnant      : __ptr_(__p, __d) {}
14753e519524SHoward Hinnant
147647272722SEric Fiselier  template <bool _Dummy = true,
147747272722SEric Fiselier            class = _EnableIfDeleterConstructible<_GoodRValRefType<_Dummy> > >
14783e519524SHoward Hinnant  _LIBCPP_INLINE_VISIBILITY
1479fb2bd4a9SEric Fiselier  unique_ptr(pointer __p, _GoodRValRefType<_Dummy> __d) _NOEXCEPT
148047272722SEric Fiselier      : __ptr_(__p, _VSTD::move(__d)) {
148147272722SEric Fiselier    static_assert(!is_reference<deleter_type>::value,
148247272722SEric Fiselier                  "rvalue deleter bound to reference");
148347272722SEric Fiselier  }
148447272722SEric Fiselier
148547272722SEric Fiselier  template <bool _Dummy = true,
148647272722SEric Fiselier            class = _EnableIfDeleterConstructible<_BadRValRefType<_Dummy> > >
148747272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
148847272722SEric Fiselier  unique_ptr(pointer __p, _BadRValRefType<_Dummy> __d) = delete;
148947272722SEric Fiselier
149047272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1491fb2bd4a9SEric Fiselier  unique_ptr(unique_ptr&& __u) _NOEXCEPT
149247272722SEric Fiselier      : __ptr_(__u.release(), _VSTD::forward<deleter_type>(__u.get_deleter())) {
149347272722SEric Fiselier  }
149447272722SEric Fiselier
149547272722SEric Fiselier  template <class _Up, class _Ep,
149647272722SEric Fiselier      class = _EnableIfMoveConvertible<unique_ptr<_Up, _Ep>, _Up>,
149747272722SEric Fiselier      class = _EnableIfDeleterConvertible<_Ep>
149847272722SEric Fiselier  >
149947272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
150047272722SEric Fiselier  unique_ptr(unique_ptr<_Up, _Ep>&& __u) _NOEXCEPT
1501ce48a113SHoward Hinnant      : __ptr_(__u.release(), _VSTD::forward<_Ep>(__u.get_deleter())) {}
15023e519524SHoward Hinnant
1503e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR)
15043e519524SHoward Hinnant  template <class _Up>
150547272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
150647272722SEric Fiselier  unique_ptr(auto_ptr<_Up>&& __p,
150747272722SEric Fiselier             typename enable_if<is_convertible<_Up*, _Tp*>::value &&
15083e519524SHoward Hinnant                                    is_same<_Dp, default_delete<_Tp> >::value,
150947272722SEric Fiselier                                __nat>::type = __nat()) _NOEXCEPT
1510549545b6SEric Fiselier      : __ptr_(__p.release(), __default_init_tag()) {}
1511e67179bcSMarshall Clow#endif
15123e519524SHoward Hinnant
151347272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
151447272722SEric Fiselier  unique_ptr& operator=(unique_ptr&& __u) _NOEXCEPT {
15153e519524SHoward Hinnant    reset(__u.release());
1516ce48a113SHoward Hinnant    __ptr_.second() = _VSTD::forward<deleter_type>(__u.get_deleter());
15173e519524SHoward Hinnant    return *this;
15183e519524SHoward Hinnant  }
15193e519524SHoward Hinnant
152047272722SEric Fiselier  template <class _Up, class _Ep,
152147272722SEric Fiselier      class = _EnableIfMoveConvertible<unique_ptr<_Up, _Ep>, _Up>,
152247272722SEric Fiselier      class = _EnableIfDeleterAssignable<_Ep>
152347272722SEric Fiselier  >
15243e519524SHoward Hinnant  _LIBCPP_INLINE_VISIBILITY
152547272722SEric Fiselier  unique_ptr& operator=(unique_ptr<_Up, _Ep>&& __u) _NOEXCEPT {
15263e519524SHoward Hinnant    reset(__u.release());
1527ce48a113SHoward Hinnant    __ptr_.second() = _VSTD::forward<_Ep>(__u.get_deleter());
15283e519524SHoward Hinnant    return *this;
15293e519524SHoward Hinnant  }
15303e519524SHoward Hinnant
1531e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR)
15323e519524SHoward Hinnant  template <class _Up>
15333e519524SHoward Hinnant  _LIBCPP_INLINE_VISIBILITY
153447272722SEric Fiselier      typename enable_if<is_convertible<_Up*, _Tp*>::value &&
15353e519524SHoward Hinnant                             is_same<_Dp, default_delete<_Tp> >::value,
153647272722SEric Fiselier                         unique_ptr&>::type
153747272722SEric Fiselier      operator=(auto_ptr<_Up> __p) {
153847272722SEric Fiselier    reset(__p.release());
153947272722SEric Fiselier    return *this;
154047272722SEric Fiselier  }
1541e67179bcSMarshall Clow#endif
15423e519524SHoward Hinnant
1543fb2bd4a9SEric Fiselier#ifdef _LIBCPP_CXX03_LANG
1544fb2bd4a9SEric Fiselier  unique_ptr(unique_ptr const&) = delete;
1545fb2bd4a9SEric Fiselier  unique_ptr& operator=(unique_ptr const&) = delete;
1546fb2bd4a9SEric Fiselier#endif
1547fb2bd4a9SEric Fiselier
1548fb2bd4a9SEric Fiselier
154947272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
155047272722SEric Fiselier  ~unique_ptr() { reset(); }
155147272722SEric Fiselier
155247272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
155347272722SEric Fiselier  unique_ptr& operator=(nullptr_t) _NOEXCEPT {
15543e519524SHoward Hinnant    reset();
15553e519524SHoward Hinnant    return *this;
15563e519524SHoward Hinnant  }
15573e519524SHoward Hinnant
1558f2f2d8b9SHoward Hinnant  _LIBCPP_INLINE_VISIBILITY
155947272722SEric Fiselier  typename add_lvalue_reference<_Tp>::type
156047272722SEric Fiselier  operator*() const {
156147272722SEric Fiselier    return *__ptr_.first();
156247272722SEric Fiselier  }
156347272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
156447272722SEric Fiselier  pointer operator->() const _NOEXCEPT {
156547272722SEric Fiselier    return __ptr_.first();
156647272722SEric Fiselier  }
156747272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
156847272722SEric Fiselier  pointer get() const _NOEXCEPT {
156947272722SEric Fiselier    return __ptr_.first();
157047272722SEric Fiselier  }
157147272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
157247272722SEric Fiselier  deleter_type& get_deleter() _NOEXCEPT {
157347272722SEric Fiselier    return __ptr_.second();
157447272722SEric Fiselier  }
157547272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
157647272722SEric Fiselier  const deleter_type& get_deleter() const _NOEXCEPT {
157747272722SEric Fiselier    return __ptr_.second();
157847272722SEric Fiselier  }
157947272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
158047272722SEric Fiselier  _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT {
158147272722SEric Fiselier    return __ptr_.first() != nullptr;
158247272722SEric Fiselier  }
15833e519524SHoward Hinnant
158447272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
158547272722SEric Fiselier  pointer release() _NOEXCEPT {
15863e519524SHoward Hinnant    pointer __t = __ptr_.first();
15873e519524SHoward Hinnant    __ptr_.first() = pointer();
15883e519524SHoward Hinnant    return __t;
15893e519524SHoward Hinnant  }
15903e519524SHoward Hinnant
159147272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
159247272722SEric Fiselier  void reset(pointer __p = pointer()) _NOEXCEPT {
15933e519524SHoward Hinnant    pointer __tmp = __ptr_.first();
15943e519524SHoward Hinnant    __ptr_.first() = __p;
15953e519524SHoward Hinnant    if (__tmp)
15963e519524SHoward Hinnant      __ptr_.second()(__tmp);
15973e519524SHoward Hinnant  }
15983e519524SHoward Hinnant
159947272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
160047272722SEric Fiselier  void swap(unique_ptr& __u) _NOEXCEPT {
160147272722SEric Fiselier    __ptr_.swap(__u.__ptr_);
160247272722SEric Fiselier  }
16033e519524SHoward Hinnant};
16043e519524SHoward Hinnant
160547272722SEric Fiselier
16063e519524SHoward Hinnanttemplate <class _Tp, class _Dp>
160776887bc4SVy Nguyenclass _LIBCPP_UNIQUE_PTR_TRIVIAL_ABI _LIBCPP_TEMPLATE_VIS unique_ptr<_Tp[], _Dp> {
16083e519524SHoward Hinnantpublic:
16093e519524SHoward Hinnant  typedef _Tp element_type;
16103e519524SHoward Hinnant  typedef _Dp deleter_type;
16112cb4a96aSLouis Dionne  typedef typename __pointer<_Tp, deleter_type>::type pointer;
161247272722SEric Fiselier
16133e519524SHoward Hinnantprivate:
16143e519524SHoward Hinnant  __compressed_pair<pointer, deleter_type> __ptr_;
16153e519524SHoward Hinnant
161692e61e93SEric Fiselier  template <class _From>
161792e61e93SEric Fiselier  struct _CheckArrayPointerConversion : is_same<_From, pointer> {};
16183e519524SHoward Hinnant
161992e61e93SEric Fiselier  template <class _FromElem>
162092e61e93SEric Fiselier  struct _CheckArrayPointerConversion<_FromElem*>
162192e61e93SEric Fiselier      : integral_constant<bool,
162292e61e93SEric Fiselier          is_same<_FromElem*, pointer>::value ||
162392e61e93SEric Fiselier            (is_same<pointer, element_type*>::value &&
162492e61e93SEric Fiselier             is_convertible<_FromElem(*)[], element_type(*)[]>::value)
162592e61e93SEric Fiselier      >
162692e61e93SEric Fiselier  {};
162747272722SEric Fiselier
162892e61e93SEric Fiselier  typedef __unique_ptr_deleter_sfinae<_Dp> _DeleterSFINAE;
162947272722SEric Fiselier
163047272722SEric Fiselier  template <bool _Dummy>
163114d48692SEric Fiselier  using _LValRefType _LIBCPP_NODEBUG_TYPE =
163292e61e93SEric Fiselier      typename __dependent_type<_DeleterSFINAE, _Dummy>::__lval_ref_type;
163347272722SEric Fiselier
163447272722SEric Fiselier  template <bool _Dummy>
163514d48692SEric Fiselier  using _GoodRValRefType _LIBCPP_NODEBUG_TYPE =
163692e61e93SEric Fiselier      typename __dependent_type<_DeleterSFINAE, _Dummy>::__good_rval_ref_type;
163747272722SEric Fiselier
163847272722SEric Fiselier  template <bool _Dummy>
163914d48692SEric Fiselier  using _BadRValRefType _LIBCPP_NODEBUG_TYPE =
164092e61e93SEric Fiselier      typename __dependent_type<_DeleterSFINAE, _Dummy>::__bad_rval_ref_type;
164147272722SEric Fiselier
164247272722SEric Fiselier  template <bool _Dummy, class _Deleter = typename __dependent_type<
164347272722SEric Fiselier                             __identity<deleter_type>, _Dummy>::type>
164414d48692SEric Fiselier  using _EnableIfDeleterDefaultConstructible _LIBCPP_NODEBUG_TYPE  =
164547272722SEric Fiselier      typename enable_if<is_default_constructible<_Deleter>::value &&
164647272722SEric Fiselier                         !is_pointer<_Deleter>::value>::type;
164747272722SEric Fiselier
164847272722SEric Fiselier  template <class _ArgType>
164914d48692SEric Fiselier  using _EnableIfDeleterConstructible _LIBCPP_NODEBUG_TYPE  =
165047272722SEric Fiselier      typename enable_if<is_constructible<deleter_type, _ArgType>::value>::type;
16513e519524SHoward Hinnant
165222747e62SLogan Chien  template <class _Pp>
165314d48692SEric Fiselier  using _EnableIfPointerConvertible _LIBCPP_NODEBUG_TYPE  = typename enable_if<
165492e61e93SEric Fiselier      _CheckArrayPointerConversion<_Pp>::value
165547272722SEric Fiselier  >::type;
165647272722SEric Fiselier
165747272722SEric Fiselier  template <class _UPtr, class _Up,
165847272722SEric Fiselier        class _ElemT = typename _UPtr::element_type>
165914d48692SEric Fiselier  using _EnableIfMoveConvertible _LIBCPP_NODEBUG_TYPE  = typename enable_if<
166047272722SEric Fiselier      is_array<_Up>::value &&
166147272722SEric Fiselier      is_same<pointer, element_type*>::value &&
166247272722SEric Fiselier      is_same<typename _UPtr::pointer, _ElemT*>::value &&
166347272722SEric Fiselier      is_convertible<_ElemT(*)[], element_type(*)[]>::value
166447272722SEric Fiselier    >::type;
166547272722SEric Fiselier
166647272722SEric Fiselier  template <class _UDel>
166714d48692SEric Fiselier  using _EnableIfDeleterConvertible _LIBCPP_NODEBUG_TYPE  = typename enable_if<
166847272722SEric Fiselier      (is_reference<_Dp>::value && is_same<_Dp, _UDel>::value) ||
166947272722SEric Fiselier      (!is_reference<_Dp>::value && is_convertible<_UDel, _Dp>::value)
167047272722SEric Fiselier    >::type;
167147272722SEric Fiselier
167247272722SEric Fiselier  template <class _UDel>
167314d48692SEric Fiselier  using _EnableIfDeleterAssignable _LIBCPP_NODEBUG_TYPE  = typename enable_if<
167447272722SEric Fiselier      is_assignable<_Dp&, _UDel&&>::value
167547272722SEric Fiselier    >::type;
167647272722SEric Fiselier
167747272722SEric Fiselierpublic:
167847272722SEric Fiselier  template <bool _Dummy = true,
167947272722SEric Fiselier            class = _EnableIfDeleterDefaultConstructible<_Dummy> >
168047272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1681549545b6SEric Fiselier  _LIBCPP_CONSTEXPR unique_ptr() _NOEXCEPT : __ptr_(pointer(), __default_init_tag()) {}
168247272722SEric Fiselier
168347272722SEric Fiselier  template <bool _Dummy = true,
168447272722SEric Fiselier            class = _EnableIfDeleterDefaultConstructible<_Dummy> >
168547272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1686549545b6SEric Fiselier  _LIBCPP_CONSTEXPR unique_ptr(nullptr_t) _NOEXCEPT : __ptr_(pointer(), __default_init_tag()) {}
168747272722SEric Fiselier
168847272722SEric Fiselier  template <class _Pp, bool _Dummy = true,
168947272722SEric Fiselier            class = _EnableIfDeleterDefaultConstructible<_Dummy>,
169047272722SEric Fiselier            class = _EnableIfPointerConvertible<_Pp> >
169147272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1692fb2bd4a9SEric Fiselier  explicit unique_ptr(_Pp __p) _NOEXCEPT
1693549545b6SEric Fiselier      : __ptr_(__p, __default_init_tag()) {}
169447272722SEric Fiselier
169547272722SEric Fiselier  template <class _Pp, bool _Dummy = true,
169647272722SEric Fiselier            class = _EnableIfDeleterConstructible<_LValRefType<_Dummy> >,
169747272722SEric Fiselier            class = _EnableIfPointerConvertible<_Pp> >
169847272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1699fb2bd4a9SEric Fiselier  unique_ptr(_Pp __p, _LValRefType<_Dummy> __d) _NOEXCEPT
17003e519524SHoward Hinnant      : __ptr_(__p, __d) {}
17013e519524SHoward Hinnant
170247272722SEric Fiselier  template <bool _Dummy = true,
170347272722SEric Fiselier            class = _EnableIfDeleterConstructible<_LValRefType<_Dummy> > >
170447272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1705fb2bd4a9SEric Fiselier  unique_ptr(nullptr_t, _LValRefType<_Dummy> __d) _NOEXCEPT
170647272722SEric Fiselier      : __ptr_(nullptr, __d) {}
17073e519524SHoward Hinnant
170847272722SEric Fiselier  template <class _Pp, bool _Dummy = true,
170947272722SEric Fiselier            class = _EnableIfDeleterConstructible<_GoodRValRefType<_Dummy> >,
171047272722SEric Fiselier            class = _EnableIfPointerConvertible<_Pp> >
171147272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1712fb2bd4a9SEric Fiselier  unique_ptr(_Pp __p, _GoodRValRefType<_Dummy> __d) _NOEXCEPT
171347272722SEric Fiselier      : __ptr_(__p, _VSTD::move(__d)) {
171447272722SEric Fiselier    static_assert(!is_reference<deleter_type>::value,
171547272722SEric Fiselier                  "rvalue deleter bound to reference");
17163e519524SHoward Hinnant  }
17173e519524SHoward Hinnant
171847272722SEric Fiselier  template <bool _Dummy = true,
171947272722SEric Fiselier            class = _EnableIfDeleterConstructible<_GoodRValRefType<_Dummy> > >
172047272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1721fb2bd4a9SEric Fiselier  unique_ptr(nullptr_t, _GoodRValRefType<_Dummy> __d) _NOEXCEPT
172247272722SEric Fiselier      : __ptr_(nullptr, _VSTD::move(__d)) {
172347272722SEric Fiselier    static_assert(!is_reference<deleter_type>::value,
172447272722SEric Fiselier                  "rvalue deleter bound to reference");
17253e519524SHoward Hinnant  }
17263e519524SHoward Hinnant
172747272722SEric Fiselier  template <class _Pp, bool _Dummy = true,
172847272722SEric Fiselier            class = _EnableIfDeleterConstructible<_BadRValRefType<_Dummy> >,
172947272722SEric Fiselier            class = _EnableIfPointerConvertible<_Pp> >
173047272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
173147272722SEric Fiselier  unique_ptr(_Pp __p, _BadRValRefType<_Dummy> __d) = delete;
17323e519524SHoward Hinnant
173347272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1734fb2bd4a9SEric Fiselier  unique_ptr(unique_ptr&& __u) _NOEXCEPT
173547272722SEric Fiselier      : __ptr_(__u.release(), _VSTD::forward<deleter_type>(__u.get_deleter())) {
173647272722SEric Fiselier  }
173747272722SEric Fiselier
173847272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
1739fb2bd4a9SEric Fiselier  unique_ptr& operator=(unique_ptr&& __u) _NOEXCEPT {
17403e519524SHoward Hinnant    reset(__u.release());
1741ce48a113SHoward Hinnant    __ptr_.second() = _VSTD::forward<deleter_type>(__u.get_deleter());
17423e519524SHoward Hinnant    return *this;
17433e519524SHoward Hinnant  }
1744e4097ad7SHoward Hinnant
174547272722SEric Fiselier  template <class _Up, class _Ep,
174647272722SEric Fiselier      class = _EnableIfMoveConvertible<unique_ptr<_Up, _Ep>, _Up>,
174747272722SEric Fiselier      class = _EnableIfDeleterConvertible<_Ep>
174847272722SEric Fiselier  >
1749e4097ad7SHoward Hinnant  _LIBCPP_INLINE_VISIBILITY
1750fb2bd4a9SEric Fiselier  unique_ptr(unique_ptr<_Up, _Ep>&& __u) _NOEXCEPT
175186321b2bSEric Fiselier      : __ptr_(__u.release(), _VSTD::forward<_Ep>(__u.get_deleter())) {
175247272722SEric Fiselier  }
1753e4097ad7SHoward Hinnant
175447272722SEric Fiselier  template <class _Up, class _Ep,
175547272722SEric Fiselier      class = _EnableIfMoveConvertible<unique_ptr<_Up, _Ep>, _Up>,
175647272722SEric Fiselier      class = _EnableIfDeleterAssignable<_Ep>
175747272722SEric Fiselier  >
1758e4097ad7SHoward Hinnant  _LIBCPP_INLINE_VISIBILITY
1759e4097ad7SHoward Hinnant  unique_ptr&
1760fb2bd4a9SEric Fiselier  operator=(unique_ptr<_Up, _Ep>&& __u) _NOEXCEPT {
1761e4097ad7SHoward Hinnant    reset(__u.release());
1762e4097ad7SHoward Hinnant    __ptr_.second() = _VSTD::forward<_Ep>(__u.get_deleter());
1763e4097ad7SHoward Hinnant    return *this;
1764e4097ad7SHoward Hinnant  }
17653e519524SHoward Hinnant
1766fb2bd4a9SEric Fiselier#ifdef _LIBCPP_CXX03_LANG
1767fb2bd4a9SEric Fiselier  unique_ptr(unique_ptr const&) = delete;
1768fb2bd4a9SEric Fiselier  unique_ptr& operator=(unique_ptr const&) = delete;
1769fb2bd4a9SEric Fiselier#endif
17703e519524SHoward Hinnant
177147272722SEric Fiselierpublic:
177247272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
177347272722SEric Fiselier  ~unique_ptr() { reset(); }
177447272722SEric Fiselier
177547272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
177647272722SEric Fiselier  unique_ptr& operator=(nullptr_t) _NOEXCEPT {
17773e519524SHoward Hinnant    reset();
17783e519524SHoward Hinnant    return *this;
17793e519524SHoward Hinnant  }
17803e519524SHoward Hinnant
1781f2f2d8b9SHoward Hinnant  _LIBCPP_INLINE_VISIBILITY
178247272722SEric Fiselier  typename add_lvalue_reference<_Tp>::type
178347272722SEric Fiselier  operator[](size_t __i) const {
178447272722SEric Fiselier    return __ptr_.first()[__i];
178547272722SEric Fiselier  }
178647272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
178747272722SEric Fiselier  pointer get() const _NOEXCEPT {
178847272722SEric Fiselier    return __ptr_.first();
178947272722SEric Fiselier  }
17903e519524SHoward Hinnant
179147272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
179247272722SEric Fiselier  deleter_type& get_deleter() _NOEXCEPT {
179347272722SEric Fiselier    return __ptr_.second();
179447272722SEric Fiselier  }
179547272722SEric Fiselier
179647272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
179747272722SEric Fiselier  const deleter_type& get_deleter() const _NOEXCEPT {
179847272722SEric Fiselier    return __ptr_.second();
179947272722SEric Fiselier  }
180047272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
180147272722SEric Fiselier  _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT {
180247272722SEric Fiselier    return __ptr_.first() != nullptr;
180347272722SEric Fiselier  }
180447272722SEric Fiselier
180547272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
180647272722SEric Fiselier  pointer release() _NOEXCEPT {
18073e519524SHoward Hinnant    pointer __t = __ptr_.first();
18083e519524SHoward Hinnant    __ptr_.first() = pointer();
18093e519524SHoward Hinnant    return __t;
18103e519524SHoward Hinnant  }
18113e519524SHoward Hinnant
181222747e62SLogan Chien  template <class _Pp>
181322747e62SLogan Chien  _LIBCPP_INLINE_VISIBILITY
181447272722SEric Fiselier  typename enable_if<
181592e61e93SEric Fiselier      _CheckArrayPointerConversion<_Pp>::value
181647272722SEric Fiselier  >::type
181747272722SEric Fiselier  reset(_Pp __p) _NOEXCEPT {
18183e519524SHoward Hinnant    pointer __tmp = __ptr_.first();
18193e519524SHoward Hinnant    __ptr_.first() = __p;
18203e519524SHoward Hinnant    if (__tmp)
18213e519524SHoward Hinnant      __ptr_.second()(__tmp);
18223e519524SHoward Hinnant  }
182347272722SEric Fiselier
182447272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
182547272722SEric Fiselier  void reset(nullptr_t = nullptr) _NOEXCEPT {
18263e519524SHoward Hinnant    pointer __tmp = __ptr_.first();
18273e519524SHoward Hinnant    __ptr_.first() = nullptr;
18283e519524SHoward Hinnant    if (__tmp)
18293e519524SHoward Hinnant      __ptr_.second()(__tmp);
18303e519524SHoward Hinnant  }
18313e519524SHoward Hinnant
183247272722SEric Fiselier  _LIBCPP_INLINE_VISIBILITY
183347272722SEric Fiselier  void swap(unique_ptr& __u) _NOEXCEPT {
183447272722SEric Fiselier    __ptr_.swap(__u.__ptr_);
183547272722SEric Fiselier  }
18363e519524SHoward Hinnant
18373e519524SHoward Hinnant};
18383e519524SHoward Hinnant
18393e519524SHoward Hinnanttemplate <class _Tp, class _Dp>
18403e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1841f07dd8d0SEric Fiseliertypename enable_if<
1842f07dd8d0SEric Fiselier    __is_swappable<_Dp>::value,
18433e519524SHoward Hinnant    void
1844f07dd8d0SEric Fiselier>::type
18453739fe79SHoward Hinnantswap(unique_ptr<_Tp, _Dp>& __x, unique_ptr<_Tp, _Dp>& __y) _NOEXCEPT {__x.swap(__y);}
18463e519524SHoward Hinnant
18473e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2>
18483e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
18493e519524SHoward Hinnantbool
18503e519524SHoward Hinnantoperator==(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return __x.get() == __y.get();}
18513e519524SHoward Hinnant
18523e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2>
18533e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
18543e519524SHoward Hinnantbool
18553e519524SHoward Hinnantoperator!=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__x == __y);}
18563e519524SHoward Hinnant
18573e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2>
18583e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
18593e519524SHoward Hinnantbool
186067f39647SHoward Hinnantoperator< (const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y)
186167f39647SHoward Hinnant{
186267f39647SHoward Hinnant    typedef typename unique_ptr<_T1, _D1>::pointer _P1;
186367f39647SHoward Hinnant    typedef typename unique_ptr<_T2, _D2>::pointer _P2;
18646fe361c1SEric Fiselier    typedef typename common_type<_P1, _P2>::type _Vp;
18656fe361c1SEric Fiselier    return less<_Vp>()(__x.get(), __y.get());
186667f39647SHoward Hinnant}
18673e519524SHoward Hinnant
18683e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2>
18693e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
18703e519524SHoward Hinnantbool
18713e519524SHoward Hinnantoperator> (const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return __y < __x;}
18723e519524SHoward Hinnant
18733e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2>
18743e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
18753e519524SHoward Hinnantbool
18763e519524SHoward Hinnantoperator<=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__y < __x);}
18773e519524SHoward Hinnant
18783e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2>
18793e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
18803e519524SHoward Hinnantbool
18813e519524SHoward Hinnantoperator>=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__x < __y);}
18823e519524SHoward Hinnant
188367f39647SHoward Hinnanttemplate <class _T1, class _D1>
188467f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
188567f39647SHoward Hinnantbool
1886c0937e8aSHoward Hinnantoperator==(const unique_ptr<_T1, _D1>& __x, nullptr_t) _NOEXCEPT
188767f39647SHoward Hinnant{
188867f39647SHoward Hinnant    return !__x;
188967f39647SHoward Hinnant}
189067f39647SHoward Hinnant
189167f39647SHoward Hinnanttemplate <class _T1, class _D1>
189267f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
189367f39647SHoward Hinnantbool
1894c0937e8aSHoward Hinnantoperator==(nullptr_t, const unique_ptr<_T1, _D1>& __x) _NOEXCEPT
189567f39647SHoward Hinnant{
189667f39647SHoward Hinnant    return !__x;
189767f39647SHoward Hinnant}
189867f39647SHoward Hinnant
189967f39647SHoward Hinnanttemplate <class _T1, class _D1>
190067f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
190167f39647SHoward Hinnantbool
1902c0937e8aSHoward Hinnantoperator!=(const unique_ptr<_T1, _D1>& __x, nullptr_t) _NOEXCEPT
190367f39647SHoward Hinnant{
190467f39647SHoward Hinnant    return static_cast<bool>(__x);
190567f39647SHoward Hinnant}
190667f39647SHoward Hinnant
190767f39647SHoward Hinnanttemplate <class _T1, class _D1>
190867f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
190967f39647SHoward Hinnantbool
1910c0937e8aSHoward Hinnantoperator!=(nullptr_t, const unique_ptr<_T1, _D1>& __x) _NOEXCEPT
191167f39647SHoward Hinnant{
191267f39647SHoward Hinnant    return static_cast<bool>(__x);
191367f39647SHoward Hinnant}
191467f39647SHoward Hinnant
191567f39647SHoward Hinnanttemplate <class _T1, class _D1>
191667f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
191767f39647SHoward Hinnantbool
191867f39647SHoward Hinnantoperator<(const unique_ptr<_T1, _D1>& __x, nullptr_t)
191967f39647SHoward Hinnant{
192067f39647SHoward Hinnant    typedef typename unique_ptr<_T1, _D1>::pointer _P1;
192167f39647SHoward Hinnant    return less<_P1>()(__x.get(), nullptr);
192267f39647SHoward Hinnant}
192367f39647SHoward Hinnant
192467f39647SHoward Hinnanttemplate <class _T1, class _D1>
192567f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
192667f39647SHoward Hinnantbool
192767f39647SHoward Hinnantoperator<(nullptr_t, const unique_ptr<_T1, _D1>& __x)
192867f39647SHoward Hinnant{
192967f39647SHoward Hinnant    typedef typename unique_ptr<_T1, _D1>::pointer _P1;
193067f39647SHoward Hinnant    return less<_P1>()(nullptr, __x.get());
193167f39647SHoward Hinnant}
193267f39647SHoward Hinnant
193367f39647SHoward Hinnanttemplate <class _T1, class _D1>
193467f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
193567f39647SHoward Hinnantbool
193667f39647SHoward Hinnantoperator>(const unique_ptr<_T1, _D1>& __x, nullptr_t)
193767f39647SHoward Hinnant{
193867f39647SHoward Hinnant    return nullptr < __x;
193967f39647SHoward Hinnant}
194067f39647SHoward Hinnant
194167f39647SHoward Hinnanttemplate <class _T1, class _D1>
194267f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
194367f39647SHoward Hinnantbool
194467f39647SHoward Hinnantoperator>(nullptr_t, const unique_ptr<_T1, _D1>& __x)
194567f39647SHoward Hinnant{
194667f39647SHoward Hinnant    return __x < nullptr;
194767f39647SHoward Hinnant}
194867f39647SHoward Hinnant
194967f39647SHoward Hinnanttemplate <class _T1, class _D1>
195067f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
195167f39647SHoward Hinnantbool
195267f39647SHoward Hinnantoperator<=(const unique_ptr<_T1, _D1>& __x, nullptr_t)
195367f39647SHoward Hinnant{
195467f39647SHoward Hinnant    return !(nullptr < __x);
195567f39647SHoward Hinnant}
195667f39647SHoward Hinnant
195767f39647SHoward Hinnanttemplate <class _T1, class _D1>
195867f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
195967f39647SHoward Hinnantbool
196067f39647SHoward Hinnantoperator<=(nullptr_t, const unique_ptr<_T1, _D1>& __x)
196167f39647SHoward Hinnant{
196267f39647SHoward Hinnant    return !(__x < nullptr);
196367f39647SHoward Hinnant}
196467f39647SHoward Hinnant
196567f39647SHoward Hinnanttemplate <class _T1, class _D1>
196667f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
196767f39647SHoward Hinnantbool
196867f39647SHoward Hinnantoperator>=(const unique_ptr<_T1, _D1>& __x, nullptr_t)
196967f39647SHoward Hinnant{
197067f39647SHoward Hinnant    return !(__x < nullptr);
197167f39647SHoward Hinnant}
197267f39647SHoward Hinnant
197367f39647SHoward Hinnanttemplate <class _T1, class _D1>
197467f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
197567f39647SHoward Hinnantbool
197667f39647SHoward Hinnantoperator>=(nullptr_t, const unique_ptr<_T1, _D1>& __x)
197767f39647SHoward Hinnant{
197867f39647SHoward Hinnant    return !(nullptr < __x);
197967f39647SHoward Hinnant}
198067f39647SHoward Hinnant
198128d8ba5fSMarshall Clow#if _LIBCPP_STD_VER > 11
198228d8ba5fSMarshall Clow
198328d8ba5fSMarshall Clowtemplate<class _Tp>
198428d8ba5fSMarshall Clowstruct __unique_if
198528d8ba5fSMarshall Clow{
198628d8ba5fSMarshall Clow    typedef unique_ptr<_Tp> __unique_single;
198728d8ba5fSMarshall Clow};
198828d8ba5fSMarshall Clow
198928d8ba5fSMarshall Clowtemplate<class _Tp>
199028d8ba5fSMarshall Clowstruct __unique_if<_Tp[]>
199128d8ba5fSMarshall Clow{
199228d8ba5fSMarshall Clow    typedef unique_ptr<_Tp[]> __unique_array_unknown_bound;
199328d8ba5fSMarshall Clow};
199428d8ba5fSMarshall Clow
199528d8ba5fSMarshall Clowtemplate<class _Tp, size_t _Np>
199628d8ba5fSMarshall Clowstruct __unique_if<_Tp[_Np]>
199728d8ba5fSMarshall Clow{
199828d8ba5fSMarshall Clow    typedef void __unique_array_known_bound;
199928d8ba5fSMarshall Clow};
200028d8ba5fSMarshall Clow
200128d8ba5fSMarshall Clowtemplate<class _Tp, class... _Args>
200295ddb530SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
200328d8ba5fSMarshall Clowtypename __unique_if<_Tp>::__unique_single
200428d8ba5fSMarshall Clowmake_unique(_Args&&... __args)
200528d8ba5fSMarshall Clow{
200628d8ba5fSMarshall Clow    return unique_ptr<_Tp>(new _Tp(_VSTD::forward<_Args>(__args)...));
200728d8ba5fSMarshall Clow}
200828d8ba5fSMarshall Clow
200928d8ba5fSMarshall Clowtemplate<class _Tp>
201095ddb530SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
201128d8ba5fSMarshall Clowtypename __unique_if<_Tp>::__unique_array_unknown_bound
201228d8ba5fSMarshall Clowmake_unique(size_t __n)
201328d8ba5fSMarshall Clow{
201428d8ba5fSMarshall Clow    typedef typename remove_extent<_Tp>::type _Up;
201528d8ba5fSMarshall Clow    return unique_ptr<_Tp>(new _Up[__n]());
201628d8ba5fSMarshall Clow}
201728d8ba5fSMarshall Clow
201828d8ba5fSMarshall Clowtemplate<class _Tp, class... _Args>
201928d8ba5fSMarshall Clow    typename __unique_if<_Tp>::__unique_array_known_bound
202028d8ba5fSMarshall Clow    make_unique(_Args&&...) = delete;
202128d8ba5fSMarshall Clow
202228d8ba5fSMarshall Clow#endif  // _LIBCPP_STD_VER > 11
202328d8ba5fSMarshall Clow
2024d1803b6cSHoward Hinnanttemplate <class _Tp, class _Dp>
2025f9127593SEric Fiselier#ifdef _LIBCPP_CXX03_LANG
2026e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS hash<unique_ptr<_Tp, _Dp> >
2027f9127593SEric Fiselier#else
2028f9127593SEric Fiselierstruct _LIBCPP_TEMPLATE_VIS hash<__enable_hash_helper<
2029f9127593SEric Fiselier    unique_ptr<_Tp, _Dp>, typename unique_ptr<_Tp, _Dp>::pointer> >
2030f9127593SEric Fiselier#endif
2031d1803b6cSHoward Hinnant{
2032d1803b6cSHoward Hinnant    typedef unique_ptr<_Tp, _Dp> argument_type;
2033d1803b6cSHoward Hinnant    typedef size_t               result_type;
2034848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20357c803385SMarshall Clow    result_type operator()(const argument_type& __ptr) const
2036d1803b6cSHoward Hinnant    {
2037d1803b6cSHoward Hinnant        typedef typename argument_type::pointer pointer;
2038d1803b6cSHoward Hinnant        return hash<pointer>()(__ptr.get());
2039d1803b6cSHoward Hinnant    }
2040d1803b6cSHoward Hinnant};
2041d1803b6cSHoward Hinnant
20423e519524SHoward Hinnantstruct __destruct_n
20433e519524SHoward Hinnant{
20443e519524SHoward Hinnantprivate:
20459ffacf3dSEric Fiselier    size_t __size_;
20463e519524SHoward Hinnant
20473e519524SHoward Hinnant    template <class _Tp>
20483739fe79SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY void __process(_Tp* __p, false_type) _NOEXCEPT
20499ffacf3dSEric Fiselier        {for (size_t __i = 0; __i < __size_; ++__i, ++__p) __p->~_Tp();}
20503e519524SHoward Hinnant
20513e519524SHoward Hinnant    template <class _Tp>
20523739fe79SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY void __process(_Tp*, true_type) _NOEXCEPT
20533e519524SHoward Hinnant        {}
20543e519524SHoward Hinnant
20553739fe79SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY void __incr(false_type) _NOEXCEPT
20569ffacf3dSEric Fiselier        {++__size_;}
20573739fe79SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY void __incr(true_type) _NOEXCEPT
20583e519524SHoward Hinnant        {}
20593e519524SHoward Hinnant
20603739fe79SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY void __set(size_t __s, false_type) _NOEXCEPT
20619ffacf3dSEric Fiselier        {__size_ = __s;}
20623739fe79SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY void __set(size_t, true_type) _NOEXCEPT
20633e519524SHoward Hinnant        {}
20643e519524SHoward Hinnantpublic:
20653739fe79SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY explicit __destruct_n(size_t __s) _NOEXCEPT
20669ffacf3dSEric Fiselier        : __size_(__s) {}
20673e519524SHoward Hinnant
20683e519524SHoward Hinnant    template <class _Tp>
2069527a7fdfSBruce Mitchener    _LIBCPP_INLINE_VISIBILITY void __incr() _NOEXCEPT
2070ca740483SHoward Hinnant        {__incr(integral_constant<bool, is_trivially_destructible<_Tp>::value>());}
20713e519524SHoward Hinnant
20723e519524SHoward Hinnant    template <class _Tp>
20733739fe79SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY void __set(size_t __s, _Tp*) _NOEXCEPT
2074ca740483SHoward Hinnant        {__set(__s, integral_constant<bool, is_trivially_destructible<_Tp>::value>());}
20753e519524SHoward Hinnant
20763e519524SHoward Hinnant    template <class _Tp>
20773739fe79SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __p) _NOEXCEPT
2078ca740483SHoward Hinnant        {__process(__p, integral_constant<bool, is_trivially_destructible<_Tp>::value>());}
20793e519524SHoward Hinnant};
20803e519524SHoward Hinnant
20813e519524SHoward Hinnanttemplate <class _Alloc>
20823e519524SHoward Hinnantclass __allocator_destructor
20833e519524SHoward Hinnant{
208414d48692SEric Fiselier    typedef _LIBCPP_NODEBUG_TYPE allocator_traits<_Alloc> __alloc_traits;
20853e519524SHoward Hinnantpublic:
208614d48692SEric Fiselier    typedef _LIBCPP_NODEBUG_TYPE typename __alloc_traits::pointer pointer;
208714d48692SEric Fiselier    typedef _LIBCPP_NODEBUG_TYPE typename __alloc_traits::size_type size_type;
20883e519524SHoward Hinnantprivate:
20893e519524SHoward Hinnant    _Alloc& __alloc_;
20903e519524SHoward Hinnant    size_type __s_;
20913e519524SHoward Hinnantpublic:
20923e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __allocator_destructor(_Alloc& __a, size_type __s)
20933739fe79SHoward Hinnant             _NOEXCEPT
20943e519524SHoward Hinnant        : __alloc_(__a), __s_(__s) {}
2095848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20963739fe79SHoward Hinnant    void operator()(pointer __p) _NOEXCEPT
20973739fe79SHoward Hinnant        {__alloc_traits::deallocate(__alloc_, __p, __s_);}
20983e519524SHoward Hinnant};
20993e519524SHoward Hinnant
21003e519524SHoward Hinnanttemplate <class _InputIterator, class _ForwardIterator>
21013e519524SHoward Hinnant_ForwardIterator
21023e519524SHoward Hinnantuninitialized_copy(_InputIterator __f, _InputIterator __l, _ForwardIterator __r)
21033e519524SHoward Hinnant{
21043e519524SHoward Hinnant    typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
2105b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
2106b34b4819SHoward Hinnant    _ForwardIterator __s = __r;
2107b34b4819SHoward Hinnant    try
2108b34b4819SHoward Hinnant    {
2109b34b4819SHoward Hinnant#endif
2110a00932bdSMarshall Clow        for (; __f != __l; ++__f, (void) ++__r)
2111be4c657bSArthur O'Dwyer            ::new ((void*)_VSTD::addressof(*__r)) value_type(*__f);
2112b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
2113b34b4819SHoward Hinnant    }
2114b34b4819SHoward Hinnant    catch (...)
2115b34b4819SHoward Hinnant    {
2116b34b4819SHoward Hinnant        for (; __s != __r; ++__s)
2117b34b4819SHoward Hinnant            __s->~value_type();
2118b34b4819SHoward Hinnant        throw;
2119b34b4819SHoward Hinnant    }
2120b34b4819SHoward Hinnant#endif
21213e519524SHoward Hinnant    return __r;
21223e519524SHoward Hinnant}
21233e519524SHoward Hinnant
21243e519524SHoward Hinnanttemplate <class _InputIterator, class _Size, class _ForwardIterator>
21253e519524SHoward Hinnant_ForwardIterator
21263e519524SHoward Hinnantuninitialized_copy_n(_InputIterator __f, _Size __n, _ForwardIterator __r)
21273e519524SHoward Hinnant{
21283e519524SHoward Hinnant    typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
2129b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
2130b34b4819SHoward Hinnant    _ForwardIterator __s = __r;
2131b34b4819SHoward Hinnant    try
2132b34b4819SHoward Hinnant    {
2133b34b4819SHoward Hinnant#endif
2134a00932bdSMarshall Clow        for (; __n > 0; ++__f, (void) ++__r, (void) --__n)
2135be4c657bSArthur O'Dwyer            ::new ((void*)_VSTD::addressof(*__r)) value_type(*__f);
2136b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
2137b34b4819SHoward Hinnant    }
2138b34b4819SHoward Hinnant    catch (...)
2139b34b4819SHoward Hinnant    {
2140b34b4819SHoward Hinnant        for (; __s != __r; ++__s)
2141b34b4819SHoward Hinnant            __s->~value_type();
2142b34b4819SHoward Hinnant        throw;
2143b34b4819SHoward Hinnant    }
2144b34b4819SHoward Hinnant#endif
21453e519524SHoward Hinnant    return __r;
21463e519524SHoward Hinnant}
21473e519524SHoward Hinnant
21483e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Tp>
21493e519524SHoward Hinnantvoid
21503e519524SHoward Hinnantuninitialized_fill(_ForwardIterator __f, _ForwardIterator __l, const _Tp& __x)
21513e519524SHoward Hinnant{
21523e519524SHoward Hinnant    typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
2153b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
2154b34b4819SHoward Hinnant    _ForwardIterator __s = __f;
2155b34b4819SHoward Hinnant    try
2156b34b4819SHoward Hinnant    {
2157b34b4819SHoward Hinnant#endif
2158b34b4819SHoward Hinnant        for (; __f != __l; ++__f)
2159be4c657bSArthur O'Dwyer            ::new ((void*)_VSTD::addressof(*__f)) value_type(__x);
2160b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
2161b34b4819SHoward Hinnant    }
2162b34b4819SHoward Hinnant    catch (...)
2163b34b4819SHoward Hinnant    {
2164b34b4819SHoward Hinnant        for (; __s != __f; ++__s)
2165b34b4819SHoward Hinnant            __s->~value_type();
2166b34b4819SHoward Hinnant        throw;
2167b34b4819SHoward Hinnant    }
2168b34b4819SHoward Hinnant#endif
21693e519524SHoward Hinnant}
21703e519524SHoward Hinnant
21713e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Size, class _Tp>
217248d05bd2SHoward Hinnant_ForwardIterator
21733e519524SHoward Hinnantuninitialized_fill_n(_ForwardIterator __f, _Size __n, const _Tp& __x)
21743e519524SHoward Hinnant{
21753e519524SHoward Hinnant    typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
2176b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
2177b34b4819SHoward Hinnant    _ForwardIterator __s = __f;
2178b34b4819SHoward Hinnant    try
2179b34b4819SHoward Hinnant    {
2180b34b4819SHoward Hinnant#endif
2181a00932bdSMarshall Clow        for (; __n > 0; ++__f, (void) --__n)
2182be4c657bSArthur O'Dwyer            ::new ((void*)_VSTD::addressof(*__f)) value_type(__x);
2183b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
2184b34b4819SHoward Hinnant    }
2185b34b4819SHoward Hinnant    catch (...)
2186b34b4819SHoward Hinnant    {
2187b34b4819SHoward Hinnant        for (; __s != __f; ++__s)
2188b34b4819SHoward Hinnant            __s->~value_type();
2189b34b4819SHoward Hinnant        throw;
2190b34b4819SHoward Hinnant    }
2191b34b4819SHoward Hinnant#endif
219248d05bd2SHoward Hinnant    return __f;
21933e519524SHoward Hinnant}
21943e519524SHoward Hinnant
2195e4d9c316SEric Fiselier#if _LIBCPP_STD_VER > 14
2196e4d9c316SEric Fiselier
2197e4d9c316SEric Fiseliertemplate <class _ForwardIterator>
21980724f8bfSLouis Dionneinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
2199e4d9c316SEric Fiseliervoid destroy(_ForwardIterator __first, _ForwardIterator __last) {
2200e4d9c316SEric Fiselier    for (; __first != __last; ++__first)
2201e4d9c316SEric Fiselier        _VSTD::destroy_at(_VSTD::addressof(*__first));
2202e4d9c316SEric Fiselier}
2203e4d9c316SEric Fiselier
2204e4d9c316SEric Fiseliertemplate <class _ForwardIterator, class _Size>
22050724f8bfSLouis Dionneinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
2206e4d9c316SEric Fiselier_ForwardIterator destroy_n(_ForwardIterator __first, _Size __n) {
2207e4d9c316SEric Fiselier    for (; __n > 0; (void)++__first, --__n)
2208e4d9c316SEric Fiselier        _VSTD::destroy_at(_VSTD::addressof(*__first));
2209e4d9c316SEric Fiselier    return __first;
2210e4d9c316SEric Fiselier}
2211e4d9c316SEric Fiselier
2212e778d10cSEric Fiseliertemplate <class _ForwardIterator>
2213e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY
2214e778d10cSEric Fiseliervoid uninitialized_default_construct(_ForwardIterator __first, _ForwardIterator __last) {
2215e778d10cSEric Fiselier    using _Vt = typename iterator_traits<_ForwardIterator>::value_type;
2216e778d10cSEric Fiselier    auto __idx = __first;
2217e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS
2218e778d10cSEric Fiselier    try {
2219e778d10cSEric Fiselier#endif
2220e778d10cSEric Fiselier    for (; __idx != __last; ++__idx)
2221e778d10cSEric Fiselier        ::new ((void*)_VSTD::addressof(*__idx)) _Vt;
2222e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS
2223e778d10cSEric Fiselier    } catch (...) {
2224e778d10cSEric Fiselier        _VSTD::destroy(__first, __idx);
2225e778d10cSEric Fiselier        throw;
2226e778d10cSEric Fiselier    }
2227e778d10cSEric Fiselier#endif
2228e778d10cSEric Fiselier}
2229e778d10cSEric Fiselier
2230e778d10cSEric Fiseliertemplate <class _ForwardIterator, class _Size>
2231e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY
2232e778d10cSEric Fiselier_ForwardIterator uninitialized_default_construct_n(_ForwardIterator __first, _Size __n) {
2233e778d10cSEric Fiselier    using _Vt = typename iterator_traits<_ForwardIterator>::value_type;
2234e778d10cSEric Fiselier    auto __idx = __first;
2235e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS
2236e778d10cSEric Fiselier    try {
2237e778d10cSEric Fiselier#endif
2238e778d10cSEric Fiselier    for (; __n > 0; (void)++__idx, --__n)
2239e778d10cSEric Fiselier        ::new ((void*)_VSTD::addressof(*__idx)) _Vt;
2240e778d10cSEric Fiselier    return __idx;
2241e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS
2242e778d10cSEric Fiselier    } catch (...) {
2243e778d10cSEric Fiselier        _VSTD::destroy(__first, __idx);
2244e778d10cSEric Fiselier        throw;
2245e778d10cSEric Fiselier    }
2246e778d10cSEric Fiselier#endif
2247e778d10cSEric Fiselier}
2248e778d10cSEric Fiselier
2249e778d10cSEric Fiselier
2250e778d10cSEric Fiseliertemplate <class _ForwardIterator>
2251e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY
2252e778d10cSEric Fiseliervoid uninitialized_value_construct(_ForwardIterator __first, _ForwardIterator __last) {
2253e778d10cSEric Fiselier    using _Vt = typename iterator_traits<_ForwardIterator>::value_type;
2254e778d10cSEric Fiselier    auto __idx = __first;
2255e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS
2256e778d10cSEric Fiselier    try {
2257e778d10cSEric Fiselier#endif
2258e778d10cSEric Fiselier    for (; __idx != __last; ++__idx)
2259e778d10cSEric Fiselier        ::new ((void*)_VSTD::addressof(*__idx)) _Vt();
2260e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS
2261e778d10cSEric Fiselier    } catch (...) {
2262e778d10cSEric Fiselier        _VSTD::destroy(__first, __idx);
2263e778d10cSEric Fiselier        throw;
2264e778d10cSEric Fiselier    }
2265e778d10cSEric Fiselier#endif
2266e778d10cSEric Fiselier}
2267e778d10cSEric Fiselier
2268e778d10cSEric Fiseliertemplate <class _ForwardIterator, class _Size>
2269e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY
2270e778d10cSEric Fiselier_ForwardIterator uninitialized_value_construct_n(_ForwardIterator __first, _Size __n) {
2271e778d10cSEric Fiselier    using _Vt = typename iterator_traits<_ForwardIterator>::value_type;
2272e778d10cSEric Fiselier    auto __idx = __first;
2273e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS
2274e778d10cSEric Fiselier    try {
2275e778d10cSEric Fiselier#endif
2276e778d10cSEric Fiselier    for (; __n > 0; (void)++__idx, --__n)
2277e778d10cSEric Fiselier        ::new ((void*)_VSTD::addressof(*__idx)) _Vt();
2278e778d10cSEric Fiselier    return __idx;
2279e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS
2280e778d10cSEric Fiselier    } catch (...) {
2281e778d10cSEric Fiselier        _VSTD::destroy(__first, __idx);
2282e778d10cSEric Fiselier        throw;
2283e778d10cSEric Fiselier    }
2284e778d10cSEric Fiselier#endif
2285e778d10cSEric Fiselier}
2286e778d10cSEric Fiselier
2287e778d10cSEric Fiselier
2288e778d10cSEric Fiseliertemplate <class _InputIt, class _ForwardIt>
2289e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY
2290e778d10cSEric Fiselier_ForwardIt uninitialized_move(_InputIt __first, _InputIt __last, _ForwardIt __first_res) {
2291e778d10cSEric Fiselier    using _Vt = typename iterator_traits<_ForwardIt>::value_type;
2292e778d10cSEric Fiselier    auto __idx = __first_res;
2293e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS
2294e778d10cSEric Fiselier    try {
2295e778d10cSEric Fiselier#endif
2296e778d10cSEric Fiselier    for (; __first != __last; (void)++__idx, ++__first)
2297d586f92cSArthur O'Dwyer        ::new ((void*)_VSTD::addressof(*__idx)) _Vt(_VSTD::move(*__first));
2298e778d10cSEric Fiselier    return __idx;
2299e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS
2300e778d10cSEric Fiselier    } catch (...) {
2301e778d10cSEric Fiselier        _VSTD::destroy(__first_res, __idx);
2302e778d10cSEric Fiselier        throw;
2303e778d10cSEric Fiselier    }
2304e778d10cSEric Fiselier#endif
2305e778d10cSEric Fiselier}
2306e778d10cSEric Fiselier
2307e778d10cSEric Fiseliertemplate <class _InputIt, class _Size, class _ForwardIt>
2308e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY
2309e778d10cSEric Fiselierpair<_InputIt, _ForwardIt>
2310e778d10cSEric Fiselieruninitialized_move_n(_InputIt __first, _Size __n, _ForwardIt __first_res) {
2311e778d10cSEric Fiselier    using _Vt = typename iterator_traits<_ForwardIt>::value_type;
2312e778d10cSEric Fiselier    auto __idx = __first_res;
2313e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS
2314e778d10cSEric Fiselier    try {
2315e778d10cSEric Fiselier#endif
2316e778d10cSEric Fiselier    for (; __n > 0; ++__idx, (void)++__first, --__n)
2317d586f92cSArthur O'Dwyer        ::new ((void*)_VSTD::addressof(*__idx)) _Vt(_VSTD::move(*__first));
2318e778d10cSEric Fiselier    return {__first, __idx};
2319e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS
2320e778d10cSEric Fiselier    } catch (...) {
2321e778d10cSEric Fiselier        _VSTD::destroy(__first_res, __idx);
2322e778d10cSEric Fiselier        throw;
2323e778d10cSEric Fiselier    }
2324e778d10cSEric Fiselier#endif
2325e778d10cSEric Fiselier}
2326e778d10cSEric Fiselier
2327e778d10cSEric Fiselier
2328e4d9c316SEric Fiselier#endif // _LIBCPP_STD_VER > 14
2329e4d9c316SEric Fiselier
2330f08de52dSKevin Hu// NOTE: Relaxed and acq/rel atomics (for increment and decrement respectively)
2331f08de52dSKevin Hu// should be sufficient for thread safety.
23323c35491fSEric Fiselier// See https://bugs.llvm.org/show_bug.cgi?id=22803
2333f08de52dSKevin Hu#if defined(__clang__) && __has_builtin(__atomic_add_fetch)          \
2334f08de52dSKevin Hu                       && defined(__ATOMIC_RELAXED)                  \
2335f08de52dSKevin Hu                       && defined(__ATOMIC_ACQ_REL)
2336f08de52dSKevin Hu#   define _LIBCPP_HAS_BUILTIN_ATOMIC_SUPPORT
2337ae62727aSRichard Smith#elif defined(_LIBCPP_COMPILER_GCC)
2338f08de52dSKevin Hu#   define _LIBCPP_HAS_BUILTIN_ATOMIC_SUPPORT
2339f08de52dSKevin Hu#endif
2340f08de52dSKevin Hu
2341f08de52dSKevin Hutemplate <class _Tp>
2342f08de52dSKevin Huinline _LIBCPP_INLINE_VISIBILITY _Tp
2343f08de52dSKevin Hu__libcpp_atomic_refcount_increment(_Tp& __t) _NOEXCEPT
2344f08de52dSKevin Hu{
2345f08de52dSKevin Hu#if defined(_LIBCPP_HAS_BUILTIN_ATOMIC_SUPPORT) && !defined(_LIBCPP_HAS_NO_THREADS)
2346f08de52dSKevin Hu    return __atomic_add_fetch(&__t, 1, __ATOMIC_RELAXED);
2347f08de52dSKevin Hu#else
2348f08de52dSKevin Hu    return __t += 1;
2349f08de52dSKevin Hu#endif
2350f08de52dSKevin Hu}
2351f08de52dSKevin Hu
2352f08de52dSKevin Hutemplate <class _Tp>
2353f08de52dSKevin Huinline _LIBCPP_INLINE_VISIBILITY _Tp
2354f08de52dSKevin Hu__libcpp_atomic_refcount_decrement(_Tp& __t) _NOEXCEPT
2355f08de52dSKevin Hu{
2356f08de52dSKevin Hu#if defined(_LIBCPP_HAS_BUILTIN_ATOMIC_SUPPORT) && !defined(_LIBCPP_HAS_NO_THREADS)
2357f08de52dSKevin Hu    return __atomic_add_fetch(&__t, -1, __ATOMIC_ACQ_REL);
2358f08de52dSKevin Hu#else
2359f08de52dSKevin Hu    return __t -= 1;
2360f08de52dSKevin Hu#endif
2361f08de52dSKevin Hu}
2362f08de52dSKevin Hu
2363848a5374SHoward Hinnantclass _LIBCPP_EXCEPTION_ABI bad_weak_ptr
23643e519524SHoward Hinnant    : public std::exception
23653e519524SHoward Hinnant{
23663e519524SHoward Hinnantpublic:
2367585a3cc3SDimitry Andric    bad_weak_ptr() _NOEXCEPT = default;
2368585a3cc3SDimitry Andric    bad_weak_ptr(const bad_weak_ptr&) _NOEXCEPT = default;
23693739fe79SHoward Hinnant    virtual ~bad_weak_ptr() _NOEXCEPT;
23703739fe79SHoward Hinnant    virtual const char* what() const  _NOEXCEPT;
23713e519524SHoward Hinnant};
23723e519524SHoward Hinnant
2373dc7200b4SLouis Dionne_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
2374d437fa5cSMarshall Clowvoid __throw_bad_weak_ptr()
2375d437fa5cSMarshall Clow{
2376d437fa5cSMarshall Clow#ifndef _LIBCPP_NO_EXCEPTIONS
2377d437fa5cSMarshall Clow    throw bad_weak_ptr();
2378d437fa5cSMarshall Clow#else
2379d437fa5cSMarshall Clow    _VSTD::abort();
2380d437fa5cSMarshall Clow#endif
2381d437fa5cSMarshall Clow}
2382d437fa5cSMarshall Clow
2383e2f2d1edSEric Fiseliertemplate<class _Tp> class _LIBCPP_TEMPLATE_VIS weak_ptr;
23843e519524SHoward Hinnant
2385f0544c20SHoward Hinnantclass _LIBCPP_TYPE_VIS __shared_count
23863e519524SHoward Hinnant{
23873e519524SHoward Hinnant    __shared_count(const __shared_count&);
23883e519524SHoward Hinnant    __shared_count& operator=(const __shared_count&);
23893e519524SHoward Hinnant
23903e519524SHoward Hinnantprotected:
23913e519524SHoward Hinnant    long __shared_owners_;
23923e519524SHoward Hinnant    virtual ~__shared_count();
23933e519524SHoward Hinnantprivate:
23943739fe79SHoward Hinnant    virtual void __on_zero_shared() _NOEXCEPT = 0;
23953e519524SHoward Hinnant
23963e519524SHoward Hinnantpublic:
2397848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
23983739fe79SHoward Hinnant    explicit __shared_count(long __refs = 0) _NOEXCEPT
23993e519524SHoward Hinnant        : __shared_owners_(__refs) {}
24003e519524SHoward Hinnant
2401c8e84ff2SLouis Dionne#if defined(_LIBCPP_BUILDING_LIBRARY) && \
240211f60453SEric Fiselier    defined(_LIBCPP_DEPRECATED_ABI_LEGACY_LIBRARY_DEFINITIONS_FOR_INLINE_FUNCTIONS)
2403a480c28bSEric Fiselier    void __add_shared() _NOEXCEPT;
2404a480c28bSEric Fiselier    bool __release_shared() _NOEXCEPT;
2405f08de52dSKevin Hu#else
2406f08de52dSKevin Hu    _LIBCPP_INLINE_VISIBILITY
2407f08de52dSKevin Hu    void __add_shared() _NOEXCEPT {
2408f08de52dSKevin Hu      __libcpp_atomic_refcount_increment(__shared_owners_);
2409f08de52dSKevin Hu    }
2410f08de52dSKevin Hu    _LIBCPP_INLINE_VISIBILITY
2411f08de52dSKevin Hu    bool __release_shared() _NOEXCEPT {
2412f08de52dSKevin Hu      if (__libcpp_atomic_refcount_decrement(__shared_owners_) == -1) {
2413f08de52dSKevin Hu        __on_zero_shared();
2414f08de52dSKevin Hu        return true;
2415f08de52dSKevin Hu      }
2416f08de52dSKevin Hu      return false;
2417f08de52dSKevin Hu    }
2418f08de52dSKevin Hu#endif
2419848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
24201faf289eSEric Fiselier    long use_count() const _NOEXCEPT {
24211faf289eSEric Fiselier        return __libcpp_relaxed_load(&__shared_owners_) + 1;
24221faf289eSEric Fiselier    }
24233e519524SHoward Hinnant};
24243e519524SHoward Hinnant
2425f0544c20SHoward Hinnantclass _LIBCPP_TYPE_VIS __shared_weak_count
24263e519524SHoward Hinnant    : private __shared_count
24273e519524SHoward Hinnant{
24283e519524SHoward Hinnant    long __shared_weak_owners_;
24293e519524SHoward Hinnant
24303e519524SHoward Hinnantpublic:
2431848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
24323739fe79SHoward Hinnant    explicit __shared_weak_count(long __refs = 0) _NOEXCEPT
24333e519524SHoward Hinnant        : __shared_count(__refs),
24343e519524SHoward Hinnant          __shared_weak_owners_(__refs) {}
24353e519524SHoward Hinnantprotected:
24363e519524SHoward Hinnant    virtual ~__shared_weak_count();
24373e519524SHoward Hinnant
24383e519524SHoward Hinnantpublic:
2439c8e84ff2SLouis Dionne#if defined(_LIBCPP_BUILDING_LIBRARY) && \
244011f60453SEric Fiselier    defined(_LIBCPP_DEPRECATED_ABI_LEGACY_LIBRARY_DEFINITIONS_FOR_INLINE_FUNCTIONS)
2441a480c28bSEric Fiselier    void __add_shared() _NOEXCEPT;
2442a480c28bSEric Fiselier    void __add_weak() _NOEXCEPT;
2443a480c28bSEric Fiselier    void __release_shared() _NOEXCEPT;
2444f08de52dSKevin Hu#else
2445f08de52dSKevin Hu    _LIBCPP_INLINE_VISIBILITY
2446f08de52dSKevin Hu    void __add_shared() _NOEXCEPT {
2447f08de52dSKevin Hu      __shared_count::__add_shared();
2448f08de52dSKevin Hu    }
2449f08de52dSKevin Hu    _LIBCPP_INLINE_VISIBILITY
2450f08de52dSKevin Hu    void __add_weak() _NOEXCEPT {
2451f08de52dSKevin Hu      __libcpp_atomic_refcount_increment(__shared_weak_owners_);
2452f08de52dSKevin Hu    }
2453f08de52dSKevin Hu    _LIBCPP_INLINE_VISIBILITY
2454f08de52dSKevin Hu    void __release_shared() _NOEXCEPT {
2455f08de52dSKevin Hu      if (__shared_count::__release_shared())
2456f08de52dSKevin Hu        __release_weak();
2457f08de52dSKevin Hu    }
2458f08de52dSKevin Hu#endif
24593739fe79SHoward Hinnant    void __release_weak() _NOEXCEPT;
2460848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
24613739fe79SHoward Hinnant    long use_count() const _NOEXCEPT {return __shared_count::use_count();}
24623739fe79SHoward Hinnant    __shared_weak_count* lock() _NOEXCEPT;
24633e519524SHoward Hinnant
24643739fe79SHoward Hinnant    virtual const void* __get_deleter(const type_info&) const _NOEXCEPT;
24653e519524SHoward Hinnantprivate:
24663739fe79SHoward Hinnant    virtual void __on_zero_shared_weak() _NOEXCEPT = 0;
24673e519524SHoward Hinnant};
24683e519524SHoward Hinnant
24693e519524SHoward Hinnanttemplate <class _Tp, class _Dp, class _Alloc>
24703e519524SHoward Hinnantclass __shared_ptr_pointer
24713e519524SHoward Hinnant    : public __shared_weak_count
24723e519524SHoward Hinnant{
24733e519524SHoward Hinnant    __compressed_pair<__compressed_pair<_Tp, _Dp>, _Alloc> __data_;
24743e519524SHoward Hinnantpublic:
2475848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
24763e519524SHoward Hinnant    __shared_ptr_pointer(_Tp __p, _Dp __d, _Alloc __a)
2477ce48a113SHoward Hinnant        :  __data_(__compressed_pair<_Tp, _Dp>(__p, _VSTD::move(__d)), _VSTD::move(__a)) {}
24783e519524SHoward Hinnant
247954b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI
24803739fe79SHoward Hinnant    virtual const void* __get_deleter(const type_info&) const _NOEXCEPT;
248154b409fdSHoward Hinnant#endif
24823e519524SHoward Hinnant
24833e519524SHoward Hinnantprivate:
24843739fe79SHoward Hinnant    virtual void __on_zero_shared() _NOEXCEPT;
24853739fe79SHoward Hinnant    virtual void __on_zero_shared_weak() _NOEXCEPT;
24863e519524SHoward Hinnant};
24873e519524SHoward Hinnant
248854b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI
248954b409fdSHoward Hinnant
24903e519524SHoward Hinnanttemplate <class _Tp, class _Dp, class _Alloc>
24913e519524SHoward Hinnantconst void*
24923739fe79SHoward Hinnant__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__get_deleter(const type_info& __t) const _NOEXCEPT
24933e519524SHoward Hinnant{
24949c973b9fSEric Fiselier    return __t == typeid(_Dp) ? _VSTD::addressof(__data_.first().second()) : nullptr;
24953e519524SHoward Hinnant}
24963e519524SHoward Hinnant
2497b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_RTTI
249854b409fdSHoward Hinnant
24993e519524SHoward Hinnanttemplate <class _Tp, class _Dp, class _Alloc>
25003e519524SHoward Hinnantvoid
25013739fe79SHoward Hinnant__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__on_zero_shared() _NOEXCEPT
25023e519524SHoward Hinnant{
25033e519524SHoward Hinnant    __data_.first().second()(__data_.first().first());
25043e519524SHoward Hinnant    __data_.first().second().~_Dp();
25053e519524SHoward Hinnant}
25063e519524SHoward Hinnant
25073e519524SHoward Hinnanttemplate <class _Tp, class _Dp, class _Alloc>
25083e519524SHoward Hinnantvoid
25093739fe79SHoward Hinnant__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__on_zero_shared_weak() _NOEXCEPT
25103e519524SHoward Hinnant{
25116fe361c1SEric Fiselier    typedef typename __allocator_traits_rebind<_Alloc, __shared_ptr_pointer>::type _Al;
25126fe361c1SEric Fiselier    typedef allocator_traits<_Al> _ATraits;
2513319be722SEric Fiselier    typedef pointer_traits<typename _ATraits::pointer> _PTraits;
2514319be722SEric Fiselier
25156fe361c1SEric Fiselier    _Al __a(__data_.second());
25163e519524SHoward Hinnant    __data_.second().~_Alloc();
2517319be722SEric Fiselier    __a.deallocate(_PTraits::pointer_to(*this), 1);
25183e519524SHoward Hinnant}
25193e519524SHoward Hinnant
25203e519524SHoward Hinnanttemplate <class _Tp, class _Alloc>
2521092e8a7eSLouis Dionnestruct __shared_ptr_emplace
2522092e8a7eSLouis Dionne    : __shared_weak_count
25233e519524SHoward Hinnant{
2524092e8a7eSLouis Dionne    template<class ..._Args>
2525092e8a7eSLouis Dionne    _LIBCPP_HIDE_FROM_ABI
2526092e8a7eSLouis Dionne    explicit __shared_ptr_emplace(_Alloc __a, _Args&& ...__args)
2527955dd7b7SLouis Dionne        : __storage_(_VSTD::move(__a))
2528955dd7b7SLouis Dionne    {
2529955dd7b7SLouis Dionne#if _LIBCPP_STD_VER > 17
2530955dd7b7SLouis Dionne        using _TpAlloc = typename __allocator_traits_rebind<_Alloc, _Tp>::type;
2531955dd7b7SLouis Dionne        _TpAlloc __tmp(*__get_alloc());
2532955dd7b7SLouis Dionne        allocator_traits<_TpAlloc>::construct(__tmp, __get_elem(), _VSTD::forward<_Args>(__args)...);
2533a3c28ccdSLouis Dionne#else
2534955dd7b7SLouis Dionne        ::new ((void*)__get_elem()) _Tp(_VSTD::forward<_Args>(__args)...);
2535a3c28ccdSLouis Dionne#endif
2536955dd7b7SLouis Dionne    }
2537092e8a7eSLouis Dionne
2538092e8a7eSLouis Dionne    _LIBCPP_HIDE_FROM_ABI
2539955dd7b7SLouis Dionne    _Alloc* __get_alloc() _NOEXCEPT { return __storage_.__get_alloc(); }
2540092e8a7eSLouis Dionne
2541092e8a7eSLouis Dionne    _LIBCPP_HIDE_FROM_ABI
2542955dd7b7SLouis Dionne    _Tp* __get_elem() _NOEXCEPT { return __storage_.__get_elem(); }
25433e519524SHoward Hinnant
25443e519524SHoward Hinnantprivate:
2545092e8a7eSLouis Dionne    virtual void __on_zero_shared() _NOEXCEPT {
2546955dd7b7SLouis Dionne#if _LIBCPP_STD_VER > 17
2547955dd7b7SLouis Dionne        using _TpAlloc = typename __allocator_traits_rebind<_Alloc, _Tp>::type;
2548955dd7b7SLouis Dionne        _TpAlloc __tmp(*__get_alloc());
2549955dd7b7SLouis Dionne        allocator_traits<_TpAlloc>::destroy(__tmp, __get_elem());
2550955dd7b7SLouis Dionne#else
255102af1109SLouis Dionne        __get_elem()->~_Tp();
2552955dd7b7SLouis Dionne#endif
25533e519524SHoward Hinnant    }
25543e519524SHoward Hinnant
2555092e8a7eSLouis Dionne    virtual void __on_zero_shared_weak() _NOEXCEPT {
2556092e8a7eSLouis Dionne        using _ControlBlockAlloc = typename __allocator_traits_rebind<_Alloc, __shared_ptr_emplace>::type;
2557092e8a7eSLouis Dionne        using _ControlBlockPointer = typename allocator_traits<_ControlBlockAlloc>::pointer;
25583b7280f5SLouis Dionne        _ControlBlockAlloc __tmp(*__get_alloc());
2559955dd7b7SLouis Dionne        __storage_.~_Storage();
2560092e8a7eSLouis Dionne        allocator_traits<_ControlBlockAlloc>::deallocate(__tmp,
2561092e8a7eSLouis Dionne            pointer_traits<_ControlBlockPointer>::pointer_to(*this), 1);
25623e519524SHoward Hinnant    }
25633e519524SHoward Hinnant
2564955dd7b7SLouis Dionne    // This class implements the control block for non-array shared pointers created
2565955dd7b7SLouis Dionne    // through `std::allocate_shared` and `std::make_shared`.
2566955dd7b7SLouis Dionne    //
2567955dd7b7SLouis Dionne    // In previous versions of the library, we used a compressed pair to store
2568955dd7b7SLouis Dionne    // both the _Alloc and the _Tp. This implies using EBO, which is incompatible
2569955dd7b7SLouis Dionne    // with Allocator construction for _Tp. To allow implementing P0674 in C++20,
2570955dd7b7SLouis Dionne    // we now use a properly aligned char buffer while making sure that we maintain
2571955dd7b7SLouis Dionne    // the same layout that we had when we used a compressed pair.
2572955dd7b7SLouis Dionne    using _CompressedPair = __compressed_pair<_Alloc, _Tp>;
2573955dd7b7SLouis Dionne    struct _ALIGNAS_TYPE(_CompressedPair) _Storage {
2574955dd7b7SLouis Dionne        char __blob_[sizeof(_CompressedPair)];
2575955dd7b7SLouis Dionne
2576955dd7b7SLouis Dionne        _LIBCPP_HIDE_FROM_ABI explicit _Storage(_Alloc&& __a) {
2577955dd7b7SLouis Dionne            ::new ((void*)__get_alloc()) _Alloc(_VSTD::move(__a));
2578955dd7b7SLouis Dionne        }
2579955dd7b7SLouis Dionne        _LIBCPP_HIDE_FROM_ABI ~_Storage() {
2580955dd7b7SLouis Dionne            __get_alloc()->~_Alloc();
2581955dd7b7SLouis Dionne        }
2582955dd7b7SLouis Dionne        _Alloc* __get_alloc() _NOEXCEPT {
2583955dd7b7SLouis Dionne            _CompressedPair *__as_pair = reinterpret_cast<_CompressedPair*>(__blob_);
2584955dd7b7SLouis Dionne            typename _CompressedPair::_Base1* __first = _CompressedPair::__get_first_base(__as_pair);
2585955dd7b7SLouis Dionne            _Alloc *__alloc = reinterpret_cast<_Alloc*>(__first);
2586955dd7b7SLouis Dionne            return __alloc;
2587955dd7b7SLouis Dionne        }
2588bab74864SReid Kleckner        _LIBCPP_NO_CFI _Tp* __get_elem() _NOEXCEPT {
2589955dd7b7SLouis Dionne            _CompressedPair *__as_pair = reinterpret_cast<_CompressedPair*>(__blob_);
2590955dd7b7SLouis Dionne            typename _CompressedPair::_Base2* __second = _CompressedPair::__get_second_base(__as_pair);
2591955dd7b7SLouis Dionne            _Tp *__elem = reinterpret_cast<_Tp*>(__second);
2592955dd7b7SLouis Dionne            return __elem;
2593955dd7b7SLouis Dionne        }
2594955dd7b7SLouis Dionne    };
2595955dd7b7SLouis Dionne
2596955dd7b7SLouis Dionne    static_assert(_LIBCPP_ALIGNOF(_Storage) == _LIBCPP_ALIGNOF(_CompressedPair), "");
2597955dd7b7SLouis Dionne    static_assert(sizeof(_Storage) == sizeof(_CompressedPair), "");
2598955dd7b7SLouis Dionne    _Storage __storage_;
2599092e8a7eSLouis Dionne};
2600092e8a7eSLouis Dionne
260172d0d603SErik Pilkingtonstruct __shared_ptr_dummy_rebind_allocator_type;
260272d0d603SErik Pilkingtontemplate <>
260372d0d603SErik Pilkingtonclass _LIBCPP_TEMPLATE_VIS allocator<__shared_ptr_dummy_rebind_allocator_type>
260472d0d603SErik Pilkington{
260572d0d603SErik Pilkingtonpublic:
260672d0d603SErik Pilkington    template <class _Other>
260772d0d603SErik Pilkington    struct rebind
260872d0d603SErik Pilkington    {
260972d0d603SErik Pilkington        typedef allocator<_Other> other;
261072d0d603SErik Pilkington    };
261172d0d603SErik Pilkington};
261272d0d603SErik Pilkington
2613e2f2d1edSEric Fiseliertemplate<class _Tp> class _LIBCPP_TEMPLATE_VIS enable_shared_from_this;
26143e519524SHoward Hinnant
2615ce195fb2Szoecarvertemplate<class _Tp, class _Up>
2616ce195fb2Szoecarverstruct __compatible_with
2617ce195fb2Szoecarver#if _LIBCPP_STD_VER > 14
2618ce195fb2Szoecarver    : is_convertible<remove_extent_t<_Tp>*, remove_extent_t<_Up>*> {};
2619ce195fb2Szoecarver#else
2620ce195fb2Szoecarver    : is_convertible<_Tp*, _Up*> {};
2621ce195fb2Szoecarver#endif // _LIBCPP_STD_VER > 14
2622ce195fb2Szoecarver
2623*dbc89028Szoecarvertemplate <class _Dp, class _Pt,
2624*dbc89028Szoecarver    class = decltype(_VSTD::declval<_Dp>()(_VSTD::declval<_Pt>()))>
2625*dbc89028Szoecarverstatic true_type __well_formed_deleter_test(int);
2626*dbc89028Szoecarver
2627*dbc89028Szoecarvertemplate <class, class>
2628*dbc89028Szoecarverstatic false_type __well_formed_deleter_test(...);
2629*dbc89028Szoecarver
2630*dbc89028Szoecarvertemplate <class _Dp, class _Pt>
2631*dbc89028Szoecarverstruct __well_formed_deleter : decltype(__well_formed_deleter_test<_Dp, _Pt>(0)) {};
2632*dbc89028Szoecarver
2633*dbc89028Szoecarvertemplate<class _Dp, class _Tp, class _Yp>
2634*dbc89028Szoecarverstruct __shared_ptr_deleter_ctor_reqs
2635*dbc89028Szoecarver{
2636*dbc89028Szoecarver    static const bool value = __compatible_with<_Tp, _Yp>::value &&
2637*dbc89028Szoecarver                              is_move_constructible<_Dp>::value &&
2638*dbc89028Szoecarver                              __well_formed_deleter<_Dp, _Tp*>::value;
2639*dbc89028Szoecarver};
2640*dbc89028Szoecarver
264176887bc4SVy Nguyen#if defined(_LIBCPP_ABI_ENABLE_SHARED_PTR_TRIVIAL_ABI)
264276887bc4SVy Nguyen#  define _LIBCPP_SHARED_PTR_TRIVIAL_ABI __attribute__((trivial_abi))
264376887bc4SVy Nguyen#else
264476887bc4SVy Nguyen#  define _LIBCPP_SHARED_PTR_TRIVIAL_ABI
264576887bc4SVy Nguyen#endif
264676887bc4SVy Nguyen
26473e519524SHoward Hinnanttemplate<class _Tp>
264876887bc4SVy Nguyenclass _LIBCPP_SHARED_PTR_TRIVIAL_ABI _LIBCPP_TEMPLATE_VIS shared_ptr
26493e519524SHoward Hinnant{
26503e519524SHoward Hinnantpublic:
265168436a9bSEric Fiselier#if _LIBCPP_STD_VER > 14
265268436a9bSEric Fiselier    typedef weak_ptr<_Tp> weak_type;
2653ce195fb2Szoecarver    typedef remove_extent_t<_Tp> element_type;
2654ce195fb2Szoecarver#else
2655ce195fb2Szoecarver    typedef _Tp element_type;
265668436a9bSEric Fiselier#endif
2657ce195fb2Szoecarver
26583e519524SHoward Hinnantprivate:
26593e519524SHoward Hinnant    element_type*      __ptr_;
26603e519524SHoward Hinnant    __shared_weak_count* __cntrl_;
26613e519524SHoward Hinnant
26623e519524SHoward Hinnant    struct __nat {int __for_bool_;};
26633e519524SHoward Hinnantpublic:
2664906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
2665c0937e8aSHoward Hinnant    _LIBCPP_CONSTEXPR shared_ptr() _NOEXCEPT;
2666906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
2667c0937e8aSHoward Hinnant    _LIBCPP_CONSTEXPR shared_ptr(nullptr_t) _NOEXCEPT;
266822747e62SLogan Chien    template<class _Yp>
266922747e62SLogan Chien        explicit shared_ptr(_Yp* __p,
2670ce195fb2Szoecarver                            typename enable_if<__compatible_with<_Yp, element_type>::value, __nat>::type = __nat());
267122747e62SLogan Chien    template<class _Yp, class _Dp>
267222747e62SLogan Chien        shared_ptr(_Yp* __p, _Dp __d,
2673*dbc89028Szoecarver                   typename enable_if<__shared_ptr_deleter_ctor_reqs<_Dp, _Yp, element_type>::value, __nat>::type = __nat());
267422747e62SLogan Chien    template<class _Yp, class _Dp, class _Alloc>
267522747e62SLogan Chien        shared_ptr(_Yp* __p, _Dp __d, _Alloc __a,
2676*dbc89028Szoecarver                   typename enable_if<__shared_ptr_deleter_ctor_reqs<_Dp, _Yp, element_type>::value, __nat>::type = __nat());
26773e519524SHoward Hinnant    template <class _Dp> shared_ptr(nullptr_t __p, _Dp __d);
26783e519524SHoward Hinnant    template <class _Dp, class _Alloc> shared_ptr(nullptr_t __p, _Dp __d, _Alloc __a);
2679906c872dSEvgeniy Stepanov    template<class _Yp> _LIBCPP_INLINE_VISIBILITY shared_ptr(const shared_ptr<_Yp>& __r, element_type* __p) _NOEXCEPT;
2680906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
26813739fe79SHoward Hinnant    shared_ptr(const shared_ptr& __r) _NOEXCEPT;
26823e519524SHoward Hinnant    template<class _Yp>
2683906c872dSEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
26843e519524SHoward Hinnant        shared_ptr(const shared_ptr<_Yp>& __r,
2685ce195fb2Szoecarver                   typename enable_if<__compatible_with<_Yp, element_type>::value, __nat>::type = __nat())
26863739fe79SHoward Hinnant                       _NOEXCEPT;
2687906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
26883739fe79SHoward Hinnant    shared_ptr(shared_ptr&& __r) _NOEXCEPT;
2689906c872dSEvgeniy Stepanov    template<class _Yp> _LIBCPP_INLINE_VISIBILITY  shared_ptr(shared_ptr<_Yp>&& __r,
2690ce195fb2Szoecarver                   typename enable_if<__compatible_with<_Yp, element_type>::value, __nat>::type = __nat())
26913739fe79SHoward Hinnant                       _NOEXCEPT;
26923e519524SHoward Hinnant    template<class _Yp> explicit shared_ptr(const weak_ptr<_Yp>& __r,
2693dc83e779SMarshall Clow                   typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type= __nat());
2694e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR)
269522747e62SLogan Chien    template<class _Yp>
269622747e62SLogan Chien        shared_ptr(auto_ptr<_Yp>&& __r,
269722747e62SLogan Chien                   typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat());
2698e67179bcSMarshall Clow#endif
269922747e62SLogan Chien    template <class _Yp, class _Dp>
27008e25104bSHoward Hinnant        shared_ptr(unique_ptr<_Yp, _Dp>&&,
270122747e62SLogan Chien                   typename enable_if
27028e25104bSHoward Hinnant                   <
270322747e62SLogan Chien                       !is_lvalue_reference<_Dp>::value &&
27048e25104bSHoward Hinnant                       !is_array<_Yp>::value &&
270522747e62SLogan Chien                       is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value,
270622747e62SLogan Chien                       __nat
270722747e62SLogan Chien                   >::type = __nat());
270822747e62SLogan Chien    template <class _Yp, class _Dp>
27098e25104bSHoward Hinnant        shared_ptr(unique_ptr<_Yp, _Dp>&&,
271022747e62SLogan Chien                   typename enable_if
271122747e62SLogan Chien                   <
271222747e62SLogan Chien                       is_lvalue_reference<_Dp>::value &&
271322747e62SLogan Chien                       !is_array<_Yp>::value &&
271422747e62SLogan Chien                       is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value,
271522747e62SLogan Chien                       __nat
271622747e62SLogan Chien                   >::type = __nat());
27173e519524SHoward Hinnant
27183e519524SHoward Hinnant    ~shared_ptr();
27193e519524SHoward Hinnant
2720906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
27213739fe79SHoward Hinnant    shared_ptr& operator=(const shared_ptr& __r) _NOEXCEPT;
27228e25104bSHoward Hinnant    template<class _Yp>
27238e25104bSHoward Hinnant        typename enable_if
27248e25104bSHoward Hinnant        <
2725ce195fb2Szoecarver            __compatible_with<_Yp, element_type>::value,
27268e25104bSHoward Hinnant            shared_ptr&
27278e25104bSHoward Hinnant        >::type
2728906c872dSEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
27298e25104bSHoward Hinnant        operator=(const shared_ptr<_Yp>& __r) _NOEXCEPT;
2730906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
27313739fe79SHoward Hinnant    shared_ptr& operator=(shared_ptr&& __r) _NOEXCEPT;
27328e25104bSHoward Hinnant    template<class _Yp>
27338e25104bSHoward Hinnant        typename enable_if
27348e25104bSHoward Hinnant        <
2735ce195fb2Szoecarver            __compatible_with<_Yp, element_type>::value,
2736ce195fb2Szoecarver            shared_ptr&
27378e25104bSHoward Hinnant        >::type
2738906c872dSEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
27398e25104bSHoward Hinnant        operator=(shared_ptr<_Yp>&& __r);
2740e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR)
27418e25104bSHoward Hinnant    template<class _Yp>
274289dd1dd2SEric Fiselier        _LIBCPP_INLINE_VISIBILITY
27438e25104bSHoward Hinnant        typename enable_if
27448e25104bSHoward Hinnant        <
27458e25104bSHoward Hinnant            !is_array<_Yp>::value &&
27468e25104bSHoward Hinnant            is_convertible<_Yp*, element_type*>::value,
274784f996fbSHoward Hinnant            shared_ptr
274884f996fbSHoward Hinnant        >::type&
27498e25104bSHoward Hinnant        operator=(auto_ptr<_Yp>&& __r);
2750e67179bcSMarshall Clow#endif
27518e25104bSHoward Hinnant    template <class _Yp, class _Dp>
27528e25104bSHoward Hinnant        typename enable_if
27538e25104bSHoward Hinnant        <
27548e25104bSHoward Hinnant            !is_array<_Yp>::value &&
27558e25104bSHoward Hinnant            is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value,
27568e25104bSHoward Hinnant            shared_ptr&
27578e25104bSHoward Hinnant        >::type
2758906c872dSEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
27598e25104bSHoward Hinnant        operator=(unique_ptr<_Yp, _Dp>&& __r);
27603e519524SHoward Hinnant
2761906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
27623739fe79SHoward Hinnant    void swap(shared_ptr& __r) _NOEXCEPT;
2763906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
27643739fe79SHoward Hinnant    void reset() _NOEXCEPT;
27658e25104bSHoward Hinnant    template<class _Yp>
27668e25104bSHoward Hinnant        typename enable_if
27678e25104bSHoward Hinnant        <
2768ce195fb2Szoecarver            __compatible_with<_Yp, element_type>::value,
27698e25104bSHoward Hinnant            void
27708e25104bSHoward Hinnant        >::type
2771906c872dSEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
27728e25104bSHoward Hinnant        reset(_Yp* __p);
27738e25104bSHoward Hinnant    template<class _Yp, class _Dp>
27748e25104bSHoward Hinnant        typename enable_if
27758e25104bSHoward Hinnant        <
2776ce195fb2Szoecarver            __compatible_with<_Yp, element_type>::value,
27778e25104bSHoward Hinnant            void
27788e25104bSHoward Hinnant        >::type
2779906c872dSEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
27808e25104bSHoward Hinnant        reset(_Yp* __p, _Dp __d);
27818e25104bSHoward Hinnant    template<class _Yp, class _Dp, class _Alloc>
27828e25104bSHoward Hinnant        typename enable_if
27838e25104bSHoward Hinnant        <
2784ce195fb2Szoecarver            __compatible_with<_Yp, element_type>::value,
27858e25104bSHoward Hinnant            void
27868e25104bSHoward Hinnant        >::type
2787906c872dSEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
27888e25104bSHoward Hinnant        reset(_Yp* __p, _Dp __d, _Alloc __a);
27893e519524SHoward Hinnant
2790848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
27913739fe79SHoward Hinnant    element_type* get() const _NOEXCEPT {return __ptr_;}
2792848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
27933739fe79SHoward Hinnant    typename add_lvalue_reference<element_type>::type operator*() const _NOEXCEPT
27943739fe79SHoward Hinnant        {return *__ptr_;}
2795848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2796ce195fb2Szoecarver    element_type* operator->() const _NOEXCEPT
2797ce195fb2Szoecarver    {
2798ce195fb2Szoecarver        static_assert(!_VSTD::is_array<_Tp>::value,
2799ce195fb2Szoecarver                      "std::shared_ptr<T>::operator-> is only valid when T is not an array type.");
2800ce195fb2Szoecarver        return __ptr_;
2801ce195fb2Szoecarver    }
2802848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
28033739fe79SHoward Hinnant    long use_count() const _NOEXCEPT {return __cntrl_ ? __cntrl_->use_count() : 0;}
2804848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
28053739fe79SHoward Hinnant    bool unique() const _NOEXCEPT {return use_count() == 1;}
2806848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2807527a7fdfSBruce Mitchener    _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT {return get() != nullptr;}
2808c003db1fSHoward Hinnant    template <class _Up>
2809848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
281036bc7178SMarshall Clow        bool owner_before(shared_ptr<_Up> const& __p) const _NOEXCEPT
28113e519524SHoward Hinnant        {return __cntrl_ < __p.__cntrl_;}
2812c003db1fSHoward Hinnant    template <class _Up>
2813848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
281436bc7178SMarshall Clow        bool owner_before(weak_ptr<_Up> const& __p) const _NOEXCEPT
28153e519524SHoward Hinnant        {return __cntrl_ < __p.__cntrl_;}
2816d77851e8SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2817d77851e8SHoward Hinnant    bool
2818d77851e8SHoward Hinnant    __owner_equivalent(const shared_ptr& __p) const
2819d77851e8SHoward Hinnant        {return __cntrl_ == __p.__cntrl_;}
28203e519524SHoward Hinnant
2821ce195fb2Szoecarver#if _LIBCPP_STD_VER > 14
2822ce195fb2Szoecarver    typename add_lvalue_reference<element_type>::type
2823ce195fb2Szoecarver    _LIBCPP_INLINE_VISIBILITY
2824ce195fb2Szoecarver    operator[](ptrdiff_t __i) const
2825ce195fb2Szoecarver    {
2826ce195fb2Szoecarver            static_assert(_VSTD::is_array<_Tp>::value,
2827ce195fb2Szoecarver                          "std::shared_ptr<T>::operator[] is only valid when T is an array type.");
2828ce195fb2Szoecarver            return __ptr_[__i];
2829ce195fb2Szoecarver    }
2830ce195fb2Szoecarver#endif
2831ce195fb2Szoecarver
283254b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI
28333e519524SHoward Hinnant    template <class _Dp>
2834848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
28353739fe79SHoward Hinnant        _Dp* __get_deleter() const _NOEXCEPT
28364a911c86SMarshall Clow            {return static_cast<_Dp*>(__cntrl_
28374a911c86SMarshall Clow                    ? const_cast<void *>(__cntrl_->__get_deleter(typeid(_Dp)))
28384a911c86SMarshall Clow                      : nullptr);}
2839b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_RTTI
28403e519524SHoward Hinnant
284140c47680SZoe Carver    template<class _Yp, class _CntrlBlk>
284240c47680SZoe Carver    static shared_ptr<_Tp>
284321d4050eSzoecarver    __create_with_control_block(_Yp* __p, _CntrlBlk* __cntrl) _NOEXCEPT
284440c47680SZoe Carver    {
284540c47680SZoe Carver        shared_ptr<_Tp> __r;
284640c47680SZoe Carver        __r.__ptr_ = __p;
284740c47680SZoe Carver        __r.__cntrl_ = __cntrl;
284840c47680SZoe Carver        __r.__enable_weak_this(__r.__ptr_, __r.__ptr_);
284940c47680SZoe Carver        return __r;
285040c47680SZoe Carver    }
2851471bbb6eSZoe Carver
28523e519524SHoward Hinnantprivate:
285372d0d603SErik Pilkington    template <class _Yp, bool = is_function<_Yp>::value>
285472d0d603SErik Pilkington        struct __shared_ptr_default_allocator
285572d0d603SErik Pilkington        {
285672d0d603SErik Pilkington            typedef allocator<_Yp> type;
285772d0d603SErik Pilkington        };
285872d0d603SErik Pilkington
285972d0d603SErik Pilkington    template <class _Yp>
286072d0d603SErik Pilkington        struct __shared_ptr_default_allocator<_Yp, true>
286172d0d603SErik Pilkington        {
286272d0d603SErik Pilkington            typedef allocator<__shared_ptr_dummy_rebind_allocator_type> type;
286372d0d603SErik Pilkington        };
28643e519524SHoward Hinnant
286539005d30SEric Fiselier    template <class _Yp, class _OrigPtr>
2866848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2867f09df772SEric Fiselier        typename enable_if<is_convertible<_OrigPtr*,
2868f09df772SEric Fiselier                                          const enable_shared_from_this<_Yp>*
2869f09df772SEric Fiselier        >::value,
2870f09df772SEric Fiselier            void>::type
287139005d30SEric Fiselier        __enable_weak_this(const enable_shared_from_this<_Yp>* __e,
287239005d30SEric Fiselier                           _OrigPtr* __ptr) _NOEXCEPT
28733e519524SHoward Hinnant        {
287439005d30SEric Fiselier            typedef typename remove_cv<_Yp>::type _RawYp;
287588f5bfdcSEric Fiselier            if (__e && __e->__weak_this_.expired())
287655112defSMarshall Clow            {
287739005d30SEric Fiselier                __e->__weak_this_ = shared_ptr<_RawYp>(*this,
287839005d30SEric Fiselier                    const_cast<_RawYp*>(static_cast<const _Yp*>(__ptr)));
287955112defSMarshall Clow            }
28803e519524SHoward Hinnant        }
28813e519524SHoward Hinnant
288272d0d603SErik Pilkington    _LIBCPP_INLINE_VISIBILITY void __enable_weak_this(...) _NOEXCEPT {}
28833e519524SHoward Hinnant
2884ce195fb2Szoecarver    template <class, class _Yp>
2885ce195fb2Szoecarver        struct __shared_ptr_default_delete
2886ce195fb2Szoecarver            : default_delete<_Yp> {};
2887ce195fb2Szoecarver
2888ce195fb2Szoecarver    template <class _Yp, class _Un, size_t _Sz>
2889ce195fb2Szoecarver        struct __shared_ptr_default_delete<_Yp[_Sz], _Un>
2890ce195fb2Szoecarver            : default_delete<_Yp[]> {};
2891ce195fb2Szoecarver
2892ce195fb2Szoecarver    template <class _Yp, class _Un>
2893ce195fb2Szoecarver        struct __shared_ptr_default_delete<_Yp[], _Un>
2894ce195fb2Szoecarver            : default_delete<_Yp[]> {};
2895ce195fb2Szoecarver
2896e2f2d1edSEric Fiselier    template <class _Up> friend class _LIBCPP_TEMPLATE_VIS shared_ptr;
2897e2f2d1edSEric Fiselier    template <class _Up> friend class _LIBCPP_TEMPLATE_VIS weak_ptr;
28983e519524SHoward Hinnant};
28993e519524SHoward Hinnant
290083564056SLogan Smith#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
290183564056SLogan Smithtemplate<class _Tp>
290283564056SLogan Smithshared_ptr(weak_ptr<_Tp>) -> shared_ptr<_Tp>;
290383564056SLogan Smithtemplate<class _Tp, class _Dp>
290483564056SLogan Smithshared_ptr(unique_ptr<_Tp, _Dp>) -> shared_ptr<_Tp>;
290583564056SLogan Smith#endif
2906f09df772SEric Fiselier
29073e519524SHoward Hinnanttemplate<class _Tp>
2908906c872dSEvgeniy Stepanovinline
2909c0937e8aSHoward Hinnant_LIBCPP_CONSTEXPR
29103739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr() _NOEXCEPT
2911527a7fdfSBruce Mitchener    : __ptr_(nullptr),
2912527a7fdfSBruce Mitchener      __cntrl_(nullptr)
29133e519524SHoward Hinnant{
29143e519524SHoward Hinnant}
29153e519524SHoward Hinnant
29163e519524SHoward Hinnanttemplate<class _Tp>
2917906c872dSEvgeniy Stepanovinline
2918c0937e8aSHoward Hinnant_LIBCPP_CONSTEXPR
29193739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr(nullptr_t) _NOEXCEPT
2920527a7fdfSBruce Mitchener    : __ptr_(nullptr),
2921527a7fdfSBruce Mitchener      __cntrl_(nullptr)
29223e519524SHoward Hinnant{
29233e519524SHoward Hinnant}
29243e519524SHoward Hinnant
29253e519524SHoward Hinnanttemplate<class _Tp>
292622747e62SLogan Chientemplate<class _Yp>
292722747e62SLogan Chienshared_ptr<_Tp>::shared_ptr(_Yp* __p,
2928ce195fb2Szoecarver                            typename enable_if<__compatible_with<_Yp, element_type>::value, __nat>::type)
29293e519524SHoward Hinnant    : __ptr_(__p)
29303e519524SHoward Hinnant{
29313e519524SHoward Hinnant    unique_ptr<_Yp> __hold(__p);
293272d0d603SErik Pilkington    typedef typename __shared_ptr_default_allocator<_Yp>::type _AllocT;
2933ce195fb2Szoecarver    typedef __shared_ptr_pointer<_Yp*, __shared_ptr_default_delete<_Tp, _Yp>, _AllocT > _CntrlBlk;
2934ce195fb2Szoecarver    __cntrl_ = new _CntrlBlk(__p, __shared_ptr_default_delete<_Tp, _Yp>(), _AllocT());
29353e519524SHoward Hinnant    __hold.release();
293639005d30SEric Fiselier    __enable_weak_this(__p, __p);
29373e519524SHoward Hinnant}
29383e519524SHoward Hinnant
29393e519524SHoward Hinnanttemplate<class _Tp>
294022747e62SLogan Chientemplate<class _Yp, class _Dp>
294122747e62SLogan Chienshared_ptr<_Tp>::shared_ptr(_Yp* __p, _Dp __d,
2942*dbc89028Szoecarver                            typename enable_if<__shared_ptr_deleter_ctor_reqs<_Dp, _Yp, element_type>::value, __nat>::type)
29433e519524SHoward Hinnant    : __ptr_(__p)
29443e519524SHoward Hinnant{
29453e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
29463e519524SHoward Hinnant    try
29473e519524SHoward Hinnant    {
2948b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
294972d0d603SErik Pilkington        typedef typename __shared_ptr_default_allocator<_Yp>::type _AllocT;
295072d0d603SErik Pilkington        typedef __shared_ptr_pointer<_Yp*, _Dp, _AllocT > _CntrlBlk;
29516a328c66Szoecarver#ifndef _LIBCPP_CXX03_LANG
29526a328c66Szoecarver        __cntrl_ = new _CntrlBlk(__p, _VSTD::move(__d), _AllocT());
29536a328c66Szoecarver#else
295472d0d603SErik Pilkington        __cntrl_ = new _CntrlBlk(__p, __d, _AllocT());
29556a328c66Szoecarver#endif // not _LIBCPP_CXX03_LANG
295639005d30SEric Fiselier        __enable_weak_this(__p, __p);
29573e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
29583e519524SHoward Hinnant    }
29593e519524SHoward Hinnant    catch (...)
29603e519524SHoward Hinnant    {
29613e519524SHoward Hinnant        __d(__p);
29623e519524SHoward Hinnant        throw;
29633e519524SHoward Hinnant    }
2964b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
29653e519524SHoward Hinnant}
29663e519524SHoward Hinnant
29673e519524SHoward Hinnanttemplate<class _Tp>
29683e519524SHoward Hinnanttemplate<class _Dp>
29693e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(nullptr_t __p, _Dp __d)
2970527a7fdfSBruce Mitchener    : __ptr_(nullptr)
29713e519524SHoward Hinnant{
29723e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
29733e519524SHoward Hinnant    try
29743e519524SHoward Hinnant    {
2975b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
297672d0d603SErik Pilkington        typedef typename __shared_ptr_default_allocator<_Tp>::type _AllocT;
297772d0d603SErik Pilkington        typedef __shared_ptr_pointer<nullptr_t, _Dp, _AllocT > _CntrlBlk;
29786a328c66Szoecarver#ifndef _LIBCPP_CXX03_LANG
29796a328c66Szoecarver        __cntrl_ = new _CntrlBlk(__p, _VSTD::move(__d), _AllocT());
29806a328c66Szoecarver#else
298172d0d603SErik Pilkington        __cntrl_ = new _CntrlBlk(__p, __d, _AllocT());
29826a328c66Szoecarver#endif // not _LIBCPP_CXX03_LANG
29833e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
29843e519524SHoward Hinnant    }
29853e519524SHoward Hinnant    catch (...)
29863e519524SHoward Hinnant    {
29873e519524SHoward Hinnant        __d(__p);
29883e519524SHoward Hinnant        throw;
29893e519524SHoward Hinnant    }
2990b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
29913e519524SHoward Hinnant}
29923e519524SHoward Hinnant
29933e519524SHoward Hinnanttemplate<class _Tp>
299422747e62SLogan Chientemplate<class _Yp, class _Dp, class _Alloc>
299522747e62SLogan Chienshared_ptr<_Tp>::shared_ptr(_Yp* __p, _Dp __d, _Alloc __a,
2996*dbc89028Szoecarver                            typename enable_if<__shared_ptr_deleter_ctor_reqs<_Dp, _Yp, element_type>::value, __nat>::type)
29973e519524SHoward Hinnant    : __ptr_(__p)
29983e519524SHoward Hinnant{
29993e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
30003e519524SHoward Hinnant    try
30013e519524SHoward Hinnant    {
3002b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
30033e519524SHoward Hinnant        typedef __shared_ptr_pointer<_Yp*, _Dp, _Alloc> _CntrlBlk;
3004319be722SEric Fiselier        typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _A2;
30053e519524SHoward Hinnant        typedef __allocator_destructor<_A2> _D2;
30063e519524SHoward Hinnant        _A2 __a2(__a);
30073e519524SHoward Hinnant        unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1));
30086a328c66Szoecarver        ::new ((void*)_VSTD::addressof(*__hold2.get()))
30096a328c66Szoecarver#ifndef _LIBCPP_CXX03_LANG
30106a328c66Szoecarver            _CntrlBlk(__p, _VSTD::move(__d), __a);
30116a328c66Szoecarver#else
30126a328c66Szoecarver            _CntrlBlk(__p, __d, __a);
30136a328c66Szoecarver#endif // not _LIBCPP_CXX03_LANG
3014319be722SEric Fiselier        __cntrl_ = _VSTD::addressof(*__hold2.release());
301539005d30SEric Fiselier        __enable_weak_this(__p, __p);
30163e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
30173e519524SHoward Hinnant    }
30183e519524SHoward Hinnant    catch (...)
30193e519524SHoward Hinnant    {
30203e519524SHoward Hinnant        __d(__p);
30213e519524SHoward Hinnant        throw;
30223e519524SHoward Hinnant    }
3023b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
30243e519524SHoward Hinnant}
30253e519524SHoward Hinnant
30263e519524SHoward Hinnanttemplate<class _Tp>
30273e519524SHoward Hinnanttemplate<class _Dp, class _Alloc>
30283e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(nullptr_t __p, _Dp __d, _Alloc __a)
3029527a7fdfSBruce Mitchener    : __ptr_(nullptr)
30303e519524SHoward Hinnant{
30313e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
30323e519524SHoward Hinnant    try
30333e519524SHoward Hinnant    {
3034b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
30353e519524SHoward Hinnant        typedef __shared_ptr_pointer<nullptr_t, _Dp, _Alloc> _CntrlBlk;
3036319be722SEric Fiselier        typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _A2;
30373e519524SHoward Hinnant        typedef __allocator_destructor<_A2> _D2;
30383e519524SHoward Hinnant        _A2 __a2(__a);
30393e519524SHoward Hinnant        unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1));
30406a328c66Szoecarver        ::new ((void*)_VSTD::addressof(*__hold2.get()))
30416a328c66Szoecarver#ifndef _LIBCPP_CXX03_LANG
30426a328c66Szoecarver            _CntrlBlk(__p, _VSTD::move(__d), __a);
30436a328c66Szoecarver#else
30446a328c66Szoecarver            _CntrlBlk(__p, __d, __a);
30456a328c66Szoecarver#endif // not _LIBCPP_CXX03_LANG
3046319be722SEric Fiselier        __cntrl_ = _VSTD::addressof(*__hold2.release());
30473e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
30483e519524SHoward Hinnant    }
30493e519524SHoward Hinnant    catch (...)
30503e519524SHoward Hinnant    {
30513e519524SHoward Hinnant        __d(__p);
30523e519524SHoward Hinnant        throw;
30533e519524SHoward Hinnant    }
3054b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
30553e519524SHoward Hinnant}
30563e519524SHoward Hinnant
30573e519524SHoward Hinnanttemplate<class _Tp>
30583e519524SHoward Hinnanttemplate<class _Yp>
3059906c872dSEvgeniy Stepanovinline
30603739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr(const shared_ptr<_Yp>& __r, element_type *__p) _NOEXCEPT
30613e519524SHoward Hinnant    : __ptr_(__p),
30623e519524SHoward Hinnant      __cntrl_(__r.__cntrl_)
30633e519524SHoward Hinnant{
30643e519524SHoward Hinnant    if (__cntrl_)
30653e519524SHoward Hinnant        __cntrl_->__add_shared();
30663e519524SHoward Hinnant}
30673e519524SHoward Hinnant
30683e519524SHoward Hinnanttemplate<class _Tp>
3069906c872dSEvgeniy Stepanovinline
30703739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr(const shared_ptr& __r) _NOEXCEPT
30713e519524SHoward Hinnant    : __ptr_(__r.__ptr_),
30723e519524SHoward Hinnant      __cntrl_(__r.__cntrl_)
30733e519524SHoward Hinnant{
30743e519524SHoward Hinnant    if (__cntrl_)
30753e519524SHoward Hinnant        __cntrl_->__add_shared();
30763e519524SHoward Hinnant}
30773e519524SHoward Hinnant
30783e519524SHoward Hinnanttemplate<class _Tp>
30793e519524SHoward Hinnanttemplate<class _Yp>
3080906c872dSEvgeniy Stepanovinline
30813e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(const shared_ptr<_Yp>& __r,
3082ce195fb2Szoecarver                            typename enable_if<__compatible_with<_Yp, element_type>::value, __nat>::type)
30833739fe79SHoward Hinnant         _NOEXCEPT
30843e519524SHoward Hinnant    : __ptr_(__r.__ptr_),
30853e519524SHoward Hinnant      __cntrl_(__r.__cntrl_)
30863e519524SHoward Hinnant{
30873e519524SHoward Hinnant    if (__cntrl_)
30883e519524SHoward Hinnant        __cntrl_->__add_shared();
30893e519524SHoward Hinnant}
30903e519524SHoward Hinnant
30913e519524SHoward Hinnanttemplate<class _Tp>
3092906c872dSEvgeniy Stepanovinline
30933739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr(shared_ptr&& __r) _NOEXCEPT
30943e519524SHoward Hinnant    : __ptr_(__r.__ptr_),
30953e519524SHoward Hinnant      __cntrl_(__r.__cntrl_)
30963e519524SHoward Hinnant{
3097527a7fdfSBruce Mitchener    __r.__ptr_ = nullptr;
3098527a7fdfSBruce Mitchener    __r.__cntrl_ = nullptr;
30993e519524SHoward Hinnant}
31003e519524SHoward Hinnant
31013e519524SHoward Hinnanttemplate<class _Tp>
31023e519524SHoward Hinnanttemplate<class _Yp>
3103906c872dSEvgeniy Stepanovinline
31043e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(shared_ptr<_Yp>&& __r,
3105ce195fb2Szoecarver                            typename enable_if<__compatible_with<_Yp, element_type>::value, __nat>::type)
31063739fe79SHoward Hinnant         _NOEXCEPT
31073e519524SHoward Hinnant    : __ptr_(__r.__ptr_),
31083e519524SHoward Hinnant      __cntrl_(__r.__cntrl_)
31093e519524SHoward Hinnant{
3110527a7fdfSBruce Mitchener    __r.__ptr_ = nullptr;
3111527a7fdfSBruce Mitchener    __r.__cntrl_ = nullptr;
31123e519524SHoward Hinnant}
31133e519524SHoward Hinnant
3114e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR)
31153e519524SHoward Hinnanttemplate<class _Tp>
311622747e62SLogan Chientemplate<class _Yp>
311722747e62SLogan Chienshared_ptr<_Tp>::shared_ptr(auto_ptr<_Yp>&& __r,
311822747e62SLogan Chien                            typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type)
31193e519524SHoward Hinnant    : __ptr_(__r.get())
31203e519524SHoward Hinnant{
31213e519524SHoward Hinnant    typedef __shared_ptr_pointer<_Yp*, default_delete<_Yp>, allocator<_Yp> > _CntrlBlk;
31223e519524SHoward Hinnant    __cntrl_ = new _CntrlBlk(__r.get(), default_delete<_Yp>(), allocator<_Yp>());
312339005d30SEric Fiselier    __enable_weak_this(__r.get(), __r.get());
31243e519524SHoward Hinnant    __r.release();
31253e519524SHoward Hinnant}
3126e67179bcSMarshall Clow#endif
31273e519524SHoward Hinnant
31283e519524SHoward Hinnanttemplate<class _Tp>
312922747e62SLogan Chientemplate <class _Yp, class _Dp>
31303e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp>&& __r,
313122747e62SLogan Chien                            typename enable_if
313222747e62SLogan Chien                            <
313322747e62SLogan Chien                                !is_lvalue_reference<_Dp>::value &&
313422747e62SLogan Chien                                !is_array<_Yp>::value &&
313522747e62SLogan Chien                                is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value,
313622747e62SLogan Chien                                __nat
313722747e62SLogan Chien                            >::type)
31383e519524SHoward Hinnant    : __ptr_(__r.get())
31393e519524SHoward Hinnant{
3140c34f847bSMarshall Clow#if _LIBCPP_STD_VER > 11
3141c34f847bSMarshall Clow    if (__ptr_ == nullptr)
3142c34f847bSMarshall Clow        __cntrl_ = nullptr;
3143c34f847bSMarshall Clow    else
3144c34f847bSMarshall Clow#endif
3145c34f847bSMarshall Clow    {
314672d0d603SErik Pilkington        typedef typename __shared_ptr_default_allocator<_Yp>::type _AllocT;
314772d0d603SErik Pilkington        typedef __shared_ptr_pointer<_Yp*, _Dp, _AllocT > _CntrlBlk;
314872d0d603SErik Pilkington        __cntrl_ = new _CntrlBlk(__r.get(), __r.get_deleter(), _AllocT());
314939005d30SEric Fiselier        __enable_weak_this(__r.get(), __r.get());
3150c34f847bSMarshall Clow    }
31513e519524SHoward Hinnant    __r.release();
31523e519524SHoward Hinnant}
31533e519524SHoward Hinnant
31543e519524SHoward Hinnanttemplate<class _Tp>
315522747e62SLogan Chientemplate <class _Yp, class _Dp>
31563e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp>&& __r,
315722747e62SLogan Chien                            typename enable_if
315822747e62SLogan Chien                            <
315922747e62SLogan Chien                                is_lvalue_reference<_Dp>::value &&
316022747e62SLogan Chien                                !is_array<_Yp>::value &&
316122747e62SLogan Chien                                is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value,
316222747e62SLogan Chien                                __nat
316322747e62SLogan Chien                            >::type)
31643e519524SHoward Hinnant    : __ptr_(__r.get())
31653e519524SHoward Hinnant{
3166c34f847bSMarshall Clow#if _LIBCPP_STD_VER > 11
3167c34f847bSMarshall Clow    if (__ptr_ == nullptr)
3168c34f847bSMarshall Clow        __cntrl_ = nullptr;
3169c34f847bSMarshall Clow    else
3170c34f847bSMarshall Clow#endif
3171c34f847bSMarshall Clow    {
317272d0d603SErik Pilkington        typedef typename __shared_ptr_default_allocator<_Yp>::type _AllocT;
31733e519524SHoward Hinnant        typedef __shared_ptr_pointer<_Yp*,
31743e519524SHoward Hinnant                                     reference_wrapper<typename remove_reference<_Dp>::type>,
317572d0d603SErik Pilkington                                     _AllocT > _CntrlBlk;
3176092a57f5SLogan Smith        __cntrl_ = new _CntrlBlk(__r.get(), _VSTD::ref(__r.get_deleter()), _AllocT());
317739005d30SEric Fiselier        __enable_weak_this(__r.get(), __r.get());
3178c34f847bSMarshall Clow    }
31793e519524SHoward Hinnant    __r.release();
31803e519524SHoward Hinnant}
31813e519524SHoward Hinnant
3182471bbb6eSZoe Carvertemplate<class _Tp>
31833e519524SHoward Hinnantshared_ptr<_Tp>::~shared_ptr()
31843e519524SHoward Hinnant{
31853e519524SHoward Hinnant    if (__cntrl_)
31863e519524SHoward Hinnant        __cntrl_->__release_shared();
31873e519524SHoward Hinnant}
31883e519524SHoward Hinnant
31893e519524SHoward Hinnanttemplate<class _Tp>
3190906c872dSEvgeniy Stepanovinline
31913e519524SHoward Hinnantshared_ptr<_Tp>&
31923739fe79SHoward Hinnantshared_ptr<_Tp>::operator=(const shared_ptr& __r) _NOEXCEPT
31933e519524SHoward Hinnant{
31943e519524SHoward Hinnant    shared_ptr(__r).swap(*this);
31953e519524SHoward Hinnant    return *this;
31963e519524SHoward Hinnant}
31973e519524SHoward Hinnant
31983e519524SHoward Hinnanttemplate<class _Tp>
31993e519524SHoward Hinnanttemplate<class _Yp>
3200906c872dSEvgeniy Stepanovinline
32018e25104bSHoward Hinnanttypename enable_if
32028e25104bSHoward Hinnant<
3203ce195fb2Szoecarver    __compatible_with<_Yp, typename shared_ptr<_Tp>::element_type>::value,
32043e519524SHoward Hinnant    shared_ptr<_Tp>&
32058e25104bSHoward Hinnant>::type
32063739fe79SHoward Hinnantshared_ptr<_Tp>::operator=(const shared_ptr<_Yp>& __r) _NOEXCEPT
32073e519524SHoward Hinnant{
32083e519524SHoward Hinnant    shared_ptr(__r).swap(*this);
32093e519524SHoward Hinnant    return *this;
32103e519524SHoward Hinnant}
32113e519524SHoward Hinnant
32123e519524SHoward Hinnanttemplate<class _Tp>
3213906c872dSEvgeniy Stepanovinline
32143e519524SHoward Hinnantshared_ptr<_Tp>&
32153739fe79SHoward Hinnantshared_ptr<_Tp>::operator=(shared_ptr&& __r) _NOEXCEPT
32163e519524SHoward Hinnant{
3217ce48a113SHoward Hinnant    shared_ptr(_VSTD::move(__r)).swap(*this);
32183e519524SHoward Hinnant    return *this;
32193e519524SHoward Hinnant}
32203e519524SHoward Hinnant
32213e519524SHoward Hinnanttemplate<class _Tp>
32223e519524SHoward Hinnanttemplate<class _Yp>
3223906c872dSEvgeniy Stepanovinline
32248e25104bSHoward Hinnanttypename enable_if
32258e25104bSHoward Hinnant<
3226ce195fb2Szoecarver    __compatible_with<_Yp, typename shared_ptr<_Tp>::element_type>::value,
32273e519524SHoward Hinnant    shared_ptr<_Tp>&
32288e25104bSHoward Hinnant>::type
32293e519524SHoward Hinnantshared_ptr<_Tp>::operator=(shared_ptr<_Yp>&& __r)
32303e519524SHoward Hinnant{
3231ce48a113SHoward Hinnant    shared_ptr(_VSTD::move(__r)).swap(*this);
32323e519524SHoward Hinnant    return *this;
32333e519524SHoward Hinnant}
32343e519524SHoward Hinnant
3235e67179bcSMarshall Clow#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR)
32363e519524SHoward Hinnanttemplate<class _Tp>
32373e519524SHoward Hinnanttemplate<class _Yp>
3238906c872dSEvgeniy Stepanovinline
32398e25104bSHoward Hinnanttypename enable_if
32408e25104bSHoward Hinnant<
32418e25104bSHoward Hinnant    !is_array<_Yp>::value &&
3242dc83e779SMarshall Clow    is_convertible<_Yp*, typename shared_ptr<_Tp>::element_type*>::value,
324384f996fbSHoward Hinnant    shared_ptr<_Tp>
324484f996fbSHoward Hinnant>::type&
32453e519524SHoward Hinnantshared_ptr<_Tp>::operator=(auto_ptr<_Yp>&& __r)
32463e519524SHoward Hinnant{
3247ce48a113SHoward Hinnant    shared_ptr(_VSTD::move(__r)).swap(*this);
32483e519524SHoward Hinnant    return *this;
32493e519524SHoward Hinnant}
3250e67179bcSMarshall Clow#endif
32513e519524SHoward Hinnant
32523e519524SHoward Hinnanttemplate<class _Tp>
32533e519524SHoward Hinnanttemplate <class _Yp, class _Dp>
3254906c872dSEvgeniy Stepanovinline
32558e25104bSHoward Hinnanttypename enable_if
32568e25104bSHoward Hinnant<
32578e25104bSHoward Hinnant    !is_array<_Yp>::value &&
3258dc83e779SMarshall Clow    is_convertible<typename unique_ptr<_Yp, _Dp>::pointer,
3259dc83e779SMarshall Clow                   typename shared_ptr<_Tp>::element_type*>::value,
32603e519524SHoward Hinnant    shared_ptr<_Tp>&
32618e25104bSHoward Hinnant>::type
32623e519524SHoward Hinnantshared_ptr<_Tp>::operator=(unique_ptr<_Yp, _Dp>&& __r)
32633e519524SHoward Hinnant{
3264ce48a113SHoward Hinnant    shared_ptr(_VSTD::move(__r)).swap(*this);
32653e519524SHoward Hinnant    return *this;
32663e519524SHoward Hinnant}
32673e519524SHoward Hinnant
32683e519524SHoward Hinnanttemplate<class _Tp>
3269906c872dSEvgeniy Stepanovinline
32703e519524SHoward Hinnantvoid
32713739fe79SHoward Hinnantshared_ptr<_Tp>::swap(shared_ptr& __r) _NOEXCEPT
32723e519524SHoward Hinnant{
3273ce48a113SHoward Hinnant    _VSTD::swap(__ptr_, __r.__ptr_);
3274ce48a113SHoward Hinnant    _VSTD::swap(__cntrl_, __r.__cntrl_);
32753e519524SHoward Hinnant}
32763e519524SHoward Hinnant
32773e519524SHoward Hinnanttemplate<class _Tp>
3278906c872dSEvgeniy Stepanovinline
32793e519524SHoward Hinnantvoid
32803739fe79SHoward Hinnantshared_ptr<_Tp>::reset() _NOEXCEPT
32813e519524SHoward Hinnant{
32823e519524SHoward Hinnant    shared_ptr().swap(*this);
32833e519524SHoward Hinnant}
32843e519524SHoward Hinnant
32853e519524SHoward Hinnanttemplate<class _Tp>
32863e519524SHoward Hinnanttemplate<class _Yp>
3287906c872dSEvgeniy Stepanovinline
32888e25104bSHoward Hinnanttypename enable_if
32898e25104bSHoward Hinnant<
3290ce195fb2Szoecarver    __compatible_with<_Yp, typename shared_ptr<_Tp>::element_type>::value,
32913e519524SHoward Hinnant    void
32928e25104bSHoward Hinnant>::type
32933e519524SHoward Hinnantshared_ptr<_Tp>::reset(_Yp* __p)
32943e519524SHoward Hinnant{
32953e519524SHoward Hinnant    shared_ptr(__p).swap(*this);
32963e519524SHoward Hinnant}
32973e519524SHoward Hinnant
32983e519524SHoward Hinnanttemplate<class _Tp>
32993e519524SHoward Hinnanttemplate<class _Yp, class _Dp>
3300906c872dSEvgeniy Stepanovinline
33018e25104bSHoward Hinnanttypename enable_if
33028e25104bSHoward Hinnant<
3303ce195fb2Szoecarver    __compatible_with<_Yp, typename shared_ptr<_Tp>::element_type>::value,
33043e519524SHoward Hinnant    void
33058e25104bSHoward Hinnant>::type
33063e519524SHoward Hinnantshared_ptr<_Tp>::reset(_Yp* __p, _Dp __d)
33073e519524SHoward Hinnant{
33083e519524SHoward Hinnant    shared_ptr(__p, __d).swap(*this);
33093e519524SHoward Hinnant}
33103e519524SHoward Hinnant
33113e519524SHoward Hinnanttemplate<class _Tp>
33123e519524SHoward Hinnanttemplate<class _Yp, class _Dp, class _Alloc>
3313906c872dSEvgeniy Stepanovinline
33148e25104bSHoward Hinnanttypename enable_if
33158e25104bSHoward Hinnant<
3316ce195fb2Szoecarver    __compatible_with<_Yp, typename shared_ptr<_Tp>::element_type>::value,
33173e519524SHoward Hinnant    void
33188e25104bSHoward Hinnant>::type
33193e519524SHoward Hinnantshared_ptr<_Tp>::reset(_Yp* __p, _Dp __d, _Alloc __a)
33203e519524SHoward Hinnant{
33213e519524SHoward Hinnant    shared_ptr(__p, __d, __a).swap(*this);
33223e519524SHoward Hinnant}
33233e519524SHoward Hinnant
332419d57b5cSLouis Dionne//
332519d57b5cSLouis Dionne// std::allocate_shared and std::make_shared
332619d57b5cSLouis Dionne//
332719d57b5cSLouis Dionnetemplate<class _Tp, class _Alloc, class ..._Args, class = _EnableIf<!is_array<_Tp>::value> >
332819d57b5cSLouis Dionne_LIBCPP_HIDE_FROM_ABI
332919d57b5cSLouis Dionneshared_ptr<_Tp> allocate_shared(const _Alloc& __a, _Args&& ...__args)
33303e519524SHoward Hinnant{
333119d57b5cSLouis Dionne    using _ControlBlock = __shared_ptr_emplace<_Tp, _Alloc>;
333219d57b5cSLouis Dionne    using _ControlBlockAllocator = typename __allocator_traits_rebind<_Alloc, _ControlBlock>::type;
333319d57b5cSLouis Dionne    __allocation_guard<_ControlBlockAllocator> __guard(__a, 1);
333419d57b5cSLouis Dionne    ::new ((void*)_VSTD::addressof(*__guard.__get())) _ControlBlock(__a, _VSTD::forward<_Args>(__args)...);
333519d57b5cSLouis Dionne    auto __control_block = __guard.__release_ptr();
333619d57b5cSLouis Dionne    return shared_ptr<_Tp>::__create_with_control_block((*__control_block).__get_elem(), _VSTD::addressof(*__control_block));
33373e519524SHoward Hinnant}
33383e519524SHoward Hinnant
3339ece3e5bbSLouis Dionnetemplate<class _Tp, class ..._Args, class = _EnableIf<!is_array<_Tp>::value> >
3340ece3e5bbSLouis Dionne_LIBCPP_HIDE_FROM_ABI
3341ece3e5bbSLouis Dionneshared_ptr<_Tp> make_shared(_Args&& ...__args)
3342ece3e5bbSLouis Dionne{
3343ece3e5bbSLouis Dionne    return _VSTD::allocate_shared<_Tp>(allocator<_Tp>(), _VSTD::forward<_Args>(__args)...);
3344ece3e5bbSLouis Dionne}
3345ece3e5bbSLouis Dionne
33463e519524SHoward Hinnanttemplate<class _Tp, class _Up>
33473e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
33483e519524SHoward Hinnantbool
33493739fe79SHoward Hinnantoperator==(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT
33503e519524SHoward Hinnant{
33513e519524SHoward Hinnant    return __x.get() == __y.get();
33523e519524SHoward Hinnant}
33533e519524SHoward Hinnant
33543e519524SHoward Hinnanttemplate<class _Tp, class _Up>
33553e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
33563e519524SHoward Hinnantbool
33573739fe79SHoward Hinnantoperator!=(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT
33583e519524SHoward Hinnant{
33593e519524SHoward Hinnant    return !(__x == __y);
33603e519524SHoward Hinnant}
33613e519524SHoward Hinnant
33623e519524SHoward Hinnanttemplate<class _Tp, class _Up>
33633e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
33643e519524SHoward Hinnantbool
33653739fe79SHoward Hinnantoperator<(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT
33663e519524SHoward Hinnant{
3367c0db0729SMarshall Clow#if _LIBCPP_STD_VER <= 11
33686fe361c1SEric Fiselier    typedef typename common_type<_Tp*, _Up*>::type _Vp;
33696fe361c1SEric Fiselier    return less<_Vp>()(__x.get(), __y.get());
3370c0db0729SMarshall Clow#else
3371c0db0729SMarshall Clow    return less<>()(__x.get(), __y.get());
3372c0db0729SMarshall Clow#endif
3373c0db0729SMarshall Clow
337467f39647SHoward Hinnant}
337567f39647SHoward Hinnant
337667f39647SHoward Hinnanttemplate<class _Tp, class _Up>
337767f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
337867f39647SHoward Hinnantbool
337967f39647SHoward Hinnantoperator>(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT
338067f39647SHoward Hinnant{
338167f39647SHoward Hinnant    return __y < __x;
338267f39647SHoward Hinnant}
338367f39647SHoward Hinnant
338467f39647SHoward Hinnanttemplate<class _Tp, class _Up>
338567f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
338667f39647SHoward Hinnantbool
338767f39647SHoward Hinnantoperator<=(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT
338867f39647SHoward Hinnant{
338967f39647SHoward Hinnant    return !(__y < __x);
339067f39647SHoward Hinnant}
339167f39647SHoward Hinnant
339267f39647SHoward Hinnanttemplate<class _Tp, class _Up>
339367f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
339467f39647SHoward Hinnantbool
339567f39647SHoward Hinnantoperator>=(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT
339667f39647SHoward Hinnant{
339767f39647SHoward Hinnant    return !(__x < __y);
339867f39647SHoward Hinnant}
339967f39647SHoward Hinnant
340067f39647SHoward Hinnanttemplate<class _Tp>
340167f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
340267f39647SHoward Hinnantbool
340367f39647SHoward Hinnantoperator==(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT
340467f39647SHoward Hinnant{
340567f39647SHoward Hinnant    return !__x;
340667f39647SHoward Hinnant}
340767f39647SHoward Hinnant
340867f39647SHoward Hinnanttemplate<class _Tp>
340967f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
341067f39647SHoward Hinnantbool
341167f39647SHoward Hinnantoperator==(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT
341267f39647SHoward Hinnant{
341367f39647SHoward Hinnant    return !__x;
341467f39647SHoward Hinnant}
341567f39647SHoward Hinnant
341667f39647SHoward Hinnanttemplate<class _Tp>
341767f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
341867f39647SHoward Hinnantbool
341967f39647SHoward Hinnantoperator!=(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT
342067f39647SHoward Hinnant{
342167f39647SHoward Hinnant    return static_cast<bool>(__x);
342267f39647SHoward Hinnant}
342367f39647SHoward Hinnant
342467f39647SHoward Hinnanttemplate<class _Tp>
342567f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
342667f39647SHoward Hinnantbool
342767f39647SHoward Hinnantoperator!=(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT
342867f39647SHoward Hinnant{
342967f39647SHoward Hinnant    return static_cast<bool>(__x);
343067f39647SHoward Hinnant}
343167f39647SHoward Hinnant
343267f39647SHoward Hinnanttemplate<class _Tp>
343367f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
343467f39647SHoward Hinnantbool
343567f39647SHoward Hinnantoperator<(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT
343667f39647SHoward Hinnant{
343767f39647SHoward Hinnant    return less<_Tp*>()(__x.get(), nullptr);
343867f39647SHoward Hinnant}
343967f39647SHoward Hinnant
344067f39647SHoward Hinnanttemplate<class _Tp>
344167f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
344267f39647SHoward Hinnantbool
344367f39647SHoward Hinnantoperator<(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT
344467f39647SHoward Hinnant{
344567f39647SHoward Hinnant    return less<_Tp*>()(nullptr, __x.get());
344667f39647SHoward Hinnant}
344767f39647SHoward Hinnant
344867f39647SHoward Hinnanttemplate<class _Tp>
344967f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
345067f39647SHoward Hinnantbool
345167f39647SHoward Hinnantoperator>(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT
345267f39647SHoward Hinnant{
345367f39647SHoward Hinnant    return nullptr < __x;
345467f39647SHoward Hinnant}
345567f39647SHoward Hinnant
345667f39647SHoward Hinnanttemplate<class _Tp>
345767f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
345867f39647SHoward Hinnantbool
345967f39647SHoward Hinnantoperator>(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT
346067f39647SHoward Hinnant{
346167f39647SHoward Hinnant    return __x < nullptr;
346267f39647SHoward Hinnant}
346367f39647SHoward Hinnant
346467f39647SHoward Hinnanttemplate<class _Tp>
346567f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
346667f39647SHoward Hinnantbool
346767f39647SHoward Hinnantoperator<=(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT
346867f39647SHoward Hinnant{
346967f39647SHoward Hinnant    return !(nullptr < __x);
347067f39647SHoward Hinnant}
347167f39647SHoward Hinnant
347267f39647SHoward Hinnanttemplate<class _Tp>
347367f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
347467f39647SHoward Hinnantbool
347567f39647SHoward Hinnantoperator<=(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT
347667f39647SHoward Hinnant{
347767f39647SHoward Hinnant    return !(__x < nullptr);
347867f39647SHoward Hinnant}
347967f39647SHoward Hinnant
348067f39647SHoward Hinnanttemplate<class _Tp>
348167f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
348267f39647SHoward Hinnantbool
348367f39647SHoward Hinnantoperator>=(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT
348467f39647SHoward Hinnant{
348567f39647SHoward Hinnant    return !(__x < nullptr);
348667f39647SHoward Hinnant}
348767f39647SHoward Hinnant
348867f39647SHoward Hinnanttemplate<class _Tp>
348967f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
349067f39647SHoward Hinnantbool
349167f39647SHoward Hinnantoperator>=(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT
349267f39647SHoward Hinnant{
349367f39647SHoward Hinnant    return !(nullptr < __x);
34943e519524SHoward Hinnant}
34953e519524SHoward Hinnant
34963e519524SHoward Hinnanttemplate<class _Tp>
34973e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
34983e519524SHoward Hinnantvoid
34993739fe79SHoward Hinnantswap(shared_ptr<_Tp>& __x, shared_ptr<_Tp>& __y) _NOEXCEPT
35003e519524SHoward Hinnant{
35013e519524SHoward Hinnant    __x.swap(__y);
35023e519524SHoward Hinnant}
35033e519524SHoward Hinnant
35043e519524SHoward Hinnanttemplate<class _Tp, class _Up>
35053e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
35063e519524SHoward Hinnantshared_ptr<_Tp>
35073739fe79SHoward Hinnantstatic_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT
35083e519524SHoward Hinnant{
3509ce195fb2Szoecarver    return shared_ptr<_Tp>(__r,
3510ce195fb2Szoecarver                           static_cast<
3511ce195fb2Szoecarver                               typename shared_ptr<_Tp>::element_type*>(__r.get()));
35123e519524SHoward Hinnant}
35133e519524SHoward Hinnant
35143e519524SHoward Hinnanttemplate<class _Tp, class _Up>
35153e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
35163e519524SHoward Hinnantshared_ptr<_Tp>
35173739fe79SHoward Hinnantdynamic_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT
35183e519524SHoward Hinnant{
3519ce195fb2Szoecarver    typedef typename shared_ptr<_Tp>::element_type _ET;
3520ce195fb2Szoecarver    _ET* __p = dynamic_cast<_ET*>(__r.get());
35213e519524SHoward Hinnant    return __p ? shared_ptr<_Tp>(__r, __p) : shared_ptr<_Tp>();
35223e519524SHoward Hinnant}
35233e519524SHoward Hinnant
35243e519524SHoward Hinnanttemplate<class _Tp, class _Up>
35253e519524SHoward Hinnantshared_ptr<_Tp>
35263739fe79SHoward Hinnantconst_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT
35273e519524SHoward Hinnant{
3528ce195fb2Szoecarver    typedef typename shared_ptr<_Tp>::element_type _RTp;
35298e25104bSHoward Hinnant    return shared_ptr<_Tp>(__r, const_cast<_RTp*>(__r.get()));
35303e519524SHoward Hinnant}
35313e519524SHoward Hinnant
3532ce195fb2Szoecarvertemplate<class _Tp, class _Up>
3533ce195fb2Szoecarvershared_ptr<_Tp>
3534ce195fb2Szoecarverreinterpret_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT
3535ce195fb2Szoecarver{
3536ce195fb2Szoecarver    return shared_ptr<_Tp>(__r,
3537ce195fb2Szoecarver                           reinterpret_cast<
3538ce195fb2Szoecarver                               typename shared_ptr<_Tp>::element_type*>(__r.get()));
3539ce195fb2Szoecarver}
3540ce195fb2Szoecarver
354154b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI
354254b409fdSHoward Hinnant
35433e519524SHoward Hinnanttemplate<class _Dp, class _Tp>
35443e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
35453e519524SHoward Hinnant_Dp*
35463739fe79SHoward Hinnantget_deleter(const shared_ptr<_Tp>& __p) _NOEXCEPT
35473e519524SHoward Hinnant{
35483e519524SHoward Hinnant    return __p.template __get_deleter<_Dp>();
35493e519524SHoward Hinnant}
35503e519524SHoward Hinnant
3551b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_RTTI
355254b409fdSHoward Hinnant
35533e519524SHoward Hinnanttemplate<class _Tp>
355476887bc4SVy Nguyenclass _LIBCPP_SHARED_PTR_TRIVIAL_ABI _LIBCPP_TEMPLATE_VIS weak_ptr
35553e519524SHoward Hinnant{
35563e519524SHoward Hinnantpublic:
35573e519524SHoward Hinnant    typedef _Tp element_type;
35583e519524SHoward Hinnantprivate:
35593e519524SHoward Hinnant    element_type*        __ptr_;
35603e519524SHoward Hinnant    __shared_weak_count* __cntrl_;
35613e519524SHoward Hinnant
35623e519524SHoward Hinnantpublic:
3563906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
3564c0937e8aSHoward Hinnant    _LIBCPP_CONSTEXPR weak_ptr() _NOEXCEPT;
3565906c872dSEvgeniy Stepanov    template<class _Yp> _LIBCPP_INLINE_VISIBILITY weak_ptr(shared_ptr<_Yp> const& __r,
35663739fe79SHoward Hinnant                   typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0)
35673739fe79SHoward Hinnant                        _NOEXCEPT;
3568906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
35693739fe79SHoward Hinnant    weak_ptr(weak_ptr const& __r) _NOEXCEPT;
3570906c872dSEvgeniy Stepanov    template<class _Yp> _LIBCPP_INLINE_VISIBILITY weak_ptr(weak_ptr<_Yp> const& __r,
35713739fe79SHoward Hinnant                   typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0)
35723739fe79SHoward Hinnant                         _NOEXCEPT;
35733e519524SHoward Hinnant
3574906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
35758e25104bSHoward Hinnant    weak_ptr(weak_ptr&& __r) _NOEXCEPT;
3576906c872dSEvgeniy Stepanov    template<class _Yp> _LIBCPP_INLINE_VISIBILITY weak_ptr(weak_ptr<_Yp>&& __r,
35778e25104bSHoward Hinnant                   typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0)
35788e25104bSHoward Hinnant                         _NOEXCEPT;
35793e519524SHoward Hinnant    ~weak_ptr();
35803e519524SHoward Hinnant
3581906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
35823739fe79SHoward Hinnant    weak_ptr& operator=(weak_ptr const& __r) _NOEXCEPT;
35838e25104bSHoward Hinnant    template<class _Yp>
35848e25104bSHoward Hinnant        typename enable_if
35858e25104bSHoward Hinnant        <
35868e25104bSHoward Hinnant            is_convertible<_Yp*, element_type*>::value,
35878e25104bSHoward Hinnant            weak_ptr&
35888e25104bSHoward Hinnant        >::type
3589906c872dSEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
35908e25104bSHoward Hinnant        operator=(weak_ptr<_Yp> const& __r) _NOEXCEPT;
35918e25104bSHoward Hinnant
3592906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
35938e25104bSHoward Hinnant    weak_ptr& operator=(weak_ptr&& __r) _NOEXCEPT;
35948e25104bSHoward Hinnant    template<class _Yp>
35958e25104bSHoward Hinnant        typename enable_if
35968e25104bSHoward Hinnant        <
35978e25104bSHoward Hinnant            is_convertible<_Yp*, element_type*>::value,
35988e25104bSHoward Hinnant            weak_ptr&
35998e25104bSHoward Hinnant        >::type
3600906c872dSEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
36018e25104bSHoward Hinnant        operator=(weak_ptr<_Yp>&& __r) _NOEXCEPT;
36028e25104bSHoward Hinnant
36038e25104bSHoward Hinnant    template<class _Yp>
36048e25104bSHoward Hinnant        typename enable_if
36058e25104bSHoward Hinnant        <
36068e25104bSHoward Hinnant            is_convertible<_Yp*, element_type*>::value,
36078e25104bSHoward Hinnant            weak_ptr&
36088e25104bSHoward Hinnant        >::type
3609906c872dSEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
36108e25104bSHoward Hinnant        operator=(shared_ptr<_Yp> const& __r) _NOEXCEPT;
36113e519524SHoward Hinnant
3612906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
36133739fe79SHoward Hinnant    void swap(weak_ptr& __r) _NOEXCEPT;
3614906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
36153739fe79SHoward Hinnant    void reset() _NOEXCEPT;
36163e519524SHoward Hinnant
3617848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
36183739fe79SHoward Hinnant    long use_count() const _NOEXCEPT
36193739fe79SHoward Hinnant        {return __cntrl_ ? __cntrl_->use_count() : 0;}
3620848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
36213739fe79SHoward Hinnant    bool expired() const _NOEXCEPT
3622527a7fdfSBruce Mitchener        {return __cntrl_ == nullptr || __cntrl_->use_count() == 0;}
36233739fe79SHoward Hinnant    shared_ptr<_Tp> lock() const _NOEXCEPT;
3624848a5374SHoward Hinnant    template<class _Up>
3625848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
362636bc7178SMarshall Clow        bool owner_before(const shared_ptr<_Up>& __r) const _NOEXCEPT
36273e519524SHoward Hinnant        {return __cntrl_ < __r.__cntrl_;}
3628848a5374SHoward Hinnant    template<class _Up>
3629848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
363036bc7178SMarshall Clow        bool owner_before(const weak_ptr<_Up>& __r) const _NOEXCEPT
36313e519524SHoward Hinnant        {return __cntrl_ < __r.__cntrl_;}
36323e519524SHoward Hinnant
3633e2f2d1edSEric Fiselier    template <class _Up> friend class _LIBCPP_TEMPLATE_VIS weak_ptr;
3634e2f2d1edSEric Fiselier    template <class _Up> friend class _LIBCPP_TEMPLATE_VIS shared_ptr;
36353e519524SHoward Hinnant};
36363e519524SHoward Hinnant
363783564056SLogan Smith#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
363883564056SLogan Smithtemplate<class _Tp>
363983564056SLogan Smithweak_ptr(shared_ptr<_Tp>) -> weak_ptr<_Tp>;
364083564056SLogan Smith#endif
364183564056SLogan Smith
36423e519524SHoward Hinnanttemplate<class _Tp>
3643906c872dSEvgeniy Stepanovinline
3644c0937e8aSHoward Hinnant_LIBCPP_CONSTEXPR
36453739fe79SHoward Hinnantweak_ptr<_Tp>::weak_ptr() _NOEXCEPT
3646527a7fdfSBruce Mitchener    : __ptr_(nullptr),
3647527a7fdfSBruce Mitchener      __cntrl_(nullptr)
36483e519524SHoward Hinnant{
36493e519524SHoward Hinnant}
36503e519524SHoward Hinnant
36513e519524SHoward Hinnanttemplate<class _Tp>
3652906c872dSEvgeniy Stepanovinline
36533739fe79SHoward Hinnantweak_ptr<_Tp>::weak_ptr(weak_ptr const& __r) _NOEXCEPT
36543e519524SHoward Hinnant    : __ptr_(__r.__ptr_),
36553e519524SHoward Hinnant      __cntrl_(__r.__cntrl_)
36563e519524SHoward Hinnant{
36573e519524SHoward Hinnant    if (__cntrl_)
36583e519524SHoward Hinnant        __cntrl_->__add_weak();
36593e519524SHoward Hinnant}
36603e519524SHoward Hinnant
36613e519524SHoward Hinnanttemplate<class _Tp>
36623e519524SHoward Hinnanttemplate<class _Yp>
3663906c872dSEvgeniy Stepanovinline
36643e519524SHoward Hinnantweak_ptr<_Tp>::weak_ptr(shared_ptr<_Yp> const& __r,
36655eb6bdfaSHoward Hinnant                        typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type)
36663739fe79SHoward Hinnant                         _NOEXCEPT
36673e519524SHoward Hinnant    : __ptr_(__r.__ptr_),
36683e519524SHoward Hinnant      __cntrl_(__r.__cntrl_)
36693e519524SHoward Hinnant{
36703e519524SHoward Hinnant    if (__cntrl_)
36713e519524SHoward Hinnant        __cntrl_->__add_weak();
36723e519524SHoward Hinnant}
36733e519524SHoward Hinnant
36743e519524SHoward Hinnanttemplate<class _Tp>
36753e519524SHoward Hinnanttemplate<class _Yp>
3676906c872dSEvgeniy Stepanovinline
36773e519524SHoward Hinnantweak_ptr<_Tp>::weak_ptr(weak_ptr<_Yp> const& __r,
36785eb6bdfaSHoward Hinnant                        typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type)
36793739fe79SHoward Hinnant         _NOEXCEPT
36803e519524SHoward Hinnant    : __ptr_(__r.__ptr_),
36813e519524SHoward Hinnant      __cntrl_(__r.__cntrl_)
36823e519524SHoward Hinnant{
36833e519524SHoward Hinnant    if (__cntrl_)
36843e519524SHoward Hinnant        __cntrl_->__add_weak();
36853e519524SHoward Hinnant}
36863e519524SHoward Hinnant
36878e25104bSHoward Hinnanttemplate<class _Tp>
3688906c872dSEvgeniy Stepanovinline
36898e25104bSHoward Hinnantweak_ptr<_Tp>::weak_ptr(weak_ptr&& __r) _NOEXCEPT
36908e25104bSHoward Hinnant    : __ptr_(__r.__ptr_),
36918e25104bSHoward Hinnant      __cntrl_(__r.__cntrl_)
36928e25104bSHoward Hinnant{
3693527a7fdfSBruce Mitchener    __r.__ptr_ = nullptr;
3694527a7fdfSBruce Mitchener    __r.__cntrl_ = nullptr;
36958e25104bSHoward Hinnant}
36968e25104bSHoward Hinnant
36978e25104bSHoward Hinnanttemplate<class _Tp>
36988e25104bSHoward Hinnanttemplate<class _Yp>
3699906c872dSEvgeniy Stepanovinline
37008e25104bSHoward Hinnantweak_ptr<_Tp>::weak_ptr(weak_ptr<_Yp>&& __r,
37018e25104bSHoward Hinnant                        typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type)
37028e25104bSHoward Hinnant         _NOEXCEPT
37038e25104bSHoward Hinnant    : __ptr_(__r.__ptr_),
37048e25104bSHoward Hinnant      __cntrl_(__r.__cntrl_)
37058e25104bSHoward Hinnant{
3706527a7fdfSBruce Mitchener    __r.__ptr_ = nullptr;
3707527a7fdfSBruce Mitchener    __r.__cntrl_ = nullptr;
37088e25104bSHoward Hinnant}
37098e25104bSHoward Hinnant
37103e519524SHoward Hinnanttemplate<class _Tp>
37113e519524SHoward Hinnantweak_ptr<_Tp>::~weak_ptr()
37123e519524SHoward Hinnant{
37133e519524SHoward Hinnant    if (__cntrl_)
37143e519524SHoward Hinnant        __cntrl_->__release_weak();
37153e519524SHoward Hinnant}
37163e519524SHoward Hinnant
37173e519524SHoward Hinnanttemplate<class _Tp>
3718906c872dSEvgeniy Stepanovinline
37193e519524SHoward Hinnantweak_ptr<_Tp>&
37203739fe79SHoward Hinnantweak_ptr<_Tp>::operator=(weak_ptr const& __r) _NOEXCEPT
37213e519524SHoward Hinnant{
37223e519524SHoward Hinnant    weak_ptr(__r).swap(*this);
37233e519524SHoward Hinnant    return *this;
37243e519524SHoward Hinnant}
37253e519524SHoward Hinnant
37263e519524SHoward Hinnanttemplate<class _Tp>
37273e519524SHoward Hinnanttemplate<class _Yp>
3728906c872dSEvgeniy Stepanovinline
37298e25104bSHoward Hinnanttypename enable_if
37308e25104bSHoward Hinnant<
37318e25104bSHoward Hinnant    is_convertible<_Yp*, _Tp*>::value,
37323e519524SHoward Hinnant    weak_ptr<_Tp>&
37338e25104bSHoward Hinnant>::type
37343739fe79SHoward Hinnantweak_ptr<_Tp>::operator=(weak_ptr<_Yp> const& __r) _NOEXCEPT
37353e519524SHoward Hinnant{
37363e519524SHoward Hinnant    weak_ptr(__r).swap(*this);
37373e519524SHoward Hinnant    return *this;
37383e519524SHoward Hinnant}
37393e519524SHoward Hinnant
37408e25104bSHoward Hinnanttemplate<class _Tp>
3741906c872dSEvgeniy Stepanovinline
37428e25104bSHoward Hinnantweak_ptr<_Tp>&
37438e25104bSHoward Hinnantweak_ptr<_Tp>::operator=(weak_ptr&& __r) _NOEXCEPT
37448e25104bSHoward Hinnant{
37458e25104bSHoward Hinnant    weak_ptr(_VSTD::move(__r)).swap(*this);
37468e25104bSHoward Hinnant    return *this;
37478e25104bSHoward Hinnant}
37488e25104bSHoward Hinnant
37493e519524SHoward Hinnanttemplate<class _Tp>
37503e519524SHoward Hinnanttemplate<class _Yp>
3751906c872dSEvgeniy Stepanovinline
37528e25104bSHoward Hinnanttypename enable_if
37538e25104bSHoward Hinnant<
37548e25104bSHoward Hinnant    is_convertible<_Yp*, _Tp*>::value,
37553e519524SHoward Hinnant    weak_ptr<_Tp>&
37568e25104bSHoward Hinnant>::type
37578e25104bSHoward Hinnantweak_ptr<_Tp>::operator=(weak_ptr<_Yp>&& __r) _NOEXCEPT
37588e25104bSHoward Hinnant{
37598e25104bSHoward Hinnant    weak_ptr(_VSTD::move(__r)).swap(*this);
37608e25104bSHoward Hinnant    return *this;
37618e25104bSHoward Hinnant}
37628e25104bSHoward Hinnant
37638e25104bSHoward Hinnanttemplate<class _Tp>
37648e25104bSHoward Hinnanttemplate<class _Yp>
3765906c872dSEvgeniy Stepanovinline
37668e25104bSHoward Hinnanttypename enable_if
37678e25104bSHoward Hinnant<
37688e25104bSHoward Hinnant    is_convertible<_Yp*, _Tp*>::value,
37698e25104bSHoward Hinnant    weak_ptr<_Tp>&
37708e25104bSHoward Hinnant>::type
37713739fe79SHoward Hinnantweak_ptr<_Tp>::operator=(shared_ptr<_Yp> const& __r) _NOEXCEPT
37723e519524SHoward Hinnant{
37733e519524SHoward Hinnant    weak_ptr(__r).swap(*this);
37743e519524SHoward Hinnant    return *this;
37753e519524SHoward Hinnant}
37763e519524SHoward Hinnant
37773e519524SHoward Hinnanttemplate<class _Tp>
3778906c872dSEvgeniy Stepanovinline
37793e519524SHoward Hinnantvoid
37803739fe79SHoward Hinnantweak_ptr<_Tp>::swap(weak_ptr& __r) _NOEXCEPT
37813e519524SHoward Hinnant{
3782ce48a113SHoward Hinnant    _VSTD::swap(__ptr_, __r.__ptr_);
3783ce48a113SHoward Hinnant    _VSTD::swap(__cntrl_, __r.__cntrl_);
37843e519524SHoward Hinnant}
37853e519524SHoward Hinnant
37863e519524SHoward Hinnanttemplate<class _Tp>
37873e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
37883e519524SHoward Hinnantvoid
37893739fe79SHoward Hinnantswap(weak_ptr<_Tp>& __x, weak_ptr<_Tp>& __y) _NOEXCEPT
37903e519524SHoward Hinnant{
37913e519524SHoward Hinnant    __x.swap(__y);
37923e519524SHoward Hinnant}
37933e519524SHoward Hinnant
37943e519524SHoward Hinnanttemplate<class _Tp>
3795906c872dSEvgeniy Stepanovinline
37963e519524SHoward Hinnantvoid
37973739fe79SHoward Hinnantweak_ptr<_Tp>::reset() _NOEXCEPT
37983e519524SHoward Hinnant{
37993e519524SHoward Hinnant    weak_ptr().swap(*this);
38003e519524SHoward Hinnant}
38013e519524SHoward Hinnant
38023e519524SHoward Hinnanttemplate<class _Tp>
38033e519524SHoward Hinnanttemplate<class _Yp>
38043e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(const weak_ptr<_Yp>& __r,
3805dc83e779SMarshall Clow                            typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type)
38063e519524SHoward Hinnant    : __ptr_(__r.__ptr_),
38073e519524SHoward Hinnant      __cntrl_(__r.__cntrl_ ? __r.__cntrl_->lock() : __r.__cntrl_)
38083e519524SHoward Hinnant{
3809527a7fdfSBruce Mitchener    if (__cntrl_ == nullptr)
3810d437fa5cSMarshall Clow        __throw_bad_weak_ptr();
38113e519524SHoward Hinnant}
38123e519524SHoward Hinnant
38133e519524SHoward Hinnanttemplate<class _Tp>
38143e519524SHoward Hinnantshared_ptr<_Tp>
38153739fe79SHoward Hinnantweak_ptr<_Tp>::lock() const _NOEXCEPT
38163e519524SHoward Hinnant{
38173e519524SHoward Hinnant    shared_ptr<_Tp> __r;
38183e519524SHoward Hinnant    __r.__cntrl_ = __cntrl_ ? __cntrl_->lock() : __cntrl_;
38193e519524SHoward Hinnant    if (__r.__cntrl_)
38203e519524SHoward Hinnant        __r.__ptr_ = __ptr_;
38213e519524SHoward Hinnant    return __r;
38223e519524SHoward Hinnant}
38233e519524SHoward Hinnant
3824183c010cSMarshall Clow#if _LIBCPP_STD_VER > 14
3825183c010cSMarshall Clowtemplate <class _Tp = void> struct owner_less;
3826183c010cSMarshall Clow#else
38273e519524SHoward Hinnanttemplate <class _Tp> struct owner_less;
3828183c010cSMarshall Clow#endif
38293e519524SHoward Hinnant
38303e519524SHoward Hinnanttemplate <class _Tp>
3831e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS owner_less<shared_ptr<_Tp> >
38323e519524SHoward Hinnant    : binary_function<shared_ptr<_Tp>, shared_ptr<_Tp>, bool>
38333e519524SHoward Hinnant{
38343e519524SHoward Hinnant    typedef bool result_type;
3835848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
383636bc7178SMarshall Clow    bool operator()(shared_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const _NOEXCEPT
38373e519524SHoward Hinnant        {return __x.owner_before(__y);}
3838848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
383936bc7178SMarshall Clow    bool operator()(shared_ptr<_Tp> const& __x,   weak_ptr<_Tp> const& __y) const _NOEXCEPT
38403e519524SHoward Hinnant        {return __x.owner_before(__y);}
3841848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
384236bc7178SMarshall Clow    bool operator()(  weak_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const _NOEXCEPT
38433e519524SHoward Hinnant        {return __x.owner_before(__y);}
38443e519524SHoward Hinnant};
38453e519524SHoward Hinnant
38463e519524SHoward Hinnanttemplate <class _Tp>
3847e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS owner_less<weak_ptr<_Tp> >
38483e519524SHoward Hinnant    : binary_function<weak_ptr<_Tp>, weak_ptr<_Tp>, bool>
38493e519524SHoward Hinnant{
38503e519524SHoward Hinnant    typedef bool result_type;
3851848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
385236bc7178SMarshall Clow    bool operator()(  weak_ptr<_Tp> const& __x,   weak_ptr<_Tp> const& __y) const _NOEXCEPT
38533e519524SHoward Hinnant        {return __x.owner_before(__y);}
3854848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
385536bc7178SMarshall Clow    bool operator()(shared_ptr<_Tp> const& __x,   weak_ptr<_Tp> const& __y) const _NOEXCEPT
38563e519524SHoward Hinnant        {return __x.owner_before(__y);}
3857848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
385836bc7178SMarshall Clow    bool operator()(  weak_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const _NOEXCEPT
38593e519524SHoward Hinnant        {return __x.owner_before(__y);}
38603e519524SHoward Hinnant};
38613e519524SHoward Hinnant
3862183c010cSMarshall Clow#if _LIBCPP_STD_VER > 14
3863183c010cSMarshall Clowtemplate <>
3864e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS owner_less<void>
3865183c010cSMarshall Clow{
3866183c010cSMarshall Clow    template <class _Tp, class _Up>
3867183c010cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
386836bc7178SMarshall Clow    bool operator()( shared_ptr<_Tp> const& __x, shared_ptr<_Up> const& __y) const _NOEXCEPT
3869183c010cSMarshall Clow        {return __x.owner_before(__y);}
3870183c010cSMarshall Clow    template <class _Tp, class _Up>
3871183c010cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
387236bc7178SMarshall Clow    bool operator()( shared_ptr<_Tp> const& __x,   weak_ptr<_Up> const& __y) const _NOEXCEPT
3873183c010cSMarshall Clow        {return __x.owner_before(__y);}
3874183c010cSMarshall Clow    template <class _Tp, class _Up>
3875183c010cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
387636bc7178SMarshall Clow    bool operator()(   weak_ptr<_Tp> const& __x, shared_ptr<_Up> const& __y) const _NOEXCEPT
3877183c010cSMarshall Clow        {return __x.owner_before(__y);}
3878183c010cSMarshall Clow    template <class _Tp, class _Up>
3879183c010cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
388036bc7178SMarshall Clow    bool operator()(   weak_ptr<_Tp> const& __x,   weak_ptr<_Up> const& __y) const _NOEXCEPT
3881183c010cSMarshall Clow        {return __x.owner_before(__y);}
3882183c010cSMarshall Clow    typedef void is_transparent;
3883183c010cSMarshall Clow};
3884183c010cSMarshall Clow#endif
3885183c010cSMarshall Clow
38863e519524SHoward Hinnanttemplate<class _Tp>
3887e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS enable_shared_from_this
38883e519524SHoward Hinnant{
38893e519524SHoward Hinnant    mutable weak_ptr<_Tp> __weak_this_;
38903e519524SHoward Hinnantprotected:
3891c0937e8aSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
38923739fe79SHoward Hinnant    enable_shared_from_this() _NOEXCEPT {}
3893848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
38943739fe79SHoward Hinnant    enable_shared_from_this(enable_shared_from_this const&) _NOEXCEPT {}
3895848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
38963739fe79SHoward Hinnant    enable_shared_from_this& operator=(enable_shared_from_this const&) _NOEXCEPT
38973739fe79SHoward Hinnant        {return *this;}
3898848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
38993e519524SHoward Hinnant    ~enable_shared_from_this() {}
39003e519524SHoward Hinnantpublic:
3901848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
39023739fe79SHoward Hinnant    shared_ptr<_Tp> shared_from_this()
39033739fe79SHoward Hinnant        {return shared_ptr<_Tp>(__weak_this_);}
3904848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
39053739fe79SHoward Hinnant    shared_ptr<_Tp const> shared_from_this() const
39063739fe79SHoward Hinnant        {return shared_ptr<const _Tp>(__weak_this_);}
39073e519524SHoward Hinnant
390888f5bfdcSEric Fiselier#if _LIBCPP_STD_VER > 14
390988f5bfdcSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
391088f5bfdcSEric Fiselier    weak_ptr<_Tp> weak_from_this() _NOEXCEPT
391188f5bfdcSEric Fiselier       { return __weak_this_; }
391288f5bfdcSEric Fiselier
391388f5bfdcSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
391488f5bfdcSEric Fiselier    weak_ptr<const _Tp> weak_from_this() const _NOEXCEPT
391588f5bfdcSEric Fiselier        { return __weak_this_; }
391688f5bfdcSEric Fiselier#endif // _LIBCPP_STD_VER > 14
391788f5bfdcSEric Fiselier
39183e519524SHoward Hinnant    template <class _Up> friend class shared_ptr;
39193e519524SHoward Hinnant};
39203e519524SHoward Hinnant
3921d1803b6cSHoward Hinnanttemplate <class _Tp>
3922e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS hash<shared_ptr<_Tp> >
3923d1803b6cSHoward Hinnant{
3924d1803b6cSHoward Hinnant    typedef shared_ptr<_Tp>      argument_type;
3925d1803b6cSHoward Hinnant    typedef size_t               result_type;
3926f9127593SEric Fiselier
3927848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
39283739fe79SHoward Hinnant    result_type operator()(const argument_type& __ptr) const _NOEXCEPT
3929d1803b6cSHoward Hinnant    {
3930ce195fb2Szoecarver        return hash<typename shared_ptr<_Tp>::element_type*>()(__ptr.get());
3931d1803b6cSHoward Hinnant    }
3932d1803b6cSHoward Hinnant};
3933d1803b6cSHoward Hinnant
3934c003db1fSHoward Hinnanttemplate<class _CharT, class _Traits, class _Yp>
3935e3163f5aSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3936e3163f5aSHoward Hinnantbasic_ostream<_CharT, _Traits>&
3937c003db1fSHoward Hinnantoperator<<(basic_ostream<_CharT, _Traits>& __os, shared_ptr<_Yp> const& __p);
3938e3163f5aSHoward Hinnant
3939df93bad1SEric Fiselier
3940df93bad1SEric Fiselier#if !defined(_LIBCPP_HAS_NO_ATOMIC_HEADER)
3941d77851e8SHoward Hinnant
3942f0544c20SHoward Hinnantclass _LIBCPP_TYPE_VIS __sp_mut
3943d77851e8SHoward Hinnant{
394454d333a6SHoward Hinnant    void* __lx;
3945d77851e8SHoward Hinnantpublic:
3946d77851e8SHoward Hinnant    void lock() _NOEXCEPT;
3947d77851e8SHoward Hinnant    void unlock() _NOEXCEPT;
3948d77851e8SHoward Hinnant
3949d77851e8SHoward Hinnantprivate:
3950d77851e8SHoward Hinnant    _LIBCPP_CONSTEXPR __sp_mut(void*) _NOEXCEPT;
3951d77851e8SHoward Hinnant    __sp_mut(const __sp_mut&);
3952d77851e8SHoward Hinnant    __sp_mut& operator=(const __sp_mut&);
3953d77851e8SHoward Hinnant
39546e41256fSHoward Hinnant    friend _LIBCPP_FUNC_VIS __sp_mut& __get_sp_mut(const void*);
3955d77851e8SHoward Hinnant};
3956d77851e8SHoward Hinnant
3957e9c66ad9SMehdi Amini_LIBCPP_FUNC_VIS _LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR
3958e9c66ad9SMehdi Amini__sp_mut& __get_sp_mut(const void*);
3959d77851e8SHoward Hinnant
3960d77851e8SHoward Hinnanttemplate <class _Tp>
3961d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3962d77851e8SHoward Hinnantbool
3963d77851e8SHoward Hinnantatomic_is_lock_free(const shared_ptr<_Tp>*)
3964d77851e8SHoward Hinnant{
3965d77851e8SHoward Hinnant    return false;
3966d77851e8SHoward Hinnant}
3967d77851e8SHoward Hinnant
3968d77851e8SHoward Hinnanttemplate <class _Tp>
3969e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR
3970d77851e8SHoward Hinnantshared_ptr<_Tp>
3971d77851e8SHoward Hinnantatomic_load(const shared_ptr<_Tp>* __p)
3972d77851e8SHoward Hinnant{
3973d77851e8SHoward Hinnant    __sp_mut& __m = __get_sp_mut(__p);
3974d77851e8SHoward Hinnant    __m.lock();
3975d77851e8SHoward Hinnant    shared_ptr<_Tp> __q = *__p;
3976d77851e8SHoward Hinnant    __m.unlock();
3977d77851e8SHoward Hinnant    return __q;
3978d77851e8SHoward Hinnant}
3979d77851e8SHoward Hinnant
3980d77851e8SHoward Hinnanttemplate <class _Tp>
3981d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3982e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR
3983d77851e8SHoward Hinnantshared_ptr<_Tp>
3984d77851e8SHoward Hinnantatomic_load_explicit(const shared_ptr<_Tp>* __p, memory_order)
3985d77851e8SHoward Hinnant{
3986d77851e8SHoward Hinnant    return atomic_load(__p);
3987d77851e8SHoward Hinnant}
3988d77851e8SHoward Hinnant
3989d77851e8SHoward Hinnanttemplate <class _Tp>
3990e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR
3991d77851e8SHoward Hinnantvoid
3992d77851e8SHoward Hinnantatomic_store(shared_ptr<_Tp>* __p, shared_ptr<_Tp> __r)
3993d77851e8SHoward Hinnant{
3994d77851e8SHoward Hinnant    __sp_mut& __m = __get_sp_mut(__p);
3995d77851e8SHoward Hinnant    __m.lock();
3996d77851e8SHoward Hinnant    __p->swap(__r);
3997d77851e8SHoward Hinnant    __m.unlock();
3998d77851e8SHoward Hinnant}
3999d77851e8SHoward Hinnant
4000d77851e8SHoward Hinnanttemplate <class _Tp>
4001d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4002e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR
4003d77851e8SHoward Hinnantvoid
4004d77851e8SHoward Hinnantatomic_store_explicit(shared_ptr<_Tp>* __p, shared_ptr<_Tp> __r, memory_order)
4005d77851e8SHoward Hinnant{
4006d77851e8SHoward Hinnant    atomic_store(__p, __r);
4007d77851e8SHoward Hinnant}
4008d77851e8SHoward Hinnant
4009d77851e8SHoward Hinnanttemplate <class _Tp>
4010e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR
4011d77851e8SHoward Hinnantshared_ptr<_Tp>
4012d77851e8SHoward Hinnantatomic_exchange(shared_ptr<_Tp>* __p, shared_ptr<_Tp> __r)
4013d77851e8SHoward Hinnant{
4014d77851e8SHoward Hinnant    __sp_mut& __m = __get_sp_mut(__p);
4015d77851e8SHoward Hinnant    __m.lock();
4016d77851e8SHoward Hinnant    __p->swap(__r);
4017d77851e8SHoward Hinnant    __m.unlock();
4018d77851e8SHoward Hinnant    return __r;
4019d77851e8SHoward Hinnant}
4020d77851e8SHoward Hinnant
4021d77851e8SHoward Hinnanttemplate <class _Tp>
4022d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4023e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR
4024d77851e8SHoward Hinnantshared_ptr<_Tp>
4025d77851e8SHoward Hinnantatomic_exchange_explicit(shared_ptr<_Tp>* __p, shared_ptr<_Tp> __r, memory_order)
4026d77851e8SHoward Hinnant{
4027d77851e8SHoward Hinnant    return atomic_exchange(__p, __r);
4028d77851e8SHoward Hinnant}
4029d77851e8SHoward Hinnant
4030d77851e8SHoward Hinnanttemplate <class _Tp>
4031e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR
4032d77851e8SHoward Hinnantbool
4033d77851e8SHoward Hinnantatomic_compare_exchange_strong(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v, shared_ptr<_Tp> __w)
4034d77851e8SHoward Hinnant{
40353379baebSMarshall Clow    shared_ptr<_Tp> __temp;
4036d77851e8SHoward Hinnant    __sp_mut& __m = __get_sp_mut(__p);
4037d77851e8SHoward Hinnant    __m.lock();
4038d77851e8SHoward Hinnant    if (__p->__owner_equivalent(*__v))
4039d77851e8SHoward Hinnant    {
40403379baebSMarshall Clow        _VSTD::swap(__temp, *__p);
4041d77851e8SHoward Hinnant        *__p = __w;
4042d77851e8SHoward Hinnant        __m.unlock();
4043d77851e8SHoward Hinnant        return true;
4044d77851e8SHoward Hinnant    }
40453379baebSMarshall Clow    _VSTD::swap(__temp, *__v);
4046d77851e8SHoward Hinnant    *__v = *__p;
4047d77851e8SHoward Hinnant    __m.unlock();
4048d77851e8SHoward Hinnant    return false;
4049d77851e8SHoward Hinnant}
4050d77851e8SHoward Hinnant
4051d77851e8SHoward Hinnanttemplate <class _Tp>
4052d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4053e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR
4054d77851e8SHoward Hinnantbool
4055d77851e8SHoward Hinnantatomic_compare_exchange_weak(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v, shared_ptr<_Tp> __w)
4056d77851e8SHoward Hinnant{
4057d77851e8SHoward Hinnant    return atomic_compare_exchange_strong(__p, __v, __w);
4058d77851e8SHoward Hinnant}
4059d77851e8SHoward Hinnant
4060d77851e8SHoward Hinnanttemplate <class _Tp>
4061d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4062e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR
4063d77851e8SHoward Hinnantbool
4064d77851e8SHoward Hinnantatomic_compare_exchange_strong_explicit(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v,
4065d77851e8SHoward Hinnant                                        shared_ptr<_Tp> __w, memory_order, memory_order)
4066d77851e8SHoward Hinnant{
4067d77851e8SHoward Hinnant    return atomic_compare_exchange_strong(__p, __v, __w);
4068d77851e8SHoward Hinnant}
4069d77851e8SHoward Hinnant
4070d77851e8SHoward Hinnanttemplate <class _Tp>
4071d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4072e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR
4073d77851e8SHoward Hinnantbool
4074d77851e8SHoward Hinnantatomic_compare_exchange_weak_explicit(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v,
4075d77851e8SHoward Hinnant                                      shared_ptr<_Tp> __w, memory_order, memory_order)
4076d77851e8SHoward Hinnant{
4077d77851e8SHoward Hinnant    return atomic_compare_exchange_weak(__p, __v, __w);
4078d77851e8SHoward Hinnant}
4079d77851e8SHoward Hinnant
4080df93bad1SEric Fiselier#endif  // !defined(_LIBCPP_HAS_NO_ATOMIC_HEADER)
4081d77851e8SHoward Hinnant
40823e519524SHoward Hinnant//enum class
4083528600c4SEric Fiselier#if defined(_LIBCPP_ABI_POINTER_SAFETY_ENUM_TYPE)
4084528600c4SEric Fiselier# ifndef _LIBCPP_CXX03_LANG
4085528600c4SEric Fiselierenum class pointer_safety : unsigned char {
4086528600c4SEric Fiselier  relaxed,
4087528600c4SEric Fiselier  preferred,
4088528600c4SEric Fiselier  strict
4089528600c4SEric Fiselier};
4090528600c4SEric Fiselier# endif
4091528600c4SEric Fiselier#else
40926e41256fSHoward Hinnantstruct _LIBCPP_TYPE_VIS pointer_safety
40933e519524SHoward Hinnant{
409454d333a6SHoward Hinnant    enum __lx
40953e519524SHoward Hinnant    {
40963e519524SHoward Hinnant        relaxed,
40973e519524SHoward Hinnant        preferred,
40983e519524SHoward Hinnant        strict
40993e519524SHoward Hinnant    };
41003e519524SHoward Hinnant
410154d333a6SHoward Hinnant    __lx __v_;
41023e519524SHoward Hinnant
4103848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
410476a01ea3SEric Fiselier    pointer_safety() : __v_() {}
410576a01ea3SEric Fiselier
410676a01ea3SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
410754d333a6SHoward Hinnant    pointer_safety(__lx __v) : __v_(__v) {}
4108848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
41093e519524SHoward Hinnant    operator int() const {return __v_;}
41103e519524SHoward Hinnant};
4111528600c4SEric Fiselier#endif
4112528600c4SEric Fiselier
4113528600c4SEric Fiselier#if !defined(_LIBCPP_ABI_POINTER_SAFETY_ENUM_TYPE) && \
4114c8e84ff2SLouis Dionne    defined(_LIBCPP_BUILDING_LIBRARY)
4115528600c4SEric Fiselier_LIBCPP_FUNC_VIS pointer_safety get_pointer_safety() _NOEXCEPT;
4116528600c4SEric Fiselier#else
4117528600c4SEric Fiselier// This function is only offered in C++03 under ABI v1.
4118528600c4SEric Fiselier# if !defined(_LIBCPP_ABI_POINTER_SAFETY_ENUM_TYPE) || !defined(_LIBCPP_CXX03_LANG)
4119528600c4SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY
4120528600c4SEric Fiselierpointer_safety get_pointer_safety() _NOEXCEPT {
4121528600c4SEric Fiselier  return pointer_safety::relaxed;
4122528600c4SEric Fiselier}
4123528600c4SEric Fiselier# endif
4124528600c4SEric Fiselier#endif
4125528600c4SEric Fiselier
41263e519524SHoward Hinnant
4127f0544c20SHoward Hinnant_LIBCPP_FUNC_VIS void declare_reachable(void* __p);
4128f0544c20SHoward Hinnant_LIBCPP_FUNC_VIS void declare_no_pointers(char* __p, size_t __n);
4129f0544c20SHoward Hinnant_LIBCPP_FUNC_VIS void undeclare_no_pointers(char* __p, size_t __n);
4130f0544c20SHoward Hinnant_LIBCPP_FUNC_VIS void* __undeclare_reachable(void* __p);
41313e519524SHoward Hinnant
41323e519524SHoward Hinnanttemplate <class _Tp>
41333e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
41343e519524SHoward Hinnant_Tp*
41353e519524SHoward Hinnantundeclare_reachable(_Tp* __p)
41363e519524SHoward Hinnant{
41373e519524SHoward Hinnant    return static_cast<_Tp*>(__undeclare_reachable(__p));
41383e519524SHoward Hinnant}
41393e519524SHoward Hinnant
4140f0544c20SHoward Hinnant_LIBCPP_FUNC_VIS void* align(size_t __align, size_t __sz, void*& __ptr, size_t& __space);
41413e519524SHoward Hinnant
4142e3fbe143SMarshall Clow// --- Helper for container swap --
4143e3fbe143SMarshall Clowtemplate <typename _Alloc>
4144e3fbe143SMarshall Clow_LIBCPP_INLINE_VISIBILITY
4145e3fbe143SMarshall Clowvoid __swap_allocator(_Alloc & __a1, _Alloc & __a2, true_type)
4146e3fbe143SMarshall Clow#if _LIBCPP_STD_VER >= 14
4147e3fbe143SMarshall Clow    _NOEXCEPT
4148e3fbe143SMarshall Clow#else
4149e3fbe143SMarshall Clow    _NOEXCEPT_(__is_nothrow_swappable<_Alloc>::value)
4150e3fbe143SMarshall Clow#endif
4151e3fbe143SMarshall Clow{
4152e3fbe143SMarshall Clow    using _VSTD::swap;
4153e3fbe143SMarshall Clow    swap(__a1, __a2);
4154e3fbe143SMarshall Clow}
4155e3fbe143SMarshall Clow
4156e3fbe143SMarshall Clowtemplate <typename _Alloc>
415789dd1dd2SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY
4158e3fbe143SMarshall Clowvoid __swap_allocator(_Alloc &, _Alloc &, false_type) _NOEXCEPT {}
4159e3fbe143SMarshall Clow
41606e965df6SArthur O'Dwyertemplate <typename _Alloc>
41616e965df6SArthur O'Dwyerinline _LIBCPP_INLINE_VISIBILITY
41626e965df6SArthur O'Dwyervoid __swap_allocator(_Alloc & __a1, _Alloc & __a2)
41636e965df6SArthur O'Dwyer#if _LIBCPP_STD_VER >= 14
41646e965df6SArthur O'Dwyer    _NOEXCEPT
41656e965df6SArthur O'Dwyer#else
41666e965df6SArthur O'Dwyer    _NOEXCEPT_(__is_nothrow_swappable<_Alloc>::value)
41676e965df6SArthur O'Dwyer#endif
41686e965df6SArthur O'Dwyer{
41696e965df6SArthur O'Dwyer    _VSTD::__swap_allocator(__a1, __a2,
41706e965df6SArthur O'Dwyer      integral_constant<bool, _VSTD::allocator_traits<_Alloc>::propagate_on_container_swap::value>());
41716e965df6SArthur O'Dwyer}
41726e965df6SArthur O'Dwyer
41731378a5aeSMarshall Clowtemplate <typename _Alloc, typename _Traits=allocator_traits<_Alloc> >
41741378a5aeSMarshall Clowstruct __noexcept_move_assign_container : public integral_constant<bool,
41751378a5aeSMarshall Clow    _Traits::propagate_on_container_move_assignment::value
41761378a5aeSMarshall Clow#if _LIBCPP_STD_VER > 14
41771378a5aeSMarshall Clow        || _Traits::is_always_equal::value
41781378a5aeSMarshall Clow#else
41791378a5aeSMarshall Clow        && is_nothrow_move_assignable<_Alloc>::value
41801378a5aeSMarshall Clow#endif
41811378a5aeSMarshall Clow    > {};
4182e3fbe143SMarshall Clow
4183dc3eb83dSMarshall Clow
4184dc3eb83dSMarshall Clowtemplate <class _Tp, class _Alloc>
4185dc3eb83dSMarshall Clowstruct __temp_value {
4186dc3eb83dSMarshall Clow    typedef allocator_traits<_Alloc> _Traits;
4187dc3eb83dSMarshall Clow
4188d108bf85SEric Fiselier    typename aligned_storage<sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp)>::type __v;
4189dc3eb83dSMarshall Clow    _Alloc &__a;
4190dc3eb83dSMarshall Clow
4191dc3eb83dSMarshall Clow    _Tp *__addr() { return reinterpret_cast<_Tp *>(addressof(__v)); }
4192dc3eb83dSMarshall Clow    _Tp &   get() { return *__addr(); }
4193dc3eb83dSMarshall Clow
4194dc3eb83dSMarshall Clow    template<class... _Args>
4195f11c00d7SPeter Collingbourne    _LIBCPP_NO_CFI
4196f11c00d7SPeter Collingbourne    __temp_value(_Alloc &__alloc, _Args&& ... __args) : __a(__alloc) {
4197f11c00d7SPeter Collingbourne      _Traits::construct(__a, reinterpret_cast<_Tp*>(addressof(__v)),
4198f11c00d7SPeter Collingbourne                         _VSTD::forward<_Args>(__args)...);
4199f11c00d7SPeter Collingbourne    }
4200dc3eb83dSMarshall Clow
4201dc3eb83dSMarshall Clow    ~__temp_value() { _Traits::destroy(__a, __addr()); }
4202dc3eb83dSMarshall Clow    };
4203dc3eb83dSMarshall Clow
420476b26852SMarshall Clowtemplate<typename _Alloc, typename = void, typename = void>
42050e22bf8cSMarshall Clowstruct __is_allocator : false_type {};
42060e22bf8cSMarshall Clow
42070e22bf8cSMarshall Clowtemplate<typename _Alloc>
42080e22bf8cSMarshall Clowstruct __is_allocator<_Alloc,
420976b26852SMarshall Clow       typename __void_t<typename _Alloc::value_type>::type,
421076b26852SMarshall Clow       typename __void_t<decltype(_VSTD::declval<_Alloc&>().allocate(size_t(0)))>::type
421176b26852SMarshall Clow     >
42120e22bf8cSMarshall Clow   : true_type {};
42130e22bf8cSMarshall Clow
4214d63dd874SEric Fiselier// __builtin_new_allocator -- A non-templated helper for allocating and
4215d63dd874SEric Fiselier// deallocating memory using __builtin_operator_new and
4216d63dd874SEric Fiselier// __builtin_operator_delete. It should be used in preference to
4217d63dd874SEric Fiselier// `std::allocator<T>` to avoid additional instantiations.
4218d63dd874SEric Fiselierstruct __builtin_new_allocator {
4219d63dd874SEric Fiselier  struct __builtin_new_deleter {
4220d63dd874SEric Fiselier    typedef void* pointer_type;
4221d63dd874SEric Fiselier
4222d63dd874SEric Fiselier    _LIBCPP_CONSTEXPR explicit __builtin_new_deleter(size_t __size, size_t __align)
4223d63dd874SEric Fiselier        : __size_(__size), __align_(__align) {}
4224d63dd874SEric Fiselier
4225d63dd874SEric Fiselier    void operator()(void* p) const _NOEXCEPT {
4226d586f92cSArthur O'Dwyer        _VSTD::__libcpp_deallocate(p, __size_, __align_);
4227d63dd874SEric Fiselier    }
4228d63dd874SEric Fiselier
4229d63dd874SEric Fiselier   private:
4230d63dd874SEric Fiselier    size_t __size_;
4231d63dd874SEric Fiselier    size_t __align_;
4232d63dd874SEric Fiselier  };
4233d63dd874SEric Fiselier
4234d63dd874SEric Fiselier  typedef unique_ptr<void, __builtin_new_deleter> __holder_t;
4235d63dd874SEric Fiselier
4236d63dd874SEric Fiselier  static __holder_t __allocate_bytes(size_t __s, size_t __align) {
4237d586f92cSArthur O'Dwyer      return __holder_t(_VSTD::__libcpp_allocate(__s, __align),
4238d63dd874SEric Fiselier                     __builtin_new_deleter(__s, __align));
4239d63dd874SEric Fiselier  }
4240d63dd874SEric Fiselier
4241d63dd874SEric Fiselier  static void __deallocate_bytes(void* __p, size_t __s,
4242d63dd874SEric Fiselier                                 size_t __align) _NOEXCEPT {
4243d586f92cSArthur O'Dwyer      _VSTD::__libcpp_deallocate(__p, __s, __align);
4244d63dd874SEric Fiselier  }
4245d63dd874SEric Fiselier
4246d63dd874SEric Fiselier  template <class _Tp>
4247d63dd874SEric Fiselier  _LIBCPP_NODEBUG _LIBCPP_ALWAYS_INLINE
4248d63dd874SEric Fiselier  static __holder_t __allocate_type(size_t __n) {
4249d63dd874SEric Fiselier      return __allocate_bytes(__n * sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp));
4250d63dd874SEric Fiselier  }
4251d63dd874SEric Fiselier
4252d63dd874SEric Fiselier  template <class _Tp>
4253d63dd874SEric Fiselier  _LIBCPP_NODEBUG _LIBCPP_ALWAYS_INLINE
4254d63dd874SEric Fiselier  static void __deallocate_type(void* __p, size_t __n) _NOEXCEPT {
4255d63dd874SEric Fiselier      __deallocate_bytes(__p, __n * sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp));
4256d63dd874SEric Fiselier  }
4257d63dd874SEric Fiselier};
4258d63dd874SEric Fiselier
4259d63dd874SEric Fiselier
42603e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
42613e519524SHoward Hinnant
4262a016efb1SEric Fiselier_LIBCPP_POP_MACROS
4263a016efb1SEric Fiselier
42640a06eb91SLouis Dionne#if defined(_LIBCPP_HAS_PARALLEL_ALGORITHMS) && _LIBCPP_STD_VER >= 17
426595689243SLouis Dionne#   include <__pstl_memory>
42660a06eb91SLouis Dionne#endif
42670a06eb91SLouis Dionne
42683e519524SHoward Hinnant#endif  // _LIBCPP_MEMORY
4269