13e519524SHoward Hinnant// -*- C++ -*- 23e519524SHoward Hinnant//===-------------------------- memory ------------------------------------===// 33e519524SHoward Hinnant// 45b08a8a4SHoward Hinnant// The LLVM Compiler Infrastructure 53e519524SHoward Hinnant// 6412dbebeSHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 7412dbebeSHoward Hinnant// Source Licenses. See LICENSE.TXT for details. 83e519524SHoward Hinnant// 93e519524SHoward Hinnant//===----------------------------------------------------------------------===// 103e519524SHoward Hinnant 113e519524SHoward Hinnant#ifndef _LIBCPP_MEMORY 123e519524SHoward Hinnant#define _LIBCPP_MEMORY 133e519524SHoward Hinnant 143e519524SHoward Hinnant/* 153e519524SHoward Hinnant memory synopsis 163e519524SHoward Hinnant 173e519524SHoward Hinnantnamespace std 183e519524SHoward Hinnant{ 193e519524SHoward Hinnant 203e519524SHoward Hinnantstruct allocator_arg_t { }; 213e519524SHoward Hinnantconstexpr allocator_arg_t allocator_arg = allocator_arg_t(); 223e519524SHoward Hinnant 233e519524SHoward Hinnanttemplate <class T, class Alloc> struct uses_allocator; 243e519524SHoward Hinnant 253e519524SHoward Hinnanttemplate <class Ptr> 263e519524SHoward Hinnantstruct pointer_traits 273e519524SHoward Hinnant{ 283e519524SHoward Hinnant typedef Ptr pointer; 293e519524SHoward Hinnant typedef <details> element_type; 303e519524SHoward Hinnant typedef <details> difference_type; 313e519524SHoward Hinnant 323e519524SHoward Hinnant template <class U> using rebind = <details>; 333e519524SHoward Hinnant 343e519524SHoward Hinnant static pointer pointer_to(<details>); 353e519524SHoward Hinnant}; 363e519524SHoward Hinnant 373739fe79SHoward Hinnanttemplate <class T> 383739fe79SHoward Hinnantstruct pointer_traits<T*> 393739fe79SHoward Hinnant{ 403739fe79SHoward Hinnant typedef T* pointer; 413739fe79SHoward Hinnant typedef T element_type; 423739fe79SHoward Hinnant typedef ptrdiff_t difference_type; 433739fe79SHoward Hinnant 443739fe79SHoward Hinnant template <class U> using rebind = U*; 453739fe79SHoward Hinnant 463739fe79SHoward Hinnant static pointer pointer_to(<details>) noexcept; 473739fe79SHoward Hinnant}; 483739fe79SHoward Hinnant 493e519524SHoward Hinnanttemplate <class Alloc> 503e519524SHoward Hinnantstruct allocator_traits 513e519524SHoward Hinnant{ 523e519524SHoward Hinnant typedef Alloc allocator_type; 533e519524SHoward Hinnant typedef typename allocator_type::value_type 543e519524SHoward Hinnant value_type; 553e519524SHoward Hinnant 563e519524SHoward Hinnant typedef Alloc::pointer | value_type* pointer; 573e519524SHoward Hinnant typedef Alloc::const_pointer 583e519524SHoward Hinnant | pointer_traits<pointer>::rebind<const value_type> 593e519524SHoward Hinnant const_pointer; 603e519524SHoward Hinnant typedef Alloc::void_pointer 613e519524SHoward Hinnant | pointer_traits<pointer>::rebind<void> 623e519524SHoward Hinnant void_pointer; 633e519524SHoward Hinnant typedef Alloc::const_void_pointer 643e519524SHoward Hinnant | pointer_traits<pointer>::rebind<const void> 653e519524SHoward Hinnant const_void_pointer; 663e519524SHoward Hinnant typedef Alloc::difference_type 67a4a1ef1fSHoward Hinnant | pointer_traits<pointer>::difference_type 68a4a1ef1fSHoward Hinnant difference_type; 69a4a1ef1fSHoward Hinnant typedef Alloc::size_type 70a4a1ef1fSHoward Hinnant | make_unsigned<difference_type>::type 71a4a1ef1fSHoward Hinnant size_type; 723e519524SHoward Hinnant typedef Alloc::propagate_on_container_copy_assignment 733e519524SHoward Hinnant | false_type propagate_on_container_copy_assignment; 743e519524SHoward Hinnant typedef Alloc::propagate_on_container_move_assignment 753e519524SHoward Hinnant | false_type propagate_on_container_move_assignment; 763e519524SHoward Hinnant typedef Alloc::propagate_on_container_swap 773e519524SHoward Hinnant | false_type propagate_on_container_swap; 7831a47313SMarshall Clow typedef Alloc::is_always_equal 7931a47313SMarshall Clow | is_empty is_always_equal; 803e519524SHoward Hinnant 813e519524SHoward Hinnant template <class T> using rebind_alloc = Alloc::rebind<U>::other | Alloc<T, Args...>; 823e519524SHoward Hinnant template <class T> using rebind_traits = allocator_traits<rebind_alloc<T>>; 833e519524SHoward Hinnant 843e519524SHoward Hinnant static pointer allocate(allocator_type& a, size_type n); 853e519524SHoward Hinnant static pointer allocate(allocator_type& a, size_type n, const_void_pointer hint); 863e519524SHoward Hinnant 873739fe79SHoward Hinnant static void deallocate(allocator_type& a, pointer p, size_type n) noexcept; 883e519524SHoward Hinnant 893e519524SHoward Hinnant template <class T, class... Args> 903e519524SHoward Hinnant static void construct(allocator_type& a, T* p, Args&&... args); 913e519524SHoward Hinnant 923e519524SHoward Hinnant template <class T> 933e519524SHoward Hinnant static void destroy(allocator_type& a, T* p); 943e519524SHoward Hinnant 9506fbed03SMarshall Clow static size_type max_size(const allocator_type& a); // noexcept in C++14 963e519524SHoward Hinnant 973e519524SHoward Hinnant static allocator_type 983e519524SHoward Hinnant select_on_container_copy_construction(const allocator_type& a); 993e519524SHoward Hinnant}; 1003e519524SHoward Hinnant 1013e519524SHoward Hinnanttemplate <> 1023e519524SHoward Hinnantclass allocator<void> 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: 1163e519524SHoward Hinnant typedef size_t size_type; 1173e519524SHoward Hinnant typedef ptrdiff_t difference_type; 1183e519524SHoward Hinnant typedef T* pointer; 1193e519524SHoward Hinnant typedef const T* const_pointer; 1203e519524SHoward Hinnant typedef typename add_lvalue_reference<T>::type reference; 1213e519524SHoward Hinnant typedef typename add_lvalue_reference<const T>::type const_reference; 1223e519524SHoward Hinnant typedef T value_type; 1233e519524SHoward Hinnant 1243e519524SHoward Hinnant template <class U> struct rebind {typedef allocator<U> other;}; 1253e519524SHoward Hinnant 1263739fe79SHoward Hinnant allocator() noexcept; 1273739fe79SHoward Hinnant allocator(const allocator&) noexcept; 1283739fe79SHoward Hinnant template <class U> allocator(const allocator<U>&) noexcept; 1293739fe79SHoward Hinnant ~allocator(); 1303739fe79SHoward Hinnant pointer address(reference x) const noexcept; 1313739fe79SHoward Hinnant const_pointer address(const_reference x) const noexcept; 1323e519524SHoward Hinnant pointer allocate(size_type, allocator<void>::const_pointer hint = 0); 1333739fe79SHoward Hinnant void deallocate(pointer p, size_type n) noexcept; 1343739fe79SHoward Hinnant size_type max_size() const noexcept; 1353739fe79SHoward Hinnant template<class U, class... Args> 1363739fe79SHoward Hinnant void construct(U* p, Args&&... args); 1373739fe79SHoward Hinnant template <class U> 1383739fe79SHoward Hinnant void destroy(U* p); 1393e519524SHoward Hinnant}; 1403e519524SHoward Hinnant 1413e519524SHoward Hinnanttemplate <class T, class U> 1423739fe79SHoward Hinnantbool operator==(const allocator<T>&, const allocator<U>&) noexcept; 1433e519524SHoward Hinnant 1443e519524SHoward Hinnanttemplate <class T, class U> 1453739fe79SHoward Hinnantbool operator!=(const allocator<T>&, const allocator<U>&) noexcept; 1463e519524SHoward Hinnant 1473e519524SHoward Hinnanttemplate <class OutputIterator, class T> 1483e519524SHoward Hinnantclass raw_storage_iterator 1493e519524SHoward Hinnant : public iterator<output_iterator_tag, 1503e519524SHoward Hinnant T, // purposefully not C++03 1513e519524SHoward Hinnant ptrdiff_t, // purposefully not C++03 1523e519524SHoward Hinnant T*, // purposefully not C++03 1533e519524SHoward Hinnant raw_storage_iterator&> // purposefully not C++03 1543e519524SHoward Hinnant{ 1553e519524SHoward Hinnantpublic: 1563e519524SHoward Hinnant explicit raw_storage_iterator(OutputIterator x); 1573e519524SHoward Hinnant raw_storage_iterator& operator*(); 1583e519524SHoward Hinnant raw_storage_iterator& operator=(const T& element); 1593e519524SHoward Hinnant raw_storage_iterator& operator++(); 1603e519524SHoward Hinnant raw_storage_iterator operator++(int); 1613e519524SHoward Hinnant}; 1623e519524SHoward Hinnant 1633739fe79SHoward Hinnanttemplate <class T> pair<T*,ptrdiff_t> get_temporary_buffer(ptrdiff_t n) noexcept; 1643739fe79SHoward Hinnanttemplate <class T> void return_temporary_buffer(T* p) noexcept; 1653739fe79SHoward Hinnant 1663739fe79SHoward Hinnanttemplate <class T> T* addressof(T& r) noexcept; 1671c7fe126SMarshall Clowtemplate <class T> T* addressof(const T&& r) noexcept = delete; 1683e519524SHoward Hinnant 1693e519524SHoward Hinnanttemplate <class InputIterator, class ForwardIterator> 1703e519524SHoward HinnantForwardIterator 1713e519524SHoward Hinnantuninitialized_copy(InputIterator first, InputIterator last, ForwardIterator result); 1723e519524SHoward Hinnant 1733739fe79SHoward Hinnanttemplate <class InputIterator, class Size, class ForwardIterator> 1743739fe79SHoward HinnantForwardIterator 1753739fe79SHoward Hinnantuninitialized_copy_n(InputIterator first, Size n, ForwardIterator result); 1763739fe79SHoward Hinnant 1773e519524SHoward Hinnanttemplate <class ForwardIterator, class T> 1783e519524SHoward Hinnantvoid uninitialized_fill(ForwardIterator first, ForwardIterator last, const T& x); 1793e519524SHoward Hinnant 1803e519524SHoward Hinnanttemplate <class ForwardIterator, class Size, class T> 18148d05bd2SHoward HinnantForwardIterator 18248d05bd2SHoward Hinnantuninitialized_fill_n(ForwardIterator first, Size n, const T& x); 1833e519524SHoward Hinnant 184e4d9c316SEric Fiseliertemplate <class T> 185e4d9c316SEric Fiseliervoid destroy_at(T* location); 186e4d9c316SEric Fiselier 187e4d9c316SEric Fiseliertemplate <class ForwardIterator> 188e4d9c316SEric Fiselier void destroy(ForwardIterator first, ForwardIterator last); 189e4d9c316SEric Fiselier 190e4d9c316SEric Fiseliertemplate <class ForwardIterator, class Size> 191e4d9c316SEric Fiselier ForwardIterator destroy_n(ForwardIterator first, Size n); 192e4d9c316SEric Fiselier 193e4d9c316SEric Fiseliertemplate <class InputIterator, class ForwardIterator> 194e4d9c316SEric Fiselier ForwardIterator uninitialized_move(InputIterator first, InputIterator last, ForwardIterator result); 195e4d9c316SEric Fiselier 196e4d9c316SEric Fiseliertemplate <class InputIterator, class Size, class ForwardIterator> 197e4d9c316SEric Fiselier pair<InputIterator,ForwardIterator> uninitialized_move_n(InputIterator first, Size n, ForwardIterator result); 198e4d9c316SEric Fiselier 199e4d9c316SEric Fiseliertemplate <class ForwardIterator> 200e4d9c316SEric Fiselier void uninitialized_value_construct(ForwardIterator first, ForwardIterator last); 201e4d9c316SEric Fiselier 202e4d9c316SEric Fiseliertemplate <class ForwardIterator, class Size> 203e4d9c316SEric Fiselier ForwardIterator uninitialized_value_construct_n(ForwardIterator first, Size n); 204e4d9c316SEric Fiselier 205e4d9c316SEric Fiseliertemplate <class ForwardIterator> 206e4d9c316SEric Fiselier void uninitialized_default_construct(ForwardIterator first, ForwardIterator last); 207e4d9c316SEric Fiselier 208e4d9c316SEric Fiseliertemplate <class ForwardIterator, class Size> 209e4d9c316SEric Fiselier ForwardIterator uninitialized_default_construct_n(ForwardIterator first, Size n); 210e4d9c316SEric Fiselier 2113e519524SHoward Hinnanttemplate <class Y> struct auto_ptr_ref {}; 2123e519524SHoward Hinnant 2133e519524SHoward Hinnanttemplate<class X> 2143e519524SHoward Hinnantclass auto_ptr 2153e519524SHoward Hinnant{ 2163e519524SHoward Hinnantpublic: 2173e519524SHoward Hinnant typedef X element_type; 2183e519524SHoward Hinnant 2193e519524SHoward Hinnant explicit auto_ptr(X* p =0) throw(); 2203e519524SHoward Hinnant auto_ptr(auto_ptr&) throw(); 2213e519524SHoward Hinnant template<class Y> auto_ptr(auto_ptr<Y>&) throw(); 2223e519524SHoward Hinnant auto_ptr& operator=(auto_ptr&) throw(); 2233e519524SHoward Hinnant template<class Y> auto_ptr& operator=(auto_ptr<Y>&) throw(); 2243e519524SHoward Hinnant auto_ptr& operator=(auto_ptr_ref<X> r) throw(); 2253e519524SHoward Hinnant ~auto_ptr() throw(); 2263e519524SHoward Hinnant 2273e519524SHoward Hinnant typename add_lvalue_reference<X>::type operator*() const throw(); 2283e519524SHoward Hinnant X* operator->() const throw(); 2293e519524SHoward Hinnant X* get() const throw(); 2303e519524SHoward Hinnant X* release() throw(); 2313e519524SHoward Hinnant void reset(X* p =0) throw(); 2323e519524SHoward Hinnant 2333e519524SHoward Hinnant auto_ptr(auto_ptr_ref<X>) throw(); 2343e519524SHoward Hinnant template<class Y> operator auto_ptr_ref<Y>() throw(); 2353e519524SHoward Hinnant template<class Y> operator auto_ptr<Y>() throw(); 2363e519524SHoward Hinnant}; 2373e519524SHoward Hinnant 23820cc2a42SHoward Hinnanttemplate <class T> 23920cc2a42SHoward Hinnantstruct default_delete 24020cc2a42SHoward Hinnant{ 2413739fe79SHoward Hinnant constexpr default_delete() noexcept = default; 2423739fe79SHoward Hinnant template <class U> default_delete(const default_delete<U>&) noexcept; 24320cc2a42SHoward Hinnant 2443739fe79SHoward Hinnant void operator()(T*) const noexcept; 24520cc2a42SHoward Hinnant}; 24620cc2a42SHoward Hinnant 24720cc2a42SHoward Hinnanttemplate <class T> 24820cc2a42SHoward Hinnantstruct default_delete<T[]> 24920cc2a42SHoward Hinnant{ 2503739fe79SHoward Hinnant constexpr default_delete() noexcept = default; 2513739fe79SHoward Hinnant void operator()(T*) const noexcept; 25220cc2a42SHoward Hinnant template <class U> void operator()(U*) const = delete; 25320cc2a42SHoward Hinnant}; 25420cc2a42SHoward Hinnant 25520cc2a42SHoward Hinnanttemplate <class T, class D = default_delete<T>> 25620cc2a42SHoward Hinnantclass unique_ptr 25720cc2a42SHoward Hinnant{ 25820cc2a42SHoward Hinnantpublic: 25920cc2a42SHoward Hinnant typedef see below pointer; 26020cc2a42SHoward Hinnant typedef T element_type; 26120cc2a42SHoward Hinnant typedef D deleter_type; 26220cc2a42SHoward Hinnant 26320cc2a42SHoward Hinnant // constructors 2643739fe79SHoward Hinnant constexpr unique_ptr() noexcept; 2653739fe79SHoward Hinnant explicit unique_ptr(pointer p) noexcept; 2663739fe79SHoward Hinnant unique_ptr(pointer p, see below d1) noexcept; 2673739fe79SHoward Hinnant unique_ptr(pointer p, see below d2) noexcept; 2683739fe79SHoward Hinnant unique_ptr(unique_ptr&& u) noexcept; 2693739fe79SHoward Hinnant unique_ptr(nullptr_t) noexcept : unique_ptr() { } 27020cc2a42SHoward Hinnant template <class U, class E> 2713739fe79SHoward Hinnant unique_ptr(unique_ptr<U, E>&& u) noexcept; 27220cc2a42SHoward Hinnant template <class U> 2733739fe79SHoward Hinnant unique_ptr(auto_ptr<U>&& u) noexcept; 27420cc2a42SHoward Hinnant 27520cc2a42SHoward Hinnant // destructor 27620cc2a42SHoward Hinnant ~unique_ptr(); 27720cc2a42SHoward Hinnant 27820cc2a42SHoward Hinnant // assignment 2793739fe79SHoward Hinnant unique_ptr& operator=(unique_ptr&& u) noexcept; 2803739fe79SHoward Hinnant template <class U, class E> unique_ptr& operator=(unique_ptr<U, E>&& u) noexcept; 2813739fe79SHoward Hinnant unique_ptr& operator=(nullptr_t) noexcept; 28220cc2a42SHoward Hinnant 28320cc2a42SHoward Hinnant // observers 28420cc2a42SHoward Hinnant typename add_lvalue_reference<T>::type operator*() const; 2853739fe79SHoward Hinnant pointer operator->() const noexcept; 2863739fe79SHoward Hinnant pointer get() const noexcept; 2873739fe79SHoward Hinnant deleter_type& get_deleter() noexcept; 2883739fe79SHoward Hinnant const deleter_type& get_deleter() const noexcept; 2893739fe79SHoward Hinnant explicit operator bool() const noexcept; 29020cc2a42SHoward Hinnant 29120cc2a42SHoward Hinnant // modifiers 2923739fe79SHoward Hinnant pointer release() noexcept; 2933739fe79SHoward Hinnant void reset(pointer p = pointer()) noexcept; 2943739fe79SHoward Hinnant void swap(unique_ptr& u) noexcept; 29520cc2a42SHoward Hinnant}; 29620cc2a42SHoward Hinnant 29720cc2a42SHoward Hinnanttemplate <class T, class D> 29820cc2a42SHoward Hinnantclass unique_ptr<T[], D> 29920cc2a42SHoward Hinnant{ 30020cc2a42SHoward Hinnantpublic: 30120cc2a42SHoward Hinnant typedef implementation-defined pointer; 30220cc2a42SHoward Hinnant typedef T element_type; 30320cc2a42SHoward Hinnant typedef D deleter_type; 30420cc2a42SHoward Hinnant 30520cc2a42SHoward Hinnant // constructors 3063739fe79SHoward Hinnant constexpr unique_ptr() noexcept; 3073739fe79SHoward Hinnant explicit unique_ptr(pointer p) noexcept; 3083739fe79SHoward Hinnant unique_ptr(pointer p, see below d) noexcept; 3093739fe79SHoward Hinnant unique_ptr(pointer p, see below d) noexcept; 3103739fe79SHoward Hinnant unique_ptr(unique_ptr&& u) noexcept; 3113739fe79SHoward Hinnant unique_ptr(nullptr_t) noexcept : unique_ptr() { } 31220cc2a42SHoward Hinnant 31320cc2a42SHoward Hinnant // destructor 314b3371f6fSHoward Hinnant ~unique_ptr(); 31520cc2a42SHoward Hinnant 31620cc2a42SHoward Hinnant // assignment 3173739fe79SHoward Hinnant unique_ptr& operator=(unique_ptr&& u) noexcept; 3183739fe79SHoward Hinnant unique_ptr& operator=(nullptr_t) noexcept; 31920cc2a42SHoward Hinnant 32020cc2a42SHoward Hinnant // observers 32120cc2a42SHoward Hinnant T& operator[](size_t i) const; 3223739fe79SHoward Hinnant pointer get() const noexcept; 3233739fe79SHoward Hinnant deleter_type& get_deleter() noexcept; 3243739fe79SHoward Hinnant const deleter_type& get_deleter() const noexcept; 3253739fe79SHoward Hinnant explicit operator bool() const noexcept; 32620cc2a42SHoward Hinnant 32720cc2a42SHoward Hinnant // modifiers 3283739fe79SHoward Hinnant pointer release() noexcept; 3293739fe79SHoward Hinnant void reset(pointer p = pointer()) noexcept; 3303739fe79SHoward Hinnant void reset(nullptr_t) noexcept; 33120cc2a42SHoward Hinnant template <class U> void reset(U) = delete; 3323739fe79SHoward Hinnant void swap(unique_ptr& u) noexcept; 33320cc2a42SHoward Hinnant}; 33420cc2a42SHoward Hinnant 33520cc2a42SHoward Hinnanttemplate <class T, class D> 3363739fe79SHoward Hinnant void swap(unique_ptr<T, D>& x, unique_ptr<T, D>& y) noexcept; 33720cc2a42SHoward Hinnant 33820cc2a42SHoward Hinnanttemplate <class T1, class D1, class T2, class D2> 33920cc2a42SHoward Hinnant bool operator==(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 34020cc2a42SHoward Hinnanttemplate <class T1, class D1, class T2, class D2> 34120cc2a42SHoward Hinnant bool operator!=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 34220cc2a42SHoward Hinnanttemplate <class T1, class D1, class T2, class D2> 34320cc2a42SHoward Hinnant bool operator<(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 34420cc2a42SHoward Hinnanttemplate <class T1, class D1, class T2, class D2> 34520cc2a42SHoward Hinnant bool operator<=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 34620cc2a42SHoward Hinnanttemplate <class T1, class D1, class T2, class D2> 34720cc2a42SHoward Hinnant bool operator>(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 34820cc2a42SHoward Hinnanttemplate <class T1, class D1, class T2, class D2> 34920cc2a42SHoward Hinnant bool operator>=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 35020cc2a42SHoward Hinnant 3513739fe79SHoward Hinnanttemplate <class T, class D> 3523739fe79SHoward Hinnant bool operator==(const unique_ptr<T, D>& x, nullptr_t) noexcept; 3533739fe79SHoward Hinnanttemplate <class T, class D> 3543739fe79SHoward Hinnant bool operator==(nullptr_t, const unique_ptr<T, D>& y) noexcept; 3553739fe79SHoward Hinnanttemplate <class T, class D> 3563739fe79SHoward Hinnant bool operator!=(const unique_ptr<T, D>& x, nullptr_t) noexcept; 3573739fe79SHoward Hinnanttemplate <class T, class D> 3583739fe79SHoward Hinnant bool operator!=(nullptr_t, const unique_ptr<T, D>& y) noexcept; 3593739fe79SHoward Hinnant 3603739fe79SHoward Hinnanttemplate <class T, class D> 3613739fe79SHoward Hinnant bool operator<(const unique_ptr<T, D>& x, nullptr_t); 3623739fe79SHoward Hinnanttemplate <class T, class D> 3633739fe79SHoward Hinnant bool operator<(nullptr_t, const unique_ptr<T, D>& y); 3643739fe79SHoward Hinnanttemplate <class T, class D> 3653739fe79SHoward Hinnant bool operator<=(const unique_ptr<T, D>& x, nullptr_t); 3663739fe79SHoward Hinnanttemplate <class T, class D> 3673739fe79SHoward Hinnant bool operator<=(nullptr_t, const unique_ptr<T, D>& y); 3683739fe79SHoward Hinnanttemplate <class T, class D> 3693739fe79SHoward Hinnant bool operator>(const unique_ptr<T, D>& x, nullptr_t); 3703739fe79SHoward Hinnanttemplate <class T, class D> 3713739fe79SHoward Hinnant bool operator>(nullptr_t, const unique_ptr<T, D>& y); 3723739fe79SHoward Hinnanttemplate <class T, class D> 3733739fe79SHoward Hinnant bool operator>=(const unique_ptr<T, D>& x, nullptr_t); 3743739fe79SHoward Hinnanttemplate <class T, class D> 3753739fe79SHoward Hinnant bool operator>=(nullptr_t, const unique_ptr<T, D>& y); 3763739fe79SHoward Hinnant 37720cc2a42SHoward Hinnantclass bad_weak_ptr 37820cc2a42SHoward Hinnant : public std::exception 37920cc2a42SHoward Hinnant{ 3803739fe79SHoward Hinnant bad_weak_ptr() noexcept; 38120cc2a42SHoward Hinnant}; 38220cc2a42SHoward Hinnant 38328d8ba5fSMarshall Clowtemplate<class T, class... Args> unique_ptr<T> make_unique(Args&&... args); // C++14 38428d8ba5fSMarshall Clowtemplate<class T> unique_ptr<T> make_unique(size_t n); // C++14 38528d8ba5fSMarshall Clowtemplate<class T, class... Args> unspecified make_unique(Args&&...) = delete; // C++14, T == U[N] 38628d8ba5fSMarshall Clow 38720cc2a42SHoward Hinnanttemplate<class T> 38820cc2a42SHoward Hinnantclass shared_ptr 38920cc2a42SHoward Hinnant{ 39020cc2a42SHoward Hinnantpublic: 39120cc2a42SHoward Hinnant typedef T element_type; 39268436a9bSEric Fiselier typedef weak_ptr<T> weak_type; // C++17 39320cc2a42SHoward Hinnant 39420cc2a42SHoward Hinnant // constructors: 3953739fe79SHoward Hinnant constexpr shared_ptr() noexcept; 39620cc2a42SHoward Hinnant template<class Y> explicit shared_ptr(Y* p); 39720cc2a42SHoward Hinnant template<class Y, class D> shared_ptr(Y* p, D d); 39820cc2a42SHoward Hinnant template<class Y, class D, class A> shared_ptr(Y* p, D d, A a); 39920cc2a42SHoward Hinnant template <class D> shared_ptr(nullptr_t p, D d); 40020cc2a42SHoward Hinnant template <class D, class A> shared_ptr(nullptr_t p, D d, A a); 4013739fe79SHoward Hinnant template<class Y> shared_ptr(const shared_ptr<Y>& r, T *p) noexcept; 4023739fe79SHoward Hinnant shared_ptr(const shared_ptr& r) noexcept; 4033739fe79SHoward Hinnant template<class Y> shared_ptr(const shared_ptr<Y>& r) noexcept; 4043739fe79SHoward Hinnant shared_ptr(shared_ptr&& r) noexcept; 4053739fe79SHoward Hinnant template<class Y> shared_ptr(shared_ptr<Y>&& r) noexcept; 40620cc2a42SHoward Hinnant template<class Y> explicit shared_ptr(const weak_ptr<Y>& r); 40720cc2a42SHoward Hinnant template<class Y> shared_ptr(auto_ptr<Y>&& r); 40820cc2a42SHoward Hinnant template <class Y, class D> shared_ptr(unique_ptr<Y, D>&& r); 40920cc2a42SHoward Hinnant shared_ptr(nullptr_t) : shared_ptr() { } 41020cc2a42SHoward Hinnant 41120cc2a42SHoward Hinnant // destructor: 41220cc2a42SHoward Hinnant ~shared_ptr(); 41320cc2a42SHoward Hinnant 41420cc2a42SHoward Hinnant // assignment: 4153739fe79SHoward Hinnant shared_ptr& operator=(const shared_ptr& r) noexcept; 4163739fe79SHoward Hinnant template<class Y> shared_ptr& operator=(const shared_ptr<Y>& r) noexcept; 4173739fe79SHoward Hinnant shared_ptr& operator=(shared_ptr&& r) noexcept; 41820cc2a42SHoward Hinnant template<class Y> shared_ptr& operator=(shared_ptr<Y>&& r); 41920cc2a42SHoward Hinnant template<class Y> shared_ptr& operator=(auto_ptr<Y>&& r); 42020cc2a42SHoward Hinnant template <class Y, class D> shared_ptr& operator=(unique_ptr<Y, D>&& r); 42120cc2a42SHoward Hinnant 42220cc2a42SHoward Hinnant // modifiers: 4233739fe79SHoward Hinnant void swap(shared_ptr& r) noexcept; 4243739fe79SHoward Hinnant void reset() noexcept; 42520cc2a42SHoward Hinnant template<class Y> void reset(Y* p); 42620cc2a42SHoward Hinnant template<class Y, class D> void reset(Y* p, D d); 42720cc2a42SHoward Hinnant template<class Y, class D, class A> void reset(Y* p, D d, A a); 42820cc2a42SHoward Hinnant 4293739fe79SHoward Hinnant // observers: 4303739fe79SHoward Hinnant T* get() const noexcept; 4313739fe79SHoward Hinnant T& operator*() const noexcept; 4323739fe79SHoward Hinnant T* operator->() const noexcept; 4333739fe79SHoward Hinnant long use_count() const noexcept; 4343739fe79SHoward Hinnant bool unique() const noexcept; 4353739fe79SHoward Hinnant explicit operator bool() const noexcept; 43620cc2a42SHoward Hinnant template<class U> bool owner_before(shared_ptr<U> const& b) const; 43720cc2a42SHoward Hinnant template<class U> bool owner_before(weak_ptr<U> const& b) const; 43820cc2a42SHoward Hinnant}; 43920cc2a42SHoward Hinnant 44020cc2a42SHoward Hinnant// shared_ptr comparisons: 44120cc2a42SHoward Hinnanttemplate<class T, class U> 4423739fe79SHoward Hinnant bool operator==(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; 44320cc2a42SHoward Hinnanttemplate<class T, class U> 4443739fe79SHoward Hinnant bool operator!=(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; 44520cc2a42SHoward Hinnanttemplate<class T, class U> 4463739fe79SHoward Hinnant bool operator<(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; 44720cc2a42SHoward Hinnanttemplate<class T, class U> 4483739fe79SHoward Hinnant bool operator>(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; 44920cc2a42SHoward Hinnanttemplate<class T, class U> 4503739fe79SHoward Hinnant bool operator<=(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; 45120cc2a42SHoward Hinnanttemplate<class T, class U> 4523739fe79SHoward Hinnant bool operator>=(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; 4533739fe79SHoward Hinnant 4543739fe79SHoward Hinnanttemplate <class T> 4553739fe79SHoward Hinnant bool operator==(const shared_ptr<T>& x, nullptr_t) noexcept; 4563739fe79SHoward Hinnanttemplate <class T> 4573739fe79SHoward Hinnant bool operator==(nullptr_t, const shared_ptr<T>& y) noexcept; 4583739fe79SHoward Hinnanttemplate <class T> 4593739fe79SHoward Hinnant bool operator!=(const shared_ptr<T>& x, nullptr_t) noexcept; 4603739fe79SHoward Hinnanttemplate <class T> 4613739fe79SHoward Hinnant bool operator!=(nullptr_t, const shared_ptr<T>& y) noexcept; 4623739fe79SHoward Hinnanttemplate <class T> 4633739fe79SHoward Hinnant bool operator<(const shared_ptr<T>& x, nullptr_t) noexcept; 4643739fe79SHoward Hinnanttemplate <class T> 4653739fe79SHoward Hinnantbool operator<(nullptr_t, const shared_ptr<T>& y) noexcept; 4663739fe79SHoward Hinnanttemplate <class T> 4673739fe79SHoward Hinnant bool operator<=(const shared_ptr<T>& x, nullptr_t) noexcept; 4683739fe79SHoward Hinnanttemplate <class T> 4693739fe79SHoward Hinnant bool operator<=(nullptr_t, const shared_ptr<T>& y) noexcept; 4703739fe79SHoward Hinnanttemplate <class T> 4713739fe79SHoward Hinnant bool operator>(const shared_ptr<T>& x, nullptr_t) noexcept; 4723739fe79SHoward Hinnanttemplate <class T> 4733739fe79SHoward Hinnant bool operator>(nullptr_t, const shared_ptr<T>& y) noexcept; 4743739fe79SHoward Hinnanttemplate <class T> 4753739fe79SHoward Hinnant bool operator>=(const shared_ptr<T>& x, nullptr_t) noexcept; 4763739fe79SHoward Hinnanttemplate <class T> 4773739fe79SHoward Hinnant bool operator>=(nullptr_t, const shared_ptr<T>& y) noexcept; 47820cc2a42SHoward Hinnant 47920cc2a42SHoward Hinnant// shared_ptr specialized algorithms: 4803739fe79SHoward Hinnanttemplate<class T> void swap(shared_ptr<T>& a, shared_ptr<T>& b) noexcept; 48120cc2a42SHoward Hinnant 48220cc2a42SHoward Hinnant// shared_ptr casts: 48320cc2a42SHoward Hinnanttemplate<class T, class U> 4843739fe79SHoward Hinnant shared_ptr<T> static_pointer_cast(shared_ptr<U> const& r) noexcept; 48520cc2a42SHoward Hinnanttemplate<class T, class U> 4863739fe79SHoward Hinnant shared_ptr<T> dynamic_pointer_cast(shared_ptr<U> const& r) noexcept; 48720cc2a42SHoward Hinnanttemplate<class T, class U> 4883739fe79SHoward Hinnant shared_ptr<T> const_pointer_cast(shared_ptr<U> const& r) noexcept; 48920cc2a42SHoward Hinnant 49020cc2a42SHoward Hinnant// shared_ptr I/O: 49120cc2a42SHoward Hinnanttemplate<class E, class T, class Y> 49220cc2a42SHoward Hinnant basic_ostream<E, T>& operator<< (basic_ostream<E, T>& os, shared_ptr<Y> const& p); 49320cc2a42SHoward Hinnant 49420cc2a42SHoward Hinnant// shared_ptr get_deleter: 4953739fe79SHoward Hinnanttemplate<class D, class T> D* get_deleter(shared_ptr<T> const& p) noexcept; 49620cc2a42SHoward Hinnant 49720cc2a42SHoward Hinnanttemplate<class T, class... Args> 49820cc2a42SHoward Hinnant shared_ptr<T> make_shared(Args&&... args); 49920cc2a42SHoward Hinnanttemplate<class T, class A, class... Args> 50020cc2a42SHoward Hinnant shared_ptr<T> allocate_shared(const A& a, Args&&... args); 50120cc2a42SHoward Hinnant 50220cc2a42SHoward Hinnanttemplate<class T> 50320cc2a42SHoward Hinnantclass weak_ptr 50420cc2a42SHoward Hinnant{ 50520cc2a42SHoward Hinnantpublic: 50620cc2a42SHoward Hinnant typedef T element_type; 50720cc2a42SHoward Hinnant 50820cc2a42SHoward Hinnant // constructors 5093739fe79SHoward Hinnant constexpr weak_ptr() noexcept; 5103739fe79SHoward Hinnant template<class Y> weak_ptr(shared_ptr<Y> const& r) noexcept; 5113739fe79SHoward Hinnant weak_ptr(weak_ptr const& r) noexcept; 5123739fe79SHoward Hinnant template<class Y> weak_ptr(weak_ptr<Y> const& r) noexcept; 5134703f763SMarshall Clow weak_ptr(weak_ptr&& r) noexcept; // C++14 5144703f763SMarshall Clow template<class Y> weak_ptr(weak_ptr<Y>&& r) noexcept; // C++14 51520cc2a42SHoward Hinnant 51620cc2a42SHoward Hinnant // destructor 51720cc2a42SHoward Hinnant ~weak_ptr(); 51820cc2a42SHoward Hinnant 51920cc2a42SHoward Hinnant // assignment 5203739fe79SHoward Hinnant weak_ptr& operator=(weak_ptr const& r) noexcept; 5213739fe79SHoward Hinnant template<class Y> weak_ptr& operator=(weak_ptr<Y> const& r) noexcept; 5223739fe79SHoward Hinnant template<class Y> weak_ptr& operator=(shared_ptr<Y> const& r) noexcept; 5234703f763SMarshall Clow weak_ptr& operator=(weak_ptr&& r) noexcept; // C++14 5244703f763SMarshall Clow template<class Y> weak_ptr& operator=(weak_ptr<Y>&& r) noexcept; // C++14 52520cc2a42SHoward Hinnant 52620cc2a42SHoward Hinnant // modifiers 5273739fe79SHoward Hinnant void swap(weak_ptr& r) noexcept; 5283739fe79SHoward Hinnant void reset() noexcept; 52920cc2a42SHoward Hinnant 53020cc2a42SHoward Hinnant // observers 5313739fe79SHoward Hinnant long use_count() const noexcept; 5323739fe79SHoward Hinnant bool expired() const noexcept; 5333739fe79SHoward Hinnant shared_ptr<T> lock() const noexcept; 534710a902cSMarshall Clow template<class U> bool owner_before(shared_ptr<U> const& b) const; 535710a902cSMarshall Clow template<class U> bool owner_before(weak_ptr<U> const& b) const; 53620cc2a42SHoward Hinnant}; 53720cc2a42SHoward Hinnant 53820cc2a42SHoward Hinnant// weak_ptr specialized algorithms: 5393739fe79SHoward Hinnanttemplate<class T> void swap(weak_ptr<T>& a, weak_ptr<T>& b) noexcept; 54020cc2a42SHoward Hinnant 54120cc2a42SHoward Hinnant// class owner_less: 54220cc2a42SHoward Hinnanttemplate<class T> struct owner_less; 54320cc2a42SHoward Hinnant 54420cc2a42SHoward Hinnanttemplate<class T> 54520cc2a42SHoward Hinnantstruct owner_less<shared_ptr<T>> 54620cc2a42SHoward Hinnant : binary_function<shared_ptr<T>, shared_ptr<T>, bool> 54720cc2a42SHoward Hinnant{ 54820cc2a42SHoward Hinnant typedef bool result_type; 54920cc2a42SHoward Hinnant bool operator()(shared_ptr<T> const&, shared_ptr<T> const&) const; 55020cc2a42SHoward Hinnant bool operator()(shared_ptr<T> const&, weak_ptr<T> const&) const; 55120cc2a42SHoward Hinnant bool operator()(weak_ptr<T> const&, shared_ptr<T> const&) const; 55220cc2a42SHoward Hinnant}; 55320cc2a42SHoward Hinnant 55420cc2a42SHoward Hinnanttemplate<class T> 55520cc2a42SHoward Hinnantstruct owner_less<weak_ptr<T>> 55620cc2a42SHoward Hinnant : binary_function<weak_ptr<T>, weak_ptr<T>, bool> 55720cc2a42SHoward Hinnant{ 55820cc2a42SHoward Hinnant typedef bool result_type; 55920cc2a42SHoward Hinnant bool operator()(weak_ptr<T> const&, weak_ptr<T> const&) const; 56020cc2a42SHoward Hinnant bool operator()(shared_ptr<T> const&, weak_ptr<T> const&) const; 56120cc2a42SHoward Hinnant bool operator()(weak_ptr<T> const&, shared_ptr<T> const&) const; 56220cc2a42SHoward Hinnant}; 56320cc2a42SHoward Hinnant 56420cc2a42SHoward Hinnanttemplate<class T> 56520cc2a42SHoward Hinnantclass enable_shared_from_this 56620cc2a42SHoward Hinnant{ 56720cc2a42SHoward Hinnantprotected: 5683739fe79SHoward Hinnant constexpr enable_shared_from_this() noexcept; 5693739fe79SHoward Hinnant enable_shared_from_this(enable_shared_from_this const&) noexcept; 5703739fe79SHoward Hinnant enable_shared_from_this& operator=(enable_shared_from_this const&) noexcept; 57120cc2a42SHoward Hinnant ~enable_shared_from_this(); 57220cc2a42SHoward Hinnantpublic: 57320cc2a42SHoward Hinnant shared_ptr<T> shared_from_this(); 57420cc2a42SHoward Hinnant shared_ptr<T const> shared_from_this() const; 57520cc2a42SHoward Hinnant}; 57620cc2a42SHoward Hinnant 57720cc2a42SHoward Hinnanttemplate<class T> 57820cc2a42SHoward Hinnant bool atomic_is_lock_free(const shared_ptr<T>* p); 57920cc2a42SHoward Hinnanttemplate<class T> 58020cc2a42SHoward Hinnant shared_ptr<T> atomic_load(const shared_ptr<T>* p); 58120cc2a42SHoward Hinnanttemplate<class T> 58220cc2a42SHoward Hinnant shared_ptr<T> atomic_load_explicit(const shared_ptr<T>* p, memory_order mo); 58320cc2a42SHoward Hinnanttemplate<class T> 58420cc2a42SHoward Hinnant void atomic_store(shared_ptr<T>* p, shared_ptr<T> r); 58520cc2a42SHoward Hinnanttemplate<class T> 58620cc2a42SHoward Hinnant void atomic_store_explicit(shared_ptr<T>* p, shared_ptr<T> r, memory_order mo); 58720cc2a42SHoward Hinnanttemplate<class T> 58820cc2a42SHoward Hinnant shared_ptr<T> atomic_exchange(shared_ptr<T>* p, shared_ptr<T> r); 58920cc2a42SHoward Hinnanttemplate<class T> 59020cc2a42SHoward Hinnant shared_ptr<T> 59120cc2a42SHoward Hinnant atomic_exchange_explicit(shared_ptr<T>* p, shared_ptr<T> r, memory_order mo); 59220cc2a42SHoward Hinnanttemplate<class T> 59320cc2a42SHoward Hinnant bool 59420cc2a42SHoward Hinnant atomic_compare_exchange_weak(shared_ptr<T>* p, shared_ptr<T>* v, shared_ptr<T> w); 59520cc2a42SHoward Hinnanttemplate<class T> 59620cc2a42SHoward Hinnant bool 59720cc2a42SHoward Hinnant atomic_compare_exchange_strong( shared_ptr<T>* p, shared_ptr<T>* v, shared_ptr<T> w); 59820cc2a42SHoward Hinnanttemplate<class T> 59920cc2a42SHoward Hinnant bool 60020cc2a42SHoward Hinnant atomic_compare_exchange_weak_explicit(shared_ptr<T>* p, shared_ptr<T>* v, 60120cc2a42SHoward Hinnant shared_ptr<T> w, memory_order success, 60220cc2a42SHoward Hinnant memory_order failure); 60320cc2a42SHoward Hinnanttemplate<class T> 60420cc2a42SHoward Hinnant bool 60520cc2a42SHoward Hinnant atomic_compare_exchange_strong_explicit(shared_ptr<T>* p, shared_ptr<T>* v, 60620cc2a42SHoward Hinnant shared_ptr<T> w, memory_order success, 60720cc2a42SHoward Hinnant memory_order failure); 60820cc2a42SHoward Hinnant// Hash support 60920cc2a42SHoward Hinnanttemplate <class T> struct hash; 61020cc2a42SHoward Hinnanttemplate <class T, class D> struct hash<unique_ptr<T, D> >; 61120cc2a42SHoward Hinnanttemplate <class T> struct hash<shared_ptr<T> >; 61220cc2a42SHoward Hinnant 61320cc2a42SHoward Hinnant// Pointer safety 61420cc2a42SHoward Hinnantenum class pointer_safety { relaxed, preferred, strict }; 61520cc2a42SHoward Hinnantvoid declare_reachable(void *p); 61620cc2a42SHoward Hinnanttemplate <class T> T *undeclare_reachable(T *p); 61720cc2a42SHoward Hinnantvoid declare_no_pointers(char *p, size_t n); 61820cc2a42SHoward Hinnantvoid undeclare_no_pointers(char *p, size_t n); 6193739fe79SHoward Hinnantpointer_safety get_pointer_safety() noexcept; 62020cc2a42SHoward Hinnant 6213e519524SHoward Hinnantvoid* align(size_t alignment, size_t size, void*& ptr, size_t& space); 6223e519524SHoward Hinnant 6233e519524SHoward Hinnant} // std 6243e519524SHoward Hinnant 6253e519524SHoward Hinnant*/ 6263e519524SHoward Hinnant 6273e519524SHoward Hinnant#include <__config> 6283e519524SHoward Hinnant#include <type_traits> 6293e519524SHoward Hinnant#include <typeinfo> 6303e519524SHoward Hinnant#include <cstddef> 6313e519524SHoward Hinnant#include <cstdint> 6323e519524SHoward Hinnant#include <new> 6333e519524SHoward Hinnant#include <utility> 6343e519524SHoward Hinnant#include <limits> 6353e519524SHoward Hinnant#include <iterator> 6363e519524SHoward Hinnant#include <__functional_base> 637e3163f5aSHoward Hinnant#include <iosfwd> 638a87b5e34SHoward Hinnant#include <tuple> 6394524d6e7SEric Fiselier#include <stdexcept> 6409741d6c9SHoward Hinnant#include <cstring> 6413e519524SHoward Hinnant 642749adebaSEric Fiselier#if !defined(_LIBCPP_HAS_NO_ATOMIC_HEADER) 643d77851e8SHoward Hinnant# include <atomic> 644d77851e8SHoward Hinnant#endif 645d77851e8SHoward Hinnant 646ab4f4382SHoward Hinnant#include <__undef_min_max> 647ab4f4382SHoward Hinnant 648073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 6493e519524SHoward Hinnant#pragma GCC system_header 650073458b1SHoward Hinnant#endif 6513e519524SHoward Hinnant 6523e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 6533e519524SHoward Hinnant 6541faf289eSEric Fiseliertemplate <class _ValueType> 6551faf289eSEric Fiselierinline _LIBCPP_ALWAYS_INLINE 6561faf289eSEric Fiselier_ValueType __libcpp_relaxed_load(_ValueType const* __value) { 6571faf289eSEric Fiselier#if !defined(_LIBCPP_HAS_NO_THREADS) && \ 6581faf289eSEric Fiselier defined(__ATOMIC_RELAXED) && \ 6591faf289eSEric Fiselier (__has_builtin(__atomic_load_n) || _GNUC_VER >= 407) 6601faf289eSEric Fiselier return __atomic_load_n(__value, __ATOMIC_RELAXED); 6611faf289eSEric Fiselier#else 6621faf289eSEric Fiselier return *__value; 6631faf289eSEric Fiselier#endif 6641faf289eSEric Fiselier} 6651faf289eSEric Fiselier 666224264adSKuba Breckatemplate <class _ValueType> 667224264adSKuba Breckainline _LIBCPP_ALWAYS_INLINE 668224264adSKuba Brecka_ValueType __libcpp_acquire_load(_ValueType const* __value) { 669224264adSKuba Brecka#if !defined(_LIBCPP_HAS_NO_THREADS) && \ 670224264adSKuba Brecka defined(__ATOMIC_ACQUIRE) && \ 671224264adSKuba Brecka (__has_builtin(__atomic_load_n) || _GNUC_VER >= 407) 672224264adSKuba Brecka return __atomic_load_n(__value, __ATOMIC_ACQUIRE); 673224264adSKuba Brecka#else 674224264adSKuba Brecka return *__value; 675224264adSKuba Brecka#endif 676224264adSKuba Brecka} 677224264adSKuba Brecka 6781c7fe126SMarshall Clow// addressof moved to <type_traits> 67964ec101eSDouglas Gregor 6803e519524SHoward Hinnanttemplate <class _Tp> class allocator; 6813e519524SHoward Hinnant 6823e519524SHoward Hinnanttemplate <> 683e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS allocator<void> 6843e519524SHoward Hinnant{ 6853e519524SHoward Hinnantpublic: 6863e519524SHoward Hinnant typedef void* pointer; 6873e519524SHoward Hinnant typedef const void* const_pointer; 6883e519524SHoward Hinnant typedef void value_type; 6893e519524SHoward Hinnant 6903e519524SHoward Hinnant template <class _Up> struct rebind {typedef allocator<_Up> other;}; 6913e519524SHoward Hinnant}; 6923e519524SHoward Hinnant 69321fa1887SHoward Hinnanttemplate <> 694e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS allocator<const void> 69521fa1887SHoward Hinnant{ 69621fa1887SHoward Hinnantpublic: 69721fa1887SHoward Hinnant typedef const void* pointer; 69821fa1887SHoward Hinnant typedef const void* const_pointer; 69921fa1887SHoward Hinnant typedef const void value_type; 70021fa1887SHoward Hinnant 70121fa1887SHoward Hinnant template <class _Up> struct rebind {typedef allocator<_Up> other;}; 70221fa1887SHoward Hinnant}; 70321fa1887SHoward Hinnant 7043e519524SHoward Hinnant// pointer_traits 7053e519524SHoward Hinnant 7063e519524SHoward Hinnanttemplate <class _Tp> 7073e519524SHoward Hinnantstruct __has_element_type 7083e519524SHoward Hinnant{ 7093e519524SHoward Hinnantprivate: 71054d333a6SHoward Hinnant struct __two {char __lx; char __lxx;}; 7113e519524SHoward Hinnant template <class _Up> static __two __test(...); 7123e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::element_type* = 0); 7133e519524SHoward Hinnantpublic: 7143e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 7153e519524SHoward Hinnant}; 7163e519524SHoward Hinnant 7173e519524SHoward Hinnanttemplate <class _Ptr, bool = __has_element_type<_Ptr>::value> 7183e519524SHoward Hinnantstruct __pointer_traits_element_type; 7193e519524SHoward Hinnant 7203e519524SHoward Hinnanttemplate <class _Ptr> 7213e519524SHoward Hinnantstruct __pointer_traits_element_type<_Ptr, true> 7223e519524SHoward Hinnant{ 7233e519524SHoward Hinnant typedef typename _Ptr::element_type type; 7243e519524SHoward Hinnant}; 7253e519524SHoward Hinnant 7263e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 7273e519524SHoward Hinnant 7283e519524SHoward Hinnanttemplate <template <class, class...> class _Sp, class _Tp, class ..._Args> 7293e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _Args...>, true> 7303e519524SHoward Hinnant{ 7313e519524SHoward Hinnant typedef typename _Sp<_Tp, _Args...>::element_type type; 7323e519524SHoward Hinnant}; 7333e519524SHoward Hinnant 7343e519524SHoward Hinnanttemplate <template <class, class...> class _Sp, class _Tp, class ..._Args> 7353e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _Args...>, false> 7363e519524SHoward Hinnant{ 7373e519524SHoward Hinnant typedef _Tp type; 7383e519524SHoward Hinnant}; 7393e519524SHoward Hinnant 740b3371f6fSHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 7413e519524SHoward Hinnant 7423e519524SHoward Hinnanttemplate <template <class> class _Sp, class _Tp> 7433e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp>, true> 7443e519524SHoward Hinnant{ 7453e519524SHoward Hinnant typedef typename _Sp<_Tp>::element_type type; 7463e519524SHoward Hinnant}; 7473e519524SHoward Hinnant 7483e519524SHoward Hinnanttemplate <template <class> class _Sp, class _Tp> 7493e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp>, false> 7503e519524SHoward Hinnant{ 7513e519524SHoward Hinnant typedef _Tp type; 7523e519524SHoward Hinnant}; 7533e519524SHoward Hinnant 7543e519524SHoward Hinnanttemplate <template <class, class> class _Sp, class _Tp, class _A0> 7553e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0>, true> 7563e519524SHoward Hinnant{ 7573e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0>::element_type type; 7583e519524SHoward Hinnant}; 7593e519524SHoward Hinnant 7603e519524SHoward Hinnanttemplate <template <class, class> class _Sp, class _Tp, class _A0> 7613e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0>, false> 7623e519524SHoward Hinnant{ 7633e519524SHoward Hinnant typedef _Tp type; 7643e519524SHoward Hinnant}; 7653e519524SHoward Hinnant 7663e519524SHoward Hinnanttemplate <template <class, class, class> class _Sp, class _Tp, class _A0, class _A1> 7673e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1>, true> 7683e519524SHoward Hinnant{ 7693e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1>::element_type type; 7703e519524SHoward Hinnant}; 7713e519524SHoward Hinnant 7723e519524SHoward Hinnanttemplate <template <class, class, class> class _Sp, class _Tp, class _A0, class _A1> 7733e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1>, false> 7743e519524SHoward Hinnant{ 7753e519524SHoward Hinnant typedef _Tp type; 7763e519524SHoward Hinnant}; 7773e519524SHoward Hinnant 7783e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Sp, class _Tp, class _A0, 7793e519524SHoward Hinnant class _A1, class _A2> 7803e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1, _A2>, true> 7813e519524SHoward Hinnant{ 7823e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1, _A2>::element_type type; 7833e519524SHoward Hinnant}; 7843e519524SHoward Hinnant 7853e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Sp, class _Tp, class _A0, 7863e519524SHoward Hinnant class _A1, class _A2> 7873e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1, _A2>, false> 7883e519524SHoward Hinnant{ 7893e519524SHoward Hinnant typedef _Tp type; 7903e519524SHoward Hinnant}; 7913e519524SHoward Hinnant 792b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 7933e519524SHoward Hinnant 7943e519524SHoward Hinnanttemplate <class _Tp> 7953e519524SHoward Hinnantstruct __has_difference_type 7963e519524SHoward Hinnant{ 7973e519524SHoward Hinnantprivate: 79854d333a6SHoward Hinnant struct __two {char __lx; char __lxx;}; 7993e519524SHoward Hinnant template <class _Up> static __two __test(...); 8003e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::difference_type* = 0); 8013e519524SHoward Hinnantpublic: 8023e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 8033e519524SHoward Hinnant}; 8043e519524SHoward Hinnant 8053e519524SHoward Hinnanttemplate <class _Ptr, bool = __has_difference_type<_Ptr>::value> 8063e519524SHoward Hinnantstruct __pointer_traits_difference_type 8073e519524SHoward Hinnant{ 8083e519524SHoward Hinnant typedef ptrdiff_t type; 8093e519524SHoward Hinnant}; 8103e519524SHoward Hinnant 8113e519524SHoward Hinnanttemplate <class _Ptr> 8123e519524SHoward Hinnantstruct __pointer_traits_difference_type<_Ptr, true> 8133e519524SHoward Hinnant{ 8143e519524SHoward Hinnant typedef typename _Ptr::difference_type type; 8153e519524SHoward Hinnant}; 8163e519524SHoward Hinnant 8173e519524SHoward Hinnanttemplate <class _Tp, class _Up> 8183e519524SHoward Hinnantstruct __has_rebind 8193e519524SHoward Hinnant{ 8203e519524SHoward Hinnantprivate: 82154d333a6SHoward Hinnant struct __two {char __lx; char __lxx;}; 8223e519524SHoward Hinnant template <class _Xp> static __two __test(...); 8233e519524SHoward Hinnant template <class _Xp> static char __test(typename _Xp::template rebind<_Up>* = 0); 8243e519524SHoward Hinnantpublic: 8253e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 8263e519524SHoward Hinnant}; 8273e519524SHoward Hinnant 8283e519524SHoward Hinnanttemplate <class _Tp, class _Up, bool = __has_rebind<_Tp, _Up>::value> 8293e519524SHoward Hinnantstruct __pointer_traits_rebind 8303e519524SHoward Hinnant{ 83154613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 8323e519524SHoward Hinnant typedef typename _Tp::template rebind<_Up> type; 8333e519524SHoward Hinnant#else 8343e519524SHoward Hinnant typedef typename _Tp::template rebind<_Up>::other type; 8353e519524SHoward Hinnant#endif 8363e519524SHoward Hinnant}; 8373e519524SHoward Hinnant 8383e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 8393e519524SHoward Hinnant 8403e519524SHoward Hinnanttemplate <template <class, class...> class _Sp, class _Tp, class ..._Args, class _Up> 8413e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _Args...>, _Up, true> 8423e519524SHoward Hinnant{ 84354613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 8443e519524SHoward Hinnant typedef typename _Sp<_Tp, _Args...>::template rebind<_Up> type; 8453e519524SHoward Hinnant#else 8463e519524SHoward Hinnant typedef typename _Sp<_Tp, _Args...>::template rebind<_Up>::other type; 8473e519524SHoward Hinnant#endif 8483e519524SHoward Hinnant}; 8493e519524SHoward Hinnant 8503e519524SHoward Hinnanttemplate <template <class, class...> class _Sp, class _Tp, class ..._Args, class _Up> 8513e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _Args...>, _Up, false> 8523e519524SHoward Hinnant{ 8533e519524SHoward Hinnant typedef _Sp<_Up, _Args...> type; 8543e519524SHoward Hinnant}; 8553e519524SHoward Hinnant 856b3371f6fSHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 8573e519524SHoward Hinnant 8583e519524SHoward Hinnanttemplate <template <class> class _Sp, class _Tp, class _Up> 8593e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp>, _Up, true> 8603e519524SHoward Hinnant{ 86154613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 8623e519524SHoward Hinnant typedef typename _Sp<_Tp>::template rebind<_Up> type; 8633e519524SHoward Hinnant#else 8643e519524SHoward Hinnant typedef typename _Sp<_Tp>::template rebind<_Up>::other type; 8653e519524SHoward Hinnant#endif 8663e519524SHoward Hinnant}; 8673e519524SHoward Hinnant 8683e519524SHoward Hinnanttemplate <template <class> class _Sp, class _Tp, class _Up> 8693e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp>, _Up, false> 8703e519524SHoward Hinnant{ 8713e519524SHoward Hinnant typedef _Sp<_Up> type; 8723e519524SHoward Hinnant}; 8733e519524SHoward Hinnant 8743e519524SHoward Hinnanttemplate <template <class, class> class _Sp, class _Tp, class _A0, class _Up> 8753e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0>, _Up, true> 8763e519524SHoward Hinnant{ 87754613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 8783e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0>::template rebind<_Up> type; 8793e519524SHoward Hinnant#else 8803e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0>::template rebind<_Up>::other type; 8813e519524SHoward Hinnant#endif 8823e519524SHoward Hinnant}; 8833e519524SHoward Hinnant 8843e519524SHoward Hinnanttemplate <template <class, class> class _Sp, class _Tp, class _A0, class _Up> 8853e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0>, _Up, false> 8863e519524SHoward Hinnant{ 8873e519524SHoward Hinnant typedef _Sp<_Up, _A0> type; 8883e519524SHoward Hinnant}; 8893e519524SHoward Hinnant 8903e519524SHoward Hinnanttemplate <template <class, class, class> class _Sp, class _Tp, class _A0, 8913e519524SHoward Hinnant class _A1, class _Up> 8923e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1>, _Up, true> 8933e519524SHoward Hinnant{ 89454613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 8953e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1>::template rebind<_Up> type; 8963e519524SHoward Hinnant#else 8973e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1>::template rebind<_Up>::other type; 8983e519524SHoward Hinnant#endif 8993e519524SHoward Hinnant}; 9003e519524SHoward Hinnant 9013e519524SHoward Hinnanttemplate <template <class, class, class> class _Sp, class _Tp, class _A0, 9023e519524SHoward Hinnant class _A1, class _Up> 9033e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1>, _Up, false> 9043e519524SHoward Hinnant{ 9053e519524SHoward Hinnant typedef _Sp<_Up, _A0, _A1> type; 9063e519524SHoward Hinnant}; 9073e519524SHoward Hinnant 9083e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Sp, class _Tp, class _A0, 9093e519524SHoward Hinnant class _A1, class _A2, class _Up> 9103e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1, _A2>, _Up, true> 9113e519524SHoward Hinnant{ 91254613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 9133e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1, _A2>::template rebind<_Up> type; 9143e519524SHoward Hinnant#else 9153e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1, _A2>::template rebind<_Up>::other type; 9163e519524SHoward Hinnant#endif 9173e519524SHoward Hinnant}; 9183e519524SHoward Hinnant 9193e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Sp, class _Tp, class _A0, 9203e519524SHoward Hinnant class _A1, class _A2, class _Up> 9213e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1, _A2>, _Up, false> 9223e519524SHoward Hinnant{ 9233e519524SHoward Hinnant typedef _Sp<_Up, _A0, _A1, _A2> type; 9243e519524SHoward Hinnant}; 9253e519524SHoward Hinnant 926b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 9273e519524SHoward Hinnant 9283e519524SHoward Hinnanttemplate <class _Ptr> 929e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS pointer_traits 9303e519524SHoward Hinnant{ 9313e519524SHoward Hinnant typedef _Ptr pointer; 9323e519524SHoward Hinnant typedef typename __pointer_traits_element_type<pointer>::type element_type; 9333e519524SHoward Hinnant typedef typename __pointer_traits_difference_type<pointer>::type difference_type; 9343e519524SHoward Hinnant 93554613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 936f7384975SHoward Hinnant template <class _Up> using rebind = typename __pointer_traits_rebind<pointer, _Up>::type; 9373e519524SHoward Hinnant#else 9383e519524SHoward Hinnant template <class _Up> struct rebind 9393e519524SHoward Hinnant {typedef typename __pointer_traits_rebind<pointer, _Up>::type other;}; 94054613ab4SEric Fiselier#endif // _LIBCPP_CXX03_LANG 9413e519524SHoward Hinnant 9423e519524SHoward Hinnantprivate: 9433e519524SHoward Hinnant struct __nat {}; 9443e519524SHoward Hinnantpublic: 945848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9463e519524SHoward Hinnant static pointer pointer_to(typename conditional<is_void<element_type>::value, 9473e519524SHoward Hinnant __nat, element_type>::type& __r) 9483e519524SHoward Hinnant {return pointer::pointer_to(__r);} 9493e519524SHoward Hinnant}; 9503e519524SHoward Hinnant 9513e519524SHoward Hinnanttemplate <class _Tp> 952e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS pointer_traits<_Tp*> 9533e519524SHoward Hinnant{ 9543e519524SHoward Hinnant typedef _Tp* pointer; 9553e519524SHoward Hinnant typedef _Tp element_type; 9563e519524SHoward Hinnant typedef ptrdiff_t difference_type; 9573e519524SHoward Hinnant 95854613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 9593e519524SHoward Hinnant template <class _Up> using rebind = _Up*; 9603e519524SHoward Hinnant#else 9613e519524SHoward Hinnant template <class _Up> struct rebind {typedef _Up* other;}; 9623e519524SHoward Hinnant#endif 9633e519524SHoward Hinnant 9643e519524SHoward Hinnantprivate: 9653e519524SHoward Hinnant struct __nat {}; 9663e519524SHoward Hinnantpublic: 967848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9683e519524SHoward Hinnant static pointer pointer_to(typename conditional<is_void<element_type>::value, 9693739fe79SHoward Hinnant __nat, element_type>::type& __r) _NOEXCEPT 970ce48a113SHoward Hinnant {return _VSTD::addressof(__r);} 9713e519524SHoward Hinnant}; 9723e519524SHoward Hinnant 9731c813407SEric Fiseliertemplate <class _From, class _To> 9741c813407SEric Fiselierstruct __rebind_pointer { 97554613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 9761c813407SEric Fiselier typedef typename pointer_traits<_From>::template rebind<_To> type; 9771c813407SEric Fiselier#else 9781c813407SEric Fiselier typedef typename pointer_traits<_From>::template rebind<_To>::other type; 9791c813407SEric Fiselier#endif 9801c813407SEric Fiselier}; 9811c813407SEric Fiselier 9823e519524SHoward Hinnant// allocator_traits 9833e519524SHoward Hinnant 9843e519524SHoward Hinnantnamespace __has_pointer_type_imp 9853e519524SHoward Hinnant{ 986b1c82cd0SHoward Hinnant template <class _Up> static __two __test(...); 987b1c82cd0SHoward Hinnant template <class _Up> static char __test(typename _Up::pointer* = 0); 9883e519524SHoward Hinnant} 9893e519524SHoward Hinnant 9903e519524SHoward Hinnanttemplate <class _Tp> 9913e519524SHoward Hinnantstruct __has_pointer_type 992b1c82cd0SHoward Hinnant : public integral_constant<bool, sizeof(__has_pointer_type_imp::__test<_Tp>(0)) == 1> 9933e519524SHoward Hinnant{ 9943e519524SHoward Hinnant}; 9953e519524SHoward Hinnant 9963e519524SHoward Hinnantnamespace __pointer_type_imp 9973e519524SHoward Hinnant{ 9983e519524SHoward Hinnant 9993e519524SHoward Hinnanttemplate <class _Tp, class _Dp, bool = __has_pointer_type<_Dp>::value> 10003e519524SHoward Hinnantstruct __pointer_type 10013e519524SHoward Hinnant{ 10023e519524SHoward Hinnant typedef typename _Dp::pointer type; 10033e519524SHoward Hinnant}; 10043e519524SHoward Hinnant 10053e519524SHoward Hinnanttemplate <class _Tp, class _Dp> 10063e519524SHoward Hinnantstruct __pointer_type<_Tp, _Dp, false> 10073e519524SHoward Hinnant{ 10083e519524SHoward Hinnant typedef _Tp* type; 10093e519524SHoward Hinnant}; 10103e519524SHoward Hinnant 1011a4a1ef1fSHoward Hinnant} // __pointer_type_imp 10123e519524SHoward Hinnant 10133e519524SHoward Hinnanttemplate <class _Tp, class _Dp> 10143e519524SHoward Hinnantstruct __pointer_type 10153e519524SHoward Hinnant{ 10163e519524SHoward Hinnant typedef typename __pointer_type_imp::__pointer_type<_Tp, typename remove_reference<_Dp>::type>::type type; 10173e519524SHoward Hinnant}; 10183e519524SHoward Hinnant 10193e519524SHoward Hinnanttemplate <class _Tp> 10203e519524SHoward Hinnantstruct __has_const_pointer 10213e519524SHoward Hinnant{ 10223e519524SHoward Hinnantprivate: 102354d333a6SHoward Hinnant struct __two {char __lx; char __lxx;}; 10243e519524SHoward Hinnant template <class _Up> static __two __test(...); 10253e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::const_pointer* = 0); 10263e519524SHoward Hinnantpublic: 10273e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 10283e519524SHoward Hinnant}; 10293e519524SHoward Hinnant 10303e519524SHoward Hinnanttemplate <class _Tp, class _Ptr, class _Alloc, bool = __has_const_pointer<_Alloc>::value> 10313e519524SHoward Hinnantstruct __const_pointer 10323e519524SHoward Hinnant{ 10333e519524SHoward Hinnant typedef typename _Alloc::const_pointer type; 10343e519524SHoward Hinnant}; 10353e519524SHoward Hinnant 10363e519524SHoward Hinnanttemplate <class _Tp, class _Ptr, class _Alloc> 10373e519524SHoward Hinnantstruct __const_pointer<_Tp, _Ptr, _Alloc, false> 10383e519524SHoward Hinnant{ 103954613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 10403e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<const _Tp> type; 10413e519524SHoward Hinnant#else 10423e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<const _Tp>::other type; 10433e519524SHoward Hinnant#endif 10443e519524SHoward Hinnant}; 10453e519524SHoward Hinnant 10463e519524SHoward Hinnanttemplate <class _Tp> 10473e519524SHoward Hinnantstruct __has_void_pointer 10483e519524SHoward Hinnant{ 10493e519524SHoward Hinnantprivate: 105054d333a6SHoward Hinnant struct __two {char __lx; char __lxx;}; 10513e519524SHoward Hinnant template <class _Up> static __two __test(...); 10523e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::void_pointer* = 0); 10533e519524SHoward Hinnantpublic: 10543e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 10553e519524SHoward Hinnant}; 10563e519524SHoward Hinnant 10573e519524SHoward Hinnanttemplate <class _Ptr, class _Alloc, bool = __has_void_pointer<_Alloc>::value> 10583e519524SHoward Hinnantstruct __void_pointer 10593e519524SHoward Hinnant{ 10603e519524SHoward Hinnant typedef typename _Alloc::void_pointer type; 10613e519524SHoward Hinnant}; 10623e519524SHoward Hinnant 10633e519524SHoward Hinnanttemplate <class _Ptr, class _Alloc> 10643e519524SHoward Hinnantstruct __void_pointer<_Ptr, _Alloc, false> 10653e519524SHoward Hinnant{ 106654613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 10673e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<void> type; 10683e519524SHoward Hinnant#else 10693e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<void>::other type; 10703e519524SHoward Hinnant#endif 10713e519524SHoward Hinnant}; 10723e519524SHoward Hinnant 10733e519524SHoward Hinnanttemplate <class _Tp> 10743e519524SHoward Hinnantstruct __has_const_void_pointer 10753e519524SHoward Hinnant{ 10763e519524SHoward Hinnantprivate: 107754d333a6SHoward Hinnant struct __two {char __lx; char __lxx;}; 10783e519524SHoward Hinnant template <class _Up> static __two __test(...); 10793e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::const_void_pointer* = 0); 10803e519524SHoward Hinnantpublic: 10813e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 10823e519524SHoward Hinnant}; 10833e519524SHoward Hinnant 10843e519524SHoward Hinnanttemplate <class _Ptr, class _Alloc, bool = __has_const_void_pointer<_Alloc>::value> 10853e519524SHoward Hinnantstruct __const_void_pointer 10863e519524SHoward Hinnant{ 10873e519524SHoward Hinnant typedef typename _Alloc::const_void_pointer type; 10883e519524SHoward Hinnant}; 10893e519524SHoward Hinnant 10903e519524SHoward Hinnanttemplate <class _Ptr, class _Alloc> 10913e519524SHoward Hinnantstruct __const_void_pointer<_Ptr, _Alloc, false> 10923e519524SHoward Hinnant{ 109354613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 10943e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<const void> type; 10953e519524SHoward Hinnant#else 10963e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<const void>::other type; 10973e519524SHoward Hinnant#endif 10983e519524SHoward Hinnant}; 10993e519524SHoward Hinnant 1100c003db1fSHoward Hinnanttemplate <class _Tp> 11013e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1102c003db1fSHoward Hinnant_Tp* 1103c003db1fSHoward Hinnant__to_raw_pointer(_Tp* __p) _NOEXCEPT 11043e519524SHoward Hinnant{ 11053e519524SHoward Hinnant return __p; 11063e519524SHoward Hinnant} 11073e519524SHoward Hinnant 11083e519524SHoward Hinnanttemplate <class _Pointer> 11093e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 11103e519524SHoward Hinnanttypename pointer_traits<_Pointer>::element_type* 11113739fe79SHoward Hinnant__to_raw_pointer(_Pointer __p) _NOEXCEPT 11123e519524SHoward Hinnant{ 1113ce48a113SHoward Hinnant return _VSTD::__to_raw_pointer(__p.operator->()); 11143e519524SHoward Hinnant} 11153e519524SHoward Hinnant 11163e519524SHoward Hinnanttemplate <class _Tp> 11173e519524SHoward Hinnantstruct __has_size_type 11183e519524SHoward Hinnant{ 11193e519524SHoward Hinnantprivate: 112054d333a6SHoward Hinnant struct __two {char __lx; char __lxx;}; 11213e519524SHoward Hinnant template <class _Up> static __two __test(...); 11223e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::size_type* = 0); 11233e519524SHoward Hinnantpublic: 11243e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 11253e519524SHoward Hinnant}; 11263e519524SHoward Hinnant 1127a4a1ef1fSHoward Hinnanttemplate <class _Alloc, class _DiffType, bool = __has_size_type<_Alloc>::value> 11283e519524SHoward Hinnantstruct __size_type 11293e519524SHoward Hinnant{ 1130a4a1ef1fSHoward Hinnant typedef typename make_unsigned<_DiffType>::type type; 11313e519524SHoward Hinnant}; 11323e519524SHoward Hinnant 1133a4a1ef1fSHoward Hinnanttemplate <class _Alloc, class _DiffType> 1134a4a1ef1fSHoward Hinnantstruct __size_type<_Alloc, _DiffType, true> 11353e519524SHoward Hinnant{ 11363e519524SHoward Hinnant typedef typename _Alloc::size_type type; 11373e519524SHoward Hinnant}; 11383e519524SHoward Hinnant 11393e519524SHoward Hinnanttemplate <class _Tp> 11403e519524SHoward Hinnantstruct __has_propagate_on_container_copy_assignment 11413e519524SHoward Hinnant{ 11423e519524SHoward Hinnantprivate: 114354d333a6SHoward Hinnant struct __two {char __lx; char __lxx;}; 11443e519524SHoward Hinnant template <class _Up> static __two __test(...); 11453e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::propagate_on_container_copy_assignment* = 0); 11463e519524SHoward Hinnantpublic: 11473e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 11483e519524SHoward Hinnant}; 11493e519524SHoward Hinnant 11503e519524SHoward Hinnanttemplate <class _Alloc, bool = __has_propagate_on_container_copy_assignment<_Alloc>::value> 11513e519524SHoward Hinnantstruct __propagate_on_container_copy_assignment 11523e519524SHoward Hinnant{ 11533e519524SHoward Hinnant typedef false_type type; 11543e519524SHoward Hinnant}; 11553e519524SHoward Hinnant 11563e519524SHoward Hinnanttemplate <class _Alloc> 11573e519524SHoward Hinnantstruct __propagate_on_container_copy_assignment<_Alloc, true> 11583e519524SHoward Hinnant{ 11593e519524SHoward Hinnant typedef typename _Alloc::propagate_on_container_copy_assignment type; 11603e519524SHoward Hinnant}; 11613e519524SHoward Hinnant 11623e519524SHoward Hinnanttemplate <class _Tp> 11633e519524SHoward Hinnantstruct __has_propagate_on_container_move_assignment 11643e519524SHoward Hinnant{ 11653e519524SHoward Hinnantprivate: 116654d333a6SHoward Hinnant struct __two {char __lx; char __lxx;}; 11673e519524SHoward Hinnant template <class _Up> static __two __test(...); 11683e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::propagate_on_container_move_assignment* = 0); 11693e519524SHoward Hinnantpublic: 11703e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 11713e519524SHoward Hinnant}; 11723e519524SHoward Hinnant 11733e519524SHoward Hinnanttemplate <class _Alloc, bool = __has_propagate_on_container_move_assignment<_Alloc>::value> 11743e519524SHoward Hinnantstruct __propagate_on_container_move_assignment 11753e519524SHoward Hinnant{ 11763e519524SHoward Hinnant typedef false_type type; 11773e519524SHoward Hinnant}; 11783e519524SHoward Hinnant 11793e519524SHoward Hinnanttemplate <class _Alloc> 11803e519524SHoward Hinnantstruct __propagate_on_container_move_assignment<_Alloc, true> 11813e519524SHoward Hinnant{ 11823e519524SHoward Hinnant typedef typename _Alloc::propagate_on_container_move_assignment type; 11833e519524SHoward Hinnant}; 11843e519524SHoward Hinnant 11853e519524SHoward Hinnanttemplate <class _Tp> 11863e519524SHoward Hinnantstruct __has_propagate_on_container_swap 11873e519524SHoward Hinnant{ 11883e519524SHoward Hinnantprivate: 118954d333a6SHoward Hinnant struct __two {char __lx; char __lxx;}; 11903e519524SHoward Hinnant template <class _Up> static __two __test(...); 11913e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::propagate_on_container_swap* = 0); 11923e519524SHoward Hinnantpublic: 11933e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 11943e519524SHoward Hinnant}; 11953e519524SHoward Hinnant 11963e519524SHoward Hinnanttemplate <class _Alloc, bool = __has_propagate_on_container_swap<_Alloc>::value> 11973e519524SHoward Hinnantstruct __propagate_on_container_swap 11983e519524SHoward Hinnant{ 11993e519524SHoward Hinnant typedef false_type type; 12003e519524SHoward Hinnant}; 12013e519524SHoward Hinnant 12023e519524SHoward Hinnanttemplate <class _Alloc> 12033e519524SHoward Hinnantstruct __propagate_on_container_swap<_Alloc, true> 12043e519524SHoward Hinnant{ 12053e519524SHoward Hinnant typedef typename _Alloc::propagate_on_container_swap type; 12063e519524SHoward Hinnant}; 12073e519524SHoward Hinnant 120831a47313SMarshall Clowtemplate <class _Tp> 120931a47313SMarshall Clowstruct __has_is_always_equal 121031a47313SMarshall Clow{ 121131a47313SMarshall Clowprivate: 121231a47313SMarshall Clow struct __two {char __lx; char __lxx;}; 121331a47313SMarshall Clow template <class _Up> static __two __test(...); 121431a47313SMarshall Clow template <class _Up> static char __test(typename _Up::is_always_equal* = 0); 121531a47313SMarshall Clowpublic: 121631a47313SMarshall Clow static const bool value = sizeof(__test<_Tp>(0)) == 1; 121731a47313SMarshall Clow}; 121831a47313SMarshall Clow 121931a47313SMarshall Clowtemplate <class _Alloc, bool = __has_is_always_equal<_Alloc>::value> 122031a47313SMarshall Clowstruct __is_always_equal 122131a47313SMarshall Clow{ 122231a47313SMarshall Clow typedef typename _VSTD::is_empty<_Alloc>::type type; 122331a47313SMarshall Clow}; 122431a47313SMarshall Clow 122531a47313SMarshall Clowtemplate <class _Alloc> 122631a47313SMarshall Clowstruct __is_always_equal<_Alloc, true> 122731a47313SMarshall Clow{ 122831a47313SMarshall Clow typedef typename _Alloc::is_always_equal type; 122931a47313SMarshall Clow}; 123031a47313SMarshall Clow 12313e519524SHoward Hinnanttemplate <class _Tp, class _Up, bool = __has_rebind<_Tp, _Up>::value> 12323e519524SHoward Hinnantstruct __has_rebind_other 12333e519524SHoward Hinnant{ 12343e519524SHoward Hinnantprivate: 123554d333a6SHoward Hinnant struct __two {char __lx; char __lxx;}; 12363e519524SHoward Hinnant template <class _Xp> static __two __test(...); 12373e519524SHoward Hinnant template <class _Xp> static char __test(typename _Xp::template rebind<_Up>::other* = 0); 12383e519524SHoward Hinnantpublic: 12393e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 12403e519524SHoward Hinnant}; 12413e519524SHoward Hinnant 12423e519524SHoward Hinnanttemplate <class _Tp, class _Up> 12433e519524SHoward Hinnantstruct __has_rebind_other<_Tp, _Up, false> 12443e519524SHoward Hinnant{ 12453e519524SHoward Hinnant static const bool value = false; 12463e519524SHoward Hinnant}; 12473e519524SHoward Hinnant 12483e519524SHoward Hinnanttemplate <class _Tp, class _Up, bool = __has_rebind_other<_Tp, _Up>::value> 12493e519524SHoward Hinnantstruct __allocator_traits_rebind 12503e519524SHoward Hinnant{ 12513e519524SHoward Hinnant typedef typename _Tp::template rebind<_Up>::other type; 12523e519524SHoward Hinnant}; 12533e519524SHoward Hinnant 12543e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 12553e519524SHoward Hinnant 12563e519524SHoward Hinnanttemplate <template <class, class...> class _Alloc, class _Tp, class ..._Args, class _Up> 12573e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _Args...>, _Up, true> 12583e519524SHoward Hinnant{ 12593e519524SHoward Hinnant typedef typename _Alloc<_Tp, _Args...>::template rebind<_Up>::other type; 12603e519524SHoward Hinnant}; 12613e519524SHoward Hinnant 12623e519524SHoward Hinnanttemplate <template <class, class...> class _Alloc, class _Tp, class ..._Args, class _Up> 12633e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _Args...>, _Up, false> 12643e519524SHoward Hinnant{ 12653e519524SHoward Hinnant typedef _Alloc<_Up, _Args...> type; 12663e519524SHoward Hinnant}; 12673e519524SHoward Hinnant 1268b3371f6fSHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 12693e519524SHoward Hinnant 12703e519524SHoward Hinnanttemplate <template <class> class _Alloc, class _Tp, class _Up> 12713e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp>, _Up, true> 12723e519524SHoward Hinnant{ 12733e519524SHoward Hinnant typedef typename _Alloc<_Tp>::template rebind<_Up>::other type; 12743e519524SHoward Hinnant}; 12753e519524SHoward Hinnant 12763e519524SHoward Hinnanttemplate <template <class> class _Alloc, class _Tp, class _Up> 12773e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp>, _Up, false> 12783e519524SHoward Hinnant{ 12793e519524SHoward Hinnant typedef _Alloc<_Up> type; 12803e519524SHoward Hinnant}; 12813e519524SHoward Hinnant 12823e519524SHoward Hinnanttemplate <template <class, class> class _Alloc, class _Tp, class _A0, class _Up> 12833e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0>, _Up, true> 12843e519524SHoward Hinnant{ 12853e519524SHoward Hinnant typedef typename _Alloc<_Tp, _A0>::template rebind<_Up>::other type; 12863e519524SHoward Hinnant}; 12873e519524SHoward Hinnant 12883e519524SHoward Hinnanttemplate <template <class, class> class _Alloc, class _Tp, class _A0, class _Up> 12893e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0>, _Up, false> 12903e519524SHoward Hinnant{ 12913e519524SHoward Hinnant typedef _Alloc<_Up, _A0> type; 12923e519524SHoward Hinnant}; 12933e519524SHoward Hinnant 12943e519524SHoward Hinnanttemplate <template <class, class, class> class _Alloc, class _Tp, class _A0, 12953e519524SHoward Hinnant class _A1, class _Up> 12963e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1>, _Up, true> 12973e519524SHoward Hinnant{ 12983e519524SHoward Hinnant typedef typename _Alloc<_Tp, _A0, _A1>::template rebind<_Up>::other type; 12993e519524SHoward Hinnant}; 13003e519524SHoward Hinnant 13013e519524SHoward Hinnanttemplate <template <class, class, class> class _Alloc, class _Tp, class _A0, 13023e519524SHoward Hinnant class _A1, class _Up> 13033e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1>, _Up, false> 13043e519524SHoward Hinnant{ 13053e519524SHoward Hinnant typedef _Alloc<_Up, _A0, _A1> type; 13063e519524SHoward Hinnant}; 13073e519524SHoward Hinnant 13083e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Alloc, class _Tp, class _A0, 13093e519524SHoward Hinnant class _A1, class _A2, class _Up> 13103e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1, _A2>, _Up, true> 13113e519524SHoward Hinnant{ 13123e519524SHoward Hinnant typedef typename _Alloc<_Tp, _A0, _A1, _A2>::template rebind<_Up>::other type; 13133e519524SHoward Hinnant}; 13143e519524SHoward Hinnant 13153e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Alloc, class _Tp, class _A0, 13163e519524SHoward Hinnant class _A1, class _A2, class _Up> 13173e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1, _A2>, _Up, false> 13183e519524SHoward Hinnant{ 13193e519524SHoward Hinnant typedef _Alloc<_Up, _A0, _A1, _A2> type; 13203e519524SHoward Hinnant}; 13213e519524SHoward Hinnant 1322b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 13233e519524SHoward Hinnant 132454613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 13253e519524SHoward Hinnant 13263e519524SHoward Hinnanttemplate <class _Alloc, class _SizeType, class _ConstVoidPtr> 13273e519524SHoward Hinnantauto 13283e519524SHoward Hinnant__has_allocate_hint_test(_Alloc&& __a, _SizeType&& __sz, _ConstVoidPtr&& __p) 13293e519524SHoward Hinnant -> decltype(__a.allocate(__sz, __p), true_type()); 13303e519524SHoward Hinnant 13313e519524SHoward Hinnanttemplate <class _Alloc, class _SizeType, class _ConstVoidPtr> 13323e519524SHoward Hinnantauto 13333e519524SHoward Hinnant__has_allocate_hint_test(const _Alloc& __a, _SizeType&& __sz, _ConstVoidPtr&& __p) 13343e519524SHoward Hinnant -> false_type; 13353e519524SHoward Hinnant 13363e519524SHoward Hinnanttemplate <class _Alloc, class _SizeType, class _ConstVoidPtr> 13373e519524SHoward Hinnantstruct __has_allocate_hint 13383e519524SHoward Hinnant : integral_constant<bool, 13393e519524SHoward Hinnant is_same< 13403e519524SHoward Hinnant decltype(__has_allocate_hint_test(declval<_Alloc>(), 13413e519524SHoward Hinnant declval<_SizeType>(), 13423e519524SHoward Hinnant declval<_ConstVoidPtr>())), 13433e519524SHoward Hinnant true_type>::value> 13443e519524SHoward Hinnant{ 13453e519524SHoward Hinnant}; 13463e519524SHoward Hinnant 134754613ab4SEric Fiselier#else // _LIBCPP_CXX03_LANG 13483e519524SHoward Hinnant 13493e519524SHoward Hinnanttemplate <class _Alloc, class _SizeType, class _ConstVoidPtr> 13503e519524SHoward Hinnantstruct __has_allocate_hint 13513e519524SHoward Hinnant : true_type 13523e519524SHoward Hinnant{ 13533e519524SHoward Hinnant}; 13543e519524SHoward Hinnant 135554613ab4SEric Fiselier#endif // _LIBCPP_CXX03_LANG 13563e519524SHoward Hinnant 135754613ab4SEric Fiselier#if !defined(_LIBCPP_CXX03_LANG) 13583e519524SHoward Hinnant 13593e519524SHoward Hinnanttemplate <class _Alloc, class _Tp, class ..._Args> 1360ce48a113SHoward Hinnantdecltype(_VSTD::declval<_Alloc>().construct(_VSTD::declval<_Tp*>(), 1361ce48a113SHoward Hinnant _VSTD::declval<_Args>()...), 13623e519524SHoward Hinnant true_type()) 13633e519524SHoward Hinnant__has_construct_test(_Alloc&& __a, _Tp* __p, _Args&& ...__args); 13643e519524SHoward Hinnant 13653e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer, class ..._Args> 13663e519524SHoward Hinnantfalse_type 13673e519524SHoward Hinnant__has_construct_test(const _Alloc& __a, _Pointer&& __p, _Args&& ...__args); 13683e519524SHoward Hinnant 13693e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer, class ..._Args> 13703e519524SHoward Hinnantstruct __has_construct 13713e519524SHoward Hinnant : integral_constant<bool, 13723e519524SHoward Hinnant is_same< 13733e519524SHoward Hinnant decltype(__has_construct_test(declval<_Alloc>(), 13743e519524SHoward Hinnant declval<_Pointer>(), 13753e519524SHoward Hinnant declval<_Args>()...)), 13763e519524SHoward Hinnant true_type>::value> 13773e519524SHoward Hinnant{ 13783e519524SHoward Hinnant}; 13793e519524SHoward Hinnant 13803e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer> 13813e519524SHoward Hinnantauto 13823e519524SHoward Hinnant__has_destroy_test(_Alloc&& __a, _Pointer&& __p) 13833e519524SHoward Hinnant -> decltype(__a.destroy(__p), true_type()); 13843e519524SHoward Hinnant 13853e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer> 13863e519524SHoward Hinnantauto 13873e519524SHoward Hinnant__has_destroy_test(const _Alloc& __a, _Pointer&& __p) 13883e519524SHoward Hinnant -> false_type; 13893e519524SHoward Hinnant 13903e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer> 13913e519524SHoward Hinnantstruct __has_destroy 13923e519524SHoward Hinnant : integral_constant<bool, 13933e519524SHoward Hinnant is_same< 13943e519524SHoward Hinnant decltype(__has_destroy_test(declval<_Alloc>(), 13953e519524SHoward Hinnant declval<_Pointer>())), 13963e519524SHoward Hinnant true_type>::value> 13973e519524SHoward Hinnant{ 13983e519524SHoward Hinnant}; 13993e519524SHoward Hinnant 14003e519524SHoward Hinnanttemplate <class _Alloc> 14013e519524SHoward Hinnantauto 14023e519524SHoward Hinnant__has_max_size_test(_Alloc&& __a) 14033e519524SHoward Hinnant -> decltype(__a.max_size(), true_type()); 14043e519524SHoward Hinnant 14053e519524SHoward Hinnanttemplate <class _Alloc> 14063e519524SHoward Hinnantauto 14073e519524SHoward Hinnant__has_max_size_test(const volatile _Alloc& __a) 14083e519524SHoward Hinnant -> false_type; 14093e519524SHoward Hinnant 14103e519524SHoward Hinnanttemplate <class _Alloc> 14113e519524SHoward Hinnantstruct __has_max_size 14123e519524SHoward Hinnant : integral_constant<bool, 14133e519524SHoward Hinnant is_same< 14143e519524SHoward Hinnant decltype(__has_max_size_test(declval<_Alloc&>())), 14153e519524SHoward Hinnant true_type>::value> 14163e519524SHoward Hinnant{ 14173e519524SHoward Hinnant}; 14183e519524SHoward Hinnant 14193e519524SHoward Hinnanttemplate <class _Alloc> 14203e519524SHoward Hinnantauto 14213e519524SHoward Hinnant__has_select_on_container_copy_construction_test(_Alloc&& __a) 14223e519524SHoward Hinnant -> decltype(__a.select_on_container_copy_construction(), true_type()); 14233e519524SHoward Hinnant 14243e519524SHoward Hinnanttemplate <class _Alloc> 14253e519524SHoward Hinnantauto 14263e519524SHoward Hinnant__has_select_on_container_copy_construction_test(const volatile _Alloc& __a) 14273e519524SHoward Hinnant -> false_type; 14283e519524SHoward Hinnant 14293e519524SHoward Hinnanttemplate <class _Alloc> 14303e519524SHoward Hinnantstruct __has_select_on_container_copy_construction 14313e519524SHoward Hinnant : integral_constant<bool, 14323e519524SHoward Hinnant is_same< 14333e519524SHoward Hinnant decltype(__has_select_on_container_copy_construction_test(declval<_Alloc&>())), 14343e519524SHoward Hinnant true_type>::value> 14353e519524SHoward Hinnant{ 14363e519524SHoward Hinnant}; 14373e519524SHoward Hinnant 143854613ab4SEric Fiselier#else // _LIBCPP_CXX03_LANG 14393e519524SHoward Hinnant 14403e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 14413e519524SHoward Hinnant 14423e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer, class ..._Args> 14433e519524SHoward Hinnantstruct __has_construct 14443e519524SHoward Hinnant : false_type 14453e519524SHoward Hinnant{ 14463e519524SHoward Hinnant}; 14473e519524SHoward Hinnant 14489741d6c9SHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 14499741d6c9SHoward Hinnant 14509741d6c9SHoward Hinnanttemplate <class _Alloc, class _Pointer, class _Args> 14519741d6c9SHoward Hinnantstruct __has_construct 14529741d6c9SHoward Hinnant : false_type 14539741d6c9SHoward Hinnant{ 14549741d6c9SHoward Hinnant}; 14559741d6c9SHoward Hinnant 1456b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 14573e519524SHoward Hinnant 14583e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer> 14593e519524SHoward Hinnantstruct __has_destroy 14603e519524SHoward Hinnant : false_type 14613e519524SHoward Hinnant{ 14623e519524SHoward Hinnant}; 14633e519524SHoward Hinnant 14643e519524SHoward Hinnanttemplate <class _Alloc> 14653e519524SHoward Hinnantstruct __has_max_size 14663e519524SHoward Hinnant : true_type 14673e519524SHoward Hinnant{ 14683e519524SHoward Hinnant}; 14693e519524SHoward Hinnant 14703e519524SHoward Hinnanttemplate <class _Alloc> 14713e519524SHoward Hinnantstruct __has_select_on_container_copy_construction 14723e519524SHoward Hinnant : false_type 14733e519524SHoward Hinnant{ 14743e519524SHoward Hinnant}; 14753e519524SHoward Hinnant 147654613ab4SEric Fiselier#endif // _LIBCPP_CXX03_LANG 14773e519524SHoward Hinnant 1478a4a1ef1fSHoward Hinnanttemplate <class _Alloc, class _Ptr, bool = __has_difference_type<_Alloc>::value> 1479a4a1ef1fSHoward Hinnantstruct __alloc_traits_difference_type 1480a4a1ef1fSHoward Hinnant{ 1481a4a1ef1fSHoward Hinnant typedef typename pointer_traits<_Ptr>::difference_type type; 1482a4a1ef1fSHoward Hinnant}; 1483a4a1ef1fSHoward Hinnant 1484a4a1ef1fSHoward Hinnanttemplate <class _Alloc, class _Ptr> 1485a4a1ef1fSHoward Hinnantstruct __alloc_traits_difference_type<_Alloc, _Ptr, true> 1486a4a1ef1fSHoward Hinnant{ 1487a4a1ef1fSHoward Hinnant typedef typename _Alloc::difference_type type; 1488a4a1ef1fSHoward Hinnant}; 1489a4a1ef1fSHoward Hinnant 14903e519524SHoward Hinnanttemplate <class _Alloc> 1491e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS allocator_traits 14923e519524SHoward Hinnant{ 14933e519524SHoward Hinnant typedef _Alloc allocator_type; 14943e519524SHoward Hinnant typedef typename allocator_type::value_type value_type; 14953e519524SHoward Hinnant 14963e519524SHoward Hinnant typedef typename __pointer_type<value_type, allocator_type>::type pointer; 14973e519524SHoward Hinnant typedef typename __const_pointer<value_type, pointer, allocator_type>::type const_pointer; 14983e519524SHoward Hinnant typedef typename __void_pointer<pointer, allocator_type>::type void_pointer; 14993e519524SHoward Hinnant typedef typename __const_void_pointer<pointer, allocator_type>::type const_void_pointer; 15003e519524SHoward Hinnant 1501a4a1ef1fSHoward Hinnant typedef typename __alloc_traits_difference_type<allocator_type, pointer>::type difference_type; 1502a4a1ef1fSHoward Hinnant typedef typename __size_type<allocator_type, difference_type>::type size_type; 15033e519524SHoward Hinnant 15043e519524SHoward Hinnant typedef typename __propagate_on_container_copy_assignment<allocator_type>::type 15053e519524SHoward Hinnant propagate_on_container_copy_assignment; 15063e519524SHoward Hinnant typedef typename __propagate_on_container_move_assignment<allocator_type>::type 15073e519524SHoward Hinnant propagate_on_container_move_assignment; 15083e519524SHoward Hinnant typedef typename __propagate_on_container_swap<allocator_type>::type 15093e519524SHoward Hinnant propagate_on_container_swap; 151031a47313SMarshall Clow typedef typename __is_always_equal<allocator_type>::type 151131a47313SMarshall Clow is_always_equal; 15123e519524SHoward Hinnant 151354613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 15143e519524SHoward Hinnant template <class _Tp> using rebind_alloc = 1515f7384975SHoward Hinnant typename __allocator_traits_rebind<allocator_type, _Tp>::type; 15163e519524SHoward Hinnant template <class _Tp> using rebind_traits = allocator_traits<rebind_alloc<_Tp>>; 151754613ab4SEric Fiselier#else // _LIBCPP_CXX03_LANG 15183e519524SHoward Hinnant template <class _Tp> struct rebind_alloc 15193e519524SHoward Hinnant {typedef typename __allocator_traits_rebind<allocator_type, _Tp>::type other;}; 15203e519524SHoward Hinnant template <class _Tp> struct rebind_traits 15213e519524SHoward Hinnant {typedef allocator_traits<typename rebind_alloc<_Tp>::other> other;}; 152254613ab4SEric Fiselier#endif // _LIBCPP_CXX03_LANG 15233e519524SHoward Hinnant 1524848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15253e519524SHoward Hinnant static pointer allocate(allocator_type& __a, size_type __n) 15263e519524SHoward Hinnant {return __a.allocate(__n);} 1527848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15283e519524SHoward Hinnant static pointer allocate(allocator_type& __a, size_type __n, const_void_pointer __hint) 15293e519524SHoward Hinnant {return allocate(__a, __n, __hint, 15303e519524SHoward Hinnant __has_allocate_hint<allocator_type, size_type, const_void_pointer>());} 15313e519524SHoward Hinnant 1532848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15333739fe79SHoward Hinnant static void deallocate(allocator_type& __a, pointer __p, size_type __n) _NOEXCEPT 15343e519524SHoward Hinnant {__a.deallocate(__p, __n);} 15353e519524SHoward Hinnant 15363e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 15373e519524SHoward Hinnant template <class _Tp, class... _Args> 1538848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15393e519524SHoward Hinnant static void construct(allocator_type& __a, _Tp* __p, _Args&&... __args) 1540981f31acSMarshall Clow {__construct(__has_construct<allocator_type, _Tp*, _Args...>(), 1541ce48a113SHoward Hinnant __a, __p, _VSTD::forward<_Args>(__args)...);} 1542b3371f6fSHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 15433e519524SHoward Hinnant template <class _Tp> 1544848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15453e519524SHoward Hinnant static void construct(allocator_type& __a, _Tp* __p) 15463e519524SHoward Hinnant { 15473e519524SHoward Hinnant ::new ((void*)__p) _Tp(); 15483e519524SHoward Hinnant } 15493e519524SHoward Hinnant template <class _Tp, class _A0> 1550848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15513e519524SHoward Hinnant static void construct(allocator_type& __a, _Tp* __p, const _A0& __a0) 15523e519524SHoward Hinnant { 15533e519524SHoward Hinnant ::new ((void*)__p) _Tp(__a0); 15543e519524SHoward Hinnant } 15553e519524SHoward Hinnant template <class _Tp, class _A0, class _A1> 1556848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15573e519524SHoward Hinnant static void construct(allocator_type& __a, _Tp* __p, const _A0& __a0, 15583e519524SHoward Hinnant const _A1& __a1) 15593e519524SHoward Hinnant { 15603e519524SHoward Hinnant ::new ((void*)__p) _Tp(__a0, __a1); 15613e519524SHoward Hinnant } 15623e519524SHoward Hinnant template <class _Tp, class _A0, class _A1, class _A2> 1563848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15643e519524SHoward Hinnant static void construct(allocator_type& __a, _Tp* __p, const _A0& __a0, 15653e519524SHoward Hinnant const _A1& __a1, const _A2& __a2) 15663e519524SHoward Hinnant { 15673e519524SHoward Hinnant ::new ((void*)__p) _Tp(__a0, __a1, __a2); 15683e519524SHoward Hinnant } 1569b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 15703e519524SHoward Hinnant 15713e519524SHoward Hinnant template <class _Tp> 1572848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15733e519524SHoward Hinnant static void destroy(allocator_type& __a, _Tp* __p) 15743e519524SHoward Hinnant {__destroy(__has_destroy<allocator_type, _Tp*>(), __a, __p);} 15753e519524SHoward Hinnant 1576848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 157706fbed03SMarshall Clow static size_type max_size(const allocator_type& __a) _NOEXCEPT 15783e519524SHoward Hinnant {return __max_size(__has_max_size<const allocator_type>(), __a);} 15793e519524SHoward Hinnant 1580848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15813e519524SHoward Hinnant static allocator_type 15823e519524SHoward Hinnant select_on_container_copy_construction(const allocator_type& __a) 15833e519524SHoward Hinnant {return select_on_container_copy_construction( 15843e519524SHoward Hinnant __has_select_on_container_copy_construction<const allocator_type>(), 15853e519524SHoward Hinnant __a);} 15863e519524SHoward Hinnant 15879741d6c9SHoward Hinnant template <class _Ptr> 15889741d6c9SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15899741d6c9SHoward Hinnant static 15909741d6c9SHoward Hinnant void 15919741d6c9SHoward Hinnant __construct_forward(allocator_type& __a, _Ptr __begin1, _Ptr __end1, _Ptr& __begin2) 15929741d6c9SHoward Hinnant { 15939741d6c9SHoward Hinnant for (; __begin1 != __end1; ++__begin1, ++__begin2) 15949741d6c9SHoward Hinnant construct(__a, _VSTD::__to_raw_pointer(__begin2), _VSTD::move_if_noexcept(*__begin1)); 15959741d6c9SHoward Hinnant } 15969741d6c9SHoward Hinnant 15979741d6c9SHoward Hinnant template <class _Tp> 15989741d6c9SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15999741d6c9SHoward Hinnant static 16009741d6c9SHoward Hinnant typename enable_if 16019741d6c9SHoward Hinnant < 16029741d6c9SHoward Hinnant (is_same<allocator_type, allocator<_Tp> >::value 16039741d6c9SHoward Hinnant || !__has_construct<allocator_type, _Tp*, _Tp>::value) && 16049741d6c9SHoward Hinnant is_trivially_move_constructible<_Tp>::value, 16059741d6c9SHoward Hinnant void 16069741d6c9SHoward Hinnant >::type 1607fd838227SEric Fiselier __construct_forward(allocator_type&, _Tp* __begin1, _Tp* __end1, _Tp*& __begin2) 16089741d6c9SHoward Hinnant { 16099741d6c9SHoward Hinnant ptrdiff_t _Np = __end1 - __begin1; 161087601befSMarshall Clow if (_Np > 0) 1611e6230742SMarshall Clow { 16129741d6c9SHoward Hinnant _VSTD::memcpy(__begin2, __begin1, _Np * sizeof(_Tp)); 16139741d6c9SHoward Hinnant __begin2 += _Np; 16149741d6c9SHoward Hinnant } 1615e6230742SMarshall Clow } 16169741d6c9SHoward Hinnant 1617e782178eSEric Fiselier template <class _Iter, class _Ptr> 1618e782178eSEric Fiselier _LIBCPP_INLINE_VISIBILITY 1619e782178eSEric Fiselier static 1620e782178eSEric Fiselier void 1621e782178eSEric Fiselier __construct_range_forward(allocator_type& __a, _Iter __begin1, _Iter __end1, _Ptr& __begin2) 1622e782178eSEric Fiselier { 1623e782178eSEric Fiselier for (; __begin1 != __end1; ++__begin1, (void) ++__begin2) 1624e782178eSEric Fiselier construct(__a, _VSTD::__to_raw_pointer(__begin2), *__begin1); 1625e782178eSEric Fiselier } 1626e782178eSEric Fiselier 1627e782178eSEric Fiselier template <class _Tp> 1628e782178eSEric Fiselier _LIBCPP_INLINE_VISIBILITY 1629e782178eSEric Fiselier static 1630e782178eSEric Fiselier typename enable_if 1631e782178eSEric Fiselier < 1632e782178eSEric Fiselier (is_same<allocator_type, allocator<_Tp> >::value 1633e782178eSEric Fiselier || !__has_construct<allocator_type, _Tp*, _Tp>::value) && 1634e782178eSEric Fiselier is_trivially_move_constructible<_Tp>::value, 1635e782178eSEric Fiselier void 1636e782178eSEric Fiselier >::type 1637fd838227SEric Fiselier __construct_range_forward(allocator_type&, _Tp* __begin1, _Tp* __end1, _Tp*& __begin2) 1638e782178eSEric Fiselier { 1639e782178eSEric Fiselier typedef typename remove_const<_Tp>::type _Vp; 1640e782178eSEric Fiselier ptrdiff_t _Np = __end1 - __begin1; 164187601befSMarshall Clow if (_Np > 0) 1642e6230742SMarshall Clow { 1643e782178eSEric Fiselier _VSTD::memcpy(const_cast<_Vp*>(__begin2), __begin1, _Np * sizeof(_Tp)); 1644e782178eSEric Fiselier __begin2 += _Np; 1645e782178eSEric Fiselier } 1646e6230742SMarshall Clow } 1647e782178eSEric Fiselier 16489741d6c9SHoward Hinnant template <class _Ptr> 16499741d6c9SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16509741d6c9SHoward Hinnant static 16519741d6c9SHoward Hinnant void 16529741d6c9SHoward Hinnant __construct_backward(allocator_type& __a, _Ptr __begin1, _Ptr __end1, _Ptr& __end2) 16539741d6c9SHoward Hinnant { 16549741d6c9SHoward Hinnant while (__end1 != __begin1) 16558d9aec88SHoward Hinnant { 16568d9aec88SHoward Hinnant construct(__a, _VSTD::__to_raw_pointer(__end2-1), _VSTD::move_if_noexcept(*--__end1)); 16578d9aec88SHoward Hinnant --__end2; 16588d9aec88SHoward Hinnant } 16599741d6c9SHoward Hinnant } 16609741d6c9SHoward Hinnant 16619741d6c9SHoward Hinnant template <class _Tp> 16629741d6c9SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16639741d6c9SHoward Hinnant static 16649741d6c9SHoward Hinnant typename enable_if 16659741d6c9SHoward Hinnant < 16669741d6c9SHoward Hinnant (is_same<allocator_type, allocator<_Tp> >::value 16679741d6c9SHoward Hinnant || !__has_construct<allocator_type, _Tp*, _Tp>::value) && 16689741d6c9SHoward Hinnant is_trivially_move_constructible<_Tp>::value, 16699741d6c9SHoward Hinnant void 16709741d6c9SHoward Hinnant >::type 1671fd838227SEric Fiselier __construct_backward(allocator_type&, _Tp* __begin1, _Tp* __end1, _Tp*& __end2) 16729741d6c9SHoward Hinnant { 16739741d6c9SHoward Hinnant ptrdiff_t _Np = __end1 - __begin1; 16749741d6c9SHoward Hinnant __end2 -= _Np; 167587601befSMarshall Clow if (_Np > 0) 16769741d6c9SHoward Hinnant _VSTD::memcpy(__end2, __begin1, _Np * sizeof(_Tp)); 16779741d6c9SHoward Hinnant } 16789741d6c9SHoward Hinnant 16793e519524SHoward Hinnantprivate: 16803e519524SHoward Hinnant 1681848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16823e519524SHoward Hinnant static pointer allocate(allocator_type& __a, size_type __n, 16833e519524SHoward Hinnant const_void_pointer __hint, true_type) 16843e519524SHoward Hinnant {return __a.allocate(__n, __hint);} 1685848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16863e519524SHoward Hinnant static pointer allocate(allocator_type& __a, size_type __n, 1687c206366fSHoward Hinnant const_void_pointer, false_type) 16883e519524SHoward Hinnant {return __a.allocate(__n);} 16893e519524SHoward Hinnant 16903e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 16913e519524SHoward Hinnant template <class _Tp, class... _Args> 1692848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16933e519524SHoward Hinnant static void __construct(true_type, allocator_type& __a, _Tp* __p, _Args&&... __args) 1694ce48a113SHoward Hinnant {__a.construct(__p, _VSTD::forward<_Args>(__args)...);} 16953e519524SHoward Hinnant template <class _Tp, class... _Args> 1696848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16973e519524SHoward Hinnant static void __construct(false_type, allocator_type&, _Tp* __p, _Args&&... __args) 16983e519524SHoward Hinnant { 1699ce48a113SHoward Hinnant ::new ((void*)__p) _Tp(_VSTD::forward<_Args>(__args)...); 17003e519524SHoward Hinnant } 1701b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 17023e519524SHoward Hinnant 17033e519524SHoward Hinnant template <class _Tp> 1704848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17053e519524SHoward Hinnant static void __destroy(true_type, allocator_type& __a, _Tp* __p) 17063e519524SHoward Hinnant {__a.destroy(__p);} 17073e519524SHoward Hinnant template <class _Tp> 1708848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17093e519524SHoward Hinnant static void __destroy(false_type, allocator_type&, _Tp* __p) 17103e519524SHoward Hinnant { 17113e519524SHoward Hinnant __p->~_Tp(); 17123e519524SHoward Hinnant } 17133e519524SHoward Hinnant 1714848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17153e519524SHoward Hinnant static size_type __max_size(true_type, const allocator_type& __a) 17163e519524SHoward Hinnant {return __a.max_size();} 1717848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17183e519524SHoward Hinnant static size_type __max_size(false_type, const allocator_type&) 1719b631c243SMarshall Clow {return numeric_limits<size_type>::max() / sizeof(value_type);} 17203e519524SHoward Hinnant 1721848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17223e519524SHoward Hinnant static allocator_type 17233e519524SHoward Hinnant select_on_container_copy_construction(true_type, const allocator_type& __a) 17243e519524SHoward Hinnant {return __a.select_on_container_copy_construction();} 1725848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17263e519524SHoward Hinnant static allocator_type 17273e519524SHoward Hinnant select_on_container_copy_construction(false_type, const allocator_type& __a) 17283e519524SHoward Hinnant {return __a;} 17293e519524SHoward Hinnant}; 17303e519524SHoward Hinnant 17311f508014SMarshall Clowtemplate <class _Traits, class _Tp> 17321f508014SMarshall Clowstruct __rebind_alloc_helper 17331f508014SMarshall Clow{ 173454613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 17351f508014SMarshall Clow typedef typename _Traits::template rebind_alloc<_Tp> type; 17361f508014SMarshall Clow#else 17371f508014SMarshall Clow typedef typename _Traits::template rebind_alloc<_Tp>::other type; 17381f508014SMarshall Clow#endif 17391f508014SMarshall Clow}; 17401f508014SMarshall Clow 17413e519524SHoward Hinnant// allocator 17423e519524SHoward Hinnant 17433e519524SHoward Hinnanttemplate <class _Tp> 1744e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS allocator 17453e519524SHoward Hinnant{ 17463e519524SHoward Hinnantpublic: 17473e519524SHoward Hinnant typedef size_t size_type; 17483e519524SHoward Hinnant typedef ptrdiff_t difference_type; 17493e519524SHoward Hinnant typedef _Tp* pointer; 17503e519524SHoward Hinnant typedef const _Tp* const_pointer; 17513e519524SHoward Hinnant typedef _Tp& reference; 17523e519524SHoward Hinnant typedef const _Tp& const_reference; 17533e519524SHoward Hinnant typedef _Tp value_type; 17543e519524SHoward Hinnant 1755b58f59cdSHoward Hinnant typedef true_type propagate_on_container_move_assignment; 175631a47313SMarshall Clow typedef true_type is_always_equal; 1757b58f59cdSHoward Hinnant 17583e519524SHoward Hinnant template <class _Up> struct rebind {typedef allocator<_Up> other;}; 17593e519524SHoward Hinnant 17603739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY allocator() _NOEXCEPT {} 17613739fe79SHoward Hinnant template <class _Up> _LIBCPP_INLINE_VISIBILITY allocator(const allocator<_Up>&) _NOEXCEPT {} 17623739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer address(reference __x) const _NOEXCEPT 1763ce48a113SHoward Hinnant {return _VSTD::addressof(__x);} 17643739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY const_pointer address(const_reference __x) const _NOEXCEPT 1765ce48a113SHoward Hinnant {return _VSTD::addressof(__x);} 17663e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer allocate(size_type __n, allocator<void>::const_pointer = 0) 17674cec709eSMarshall Clow { 17684cec709eSMarshall Clow if (__n > max_size()) 17690fc8cec7SMarshall Clow __throw_length_error("allocator<T>::allocate(size_t n)" 17700fc8cec7SMarshall Clow " 'n' exceeds maximum supported size"); 17714cec709eSMarshall Clow return static_cast<pointer>(_VSTD::__allocate(__n * sizeof(_Tp))); 17724cec709eSMarshall Clow } 17733739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void deallocate(pointer __p, size_type) _NOEXCEPT 1774*cd71f447SEric Fiselier {_VSTD::__libcpp_deallocate((void*)__p);} 17753739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT 17763739fe79SHoward Hinnant {return size_type(~0) / sizeof(_Tp);} 17777609c9b6SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 17783e519524SHoward Hinnant template <class _Up, class... _Args> 17793e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17803e519524SHoward Hinnant void 17813e519524SHoward Hinnant construct(_Up* __p, _Args&&... __args) 17823e519524SHoward Hinnant { 1783ce48a113SHoward Hinnant ::new((void*)__p) _Up(_VSTD::forward<_Args>(__args)...); 17843e519524SHoward Hinnant } 17857609c9b6SHoward Hinnant#else // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 17863e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17873e519524SHoward Hinnant void 17883e519524SHoward Hinnant construct(pointer __p) 17893e519524SHoward Hinnant { 17903e519524SHoward Hinnant ::new((void*)__p) _Tp(); 17913e519524SHoward Hinnant } 1792f5799be4SMichael J. Spencer# if defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) 1793bff1bfc6SHoward Hinnant 17943e519524SHoward Hinnant template <class _A0> 17953e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17963e519524SHoward Hinnant void 17973e519524SHoward Hinnant construct(pointer __p, _A0& __a0) 17983e519524SHoward Hinnant { 17993e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0); 18003e519524SHoward Hinnant } 18013e519524SHoward Hinnant template <class _A0> 18023e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18033e519524SHoward Hinnant void 18043e519524SHoward Hinnant construct(pointer __p, const _A0& __a0) 18053e519524SHoward Hinnant { 18063e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0); 18073e519524SHoward Hinnant } 1808f5799be4SMichael J. Spencer# endif // defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) 18093e519524SHoward Hinnant template <class _A0, class _A1> 18103e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18113e519524SHoward Hinnant void 18123e519524SHoward Hinnant construct(pointer __p, _A0& __a0, _A1& __a1) 18133e519524SHoward Hinnant { 18143e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 18153e519524SHoward Hinnant } 18163e519524SHoward Hinnant template <class _A0, class _A1> 18173e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18183e519524SHoward Hinnant void 18193e519524SHoward Hinnant construct(pointer __p, const _A0& __a0, _A1& __a1) 18203e519524SHoward Hinnant { 18213e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 18223e519524SHoward Hinnant } 18233e519524SHoward Hinnant template <class _A0, class _A1> 18243e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18253e519524SHoward Hinnant void 18263e519524SHoward Hinnant construct(pointer __p, _A0& __a0, const _A1& __a1) 18273e519524SHoward Hinnant { 18283e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 18293e519524SHoward Hinnant } 18303e519524SHoward Hinnant template <class _A0, class _A1> 18313e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18323e519524SHoward Hinnant void 18333e519524SHoward Hinnant construct(pointer __p, const _A0& __a0, const _A1& __a1) 18343e519524SHoward Hinnant { 18353e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 18363e519524SHoward Hinnant } 18377609c9b6SHoward Hinnant#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 18383e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void destroy(pointer __p) {__p->~_Tp();} 18393e519524SHoward Hinnant}; 18403e519524SHoward Hinnant 18418e25104bSHoward Hinnanttemplate <class _Tp> 1842e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS allocator<const _Tp> 18438e25104bSHoward Hinnant{ 18448e25104bSHoward Hinnantpublic: 18458e25104bSHoward Hinnant typedef size_t size_type; 18468e25104bSHoward Hinnant typedef ptrdiff_t difference_type; 18478e25104bSHoward Hinnant typedef const _Tp* pointer; 18488e25104bSHoward Hinnant typedef const _Tp* const_pointer; 18498e25104bSHoward Hinnant typedef const _Tp& reference; 18508e25104bSHoward Hinnant typedef const _Tp& const_reference; 185130444adcSHoward Hinnant typedef const _Tp value_type; 18528e25104bSHoward Hinnant 18538e25104bSHoward Hinnant typedef true_type propagate_on_container_move_assignment; 1854f43a42d5SMarshall Clow typedef true_type is_always_equal; 18558e25104bSHoward Hinnant 18568e25104bSHoward Hinnant template <class _Up> struct rebind {typedef allocator<_Up> other;}; 18578e25104bSHoward Hinnant 18588e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY allocator() _NOEXCEPT {} 18598e25104bSHoward Hinnant template <class _Up> _LIBCPP_INLINE_VISIBILITY allocator(const allocator<_Up>&) _NOEXCEPT {} 18608e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY const_pointer address(const_reference __x) const _NOEXCEPT 18618e25104bSHoward Hinnant {return _VSTD::addressof(__x);} 18628e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer allocate(size_type __n, allocator<void>::const_pointer = 0) 18634cec709eSMarshall Clow { 18644cec709eSMarshall Clow if (__n > max_size()) 18650fc8cec7SMarshall Clow __throw_length_error("allocator<const T>::allocate(size_t n)" 18660fc8cec7SMarshall Clow " 'n' exceeds maximum supported size"); 18674cec709eSMarshall Clow return static_cast<pointer>(_VSTD::__allocate(__n * sizeof(_Tp))); 18684cec709eSMarshall Clow } 18698e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY void deallocate(pointer __p, size_type) _NOEXCEPT 1870*cd71f447SEric Fiselier {_VSTD::__libcpp_deallocate((void*)__p);} 18718e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT 18728e25104bSHoward Hinnant {return size_type(~0) / sizeof(_Tp);} 18738e25104bSHoward Hinnant#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 18748e25104bSHoward Hinnant template <class _Up, class... _Args> 18758e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18768e25104bSHoward Hinnant void 18778e25104bSHoward Hinnant construct(_Up* __p, _Args&&... __args) 18788e25104bSHoward Hinnant { 18798e25104bSHoward Hinnant ::new((void*)__p) _Up(_VSTD::forward<_Args>(__args)...); 18808e25104bSHoward Hinnant } 18818e25104bSHoward Hinnant#else // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 18828e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18838e25104bSHoward Hinnant void 18848e25104bSHoward Hinnant construct(pointer __p) 18858e25104bSHoward Hinnant { 18868e25104bSHoward Hinnant ::new((void*)__p) _Tp(); 18878e25104bSHoward Hinnant } 18888e25104bSHoward Hinnant# if defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) 1889bff1bfc6SHoward Hinnant 18908e25104bSHoward Hinnant template <class _A0> 18918e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18928e25104bSHoward Hinnant void 18938e25104bSHoward Hinnant construct(pointer __p, _A0& __a0) 18948e25104bSHoward Hinnant { 18958e25104bSHoward Hinnant ::new((void*)__p) _Tp(__a0); 18968e25104bSHoward Hinnant } 18978e25104bSHoward Hinnant template <class _A0> 18988e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18998e25104bSHoward Hinnant void 19008e25104bSHoward Hinnant construct(pointer __p, const _A0& __a0) 19018e25104bSHoward Hinnant { 19028e25104bSHoward Hinnant ::new((void*)__p) _Tp(__a0); 19038e25104bSHoward Hinnant } 19048e25104bSHoward Hinnant# endif // defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) 19058e25104bSHoward Hinnant template <class _A0, class _A1> 19068e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19078e25104bSHoward Hinnant void 19088e25104bSHoward Hinnant construct(pointer __p, _A0& __a0, _A1& __a1) 19098e25104bSHoward Hinnant { 19108e25104bSHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 19118e25104bSHoward Hinnant } 19128e25104bSHoward Hinnant template <class _A0, class _A1> 19138e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19148e25104bSHoward Hinnant void 19158e25104bSHoward Hinnant construct(pointer __p, const _A0& __a0, _A1& __a1) 19168e25104bSHoward Hinnant { 19178e25104bSHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 19188e25104bSHoward Hinnant } 19198e25104bSHoward Hinnant template <class _A0, class _A1> 19208e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19218e25104bSHoward Hinnant void 19228e25104bSHoward Hinnant construct(pointer __p, _A0& __a0, const _A1& __a1) 19238e25104bSHoward Hinnant { 19248e25104bSHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 19258e25104bSHoward Hinnant } 19268e25104bSHoward Hinnant template <class _A0, class _A1> 19278e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19288e25104bSHoward Hinnant void 19298e25104bSHoward Hinnant construct(pointer __p, const _A0& __a0, const _A1& __a1) 19308e25104bSHoward Hinnant { 19318e25104bSHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 19328e25104bSHoward Hinnant } 19338e25104bSHoward Hinnant#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 19348e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY void destroy(pointer __p) {__p->~_Tp();} 19358e25104bSHoward Hinnant}; 19368e25104bSHoward Hinnant 19373e519524SHoward Hinnanttemplate <class _Tp, class _Up> 19383e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 19393739fe79SHoward Hinnantbool operator==(const allocator<_Tp>&, const allocator<_Up>&) _NOEXCEPT {return true;} 19403e519524SHoward Hinnant 19413e519524SHoward Hinnanttemplate <class _Tp, class _Up> 19423e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 19433739fe79SHoward Hinnantbool operator!=(const allocator<_Tp>&, const allocator<_Up>&) _NOEXCEPT {return false;} 19443e519524SHoward Hinnant 19453e519524SHoward Hinnanttemplate <class _OutputIterator, class _Tp> 1946e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS raw_storage_iterator 19473e519524SHoward Hinnant : public iterator<output_iterator_tag, 19483e519524SHoward Hinnant _Tp, // purposefully not C++03 19493e519524SHoward Hinnant ptrdiff_t, // purposefully not C++03 19503e519524SHoward Hinnant _Tp*, // purposefully not C++03 19513e519524SHoward Hinnant raw_storage_iterator<_OutputIterator, _Tp>&> // purposefully not C++03 19523e519524SHoward Hinnant{ 19533e519524SHoward Hinnantprivate: 19543e519524SHoward Hinnant _OutputIterator __x_; 19553e519524SHoward Hinnantpublic: 19563e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit raw_storage_iterator(_OutputIterator __x) : __x_(__x) {} 19573e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator*() {return *this;} 19583e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator=(const _Tp& __element) 19593e519524SHoward Hinnant {::new(&*__x_) _Tp(__element); return *this;} 19602603b075SMarshall Clow#if _LIBCPP_STD_VER >= 14 19612603b075SMarshall Clow _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator=(_Tp&& __element) 19622603b075SMarshall Clow {::new(&*__x_) _Tp(_VSTD::move(__element)); return *this;} 19632603b075SMarshall Clow#endif 19643e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator++() {++__x_; return *this;} 19653e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY raw_storage_iterator operator++(int) 19663e519524SHoward Hinnant {raw_storage_iterator __t(*this); ++__x_; return __t;} 1967783b372aSMarshall Clow#if _LIBCPP_STD_VER >= 14 1968783b372aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _OutputIterator base() const { return __x_; } 1969783b372aSMarshall Clow#endif 19703e519524SHoward Hinnant}; 19713e519524SHoward Hinnant 19723e519524SHoward Hinnanttemplate <class _Tp> 19733e519524SHoward Hinnantpair<_Tp*, ptrdiff_t> 19743739fe79SHoward Hinnantget_temporary_buffer(ptrdiff_t __n) _NOEXCEPT 19753e519524SHoward Hinnant{ 19763e519524SHoward Hinnant pair<_Tp*, ptrdiff_t> __r(0, 0); 19773e519524SHoward Hinnant const ptrdiff_t __m = (~ptrdiff_t(0) ^ 19783e519524SHoward Hinnant ptrdiff_t(ptrdiff_t(1) << (sizeof(ptrdiff_t) * __CHAR_BIT__ - 1))) 19793e519524SHoward Hinnant / sizeof(_Tp); 19803e519524SHoward Hinnant if (__n > __m) 19813e519524SHoward Hinnant __n = __m; 19823e519524SHoward Hinnant while (__n > 0) 19833e519524SHoward Hinnant { 19843e519524SHoward Hinnant __r.first = static_cast<_Tp*>(::operator new(__n * sizeof(_Tp), nothrow)); 19853e519524SHoward Hinnant if (__r.first) 19863e519524SHoward Hinnant { 19873e519524SHoward Hinnant __r.second = __n; 19883e519524SHoward Hinnant break; 19893e519524SHoward Hinnant } 19903e519524SHoward Hinnant __n /= 2; 19913e519524SHoward Hinnant } 19923e519524SHoward Hinnant return __r; 19933e519524SHoward Hinnant} 19943e519524SHoward Hinnant 19953e519524SHoward Hinnanttemplate <class _Tp> 19963e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 19973739fe79SHoward Hinnantvoid return_temporary_buffer(_Tp* __p) _NOEXCEPT {::operator delete(__p);} 19983e519524SHoward Hinnant 19993e519524SHoward Hinnanttemplate <class _Tp> 20003e519524SHoward Hinnantstruct auto_ptr_ref 20013e519524SHoward Hinnant{ 20023e519524SHoward Hinnant _Tp* __ptr_; 20033e519524SHoward Hinnant}; 20043e519524SHoward Hinnant 20053e519524SHoward Hinnanttemplate<class _Tp> 2006e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS auto_ptr 20073e519524SHoward Hinnant{ 20083e519524SHoward Hinnantprivate: 20093e519524SHoward Hinnant _Tp* __ptr_; 20103e519524SHoward Hinnantpublic: 20113e519524SHoward Hinnant typedef _Tp element_type; 20123e519524SHoward Hinnant 20133e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit auto_ptr(_Tp* __p = 0) throw() : __ptr_(__p) {} 20143e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr& __p) throw() : __ptr_(__p.release()) {} 20153e519524SHoward Hinnant template<class _Up> _LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr<_Up>& __p) throw() 20163e519524SHoward Hinnant : __ptr_(__p.release()) {} 20173e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr& __p) throw() 20183e519524SHoward Hinnant {reset(__p.release()); return *this;} 20193e519524SHoward Hinnant template<class _Up> _LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr<_Up>& __p) throw() 20203e519524SHoward Hinnant {reset(__p.release()); return *this;} 20213e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr_ref<_Tp> __p) throw() 20223e519524SHoward Hinnant {reset(__p.__ptr_); return *this;} 20233e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY ~auto_ptr() throw() {delete __ptr_;} 20243e519524SHoward Hinnant 20253e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Tp& operator*() const throw() 20263e519524SHoward Hinnant {return *__ptr_;} 20273e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Tp* operator->() const throw() {return __ptr_;} 20283e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Tp* get() const throw() {return __ptr_;} 20293e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Tp* release() throw() 20303e519524SHoward Hinnant { 20313e519524SHoward Hinnant _Tp* __t = __ptr_; 20323e519524SHoward Hinnant __ptr_ = 0; 20333e519524SHoward Hinnant return __t; 20343e519524SHoward Hinnant } 20353e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void reset(_Tp* __p = 0) throw() 20363e519524SHoward Hinnant { 20373e519524SHoward Hinnant if (__ptr_ != __p) 20383e519524SHoward Hinnant delete __ptr_; 20393e519524SHoward Hinnant __ptr_ = __p; 20403e519524SHoward Hinnant } 20413e519524SHoward Hinnant 20423e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr_ref<_Tp> __p) throw() : __ptr_(__p.__ptr_) {} 20433e519524SHoward Hinnant template<class _Up> _LIBCPP_INLINE_VISIBILITY operator auto_ptr_ref<_Up>() throw() 20443e519524SHoward Hinnant {auto_ptr_ref<_Up> __t; __t.__ptr_ = release(); return __t;} 20453e519524SHoward Hinnant template<class _Up> _LIBCPP_INLINE_VISIBILITY operator auto_ptr<_Up>() throw() 20463e519524SHoward Hinnant {return auto_ptr<_Up>(release());} 20473e519524SHoward Hinnant}; 20483e519524SHoward Hinnant 20493e519524SHoward Hinnanttemplate <> 2050e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS auto_ptr<void> 20513e519524SHoward Hinnant{ 20523e519524SHoward Hinnantpublic: 20533e519524SHoward Hinnant typedef void element_type; 20543e519524SHoward Hinnant}; 20553e519524SHoward Hinnant 20563e519524SHoward Hinnanttemplate <class _T1, class _T2, bool = is_same<typename remove_cv<_T1>::type, 20573e519524SHoward Hinnant typename remove_cv<_T2>::type>::value, 205842b8bb50SHoward Hinnant bool = is_empty<_T1>::value 2059ee187e24SEric Fiselier && !__libcpp_is_final<_T1>::value, 206042b8bb50SHoward Hinnant bool = is_empty<_T2>::value 2061ee187e24SEric Fiselier && !__libcpp_is_final<_T2>::value 206242b8bb50SHoward Hinnant > 20633e519524SHoward Hinnantstruct __libcpp_compressed_pair_switch; 20643e519524SHoward Hinnant 20653e519524SHoward Hinnanttemplate <class _T1, class _T2, bool IsSame> 20663e519524SHoward Hinnantstruct __libcpp_compressed_pair_switch<_T1, _T2, IsSame, false, false> {enum {value = 0};}; 20673e519524SHoward Hinnant 20683e519524SHoward Hinnanttemplate <class _T1, class _T2, bool IsSame> 20693e519524SHoward Hinnantstruct __libcpp_compressed_pair_switch<_T1, _T2, IsSame, true, false> {enum {value = 1};}; 20703e519524SHoward Hinnant 20713e519524SHoward Hinnanttemplate <class _T1, class _T2, bool IsSame> 20723e519524SHoward Hinnantstruct __libcpp_compressed_pair_switch<_T1, _T2, IsSame, false, true> {enum {value = 2};}; 20733e519524SHoward Hinnant 20743e519524SHoward Hinnanttemplate <class _T1, class _T2> 20753e519524SHoward Hinnantstruct __libcpp_compressed_pair_switch<_T1, _T2, false, true, true> {enum {value = 3};}; 20763e519524SHoward Hinnant 20773e519524SHoward Hinnanttemplate <class _T1, class _T2> 20783e519524SHoward Hinnantstruct __libcpp_compressed_pair_switch<_T1, _T2, true, true, true> {enum {value = 1};}; 20793e519524SHoward Hinnant 20803e519524SHoward Hinnanttemplate <class _T1, class _T2, unsigned = __libcpp_compressed_pair_switch<_T1, _T2>::value> 20813e519524SHoward Hinnantclass __libcpp_compressed_pair_imp; 20823e519524SHoward Hinnant 20833e519524SHoward Hinnanttemplate <class _T1, class _T2> 20843e519524SHoward Hinnantclass __libcpp_compressed_pair_imp<_T1, _T2, 0> 20853e519524SHoward Hinnant{ 20863e519524SHoward Hinnantprivate: 20873e519524SHoward Hinnant _T1 __first_; 20883e519524SHoward Hinnant _T2 __second_; 20893e519524SHoward Hinnantpublic: 20903e519524SHoward Hinnant typedef _T1 _T1_param; 20913e519524SHoward Hinnant typedef _T2 _T2_param; 20923e519524SHoward Hinnant 20933e519524SHoward Hinnant typedef typename remove_reference<_T1>::type& _T1_reference; 20943e519524SHoward Hinnant typedef typename remove_reference<_T2>::type& _T2_reference; 20953e519524SHoward Hinnant 20963e519524SHoward Hinnant typedef const typename remove_reference<_T1>::type& _T1_const_reference; 20973e519524SHoward Hinnant typedef const typename remove_reference<_T2>::type& _T2_const_reference; 20983e519524SHoward Hinnant 209905fc0f25SMarshall Clow _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp() : __first_(), __second_() {} 21008e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T1_param __t1) 210105fc0f25SMarshall Clow : __first_(_VSTD::forward<_T1_param>(__t1)), __second_() {} 21028e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T2_param __t2) 210305fc0f25SMarshall Clow : __first_(), __second_(_VSTD::forward<_T2_param>(__t2)) {} 21043e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(_T1_param __t1, _T2_param __t2) 2105ce48a113SHoward Hinnant : __first_(_VSTD::forward<_T1_param>(__t1)), __second_(_VSTD::forward<_T2_param>(__t2)) {} 21063e519524SHoward Hinnant 2107a87b5e34SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 2108a87b5e34SHoward Hinnant 2109a87b5e34SHoward Hinnant template <class... _Args1, class... _Args2, size_t... _I1, size_t... _I2> 2110a87b5e34SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2111fd838227SEric Fiselier __libcpp_compressed_pair_imp(piecewise_construct_t, 2112a87b5e34SHoward Hinnant tuple<_Args1...> __first_args, 2113a87b5e34SHoward Hinnant tuple<_Args2...> __second_args, 2114a87b5e34SHoward Hinnant __tuple_indices<_I1...>, 2115a87b5e34SHoward Hinnant __tuple_indices<_I2...>) 2116f9af6140SMarshall Clow : __first_(_VSTD::forward<_Args1>(_VSTD::get<_I1>(__first_args))...), 2117f9af6140SMarshall Clow __second_(_VSTD::forward<_Args2>(_VSTD::get<_I2>(__second_args))...) 2118a87b5e34SHoward Hinnant {} 2119a87b5e34SHoward Hinnant 2120a87b5e34SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 2121a87b5e34SHoward Hinnant 21223739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return __first_;} 21233739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return __first_;} 21243e519524SHoward Hinnant 21253739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_reference second() _NOEXCEPT {return __second_;} 21263739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_const_reference second() const _NOEXCEPT {return __second_;} 21273e519524SHoward Hinnant 21283e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void swap(__libcpp_compressed_pair_imp& __x) 21293739fe79SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && 2130afa72ed4SMarshall Clow __is_nothrow_swappable<_T2>::value) 21313e519524SHoward Hinnant { 2132ce48a113SHoward Hinnant using _VSTD::swap; 21333e519524SHoward Hinnant swap(__first_, __x.__first_); 21343e519524SHoward Hinnant swap(__second_, __x.__second_); 21353e519524SHoward Hinnant } 21363e519524SHoward Hinnant}; 21373e519524SHoward Hinnant 21383e519524SHoward Hinnanttemplate <class _T1, class _T2> 21393e519524SHoward Hinnantclass __libcpp_compressed_pair_imp<_T1, _T2, 1> 21403e519524SHoward Hinnant : private _T1 21413e519524SHoward Hinnant{ 21423e519524SHoward Hinnantprivate: 21433e519524SHoward Hinnant _T2 __second_; 21443e519524SHoward Hinnantpublic: 21453e519524SHoward Hinnant typedef _T1 _T1_param; 21463e519524SHoward Hinnant typedef _T2 _T2_param; 21473e519524SHoward Hinnant 21483e519524SHoward Hinnant typedef _T1& _T1_reference; 21493e519524SHoward Hinnant typedef typename remove_reference<_T2>::type& _T2_reference; 21503e519524SHoward Hinnant 21513e519524SHoward Hinnant typedef const _T1& _T1_const_reference; 21523e519524SHoward Hinnant typedef const typename remove_reference<_T2>::type& _T2_const_reference; 21533e519524SHoward Hinnant 215405fc0f25SMarshall Clow _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp() : __second_() {} 21558e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T1_param __t1) 215605fc0f25SMarshall Clow : _T1(_VSTD::forward<_T1_param>(__t1)), __second_() {} 21578e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T2_param __t2) 2158ce48a113SHoward Hinnant : __second_(_VSTD::forward<_T2_param>(__t2)) {} 21593e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(_T1_param __t1, _T2_param __t2) 2160ce48a113SHoward Hinnant : _T1(_VSTD::forward<_T1_param>(__t1)), __second_(_VSTD::forward<_T2_param>(__t2)) {} 21613e519524SHoward Hinnant 2162a87b5e34SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 2163a87b5e34SHoward Hinnant 2164a87b5e34SHoward Hinnant template <class... _Args1, class... _Args2, size_t... _I1, size_t... _I2> 2165a87b5e34SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2166fd838227SEric Fiselier __libcpp_compressed_pair_imp(piecewise_construct_t, 2167a87b5e34SHoward Hinnant tuple<_Args1...> __first_args, 2168a87b5e34SHoward Hinnant tuple<_Args2...> __second_args, 2169a87b5e34SHoward Hinnant __tuple_indices<_I1...>, 2170a87b5e34SHoward Hinnant __tuple_indices<_I2...>) 2171f9af6140SMarshall Clow : _T1(_VSTD::forward<_Args1>(_VSTD::get<_I1>(__first_args))...), 2172f9af6140SMarshall Clow __second_(_VSTD::forward<_Args2>(_VSTD::get<_I2>(__second_args))...) 2173a87b5e34SHoward Hinnant {} 2174a87b5e34SHoward Hinnant 2175a87b5e34SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 2176a87b5e34SHoward Hinnant 21773739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return *this;} 21783739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return *this;} 21793e519524SHoward Hinnant 21803739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_reference second() _NOEXCEPT {return __second_;} 21813739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_const_reference second() const _NOEXCEPT {return __second_;} 21823e519524SHoward Hinnant 21833e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void swap(__libcpp_compressed_pair_imp& __x) 21843739fe79SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && 2185afa72ed4SMarshall Clow __is_nothrow_swappable<_T2>::value) 21863e519524SHoward Hinnant { 2187ce48a113SHoward Hinnant using _VSTD::swap; 21883e519524SHoward Hinnant swap(__second_, __x.__second_); 21893e519524SHoward Hinnant } 21903e519524SHoward Hinnant}; 21913e519524SHoward Hinnant 21923e519524SHoward Hinnanttemplate <class _T1, class _T2> 21933e519524SHoward Hinnantclass __libcpp_compressed_pair_imp<_T1, _T2, 2> 21943e519524SHoward Hinnant : private _T2 21953e519524SHoward Hinnant{ 21963e519524SHoward Hinnantprivate: 21973e519524SHoward Hinnant _T1 __first_; 21983e519524SHoward Hinnantpublic: 21993e519524SHoward Hinnant typedef _T1 _T1_param; 22003e519524SHoward Hinnant typedef _T2 _T2_param; 22013e519524SHoward Hinnant 22023e519524SHoward Hinnant typedef typename remove_reference<_T1>::type& _T1_reference; 22033e519524SHoward Hinnant typedef _T2& _T2_reference; 22043e519524SHoward Hinnant 22053e519524SHoward Hinnant typedef const typename remove_reference<_T1>::type& _T1_const_reference; 22063e519524SHoward Hinnant typedef const _T2& _T2_const_reference; 22073e519524SHoward Hinnant 220805fc0f25SMarshall Clow _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp() : __first_() {} 22093e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T1_param __t1) 2210ce48a113SHoward Hinnant : __first_(_VSTD::forward<_T1_param>(__t1)) {} 22113e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T2_param __t2) 221205fc0f25SMarshall Clow : _T2(_VSTD::forward<_T2_param>(__t2)), __first_() {} 22133e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(_T1_param __t1, _T2_param __t2) 22143739fe79SHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<_T1>::value && 22153739fe79SHoward Hinnant is_nothrow_move_constructible<_T2>::value) 2216ce48a113SHoward Hinnant : _T2(_VSTD::forward<_T2_param>(__t2)), __first_(_VSTD::forward<_T1_param>(__t1)) {} 22173e519524SHoward Hinnant 2218a87b5e34SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 2219a87b5e34SHoward Hinnant 2220a87b5e34SHoward Hinnant template <class... _Args1, class... _Args2, size_t... _I1, size_t... _I2> 2221a87b5e34SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2222fd838227SEric Fiselier __libcpp_compressed_pair_imp(piecewise_construct_t, 2223a87b5e34SHoward Hinnant tuple<_Args1...> __first_args, 2224a87b5e34SHoward Hinnant tuple<_Args2...> __second_args, 2225a87b5e34SHoward Hinnant __tuple_indices<_I1...>, 2226a87b5e34SHoward Hinnant __tuple_indices<_I2...>) 2227f9af6140SMarshall Clow : _T2(_VSTD::forward<_Args2>(_VSTD::get<_I2>(__second_args))...), 2228f9af6140SMarshall Clow __first_(_VSTD::forward<_Args1>(_VSTD::get<_I1>(__first_args))...) 2229a87b5e34SHoward Hinnant 2230a87b5e34SHoward Hinnant {} 2231a87b5e34SHoward Hinnant 2232a87b5e34SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 2233a87b5e34SHoward Hinnant 22343739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return __first_;} 22353739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return __first_;} 22363e519524SHoward Hinnant 22373739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_reference second() _NOEXCEPT {return *this;} 22383739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_const_reference second() const _NOEXCEPT {return *this;} 22393e519524SHoward Hinnant 22403e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void swap(__libcpp_compressed_pair_imp& __x) 22413739fe79SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && 2242afa72ed4SMarshall Clow __is_nothrow_swappable<_T2>::value) 22433e519524SHoward Hinnant { 2244ce48a113SHoward Hinnant using _VSTD::swap; 22453e519524SHoward Hinnant swap(__first_, __x.__first_); 22463e519524SHoward Hinnant } 22473e519524SHoward Hinnant}; 22483e519524SHoward Hinnant 22493e519524SHoward Hinnanttemplate <class _T1, class _T2> 22503e519524SHoward Hinnantclass __libcpp_compressed_pair_imp<_T1, _T2, 3> 22513e519524SHoward Hinnant : private _T1, 22523e519524SHoward Hinnant private _T2 22533e519524SHoward Hinnant{ 22543e519524SHoward Hinnantpublic: 22553e519524SHoward Hinnant typedef _T1 _T1_param; 22563e519524SHoward Hinnant typedef _T2 _T2_param; 22573e519524SHoward Hinnant 22583e519524SHoward Hinnant typedef _T1& _T1_reference; 22593e519524SHoward Hinnant typedef _T2& _T2_reference; 22603e519524SHoward Hinnant 22613e519524SHoward Hinnant typedef const _T1& _T1_const_reference; 22623e519524SHoward Hinnant typedef const _T2& _T2_const_reference; 22633e519524SHoward Hinnant 22643e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp() {} 22653e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T1_param __t1) 2266ce48a113SHoward Hinnant : _T1(_VSTD::forward<_T1_param>(__t1)) {} 22673e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T2_param __t2) 2268ce48a113SHoward Hinnant : _T2(_VSTD::forward<_T2_param>(__t2)) {} 22693e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(_T1_param __t1, _T2_param __t2) 2270ce48a113SHoward Hinnant : _T1(_VSTD::forward<_T1_param>(__t1)), _T2(_VSTD::forward<_T2_param>(__t2)) {} 22713e519524SHoward Hinnant 2272a87b5e34SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 2273a87b5e34SHoward Hinnant 2274a87b5e34SHoward Hinnant template <class... _Args1, class... _Args2, size_t... _I1, size_t... _I2> 2275a87b5e34SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2276fd838227SEric Fiselier __libcpp_compressed_pair_imp(piecewise_construct_t, 2277a87b5e34SHoward Hinnant tuple<_Args1...> __first_args, 2278a87b5e34SHoward Hinnant tuple<_Args2...> __second_args, 2279a87b5e34SHoward Hinnant __tuple_indices<_I1...>, 2280a87b5e34SHoward Hinnant __tuple_indices<_I2...>) 2281f9af6140SMarshall Clow : _T1(_VSTD::forward<_Args1>(_VSTD::get<_I1>(__first_args))...), 2282f9af6140SMarshall Clow _T2(_VSTD::forward<_Args2>(_VSTD::get<_I2>(__second_args))...) 2283a87b5e34SHoward Hinnant {} 2284a87b5e34SHoward Hinnant 2285a87b5e34SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 2286a87b5e34SHoward Hinnant 22873739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return *this;} 22883739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return *this;} 22893e519524SHoward Hinnant 22903739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_reference second() _NOEXCEPT {return *this;} 22913739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_const_reference second() const _NOEXCEPT {return *this;} 22923e519524SHoward Hinnant 2293c206366fSHoward Hinnant _LIBCPP_INLINE_VISIBILITY void swap(__libcpp_compressed_pair_imp&) 22943739fe79SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && 2295afa72ed4SMarshall Clow __is_nothrow_swappable<_T2>::value) 22963e519524SHoward Hinnant { 22973e519524SHoward Hinnant } 22983e519524SHoward Hinnant}; 22993e519524SHoward Hinnant 23003e519524SHoward Hinnanttemplate <class _T1, class _T2> 23013e519524SHoward Hinnantclass __compressed_pair 23023e519524SHoward Hinnant : private __libcpp_compressed_pair_imp<_T1, _T2> 23033e519524SHoward Hinnant{ 23043e519524SHoward Hinnant typedef __libcpp_compressed_pair_imp<_T1, _T2> base; 23053e519524SHoward Hinnantpublic: 23063e519524SHoward Hinnant typedef typename base::_T1_param _T1_param; 23073e519524SHoward Hinnant typedef typename base::_T2_param _T2_param; 23083e519524SHoward Hinnant 23093e519524SHoward Hinnant typedef typename base::_T1_reference _T1_reference; 23103e519524SHoward Hinnant typedef typename base::_T2_reference _T2_reference; 23113e519524SHoward Hinnant 23123e519524SHoward Hinnant typedef typename base::_T1_const_reference _T1_const_reference; 23133e519524SHoward Hinnant typedef typename base::_T2_const_reference _T2_const_reference; 23143e519524SHoward Hinnant 23153e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __compressed_pair() {} 23168e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __compressed_pair(_T1_param __t1) 2317ce48a113SHoward Hinnant : base(_VSTD::forward<_T1_param>(__t1)) {} 23188e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __compressed_pair(_T2_param __t2) 2319ce48a113SHoward Hinnant : base(_VSTD::forward<_T2_param>(__t2)) {} 23203e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __compressed_pair(_T1_param __t1, _T2_param __t2) 2321ce48a113SHoward Hinnant : base(_VSTD::forward<_T1_param>(__t1), _VSTD::forward<_T2_param>(__t2)) {} 23223e519524SHoward Hinnant 2323a87b5e34SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 2324a87b5e34SHoward Hinnant 2325a87b5e34SHoward Hinnant template <class... _Args1, class... _Args2> 2326a87b5e34SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2327a87b5e34SHoward Hinnant __compressed_pair(piecewise_construct_t __pc, tuple<_Args1...> __first_args, 2328a87b5e34SHoward Hinnant tuple<_Args2...> __second_args) 23298e25104bSHoward Hinnant : base(__pc, _VSTD::move(__first_args), _VSTD::move(__second_args), 2330a87b5e34SHoward Hinnant typename __make_tuple_indices<sizeof...(_Args1)>::type(), 2331a87b5e34SHoward Hinnant typename __make_tuple_indices<sizeof...(_Args2) >::type()) 2332a87b5e34SHoward Hinnant {} 2333a87b5e34SHoward Hinnant 2334a87b5e34SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 2335a87b5e34SHoward Hinnant 23363739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return base::first();} 23373739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return base::first();} 23383e519524SHoward Hinnant 23393739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_reference second() _NOEXCEPT {return base::second();} 23403739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_const_reference second() const _NOEXCEPT {return base::second();} 23413e519524SHoward Hinnant 23423739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void swap(__compressed_pair& __x) 23433739fe79SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && 2344afa72ed4SMarshall Clow __is_nothrow_swappable<_T2>::value) 23453739fe79SHoward Hinnant {base::swap(__x);} 23463e519524SHoward Hinnant}; 23473e519524SHoward Hinnant 23483e519524SHoward Hinnanttemplate <class _T1, class _T2> 23493e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 23503e519524SHoward Hinnantvoid 23513e519524SHoward Hinnantswap(__compressed_pair<_T1, _T2>& __x, __compressed_pair<_T1, _T2>& __y) 23523739fe79SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && 2353afa72ed4SMarshall Clow __is_nothrow_swappable<_T2>::value) 23543e519524SHoward Hinnant {__x.swap(__y);} 23553e519524SHoward Hinnant 23568e25104bSHoward Hinnant// __same_or_less_cv_qualified 23578e25104bSHoward Hinnant 23588e25104bSHoward Hinnanttemplate <class _Ptr1, class _Ptr2, 23598e25104bSHoward Hinnant bool = is_same<typename remove_cv<typename pointer_traits<_Ptr1>::element_type>::type, 23608e25104bSHoward Hinnant typename remove_cv<typename pointer_traits<_Ptr2>::element_type>::type 23618e25104bSHoward Hinnant >::value 23628e25104bSHoward Hinnant > 23638e25104bSHoward Hinnantstruct __same_or_less_cv_qualified_imp 23648e25104bSHoward Hinnant : is_convertible<_Ptr1, _Ptr2> {}; 23658e25104bSHoward Hinnant 23668e25104bSHoward Hinnanttemplate <class _Ptr1, class _Ptr2> 23678e25104bSHoward Hinnantstruct __same_or_less_cv_qualified_imp<_Ptr1, _Ptr2, false> 23688e25104bSHoward Hinnant : false_type {}; 23698e25104bSHoward Hinnant 237085d3e7a7SMarshall Clowtemplate <class _Ptr1, class _Ptr2, bool = is_pointer<_Ptr1>::value || 237185d3e7a7SMarshall Clow is_same<_Ptr1, _Ptr2>::value || 237285d3e7a7SMarshall Clow __has_element_type<_Ptr1>::value> 23738e25104bSHoward Hinnantstruct __same_or_less_cv_qualified 23748e25104bSHoward Hinnant : __same_or_less_cv_qualified_imp<_Ptr1, _Ptr2> {}; 23758e25104bSHoward Hinnant 23768e25104bSHoward Hinnanttemplate <class _Ptr1, class _Ptr2> 237785d3e7a7SMarshall Clowstruct __same_or_less_cv_qualified<_Ptr1, _Ptr2, false> 23788e25104bSHoward Hinnant : false_type {}; 23798e25104bSHoward Hinnant 23808e25104bSHoward Hinnant// default_delete 23818e25104bSHoward Hinnant 23823e519524SHoward Hinnanttemplate <class _Tp> 2383e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS default_delete 23843e519524SHoward Hinnant{ 2385f9980200SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 2386c0937e8aSHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR default_delete() _NOEXCEPT = default; 2387c0937e8aSHoward Hinnant#else 2388c0937e8aSHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR default_delete() _NOEXCEPT {} 2389c0937e8aSHoward Hinnant#endif 23903e519524SHoward Hinnant template <class _Up> 23913e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY default_delete(const default_delete<_Up>&, 23923739fe79SHoward Hinnant typename enable_if<is_convertible<_Up*, _Tp*>::value>::type* = 0) _NOEXCEPT {} 23933739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void operator() (_Tp* __ptr) const _NOEXCEPT 23943e519524SHoward Hinnant { 23953e519524SHoward Hinnant static_assert(sizeof(_Tp) > 0, "default_delete can not delete incomplete type"); 239603ec04f9SHoward Hinnant static_assert(!is_void<_Tp>::value, "default_delete can not delete incomplete type"); 23973e519524SHoward Hinnant delete __ptr; 23983e519524SHoward Hinnant } 23993e519524SHoward Hinnant}; 24003e519524SHoward Hinnant 24013e519524SHoward Hinnanttemplate <class _Tp> 2402e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS default_delete<_Tp[]> 24033e519524SHoward Hinnant{ 2404e4097ad7SHoward Hinnantpublic: 2405f9980200SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 2406c0937e8aSHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR default_delete() _NOEXCEPT = default; 2407c0937e8aSHoward Hinnant#else 2408c0937e8aSHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR default_delete() _NOEXCEPT {} 2409c0937e8aSHoward Hinnant#endif 2410e4097ad7SHoward Hinnant template <class _Up> 2411e4097ad7SHoward Hinnant _LIBCPP_INLINE_VISIBILITY default_delete(const default_delete<_Up[]>&, 24128e25104bSHoward Hinnant typename enable_if<__same_or_less_cv_qualified<_Up*, _Tp*>::value>::type* = 0) _NOEXCEPT {} 2413e4097ad7SHoward Hinnant template <class _Up> 2414e4097ad7SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2415e4097ad7SHoward Hinnant void operator() (_Up* __ptr, 24168e25104bSHoward Hinnant typename enable_if<__same_or_less_cv_qualified<_Up*, _Tp*>::value>::type* = 0) const _NOEXCEPT 24173e519524SHoward Hinnant { 24183e519524SHoward Hinnant static_assert(sizeof(_Tp) > 0, "default_delete can not delete incomplete type"); 2419026b8056SMarshall Clow static_assert(!is_void<_Tp>::value, "default_delete can not delete void type"); 24203e519524SHoward Hinnant delete [] __ptr; 24213e519524SHoward Hinnant } 24223e519524SHoward Hinnant}; 24233e519524SHoward Hinnant 24243e519524SHoward Hinnanttemplate <class _Tp, class _Dp = default_delete<_Tp> > 2425e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS unique_ptr 24263e519524SHoward Hinnant{ 24273e519524SHoward Hinnantpublic: 24283e519524SHoward Hinnant typedef _Tp element_type; 24293e519524SHoward Hinnant typedef _Dp deleter_type; 24303e519524SHoward Hinnant typedef typename __pointer_type<_Tp, deleter_type>::type pointer; 24313e519524SHoward Hinnantprivate: 24323e519524SHoward Hinnant __compressed_pair<pointer, deleter_type> __ptr_; 24333e519524SHoward Hinnant 24348e25104bSHoward Hinnant#ifdef _LIBCPP_HAS_NO_RVALUE_REFERENCES 24353e519524SHoward Hinnant unique_ptr(unique_ptr&); 24363e519524SHoward Hinnant template <class _Up, class _Ep> 24373e519524SHoward Hinnant unique_ptr(unique_ptr<_Up, _Ep>&); 24383e519524SHoward Hinnant unique_ptr& operator=(unique_ptr&); 24393e519524SHoward Hinnant template <class _Up, class _Ep> 24403e519524SHoward Hinnant unique_ptr& operator=(unique_ptr<_Up, _Ep>&); 24417609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 24423e519524SHoward Hinnant 24433e519524SHoward Hinnant struct __nat {int __for_bool_;}; 24443e519524SHoward Hinnant 24453e519524SHoward Hinnant typedef typename remove_reference<deleter_type>::type& _Dp_reference; 24463e519524SHoward Hinnant typedef const typename remove_reference<deleter_type>::type& _Dp_const_reference; 24473e519524SHoward Hinnantpublic: 2448c0937e8aSHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR unique_ptr() _NOEXCEPT 24493e519524SHoward Hinnant : __ptr_(pointer()) 24503e519524SHoward Hinnant { 24513e519524SHoward Hinnant static_assert(!is_pointer<deleter_type>::value, 24523e519524SHoward Hinnant "unique_ptr constructed with null function pointer deleter"); 24533e519524SHoward Hinnant } 2454c0937e8aSHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR unique_ptr(nullptr_t) _NOEXCEPT 24553e519524SHoward Hinnant : __ptr_(pointer()) 24563e519524SHoward Hinnant { 24573e519524SHoward Hinnant static_assert(!is_pointer<deleter_type>::value, 24583e519524SHoward Hinnant "unique_ptr constructed with null function pointer deleter"); 24593e519524SHoward Hinnant } 24603739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit unique_ptr(pointer __p) _NOEXCEPT 2461ce48a113SHoward Hinnant : __ptr_(_VSTD::move(__p)) 24623e519524SHoward Hinnant { 24633e519524SHoward Hinnant static_assert(!is_pointer<deleter_type>::value, 24643e519524SHoward Hinnant "unique_ptr constructed with null function pointer deleter"); 24653e519524SHoward Hinnant } 24663e519524SHoward Hinnant 24677609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 24683e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(pointer __p, typename conditional< 24693e519524SHoward Hinnant is_reference<deleter_type>::value, 24703e519524SHoward Hinnant deleter_type, 24713e519524SHoward Hinnant typename add_lvalue_reference<const deleter_type>::type>::type __d) 24723739fe79SHoward Hinnant _NOEXCEPT 24733e519524SHoward Hinnant : __ptr_(__p, __d) {} 24743e519524SHoward Hinnant 24753e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(pointer __p, typename remove_reference<deleter_type>::type&& __d) 24763739fe79SHoward Hinnant _NOEXCEPT 2477ce48a113SHoward Hinnant : __ptr_(__p, _VSTD::move(__d)) 24783e519524SHoward Hinnant { 24793e519524SHoward Hinnant static_assert(!is_reference<deleter_type>::value, "rvalue deleter bound to reference"); 24803e519524SHoward Hinnant } 24813739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(unique_ptr&& __u) _NOEXCEPT 2482ce48a113SHoward Hinnant : __ptr_(__u.release(), _VSTD::forward<deleter_type>(__u.get_deleter())) {} 24833e519524SHoward Hinnant template <class _Up, class _Ep> 24843e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 24853e519524SHoward Hinnant unique_ptr(unique_ptr<_Up, _Ep>&& __u, 24863e519524SHoward Hinnant typename enable_if 24873e519524SHoward Hinnant < 24883e519524SHoward Hinnant !is_array<_Up>::value && 24893e519524SHoward Hinnant is_convertible<typename unique_ptr<_Up, _Ep>::pointer, pointer>::value && 24903e519524SHoward Hinnant is_convertible<_Ep, deleter_type>::value && 24913e519524SHoward Hinnant ( 24923e519524SHoward Hinnant !is_reference<deleter_type>::value || 24933e519524SHoward Hinnant is_same<deleter_type, _Ep>::value 24943e519524SHoward Hinnant ), 24953e519524SHoward Hinnant __nat 24963739fe79SHoward Hinnant >::type = __nat()) _NOEXCEPT 2497ce48a113SHoward Hinnant : __ptr_(__u.release(), _VSTD::forward<_Ep>(__u.get_deleter())) {} 24983e519524SHoward Hinnant 24993e519524SHoward Hinnant template <class _Up> 25003e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(auto_ptr<_Up>&& __p, 25013e519524SHoward Hinnant typename enable_if< 25023e519524SHoward Hinnant is_convertible<_Up*, _Tp*>::value && 25033e519524SHoward Hinnant is_same<_Dp, default_delete<_Tp> >::value, 25043e519524SHoward Hinnant __nat 25053739fe79SHoward Hinnant >::type = __nat()) _NOEXCEPT 25063e519524SHoward Hinnant : __ptr_(__p.release()) 25073e519524SHoward Hinnant { 25083e519524SHoward Hinnant } 25093e519524SHoward Hinnant 25103739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(unique_ptr&& __u) _NOEXCEPT 25113e519524SHoward Hinnant { 25123e519524SHoward Hinnant reset(__u.release()); 2513ce48a113SHoward Hinnant __ptr_.second() = _VSTD::forward<deleter_type>(__u.get_deleter()); 25143e519524SHoward Hinnant return *this; 25153e519524SHoward Hinnant } 25163e519524SHoward Hinnant 25173e519524SHoward Hinnant template <class _Up, class _Ep> 25183e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 25193e519524SHoward Hinnant typename enable_if 25203e519524SHoward Hinnant < 25218e25104bSHoward Hinnant !is_array<_Up>::value && 25228e25104bSHoward Hinnant is_convertible<typename unique_ptr<_Up, _Ep>::pointer, pointer>::value && 25238e25104bSHoward Hinnant is_assignable<deleter_type&, _Ep&&>::value, 25243e519524SHoward Hinnant unique_ptr& 25253e519524SHoward Hinnant >::type 25263739fe79SHoward Hinnant operator=(unique_ptr<_Up, _Ep>&& __u) _NOEXCEPT 25273e519524SHoward Hinnant { 25283e519524SHoward Hinnant reset(__u.release()); 2529ce48a113SHoward Hinnant __ptr_.second() = _VSTD::forward<_Ep>(__u.get_deleter()); 25303e519524SHoward Hinnant return *this; 25313e519524SHoward Hinnant } 25327609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 25333e519524SHoward Hinnant 25343e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY operator __rv<unique_ptr>() 25353e519524SHoward Hinnant { 25363e519524SHoward Hinnant return __rv<unique_ptr>(*this); 25373e519524SHoward Hinnant } 25383e519524SHoward Hinnant 25393e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(__rv<unique_ptr> __u) 2540ce48a113SHoward Hinnant : __ptr_(__u->release(), _VSTD::forward<deleter_type>(__u->get_deleter())) {} 25413e519524SHoward Hinnant 25423e519524SHoward Hinnant template <class _Up, class _Ep> 2543d48306e7SEric Fiselier _LIBCPP_INLINE_VISIBILITY 2544d48306e7SEric Fiselier typename enable_if< 2545d48306e7SEric Fiselier !is_array<_Up>::value && 2546d48306e7SEric Fiselier is_convertible<typename unique_ptr<_Up, _Ep>::pointer, pointer>::value && 2547d48306e7SEric Fiselier is_assignable<deleter_type&, _Ep&>::value, 2548d48306e7SEric Fiselier unique_ptr& 2549d48306e7SEric Fiselier >::type 2550d48306e7SEric Fiselier operator=(unique_ptr<_Up, _Ep> __u) 25513e519524SHoward Hinnant { 25523e519524SHoward Hinnant reset(__u.release()); 2553d48306e7SEric Fiselier __ptr_.second() = _VSTD::forward<_Ep>(__u.get_deleter()); 25543e519524SHoward Hinnant return *this; 25553e519524SHoward Hinnant } 25563e519524SHoward Hinnant 25573e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(pointer __p, deleter_type __d) 2558ce48a113SHoward Hinnant : __ptr_(_VSTD::move(__p), _VSTD::move(__d)) {} 25593e519524SHoward Hinnant 25603e519524SHoward Hinnant template <class _Up> 25613e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 25623e519524SHoward Hinnant typename enable_if< 25633e519524SHoward Hinnant is_convertible<_Up*, _Tp*>::value && 25643e519524SHoward Hinnant is_same<_Dp, default_delete<_Tp> >::value, 25653e519524SHoward Hinnant unique_ptr& 25663e519524SHoward Hinnant >::type 25673e519524SHoward Hinnant operator=(auto_ptr<_Up> __p) 25683e519524SHoward Hinnant {reset(__p.release()); return *this;} 25693e519524SHoward Hinnant 25707609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 25713e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY ~unique_ptr() {reset();} 25723e519524SHoward Hinnant 25733739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(nullptr_t) _NOEXCEPT 25743e519524SHoward Hinnant { 25753e519524SHoward Hinnant reset(); 25763e519524SHoward Hinnant return *this; 25773e519524SHoward Hinnant } 25783e519524SHoward Hinnant 25793e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY typename add_lvalue_reference<_Tp>::type operator*() const 25803e519524SHoward Hinnant {return *__ptr_.first();} 25813739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer operator->() const _NOEXCEPT {return __ptr_.first();} 25823739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer get() const _NOEXCEPT {return __ptr_.first();} 25833739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Dp_reference get_deleter() _NOEXCEPT 25843739fe79SHoward Hinnant {return __ptr_.second();} 25853739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Dp_const_reference get_deleter() const _NOEXCEPT 25863739fe79SHoward Hinnant {return __ptr_.second();} 2587f2f2d8b9SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2588f2f2d8b9SHoward Hinnant _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT 2589f2f2d8b9SHoward Hinnant {return __ptr_.first() != nullptr;} 25903e519524SHoward Hinnant 25913739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer release() _NOEXCEPT 25923e519524SHoward Hinnant { 25933e519524SHoward Hinnant pointer __t = __ptr_.first(); 25943e519524SHoward Hinnant __ptr_.first() = pointer(); 25953e519524SHoward Hinnant return __t; 25963e519524SHoward Hinnant } 25973e519524SHoward Hinnant 25983739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void reset(pointer __p = pointer()) _NOEXCEPT 25993e519524SHoward Hinnant { 26003e519524SHoward Hinnant pointer __tmp = __ptr_.first(); 26013e519524SHoward Hinnant __ptr_.first() = __p; 26023e519524SHoward Hinnant if (__tmp) 26033e519524SHoward Hinnant __ptr_.second()(__tmp); 26043e519524SHoward Hinnant } 26053e519524SHoward Hinnant 26063739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void swap(unique_ptr& __u) _NOEXCEPT 26073739fe79SHoward Hinnant {__ptr_.swap(__u.__ptr_);} 26083e519524SHoward Hinnant}; 26093e519524SHoward Hinnant 26103e519524SHoward Hinnanttemplate <class _Tp, class _Dp> 2611e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS unique_ptr<_Tp[], _Dp> 26123e519524SHoward Hinnant{ 26133e519524SHoward Hinnantpublic: 26143e519524SHoward Hinnant typedef _Tp element_type; 26153e519524SHoward Hinnant typedef _Dp deleter_type; 26163e519524SHoward Hinnant typedef typename __pointer_type<_Tp, deleter_type>::type pointer; 26173e519524SHoward Hinnantprivate: 26183e519524SHoward Hinnant __compressed_pair<pointer, deleter_type> __ptr_; 26193e519524SHoward Hinnant 26208e25104bSHoward Hinnant#ifdef _LIBCPP_HAS_NO_RVALUE_REFERENCES 26213e519524SHoward Hinnant unique_ptr(unique_ptr&); 26223e519524SHoward Hinnant template <class _Up> 26233e519524SHoward Hinnant unique_ptr(unique_ptr<_Up>&); 26243e519524SHoward Hinnant unique_ptr& operator=(unique_ptr&); 26253e519524SHoward Hinnant template <class _Up> 26263e519524SHoward Hinnant unique_ptr& operator=(unique_ptr<_Up>&); 26277609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 26283e519524SHoward Hinnant 26293e519524SHoward Hinnant struct __nat {int __for_bool_;}; 26303e519524SHoward Hinnant 26313e519524SHoward Hinnant typedef typename remove_reference<deleter_type>::type& _Dp_reference; 26323e519524SHoward Hinnant typedef const typename remove_reference<deleter_type>::type& _Dp_const_reference; 26333e519524SHoward Hinnantpublic: 2634c0937e8aSHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR unique_ptr() _NOEXCEPT 26353e519524SHoward Hinnant : __ptr_(pointer()) 26363e519524SHoward Hinnant { 26373e519524SHoward Hinnant static_assert(!is_pointer<deleter_type>::value, 26383e519524SHoward Hinnant "unique_ptr constructed with null function pointer deleter"); 26393e519524SHoward Hinnant } 2640c0937e8aSHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR unique_ptr(nullptr_t) _NOEXCEPT 26413e519524SHoward Hinnant : __ptr_(pointer()) 26423e519524SHoward Hinnant { 26433e519524SHoward Hinnant static_assert(!is_pointer<deleter_type>::value, 26443e519524SHoward Hinnant "unique_ptr constructed with null function pointer deleter"); 26453e519524SHoward Hinnant } 26467609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 264722747e62SLogan Chien template <class _Pp> 264822747e62SLogan Chien _LIBCPP_INLINE_VISIBILITY explicit unique_ptr(_Pp __p, 264922747e62SLogan Chien typename enable_if<__same_or_less_cv_qualified<_Pp, pointer>::value, __nat>::type = __nat()) _NOEXCEPT 26503e519524SHoward Hinnant : __ptr_(__p) 26513e519524SHoward Hinnant { 26523e519524SHoward Hinnant static_assert(!is_pointer<deleter_type>::value, 26533e519524SHoward Hinnant "unique_ptr constructed with null function pointer deleter"); 26543e519524SHoward Hinnant } 26553e519524SHoward Hinnant 265622747e62SLogan Chien template <class _Pp> 2657c003db1fSHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(_Pp __p, typename conditional< 26583e519524SHoward Hinnant is_reference<deleter_type>::value, 26593e519524SHoward Hinnant deleter_type, 266022747e62SLogan Chien typename add_lvalue_reference<const deleter_type>::type>::type __d, 266122747e62SLogan Chien typename enable_if<__same_or_less_cv_qualified<_Pp, pointer>::value, __nat>::type = __nat()) 26623739fe79SHoward Hinnant _NOEXCEPT 26633e519524SHoward Hinnant : __ptr_(__p, __d) {} 26643e519524SHoward Hinnant 26653e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(nullptr_t, typename conditional< 26663e519524SHoward Hinnant is_reference<deleter_type>::value, 26673e519524SHoward Hinnant deleter_type, 26683e519524SHoward Hinnant typename add_lvalue_reference<const deleter_type>::type>::type __d) 26693739fe79SHoward Hinnant _NOEXCEPT 26703e519524SHoward Hinnant : __ptr_(pointer(), __d) {} 26713e519524SHoward Hinnant 267222747e62SLogan Chien template <class _Pp> 267322747e62SLogan Chien _LIBCPP_INLINE_VISIBILITY unique_ptr(_Pp __p, 267422747e62SLogan Chien typename remove_reference<deleter_type>::type&& __d, 267522747e62SLogan Chien typename enable_if<__same_or_less_cv_qualified<_Pp, pointer>::value, __nat>::type = __nat()) 26763739fe79SHoward Hinnant _NOEXCEPT 2677ce48a113SHoward Hinnant : __ptr_(__p, _VSTD::move(__d)) 26783e519524SHoward Hinnant { 26793e519524SHoward Hinnant static_assert(!is_reference<deleter_type>::value, "rvalue deleter bound to reference"); 26803e519524SHoward Hinnant } 26813e519524SHoward Hinnant 26823e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(nullptr_t, typename remove_reference<deleter_type>::type&& __d) 26833739fe79SHoward Hinnant _NOEXCEPT 2684ce48a113SHoward Hinnant : __ptr_(pointer(), _VSTD::move(__d)) 26853e519524SHoward Hinnant { 26863e519524SHoward Hinnant static_assert(!is_reference<deleter_type>::value, "rvalue deleter bound to reference"); 26873e519524SHoward Hinnant } 26883e519524SHoward Hinnant 26893739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(unique_ptr&& __u) _NOEXCEPT 2690ce48a113SHoward Hinnant : __ptr_(__u.release(), _VSTD::forward<deleter_type>(__u.get_deleter())) {} 26913e519524SHoward Hinnant 26923739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(unique_ptr&& __u) _NOEXCEPT 26933e519524SHoward Hinnant { 26943e519524SHoward Hinnant reset(__u.release()); 2695ce48a113SHoward Hinnant __ptr_.second() = _VSTD::forward<deleter_type>(__u.get_deleter()); 26963e519524SHoward Hinnant return *this; 26973e519524SHoward Hinnant } 2698e4097ad7SHoward Hinnant 2699e4097ad7SHoward Hinnant template <class _Up, class _Ep> 2700e4097ad7SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2701e4097ad7SHoward Hinnant unique_ptr(unique_ptr<_Up, _Ep>&& __u, 2702e4097ad7SHoward Hinnant typename enable_if 2703e4097ad7SHoward Hinnant < 2704e4097ad7SHoward Hinnant is_array<_Up>::value && 27058e25104bSHoward Hinnant __same_or_less_cv_qualified<typename unique_ptr<_Up, _Ep>::pointer, pointer>::value 2706e4097ad7SHoward Hinnant && is_convertible<_Ep, deleter_type>::value && 2707e4097ad7SHoward Hinnant ( 2708e4097ad7SHoward Hinnant !is_reference<deleter_type>::value || 2709e4097ad7SHoward Hinnant is_same<deleter_type, _Ep>::value 2710e4097ad7SHoward Hinnant ), 2711e4097ad7SHoward Hinnant __nat 2712e4097ad7SHoward Hinnant >::type = __nat() 2713e4097ad7SHoward Hinnant ) _NOEXCEPT 2714e4097ad7SHoward Hinnant : __ptr_(__u.release(), _VSTD::forward<deleter_type>(__u.get_deleter())) {} 2715e4097ad7SHoward Hinnant 2716e4097ad7SHoward Hinnant 2717e4097ad7SHoward Hinnant template <class _Up, class _Ep> 2718e4097ad7SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2719e4097ad7SHoward Hinnant typename enable_if 2720e4097ad7SHoward Hinnant < 2721e4097ad7SHoward Hinnant is_array<_Up>::value && 27228e25104bSHoward Hinnant __same_or_less_cv_qualified<typename unique_ptr<_Up, _Ep>::pointer, pointer>::value && 27238e25104bSHoward Hinnant is_assignable<deleter_type&, _Ep&&>::value, 2724e4097ad7SHoward Hinnant unique_ptr& 2725e4097ad7SHoward Hinnant >::type 2726e4097ad7SHoward Hinnant operator=(unique_ptr<_Up, _Ep>&& __u) _NOEXCEPT 2727e4097ad7SHoward Hinnant { 2728e4097ad7SHoward Hinnant reset(__u.release()); 2729e4097ad7SHoward Hinnant __ptr_.second() = _VSTD::forward<_Ep>(__u.get_deleter()); 2730e4097ad7SHoward Hinnant return *this; 2731e4097ad7SHoward Hinnant } 27327609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 27333e519524SHoward Hinnant 27343e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit unique_ptr(pointer __p) 27353e519524SHoward Hinnant : __ptr_(__p) 27363e519524SHoward Hinnant { 27373e519524SHoward Hinnant static_assert(!is_pointer<deleter_type>::value, 27383e519524SHoward Hinnant "unique_ptr constructed with null function pointer deleter"); 27393e519524SHoward Hinnant } 27403e519524SHoward Hinnant 27413e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(pointer __p, deleter_type __d) 2742ce48a113SHoward Hinnant : __ptr_(__p, _VSTD::forward<deleter_type>(__d)) {} 27433e519524SHoward Hinnant 27443e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(nullptr_t, deleter_type __d) 2745ce48a113SHoward Hinnant : __ptr_(pointer(), _VSTD::forward<deleter_type>(__d)) {} 27463e519524SHoward Hinnant 27473e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY operator __rv<unique_ptr>() 27483e519524SHoward Hinnant { 27493e519524SHoward Hinnant return __rv<unique_ptr>(*this); 27503e519524SHoward Hinnant } 27513e519524SHoward Hinnant 27523e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(__rv<unique_ptr> __u) 2753ce48a113SHoward Hinnant : __ptr_(__u->release(), _VSTD::forward<deleter_type>(__u->get_deleter())) {} 27543e519524SHoward Hinnant 27553e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(__rv<unique_ptr> __u) 27563e519524SHoward Hinnant { 27573e519524SHoward Hinnant reset(__u->release()); 2758ce48a113SHoward Hinnant __ptr_.second() = _VSTD::forward<deleter_type>(__u->get_deleter()); 27593e519524SHoward Hinnant return *this; 27603e519524SHoward Hinnant } 27613e519524SHoward Hinnant 27627609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 27633e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY ~unique_ptr() {reset();} 27643e519524SHoward Hinnant 27653739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(nullptr_t) _NOEXCEPT 27663e519524SHoward Hinnant { 27673e519524SHoward Hinnant reset(); 27683e519524SHoward Hinnant return *this; 27693e519524SHoward Hinnant } 27703e519524SHoward Hinnant 27713e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY typename add_lvalue_reference<_Tp>::type operator[](size_t __i) const 27723e519524SHoward Hinnant {return __ptr_.first()[__i];} 27733739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer get() const _NOEXCEPT {return __ptr_.first();} 27743739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Dp_reference get_deleter() _NOEXCEPT 27753739fe79SHoward Hinnant {return __ptr_.second();} 27763739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Dp_const_reference get_deleter() const _NOEXCEPT 27773739fe79SHoward Hinnant {return __ptr_.second();} 2778f2f2d8b9SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2779f2f2d8b9SHoward Hinnant _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT 2780f2f2d8b9SHoward Hinnant {return __ptr_.first() != nullptr;} 27813e519524SHoward Hinnant 27823739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer release() _NOEXCEPT 27833e519524SHoward Hinnant { 27843e519524SHoward Hinnant pointer __t = __ptr_.first(); 27853e519524SHoward Hinnant __ptr_.first() = pointer(); 27863e519524SHoward Hinnant return __t; 27873e519524SHoward Hinnant } 27883e519524SHoward Hinnant 278922747e62SLogan Chien template <class _Pp> 279022747e62SLogan Chien _LIBCPP_INLINE_VISIBILITY 279122747e62SLogan Chien typename enable_if<__same_or_less_cv_qualified<_Pp, pointer>::value, void>::type 279222747e62SLogan Chien reset(_Pp __p) _NOEXCEPT 27933e519524SHoward Hinnant { 27943e519524SHoward Hinnant pointer __tmp = __ptr_.first(); 27953e519524SHoward Hinnant __ptr_.first() = __p; 27963e519524SHoward Hinnant if (__tmp) 27973e519524SHoward Hinnant __ptr_.second()(__tmp); 27983e519524SHoward Hinnant } 2799026b8056SMarshall Clow _LIBCPP_INLINE_VISIBILITY void reset(nullptr_t = nullptr) _NOEXCEPT 28003e519524SHoward Hinnant { 28013e519524SHoward Hinnant pointer __tmp = __ptr_.first(); 28023e519524SHoward Hinnant __ptr_.first() = nullptr; 28033e519524SHoward Hinnant if (__tmp) 28043e519524SHoward Hinnant __ptr_.second()(__tmp); 28053e519524SHoward Hinnant } 28063e519524SHoward Hinnant 28073e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void swap(unique_ptr& __u) {__ptr_.swap(__u.__ptr_);} 28083e519524SHoward Hinnantprivate: 28093e519524SHoward Hinnant 28107609c9b6SHoward Hinnant#ifdef _LIBCPP_HAS_NO_RVALUE_REFERENCES 28113e519524SHoward Hinnant template <class _Up> 28123e519524SHoward Hinnant explicit unique_ptr(_Up); 28133e519524SHoward Hinnant template <class _Up> 28143e519524SHoward Hinnant unique_ptr(_Up __u, 28153e519524SHoward Hinnant typename conditional< 28163e519524SHoward Hinnant is_reference<deleter_type>::value, 28173e519524SHoward Hinnant deleter_type, 28183e519524SHoward Hinnant typename add_lvalue_reference<const deleter_type>::type>::type, 28193e519524SHoward Hinnant typename enable_if 28203e519524SHoward Hinnant < 28213e519524SHoward Hinnant is_convertible<_Up, pointer>::value, 28223e519524SHoward Hinnant __nat 28233e519524SHoward Hinnant >::type = __nat()); 28247609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 28253e519524SHoward Hinnant}; 28263e519524SHoward Hinnant 28273e519524SHoward Hinnanttemplate <class _Tp, class _Dp> 28283e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 2829f07dd8d0SEric Fiseliertypename enable_if< 2830f07dd8d0SEric Fiselier __is_swappable<_Dp>::value, 28313e519524SHoward Hinnant void 2832f07dd8d0SEric Fiselier>::type 28333739fe79SHoward Hinnantswap(unique_ptr<_Tp, _Dp>& __x, unique_ptr<_Tp, _Dp>& __y) _NOEXCEPT {__x.swap(__y);} 28343e519524SHoward Hinnant 28353e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 28363e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 28373e519524SHoward Hinnantbool 28383e519524SHoward Hinnantoperator==(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return __x.get() == __y.get();} 28393e519524SHoward Hinnant 28403e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 28413e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 28423e519524SHoward Hinnantbool 28433e519524SHoward Hinnantoperator!=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__x == __y);} 28443e519524SHoward Hinnant 28453e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 28463e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 28473e519524SHoward Hinnantbool 284867f39647SHoward Hinnantoperator< (const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) 284967f39647SHoward Hinnant{ 285067f39647SHoward Hinnant typedef typename unique_ptr<_T1, _D1>::pointer _P1; 285167f39647SHoward Hinnant typedef typename unique_ptr<_T2, _D2>::pointer _P2; 28526fe361c1SEric Fiselier typedef typename common_type<_P1, _P2>::type _Vp; 28536fe361c1SEric Fiselier return less<_Vp>()(__x.get(), __y.get()); 285467f39647SHoward Hinnant} 28553e519524SHoward Hinnant 28563e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 28573e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 28583e519524SHoward Hinnantbool 28593e519524SHoward Hinnantoperator> (const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return __y < __x;} 28603e519524SHoward Hinnant 28613e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 28623e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 28633e519524SHoward Hinnantbool 28643e519524SHoward Hinnantoperator<=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__y < __x);} 28653e519524SHoward Hinnant 28663e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 28673e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 28683e519524SHoward Hinnantbool 28693e519524SHoward Hinnantoperator>=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__x < __y);} 28703e519524SHoward Hinnant 287167f39647SHoward Hinnanttemplate <class _T1, class _D1> 287267f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 287367f39647SHoward Hinnantbool 2874c0937e8aSHoward Hinnantoperator==(const unique_ptr<_T1, _D1>& __x, nullptr_t) _NOEXCEPT 287567f39647SHoward Hinnant{ 287667f39647SHoward Hinnant return !__x; 287767f39647SHoward Hinnant} 287867f39647SHoward Hinnant 287967f39647SHoward Hinnanttemplate <class _T1, class _D1> 288067f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 288167f39647SHoward Hinnantbool 2882c0937e8aSHoward Hinnantoperator==(nullptr_t, const unique_ptr<_T1, _D1>& __x) _NOEXCEPT 288367f39647SHoward Hinnant{ 288467f39647SHoward Hinnant return !__x; 288567f39647SHoward Hinnant} 288667f39647SHoward Hinnant 288767f39647SHoward Hinnanttemplate <class _T1, class _D1> 288867f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 288967f39647SHoward Hinnantbool 2890c0937e8aSHoward Hinnantoperator!=(const unique_ptr<_T1, _D1>& __x, nullptr_t) _NOEXCEPT 289167f39647SHoward Hinnant{ 289267f39647SHoward Hinnant return static_cast<bool>(__x); 289367f39647SHoward Hinnant} 289467f39647SHoward Hinnant 289567f39647SHoward Hinnanttemplate <class _T1, class _D1> 289667f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 289767f39647SHoward Hinnantbool 2898c0937e8aSHoward Hinnantoperator!=(nullptr_t, const unique_ptr<_T1, _D1>& __x) _NOEXCEPT 289967f39647SHoward Hinnant{ 290067f39647SHoward Hinnant return static_cast<bool>(__x); 290167f39647SHoward Hinnant} 290267f39647SHoward Hinnant 290367f39647SHoward Hinnanttemplate <class _T1, class _D1> 290467f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 290567f39647SHoward Hinnantbool 290667f39647SHoward Hinnantoperator<(const unique_ptr<_T1, _D1>& __x, nullptr_t) 290767f39647SHoward Hinnant{ 290867f39647SHoward Hinnant typedef typename unique_ptr<_T1, _D1>::pointer _P1; 290967f39647SHoward Hinnant return less<_P1>()(__x.get(), nullptr); 291067f39647SHoward Hinnant} 291167f39647SHoward Hinnant 291267f39647SHoward Hinnanttemplate <class _T1, class _D1> 291367f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 291467f39647SHoward Hinnantbool 291567f39647SHoward Hinnantoperator<(nullptr_t, const unique_ptr<_T1, _D1>& __x) 291667f39647SHoward Hinnant{ 291767f39647SHoward Hinnant typedef typename unique_ptr<_T1, _D1>::pointer _P1; 291867f39647SHoward Hinnant return less<_P1>()(nullptr, __x.get()); 291967f39647SHoward Hinnant} 292067f39647SHoward Hinnant 292167f39647SHoward Hinnanttemplate <class _T1, class _D1> 292267f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 292367f39647SHoward Hinnantbool 292467f39647SHoward Hinnantoperator>(const unique_ptr<_T1, _D1>& __x, nullptr_t) 292567f39647SHoward Hinnant{ 292667f39647SHoward Hinnant return nullptr < __x; 292767f39647SHoward Hinnant} 292867f39647SHoward Hinnant 292967f39647SHoward Hinnanttemplate <class _T1, class _D1> 293067f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 293167f39647SHoward Hinnantbool 293267f39647SHoward Hinnantoperator>(nullptr_t, const unique_ptr<_T1, _D1>& __x) 293367f39647SHoward Hinnant{ 293467f39647SHoward Hinnant return __x < nullptr; 293567f39647SHoward Hinnant} 293667f39647SHoward Hinnant 293767f39647SHoward Hinnanttemplate <class _T1, class _D1> 293867f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 293967f39647SHoward Hinnantbool 294067f39647SHoward Hinnantoperator<=(const unique_ptr<_T1, _D1>& __x, nullptr_t) 294167f39647SHoward Hinnant{ 294267f39647SHoward Hinnant return !(nullptr < __x); 294367f39647SHoward Hinnant} 294467f39647SHoward Hinnant 294567f39647SHoward Hinnanttemplate <class _T1, class _D1> 294667f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 294767f39647SHoward Hinnantbool 294867f39647SHoward Hinnantoperator<=(nullptr_t, const unique_ptr<_T1, _D1>& __x) 294967f39647SHoward Hinnant{ 295067f39647SHoward Hinnant return !(__x < nullptr); 295167f39647SHoward Hinnant} 295267f39647SHoward Hinnant 295367f39647SHoward Hinnanttemplate <class _T1, class _D1> 295467f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 295567f39647SHoward Hinnantbool 295667f39647SHoward Hinnantoperator>=(const unique_ptr<_T1, _D1>& __x, nullptr_t) 295767f39647SHoward Hinnant{ 295867f39647SHoward Hinnant return !(__x < nullptr); 295967f39647SHoward Hinnant} 296067f39647SHoward Hinnant 296167f39647SHoward Hinnanttemplate <class _T1, class _D1> 296267f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 296367f39647SHoward Hinnantbool 296467f39647SHoward Hinnantoperator>=(nullptr_t, const unique_ptr<_T1, _D1>& __x) 296567f39647SHoward Hinnant{ 296667f39647SHoward Hinnant return !(nullptr < __x); 296767f39647SHoward Hinnant} 296867f39647SHoward Hinnant 2969bff1bfc6SHoward Hinnant#ifdef _LIBCPP_HAS_NO_RVALUE_REFERENCES 2970bff1bfc6SHoward Hinnant 2971bff1bfc6SHoward Hinnanttemplate <class _Tp, class _Dp> 2972bff1bfc6SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 2973bff1bfc6SHoward Hinnantunique_ptr<_Tp, _Dp> 2974bff1bfc6SHoward Hinnantmove(unique_ptr<_Tp, _Dp>& __t) 2975bff1bfc6SHoward Hinnant{ 2976bff1bfc6SHoward Hinnant return unique_ptr<_Tp, _Dp>(__rv<unique_ptr<_Tp, _Dp> >(__t)); 2977bff1bfc6SHoward Hinnant} 2978bff1bfc6SHoward Hinnant 2979bff1bfc6SHoward Hinnant#endif 2980bff1bfc6SHoward Hinnant 298128d8ba5fSMarshall Clow#if _LIBCPP_STD_VER > 11 298228d8ba5fSMarshall Clow 298328d8ba5fSMarshall Clowtemplate<class _Tp> 298428d8ba5fSMarshall Clowstruct __unique_if 298528d8ba5fSMarshall Clow{ 298628d8ba5fSMarshall Clow typedef unique_ptr<_Tp> __unique_single; 298728d8ba5fSMarshall Clow}; 298828d8ba5fSMarshall Clow 298928d8ba5fSMarshall Clowtemplate<class _Tp> 299028d8ba5fSMarshall Clowstruct __unique_if<_Tp[]> 299128d8ba5fSMarshall Clow{ 299228d8ba5fSMarshall Clow typedef unique_ptr<_Tp[]> __unique_array_unknown_bound; 299328d8ba5fSMarshall Clow}; 299428d8ba5fSMarshall Clow 299528d8ba5fSMarshall Clowtemplate<class _Tp, size_t _Np> 299628d8ba5fSMarshall Clowstruct __unique_if<_Tp[_Np]> 299728d8ba5fSMarshall Clow{ 299828d8ba5fSMarshall Clow typedef void __unique_array_known_bound; 299928d8ba5fSMarshall Clow}; 300028d8ba5fSMarshall Clow 300128d8ba5fSMarshall Clowtemplate<class _Tp, class... _Args> 300295ddb530SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 300328d8ba5fSMarshall Clowtypename __unique_if<_Tp>::__unique_single 300428d8ba5fSMarshall Clowmake_unique(_Args&&... __args) 300528d8ba5fSMarshall Clow{ 300628d8ba5fSMarshall Clow return unique_ptr<_Tp>(new _Tp(_VSTD::forward<_Args>(__args)...)); 300728d8ba5fSMarshall Clow} 300828d8ba5fSMarshall Clow 300928d8ba5fSMarshall Clowtemplate<class _Tp> 301095ddb530SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 301128d8ba5fSMarshall Clowtypename __unique_if<_Tp>::__unique_array_unknown_bound 301228d8ba5fSMarshall Clowmake_unique(size_t __n) 301328d8ba5fSMarshall Clow{ 301428d8ba5fSMarshall Clow typedef typename remove_extent<_Tp>::type _Up; 301528d8ba5fSMarshall Clow return unique_ptr<_Tp>(new _Up[__n]()); 301628d8ba5fSMarshall Clow} 301728d8ba5fSMarshall Clow 301828d8ba5fSMarshall Clowtemplate<class _Tp, class... _Args> 301928d8ba5fSMarshall Clow typename __unique_if<_Tp>::__unique_array_known_bound 302028d8ba5fSMarshall Clow make_unique(_Args&&...) = delete; 302128d8ba5fSMarshall Clow 302228d8ba5fSMarshall Clow#endif // _LIBCPP_STD_VER > 11 302328d8ba5fSMarshall Clow 302484b569d5SHoward Hinnanttemplate <class _Size> 302584b569d5SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 302684b569d5SHoward Hinnant_Size 302784b569d5SHoward Hinnant__loadword(const void* __p) 302884b569d5SHoward Hinnant{ 302984b569d5SHoward Hinnant _Size __r; 303084b569d5SHoward Hinnant std::memcpy(&__r, __p, sizeof(__r)); 303184b569d5SHoward Hinnant return __r; 303284b569d5SHoward Hinnant} 303384b569d5SHoward Hinnant 303453d2fb0aSHoward Hinnant// We use murmur2 when size_t is 32 bits, and cityhash64 when size_t 303553d2fb0aSHoward Hinnant// is 64 bits. This is because cityhash64 uses 64bit x 64bit 303653d2fb0aSHoward Hinnant// multiplication, which can be very slow on 32-bit systems. 3037f3d14a65SHoward Hinnanttemplate <class _Size, size_t = sizeof(_Size)*__CHAR_BIT__> 303853d2fb0aSHoward Hinnantstruct __murmur2_or_cityhash; 3039f3d14a65SHoward Hinnant 3040f3d14a65SHoward Hinnanttemplate <class _Size> 304153d2fb0aSHoward Hinnantstruct __murmur2_or_cityhash<_Size, 32> 3042f3d14a65SHoward Hinnant{ 3043f3d14a65SHoward Hinnant _Size operator()(const void* __key, _Size __len); 3044f3d14a65SHoward Hinnant}; 3045f3d14a65SHoward Hinnant 304653d2fb0aSHoward Hinnant// murmur2 3047f3d14a65SHoward Hinnanttemplate <class _Size> 3048f3d14a65SHoward Hinnant_Size 3049ec880422SMarshall Clow__murmur2_or_cityhash<_Size, 32>::operator()(const void* __key, _Size __len) _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK 3050f3d14a65SHoward Hinnant{ 3051f3d14a65SHoward Hinnant const _Size __m = 0x5bd1e995; 3052f3d14a65SHoward Hinnant const _Size __r = 24; 3053f3d14a65SHoward Hinnant _Size __h = __len; 3054f3d14a65SHoward Hinnant const unsigned char* __data = static_cast<const unsigned char*>(__key); 3055f3d14a65SHoward Hinnant for (; __len >= 4; __data += 4, __len -= 4) 3056f3d14a65SHoward Hinnant { 305784b569d5SHoward Hinnant _Size __k = __loadword<_Size>(__data); 3058f3d14a65SHoward Hinnant __k *= __m; 3059f3d14a65SHoward Hinnant __k ^= __k >> __r; 3060f3d14a65SHoward Hinnant __k *= __m; 3061f3d14a65SHoward Hinnant __h *= __m; 3062f3d14a65SHoward Hinnant __h ^= __k; 3063f3d14a65SHoward Hinnant } 3064f3d14a65SHoward Hinnant switch (__len) 3065f3d14a65SHoward Hinnant { 3066f3d14a65SHoward Hinnant case 3: 3067f3d14a65SHoward Hinnant __h ^= __data[2] << 16; 3068f3d14a65SHoward Hinnant case 2: 3069f3d14a65SHoward Hinnant __h ^= __data[1] << 8; 3070f3d14a65SHoward Hinnant case 1: 3071f3d14a65SHoward Hinnant __h ^= __data[0]; 3072f3d14a65SHoward Hinnant __h *= __m; 3073f3d14a65SHoward Hinnant } 3074f3d14a65SHoward Hinnant __h ^= __h >> 13; 3075f3d14a65SHoward Hinnant __h *= __m; 3076f3d14a65SHoward Hinnant __h ^= __h >> 15; 3077f3d14a65SHoward Hinnant return __h; 3078f3d14a65SHoward Hinnant} 3079f3d14a65SHoward Hinnant 3080f3d14a65SHoward Hinnanttemplate <class _Size> 308153d2fb0aSHoward Hinnantstruct __murmur2_or_cityhash<_Size, 64> 3082f3d14a65SHoward Hinnant{ 3083f3d14a65SHoward Hinnant _Size operator()(const void* __key, _Size __len); 308453d2fb0aSHoward Hinnant 308553d2fb0aSHoward Hinnant private: 308653d2fb0aSHoward Hinnant // Some primes between 2^63 and 2^64. 308753d2fb0aSHoward Hinnant static const _Size __k0 = 0xc3a5c85c97cb3127ULL; 308853d2fb0aSHoward Hinnant static const _Size __k1 = 0xb492b66fbe98f273ULL; 308953d2fb0aSHoward Hinnant static const _Size __k2 = 0x9ae16a3b2f90404fULL; 309053d2fb0aSHoward Hinnant static const _Size __k3 = 0xc949d7c7509e6557ULL; 309153d2fb0aSHoward Hinnant 309253d2fb0aSHoward Hinnant static _Size __rotate(_Size __val, int __shift) { 309353d2fb0aSHoward Hinnant return __shift == 0 ? __val : ((__val >> __shift) | (__val << (64 - __shift))); 309453d2fb0aSHoward Hinnant } 309553d2fb0aSHoward Hinnant 309653d2fb0aSHoward Hinnant static _Size __rotate_by_at_least_1(_Size __val, int __shift) { 309753d2fb0aSHoward Hinnant return (__val >> __shift) | (__val << (64 - __shift)); 309853d2fb0aSHoward Hinnant } 309953d2fb0aSHoward Hinnant 310053d2fb0aSHoward Hinnant static _Size __shift_mix(_Size __val) { 310153d2fb0aSHoward Hinnant return __val ^ (__val >> 47); 310253d2fb0aSHoward Hinnant } 310353d2fb0aSHoward Hinnant 310453d2fb0aSHoward Hinnant static _Size __hash_len_16(_Size __u, _Size __v) { 310553d2fb0aSHoward Hinnant const _Size __mul = 0x9ddfea08eb382d69ULL; 310653d2fb0aSHoward Hinnant _Size __a = (__u ^ __v) * __mul; 310753d2fb0aSHoward Hinnant __a ^= (__a >> 47); 310853d2fb0aSHoward Hinnant _Size __b = (__v ^ __a) * __mul; 310953d2fb0aSHoward Hinnant __b ^= (__b >> 47); 311053d2fb0aSHoward Hinnant __b *= __mul; 311153d2fb0aSHoward Hinnant return __b; 311253d2fb0aSHoward Hinnant } 311353d2fb0aSHoward Hinnant 311453d2fb0aSHoward Hinnant static _Size __hash_len_0_to_16(const char* __s, _Size __len) { 311553d2fb0aSHoward Hinnant if (__len > 8) { 311684b569d5SHoward Hinnant const _Size __a = __loadword<_Size>(__s); 311784b569d5SHoward Hinnant const _Size __b = __loadword<_Size>(__s + __len - 8); 311853d2fb0aSHoward Hinnant return __hash_len_16(__a, __rotate_by_at_least_1(__b + __len, __len)) ^ __b; 311953d2fb0aSHoward Hinnant } 312053d2fb0aSHoward Hinnant if (__len >= 4) { 312184b569d5SHoward Hinnant const uint32_t __a = __loadword<uint32_t>(__s); 312284b569d5SHoward Hinnant const uint32_t __b = __loadword<uint32_t>(__s + __len - 4); 312353d2fb0aSHoward Hinnant return __hash_len_16(__len + (__a << 3), __b); 312453d2fb0aSHoward Hinnant } 312553d2fb0aSHoward Hinnant if (__len > 0) { 312653d2fb0aSHoward Hinnant const unsigned char __a = __s[0]; 312753d2fb0aSHoward Hinnant const unsigned char __b = __s[__len >> 1]; 312853d2fb0aSHoward Hinnant const unsigned char __c = __s[__len - 1]; 312953d2fb0aSHoward Hinnant const uint32_t __y = static_cast<uint32_t>(__a) + 313053d2fb0aSHoward Hinnant (static_cast<uint32_t>(__b) << 8); 313153d2fb0aSHoward Hinnant const uint32_t __z = __len + (static_cast<uint32_t>(__c) << 2); 313253d2fb0aSHoward Hinnant return __shift_mix(__y * __k2 ^ __z * __k3) * __k2; 313353d2fb0aSHoward Hinnant } 313453d2fb0aSHoward Hinnant return __k2; 313553d2fb0aSHoward Hinnant } 313653d2fb0aSHoward Hinnant 313753d2fb0aSHoward Hinnant static _Size __hash_len_17_to_32(const char *__s, _Size __len) { 313884b569d5SHoward Hinnant const _Size __a = __loadword<_Size>(__s) * __k1; 313984b569d5SHoward Hinnant const _Size __b = __loadword<_Size>(__s + 8); 314084b569d5SHoward Hinnant const _Size __c = __loadword<_Size>(__s + __len - 8) * __k2; 314184b569d5SHoward Hinnant const _Size __d = __loadword<_Size>(__s + __len - 16) * __k0; 314253d2fb0aSHoward Hinnant return __hash_len_16(__rotate(__a - __b, 43) + __rotate(__c, 30) + __d, 314353d2fb0aSHoward Hinnant __a + __rotate(__b ^ __k3, 20) - __c + __len); 314453d2fb0aSHoward Hinnant } 314553d2fb0aSHoward Hinnant 314653d2fb0aSHoward Hinnant // Return a 16-byte hash for 48 bytes. Quick and dirty. 314753d2fb0aSHoward Hinnant // Callers do best to use "random-looking" values for a and b. 314853d2fb0aSHoward Hinnant static pair<_Size, _Size> __weak_hash_len_32_with_seeds( 314953d2fb0aSHoward Hinnant _Size __w, _Size __x, _Size __y, _Size __z, _Size __a, _Size __b) { 315053d2fb0aSHoward Hinnant __a += __w; 315153d2fb0aSHoward Hinnant __b = __rotate(__b + __a + __z, 21); 315253d2fb0aSHoward Hinnant const _Size __c = __a; 315353d2fb0aSHoward Hinnant __a += __x; 315453d2fb0aSHoward Hinnant __a += __y; 315553d2fb0aSHoward Hinnant __b += __rotate(__a, 44); 315653d2fb0aSHoward Hinnant return pair<_Size, _Size>(__a + __z, __b + __c); 315753d2fb0aSHoward Hinnant } 315853d2fb0aSHoward Hinnant 315953d2fb0aSHoward Hinnant // Return a 16-byte hash for s[0] ... s[31], a, and b. Quick and dirty. 316053d2fb0aSHoward Hinnant static pair<_Size, _Size> __weak_hash_len_32_with_seeds( 316153d2fb0aSHoward Hinnant const char* __s, _Size __a, _Size __b) { 316284b569d5SHoward Hinnant return __weak_hash_len_32_with_seeds(__loadword<_Size>(__s), 316384b569d5SHoward Hinnant __loadword<_Size>(__s + 8), 316484b569d5SHoward Hinnant __loadword<_Size>(__s + 16), 316584b569d5SHoward Hinnant __loadword<_Size>(__s + 24), 316653d2fb0aSHoward Hinnant __a, 316753d2fb0aSHoward Hinnant __b); 316853d2fb0aSHoward Hinnant } 316953d2fb0aSHoward Hinnant 317053d2fb0aSHoward Hinnant // Return an 8-byte hash for 33 to 64 bytes. 317153d2fb0aSHoward Hinnant static _Size __hash_len_33_to_64(const char *__s, size_t __len) { 317284b569d5SHoward Hinnant _Size __z = __loadword<_Size>(__s + 24); 317384b569d5SHoward Hinnant _Size __a = __loadword<_Size>(__s) + 317484b569d5SHoward Hinnant (__len + __loadword<_Size>(__s + __len - 16)) * __k0; 317553d2fb0aSHoward Hinnant _Size __b = __rotate(__a + __z, 52); 317653d2fb0aSHoward Hinnant _Size __c = __rotate(__a, 37); 317784b569d5SHoward Hinnant __a += __loadword<_Size>(__s + 8); 317853d2fb0aSHoward Hinnant __c += __rotate(__a, 7); 317984b569d5SHoward Hinnant __a += __loadword<_Size>(__s + 16); 318053d2fb0aSHoward Hinnant _Size __vf = __a + __z; 318153d2fb0aSHoward Hinnant _Size __vs = __b + __rotate(__a, 31) + __c; 318284b569d5SHoward Hinnant __a = __loadword<_Size>(__s + 16) + __loadword<_Size>(__s + __len - 32); 318384b569d5SHoward Hinnant __z += __loadword<_Size>(__s + __len - 8); 318453d2fb0aSHoward Hinnant __b = __rotate(__a + __z, 52); 318553d2fb0aSHoward Hinnant __c = __rotate(__a, 37); 318684b569d5SHoward Hinnant __a += __loadword<_Size>(__s + __len - 24); 318753d2fb0aSHoward Hinnant __c += __rotate(__a, 7); 318884b569d5SHoward Hinnant __a += __loadword<_Size>(__s + __len - 16); 318953d2fb0aSHoward Hinnant _Size __wf = __a + __z; 319053d2fb0aSHoward Hinnant _Size __ws = __b + __rotate(__a, 31) + __c; 319153d2fb0aSHoward Hinnant _Size __r = __shift_mix((__vf + __ws) * __k2 + (__wf + __vs) * __k0); 319253d2fb0aSHoward Hinnant return __shift_mix(__r * __k0 + __vs) * __k2; 319353d2fb0aSHoward Hinnant } 3194f3d14a65SHoward Hinnant}; 3195f3d14a65SHoward Hinnant 319653d2fb0aSHoward Hinnant// cityhash64 3197f3d14a65SHoward Hinnanttemplate <class _Size> 3198f3d14a65SHoward Hinnant_Size 3199ec880422SMarshall Clow__murmur2_or_cityhash<_Size, 64>::operator()(const void* __key, _Size __len) _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK 3200f3d14a65SHoward Hinnant{ 320153d2fb0aSHoward Hinnant const char* __s = static_cast<const char*>(__key); 320253d2fb0aSHoward Hinnant if (__len <= 32) { 320353d2fb0aSHoward Hinnant if (__len <= 16) { 320453d2fb0aSHoward Hinnant return __hash_len_0_to_16(__s, __len); 320553d2fb0aSHoward Hinnant } else { 320653d2fb0aSHoward Hinnant return __hash_len_17_to_32(__s, __len); 3207f3d14a65SHoward Hinnant } 320853d2fb0aSHoward Hinnant } else if (__len <= 64) { 320953d2fb0aSHoward Hinnant return __hash_len_33_to_64(__s, __len); 3210f3d14a65SHoward Hinnant } 321153d2fb0aSHoward Hinnant 321253d2fb0aSHoward Hinnant // For strings over 64 bytes we hash the end first, and then as we 321353d2fb0aSHoward Hinnant // loop we keep 56 bytes of state: v, w, x, y, and z. 321484b569d5SHoward Hinnant _Size __x = __loadword<_Size>(__s + __len - 40); 321584b569d5SHoward Hinnant _Size __y = __loadword<_Size>(__s + __len - 16) + 321684b569d5SHoward Hinnant __loadword<_Size>(__s + __len - 56); 321784b569d5SHoward Hinnant _Size __z = __hash_len_16(__loadword<_Size>(__s + __len - 48) + __len, 321884b569d5SHoward Hinnant __loadword<_Size>(__s + __len - 24)); 321953d2fb0aSHoward Hinnant pair<_Size, _Size> __v = __weak_hash_len_32_with_seeds(__s + __len - 64, __len, __z); 322053d2fb0aSHoward Hinnant pair<_Size, _Size> __w = __weak_hash_len_32_with_seeds(__s + __len - 32, __y + __k1, __x); 322184b569d5SHoward Hinnant __x = __x * __k1 + __loadword<_Size>(__s); 322253d2fb0aSHoward Hinnant 322353d2fb0aSHoward Hinnant // Decrease len to the nearest multiple of 64, and operate on 64-byte chunks. 322453d2fb0aSHoward Hinnant __len = (__len - 1) & ~static_cast<_Size>(63); 322553d2fb0aSHoward Hinnant do { 322684b569d5SHoward Hinnant __x = __rotate(__x + __y + __v.first + __loadword<_Size>(__s + 8), 37) * __k1; 322784b569d5SHoward Hinnant __y = __rotate(__y + __v.second + __loadword<_Size>(__s + 48), 42) * __k1; 322853d2fb0aSHoward Hinnant __x ^= __w.second; 322984b569d5SHoward Hinnant __y += __v.first + __loadword<_Size>(__s + 40); 323053d2fb0aSHoward Hinnant __z = __rotate(__z + __w.first, 33) * __k1; 323153d2fb0aSHoward Hinnant __v = __weak_hash_len_32_with_seeds(__s, __v.second * __k1, __x + __w.first); 323253d2fb0aSHoward Hinnant __w = __weak_hash_len_32_with_seeds(__s + 32, __z + __w.second, 323384b569d5SHoward Hinnant __y + __loadword<_Size>(__s + 16)); 323453d2fb0aSHoward Hinnant std::swap(__z, __x); 323553d2fb0aSHoward Hinnant __s += 64; 323653d2fb0aSHoward Hinnant __len -= 64; 323753d2fb0aSHoward Hinnant } while (__len != 0); 323853d2fb0aSHoward Hinnant return __hash_len_16( 323953d2fb0aSHoward Hinnant __hash_len_16(__v.first, __w.first) + __shift_mix(__y) * __k1 + __z, 324053d2fb0aSHoward Hinnant __hash_len_16(__v.second, __w.second) + __x); 3241f3d14a65SHoward Hinnant} 3242f3d14a65SHoward Hinnant 32439b0cd149SHoward Hinnanttemplate <class _Tp, size_t = sizeof(_Tp) / sizeof(size_t)> 32449b0cd149SHoward Hinnantstruct __scalar_hash; 32459b0cd149SHoward Hinnant 3246d1803b6cSHoward Hinnanttemplate <class _Tp> 32479b0cd149SHoward Hinnantstruct __scalar_hash<_Tp, 0> 32489b0cd149SHoward Hinnant : public unary_function<_Tp, size_t> 3249d1803b6cSHoward Hinnant{ 3250848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 32519b0cd149SHoward Hinnant size_t operator()(_Tp __v) const _NOEXCEPT 3252d1803b6cSHoward Hinnant { 32539b0cd149SHoward Hinnant union 32549b0cd149SHoward Hinnant { 32559b0cd149SHoward Hinnant _Tp __t; 32569b0cd149SHoward Hinnant size_t __a; 32579b0cd149SHoward Hinnant } __u; 32589b0cd149SHoward Hinnant __u.__a = 0; 32599b0cd149SHoward Hinnant __u.__t = __v; 32609b0cd149SHoward Hinnant return __u.__a; 3261d1803b6cSHoward Hinnant } 3262d1803b6cSHoward Hinnant}; 3263d1803b6cSHoward Hinnant 32649b0cd149SHoward Hinnanttemplate <class _Tp> 32659b0cd149SHoward Hinnantstruct __scalar_hash<_Tp, 1> 32669b0cd149SHoward Hinnant : public unary_function<_Tp, size_t> 32679b0cd149SHoward Hinnant{ 32689b0cd149SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 32699b0cd149SHoward Hinnant size_t operator()(_Tp __v) const _NOEXCEPT 32709b0cd149SHoward Hinnant { 32719b0cd149SHoward Hinnant union 32729b0cd149SHoward Hinnant { 32739b0cd149SHoward Hinnant _Tp __t; 32749b0cd149SHoward Hinnant size_t __a; 32759b0cd149SHoward Hinnant } __u; 32769b0cd149SHoward Hinnant __u.__t = __v; 32779b0cd149SHoward Hinnant return __u.__a; 32789b0cd149SHoward Hinnant } 32799b0cd149SHoward Hinnant}; 32809b0cd149SHoward Hinnant 32819b0cd149SHoward Hinnanttemplate <class _Tp> 32829b0cd149SHoward Hinnantstruct __scalar_hash<_Tp, 2> 32839b0cd149SHoward Hinnant : public unary_function<_Tp, size_t> 32849b0cd149SHoward Hinnant{ 32859b0cd149SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 32869b0cd149SHoward Hinnant size_t operator()(_Tp __v) const _NOEXCEPT 32879b0cd149SHoward Hinnant { 32889b0cd149SHoward Hinnant union 32899b0cd149SHoward Hinnant { 32909b0cd149SHoward Hinnant _Tp __t; 32919b0cd149SHoward Hinnant struct 32929b0cd149SHoward Hinnant { 32939b0cd149SHoward Hinnant size_t __a; 32949b0cd149SHoward Hinnant size_t __b; 329587a82490SEric Fiselier } __s; 32969b0cd149SHoward Hinnant } __u; 32979b0cd149SHoward Hinnant __u.__t = __v; 329853d2fb0aSHoward Hinnant return __murmur2_or_cityhash<size_t>()(&__u, sizeof(__u)); 32999b0cd149SHoward Hinnant } 33009b0cd149SHoward Hinnant}; 33019b0cd149SHoward Hinnant 33029b0cd149SHoward Hinnanttemplate <class _Tp> 33039b0cd149SHoward Hinnantstruct __scalar_hash<_Tp, 3> 33049b0cd149SHoward Hinnant : public unary_function<_Tp, size_t> 33059b0cd149SHoward Hinnant{ 33069b0cd149SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 33079b0cd149SHoward Hinnant size_t operator()(_Tp __v) const _NOEXCEPT 33089b0cd149SHoward Hinnant { 33099b0cd149SHoward Hinnant union 33109b0cd149SHoward Hinnant { 33119b0cd149SHoward Hinnant _Tp __t; 33129b0cd149SHoward Hinnant struct 33139b0cd149SHoward Hinnant { 33149b0cd149SHoward Hinnant size_t __a; 33159b0cd149SHoward Hinnant size_t __b; 33169b0cd149SHoward Hinnant size_t __c; 331787a82490SEric Fiselier } __s; 33189b0cd149SHoward Hinnant } __u; 33199b0cd149SHoward Hinnant __u.__t = __v; 332053d2fb0aSHoward Hinnant return __murmur2_or_cityhash<size_t>()(&__u, sizeof(__u)); 33219b0cd149SHoward Hinnant } 33229b0cd149SHoward Hinnant}; 33239b0cd149SHoward Hinnant 33249b0cd149SHoward Hinnanttemplate <class _Tp> 33259b0cd149SHoward Hinnantstruct __scalar_hash<_Tp, 4> 33269b0cd149SHoward Hinnant : public unary_function<_Tp, size_t> 33279b0cd149SHoward Hinnant{ 33289b0cd149SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 33299b0cd149SHoward Hinnant size_t operator()(_Tp __v) const _NOEXCEPT 33309b0cd149SHoward Hinnant { 33319b0cd149SHoward Hinnant union 33329b0cd149SHoward Hinnant { 33339b0cd149SHoward Hinnant _Tp __t; 33349b0cd149SHoward Hinnant struct 33359b0cd149SHoward Hinnant { 33369b0cd149SHoward Hinnant size_t __a; 33379b0cd149SHoward Hinnant size_t __b; 33389b0cd149SHoward Hinnant size_t __c; 33399b0cd149SHoward Hinnant size_t __d; 334087a82490SEric Fiselier } __s; 33419b0cd149SHoward Hinnant } __u; 33429b0cd149SHoward Hinnant __u.__t = __v; 334353d2fb0aSHoward Hinnant return __murmur2_or_cityhash<size_t>()(&__u, sizeof(__u)); 33449b0cd149SHoward Hinnant } 33459b0cd149SHoward Hinnant}; 33469b0cd149SHoward Hinnant 3347918f32fcSEric Fiselier_LIBCPP_INLINE_VISIBILITY 3348918f32fcSEric Fiselierinline size_t __hash_combine(size_t __lhs, size_t __rhs) _NOEXCEPT { 3349918f32fcSEric Fiselier struct _PairT { 3350918f32fcSEric Fiselier size_t first; 3351918f32fcSEric Fiselier size_t second; 3352918f32fcSEric Fiselier }; 3353918f32fcSEric Fiselier typedef __scalar_hash<_PairT> _HashT; 335458779201SEric Fiselier const _PairT __p = {__lhs, __rhs}; 3355918f32fcSEric Fiselier return _HashT()(__p); 3356918f32fcSEric Fiselier} 3357918f32fcSEric Fiselier 33589b0cd149SHoward Hinnanttemplate<class _Tp> 3359e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS hash<_Tp*> 3360d77851e8SHoward Hinnant : public unary_function<_Tp*, size_t> 33619b0cd149SHoward Hinnant{ 3362d77851e8SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 3363d77851e8SHoward Hinnant size_t operator()(_Tp* __v) const _NOEXCEPT 3364d77851e8SHoward Hinnant { 3365d77851e8SHoward Hinnant union 3366d77851e8SHoward Hinnant { 3367d77851e8SHoward Hinnant _Tp* __t; 3368d77851e8SHoward Hinnant size_t __a; 3369d77851e8SHoward Hinnant } __u; 3370d77851e8SHoward Hinnant __u.__t = __v; 3371d77851e8SHoward Hinnant return __murmur2_or_cityhash<size_t>()(&__u, sizeof(__u)); 3372d77851e8SHoward Hinnant } 33739b0cd149SHoward Hinnant}; 33749b0cd149SHoward Hinnant 3375d1803b6cSHoward Hinnanttemplate <class _Tp, class _Dp> 3376e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS hash<unique_ptr<_Tp, _Dp> > 3377d1803b6cSHoward Hinnant{ 3378d1803b6cSHoward Hinnant typedef unique_ptr<_Tp, _Dp> argument_type; 3379d1803b6cSHoward Hinnant typedef size_t result_type; 3380848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 33813739fe79SHoward Hinnant result_type operator()(const argument_type& __ptr) const _NOEXCEPT 3382d1803b6cSHoward Hinnant { 3383d1803b6cSHoward Hinnant typedef typename argument_type::pointer pointer; 3384d1803b6cSHoward Hinnant return hash<pointer>()(__ptr.get()); 3385d1803b6cSHoward Hinnant } 3386d1803b6cSHoward Hinnant}; 3387d1803b6cSHoward Hinnant 33883e519524SHoward Hinnantstruct __destruct_n 33893e519524SHoward Hinnant{ 33903e519524SHoward Hinnantprivate: 33913e519524SHoward Hinnant size_t size; 33923e519524SHoward Hinnant 33933e519524SHoward Hinnant template <class _Tp> 33943739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __process(_Tp* __p, false_type) _NOEXCEPT 33953e519524SHoward Hinnant {for (size_t __i = 0; __i < size; ++__i, ++__p) __p->~_Tp();} 33963e519524SHoward Hinnant 33973e519524SHoward Hinnant template <class _Tp> 33983739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __process(_Tp*, true_type) _NOEXCEPT 33993e519524SHoward Hinnant {} 34003e519524SHoward Hinnant 34013739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __incr(false_type) _NOEXCEPT 34023e519524SHoward Hinnant {++size;} 34033739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __incr(true_type) _NOEXCEPT 34043e519524SHoward Hinnant {} 34053e519524SHoward Hinnant 34063739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __set(size_t __s, false_type) _NOEXCEPT 34073e519524SHoward Hinnant {size = __s;} 34083739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __set(size_t, true_type) _NOEXCEPT 34093e519524SHoward Hinnant {} 34103e519524SHoward Hinnantpublic: 34113739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __destruct_n(size_t __s) _NOEXCEPT 34123739fe79SHoward Hinnant : size(__s) {} 34133e519524SHoward Hinnant 34143e519524SHoward Hinnant template <class _Tp> 34153739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __incr(_Tp*) _NOEXCEPT 3416ca740483SHoward Hinnant {__incr(integral_constant<bool, is_trivially_destructible<_Tp>::value>());} 34173e519524SHoward Hinnant 34183e519524SHoward Hinnant template <class _Tp> 34193739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __set(size_t __s, _Tp*) _NOEXCEPT 3420ca740483SHoward Hinnant {__set(__s, integral_constant<bool, is_trivially_destructible<_Tp>::value>());} 34213e519524SHoward Hinnant 34223e519524SHoward Hinnant template <class _Tp> 34233739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __p) _NOEXCEPT 3424ca740483SHoward Hinnant {__process(__p, integral_constant<bool, is_trivially_destructible<_Tp>::value>());} 34253e519524SHoward Hinnant}; 34263e519524SHoward Hinnant 34273e519524SHoward Hinnanttemplate <class _Alloc> 34283e519524SHoward Hinnantclass __allocator_destructor 34293e519524SHoward Hinnant{ 34303e519524SHoward Hinnant typedef allocator_traits<_Alloc> __alloc_traits; 34313e519524SHoward Hinnantpublic: 34323e519524SHoward Hinnant typedef typename __alloc_traits::pointer pointer; 34333e519524SHoward Hinnant typedef typename __alloc_traits::size_type size_type; 34343e519524SHoward Hinnantprivate: 34353e519524SHoward Hinnant _Alloc& __alloc_; 34363e519524SHoward Hinnant size_type __s_; 34373e519524SHoward Hinnantpublic: 34383e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __allocator_destructor(_Alloc& __a, size_type __s) 34393739fe79SHoward Hinnant _NOEXCEPT 34403e519524SHoward Hinnant : __alloc_(__a), __s_(__s) {} 3441848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 34423739fe79SHoward Hinnant void operator()(pointer __p) _NOEXCEPT 34433739fe79SHoward Hinnant {__alloc_traits::deallocate(__alloc_, __p, __s_);} 34443e519524SHoward Hinnant}; 34453e519524SHoward Hinnant 34463e519524SHoward Hinnanttemplate <class _InputIterator, class _ForwardIterator> 34473e519524SHoward Hinnant_ForwardIterator 34483e519524SHoward Hinnantuninitialized_copy(_InputIterator __f, _InputIterator __l, _ForwardIterator __r) 34493e519524SHoward Hinnant{ 34503e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 3451b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3452b34b4819SHoward Hinnant _ForwardIterator __s = __r; 3453b34b4819SHoward Hinnant try 3454b34b4819SHoward Hinnant { 3455b34b4819SHoward Hinnant#endif 3456a00932bdSMarshall Clow for (; __f != __l; ++__f, (void) ++__r) 3457a00932bdSMarshall Clow ::new (static_cast<void*>(_VSTD::addressof(*__r))) value_type(*__f); 3458b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3459b34b4819SHoward Hinnant } 3460b34b4819SHoward Hinnant catch (...) 3461b34b4819SHoward Hinnant { 3462b34b4819SHoward Hinnant for (; __s != __r; ++__s) 3463b34b4819SHoward Hinnant __s->~value_type(); 3464b34b4819SHoward Hinnant throw; 3465b34b4819SHoward Hinnant } 3466b34b4819SHoward Hinnant#endif 34673e519524SHoward Hinnant return __r; 34683e519524SHoward Hinnant} 34693e519524SHoward Hinnant 34703e519524SHoward Hinnanttemplate <class _InputIterator, class _Size, class _ForwardIterator> 34713e519524SHoward Hinnant_ForwardIterator 34723e519524SHoward Hinnantuninitialized_copy_n(_InputIterator __f, _Size __n, _ForwardIterator __r) 34733e519524SHoward Hinnant{ 34743e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 3475b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3476b34b4819SHoward Hinnant _ForwardIterator __s = __r; 3477b34b4819SHoward Hinnant try 3478b34b4819SHoward Hinnant { 3479b34b4819SHoward Hinnant#endif 3480a00932bdSMarshall Clow for (; __n > 0; ++__f, (void) ++__r, (void) --__n) 3481a00932bdSMarshall Clow ::new (static_cast<void*>(_VSTD::addressof(*__r))) value_type(*__f); 3482b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3483b34b4819SHoward Hinnant } 3484b34b4819SHoward Hinnant catch (...) 3485b34b4819SHoward Hinnant { 3486b34b4819SHoward Hinnant for (; __s != __r; ++__s) 3487b34b4819SHoward Hinnant __s->~value_type(); 3488b34b4819SHoward Hinnant throw; 3489b34b4819SHoward Hinnant } 3490b34b4819SHoward Hinnant#endif 34913e519524SHoward Hinnant return __r; 34923e519524SHoward Hinnant} 34933e519524SHoward Hinnant 34943e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Tp> 34953e519524SHoward Hinnantvoid 34963e519524SHoward Hinnantuninitialized_fill(_ForwardIterator __f, _ForwardIterator __l, const _Tp& __x) 34973e519524SHoward Hinnant{ 34983e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 3499b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3500b34b4819SHoward Hinnant _ForwardIterator __s = __f; 3501b34b4819SHoward Hinnant try 3502b34b4819SHoward Hinnant { 3503b34b4819SHoward Hinnant#endif 3504b34b4819SHoward Hinnant for (; __f != __l; ++__f) 3505a00932bdSMarshall Clow ::new (static_cast<void*>(_VSTD::addressof(*__f))) value_type(__x); 3506b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3507b34b4819SHoward Hinnant } 3508b34b4819SHoward Hinnant catch (...) 3509b34b4819SHoward Hinnant { 3510b34b4819SHoward Hinnant for (; __s != __f; ++__s) 3511b34b4819SHoward Hinnant __s->~value_type(); 3512b34b4819SHoward Hinnant throw; 3513b34b4819SHoward Hinnant } 3514b34b4819SHoward Hinnant#endif 35153e519524SHoward Hinnant} 35163e519524SHoward Hinnant 35173e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Size, class _Tp> 351848d05bd2SHoward Hinnant_ForwardIterator 35193e519524SHoward Hinnantuninitialized_fill_n(_ForwardIterator __f, _Size __n, const _Tp& __x) 35203e519524SHoward Hinnant{ 35213e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 3522b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3523b34b4819SHoward Hinnant _ForwardIterator __s = __f; 3524b34b4819SHoward Hinnant try 3525b34b4819SHoward Hinnant { 3526b34b4819SHoward Hinnant#endif 3527a00932bdSMarshall Clow for (; __n > 0; ++__f, (void) --__n) 3528a00932bdSMarshall Clow ::new (static_cast<void*>(_VSTD::addressof(*__f))) value_type(__x); 3529b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3530b34b4819SHoward Hinnant } 3531b34b4819SHoward Hinnant catch (...) 3532b34b4819SHoward Hinnant { 3533b34b4819SHoward Hinnant for (; __s != __f; ++__s) 3534b34b4819SHoward Hinnant __s->~value_type(); 3535b34b4819SHoward Hinnant throw; 3536b34b4819SHoward Hinnant } 3537b34b4819SHoward Hinnant#endif 353848d05bd2SHoward Hinnant return __f; 35393e519524SHoward Hinnant} 35403e519524SHoward Hinnant 3541e4d9c316SEric Fiselier#if _LIBCPP_STD_VER > 14 3542e4d9c316SEric Fiselier 3543e4d9c316SEric Fiseliertemplate <class _Tp> 3544e4d9c316SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3545e4d9c316SEric Fiseliervoid destroy_at(_Tp* __loc) { 3546e4d9c316SEric Fiselier _LIBCPP_ASSERT(__loc, "null pointer given to destroy_at"); 3547e4d9c316SEric Fiselier __loc->~_Tp(); 3548e4d9c316SEric Fiselier} 3549e4d9c316SEric Fiselier 3550e4d9c316SEric Fiseliertemplate <class _ForwardIterator> 3551e4d9c316SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3552e4d9c316SEric Fiseliervoid destroy(_ForwardIterator __first, _ForwardIterator __last) { 3553e4d9c316SEric Fiselier for (; __first != __last; ++__first) 3554e4d9c316SEric Fiselier _VSTD::destroy_at(_VSTD::addressof(*__first)); 3555e4d9c316SEric Fiselier} 3556e4d9c316SEric Fiselier 3557e4d9c316SEric Fiseliertemplate <class _ForwardIterator, class _Size> 3558e4d9c316SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3559e4d9c316SEric Fiselier_ForwardIterator destroy_n(_ForwardIterator __first, _Size __n) { 3560e4d9c316SEric Fiselier for (; __n > 0; (void)++__first, --__n) 3561e4d9c316SEric Fiselier _VSTD::destroy_at(_VSTD::addressof(*__first)); 3562e4d9c316SEric Fiselier return __first; 3563e4d9c316SEric Fiselier} 3564e4d9c316SEric Fiselier 3565e778d10cSEric Fiseliertemplate <class _ForwardIterator> 3566e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3567e778d10cSEric Fiseliervoid uninitialized_default_construct(_ForwardIterator __first, _ForwardIterator __last) { 3568e778d10cSEric Fiselier using _Vt = typename iterator_traits<_ForwardIterator>::value_type; 3569e778d10cSEric Fiselier auto __idx = __first; 3570e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3571e778d10cSEric Fiselier try { 3572e778d10cSEric Fiselier#endif 3573e778d10cSEric Fiselier for (; __idx != __last; ++__idx) 3574e778d10cSEric Fiselier ::new((void*)_VSTD::addressof(*__idx)) _Vt; 3575e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3576e778d10cSEric Fiselier } catch (...) { 3577e778d10cSEric Fiselier _VSTD::destroy(__first, __idx); 3578e778d10cSEric Fiselier throw; 3579e778d10cSEric Fiselier } 3580e778d10cSEric Fiselier#endif 3581e778d10cSEric Fiselier} 3582e778d10cSEric Fiselier 3583e778d10cSEric Fiseliertemplate <class _ForwardIterator, class _Size> 3584e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3585e778d10cSEric Fiselier_ForwardIterator uninitialized_default_construct_n(_ForwardIterator __first, _Size __n) { 3586e778d10cSEric Fiselier using _Vt = typename iterator_traits<_ForwardIterator>::value_type; 3587e778d10cSEric Fiselier auto __idx = __first; 3588e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3589e778d10cSEric Fiselier try { 3590e778d10cSEric Fiselier#endif 3591e778d10cSEric Fiselier for (; __n > 0; (void)++__idx, --__n) 3592e778d10cSEric Fiselier ::new((void*)_VSTD::addressof(*__idx)) _Vt; 3593e778d10cSEric Fiselier return __idx; 3594e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3595e778d10cSEric Fiselier } catch (...) { 3596e778d10cSEric Fiselier _VSTD::destroy(__first, __idx); 3597e778d10cSEric Fiselier throw; 3598e778d10cSEric Fiselier } 3599e778d10cSEric Fiselier#endif 3600e778d10cSEric Fiselier} 3601e778d10cSEric Fiselier 3602e778d10cSEric Fiselier 3603e778d10cSEric Fiseliertemplate <class _ForwardIterator> 3604e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3605e778d10cSEric Fiseliervoid uninitialized_value_construct(_ForwardIterator __first, _ForwardIterator __last) { 3606e778d10cSEric Fiselier using _Vt = typename iterator_traits<_ForwardIterator>::value_type; 3607e778d10cSEric Fiselier auto __idx = __first; 3608e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3609e778d10cSEric Fiselier try { 3610e778d10cSEric Fiselier#endif 3611e778d10cSEric Fiselier for (; __idx != __last; ++__idx) 3612e778d10cSEric Fiselier ::new((void*)_VSTD::addressof(*__idx)) _Vt(); 3613e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3614e778d10cSEric Fiselier } catch (...) { 3615e778d10cSEric Fiselier _VSTD::destroy(__first, __idx); 3616e778d10cSEric Fiselier throw; 3617e778d10cSEric Fiselier } 3618e778d10cSEric Fiselier#endif 3619e778d10cSEric Fiselier} 3620e778d10cSEric Fiselier 3621e778d10cSEric Fiseliertemplate <class _ForwardIterator, class _Size> 3622e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3623e778d10cSEric Fiselier_ForwardIterator uninitialized_value_construct_n(_ForwardIterator __first, _Size __n) { 3624e778d10cSEric Fiselier using _Vt = typename iterator_traits<_ForwardIterator>::value_type; 3625e778d10cSEric Fiselier auto __idx = __first; 3626e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3627e778d10cSEric Fiselier try { 3628e778d10cSEric Fiselier#endif 3629e778d10cSEric Fiselier for (; __n > 0; (void)++__idx, --__n) 3630e778d10cSEric Fiselier ::new((void*)_VSTD::addressof(*__idx)) _Vt(); 3631e778d10cSEric Fiselier return __idx; 3632e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3633e778d10cSEric Fiselier } catch (...) { 3634e778d10cSEric Fiselier _VSTD::destroy(__first, __idx); 3635e778d10cSEric Fiselier throw; 3636e778d10cSEric Fiselier } 3637e778d10cSEric Fiselier#endif 3638e778d10cSEric Fiselier} 3639e778d10cSEric Fiselier 3640e778d10cSEric Fiselier 3641e778d10cSEric Fiseliertemplate <class _InputIt, class _ForwardIt> 3642e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3643e778d10cSEric Fiselier_ForwardIt uninitialized_move(_InputIt __first, _InputIt __last, _ForwardIt __first_res) { 3644e778d10cSEric Fiselier using _Vt = typename iterator_traits<_ForwardIt>::value_type; 3645e778d10cSEric Fiselier auto __idx = __first_res; 3646e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3647e778d10cSEric Fiselier try { 3648e778d10cSEric Fiselier#endif 3649e778d10cSEric Fiselier for (; __first != __last; (void)++__idx, ++__first) 3650e778d10cSEric Fiselier ::new((void*)_VSTD::addressof(*__idx)) _Vt(std::move(*__first)); 3651e778d10cSEric Fiselier return __idx; 3652e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3653e778d10cSEric Fiselier } catch (...) { 3654e778d10cSEric Fiselier _VSTD::destroy(__first_res, __idx); 3655e778d10cSEric Fiselier throw; 3656e778d10cSEric Fiselier } 3657e778d10cSEric Fiselier#endif 3658e778d10cSEric Fiselier} 3659e778d10cSEric Fiselier 3660e778d10cSEric Fiseliertemplate <class _InputIt, class _Size, class _ForwardIt> 3661e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3662e778d10cSEric Fiselierpair<_InputIt, _ForwardIt> 3663e778d10cSEric Fiselieruninitialized_move_n(_InputIt __first, _Size __n, _ForwardIt __first_res) { 3664e778d10cSEric Fiselier using _Vt = typename iterator_traits<_ForwardIt>::value_type; 3665e778d10cSEric Fiselier auto __idx = __first_res; 3666e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3667e778d10cSEric Fiselier try { 3668e778d10cSEric Fiselier#endif 3669e778d10cSEric Fiselier for (; __n > 0; ++__idx, (void)++__first, --__n) 3670e778d10cSEric Fiselier ::new((void*)_VSTD::addressof(*__idx)) _Vt(std::move(*__first)); 3671e778d10cSEric Fiselier return {__first, __idx}; 3672e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3673e778d10cSEric Fiselier } catch (...) { 3674e778d10cSEric Fiselier _VSTD::destroy(__first_res, __idx); 3675e778d10cSEric Fiselier throw; 3676e778d10cSEric Fiselier } 3677e778d10cSEric Fiselier#endif 3678e778d10cSEric Fiselier} 3679e778d10cSEric Fiselier 3680e778d10cSEric Fiselier 3681e4d9c316SEric Fiselier#endif // _LIBCPP_STD_VER > 14 3682e4d9c316SEric Fiselier 3683848a5374SHoward Hinnantclass _LIBCPP_EXCEPTION_ABI bad_weak_ptr 36843e519524SHoward Hinnant : public std::exception 36853e519524SHoward Hinnant{ 36863e519524SHoward Hinnantpublic: 36873739fe79SHoward Hinnant virtual ~bad_weak_ptr() _NOEXCEPT; 36883739fe79SHoward Hinnant virtual const char* what() const _NOEXCEPT; 36893e519524SHoward Hinnant}; 36903e519524SHoward Hinnant 3691d437fa5cSMarshall Clow_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE 3692d437fa5cSMarshall Clowvoid __throw_bad_weak_ptr() 3693d437fa5cSMarshall Clow{ 3694d437fa5cSMarshall Clow#ifndef _LIBCPP_NO_EXCEPTIONS 3695d437fa5cSMarshall Clow throw bad_weak_ptr(); 3696d437fa5cSMarshall Clow#else 3697d437fa5cSMarshall Clow _VSTD::abort(); 3698d437fa5cSMarshall Clow#endif 3699d437fa5cSMarshall Clow} 3700d437fa5cSMarshall Clow 3701e2f2d1edSEric Fiseliertemplate<class _Tp> class _LIBCPP_TEMPLATE_VIS weak_ptr; 37023e519524SHoward Hinnant 3703f0544c20SHoward Hinnantclass _LIBCPP_TYPE_VIS __shared_count 37043e519524SHoward Hinnant{ 37053e519524SHoward Hinnant __shared_count(const __shared_count&); 37063e519524SHoward Hinnant __shared_count& operator=(const __shared_count&); 37073e519524SHoward Hinnant 37083e519524SHoward Hinnantprotected: 37093e519524SHoward Hinnant long __shared_owners_; 37103e519524SHoward Hinnant virtual ~__shared_count(); 37113e519524SHoward Hinnantprivate: 37123739fe79SHoward Hinnant virtual void __on_zero_shared() _NOEXCEPT = 0; 37133e519524SHoward Hinnant 37143e519524SHoward Hinnantpublic: 3715848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 37163739fe79SHoward Hinnant explicit __shared_count(long __refs = 0) _NOEXCEPT 37173e519524SHoward Hinnant : __shared_owners_(__refs) {} 37183e519524SHoward Hinnant 37193739fe79SHoward Hinnant void __add_shared() _NOEXCEPT; 37203739fe79SHoward Hinnant bool __release_shared() _NOEXCEPT; 3721848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 37221faf289eSEric Fiselier long use_count() const _NOEXCEPT { 37231faf289eSEric Fiselier return __libcpp_relaxed_load(&__shared_owners_) + 1; 37241faf289eSEric Fiselier } 37253e519524SHoward Hinnant}; 37263e519524SHoward Hinnant 3727f0544c20SHoward Hinnantclass _LIBCPP_TYPE_VIS __shared_weak_count 37283e519524SHoward Hinnant : private __shared_count 37293e519524SHoward Hinnant{ 37303e519524SHoward Hinnant long __shared_weak_owners_; 37313e519524SHoward Hinnant 37323e519524SHoward Hinnantpublic: 3733848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 37343739fe79SHoward Hinnant explicit __shared_weak_count(long __refs = 0) _NOEXCEPT 37353e519524SHoward Hinnant : __shared_count(__refs), 37363e519524SHoward Hinnant __shared_weak_owners_(__refs) {} 37373e519524SHoward Hinnantprotected: 37383e519524SHoward Hinnant virtual ~__shared_weak_count(); 37393e519524SHoward Hinnant 37403e519524SHoward Hinnantpublic: 37413739fe79SHoward Hinnant void __add_shared() _NOEXCEPT; 37423739fe79SHoward Hinnant void __add_weak() _NOEXCEPT; 37433739fe79SHoward Hinnant void __release_shared() _NOEXCEPT; 37443739fe79SHoward Hinnant void __release_weak() _NOEXCEPT; 3745848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 37463739fe79SHoward Hinnant long use_count() const _NOEXCEPT {return __shared_count::use_count();} 37473739fe79SHoward Hinnant __shared_weak_count* lock() _NOEXCEPT; 37483e519524SHoward Hinnant 3749a9f69800SHoward Hinnant // Define the function out only if we build static libc++ without RTTI. 3750a9f69800SHoward Hinnant // Otherwise we may break clients who need to compile their projects with 3751a9f69800SHoward Hinnant // -fno-rtti and yet link against a libc++.dylib compiled 3752a9f69800SHoward Hinnant // without -fno-rtti. 3753a9f69800SHoward Hinnant#if !defined(_LIBCPP_NO_RTTI) || !defined(_LIBCPP_BUILD_STATIC) 37543739fe79SHoward Hinnant virtual const void* __get_deleter(const type_info&) const _NOEXCEPT; 3755a9f69800SHoward Hinnant#endif 37563e519524SHoward Hinnantprivate: 37573739fe79SHoward Hinnant virtual void __on_zero_shared_weak() _NOEXCEPT = 0; 37583e519524SHoward Hinnant}; 37593e519524SHoward Hinnant 37603e519524SHoward Hinnanttemplate <class _Tp, class _Dp, class _Alloc> 37613e519524SHoward Hinnantclass __shared_ptr_pointer 37623e519524SHoward Hinnant : public __shared_weak_count 37633e519524SHoward Hinnant{ 37643e519524SHoward Hinnant __compressed_pair<__compressed_pair<_Tp, _Dp>, _Alloc> __data_; 37653e519524SHoward Hinnantpublic: 3766848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 37673e519524SHoward Hinnant __shared_ptr_pointer(_Tp __p, _Dp __d, _Alloc __a) 3768ce48a113SHoward Hinnant : __data_(__compressed_pair<_Tp, _Dp>(__p, _VSTD::move(__d)), _VSTD::move(__a)) {} 37693e519524SHoward Hinnant 377054b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI 37713739fe79SHoward Hinnant virtual const void* __get_deleter(const type_info&) const _NOEXCEPT; 377254b409fdSHoward Hinnant#endif 37733e519524SHoward Hinnant 37743e519524SHoward Hinnantprivate: 37753739fe79SHoward Hinnant virtual void __on_zero_shared() _NOEXCEPT; 37763739fe79SHoward Hinnant virtual void __on_zero_shared_weak() _NOEXCEPT; 37773e519524SHoward Hinnant}; 37783e519524SHoward Hinnant 377954b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI 378054b409fdSHoward Hinnant 37813e519524SHoward Hinnanttemplate <class _Tp, class _Dp, class _Alloc> 37823e519524SHoward Hinnantconst void* 37833739fe79SHoward Hinnant__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__get_deleter(const type_info& __t) const _NOEXCEPT 37843e519524SHoward Hinnant{ 3785278ddec2SMarshall Clow return __t == typeid(_Dp) ? _VSTD::addressof(__data_.first().second()) : 0; 37863e519524SHoward Hinnant} 37873e519524SHoward Hinnant 3788b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_RTTI 378954b409fdSHoward Hinnant 37903e519524SHoward Hinnanttemplate <class _Tp, class _Dp, class _Alloc> 37913e519524SHoward Hinnantvoid 37923739fe79SHoward Hinnant__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__on_zero_shared() _NOEXCEPT 37933e519524SHoward Hinnant{ 37943e519524SHoward Hinnant __data_.first().second()(__data_.first().first()); 37953e519524SHoward Hinnant __data_.first().second().~_Dp(); 37963e519524SHoward Hinnant} 37973e519524SHoward Hinnant 37983e519524SHoward Hinnanttemplate <class _Tp, class _Dp, class _Alloc> 37993e519524SHoward Hinnantvoid 38003739fe79SHoward Hinnant__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__on_zero_shared_weak() _NOEXCEPT 38013e519524SHoward Hinnant{ 38026fe361c1SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, __shared_ptr_pointer>::type _Al; 38036fe361c1SEric Fiselier typedef allocator_traits<_Al> _ATraits; 3804319be722SEric Fiselier typedef pointer_traits<typename _ATraits::pointer> _PTraits; 3805319be722SEric Fiselier 38066fe361c1SEric Fiselier _Al __a(__data_.second()); 38073e519524SHoward Hinnant __data_.second().~_Alloc(); 3808319be722SEric Fiselier __a.deallocate(_PTraits::pointer_to(*this), 1); 38093e519524SHoward Hinnant} 38103e519524SHoward Hinnant 38113e519524SHoward Hinnanttemplate <class _Tp, class _Alloc> 38123e519524SHoward Hinnantclass __shared_ptr_emplace 38133e519524SHoward Hinnant : public __shared_weak_count 38143e519524SHoward Hinnant{ 38153e519524SHoward Hinnant __compressed_pair<_Alloc, _Tp> __data_; 38163e519524SHoward Hinnantpublic: 38173e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 38183e519524SHoward Hinnant 3819848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 38203e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a) 3821ce48a113SHoward Hinnant : __data_(_VSTD::move(__a)) {} 38223e519524SHoward Hinnant 38233e519524SHoward Hinnant template <class ..._Args> 3824848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 38253e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a, _Args&& ...__args) 3826a87b5e34SHoward Hinnant : __data_(piecewise_construct, _VSTD::forward_as_tuple(__a), 3827a87b5e34SHoward Hinnant _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)) {} 38283e519524SHoward Hinnant 38293e519524SHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 38303e519524SHoward Hinnant 3831848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 38323e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a) 38333e519524SHoward Hinnant : __data_(__a) {} 38343e519524SHoward Hinnant 38353e519524SHoward Hinnant template <class _A0> 3836848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 38373e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a, _A0& __a0) 38383e519524SHoward Hinnant : __data_(__a, _Tp(__a0)) {} 38393e519524SHoward Hinnant 38403e519524SHoward Hinnant template <class _A0, class _A1> 3841848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 38423e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a, _A0& __a0, _A1& __a1) 38433e519524SHoward Hinnant : __data_(__a, _Tp(__a0, __a1)) {} 38443e519524SHoward Hinnant 38453e519524SHoward Hinnant template <class _A0, class _A1, class _A2> 3846848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 38473e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a, _A0& __a0, _A1& __a1, _A2& __a2) 38483e519524SHoward Hinnant : __data_(__a, _Tp(__a0, __a1, __a2)) {} 38493e519524SHoward Hinnant 38503e519524SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 38513e519524SHoward Hinnant 38523e519524SHoward Hinnantprivate: 38533739fe79SHoward Hinnant virtual void __on_zero_shared() _NOEXCEPT; 38543739fe79SHoward Hinnant virtual void __on_zero_shared_weak() _NOEXCEPT; 38553e519524SHoward Hinnantpublic: 3856848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 38573739fe79SHoward Hinnant _Tp* get() _NOEXCEPT {return &__data_.second();} 38583e519524SHoward Hinnant}; 38593e519524SHoward Hinnant 38603e519524SHoward Hinnanttemplate <class _Tp, class _Alloc> 38613e519524SHoward Hinnantvoid 38623739fe79SHoward Hinnant__shared_ptr_emplace<_Tp, _Alloc>::__on_zero_shared() _NOEXCEPT 38633e519524SHoward Hinnant{ 38643e519524SHoward Hinnant __data_.second().~_Tp(); 38653e519524SHoward Hinnant} 38663e519524SHoward Hinnant 38673e519524SHoward Hinnanttemplate <class _Tp, class _Alloc> 38683e519524SHoward Hinnantvoid 38693739fe79SHoward Hinnant__shared_ptr_emplace<_Tp, _Alloc>::__on_zero_shared_weak() _NOEXCEPT 38703e519524SHoward Hinnant{ 38716fe361c1SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, __shared_ptr_emplace>::type _Al; 38726fe361c1SEric Fiselier typedef allocator_traits<_Al> _ATraits; 3873319be722SEric Fiselier typedef pointer_traits<typename _ATraits::pointer> _PTraits; 38746fe361c1SEric Fiselier _Al __a(__data_.first()); 38753e519524SHoward Hinnant __data_.first().~_Alloc(); 3876319be722SEric Fiselier __a.deallocate(_PTraits::pointer_to(*this), 1); 38773e519524SHoward Hinnant} 38783e519524SHoward Hinnant 3879e2f2d1edSEric Fiseliertemplate<class _Tp> class _LIBCPP_TEMPLATE_VIS enable_shared_from_this; 38803e519524SHoward Hinnant 38813e519524SHoward Hinnanttemplate<class _Tp> 3882e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS shared_ptr 38833e519524SHoward Hinnant{ 38843e519524SHoward Hinnantpublic: 38853e519524SHoward Hinnant typedef _Tp element_type; 388668436a9bSEric Fiselier#if _LIBCPP_STD_VER > 14 388768436a9bSEric Fiselier typedef weak_ptr<_Tp> weak_type; 388868436a9bSEric Fiselier#endif 38893e519524SHoward Hinnantprivate: 38903e519524SHoward Hinnant element_type* __ptr_; 38913e519524SHoward Hinnant __shared_weak_count* __cntrl_; 38923e519524SHoward Hinnant 38933e519524SHoward Hinnant struct __nat {int __for_bool_;}; 38943e519524SHoward Hinnantpublic: 3895906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 3896c0937e8aSHoward Hinnant _LIBCPP_CONSTEXPR shared_ptr() _NOEXCEPT; 3897906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 3898c0937e8aSHoward Hinnant _LIBCPP_CONSTEXPR shared_ptr(nullptr_t) _NOEXCEPT; 389922747e62SLogan Chien template<class _Yp> 390022747e62SLogan Chien explicit shared_ptr(_Yp* __p, 390122747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat()); 390222747e62SLogan Chien template<class _Yp, class _Dp> 390322747e62SLogan Chien shared_ptr(_Yp* __p, _Dp __d, 390422747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat()); 390522747e62SLogan Chien template<class _Yp, class _Dp, class _Alloc> 390622747e62SLogan Chien shared_ptr(_Yp* __p, _Dp __d, _Alloc __a, 390722747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat()); 39083e519524SHoward Hinnant template <class _Dp> shared_ptr(nullptr_t __p, _Dp __d); 39093e519524SHoward Hinnant template <class _Dp, class _Alloc> shared_ptr(nullptr_t __p, _Dp __d, _Alloc __a); 3910906c872dSEvgeniy Stepanov template<class _Yp> _LIBCPP_INLINE_VISIBILITY shared_ptr(const shared_ptr<_Yp>& __r, element_type* __p) _NOEXCEPT; 3911906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 39123739fe79SHoward Hinnant shared_ptr(const shared_ptr& __r) _NOEXCEPT; 39133e519524SHoward Hinnant template<class _Yp> 3914906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 39153e519524SHoward Hinnant shared_ptr(const shared_ptr<_Yp>& __r, 39163739fe79SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type = __nat()) 39173739fe79SHoward Hinnant _NOEXCEPT; 39187609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 3919906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 39203739fe79SHoward Hinnant shared_ptr(shared_ptr&& __r) _NOEXCEPT; 3921906c872dSEvgeniy Stepanov template<class _Yp> _LIBCPP_INLINE_VISIBILITY shared_ptr(shared_ptr<_Yp>&& __r, 39223739fe79SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type = __nat()) 39233739fe79SHoward Hinnant _NOEXCEPT; 39247609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 39253e519524SHoward Hinnant template<class _Yp> explicit shared_ptr(const weak_ptr<_Yp>& __r, 39263e519524SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type= __nat()); 39277609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 392822747e62SLogan Chien template<class _Yp> 392922747e62SLogan Chien shared_ptr(auto_ptr<_Yp>&& __r, 393022747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat()); 3931b3371f6fSHoward Hinnant#else 393222747e62SLogan Chien template<class _Yp> 393322747e62SLogan Chien shared_ptr(auto_ptr<_Yp> __r, 393422747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat()); 39353e519524SHoward Hinnant#endif 39367609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 393722747e62SLogan Chien template <class _Yp, class _Dp> 39388e25104bSHoward Hinnant shared_ptr(unique_ptr<_Yp, _Dp>&&, 393922747e62SLogan Chien typename enable_if 39408e25104bSHoward Hinnant < 394122747e62SLogan Chien !is_lvalue_reference<_Dp>::value && 39428e25104bSHoward Hinnant !is_array<_Yp>::value && 394322747e62SLogan Chien is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 394422747e62SLogan Chien __nat 394522747e62SLogan Chien >::type = __nat()); 394622747e62SLogan Chien template <class _Yp, class _Dp> 39478e25104bSHoward Hinnant shared_ptr(unique_ptr<_Yp, _Dp>&&, 394822747e62SLogan Chien typename enable_if 394922747e62SLogan Chien < 395022747e62SLogan Chien is_lvalue_reference<_Dp>::value && 395122747e62SLogan Chien !is_array<_Yp>::value && 395222747e62SLogan Chien is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 395322747e62SLogan Chien __nat 395422747e62SLogan Chien >::type = __nat()); 39557609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 395622747e62SLogan Chien template <class _Yp, class _Dp> 39578e25104bSHoward Hinnant shared_ptr(unique_ptr<_Yp, _Dp>, 395822747e62SLogan Chien typename enable_if 395922747e62SLogan Chien < 396022747e62SLogan Chien !is_lvalue_reference<_Dp>::value && 396122747e62SLogan Chien !is_array<_Yp>::value && 396222747e62SLogan Chien is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 396322747e62SLogan Chien __nat 396422747e62SLogan Chien >::type = __nat()); 396522747e62SLogan Chien template <class _Yp, class _Dp> 396622747e62SLogan Chien shared_ptr(unique_ptr<_Yp, _Dp>, 396722747e62SLogan Chien typename enable_if 396822747e62SLogan Chien < 396922747e62SLogan Chien is_lvalue_reference<_Dp>::value && 397022747e62SLogan Chien !is_array<_Yp>::value && 397122747e62SLogan Chien is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 397222747e62SLogan Chien __nat 397322747e62SLogan Chien >::type = __nat()); 39747609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 39753e519524SHoward Hinnant 39763e519524SHoward Hinnant ~shared_ptr(); 39773e519524SHoward Hinnant 3978906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 39793739fe79SHoward Hinnant shared_ptr& operator=(const shared_ptr& __r) _NOEXCEPT; 39808e25104bSHoward Hinnant template<class _Yp> 39818e25104bSHoward Hinnant typename enable_if 39828e25104bSHoward Hinnant < 39838e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 39848e25104bSHoward Hinnant shared_ptr& 39858e25104bSHoward Hinnant >::type 3986906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 39878e25104bSHoward Hinnant operator=(const shared_ptr<_Yp>& __r) _NOEXCEPT; 39887609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 3989906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 39903739fe79SHoward Hinnant shared_ptr& operator=(shared_ptr&& __r) _NOEXCEPT; 39918e25104bSHoward Hinnant template<class _Yp> 39928e25104bSHoward Hinnant typename enable_if 39938e25104bSHoward Hinnant < 39948e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 39958e25104bSHoward Hinnant shared_ptr<_Tp>& 39968e25104bSHoward Hinnant >::type 3997906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 39988e25104bSHoward Hinnant operator=(shared_ptr<_Yp>&& __r); 39998e25104bSHoward Hinnant template<class _Yp> 400089dd1dd2SEric Fiselier _LIBCPP_INLINE_VISIBILITY 40018e25104bSHoward Hinnant typename enable_if 40028e25104bSHoward Hinnant < 40038e25104bSHoward Hinnant !is_array<_Yp>::value && 40048e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 400584f996fbSHoward Hinnant shared_ptr 400684f996fbSHoward Hinnant >::type& 40078e25104bSHoward Hinnant operator=(auto_ptr<_Yp>&& __r); 40087609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 40098e25104bSHoward Hinnant template<class _Yp> 401089dd1dd2SEric Fiselier _LIBCPP_INLINE_VISIBILITY 40118e25104bSHoward Hinnant typename enable_if 40128e25104bSHoward Hinnant < 40138e25104bSHoward Hinnant !is_array<_Yp>::value && 40148e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 40158e25104bSHoward Hinnant shared_ptr& 40168e25104bSHoward Hinnant >::type 40178e25104bSHoward Hinnant operator=(auto_ptr<_Yp> __r); 40183e519524SHoward Hinnant#endif 40198e25104bSHoward Hinnant template <class _Yp, class _Dp> 40208e25104bSHoward Hinnant typename enable_if 40218e25104bSHoward Hinnant < 40228e25104bSHoward Hinnant !is_array<_Yp>::value && 40238e25104bSHoward Hinnant is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 40248e25104bSHoward Hinnant shared_ptr& 40258e25104bSHoward Hinnant >::type 40267609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 4027906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 40288e25104bSHoward Hinnant operator=(unique_ptr<_Yp, _Dp>&& __r); 40297609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 403002b8e949SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 40318e25104bSHoward Hinnant operator=(unique_ptr<_Yp, _Dp> __r); 40323e519524SHoward Hinnant#endif 40333e519524SHoward Hinnant 4034906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 40353739fe79SHoward Hinnant void swap(shared_ptr& __r) _NOEXCEPT; 4036906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 40373739fe79SHoward Hinnant void reset() _NOEXCEPT; 40388e25104bSHoward Hinnant template<class _Yp> 40398e25104bSHoward Hinnant typename enable_if 40408e25104bSHoward Hinnant < 40418e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 40428e25104bSHoward Hinnant void 40438e25104bSHoward Hinnant >::type 4044906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 40458e25104bSHoward Hinnant reset(_Yp* __p); 40468e25104bSHoward Hinnant template<class _Yp, class _Dp> 40478e25104bSHoward Hinnant typename enable_if 40488e25104bSHoward Hinnant < 40498e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 40508e25104bSHoward Hinnant void 40518e25104bSHoward Hinnant >::type 4052906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 40538e25104bSHoward Hinnant reset(_Yp* __p, _Dp __d); 40548e25104bSHoward Hinnant template<class _Yp, class _Dp, class _Alloc> 40558e25104bSHoward Hinnant typename enable_if 40568e25104bSHoward Hinnant < 40578e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 40588e25104bSHoward Hinnant void 40598e25104bSHoward Hinnant >::type 4060906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 40618e25104bSHoward Hinnant reset(_Yp* __p, _Dp __d, _Alloc __a); 40623e519524SHoward Hinnant 4063848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 40643739fe79SHoward Hinnant element_type* get() const _NOEXCEPT {return __ptr_;} 4065848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 40663739fe79SHoward Hinnant typename add_lvalue_reference<element_type>::type operator*() const _NOEXCEPT 40673739fe79SHoward Hinnant {return *__ptr_;} 4068848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 40693739fe79SHoward Hinnant element_type* operator->() const _NOEXCEPT {return __ptr_;} 4070848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 40713739fe79SHoward Hinnant long use_count() const _NOEXCEPT {return __cntrl_ ? __cntrl_->use_count() : 0;} 4072848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 40733739fe79SHoward Hinnant bool unique() const _NOEXCEPT {return use_count() == 1;} 4074848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4075f2f2d8b9SHoward Hinnant _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT {return get() != 0;} 4076c003db1fSHoward Hinnant template <class _Up> 4077848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4078c003db1fSHoward Hinnant bool owner_before(shared_ptr<_Up> const& __p) const 40793e519524SHoward Hinnant {return __cntrl_ < __p.__cntrl_;} 4080c003db1fSHoward Hinnant template <class _Up> 4081848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4082c003db1fSHoward Hinnant bool owner_before(weak_ptr<_Up> const& __p) const 40833e519524SHoward Hinnant {return __cntrl_ < __p.__cntrl_;} 4084d77851e8SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4085d77851e8SHoward Hinnant bool 4086d77851e8SHoward Hinnant __owner_equivalent(const shared_ptr& __p) const 4087d77851e8SHoward Hinnant {return __cntrl_ == __p.__cntrl_;} 40883e519524SHoward Hinnant 408954b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI 40903e519524SHoward Hinnant template <class _Dp> 4091848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 40923739fe79SHoward Hinnant _Dp* __get_deleter() const _NOEXCEPT 40933e519524SHoward Hinnant {return (_Dp*)(__cntrl_ ? __cntrl_->__get_deleter(typeid(_Dp)) : 0);} 4094b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_RTTI 40953e519524SHoward Hinnant 40963e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 40973e519524SHoward Hinnant 40983e519524SHoward Hinnant template<class ..._Args> 40993e519524SHoward Hinnant static 41003e519524SHoward Hinnant shared_ptr<_Tp> 41013e519524SHoward Hinnant make_shared(_Args&& ...__args); 41023e519524SHoward Hinnant 41033e519524SHoward Hinnant template<class _Alloc, class ..._Args> 41043e519524SHoward Hinnant static 41053e519524SHoward Hinnant shared_ptr<_Tp> 41063e519524SHoward Hinnant allocate_shared(const _Alloc& __a, _Args&& ...__args); 41073e519524SHoward Hinnant 41083e519524SHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 41093e519524SHoward Hinnant 41103e519524SHoward Hinnant static shared_ptr<_Tp> make_shared(); 41113e519524SHoward Hinnant 41123e519524SHoward Hinnant template<class _A0> 41133e519524SHoward Hinnant static shared_ptr<_Tp> make_shared(_A0&); 41143e519524SHoward Hinnant 41153e519524SHoward Hinnant template<class _A0, class _A1> 41163e519524SHoward Hinnant static shared_ptr<_Tp> make_shared(_A0&, _A1&); 41173e519524SHoward Hinnant 41183e519524SHoward Hinnant template<class _A0, class _A1, class _A2> 41193e519524SHoward Hinnant static shared_ptr<_Tp> make_shared(_A0&, _A1&, _A2&); 41203e519524SHoward Hinnant 41213e519524SHoward Hinnant template<class _Alloc> 41223e519524SHoward Hinnant static shared_ptr<_Tp> 41233e519524SHoward Hinnant allocate_shared(const _Alloc& __a); 41243e519524SHoward Hinnant 41253e519524SHoward Hinnant template<class _Alloc, class _A0> 41263e519524SHoward Hinnant static shared_ptr<_Tp> 41273e519524SHoward Hinnant allocate_shared(const _Alloc& __a, _A0& __a0); 41283e519524SHoward Hinnant 41293e519524SHoward Hinnant template<class _Alloc, class _A0, class _A1> 41303e519524SHoward Hinnant static shared_ptr<_Tp> 41313e519524SHoward Hinnant allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1); 41323e519524SHoward Hinnant 41333e519524SHoward Hinnant template<class _Alloc, class _A0, class _A1, class _A2> 41343e519524SHoward Hinnant static shared_ptr<_Tp> 41353e519524SHoward Hinnant allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1, _A2& __a2); 41363e519524SHoward Hinnant 41373e519524SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 41383e519524SHoward Hinnant 41393e519524SHoward Hinnantprivate: 41403e519524SHoward Hinnant 414139005d30SEric Fiselier template <class _Yp, class _OrigPtr> 4142848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 41433e519524SHoward Hinnant void 414439005d30SEric Fiselier __enable_weak_this(const enable_shared_from_this<_Yp>* __e, 414539005d30SEric Fiselier _OrigPtr* __ptr) _NOEXCEPT 41463e519524SHoward Hinnant { 414739005d30SEric Fiselier typedef typename remove_cv<_Yp>::type _RawYp; 414888f5bfdcSEric Fiselier if (__e && __e->__weak_this_.expired()) 414955112defSMarshall Clow { 415039005d30SEric Fiselier __e->__weak_this_ = shared_ptr<_RawYp>(*this, 415139005d30SEric Fiselier const_cast<_RawYp*>(static_cast<const _Yp*>(__ptr))); 415255112defSMarshall Clow } 41533e519524SHoward Hinnant } 41543e519524SHoward Hinnant 4155848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 415639005d30SEric Fiselier void __enable_weak_this(const volatile void*, const volatile void*) _NOEXCEPT {} 41573e519524SHoward Hinnant 4158e2f2d1edSEric Fiselier template <class _Up> friend class _LIBCPP_TEMPLATE_VIS shared_ptr; 4159e2f2d1edSEric Fiselier template <class _Up> friend class _LIBCPP_TEMPLATE_VIS weak_ptr; 41603e519524SHoward Hinnant}; 41613e519524SHoward Hinnant 41623e519524SHoward Hinnanttemplate<class _Tp> 4163906c872dSEvgeniy Stepanovinline 4164c0937e8aSHoward Hinnant_LIBCPP_CONSTEXPR 41653739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr() _NOEXCEPT 41663e519524SHoward Hinnant : __ptr_(0), 41673e519524SHoward Hinnant __cntrl_(0) 41683e519524SHoward Hinnant{ 41693e519524SHoward Hinnant} 41703e519524SHoward Hinnant 41713e519524SHoward Hinnanttemplate<class _Tp> 4172906c872dSEvgeniy Stepanovinline 4173c0937e8aSHoward Hinnant_LIBCPP_CONSTEXPR 41743739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr(nullptr_t) _NOEXCEPT 41753e519524SHoward Hinnant : __ptr_(0), 41763e519524SHoward Hinnant __cntrl_(0) 41773e519524SHoward Hinnant{ 41783e519524SHoward Hinnant} 41793e519524SHoward Hinnant 41803e519524SHoward Hinnanttemplate<class _Tp> 418122747e62SLogan Chientemplate<class _Yp> 418222747e62SLogan Chienshared_ptr<_Tp>::shared_ptr(_Yp* __p, 418322747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type) 41843e519524SHoward Hinnant : __ptr_(__p) 41853e519524SHoward Hinnant{ 41863e519524SHoward Hinnant unique_ptr<_Yp> __hold(__p); 41873e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, default_delete<_Yp>, allocator<_Yp> > _CntrlBlk; 41883e519524SHoward Hinnant __cntrl_ = new _CntrlBlk(__p, default_delete<_Yp>(), allocator<_Yp>()); 41893e519524SHoward Hinnant __hold.release(); 419039005d30SEric Fiselier __enable_weak_this(__p, __p); 41913e519524SHoward Hinnant} 41923e519524SHoward Hinnant 41933e519524SHoward Hinnanttemplate<class _Tp> 419422747e62SLogan Chientemplate<class _Yp, class _Dp> 419522747e62SLogan Chienshared_ptr<_Tp>::shared_ptr(_Yp* __p, _Dp __d, 419622747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type) 41973e519524SHoward Hinnant : __ptr_(__p) 41983e519524SHoward Hinnant{ 41993e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 42003e519524SHoward Hinnant try 42013e519524SHoward Hinnant { 4202b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 42033e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, _Dp, allocator<_Yp> > _CntrlBlk; 42043e519524SHoward Hinnant __cntrl_ = new _CntrlBlk(__p, __d, allocator<_Yp>()); 420539005d30SEric Fiselier __enable_weak_this(__p, __p); 42063e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 42073e519524SHoward Hinnant } 42083e519524SHoward Hinnant catch (...) 42093e519524SHoward Hinnant { 42103e519524SHoward Hinnant __d(__p); 42113e519524SHoward Hinnant throw; 42123e519524SHoward Hinnant } 4213b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 42143e519524SHoward Hinnant} 42153e519524SHoward Hinnant 42163e519524SHoward Hinnanttemplate<class _Tp> 42173e519524SHoward Hinnanttemplate<class _Dp> 42183e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(nullptr_t __p, _Dp __d) 42193e519524SHoward Hinnant : __ptr_(0) 42203e519524SHoward Hinnant{ 42213e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 42223e519524SHoward Hinnant try 42233e519524SHoward Hinnant { 4224b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 42253e519524SHoward Hinnant typedef __shared_ptr_pointer<nullptr_t, _Dp, allocator<_Tp> > _CntrlBlk; 42263e519524SHoward Hinnant __cntrl_ = new _CntrlBlk(__p, __d, allocator<_Tp>()); 42273e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 42283e519524SHoward Hinnant } 42293e519524SHoward Hinnant catch (...) 42303e519524SHoward Hinnant { 42313e519524SHoward Hinnant __d(__p); 42323e519524SHoward Hinnant throw; 42333e519524SHoward Hinnant } 4234b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 42353e519524SHoward Hinnant} 42363e519524SHoward Hinnant 42373e519524SHoward Hinnanttemplate<class _Tp> 423822747e62SLogan Chientemplate<class _Yp, class _Dp, class _Alloc> 423922747e62SLogan Chienshared_ptr<_Tp>::shared_ptr(_Yp* __p, _Dp __d, _Alloc __a, 424022747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type) 42413e519524SHoward Hinnant : __ptr_(__p) 42423e519524SHoward Hinnant{ 42433e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 42443e519524SHoward Hinnant try 42453e519524SHoward Hinnant { 4246b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 42473e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, _Dp, _Alloc> _CntrlBlk; 4248319be722SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _A2; 42493e519524SHoward Hinnant typedef __allocator_destructor<_A2> _D2; 42503e519524SHoward Hinnant _A2 __a2(__a); 42513e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); 4252319be722SEric Fiselier ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4253319be722SEric Fiselier _CntrlBlk(__p, __d, __a); 4254319be722SEric Fiselier __cntrl_ = _VSTD::addressof(*__hold2.release()); 425539005d30SEric Fiselier __enable_weak_this(__p, __p); 42563e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 42573e519524SHoward Hinnant } 42583e519524SHoward Hinnant catch (...) 42593e519524SHoward Hinnant { 42603e519524SHoward Hinnant __d(__p); 42613e519524SHoward Hinnant throw; 42623e519524SHoward Hinnant } 4263b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 42643e519524SHoward Hinnant} 42653e519524SHoward Hinnant 42663e519524SHoward Hinnanttemplate<class _Tp> 42673e519524SHoward Hinnanttemplate<class _Dp, class _Alloc> 42683e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(nullptr_t __p, _Dp __d, _Alloc __a) 42693e519524SHoward Hinnant : __ptr_(0) 42703e519524SHoward Hinnant{ 42713e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 42723e519524SHoward Hinnant try 42733e519524SHoward Hinnant { 4274b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 42753e519524SHoward Hinnant typedef __shared_ptr_pointer<nullptr_t, _Dp, _Alloc> _CntrlBlk; 4276319be722SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _A2; 42773e519524SHoward Hinnant typedef __allocator_destructor<_A2> _D2; 42783e519524SHoward Hinnant _A2 __a2(__a); 42793e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); 4280319be722SEric Fiselier ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4281319be722SEric Fiselier _CntrlBlk(__p, __d, __a); 4282319be722SEric Fiselier __cntrl_ = _VSTD::addressof(*__hold2.release()); 42833e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 42843e519524SHoward Hinnant } 42853e519524SHoward Hinnant catch (...) 42863e519524SHoward Hinnant { 42873e519524SHoward Hinnant __d(__p); 42883e519524SHoward Hinnant throw; 42893e519524SHoward Hinnant } 4290b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 42913e519524SHoward Hinnant} 42923e519524SHoward Hinnant 42933e519524SHoward Hinnanttemplate<class _Tp> 42943e519524SHoward Hinnanttemplate<class _Yp> 4295906c872dSEvgeniy Stepanovinline 42963739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr(const shared_ptr<_Yp>& __r, element_type *__p) _NOEXCEPT 42973e519524SHoward Hinnant : __ptr_(__p), 42983e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 42993e519524SHoward Hinnant{ 43003e519524SHoward Hinnant if (__cntrl_) 43013e519524SHoward Hinnant __cntrl_->__add_shared(); 43023e519524SHoward Hinnant} 43033e519524SHoward Hinnant 43043e519524SHoward Hinnanttemplate<class _Tp> 4305906c872dSEvgeniy Stepanovinline 43063739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr(const shared_ptr& __r) _NOEXCEPT 43073e519524SHoward Hinnant : __ptr_(__r.__ptr_), 43083e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 43093e519524SHoward Hinnant{ 43103e519524SHoward Hinnant if (__cntrl_) 43113e519524SHoward Hinnant __cntrl_->__add_shared(); 43123e519524SHoward Hinnant} 43133e519524SHoward Hinnant 43143e519524SHoward Hinnanttemplate<class _Tp> 43153e519524SHoward Hinnanttemplate<class _Yp> 4316906c872dSEvgeniy Stepanovinline 43173e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(const shared_ptr<_Yp>& __r, 43183e519524SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type) 43193739fe79SHoward Hinnant _NOEXCEPT 43203e519524SHoward Hinnant : __ptr_(__r.__ptr_), 43213e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 43223e519524SHoward Hinnant{ 43233e519524SHoward Hinnant if (__cntrl_) 43243e519524SHoward Hinnant __cntrl_->__add_shared(); 43253e519524SHoward Hinnant} 43263e519524SHoward Hinnant 43277609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 43283e519524SHoward Hinnant 43293e519524SHoward Hinnanttemplate<class _Tp> 4330906c872dSEvgeniy Stepanovinline 43313739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr(shared_ptr&& __r) _NOEXCEPT 43323e519524SHoward Hinnant : __ptr_(__r.__ptr_), 43333e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 43343e519524SHoward Hinnant{ 43353e519524SHoward Hinnant __r.__ptr_ = 0; 43363e519524SHoward Hinnant __r.__cntrl_ = 0; 43373e519524SHoward Hinnant} 43383e519524SHoward Hinnant 43393e519524SHoward Hinnanttemplate<class _Tp> 43403e519524SHoward Hinnanttemplate<class _Yp> 4341906c872dSEvgeniy Stepanovinline 43423e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(shared_ptr<_Yp>&& __r, 43433e519524SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type) 43443739fe79SHoward Hinnant _NOEXCEPT 43453e519524SHoward Hinnant : __ptr_(__r.__ptr_), 43463e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 43473e519524SHoward Hinnant{ 43483e519524SHoward Hinnant __r.__ptr_ = 0; 43493e519524SHoward Hinnant __r.__cntrl_ = 0; 43503e519524SHoward Hinnant} 43513e519524SHoward Hinnant 43527609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 43533e519524SHoward Hinnant 43543e519524SHoward Hinnanttemplate<class _Tp> 435522747e62SLogan Chientemplate<class _Yp> 43567609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 435722747e62SLogan Chienshared_ptr<_Tp>::shared_ptr(auto_ptr<_Yp>&& __r, 43583e519524SHoward Hinnant#else 435922747e62SLogan Chienshared_ptr<_Tp>::shared_ptr(auto_ptr<_Yp> __r, 43603e519524SHoward Hinnant#endif 436122747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type) 43623e519524SHoward Hinnant : __ptr_(__r.get()) 43633e519524SHoward Hinnant{ 43643e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, default_delete<_Yp>, allocator<_Yp> > _CntrlBlk; 43653e519524SHoward Hinnant __cntrl_ = new _CntrlBlk(__r.get(), default_delete<_Yp>(), allocator<_Yp>()); 436639005d30SEric Fiselier __enable_weak_this(__r.get(), __r.get()); 43673e519524SHoward Hinnant __r.release(); 43683e519524SHoward Hinnant} 43693e519524SHoward Hinnant 43703e519524SHoward Hinnanttemplate<class _Tp> 437122747e62SLogan Chientemplate <class _Yp, class _Dp> 43727609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 43733e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp>&& __r, 43743e519524SHoward Hinnant#else 43753e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp> __r, 43763e519524SHoward Hinnant#endif 437722747e62SLogan Chien typename enable_if 437822747e62SLogan Chien < 437922747e62SLogan Chien !is_lvalue_reference<_Dp>::value && 438022747e62SLogan Chien !is_array<_Yp>::value && 438122747e62SLogan Chien is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 438222747e62SLogan Chien __nat 438322747e62SLogan Chien >::type) 43843e519524SHoward Hinnant : __ptr_(__r.get()) 43853e519524SHoward Hinnant{ 4386c34f847bSMarshall Clow#if _LIBCPP_STD_VER > 11 4387c34f847bSMarshall Clow if (__ptr_ == nullptr) 4388c34f847bSMarshall Clow __cntrl_ = nullptr; 4389c34f847bSMarshall Clow else 4390c34f847bSMarshall Clow#endif 4391c34f847bSMarshall Clow { 43923e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, _Dp, allocator<_Yp> > _CntrlBlk; 43933e519524SHoward Hinnant __cntrl_ = new _CntrlBlk(__r.get(), __r.get_deleter(), allocator<_Yp>()); 439439005d30SEric Fiselier __enable_weak_this(__r.get(), __r.get()); 4395c34f847bSMarshall Clow } 43963e519524SHoward Hinnant __r.release(); 43973e519524SHoward Hinnant} 43983e519524SHoward Hinnant 43993e519524SHoward Hinnanttemplate<class _Tp> 440022747e62SLogan Chientemplate <class _Yp, class _Dp> 44017609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 44023e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp>&& __r, 44033e519524SHoward Hinnant#else 44043e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp> __r, 44053e519524SHoward Hinnant#endif 440622747e62SLogan Chien typename enable_if 440722747e62SLogan Chien < 440822747e62SLogan Chien is_lvalue_reference<_Dp>::value && 440922747e62SLogan Chien !is_array<_Yp>::value && 441022747e62SLogan Chien is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 441122747e62SLogan Chien __nat 441222747e62SLogan Chien >::type) 44133e519524SHoward Hinnant : __ptr_(__r.get()) 44143e519524SHoward Hinnant{ 4415c34f847bSMarshall Clow#if _LIBCPP_STD_VER > 11 4416c34f847bSMarshall Clow if (__ptr_ == nullptr) 4417c34f847bSMarshall Clow __cntrl_ = nullptr; 4418c34f847bSMarshall Clow else 4419c34f847bSMarshall Clow#endif 4420c34f847bSMarshall Clow { 44213e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, 44223e519524SHoward Hinnant reference_wrapper<typename remove_reference<_Dp>::type>, 44233e519524SHoward Hinnant allocator<_Yp> > _CntrlBlk; 44243e519524SHoward Hinnant __cntrl_ = new _CntrlBlk(__r.get(), ref(__r.get_deleter()), allocator<_Yp>()); 442539005d30SEric Fiselier __enable_weak_this(__r.get(), __r.get()); 4426c34f847bSMarshall Clow } 44273e519524SHoward Hinnant __r.release(); 44283e519524SHoward Hinnant} 44293e519524SHoward Hinnant 44303e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 44313e519524SHoward Hinnant 44323e519524SHoward Hinnanttemplate<class _Tp> 44333e519524SHoward Hinnanttemplate<class ..._Args> 44343e519524SHoward Hinnantshared_ptr<_Tp> 44353e519524SHoward Hinnantshared_ptr<_Tp>::make_shared(_Args&& ...__args) 44363e519524SHoward Hinnant{ 44373e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 44383e519524SHoward Hinnant typedef allocator<_CntrlBlk> _A2; 44393e519524SHoward Hinnant typedef __allocator_destructor<_A2> _D2; 44403e519524SHoward Hinnant _A2 __a2; 44413e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); 4442ce48a113SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__a2, _VSTD::forward<_Args>(__args)...); 44433e519524SHoward Hinnant shared_ptr<_Tp> __r; 44443e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 44453e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 444639005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 44473e519524SHoward Hinnant return __r; 44483e519524SHoward Hinnant} 44493e519524SHoward Hinnant 44503e519524SHoward Hinnanttemplate<class _Tp> 44513e519524SHoward Hinnanttemplate<class _Alloc, class ..._Args> 44523e519524SHoward Hinnantshared_ptr<_Tp> 44533e519524SHoward Hinnantshared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _Args&& ...__args) 44543e519524SHoward Hinnant{ 44553e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 4456319be722SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _A2; 44573e519524SHoward Hinnant typedef __allocator_destructor<_A2> _D2; 44583e519524SHoward Hinnant _A2 __a2(__a); 44593e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); 4460319be722SEric Fiselier ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4461319be722SEric Fiselier _CntrlBlk(__a, _VSTD::forward<_Args>(__args)...); 44623e519524SHoward Hinnant shared_ptr<_Tp> __r; 44633e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 4464319be722SEric Fiselier __r.__cntrl_ = _VSTD::addressof(*__hold2.release()); 446539005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 44663e519524SHoward Hinnant return __r; 44673e519524SHoward Hinnant} 44683e519524SHoward Hinnant 44693e519524SHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 44703e519524SHoward Hinnant 44713e519524SHoward Hinnanttemplate<class _Tp> 44723e519524SHoward Hinnantshared_ptr<_Tp> 44733e519524SHoward Hinnantshared_ptr<_Tp>::make_shared() 44743e519524SHoward Hinnant{ 44753e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 44763e519524SHoward Hinnant typedef allocator<_CntrlBlk> _Alloc2; 44773e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 44783e519524SHoward Hinnant _Alloc2 __alloc2; 44793e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 44803e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__alloc2); 44813e519524SHoward Hinnant shared_ptr<_Tp> __r; 44823e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 44833e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 448439005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 44853e519524SHoward Hinnant return __r; 44863e519524SHoward Hinnant} 44873e519524SHoward Hinnant 44883e519524SHoward Hinnanttemplate<class _Tp> 44893e519524SHoward Hinnanttemplate<class _A0> 44903e519524SHoward Hinnantshared_ptr<_Tp> 44913e519524SHoward Hinnantshared_ptr<_Tp>::make_shared(_A0& __a0) 44923e519524SHoward Hinnant{ 44933e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 44943e519524SHoward Hinnant typedef allocator<_CntrlBlk> _Alloc2; 44953e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 44963e519524SHoward Hinnant _Alloc2 __alloc2; 44973e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 44983e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__alloc2, __a0); 44993e519524SHoward Hinnant shared_ptr<_Tp> __r; 45003e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 45013e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 450239005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 45033e519524SHoward Hinnant return __r; 45043e519524SHoward Hinnant} 45053e519524SHoward Hinnant 45063e519524SHoward Hinnanttemplate<class _Tp> 45073e519524SHoward Hinnanttemplate<class _A0, class _A1> 45083e519524SHoward Hinnantshared_ptr<_Tp> 45093e519524SHoward Hinnantshared_ptr<_Tp>::make_shared(_A0& __a0, _A1& __a1) 45103e519524SHoward Hinnant{ 45113e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 45123e519524SHoward Hinnant typedef allocator<_CntrlBlk> _Alloc2; 45133e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 45143e519524SHoward Hinnant _Alloc2 __alloc2; 45153e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 45163e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__alloc2, __a0, __a1); 45173e519524SHoward Hinnant shared_ptr<_Tp> __r; 45183e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 45193e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 452039005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 45213e519524SHoward Hinnant return __r; 45223e519524SHoward Hinnant} 45233e519524SHoward Hinnant 45243e519524SHoward Hinnanttemplate<class _Tp> 45253e519524SHoward Hinnanttemplate<class _A0, class _A1, class _A2> 45263e519524SHoward Hinnantshared_ptr<_Tp> 45273e519524SHoward Hinnantshared_ptr<_Tp>::make_shared(_A0& __a0, _A1& __a1, _A2& __a2) 45283e519524SHoward Hinnant{ 45293e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 45303e519524SHoward Hinnant typedef allocator<_CntrlBlk> _Alloc2; 45313e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 45323e519524SHoward Hinnant _Alloc2 __alloc2; 45333e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 45343e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__alloc2, __a0, __a1, __a2); 45353e519524SHoward Hinnant shared_ptr<_Tp> __r; 45363e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 45373e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 453839005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 45393e519524SHoward Hinnant return __r; 45403e519524SHoward Hinnant} 45413e519524SHoward Hinnant 45423e519524SHoward Hinnanttemplate<class _Tp> 45433e519524SHoward Hinnanttemplate<class _Alloc> 45443e519524SHoward Hinnantshared_ptr<_Tp> 45453e519524SHoward Hinnantshared_ptr<_Tp>::allocate_shared(const _Alloc& __a) 45463e519524SHoward Hinnant{ 45473e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 4548319be722SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _Alloc2; 45493e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 45503e519524SHoward Hinnant _Alloc2 __alloc2(__a); 45513e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 4552319be722SEric Fiselier ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4553319be722SEric Fiselier _CntrlBlk(__a); 45543e519524SHoward Hinnant shared_ptr<_Tp> __r; 45553e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 4556319be722SEric Fiselier __r.__cntrl_ = _VSTD::addressof(*__hold2.release()); 455739005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 45583e519524SHoward Hinnant return __r; 45593e519524SHoward Hinnant} 45603e519524SHoward Hinnant 45613e519524SHoward Hinnanttemplate<class _Tp> 45623e519524SHoward Hinnanttemplate<class _Alloc, class _A0> 45633e519524SHoward Hinnantshared_ptr<_Tp> 45643e519524SHoward Hinnantshared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _A0& __a0) 45653e519524SHoward Hinnant{ 45663e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 4567319be722SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _Alloc2; 45683e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 45693e519524SHoward Hinnant _Alloc2 __alloc2(__a); 45703e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 4571319be722SEric Fiselier ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4572319be722SEric Fiselier _CntrlBlk(__a, __a0); 45733e519524SHoward Hinnant shared_ptr<_Tp> __r; 45743e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 4575319be722SEric Fiselier __r.__cntrl_ = _VSTD::addressof(*__hold2.release()); 457639005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 45773e519524SHoward Hinnant return __r; 45783e519524SHoward Hinnant} 45793e519524SHoward Hinnant 45803e519524SHoward Hinnanttemplate<class _Tp> 45813e519524SHoward Hinnanttemplate<class _Alloc, class _A0, class _A1> 45823e519524SHoward Hinnantshared_ptr<_Tp> 45833e519524SHoward Hinnantshared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1) 45843e519524SHoward Hinnant{ 45853e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 4586319be722SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _Alloc2; 45873e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 45883e519524SHoward Hinnant _Alloc2 __alloc2(__a); 45893e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 4590319be722SEric Fiselier ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4591319be722SEric Fiselier _CntrlBlk(__a, __a0, __a1); 45923e519524SHoward Hinnant shared_ptr<_Tp> __r; 45933e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 4594319be722SEric Fiselier __r.__cntrl_ = _VSTD::addressof(*__hold2.release()); 459539005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 45963e519524SHoward Hinnant return __r; 45973e519524SHoward Hinnant} 45983e519524SHoward Hinnant 45993e519524SHoward Hinnanttemplate<class _Tp> 46003e519524SHoward Hinnanttemplate<class _Alloc, class _A0, class _A1, class _A2> 46013e519524SHoward Hinnantshared_ptr<_Tp> 46023e519524SHoward Hinnantshared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1, _A2& __a2) 46033e519524SHoward Hinnant{ 46043e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 4605319be722SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _Alloc2; 46063e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 46073e519524SHoward Hinnant _Alloc2 __alloc2(__a); 46083e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 4609319be722SEric Fiselier ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4610319be722SEric Fiselier _CntrlBlk(__a, __a0, __a1, __a2); 46113e519524SHoward Hinnant shared_ptr<_Tp> __r; 46123e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 4613319be722SEric Fiselier __r.__cntrl_ = _VSTD::addressof(*__hold2.release()); 461439005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 46153e519524SHoward Hinnant return __r; 46163e519524SHoward Hinnant} 46173e519524SHoward Hinnant 46183e519524SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 46193e519524SHoward Hinnant 46203e519524SHoward Hinnanttemplate<class _Tp> 46213e519524SHoward Hinnantshared_ptr<_Tp>::~shared_ptr() 46223e519524SHoward Hinnant{ 46233e519524SHoward Hinnant if (__cntrl_) 46243e519524SHoward Hinnant __cntrl_->__release_shared(); 46253e519524SHoward Hinnant} 46263e519524SHoward Hinnant 46273e519524SHoward Hinnanttemplate<class _Tp> 4628906c872dSEvgeniy Stepanovinline 46293e519524SHoward Hinnantshared_ptr<_Tp>& 46303739fe79SHoward Hinnantshared_ptr<_Tp>::operator=(const shared_ptr& __r) _NOEXCEPT 46313e519524SHoward Hinnant{ 46323e519524SHoward Hinnant shared_ptr(__r).swap(*this); 46333e519524SHoward Hinnant return *this; 46343e519524SHoward Hinnant} 46353e519524SHoward Hinnant 46363e519524SHoward Hinnanttemplate<class _Tp> 46373e519524SHoward Hinnanttemplate<class _Yp> 4638906c872dSEvgeniy Stepanovinline 46398e25104bSHoward Hinnanttypename enable_if 46408e25104bSHoward Hinnant< 46418e25104bSHoward Hinnant is_convertible<_Yp*, _Tp*>::value, 46423e519524SHoward Hinnant shared_ptr<_Tp>& 46438e25104bSHoward Hinnant>::type 46443739fe79SHoward Hinnantshared_ptr<_Tp>::operator=(const shared_ptr<_Yp>& __r) _NOEXCEPT 46453e519524SHoward Hinnant{ 46463e519524SHoward Hinnant shared_ptr(__r).swap(*this); 46473e519524SHoward Hinnant return *this; 46483e519524SHoward Hinnant} 46493e519524SHoward Hinnant 46507609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 46513e519524SHoward Hinnant 46523e519524SHoward Hinnanttemplate<class _Tp> 4653906c872dSEvgeniy Stepanovinline 46543e519524SHoward Hinnantshared_ptr<_Tp>& 46553739fe79SHoward Hinnantshared_ptr<_Tp>::operator=(shared_ptr&& __r) _NOEXCEPT 46563e519524SHoward Hinnant{ 4657ce48a113SHoward Hinnant shared_ptr(_VSTD::move(__r)).swap(*this); 46583e519524SHoward Hinnant return *this; 46593e519524SHoward Hinnant} 46603e519524SHoward Hinnant 46613e519524SHoward Hinnanttemplate<class _Tp> 46623e519524SHoward Hinnanttemplate<class _Yp> 4663906c872dSEvgeniy Stepanovinline 46648e25104bSHoward Hinnanttypename enable_if 46658e25104bSHoward Hinnant< 46668e25104bSHoward Hinnant is_convertible<_Yp*, _Tp*>::value, 46673e519524SHoward Hinnant shared_ptr<_Tp>& 46688e25104bSHoward Hinnant>::type 46693e519524SHoward Hinnantshared_ptr<_Tp>::operator=(shared_ptr<_Yp>&& __r) 46703e519524SHoward Hinnant{ 4671ce48a113SHoward Hinnant shared_ptr(_VSTD::move(__r)).swap(*this); 46723e519524SHoward Hinnant return *this; 46733e519524SHoward Hinnant} 46743e519524SHoward Hinnant 46753e519524SHoward Hinnanttemplate<class _Tp> 46763e519524SHoward Hinnanttemplate<class _Yp> 4677906c872dSEvgeniy Stepanovinline 46788e25104bSHoward Hinnanttypename enable_if 46798e25104bSHoward Hinnant< 46808e25104bSHoward Hinnant !is_array<_Yp>::value && 46818e25104bSHoward Hinnant is_convertible<_Yp*, _Tp*>::value, 468284f996fbSHoward Hinnant shared_ptr<_Tp> 468384f996fbSHoward Hinnant>::type& 46843e519524SHoward Hinnantshared_ptr<_Tp>::operator=(auto_ptr<_Yp>&& __r) 46853e519524SHoward Hinnant{ 4686ce48a113SHoward Hinnant shared_ptr(_VSTD::move(__r)).swap(*this); 46873e519524SHoward Hinnant return *this; 46883e519524SHoward Hinnant} 46893e519524SHoward Hinnant 46903e519524SHoward Hinnanttemplate<class _Tp> 46913e519524SHoward Hinnanttemplate <class _Yp, class _Dp> 4692906c872dSEvgeniy Stepanovinline 46938e25104bSHoward Hinnanttypename enable_if 46948e25104bSHoward Hinnant< 46958e25104bSHoward Hinnant !is_array<_Yp>::value && 46968e25104bSHoward Hinnant is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, _Tp*>::value, 46973e519524SHoward Hinnant shared_ptr<_Tp>& 46988e25104bSHoward Hinnant>::type 46993e519524SHoward Hinnantshared_ptr<_Tp>::operator=(unique_ptr<_Yp, _Dp>&& __r) 47003e519524SHoward Hinnant{ 4701ce48a113SHoward Hinnant shared_ptr(_VSTD::move(__r)).swap(*this); 47023e519524SHoward Hinnant return *this; 47033e519524SHoward Hinnant} 47043e519524SHoward Hinnant 47057609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 47063e519524SHoward Hinnant 47073e519524SHoward Hinnanttemplate<class _Tp> 47083e519524SHoward Hinnanttemplate<class _Yp> 47093e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 47108e25104bSHoward Hinnanttypename enable_if 47118e25104bSHoward Hinnant< 47128e25104bSHoward Hinnant !is_array<_Yp>::value && 47138e25104bSHoward Hinnant is_convertible<_Yp*, _Tp*>::value, 47143e519524SHoward Hinnant shared_ptr<_Tp>& 47158e25104bSHoward Hinnant>::type 4716b3371f6fSHoward Hinnantshared_ptr<_Tp>::operator=(auto_ptr<_Yp> __r) 47173e519524SHoward Hinnant{ 47183e519524SHoward Hinnant shared_ptr(__r).swap(*this); 47193e519524SHoward Hinnant return *this; 47203e519524SHoward Hinnant} 47213e519524SHoward Hinnant 47223e519524SHoward Hinnanttemplate<class _Tp> 47233e519524SHoward Hinnanttemplate <class _Yp, class _Dp> 47243e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 47258e25104bSHoward Hinnanttypename enable_if 47268e25104bSHoward Hinnant< 47278e25104bSHoward Hinnant !is_array<_Yp>::value && 47288e25104bSHoward Hinnant is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, _Tp*>::value, 47293e519524SHoward Hinnant shared_ptr<_Tp>& 47308e25104bSHoward Hinnant>::type 47313e519524SHoward Hinnantshared_ptr<_Tp>::operator=(unique_ptr<_Yp, _Dp> __r) 47323e519524SHoward Hinnant{ 4733ce48a113SHoward Hinnant shared_ptr(_VSTD::move(__r)).swap(*this); 47343e519524SHoward Hinnant return *this; 47353e519524SHoward Hinnant} 47363e519524SHoward Hinnant 47377609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 47383e519524SHoward Hinnant 47393e519524SHoward Hinnanttemplate<class _Tp> 4740906c872dSEvgeniy Stepanovinline 47413e519524SHoward Hinnantvoid 47423739fe79SHoward Hinnantshared_ptr<_Tp>::swap(shared_ptr& __r) _NOEXCEPT 47433e519524SHoward Hinnant{ 4744ce48a113SHoward Hinnant _VSTD::swap(__ptr_, __r.__ptr_); 4745ce48a113SHoward Hinnant _VSTD::swap(__cntrl_, __r.__cntrl_); 47463e519524SHoward Hinnant} 47473e519524SHoward Hinnant 47483e519524SHoward Hinnanttemplate<class _Tp> 4749906c872dSEvgeniy Stepanovinline 47503e519524SHoward Hinnantvoid 47513739fe79SHoward Hinnantshared_ptr<_Tp>::reset() _NOEXCEPT 47523e519524SHoward Hinnant{ 47533e519524SHoward Hinnant shared_ptr().swap(*this); 47543e519524SHoward Hinnant} 47553e519524SHoward Hinnant 47563e519524SHoward Hinnanttemplate<class _Tp> 47573e519524SHoward Hinnanttemplate<class _Yp> 4758906c872dSEvgeniy Stepanovinline 47598e25104bSHoward Hinnanttypename enable_if 47608e25104bSHoward Hinnant< 47618e25104bSHoward Hinnant is_convertible<_Yp*, _Tp*>::value, 47623e519524SHoward Hinnant void 47638e25104bSHoward Hinnant>::type 47643e519524SHoward Hinnantshared_ptr<_Tp>::reset(_Yp* __p) 47653e519524SHoward Hinnant{ 47663e519524SHoward Hinnant shared_ptr(__p).swap(*this); 47673e519524SHoward Hinnant} 47683e519524SHoward Hinnant 47693e519524SHoward Hinnanttemplate<class _Tp> 47703e519524SHoward Hinnanttemplate<class _Yp, class _Dp> 4771906c872dSEvgeniy Stepanovinline 47728e25104bSHoward Hinnanttypename enable_if 47738e25104bSHoward Hinnant< 47748e25104bSHoward Hinnant is_convertible<_Yp*, _Tp*>::value, 47753e519524SHoward Hinnant void 47768e25104bSHoward Hinnant>::type 47773e519524SHoward Hinnantshared_ptr<_Tp>::reset(_Yp* __p, _Dp __d) 47783e519524SHoward Hinnant{ 47793e519524SHoward Hinnant shared_ptr(__p, __d).swap(*this); 47803e519524SHoward Hinnant} 47813e519524SHoward Hinnant 47823e519524SHoward Hinnanttemplate<class _Tp> 47833e519524SHoward Hinnanttemplate<class _Yp, class _Dp, class _Alloc> 4784906c872dSEvgeniy Stepanovinline 47858e25104bSHoward Hinnanttypename enable_if 47868e25104bSHoward Hinnant< 47878e25104bSHoward Hinnant is_convertible<_Yp*, _Tp*>::value, 47883e519524SHoward Hinnant void 47898e25104bSHoward Hinnant>::type 47903e519524SHoward Hinnantshared_ptr<_Tp>::reset(_Yp* __p, _Dp __d, _Alloc __a) 47913e519524SHoward Hinnant{ 47923e519524SHoward Hinnant shared_ptr(__p, __d, __a).swap(*this); 47933e519524SHoward Hinnant} 47943e519524SHoward Hinnant 47953e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 47963e519524SHoward Hinnant 47973e519524SHoward Hinnanttemplate<class _Tp, class ..._Args> 47983e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 47998e25104bSHoward Hinnanttypename enable_if 48008e25104bSHoward Hinnant< 48018e25104bSHoward Hinnant !is_array<_Tp>::value, 48023e519524SHoward Hinnant shared_ptr<_Tp> 48038e25104bSHoward Hinnant>::type 48043e519524SHoward Hinnantmake_shared(_Args&& ...__args) 48053e519524SHoward Hinnant{ 4806ce48a113SHoward Hinnant return shared_ptr<_Tp>::make_shared(_VSTD::forward<_Args>(__args)...); 48073e519524SHoward Hinnant} 48083e519524SHoward Hinnant 48093e519524SHoward Hinnanttemplate<class _Tp, class _Alloc, class ..._Args> 48103e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 48118e25104bSHoward Hinnanttypename enable_if 48128e25104bSHoward Hinnant< 48138e25104bSHoward Hinnant !is_array<_Tp>::value, 48143e519524SHoward Hinnant shared_ptr<_Tp> 48158e25104bSHoward Hinnant>::type 48163e519524SHoward Hinnantallocate_shared(const _Alloc& __a, _Args&& ...__args) 48173e519524SHoward Hinnant{ 4818ce48a113SHoward Hinnant return shared_ptr<_Tp>::allocate_shared(__a, _VSTD::forward<_Args>(__args)...); 48193e519524SHoward Hinnant} 48203e519524SHoward Hinnant 48213e519524SHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 48223e519524SHoward Hinnant 48233e519524SHoward Hinnanttemplate<class _Tp> 48243e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 48253e519524SHoward Hinnantshared_ptr<_Tp> 48263e519524SHoward Hinnantmake_shared() 48273e519524SHoward Hinnant{ 48283e519524SHoward Hinnant return shared_ptr<_Tp>::make_shared(); 48293e519524SHoward Hinnant} 48303e519524SHoward Hinnant 48313e519524SHoward Hinnanttemplate<class _Tp, class _A0> 48323e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 48333e519524SHoward Hinnantshared_ptr<_Tp> 48343e519524SHoward Hinnantmake_shared(_A0& __a0) 48353e519524SHoward Hinnant{ 48363e519524SHoward Hinnant return shared_ptr<_Tp>::make_shared(__a0); 48373e519524SHoward Hinnant} 48383e519524SHoward Hinnant 48393e519524SHoward Hinnanttemplate<class _Tp, class _A0, class _A1> 48403e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 48413e519524SHoward Hinnantshared_ptr<_Tp> 48423e519524SHoward Hinnantmake_shared(_A0& __a0, _A1& __a1) 48433e519524SHoward Hinnant{ 48443e519524SHoward Hinnant return shared_ptr<_Tp>::make_shared(__a0, __a1); 48453e519524SHoward Hinnant} 48463e519524SHoward Hinnant 48473e519524SHoward Hinnanttemplate<class _Tp, class _A0, class _A1, class _A2> 48483e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 48493e519524SHoward Hinnantshared_ptr<_Tp> 48503e519524SHoward Hinnantmake_shared(_A0& __a0, _A1& __a1, _A2& __a2) 48513e519524SHoward Hinnant{ 48523e519524SHoward Hinnant return shared_ptr<_Tp>::make_shared(__a0, __a1, __a2); 48533e519524SHoward Hinnant} 48543e519524SHoward Hinnant 48553e519524SHoward Hinnanttemplate<class _Tp, class _Alloc> 48563e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 48573e519524SHoward Hinnantshared_ptr<_Tp> 48583e519524SHoward Hinnantallocate_shared(const _Alloc& __a) 48593e519524SHoward Hinnant{ 48603e519524SHoward Hinnant return shared_ptr<_Tp>::allocate_shared(__a); 48613e519524SHoward Hinnant} 48623e519524SHoward Hinnant 48633e519524SHoward Hinnanttemplate<class _Tp, class _Alloc, class _A0> 48643e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 48653e519524SHoward Hinnantshared_ptr<_Tp> 48663e519524SHoward Hinnantallocate_shared(const _Alloc& __a, _A0& __a0) 48673e519524SHoward Hinnant{ 48683e519524SHoward Hinnant return shared_ptr<_Tp>::allocate_shared(__a, __a0); 48693e519524SHoward Hinnant} 48703e519524SHoward Hinnant 48713e519524SHoward Hinnanttemplate<class _Tp, class _Alloc, class _A0, class _A1> 48723e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 48733e519524SHoward Hinnantshared_ptr<_Tp> 48743e519524SHoward Hinnantallocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1) 48753e519524SHoward Hinnant{ 48763e519524SHoward Hinnant return shared_ptr<_Tp>::allocate_shared(__a, __a0, __a1); 48773e519524SHoward Hinnant} 48783e519524SHoward Hinnant 48793e519524SHoward Hinnanttemplate<class _Tp, class _Alloc, class _A0, class _A1, class _A2> 48803e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 48813e519524SHoward Hinnantshared_ptr<_Tp> 48823e519524SHoward Hinnantallocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1, _A2& __a2) 48833e519524SHoward Hinnant{ 48843e519524SHoward Hinnant return shared_ptr<_Tp>::allocate_shared(__a, __a0, __a1, __a2); 48853e519524SHoward Hinnant} 48863e519524SHoward Hinnant 48873e519524SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 48883e519524SHoward Hinnant 48893e519524SHoward Hinnanttemplate<class _Tp, class _Up> 48903e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 48913e519524SHoward Hinnantbool 48923739fe79SHoward Hinnantoperator==(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 48933e519524SHoward Hinnant{ 48943e519524SHoward Hinnant return __x.get() == __y.get(); 48953e519524SHoward Hinnant} 48963e519524SHoward Hinnant 48973e519524SHoward Hinnanttemplate<class _Tp, class _Up> 48983e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 48993e519524SHoward Hinnantbool 49003739fe79SHoward Hinnantoperator!=(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 49013e519524SHoward Hinnant{ 49023e519524SHoward Hinnant return !(__x == __y); 49033e519524SHoward Hinnant} 49043e519524SHoward Hinnant 49053e519524SHoward Hinnanttemplate<class _Tp, class _Up> 49063e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 49073e519524SHoward Hinnantbool 49083739fe79SHoward Hinnantoperator<(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 49093e519524SHoward Hinnant{ 49106fe361c1SEric Fiselier typedef typename common_type<_Tp*, _Up*>::type _Vp; 49116fe361c1SEric Fiselier return less<_Vp>()(__x.get(), __y.get()); 491267f39647SHoward Hinnant} 491367f39647SHoward Hinnant 491467f39647SHoward Hinnanttemplate<class _Tp, class _Up> 491567f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 491667f39647SHoward Hinnantbool 491767f39647SHoward Hinnantoperator>(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 491867f39647SHoward Hinnant{ 491967f39647SHoward Hinnant return __y < __x; 492067f39647SHoward Hinnant} 492167f39647SHoward Hinnant 492267f39647SHoward Hinnanttemplate<class _Tp, class _Up> 492367f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 492467f39647SHoward Hinnantbool 492567f39647SHoward Hinnantoperator<=(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 492667f39647SHoward Hinnant{ 492767f39647SHoward Hinnant return !(__y < __x); 492867f39647SHoward Hinnant} 492967f39647SHoward Hinnant 493067f39647SHoward Hinnanttemplate<class _Tp, class _Up> 493167f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 493267f39647SHoward Hinnantbool 493367f39647SHoward Hinnantoperator>=(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 493467f39647SHoward Hinnant{ 493567f39647SHoward Hinnant return !(__x < __y); 493667f39647SHoward Hinnant} 493767f39647SHoward Hinnant 493867f39647SHoward Hinnanttemplate<class _Tp> 493967f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 494067f39647SHoward Hinnantbool 494167f39647SHoward Hinnantoperator==(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 494267f39647SHoward Hinnant{ 494367f39647SHoward Hinnant return !__x; 494467f39647SHoward Hinnant} 494567f39647SHoward Hinnant 494667f39647SHoward Hinnanttemplate<class _Tp> 494767f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 494867f39647SHoward Hinnantbool 494967f39647SHoward Hinnantoperator==(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 495067f39647SHoward Hinnant{ 495167f39647SHoward Hinnant return !__x; 495267f39647SHoward Hinnant} 495367f39647SHoward Hinnant 495467f39647SHoward Hinnanttemplate<class _Tp> 495567f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 495667f39647SHoward Hinnantbool 495767f39647SHoward Hinnantoperator!=(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 495867f39647SHoward Hinnant{ 495967f39647SHoward Hinnant return static_cast<bool>(__x); 496067f39647SHoward Hinnant} 496167f39647SHoward Hinnant 496267f39647SHoward Hinnanttemplate<class _Tp> 496367f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 496467f39647SHoward Hinnantbool 496567f39647SHoward Hinnantoperator!=(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 496667f39647SHoward Hinnant{ 496767f39647SHoward Hinnant return static_cast<bool>(__x); 496867f39647SHoward Hinnant} 496967f39647SHoward Hinnant 497067f39647SHoward Hinnanttemplate<class _Tp> 497167f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 497267f39647SHoward Hinnantbool 497367f39647SHoward Hinnantoperator<(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 497467f39647SHoward Hinnant{ 497567f39647SHoward Hinnant return less<_Tp*>()(__x.get(), nullptr); 497667f39647SHoward Hinnant} 497767f39647SHoward Hinnant 497867f39647SHoward Hinnanttemplate<class _Tp> 497967f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 498067f39647SHoward Hinnantbool 498167f39647SHoward Hinnantoperator<(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 498267f39647SHoward Hinnant{ 498367f39647SHoward Hinnant return less<_Tp*>()(nullptr, __x.get()); 498467f39647SHoward Hinnant} 498567f39647SHoward Hinnant 498667f39647SHoward Hinnanttemplate<class _Tp> 498767f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 498867f39647SHoward Hinnantbool 498967f39647SHoward Hinnantoperator>(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 499067f39647SHoward Hinnant{ 499167f39647SHoward Hinnant return nullptr < __x; 499267f39647SHoward Hinnant} 499367f39647SHoward Hinnant 499467f39647SHoward Hinnanttemplate<class _Tp> 499567f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 499667f39647SHoward Hinnantbool 499767f39647SHoward Hinnantoperator>(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 499867f39647SHoward Hinnant{ 499967f39647SHoward Hinnant return __x < nullptr; 500067f39647SHoward Hinnant} 500167f39647SHoward Hinnant 500267f39647SHoward Hinnanttemplate<class _Tp> 500367f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 500467f39647SHoward Hinnantbool 500567f39647SHoward Hinnantoperator<=(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 500667f39647SHoward Hinnant{ 500767f39647SHoward Hinnant return !(nullptr < __x); 500867f39647SHoward Hinnant} 500967f39647SHoward Hinnant 501067f39647SHoward Hinnanttemplate<class _Tp> 501167f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 501267f39647SHoward Hinnantbool 501367f39647SHoward Hinnantoperator<=(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 501467f39647SHoward Hinnant{ 501567f39647SHoward Hinnant return !(__x < nullptr); 501667f39647SHoward Hinnant} 501767f39647SHoward Hinnant 501867f39647SHoward Hinnanttemplate<class _Tp> 501967f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 502067f39647SHoward Hinnantbool 502167f39647SHoward Hinnantoperator>=(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 502267f39647SHoward Hinnant{ 502367f39647SHoward Hinnant return !(__x < nullptr); 502467f39647SHoward Hinnant} 502567f39647SHoward Hinnant 502667f39647SHoward Hinnanttemplate<class _Tp> 502767f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 502867f39647SHoward Hinnantbool 502967f39647SHoward Hinnantoperator>=(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 503067f39647SHoward Hinnant{ 503167f39647SHoward Hinnant return !(nullptr < __x); 50323e519524SHoward Hinnant} 50333e519524SHoward Hinnant 50343e519524SHoward Hinnanttemplate<class _Tp> 50353e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 50363e519524SHoward Hinnantvoid 50373739fe79SHoward Hinnantswap(shared_ptr<_Tp>& __x, shared_ptr<_Tp>& __y) _NOEXCEPT 50383e519524SHoward Hinnant{ 50393e519524SHoward Hinnant __x.swap(__y); 50403e519524SHoward Hinnant} 50413e519524SHoward Hinnant 50423e519524SHoward Hinnanttemplate<class _Tp, class _Up> 50433e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 50448e25104bSHoward Hinnanttypename enable_if 50458e25104bSHoward Hinnant< 50468e25104bSHoward Hinnant !is_array<_Tp>::value && !is_array<_Up>::value, 50473e519524SHoward Hinnant shared_ptr<_Tp> 50488e25104bSHoward Hinnant>::type 50493739fe79SHoward Hinnantstatic_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT 50503e519524SHoward Hinnant{ 50513e519524SHoward Hinnant return shared_ptr<_Tp>(__r, static_cast<_Tp*>(__r.get())); 50523e519524SHoward Hinnant} 50533e519524SHoward Hinnant 50543e519524SHoward Hinnanttemplate<class _Tp, class _Up> 50553e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 50568e25104bSHoward Hinnanttypename enable_if 50578e25104bSHoward Hinnant< 50588e25104bSHoward Hinnant !is_array<_Tp>::value && !is_array<_Up>::value, 50593e519524SHoward Hinnant shared_ptr<_Tp> 50608e25104bSHoward Hinnant>::type 50613739fe79SHoward Hinnantdynamic_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT 50623e519524SHoward Hinnant{ 50633e519524SHoward Hinnant _Tp* __p = dynamic_cast<_Tp*>(__r.get()); 50643e519524SHoward Hinnant return __p ? shared_ptr<_Tp>(__r, __p) : shared_ptr<_Tp>(); 50653e519524SHoward Hinnant} 50663e519524SHoward Hinnant 50673e519524SHoward Hinnanttemplate<class _Tp, class _Up> 50688e25104bSHoward Hinnanttypename enable_if 50698e25104bSHoward Hinnant< 50708e25104bSHoward Hinnant is_array<_Tp>::value == is_array<_Up>::value, 50713e519524SHoward Hinnant shared_ptr<_Tp> 50728e25104bSHoward Hinnant>::type 50733739fe79SHoward Hinnantconst_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT 50743e519524SHoward Hinnant{ 50758e25104bSHoward Hinnant typedef typename remove_extent<_Tp>::type _RTp; 50768e25104bSHoward Hinnant return shared_ptr<_Tp>(__r, const_cast<_RTp*>(__r.get())); 50773e519524SHoward Hinnant} 50783e519524SHoward Hinnant 507954b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI 508054b409fdSHoward Hinnant 50813e519524SHoward Hinnanttemplate<class _Dp, class _Tp> 50823e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 50833e519524SHoward Hinnant_Dp* 50843739fe79SHoward Hinnantget_deleter(const shared_ptr<_Tp>& __p) _NOEXCEPT 50853e519524SHoward Hinnant{ 50863e519524SHoward Hinnant return __p.template __get_deleter<_Dp>(); 50873e519524SHoward Hinnant} 50883e519524SHoward Hinnant 5089b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_RTTI 509054b409fdSHoward Hinnant 50913e519524SHoward Hinnanttemplate<class _Tp> 5092e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS weak_ptr 50933e519524SHoward Hinnant{ 50943e519524SHoward Hinnantpublic: 50953e519524SHoward Hinnant typedef _Tp element_type; 50963e519524SHoward Hinnantprivate: 50973e519524SHoward Hinnant element_type* __ptr_; 50983e519524SHoward Hinnant __shared_weak_count* __cntrl_; 50993e519524SHoward Hinnant 51003e519524SHoward Hinnantpublic: 5101906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 5102c0937e8aSHoward Hinnant _LIBCPP_CONSTEXPR weak_ptr() _NOEXCEPT; 5103906c872dSEvgeniy Stepanov template<class _Yp> _LIBCPP_INLINE_VISIBILITY weak_ptr(shared_ptr<_Yp> const& __r, 51043739fe79SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0) 51053739fe79SHoward Hinnant _NOEXCEPT; 5106906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 51073739fe79SHoward Hinnant weak_ptr(weak_ptr const& __r) _NOEXCEPT; 5108906c872dSEvgeniy Stepanov template<class _Yp> _LIBCPP_INLINE_VISIBILITY weak_ptr(weak_ptr<_Yp> const& __r, 51093739fe79SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0) 51103739fe79SHoward Hinnant _NOEXCEPT; 51113e519524SHoward Hinnant 51128e25104bSHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 5113906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 51148e25104bSHoward Hinnant weak_ptr(weak_ptr&& __r) _NOEXCEPT; 5115906c872dSEvgeniy Stepanov template<class _Yp> _LIBCPP_INLINE_VISIBILITY weak_ptr(weak_ptr<_Yp>&& __r, 51168e25104bSHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0) 51178e25104bSHoward Hinnant _NOEXCEPT; 51188e25104bSHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 51193e519524SHoward Hinnant ~weak_ptr(); 51203e519524SHoward Hinnant 5121906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 51223739fe79SHoward Hinnant weak_ptr& operator=(weak_ptr const& __r) _NOEXCEPT; 51238e25104bSHoward Hinnant template<class _Yp> 51248e25104bSHoward Hinnant typename enable_if 51258e25104bSHoward Hinnant < 51268e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 51278e25104bSHoward Hinnant weak_ptr& 51288e25104bSHoward Hinnant >::type 5129906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 51308e25104bSHoward Hinnant operator=(weak_ptr<_Yp> const& __r) _NOEXCEPT; 51318e25104bSHoward Hinnant 51328e25104bSHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 51338e25104bSHoward Hinnant 5134906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 51358e25104bSHoward Hinnant weak_ptr& operator=(weak_ptr&& __r) _NOEXCEPT; 51368e25104bSHoward Hinnant template<class _Yp> 51378e25104bSHoward Hinnant typename enable_if 51388e25104bSHoward Hinnant < 51398e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 51408e25104bSHoward Hinnant weak_ptr& 51418e25104bSHoward Hinnant >::type 5142906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 51438e25104bSHoward Hinnant operator=(weak_ptr<_Yp>&& __r) _NOEXCEPT; 51448e25104bSHoward Hinnant 51458e25104bSHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 51468e25104bSHoward Hinnant 51478e25104bSHoward Hinnant template<class _Yp> 51488e25104bSHoward Hinnant typename enable_if 51498e25104bSHoward Hinnant < 51508e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 51518e25104bSHoward Hinnant weak_ptr& 51528e25104bSHoward Hinnant >::type 5153906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 51548e25104bSHoward Hinnant operator=(shared_ptr<_Yp> const& __r) _NOEXCEPT; 51553e519524SHoward Hinnant 5156906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 51573739fe79SHoward Hinnant void swap(weak_ptr& __r) _NOEXCEPT; 5158906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 51593739fe79SHoward Hinnant void reset() _NOEXCEPT; 51603e519524SHoward Hinnant 5161848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 51623739fe79SHoward Hinnant long use_count() const _NOEXCEPT 51633739fe79SHoward Hinnant {return __cntrl_ ? __cntrl_->use_count() : 0;} 5164848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 51653739fe79SHoward Hinnant bool expired() const _NOEXCEPT 51663739fe79SHoward Hinnant {return __cntrl_ == 0 || __cntrl_->use_count() == 0;} 51673739fe79SHoward Hinnant shared_ptr<_Tp> lock() const _NOEXCEPT; 5168848a5374SHoward Hinnant template<class _Up> 5169848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5170848a5374SHoward Hinnant bool owner_before(const shared_ptr<_Up>& __r) const 51713e519524SHoward Hinnant {return __cntrl_ < __r.__cntrl_;} 5172848a5374SHoward Hinnant template<class _Up> 5173848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5174848a5374SHoward Hinnant bool owner_before(const weak_ptr<_Up>& __r) const 51753e519524SHoward Hinnant {return __cntrl_ < __r.__cntrl_;} 51763e519524SHoward Hinnant 5177e2f2d1edSEric Fiselier template <class _Up> friend class _LIBCPP_TEMPLATE_VIS weak_ptr; 5178e2f2d1edSEric Fiselier template <class _Up> friend class _LIBCPP_TEMPLATE_VIS shared_ptr; 51793e519524SHoward Hinnant}; 51803e519524SHoward Hinnant 51813e519524SHoward Hinnanttemplate<class _Tp> 5182906c872dSEvgeniy Stepanovinline 5183c0937e8aSHoward Hinnant_LIBCPP_CONSTEXPR 51843739fe79SHoward Hinnantweak_ptr<_Tp>::weak_ptr() _NOEXCEPT 51853e519524SHoward Hinnant : __ptr_(0), 51863e519524SHoward Hinnant __cntrl_(0) 51873e519524SHoward Hinnant{ 51883e519524SHoward Hinnant} 51893e519524SHoward Hinnant 51903e519524SHoward Hinnanttemplate<class _Tp> 5191906c872dSEvgeniy Stepanovinline 51923739fe79SHoward Hinnantweak_ptr<_Tp>::weak_ptr(weak_ptr const& __r) _NOEXCEPT 51933e519524SHoward Hinnant : __ptr_(__r.__ptr_), 51943e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 51953e519524SHoward Hinnant{ 51963e519524SHoward Hinnant if (__cntrl_) 51973e519524SHoward Hinnant __cntrl_->__add_weak(); 51983e519524SHoward Hinnant} 51993e519524SHoward Hinnant 52003e519524SHoward Hinnanttemplate<class _Tp> 52013e519524SHoward Hinnanttemplate<class _Yp> 5202906c872dSEvgeniy Stepanovinline 52033e519524SHoward Hinnantweak_ptr<_Tp>::weak_ptr(shared_ptr<_Yp> const& __r, 52045eb6bdfaSHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type) 52053739fe79SHoward Hinnant _NOEXCEPT 52063e519524SHoward Hinnant : __ptr_(__r.__ptr_), 52073e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 52083e519524SHoward Hinnant{ 52093e519524SHoward Hinnant if (__cntrl_) 52103e519524SHoward Hinnant __cntrl_->__add_weak(); 52113e519524SHoward Hinnant} 52123e519524SHoward Hinnant 52133e519524SHoward Hinnanttemplate<class _Tp> 52143e519524SHoward Hinnanttemplate<class _Yp> 5215906c872dSEvgeniy Stepanovinline 52163e519524SHoward Hinnantweak_ptr<_Tp>::weak_ptr(weak_ptr<_Yp> const& __r, 52175eb6bdfaSHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type) 52183739fe79SHoward Hinnant _NOEXCEPT 52193e519524SHoward Hinnant : __ptr_(__r.__ptr_), 52203e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 52213e519524SHoward Hinnant{ 52223e519524SHoward Hinnant if (__cntrl_) 52233e519524SHoward Hinnant __cntrl_->__add_weak(); 52243e519524SHoward Hinnant} 52253e519524SHoward Hinnant 52268e25104bSHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 52278e25104bSHoward Hinnant 52288e25104bSHoward Hinnanttemplate<class _Tp> 5229906c872dSEvgeniy Stepanovinline 52308e25104bSHoward Hinnantweak_ptr<_Tp>::weak_ptr(weak_ptr&& __r) _NOEXCEPT 52318e25104bSHoward Hinnant : __ptr_(__r.__ptr_), 52328e25104bSHoward Hinnant __cntrl_(__r.__cntrl_) 52338e25104bSHoward Hinnant{ 52348e25104bSHoward Hinnant __r.__ptr_ = 0; 52358e25104bSHoward Hinnant __r.__cntrl_ = 0; 52368e25104bSHoward Hinnant} 52378e25104bSHoward Hinnant 52388e25104bSHoward Hinnanttemplate<class _Tp> 52398e25104bSHoward Hinnanttemplate<class _Yp> 5240906c872dSEvgeniy Stepanovinline 52418e25104bSHoward Hinnantweak_ptr<_Tp>::weak_ptr(weak_ptr<_Yp>&& __r, 52428e25104bSHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type) 52438e25104bSHoward Hinnant _NOEXCEPT 52448e25104bSHoward Hinnant : __ptr_(__r.__ptr_), 52458e25104bSHoward Hinnant __cntrl_(__r.__cntrl_) 52468e25104bSHoward Hinnant{ 52478e25104bSHoward Hinnant __r.__ptr_ = 0; 52488e25104bSHoward Hinnant __r.__cntrl_ = 0; 52498e25104bSHoward Hinnant} 52508e25104bSHoward Hinnant 52518e25104bSHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 52528e25104bSHoward Hinnant 52533e519524SHoward Hinnanttemplate<class _Tp> 52543e519524SHoward Hinnantweak_ptr<_Tp>::~weak_ptr() 52553e519524SHoward Hinnant{ 52563e519524SHoward Hinnant if (__cntrl_) 52573e519524SHoward Hinnant __cntrl_->__release_weak(); 52583e519524SHoward Hinnant} 52593e519524SHoward Hinnant 52603e519524SHoward Hinnanttemplate<class _Tp> 5261906c872dSEvgeniy Stepanovinline 52623e519524SHoward Hinnantweak_ptr<_Tp>& 52633739fe79SHoward Hinnantweak_ptr<_Tp>::operator=(weak_ptr const& __r) _NOEXCEPT 52643e519524SHoward Hinnant{ 52653e519524SHoward Hinnant weak_ptr(__r).swap(*this); 52663e519524SHoward Hinnant return *this; 52673e519524SHoward Hinnant} 52683e519524SHoward Hinnant 52693e519524SHoward Hinnanttemplate<class _Tp> 52703e519524SHoward Hinnanttemplate<class _Yp> 5271906c872dSEvgeniy Stepanovinline 52728e25104bSHoward Hinnanttypename enable_if 52738e25104bSHoward Hinnant< 52748e25104bSHoward Hinnant is_convertible<_Yp*, _Tp*>::value, 52753e519524SHoward Hinnant weak_ptr<_Tp>& 52768e25104bSHoward Hinnant>::type 52773739fe79SHoward Hinnantweak_ptr<_Tp>::operator=(weak_ptr<_Yp> const& __r) _NOEXCEPT 52783e519524SHoward Hinnant{ 52793e519524SHoward Hinnant weak_ptr(__r).swap(*this); 52803e519524SHoward Hinnant return *this; 52813e519524SHoward Hinnant} 52823e519524SHoward Hinnant 52838e25104bSHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 52848e25104bSHoward Hinnant 52858e25104bSHoward Hinnanttemplate<class _Tp> 5286906c872dSEvgeniy Stepanovinline 52878e25104bSHoward Hinnantweak_ptr<_Tp>& 52888e25104bSHoward Hinnantweak_ptr<_Tp>::operator=(weak_ptr&& __r) _NOEXCEPT 52898e25104bSHoward Hinnant{ 52908e25104bSHoward Hinnant weak_ptr(_VSTD::move(__r)).swap(*this); 52918e25104bSHoward Hinnant return *this; 52928e25104bSHoward Hinnant} 52938e25104bSHoward Hinnant 52943e519524SHoward Hinnanttemplate<class _Tp> 52953e519524SHoward Hinnanttemplate<class _Yp> 5296906c872dSEvgeniy Stepanovinline 52978e25104bSHoward Hinnanttypename enable_if 52988e25104bSHoward Hinnant< 52998e25104bSHoward Hinnant is_convertible<_Yp*, _Tp*>::value, 53003e519524SHoward Hinnant weak_ptr<_Tp>& 53018e25104bSHoward Hinnant>::type 53028e25104bSHoward Hinnantweak_ptr<_Tp>::operator=(weak_ptr<_Yp>&& __r) _NOEXCEPT 53038e25104bSHoward Hinnant{ 53048e25104bSHoward Hinnant weak_ptr(_VSTD::move(__r)).swap(*this); 53058e25104bSHoward Hinnant return *this; 53068e25104bSHoward Hinnant} 53078e25104bSHoward Hinnant 53088e25104bSHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 53098e25104bSHoward Hinnant 53108e25104bSHoward Hinnanttemplate<class _Tp> 53118e25104bSHoward Hinnanttemplate<class _Yp> 5312906c872dSEvgeniy Stepanovinline 53138e25104bSHoward Hinnanttypename enable_if 53148e25104bSHoward Hinnant< 53158e25104bSHoward Hinnant is_convertible<_Yp*, _Tp*>::value, 53168e25104bSHoward Hinnant weak_ptr<_Tp>& 53178e25104bSHoward Hinnant>::type 53183739fe79SHoward Hinnantweak_ptr<_Tp>::operator=(shared_ptr<_Yp> const& __r) _NOEXCEPT 53193e519524SHoward Hinnant{ 53203e519524SHoward Hinnant weak_ptr(__r).swap(*this); 53213e519524SHoward Hinnant return *this; 53223e519524SHoward Hinnant} 53233e519524SHoward Hinnant 53243e519524SHoward Hinnanttemplate<class _Tp> 5325906c872dSEvgeniy Stepanovinline 53263e519524SHoward Hinnantvoid 53273739fe79SHoward Hinnantweak_ptr<_Tp>::swap(weak_ptr& __r) _NOEXCEPT 53283e519524SHoward Hinnant{ 5329ce48a113SHoward Hinnant _VSTD::swap(__ptr_, __r.__ptr_); 5330ce48a113SHoward Hinnant _VSTD::swap(__cntrl_, __r.__cntrl_); 53313e519524SHoward Hinnant} 53323e519524SHoward Hinnant 53333e519524SHoward Hinnanttemplate<class _Tp> 53343e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 53353e519524SHoward Hinnantvoid 53363739fe79SHoward Hinnantswap(weak_ptr<_Tp>& __x, weak_ptr<_Tp>& __y) _NOEXCEPT 53373e519524SHoward Hinnant{ 53383e519524SHoward Hinnant __x.swap(__y); 53393e519524SHoward Hinnant} 53403e519524SHoward Hinnant 53413e519524SHoward Hinnanttemplate<class _Tp> 5342906c872dSEvgeniy Stepanovinline 53433e519524SHoward Hinnantvoid 53443739fe79SHoward Hinnantweak_ptr<_Tp>::reset() _NOEXCEPT 53453e519524SHoward Hinnant{ 53463e519524SHoward Hinnant weak_ptr().swap(*this); 53473e519524SHoward Hinnant} 53483e519524SHoward Hinnant 53493e519524SHoward Hinnanttemplate<class _Tp> 53503e519524SHoward Hinnanttemplate<class _Yp> 53513e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(const weak_ptr<_Yp>& __r, 53523e519524SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type) 53533e519524SHoward Hinnant : __ptr_(__r.__ptr_), 53543e519524SHoward Hinnant __cntrl_(__r.__cntrl_ ? __r.__cntrl_->lock() : __r.__cntrl_) 53553e519524SHoward Hinnant{ 53563e519524SHoward Hinnant if (__cntrl_ == 0) 5357d437fa5cSMarshall Clow __throw_bad_weak_ptr(); 53583e519524SHoward Hinnant} 53593e519524SHoward Hinnant 53603e519524SHoward Hinnanttemplate<class _Tp> 53613e519524SHoward Hinnantshared_ptr<_Tp> 53623739fe79SHoward Hinnantweak_ptr<_Tp>::lock() const _NOEXCEPT 53633e519524SHoward Hinnant{ 53643e519524SHoward Hinnant shared_ptr<_Tp> __r; 53653e519524SHoward Hinnant __r.__cntrl_ = __cntrl_ ? __cntrl_->lock() : __cntrl_; 53663e519524SHoward Hinnant if (__r.__cntrl_) 53673e519524SHoward Hinnant __r.__ptr_ = __ptr_; 53683e519524SHoward Hinnant return __r; 53693e519524SHoward Hinnant} 53703e519524SHoward Hinnant 5371183c010cSMarshall Clow#if _LIBCPP_STD_VER > 14 5372183c010cSMarshall Clowtemplate <class _Tp = void> struct owner_less; 5373183c010cSMarshall Clow#else 53743e519524SHoward Hinnanttemplate <class _Tp> struct owner_less; 5375183c010cSMarshall Clow#endif 53763e519524SHoward Hinnant 53773e519524SHoward Hinnanttemplate <class _Tp> 5378e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS owner_less<shared_ptr<_Tp> > 53793e519524SHoward Hinnant : binary_function<shared_ptr<_Tp>, shared_ptr<_Tp>, bool> 53803e519524SHoward Hinnant{ 53813e519524SHoward Hinnant typedef bool result_type; 5382848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 53833e519524SHoward Hinnant bool operator()(shared_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const 53843e519524SHoward Hinnant {return __x.owner_before(__y);} 5385848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 53863e519524SHoward Hinnant bool operator()(shared_ptr<_Tp> const& __x, weak_ptr<_Tp> const& __y) const 53873e519524SHoward Hinnant {return __x.owner_before(__y);} 5388848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 53893e519524SHoward Hinnant bool operator()( weak_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const 53903e519524SHoward Hinnant {return __x.owner_before(__y);} 53913e519524SHoward Hinnant}; 53923e519524SHoward Hinnant 53933e519524SHoward Hinnanttemplate <class _Tp> 5394e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS owner_less<weak_ptr<_Tp> > 53953e519524SHoward Hinnant : binary_function<weak_ptr<_Tp>, weak_ptr<_Tp>, bool> 53963e519524SHoward Hinnant{ 53973e519524SHoward Hinnant typedef bool result_type; 5398848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 53993e519524SHoward Hinnant bool operator()( weak_ptr<_Tp> const& __x, weak_ptr<_Tp> const& __y) const 54003e519524SHoward Hinnant {return __x.owner_before(__y);} 5401848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 54023e519524SHoward Hinnant bool operator()(shared_ptr<_Tp> const& __x, weak_ptr<_Tp> const& __y) const 54033e519524SHoward Hinnant {return __x.owner_before(__y);} 5404848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 54053e519524SHoward Hinnant bool operator()( weak_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const 54063e519524SHoward Hinnant {return __x.owner_before(__y);} 54073e519524SHoward Hinnant}; 54083e519524SHoward Hinnant 5409183c010cSMarshall Clow#if _LIBCPP_STD_VER > 14 5410183c010cSMarshall Clowtemplate <> 5411e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS owner_less<void> 5412183c010cSMarshall Clow{ 5413183c010cSMarshall Clow template <class _Tp, class _Up> 5414183c010cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 5415183c010cSMarshall Clow bool operator()( shared_ptr<_Tp> const& __x, shared_ptr<_Up> const& __y) const 5416183c010cSMarshall Clow {return __x.owner_before(__y);} 5417183c010cSMarshall Clow template <class _Tp, class _Up> 5418183c010cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 5419183c010cSMarshall Clow bool operator()( shared_ptr<_Tp> const& __x, weak_ptr<_Up> const& __y) const 5420183c010cSMarshall Clow {return __x.owner_before(__y);} 5421183c010cSMarshall Clow template <class _Tp, class _Up> 5422183c010cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 5423183c010cSMarshall Clow bool operator()( weak_ptr<_Tp> const& __x, shared_ptr<_Up> const& __y) const 5424183c010cSMarshall Clow {return __x.owner_before(__y);} 5425183c010cSMarshall Clow template <class _Tp, class _Up> 5426183c010cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 5427183c010cSMarshall Clow bool operator()( weak_ptr<_Tp> const& __x, weak_ptr<_Up> const& __y) const 5428183c010cSMarshall Clow {return __x.owner_before(__y);} 5429183c010cSMarshall Clow typedef void is_transparent; 5430183c010cSMarshall Clow}; 5431183c010cSMarshall Clow#endif 5432183c010cSMarshall Clow 54333e519524SHoward Hinnanttemplate<class _Tp> 5434e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS enable_shared_from_this 54353e519524SHoward Hinnant{ 54363e519524SHoward Hinnant mutable weak_ptr<_Tp> __weak_this_; 54373e519524SHoward Hinnantprotected: 5438c0937e8aSHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 54393739fe79SHoward Hinnant enable_shared_from_this() _NOEXCEPT {} 5440848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 54413739fe79SHoward Hinnant enable_shared_from_this(enable_shared_from_this const&) _NOEXCEPT {} 5442848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 54433739fe79SHoward Hinnant enable_shared_from_this& operator=(enable_shared_from_this const&) _NOEXCEPT 54443739fe79SHoward Hinnant {return *this;} 5445848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 54463e519524SHoward Hinnant ~enable_shared_from_this() {} 54473e519524SHoward Hinnantpublic: 5448848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 54493739fe79SHoward Hinnant shared_ptr<_Tp> shared_from_this() 54503739fe79SHoward Hinnant {return shared_ptr<_Tp>(__weak_this_);} 5451848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 54523739fe79SHoward Hinnant shared_ptr<_Tp const> shared_from_this() const 54533739fe79SHoward Hinnant {return shared_ptr<const _Tp>(__weak_this_);} 54543e519524SHoward Hinnant 545588f5bfdcSEric Fiselier#if _LIBCPP_STD_VER > 14 545688f5bfdcSEric Fiselier _LIBCPP_INLINE_VISIBILITY 545788f5bfdcSEric Fiselier weak_ptr<_Tp> weak_from_this() _NOEXCEPT 545888f5bfdcSEric Fiselier { return __weak_this_; } 545988f5bfdcSEric Fiselier 546088f5bfdcSEric Fiselier _LIBCPP_INLINE_VISIBILITY 546188f5bfdcSEric Fiselier weak_ptr<const _Tp> weak_from_this() const _NOEXCEPT 546288f5bfdcSEric Fiselier { return __weak_this_; } 546388f5bfdcSEric Fiselier#endif // _LIBCPP_STD_VER > 14 546488f5bfdcSEric Fiselier 54653e519524SHoward Hinnant template <class _Up> friend class shared_ptr; 54663e519524SHoward Hinnant}; 54673e519524SHoward Hinnant 5468d1803b6cSHoward Hinnanttemplate <class _Tp> 5469e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS hash<shared_ptr<_Tp> > 5470d1803b6cSHoward Hinnant{ 5471d1803b6cSHoward Hinnant typedef shared_ptr<_Tp> argument_type; 5472d1803b6cSHoward Hinnant typedef size_t result_type; 5473848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 54743739fe79SHoward Hinnant result_type operator()(const argument_type& __ptr) const _NOEXCEPT 5475d1803b6cSHoward Hinnant { 5476d1803b6cSHoward Hinnant return hash<_Tp*>()(__ptr.get()); 5477d1803b6cSHoward Hinnant } 5478d1803b6cSHoward Hinnant}; 5479d1803b6cSHoward Hinnant 5480c003db1fSHoward Hinnanttemplate<class _CharT, class _Traits, class _Yp> 5481e3163f5aSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5482e3163f5aSHoward Hinnantbasic_ostream<_CharT, _Traits>& 5483c003db1fSHoward Hinnantoperator<<(basic_ostream<_CharT, _Traits>& __os, shared_ptr<_Yp> const& __p); 5484e3163f5aSHoward Hinnant 5485df93bad1SEric Fiselier 5486df93bad1SEric Fiselier#if !defined(_LIBCPP_HAS_NO_ATOMIC_HEADER) 5487d77851e8SHoward Hinnant 5488f0544c20SHoward Hinnantclass _LIBCPP_TYPE_VIS __sp_mut 5489d77851e8SHoward Hinnant{ 549054d333a6SHoward Hinnant void* __lx; 5491d77851e8SHoward Hinnantpublic: 5492d77851e8SHoward Hinnant void lock() _NOEXCEPT; 5493d77851e8SHoward Hinnant void unlock() _NOEXCEPT; 5494d77851e8SHoward Hinnant 5495d77851e8SHoward Hinnantprivate: 5496d77851e8SHoward Hinnant _LIBCPP_CONSTEXPR __sp_mut(void*) _NOEXCEPT; 5497d77851e8SHoward Hinnant __sp_mut(const __sp_mut&); 5498d77851e8SHoward Hinnant __sp_mut& operator=(const __sp_mut&); 5499d77851e8SHoward Hinnant 55006e41256fSHoward Hinnant friend _LIBCPP_FUNC_VIS __sp_mut& __get_sp_mut(const void*); 5501d77851e8SHoward Hinnant}; 5502d77851e8SHoward Hinnant 55036e41256fSHoward Hinnant_LIBCPP_FUNC_VIS __sp_mut& __get_sp_mut(const void*); 5504d77851e8SHoward Hinnant 5505d77851e8SHoward Hinnanttemplate <class _Tp> 5506d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5507d77851e8SHoward Hinnantbool 5508d77851e8SHoward Hinnantatomic_is_lock_free(const shared_ptr<_Tp>*) 5509d77851e8SHoward Hinnant{ 5510d77851e8SHoward Hinnant return false; 5511d77851e8SHoward Hinnant} 5512d77851e8SHoward Hinnant 5513d77851e8SHoward Hinnanttemplate <class _Tp> 5514d77851e8SHoward Hinnantshared_ptr<_Tp> 5515d77851e8SHoward Hinnantatomic_load(const shared_ptr<_Tp>* __p) 5516d77851e8SHoward Hinnant{ 5517d77851e8SHoward Hinnant __sp_mut& __m = __get_sp_mut(__p); 5518d77851e8SHoward Hinnant __m.lock(); 5519d77851e8SHoward Hinnant shared_ptr<_Tp> __q = *__p; 5520d77851e8SHoward Hinnant __m.unlock(); 5521d77851e8SHoward Hinnant return __q; 5522d77851e8SHoward Hinnant} 5523d77851e8SHoward Hinnant 5524d77851e8SHoward Hinnanttemplate <class _Tp> 5525d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5526d77851e8SHoward Hinnantshared_ptr<_Tp> 5527d77851e8SHoward Hinnantatomic_load_explicit(const shared_ptr<_Tp>* __p, memory_order) 5528d77851e8SHoward Hinnant{ 5529d77851e8SHoward Hinnant return atomic_load(__p); 5530d77851e8SHoward Hinnant} 5531d77851e8SHoward Hinnant 5532d77851e8SHoward Hinnanttemplate <class _Tp> 5533d77851e8SHoward Hinnantvoid 5534d77851e8SHoward Hinnantatomic_store(shared_ptr<_Tp>* __p, shared_ptr<_Tp> __r) 5535d77851e8SHoward Hinnant{ 5536d77851e8SHoward Hinnant __sp_mut& __m = __get_sp_mut(__p); 5537d77851e8SHoward Hinnant __m.lock(); 5538d77851e8SHoward Hinnant __p->swap(__r); 5539d77851e8SHoward Hinnant __m.unlock(); 5540d77851e8SHoward Hinnant} 5541d77851e8SHoward Hinnant 5542d77851e8SHoward Hinnanttemplate <class _Tp> 5543d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5544d77851e8SHoward Hinnantvoid 5545d77851e8SHoward Hinnantatomic_store_explicit(shared_ptr<_Tp>* __p, shared_ptr<_Tp> __r, memory_order) 5546d77851e8SHoward Hinnant{ 5547d77851e8SHoward Hinnant atomic_store(__p, __r); 5548d77851e8SHoward Hinnant} 5549d77851e8SHoward Hinnant 5550d77851e8SHoward Hinnanttemplate <class _Tp> 5551d77851e8SHoward Hinnantshared_ptr<_Tp> 5552d77851e8SHoward Hinnantatomic_exchange(shared_ptr<_Tp>* __p, shared_ptr<_Tp> __r) 5553d77851e8SHoward Hinnant{ 5554d77851e8SHoward Hinnant __sp_mut& __m = __get_sp_mut(__p); 5555d77851e8SHoward Hinnant __m.lock(); 5556d77851e8SHoward Hinnant __p->swap(__r); 5557d77851e8SHoward Hinnant __m.unlock(); 5558d77851e8SHoward Hinnant return __r; 5559d77851e8SHoward Hinnant} 5560d77851e8SHoward Hinnant 5561d77851e8SHoward Hinnanttemplate <class _Tp> 5562d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5563d77851e8SHoward Hinnantshared_ptr<_Tp> 5564d77851e8SHoward Hinnantatomic_exchange_explicit(shared_ptr<_Tp>* __p, shared_ptr<_Tp> __r, memory_order) 5565d77851e8SHoward Hinnant{ 5566d77851e8SHoward Hinnant return atomic_exchange(__p, __r); 5567d77851e8SHoward Hinnant} 5568d77851e8SHoward Hinnant 5569d77851e8SHoward Hinnanttemplate <class _Tp> 5570d77851e8SHoward Hinnantbool 5571d77851e8SHoward Hinnantatomic_compare_exchange_strong(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v, shared_ptr<_Tp> __w) 5572d77851e8SHoward Hinnant{ 55733379baebSMarshall Clow shared_ptr<_Tp> __temp; 5574d77851e8SHoward Hinnant __sp_mut& __m = __get_sp_mut(__p); 5575d77851e8SHoward Hinnant __m.lock(); 5576d77851e8SHoward Hinnant if (__p->__owner_equivalent(*__v)) 5577d77851e8SHoward Hinnant { 55783379baebSMarshall Clow _VSTD::swap(__temp, *__p); 5579d77851e8SHoward Hinnant *__p = __w; 5580d77851e8SHoward Hinnant __m.unlock(); 5581d77851e8SHoward Hinnant return true; 5582d77851e8SHoward Hinnant } 55833379baebSMarshall Clow _VSTD::swap(__temp, *__v); 5584d77851e8SHoward Hinnant *__v = *__p; 5585d77851e8SHoward Hinnant __m.unlock(); 5586d77851e8SHoward Hinnant return false; 5587d77851e8SHoward Hinnant} 5588d77851e8SHoward Hinnant 5589d77851e8SHoward Hinnanttemplate <class _Tp> 5590d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5591d77851e8SHoward Hinnantbool 5592d77851e8SHoward Hinnantatomic_compare_exchange_weak(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v, shared_ptr<_Tp> __w) 5593d77851e8SHoward Hinnant{ 5594d77851e8SHoward Hinnant return atomic_compare_exchange_strong(__p, __v, __w); 5595d77851e8SHoward Hinnant} 5596d77851e8SHoward Hinnant 5597d77851e8SHoward Hinnanttemplate <class _Tp> 5598d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5599d77851e8SHoward Hinnantbool 5600d77851e8SHoward Hinnantatomic_compare_exchange_strong_explicit(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v, 5601d77851e8SHoward Hinnant shared_ptr<_Tp> __w, memory_order, memory_order) 5602d77851e8SHoward Hinnant{ 5603d77851e8SHoward Hinnant return atomic_compare_exchange_strong(__p, __v, __w); 5604d77851e8SHoward Hinnant} 5605d77851e8SHoward Hinnant 5606d77851e8SHoward Hinnanttemplate <class _Tp> 5607d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5608d77851e8SHoward Hinnantbool 5609d77851e8SHoward Hinnantatomic_compare_exchange_weak_explicit(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v, 5610d77851e8SHoward Hinnant shared_ptr<_Tp> __w, memory_order, memory_order) 5611d77851e8SHoward Hinnant{ 5612d77851e8SHoward Hinnant return atomic_compare_exchange_weak(__p, __v, __w); 5613d77851e8SHoward Hinnant} 5614d77851e8SHoward Hinnant 5615df93bad1SEric Fiselier#endif // !defined(_LIBCPP_HAS_NO_ATOMIC_HEADER) 5616d77851e8SHoward Hinnant 56173e519524SHoward Hinnant//enum class 5618528600c4SEric Fiselier#if defined(_LIBCPP_ABI_POINTER_SAFETY_ENUM_TYPE) 5619528600c4SEric Fiselier# ifndef _LIBCPP_CXX03_LANG 5620528600c4SEric Fiselierenum class pointer_safety : unsigned char { 5621528600c4SEric Fiselier relaxed, 5622528600c4SEric Fiselier preferred, 5623528600c4SEric Fiselier strict 5624528600c4SEric Fiselier}; 5625528600c4SEric Fiselier# endif 5626528600c4SEric Fiselier#else 56276e41256fSHoward Hinnantstruct _LIBCPP_TYPE_VIS pointer_safety 56283e519524SHoward Hinnant{ 562954d333a6SHoward Hinnant enum __lx 56303e519524SHoward Hinnant { 56313e519524SHoward Hinnant relaxed, 56323e519524SHoward Hinnant preferred, 56333e519524SHoward Hinnant strict 56343e519524SHoward Hinnant }; 56353e519524SHoward Hinnant 563654d333a6SHoward Hinnant __lx __v_; 56373e519524SHoward Hinnant 5638848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 563976a01ea3SEric Fiselier pointer_safety() : __v_() {} 564076a01ea3SEric Fiselier 564176a01ea3SEric Fiselier _LIBCPP_INLINE_VISIBILITY 564254d333a6SHoward Hinnant pointer_safety(__lx __v) : __v_(__v) {} 5643848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 56443e519524SHoward Hinnant operator int() const {return __v_;} 56453e519524SHoward Hinnant}; 5646528600c4SEric Fiselier#endif 5647528600c4SEric Fiselier 5648528600c4SEric Fiselier#if !defined(_LIBCPP_ABI_POINTER_SAFETY_ENUM_TYPE) && \ 5649528600c4SEric Fiselier defined(_LIBCPP_BUILDING_MEMORY) 5650528600c4SEric Fiselier_LIBCPP_FUNC_VIS pointer_safety get_pointer_safety() _NOEXCEPT; 5651528600c4SEric Fiselier#else 5652528600c4SEric Fiselier// This function is only offered in C++03 under ABI v1. 5653528600c4SEric Fiselier# if !defined(_LIBCPP_ABI_POINTER_SAFETY_ENUM_TYPE) || !defined(_LIBCPP_CXX03_LANG) 5654528600c4SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 5655528600c4SEric Fiselierpointer_safety get_pointer_safety() _NOEXCEPT { 5656528600c4SEric Fiselier return pointer_safety::relaxed; 5657528600c4SEric Fiselier} 5658528600c4SEric Fiselier# endif 5659528600c4SEric Fiselier#endif 5660528600c4SEric Fiselier 56613e519524SHoward Hinnant 5662f0544c20SHoward Hinnant_LIBCPP_FUNC_VIS void declare_reachable(void* __p); 5663f0544c20SHoward Hinnant_LIBCPP_FUNC_VIS void declare_no_pointers(char* __p, size_t __n); 5664f0544c20SHoward Hinnant_LIBCPP_FUNC_VIS void undeclare_no_pointers(char* __p, size_t __n); 5665f0544c20SHoward Hinnant_LIBCPP_FUNC_VIS void* __undeclare_reachable(void* __p); 56663e519524SHoward Hinnant 56673e519524SHoward Hinnanttemplate <class _Tp> 56683e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 56693e519524SHoward Hinnant_Tp* 56703e519524SHoward Hinnantundeclare_reachable(_Tp* __p) 56713e519524SHoward Hinnant{ 56723e519524SHoward Hinnant return static_cast<_Tp*>(__undeclare_reachable(__p)); 56733e519524SHoward Hinnant} 56743e519524SHoward Hinnant 5675f0544c20SHoward Hinnant_LIBCPP_FUNC_VIS void* align(size_t __align, size_t __sz, void*& __ptr, size_t& __space); 56763e519524SHoward Hinnant 5677e3fbe143SMarshall Clow// --- Helper for container swap -- 5678e3fbe143SMarshall Clowtemplate <typename _Alloc> 567989dd1dd2SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 5680e3fbe143SMarshall Clowvoid __swap_allocator(_Alloc & __a1, _Alloc & __a2) 5681e3fbe143SMarshall Clow#if _LIBCPP_STD_VER >= 14 5682e3fbe143SMarshall Clow _NOEXCEPT 5683e3fbe143SMarshall Clow#else 5684e3fbe143SMarshall Clow _NOEXCEPT_(__is_nothrow_swappable<_Alloc>::value) 5685e3fbe143SMarshall Clow#endif 5686e3fbe143SMarshall Clow{ 5687e3fbe143SMarshall Clow __swap_allocator(__a1, __a2, 5688e3fbe143SMarshall Clow integral_constant<bool, _VSTD::allocator_traits<_Alloc>::propagate_on_container_swap::value>()); 5689e3fbe143SMarshall Clow} 5690e3fbe143SMarshall Clow 5691e3fbe143SMarshall Clowtemplate <typename _Alloc> 5692e3fbe143SMarshall Clow_LIBCPP_INLINE_VISIBILITY 5693e3fbe143SMarshall Clowvoid __swap_allocator(_Alloc & __a1, _Alloc & __a2, true_type) 5694e3fbe143SMarshall Clow#if _LIBCPP_STD_VER >= 14 5695e3fbe143SMarshall Clow _NOEXCEPT 5696e3fbe143SMarshall Clow#else 5697e3fbe143SMarshall Clow _NOEXCEPT_(__is_nothrow_swappable<_Alloc>::value) 5698e3fbe143SMarshall Clow#endif 5699e3fbe143SMarshall Clow{ 5700e3fbe143SMarshall Clow using _VSTD::swap; 5701e3fbe143SMarshall Clow swap(__a1, __a2); 5702e3fbe143SMarshall Clow} 5703e3fbe143SMarshall Clow 5704e3fbe143SMarshall Clowtemplate <typename _Alloc> 570589dd1dd2SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 5706e3fbe143SMarshall Clowvoid __swap_allocator(_Alloc &, _Alloc &, false_type) _NOEXCEPT {} 5707e3fbe143SMarshall Clow 57081378a5aeSMarshall Clowtemplate <typename _Alloc, typename _Traits=allocator_traits<_Alloc> > 57091378a5aeSMarshall Clowstruct __noexcept_move_assign_container : public integral_constant<bool, 57101378a5aeSMarshall Clow _Traits::propagate_on_container_move_assignment::value 57111378a5aeSMarshall Clow#if _LIBCPP_STD_VER > 14 57121378a5aeSMarshall Clow || _Traits::is_always_equal::value 57131378a5aeSMarshall Clow#else 57141378a5aeSMarshall Clow && is_nothrow_move_assignable<_Alloc>::value 57151378a5aeSMarshall Clow#endif 57161378a5aeSMarshall Clow > {}; 5717e3fbe143SMarshall Clow 5718dc3eb83dSMarshall Clow 5719dc3eb83dSMarshall Clow#ifndef _LIBCPP_HAS_NO_VARIADICS 5720dc3eb83dSMarshall Clowtemplate <class _Tp, class _Alloc> 5721dc3eb83dSMarshall Clowstruct __temp_value { 5722dc3eb83dSMarshall Clow typedef allocator_traits<_Alloc> _Traits; 5723dc3eb83dSMarshall Clow 5724dc3eb83dSMarshall Clow typename aligned_storage<sizeof(_Tp), alignof(_Tp)>::type __v; 5725dc3eb83dSMarshall Clow _Alloc &__a; 5726dc3eb83dSMarshall Clow 5727dc3eb83dSMarshall Clow _Tp *__addr() { return reinterpret_cast<_Tp *>(addressof(__v)); } 5728dc3eb83dSMarshall Clow _Tp & get() { return *__addr(); } 5729dc3eb83dSMarshall Clow 5730dc3eb83dSMarshall Clow template<class... _Args> 5731dc3eb83dSMarshall Clow __temp_value(_Alloc &__alloc, _Args&& ... __args) : __a(__alloc) 5732dc3eb83dSMarshall Clow { _Traits::construct(__a, __addr(), _VSTD::forward<_Args>(__args)...); } 5733dc3eb83dSMarshall Clow 5734dc3eb83dSMarshall Clow ~__temp_value() { _Traits::destroy(__a, __addr()); } 5735dc3eb83dSMarshall Clow }; 5736dc3eb83dSMarshall Clow#endif 5737dc3eb83dSMarshall Clow 57383e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD 57393e519524SHoward Hinnant 57403e519524SHoward Hinnant#endif // _LIBCPP_MEMORY 5741