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