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> 6478e5ce331SSaleem Abdulrasool#include <__undef___deallocate> 648ab4f4382SHoward Hinnant 649073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 6503e519524SHoward Hinnant#pragma GCC system_header 651073458b1SHoward Hinnant#endif 6523e519524SHoward Hinnant 6533e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 6543e519524SHoward Hinnant 6551faf289eSEric Fiseliertemplate <class _ValueType> 6561faf289eSEric Fiselierinline _LIBCPP_ALWAYS_INLINE 6571faf289eSEric Fiselier_ValueType __libcpp_relaxed_load(_ValueType const* __value) { 6581faf289eSEric Fiselier#if !defined(_LIBCPP_HAS_NO_THREADS) && \ 6591faf289eSEric Fiselier defined(__ATOMIC_RELAXED) && \ 6601faf289eSEric Fiselier (__has_builtin(__atomic_load_n) || _GNUC_VER >= 407) 6611faf289eSEric Fiselier return __atomic_load_n(__value, __ATOMIC_RELAXED); 6621faf289eSEric Fiselier#else 6631faf289eSEric Fiselier return *__value; 6641faf289eSEric Fiselier#endif 6651faf289eSEric Fiselier} 6661faf289eSEric Fiselier 667224264adSKuba Breckatemplate <class _ValueType> 668224264adSKuba Breckainline _LIBCPP_ALWAYS_INLINE 669224264adSKuba Brecka_ValueType __libcpp_acquire_load(_ValueType const* __value) { 670224264adSKuba Brecka#if !defined(_LIBCPP_HAS_NO_THREADS) && \ 671224264adSKuba Brecka defined(__ATOMIC_ACQUIRE) && \ 672224264adSKuba Brecka (__has_builtin(__atomic_load_n) || _GNUC_VER >= 407) 673224264adSKuba Brecka return __atomic_load_n(__value, __ATOMIC_ACQUIRE); 674224264adSKuba Brecka#else 675224264adSKuba Brecka return *__value; 676224264adSKuba Brecka#endif 677224264adSKuba Brecka} 678224264adSKuba Brecka 6791c7fe126SMarshall Clow// addressof moved to <type_traits> 68064ec101eSDouglas Gregor 6813e519524SHoward Hinnanttemplate <class _Tp> class allocator; 6823e519524SHoward Hinnant 6833e519524SHoward Hinnanttemplate <> 684*e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS allocator<void> 6853e519524SHoward Hinnant{ 6863e519524SHoward Hinnantpublic: 6873e519524SHoward Hinnant typedef void* pointer; 6883e519524SHoward Hinnant typedef const void* const_pointer; 6893e519524SHoward Hinnant typedef void value_type; 6903e519524SHoward Hinnant 6913e519524SHoward Hinnant template <class _Up> struct rebind {typedef allocator<_Up> other;}; 6923e519524SHoward Hinnant}; 6933e519524SHoward Hinnant 69421fa1887SHoward Hinnanttemplate <> 695*e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS allocator<const void> 69621fa1887SHoward Hinnant{ 69721fa1887SHoward Hinnantpublic: 69821fa1887SHoward Hinnant typedef const void* pointer; 69921fa1887SHoward Hinnant typedef const void* const_pointer; 70021fa1887SHoward Hinnant typedef const void value_type; 70121fa1887SHoward Hinnant 70221fa1887SHoward Hinnant template <class _Up> struct rebind {typedef allocator<_Up> other;}; 70321fa1887SHoward Hinnant}; 70421fa1887SHoward Hinnant 7053e519524SHoward Hinnant// pointer_traits 7063e519524SHoward Hinnant 7073e519524SHoward Hinnanttemplate <class _Tp> 7083e519524SHoward Hinnantstruct __has_element_type 7093e519524SHoward Hinnant{ 7103e519524SHoward Hinnantprivate: 71154d333a6SHoward Hinnant struct __two {char __lx; char __lxx;}; 7123e519524SHoward Hinnant template <class _Up> static __two __test(...); 7133e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::element_type* = 0); 7143e519524SHoward Hinnantpublic: 7153e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 7163e519524SHoward Hinnant}; 7173e519524SHoward Hinnant 7183e519524SHoward Hinnanttemplate <class _Ptr, bool = __has_element_type<_Ptr>::value> 7193e519524SHoward Hinnantstruct __pointer_traits_element_type; 7203e519524SHoward Hinnant 7213e519524SHoward Hinnanttemplate <class _Ptr> 7223e519524SHoward Hinnantstruct __pointer_traits_element_type<_Ptr, true> 7233e519524SHoward Hinnant{ 7243e519524SHoward Hinnant typedef typename _Ptr::element_type type; 7253e519524SHoward Hinnant}; 7263e519524SHoward Hinnant 7273e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 7283e519524SHoward Hinnant 7293e519524SHoward Hinnanttemplate <template <class, class...> class _Sp, class _Tp, class ..._Args> 7303e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _Args...>, true> 7313e519524SHoward Hinnant{ 7323e519524SHoward Hinnant typedef typename _Sp<_Tp, _Args...>::element_type type; 7333e519524SHoward Hinnant}; 7343e519524SHoward Hinnant 7353e519524SHoward Hinnanttemplate <template <class, class...> class _Sp, class _Tp, class ..._Args> 7363e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _Args...>, false> 7373e519524SHoward Hinnant{ 7383e519524SHoward Hinnant typedef _Tp type; 7393e519524SHoward Hinnant}; 7403e519524SHoward Hinnant 741b3371f6fSHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 7423e519524SHoward Hinnant 7433e519524SHoward Hinnanttemplate <template <class> class _Sp, class _Tp> 7443e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp>, true> 7453e519524SHoward Hinnant{ 7463e519524SHoward Hinnant typedef typename _Sp<_Tp>::element_type type; 7473e519524SHoward Hinnant}; 7483e519524SHoward Hinnant 7493e519524SHoward Hinnanttemplate <template <class> class _Sp, class _Tp> 7503e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp>, false> 7513e519524SHoward Hinnant{ 7523e519524SHoward Hinnant typedef _Tp type; 7533e519524SHoward Hinnant}; 7543e519524SHoward Hinnant 7553e519524SHoward Hinnanttemplate <template <class, class> class _Sp, class _Tp, class _A0> 7563e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0>, true> 7573e519524SHoward Hinnant{ 7583e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0>::element_type type; 7593e519524SHoward Hinnant}; 7603e519524SHoward Hinnant 7613e519524SHoward Hinnanttemplate <template <class, class> class _Sp, class _Tp, class _A0> 7623e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0>, false> 7633e519524SHoward Hinnant{ 7643e519524SHoward Hinnant typedef _Tp type; 7653e519524SHoward Hinnant}; 7663e519524SHoward Hinnant 7673e519524SHoward Hinnanttemplate <template <class, class, class> class _Sp, class _Tp, class _A0, class _A1> 7683e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1>, true> 7693e519524SHoward Hinnant{ 7703e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1>::element_type type; 7713e519524SHoward Hinnant}; 7723e519524SHoward Hinnant 7733e519524SHoward Hinnanttemplate <template <class, class, class> class _Sp, class _Tp, class _A0, class _A1> 7743e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1>, false> 7753e519524SHoward Hinnant{ 7763e519524SHoward Hinnant typedef _Tp type; 7773e519524SHoward Hinnant}; 7783e519524SHoward Hinnant 7793e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Sp, class _Tp, class _A0, 7803e519524SHoward Hinnant class _A1, class _A2> 7813e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1, _A2>, true> 7823e519524SHoward Hinnant{ 7833e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1, _A2>::element_type type; 7843e519524SHoward Hinnant}; 7853e519524SHoward Hinnant 7863e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Sp, class _Tp, class _A0, 7873e519524SHoward Hinnant class _A1, class _A2> 7883e519524SHoward Hinnantstruct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1, _A2>, false> 7893e519524SHoward Hinnant{ 7903e519524SHoward Hinnant typedef _Tp type; 7913e519524SHoward Hinnant}; 7923e519524SHoward Hinnant 793b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 7943e519524SHoward Hinnant 7953e519524SHoward Hinnanttemplate <class _Tp> 7963e519524SHoward Hinnantstruct __has_difference_type 7973e519524SHoward Hinnant{ 7983e519524SHoward Hinnantprivate: 79954d333a6SHoward Hinnant struct __two {char __lx; char __lxx;}; 8003e519524SHoward Hinnant template <class _Up> static __two __test(...); 8013e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::difference_type* = 0); 8023e519524SHoward Hinnantpublic: 8033e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 8043e519524SHoward Hinnant}; 8053e519524SHoward Hinnant 8063e519524SHoward Hinnanttemplate <class _Ptr, bool = __has_difference_type<_Ptr>::value> 8073e519524SHoward Hinnantstruct __pointer_traits_difference_type 8083e519524SHoward Hinnant{ 8093e519524SHoward Hinnant typedef ptrdiff_t type; 8103e519524SHoward Hinnant}; 8113e519524SHoward Hinnant 8123e519524SHoward Hinnanttemplate <class _Ptr> 8133e519524SHoward Hinnantstruct __pointer_traits_difference_type<_Ptr, true> 8143e519524SHoward Hinnant{ 8153e519524SHoward Hinnant typedef typename _Ptr::difference_type type; 8163e519524SHoward Hinnant}; 8173e519524SHoward Hinnant 8183e519524SHoward Hinnanttemplate <class _Tp, class _Up> 8193e519524SHoward Hinnantstruct __has_rebind 8203e519524SHoward Hinnant{ 8213e519524SHoward Hinnantprivate: 82254d333a6SHoward Hinnant struct __two {char __lx; char __lxx;}; 8233e519524SHoward Hinnant template <class _Xp> static __two __test(...); 8243e519524SHoward Hinnant template <class _Xp> static char __test(typename _Xp::template rebind<_Up>* = 0); 8253e519524SHoward Hinnantpublic: 8263e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 8273e519524SHoward Hinnant}; 8283e519524SHoward Hinnant 8293e519524SHoward Hinnanttemplate <class _Tp, class _Up, bool = __has_rebind<_Tp, _Up>::value> 8303e519524SHoward Hinnantstruct __pointer_traits_rebind 8313e519524SHoward Hinnant{ 83254613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 8333e519524SHoward Hinnant typedef typename _Tp::template rebind<_Up> type; 8343e519524SHoward Hinnant#else 8353e519524SHoward Hinnant typedef typename _Tp::template rebind<_Up>::other type; 8363e519524SHoward Hinnant#endif 8373e519524SHoward Hinnant}; 8383e519524SHoward Hinnant 8393e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 8403e519524SHoward Hinnant 8413e519524SHoward Hinnanttemplate <template <class, class...> class _Sp, class _Tp, class ..._Args, class _Up> 8423e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _Args...>, _Up, true> 8433e519524SHoward Hinnant{ 84454613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 8453e519524SHoward Hinnant typedef typename _Sp<_Tp, _Args...>::template rebind<_Up> type; 8463e519524SHoward Hinnant#else 8473e519524SHoward Hinnant typedef typename _Sp<_Tp, _Args...>::template rebind<_Up>::other type; 8483e519524SHoward Hinnant#endif 8493e519524SHoward Hinnant}; 8503e519524SHoward Hinnant 8513e519524SHoward Hinnanttemplate <template <class, class...> class _Sp, class _Tp, class ..._Args, class _Up> 8523e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _Args...>, _Up, false> 8533e519524SHoward Hinnant{ 8543e519524SHoward Hinnant typedef _Sp<_Up, _Args...> type; 8553e519524SHoward Hinnant}; 8563e519524SHoward Hinnant 857b3371f6fSHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 8583e519524SHoward Hinnant 8593e519524SHoward Hinnanttemplate <template <class> class _Sp, class _Tp, class _Up> 8603e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp>, _Up, true> 8613e519524SHoward Hinnant{ 86254613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 8633e519524SHoward Hinnant typedef typename _Sp<_Tp>::template rebind<_Up> type; 8643e519524SHoward Hinnant#else 8653e519524SHoward Hinnant typedef typename _Sp<_Tp>::template rebind<_Up>::other type; 8663e519524SHoward Hinnant#endif 8673e519524SHoward Hinnant}; 8683e519524SHoward Hinnant 8693e519524SHoward Hinnanttemplate <template <class> class _Sp, class _Tp, class _Up> 8703e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp>, _Up, false> 8713e519524SHoward Hinnant{ 8723e519524SHoward Hinnant typedef _Sp<_Up> type; 8733e519524SHoward Hinnant}; 8743e519524SHoward Hinnant 8753e519524SHoward Hinnanttemplate <template <class, class> class _Sp, class _Tp, class _A0, class _Up> 8763e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0>, _Up, true> 8773e519524SHoward Hinnant{ 87854613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 8793e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0>::template rebind<_Up> type; 8803e519524SHoward Hinnant#else 8813e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0>::template rebind<_Up>::other type; 8823e519524SHoward Hinnant#endif 8833e519524SHoward Hinnant}; 8843e519524SHoward Hinnant 8853e519524SHoward Hinnanttemplate <template <class, class> class _Sp, class _Tp, class _A0, class _Up> 8863e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0>, _Up, false> 8873e519524SHoward Hinnant{ 8883e519524SHoward Hinnant typedef _Sp<_Up, _A0> type; 8893e519524SHoward Hinnant}; 8903e519524SHoward Hinnant 8913e519524SHoward Hinnanttemplate <template <class, class, class> class _Sp, class _Tp, class _A0, 8923e519524SHoward Hinnant class _A1, class _Up> 8933e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1>, _Up, true> 8943e519524SHoward Hinnant{ 89554613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 8963e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1>::template rebind<_Up> type; 8973e519524SHoward Hinnant#else 8983e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1>::template rebind<_Up>::other type; 8993e519524SHoward Hinnant#endif 9003e519524SHoward Hinnant}; 9013e519524SHoward Hinnant 9023e519524SHoward Hinnanttemplate <template <class, class, class> class _Sp, class _Tp, class _A0, 9033e519524SHoward Hinnant class _A1, class _Up> 9043e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1>, _Up, false> 9053e519524SHoward Hinnant{ 9063e519524SHoward Hinnant typedef _Sp<_Up, _A0, _A1> type; 9073e519524SHoward Hinnant}; 9083e519524SHoward Hinnant 9093e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Sp, class _Tp, class _A0, 9103e519524SHoward Hinnant class _A1, class _A2, class _Up> 9113e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1, _A2>, _Up, true> 9123e519524SHoward Hinnant{ 91354613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 9143e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1, _A2>::template rebind<_Up> type; 9153e519524SHoward Hinnant#else 9163e519524SHoward Hinnant typedef typename _Sp<_Tp, _A0, _A1, _A2>::template rebind<_Up>::other type; 9173e519524SHoward Hinnant#endif 9183e519524SHoward Hinnant}; 9193e519524SHoward Hinnant 9203e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Sp, class _Tp, class _A0, 9213e519524SHoward Hinnant class _A1, class _A2, class _Up> 9223e519524SHoward Hinnantstruct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1, _A2>, _Up, false> 9233e519524SHoward Hinnant{ 9243e519524SHoward Hinnant typedef _Sp<_Up, _A0, _A1, _A2> type; 9253e519524SHoward Hinnant}; 9263e519524SHoward Hinnant 927b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 9283e519524SHoward Hinnant 9293e519524SHoward Hinnanttemplate <class _Ptr> 930*e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS pointer_traits 9313e519524SHoward Hinnant{ 9323e519524SHoward Hinnant typedef _Ptr pointer; 9333e519524SHoward Hinnant typedef typename __pointer_traits_element_type<pointer>::type element_type; 9343e519524SHoward Hinnant typedef typename __pointer_traits_difference_type<pointer>::type difference_type; 9353e519524SHoward Hinnant 93654613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 937f7384975SHoward Hinnant template <class _Up> using rebind = typename __pointer_traits_rebind<pointer, _Up>::type; 9383e519524SHoward Hinnant#else 9393e519524SHoward Hinnant template <class _Up> struct rebind 9403e519524SHoward Hinnant {typedef typename __pointer_traits_rebind<pointer, _Up>::type other;}; 94154613ab4SEric Fiselier#endif // _LIBCPP_CXX03_LANG 9423e519524SHoward Hinnant 9433e519524SHoward Hinnantprivate: 9443e519524SHoward Hinnant struct __nat {}; 9453e519524SHoward Hinnantpublic: 946848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9473e519524SHoward Hinnant static pointer pointer_to(typename conditional<is_void<element_type>::value, 9483e519524SHoward Hinnant __nat, element_type>::type& __r) 9493e519524SHoward Hinnant {return pointer::pointer_to(__r);} 9503e519524SHoward Hinnant}; 9513e519524SHoward Hinnant 9523e519524SHoward Hinnanttemplate <class _Tp> 953*e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS pointer_traits<_Tp*> 9543e519524SHoward Hinnant{ 9553e519524SHoward Hinnant typedef _Tp* pointer; 9563e519524SHoward Hinnant typedef _Tp element_type; 9573e519524SHoward Hinnant typedef ptrdiff_t difference_type; 9583e519524SHoward Hinnant 95954613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 9603e519524SHoward Hinnant template <class _Up> using rebind = _Up*; 9613e519524SHoward Hinnant#else 9623e519524SHoward Hinnant template <class _Up> struct rebind {typedef _Up* other;}; 9633e519524SHoward Hinnant#endif 9643e519524SHoward Hinnant 9653e519524SHoward Hinnantprivate: 9663e519524SHoward Hinnant struct __nat {}; 9673e519524SHoward Hinnantpublic: 968848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9693e519524SHoward Hinnant static pointer pointer_to(typename conditional<is_void<element_type>::value, 9703739fe79SHoward Hinnant __nat, element_type>::type& __r) _NOEXCEPT 971ce48a113SHoward Hinnant {return _VSTD::addressof(__r);} 9723e519524SHoward Hinnant}; 9733e519524SHoward Hinnant 9741c813407SEric Fiseliertemplate <class _From, class _To> 9751c813407SEric Fiselierstruct __rebind_pointer { 97654613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 9771c813407SEric Fiselier typedef typename pointer_traits<_From>::template rebind<_To> type; 9781c813407SEric Fiselier#else 9791c813407SEric Fiselier typedef typename pointer_traits<_From>::template rebind<_To>::other type; 9801c813407SEric Fiselier#endif 9811c813407SEric Fiselier}; 9821c813407SEric Fiselier 9833e519524SHoward Hinnant// allocator_traits 9843e519524SHoward Hinnant 9853e519524SHoward Hinnantnamespace __has_pointer_type_imp 9863e519524SHoward Hinnant{ 987b1c82cd0SHoward Hinnant template <class _Up> static __two __test(...); 988b1c82cd0SHoward Hinnant template <class _Up> static char __test(typename _Up::pointer* = 0); 9893e519524SHoward Hinnant} 9903e519524SHoward Hinnant 9913e519524SHoward Hinnanttemplate <class _Tp> 9923e519524SHoward Hinnantstruct __has_pointer_type 993b1c82cd0SHoward Hinnant : public integral_constant<bool, sizeof(__has_pointer_type_imp::__test<_Tp>(0)) == 1> 9943e519524SHoward Hinnant{ 9953e519524SHoward Hinnant}; 9963e519524SHoward Hinnant 9973e519524SHoward Hinnantnamespace __pointer_type_imp 9983e519524SHoward Hinnant{ 9993e519524SHoward Hinnant 10003e519524SHoward Hinnanttemplate <class _Tp, class _Dp, bool = __has_pointer_type<_Dp>::value> 10013e519524SHoward Hinnantstruct __pointer_type 10023e519524SHoward Hinnant{ 10033e519524SHoward Hinnant typedef typename _Dp::pointer type; 10043e519524SHoward Hinnant}; 10053e519524SHoward Hinnant 10063e519524SHoward Hinnanttemplate <class _Tp, class _Dp> 10073e519524SHoward Hinnantstruct __pointer_type<_Tp, _Dp, false> 10083e519524SHoward Hinnant{ 10093e519524SHoward Hinnant typedef _Tp* type; 10103e519524SHoward Hinnant}; 10113e519524SHoward Hinnant 1012a4a1ef1fSHoward Hinnant} // __pointer_type_imp 10133e519524SHoward Hinnant 10143e519524SHoward Hinnanttemplate <class _Tp, class _Dp> 10153e519524SHoward Hinnantstruct __pointer_type 10163e519524SHoward Hinnant{ 10173e519524SHoward Hinnant typedef typename __pointer_type_imp::__pointer_type<_Tp, typename remove_reference<_Dp>::type>::type type; 10183e519524SHoward Hinnant}; 10193e519524SHoward Hinnant 10203e519524SHoward Hinnanttemplate <class _Tp> 10213e519524SHoward Hinnantstruct __has_const_pointer 10223e519524SHoward Hinnant{ 10233e519524SHoward Hinnantprivate: 102454d333a6SHoward Hinnant struct __two {char __lx; char __lxx;}; 10253e519524SHoward Hinnant template <class _Up> static __two __test(...); 10263e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::const_pointer* = 0); 10273e519524SHoward Hinnantpublic: 10283e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 10293e519524SHoward Hinnant}; 10303e519524SHoward Hinnant 10313e519524SHoward Hinnanttemplate <class _Tp, class _Ptr, class _Alloc, bool = __has_const_pointer<_Alloc>::value> 10323e519524SHoward Hinnantstruct __const_pointer 10333e519524SHoward Hinnant{ 10343e519524SHoward Hinnant typedef typename _Alloc::const_pointer type; 10353e519524SHoward Hinnant}; 10363e519524SHoward Hinnant 10373e519524SHoward Hinnanttemplate <class _Tp, class _Ptr, class _Alloc> 10383e519524SHoward Hinnantstruct __const_pointer<_Tp, _Ptr, _Alloc, false> 10393e519524SHoward Hinnant{ 104054613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 10413e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<const _Tp> type; 10423e519524SHoward Hinnant#else 10433e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<const _Tp>::other type; 10443e519524SHoward Hinnant#endif 10453e519524SHoward Hinnant}; 10463e519524SHoward Hinnant 10473e519524SHoward Hinnanttemplate <class _Tp> 10483e519524SHoward Hinnantstruct __has_void_pointer 10493e519524SHoward Hinnant{ 10503e519524SHoward Hinnantprivate: 105154d333a6SHoward Hinnant struct __two {char __lx; char __lxx;}; 10523e519524SHoward Hinnant template <class _Up> static __two __test(...); 10533e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::void_pointer* = 0); 10543e519524SHoward Hinnantpublic: 10553e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 10563e519524SHoward Hinnant}; 10573e519524SHoward Hinnant 10583e519524SHoward Hinnanttemplate <class _Ptr, class _Alloc, bool = __has_void_pointer<_Alloc>::value> 10593e519524SHoward Hinnantstruct __void_pointer 10603e519524SHoward Hinnant{ 10613e519524SHoward Hinnant typedef typename _Alloc::void_pointer type; 10623e519524SHoward Hinnant}; 10633e519524SHoward Hinnant 10643e519524SHoward Hinnanttemplate <class _Ptr, class _Alloc> 10653e519524SHoward Hinnantstruct __void_pointer<_Ptr, _Alloc, false> 10663e519524SHoward Hinnant{ 106754613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 10683e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<void> type; 10693e519524SHoward Hinnant#else 10703e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<void>::other type; 10713e519524SHoward Hinnant#endif 10723e519524SHoward Hinnant}; 10733e519524SHoward Hinnant 10743e519524SHoward Hinnanttemplate <class _Tp> 10753e519524SHoward Hinnantstruct __has_const_void_pointer 10763e519524SHoward Hinnant{ 10773e519524SHoward Hinnantprivate: 107854d333a6SHoward Hinnant struct __two {char __lx; char __lxx;}; 10793e519524SHoward Hinnant template <class _Up> static __two __test(...); 10803e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::const_void_pointer* = 0); 10813e519524SHoward Hinnantpublic: 10823e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 10833e519524SHoward Hinnant}; 10843e519524SHoward Hinnant 10853e519524SHoward Hinnanttemplate <class _Ptr, class _Alloc, bool = __has_const_void_pointer<_Alloc>::value> 10863e519524SHoward Hinnantstruct __const_void_pointer 10873e519524SHoward Hinnant{ 10883e519524SHoward Hinnant typedef typename _Alloc::const_void_pointer type; 10893e519524SHoward Hinnant}; 10903e519524SHoward Hinnant 10913e519524SHoward Hinnanttemplate <class _Ptr, class _Alloc> 10923e519524SHoward Hinnantstruct __const_void_pointer<_Ptr, _Alloc, false> 10933e519524SHoward Hinnant{ 109454613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 10953e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<const void> type; 10963e519524SHoward Hinnant#else 10973e519524SHoward Hinnant typedef typename pointer_traits<_Ptr>::template rebind<const void>::other type; 10983e519524SHoward Hinnant#endif 10993e519524SHoward Hinnant}; 11003e519524SHoward Hinnant 1101c003db1fSHoward Hinnanttemplate <class _Tp> 11023e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1103c003db1fSHoward Hinnant_Tp* 1104c003db1fSHoward Hinnant__to_raw_pointer(_Tp* __p) _NOEXCEPT 11053e519524SHoward Hinnant{ 11063e519524SHoward Hinnant return __p; 11073e519524SHoward Hinnant} 11083e519524SHoward Hinnant 11093e519524SHoward Hinnanttemplate <class _Pointer> 11103e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 11113e519524SHoward Hinnanttypename pointer_traits<_Pointer>::element_type* 11123739fe79SHoward Hinnant__to_raw_pointer(_Pointer __p) _NOEXCEPT 11133e519524SHoward Hinnant{ 1114ce48a113SHoward Hinnant return _VSTD::__to_raw_pointer(__p.operator->()); 11153e519524SHoward Hinnant} 11163e519524SHoward Hinnant 11173e519524SHoward Hinnanttemplate <class _Tp> 11183e519524SHoward Hinnantstruct __has_size_type 11193e519524SHoward Hinnant{ 11203e519524SHoward Hinnantprivate: 112154d333a6SHoward Hinnant struct __two {char __lx; char __lxx;}; 11223e519524SHoward Hinnant template <class _Up> static __two __test(...); 11233e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::size_type* = 0); 11243e519524SHoward Hinnantpublic: 11253e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 11263e519524SHoward Hinnant}; 11273e519524SHoward Hinnant 1128a4a1ef1fSHoward Hinnanttemplate <class _Alloc, class _DiffType, bool = __has_size_type<_Alloc>::value> 11293e519524SHoward Hinnantstruct __size_type 11303e519524SHoward Hinnant{ 1131a4a1ef1fSHoward Hinnant typedef typename make_unsigned<_DiffType>::type type; 11323e519524SHoward Hinnant}; 11333e519524SHoward Hinnant 1134a4a1ef1fSHoward Hinnanttemplate <class _Alloc, class _DiffType> 1135a4a1ef1fSHoward Hinnantstruct __size_type<_Alloc, _DiffType, true> 11363e519524SHoward Hinnant{ 11373e519524SHoward Hinnant typedef typename _Alloc::size_type type; 11383e519524SHoward Hinnant}; 11393e519524SHoward Hinnant 11403e519524SHoward Hinnanttemplate <class _Tp> 11413e519524SHoward Hinnantstruct __has_propagate_on_container_copy_assignment 11423e519524SHoward Hinnant{ 11433e519524SHoward Hinnantprivate: 114454d333a6SHoward Hinnant struct __two {char __lx; char __lxx;}; 11453e519524SHoward Hinnant template <class _Up> static __two __test(...); 11463e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::propagate_on_container_copy_assignment* = 0); 11473e519524SHoward Hinnantpublic: 11483e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 11493e519524SHoward Hinnant}; 11503e519524SHoward Hinnant 11513e519524SHoward Hinnanttemplate <class _Alloc, bool = __has_propagate_on_container_copy_assignment<_Alloc>::value> 11523e519524SHoward Hinnantstruct __propagate_on_container_copy_assignment 11533e519524SHoward Hinnant{ 11543e519524SHoward Hinnant typedef false_type type; 11553e519524SHoward Hinnant}; 11563e519524SHoward Hinnant 11573e519524SHoward Hinnanttemplate <class _Alloc> 11583e519524SHoward Hinnantstruct __propagate_on_container_copy_assignment<_Alloc, true> 11593e519524SHoward Hinnant{ 11603e519524SHoward Hinnant typedef typename _Alloc::propagate_on_container_copy_assignment type; 11613e519524SHoward Hinnant}; 11623e519524SHoward Hinnant 11633e519524SHoward Hinnanttemplate <class _Tp> 11643e519524SHoward Hinnantstruct __has_propagate_on_container_move_assignment 11653e519524SHoward Hinnant{ 11663e519524SHoward Hinnantprivate: 116754d333a6SHoward Hinnant struct __two {char __lx; char __lxx;}; 11683e519524SHoward Hinnant template <class _Up> static __two __test(...); 11693e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::propagate_on_container_move_assignment* = 0); 11703e519524SHoward Hinnantpublic: 11713e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 11723e519524SHoward Hinnant}; 11733e519524SHoward Hinnant 11743e519524SHoward Hinnanttemplate <class _Alloc, bool = __has_propagate_on_container_move_assignment<_Alloc>::value> 11753e519524SHoward Hinnantstruct __propagate_on_container_move_assignment 11763e519524SHoward Hinnant{ 11773e519524SHoward Hinnant typedef false_type type; 11783e519524SHoward Hinnant}; 11793e519524SHoward Hinnant 11803e519524SHoward Hinnanttemplate <class _Alloc> 11813e519524SHoward Hinnantstruct __propagate_on_container_move_assignment<_Alloc, true> 11823e519524SHoward Hinnant{ 11833e519524SHoward Hinnant typedef typename _Alloc::propagate_on_container_move_assignment type; 11843e519524SHoward Hinnant}; 11853e519524SHoward Hinnant 11863e519524SHoward Hinnanttemplate <class _Tp> 11873e519524SHoward Hinnantstruct __has_propagate_on_container_swap 11883e519524SHoward Hinnant{ 11893e519524SHoward Hinnantprivate: 119054d333a6SHoward Hinnant struct __two {char __lx; char __lxx;}; 11913e519524SHoward Hinnant template <class _Up> static __two __test(...); 11923e519524SHoward Hinnant template <class _Up> static char __test(typename _Up::propagate_on_container_swap* = 0); 11933e519524SHoward Hinnantpublic: 11943e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 11953e519524SHoward Hinnant}; 11963e519524SHoward Hinnant 11973e519524SHoward Hinnanttemplate <class _Alloc, bool = __has_propagate_on_container_swap<_Alloc>::value> 11983e519524SHoward Hinnantstruct __propagate_on_container_swap 11993e519524SHoward Hinnant{ 12003e519524SHoward Hinnant typedef false_type type; 12013e519524SHoward Hinnant}; 12023e519524SHoward Hinnant 12033e519524SHoward Hinnanttemplate <class _Alloc> 12043e519524SHoward Hinnantstruct __propagate_on_container_swap<_Alloc, true> 12053e519524SHoward Hinnant{ 12063e519524SHoward Hinnant typedef typename _Alloc::propagate_on_container_swap type; 12073e519524SHoward Hinnant}; 12083e519524SHoward Hinnant 120931a47313SMarshall Clowtemplate <class _Tp> 121031a47313SMarshall Clowstruct __has_is_always_equal 121131a47313SMarshall Clow{ 121231a47313SMarshall Clowprivate: 121331a47313SMarshall Clow struct __two {char __lx; char __lxx;}; 121431a47313SMarshall Clow template <class _Up> static __two __test(...); 121531a47313SMarshall Clow template <class _Up> static char __test(typename _Up::is_always_equal* = 0); 121631a47313SMarshall Clowpublic: 121731a47313SMarshall Clow static const bool value = sizeof(__test<_Tp>(0)) == 1; 121831a47313SMarshall Clow}; 121931a47313SMarshall Clow 122031a47313SMarshall Clowtemplate <class _Alloc, bool = __has_is_always_equal<_Alloc>::value> 122131a47313SMarshall Clowstruct __is_always_equal 122231a47313SMarshall Clow{ 122331a47313SMarshall Clow typedef typename _VSTD::is_empty<_Alloc>::type type; 122431a47313SMarshall Clow}; 122531a47313SMarshall Clow 122631a47313SMarshall Clowtemplate <class _Alloc> 122731a47313SMarshall Clowstruct __is_always_equal<_Alloc, true> 122831a47313SMarshall Clow{ 122931a47313SMarshall Clow typedef typename _Alloc::is_always_equal type; 123031a47313SMarshall Clow}; 123131a47313SMarshall Clow 12323e519524SHoward Hinnanttemplate <class _Tp, class _Up, bool = __has_rebind<_Tp, _Up>::value> 12333e519524SHoward Hinnantstruct __has_rebind_other 12343e519524SHoward Hinnant{ 12353e519524SHoward Hinnantprivate: 123654d333a6SHoward Hinnant struct __two {char __lx; char __lxx;}; 12373e519524SHoward Hinnant template <class _Xp> static __two __test(...); 12383e519524SHoward Hinnant template <class _Xp> static char __test(typename _Xp::template rebind<_Up>::other* = 0); 12393e519524SHoward Hinnantpublic: 12403e519524SHoward Hinnant static const bool value = sizeof(__test<_Tp>(0)) == 1; 12413e519524SHoward Hinnant}; 12423e519524SHoward Hinnant 12433e519524SHoward Hinnanttemplate <class _Tp, class _Up> 12443e519524SHoward Hinnantstruct __has_rebind_other<_Tp, _Up, false> 12453e519524SHoward Hinnant{ 12463e519524SHoward Hinnant static const bool value = false; 12473e519524SHoward Hinnant}; 12483e519524SHoward Hinnant 12493e519524SHoward Hinnanttemplate <class _Tp, class _Up, bool = __has_rebind_other<_Tp, _Up>::value> 12503e519524SHoward Hinnantstruct __allocator_traits_rebind 12513e519524SHoward Hinnant{ 12523e519524SHoward Hinnant typedef typename _Tp::template rebind<_Up>::other type; 12533e519524SHoward Hinnant}; 12543e519524SHoward Hinnant 12553e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 12563e519524SHoward Hinnant 12573e519524SHoward Hinnanttemplate <template <class, class...> class _Alloc, class _Tp, class ..._Args, class _Up> 12583e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _Args...>, _Up, true> 12593e519524SHoward Hinnant{ 12603e519524SHoward Hinnant typedef typename _Alloc<_Tp, _Args...>::template rebind<_Up>::other type; 12613e519524SHoward Hinnant}; 12623e519524SHoward Hinnant 12633e519524SHoward Hinnanttemplate <template <class, class...> class _Alloc, class _Tp, class ..._Args, class _Up> 12643e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _Args...>, _Up, false> 12653e519524SHoward Hinnant{ 12663e519524SHoward Hinnant typedef _Alloc<_Up, _Args...> type; 12673e519524SHoward Hinnant}; 12683e519524SHoward Hinnant 1269b3371f6fSHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 12703e519524SHoward Hinnant 12713e519524SHoward Hinnanttemplate <template <class> class _Alloc, class _Tp, class _Up> 12723e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp>, _Up, true> 12733e519524SHoward Hinnant{ 12743e519524SHoward Hinnant typedef typename _Alloc<_Tp>::template rebind<_Up>::other type; 12753e519524SHoward Hinnant}; 12763e519524SHoward Hinnant 12773e519524SHoward Hinnanttemplate <template <class> class _Alloc, class _Tp, class _Up> 12783e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp>, _Up, false> 12793e519524SHoward Hinnant{ 12803e519524SHoward Hinnant typedef _Alloc<_Up> type; 12813e519524SHoward Hinnant}; 12823e519524SHoward Hinnant 12833e519524SHoward Hinnanttemplate <template <class, class> class _Alloc, class _Tp, class _A0, class _Up> 12843e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0>, _Up, true> 12853e519524SHoward Hinnant{ 12863e519524SHoward Hinnant typedef typename _Alloc<_Tp, _A0>::template rebind<_Up>::other type; 12873e519524SHoward Hinnant}; 12883e519524SHoward Hinnant 12893e519524SHoward Hinnanttemplate <template <class, class> class _Alloc, class _Tp, class _A0, class _Up> 12903e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0>, _Up, false> 12913e519524SHoward Hinnant{ 12923e519524SHoward Hinnant typedef _Alloc<_Up, _A0> type; 12933e519524SHoward Hinnant}; 12943e519524SHoward Hinnant 12953e519524SHoward Hinnanttemplate <template <class, class, class> class _Alloc, class _Tp, class _A0, 12963e519524SHoward Hinnant class _A1, class _Up> 12973e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1>, _Up, true> 12983e519524SHoward Hinnant{ 12993e519524SHoward Hinnant typedef typename _Alloc<_Tp, _A0, _A1>::template rebind<_Up>::other type; 13003e519524SHoward Hinnant}; 13013e519524SHoward Hinnant 13023e519524SHoward Hinnanttemplate <template <class, class, class> class _Alloc, class _Tp, class _A0, 13033e519524SHoward Hinnant class _A1, class _Up> 13043e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1>, _Up, false> 13053e519524SHoward Hinnant{ 13063e519524SHoward Hinnant typedef _Alloc<_Up, _A0, _A1> type; 13073e519524SHoward Hinnant}; 13083e519524SHoward Hinnant 13093e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Alloc, class _Tp, class _A0, 13103e519524SHoward Hinnant class _A1, class _A2, class _Up> 13113e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1, _A2>, _Up, true> 13123e519524SHoward Hinnant{ 13133e519524SHoward Hinnant typedef typename _Alloc<_Tp, _A0, _A1, _A2>::template rebind<_Up>::other type; 13143e519524SHoward Hinnant}; 13153e519524SHoward Hinnant 13163e519524SHoward Hinnanttemplate <template <class, class, class, class> class _Alloc, class _Tp, class _A0, 13173e519524SHoward Hinnant class _A1, class _A2, class _Up> 13183e519524SHoward Hinnantstruct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1, _A2>, _Up, false> 13193e519524SHoward Hinnant{ 13203e519524SHoward Hinnant typedef _Alloc<_Up, _A0, _A1, _A2> type; 13213e519524SHoward Hinnant}; 13223e519524SHoward Hinnant 1323b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 13243e519524SHoward Hinnant 132554613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 13263e519524SHoward Hinnant 13273e519524SHoward Hinnanttemplate <class _Alloc, class _SizeType, class _ConstVoidPtr> 13283e519524SHoward Hinnantauto 13293e519524SHoward Hinnant__has_allocate_hint_test(_Alloc&& __a, _SizeType&& __sz, _ConstVoidPtr&& __p) 13303e519524SHoward Hinnant -> decltype(__a.allocate(__sz, __p), true_type()); 13313e519524SHoward Hinnant 13323e519524SHoward Hinnanttemplate <class _Alloc, class _SizeType, class _ConstVoidPtr> 13333e519524SHoward Hinnantauto 13343e519524SHoward Hinnant__has_allocate_hint_test(const _Alloc& __a, _SizeType&& __sz, _ConstVoidPtr&& __p) 13353e519524SHoward Hinnant -> false_type; 13363e519524SHoward Hinnant 13373e519524SHoward Hinnanttemplate <class _Alloc, class _SizeType, class _ConstVoidPtr> 13383e519524SHoward Hinnantstruct __has_allocate_hint 13393e519524SHoward Hinnant : integral_constant<bool, 13403e519524SHoward Hinnant is_same< 13413e519524SHoward Hinnant decltype(__has_allocate_hint_test(declval<_Alloc>(), 13423e519524SHoward Hinnant declval<_SizeType>(), 13433e519524SHoward Hinnant declval<_ConstVoidPtr>())), 13443e519524SHoward Hinnant true_type>::value> 13453e519524SHoward Hinnant{ 13463e519524SHoward Hinnant}; 13473e519524SHoward Hinnant 134854613ab4SEric Fiselier#else // _LIBCPP_CXX03_LANG 13493e519524SHoward Hinnant 13503e519524SHoward Hinnanttemplate <class _Alloc, class _SizeType, class _ConstVoidPtr> 13513e519524SHoward Hinnantstruct __has_allocate_hint 13523e519524SHoward Hinnant : true_type 13533e519524SHoward Hinnant{ 13543e519524SHoward Hinnant}; 13553e519524SHoward Hinnant 135654613ab4SEric Fiselier#endif // _LIBCPP_CXX03_LANG 13573e519524SHoward Hinnant 135854613ab4SEric Fiselier#if !defined(_LIBCPP_CXX03_LANG) 13593e519524SHoward Hinnant 13603e519524SHoward Hinnanttemplate <class _Alloc, class _Tp, class ..._Args> 1361ce48a113SHoward Hinnantdecltype(_VSTD::declval<_Alloc>().construct(_VSTD::declval<_Tp*>(), 1362ce48a113SHoward Hinnant _VSTD::declval<_Args>()...), 13633e519524SHoward Hinnant true_type()) 13643e519524SHoward Hinnant__has_construct_test(_Alloc&& __a, _Tp* __p, _Args&& ...__args); 13653e519524SHoward Hinnant 13663e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer, class ..._Args> 13673e519524SHoward Hinnantfalse_type 13683e519524SHoward Hinnant__has_construct_test(const _Alloc& __a, _Pointer&& __p, _Args&& ...__args); 13693e519524SHoward Hinnant 13703e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer, class ..._Args> 13713e519524SHoward Hinnantstruct __has_construct 13723e519524SHoward Hinnant : integral_constant<bool, 13733e519524SHoward Hinnant is_same< 13743e519524SHoward Hinnant decltype(__has_construct_test(declval<_Alloc>(), 13753e519524SHoward Hinnant declval<_Pointer>(), 13763e519524SHoward Hinnant declval<_Args>()...)), 13773e519524SHoward Hinnant true_type>::value> 13783e519524SHoward Hinnant{ 13793e519524SHoward Hinnant}; 13803e519524SHoward Hinnant 13813e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer> 13823e519524SHoward Hinnantauto 13833e519524SHoward Hinnant__has_destroy_test(_Alloc&& __a, _Pointer&& __p) 13843e519524SHoward Hinnant -> decltype(__a.destroy(__p), true_type()); 13853e519524SHoward Hinnant 13863e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer> 13873e519524SHoward Hinnantauto 13883e519524SHoward Hinnant__has_destroy_test(const _Alloc& __a, _Pointer&& __p) 13893e519524SHoward Hinnant -> false_type; 13903e519524SHoward Hinnant 13913e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer> 13923e519524SHoward Hinnantstruct __has_destroy 13933e519524SHoward Hinnant : integral_constant<bool, 13943e519524SHoward Hinnant is_same< 13953e519524SHoward Hinnant decltype(__has_destroy_test(declval<_Alloc>(), 13963e519524SHoward Hinnant declval<_Pointer>())), 13973e519524SHoward Hinnant true_type>::value> 13983e519524SHoward Hinnant{ 13993e519524SHoward Hinnant}; 14003e519524SHoward Hinnant 14013e519524SHoward Hinnanttemplate <class _Alloc> 14023e519524SHoward Hinnantauto 14033e519524SHoward Hinnant__has_max_size_test(_Alloc&& __a) 14043e519524SHoward Hinnant -> decltype(__a.max_size(), true_type()); 14053e519524SHoward Hinnant 14063e519524SHoward Hinnanttemplate <class _Alloc> 14073e519524SHoward Hinnantauto 14083e519524SHoward Hinnant__has_max_size_test(const volatile _Alloc& __a) 14093e519524SHoward Hinnant -> false_type; 14103e519524SHoward Hinnant 14113e519524SHoward Hinnanttemplate <class _Alloc> 14123e519524SHoward Hinnantstruct __has_max_size 14133e519524SHoward Hinnant : integral_constant<bool, 14143e519524SHoward Hinnant is_same< 14153e519524SHoward Hinnant decltype(__has_max_size_test(declval<_Alloc&>())), 14163e519524SHoward Hinnant true_type>::value> 14173e519524SHoward Hinnant{ 14183e519524SHoward Hinnant}; 14193e519524SHoward Hinnant 14203e519524SHoward Hinnanttemplate <class _Alloc> 14213e519524SHoward Hinnantauto 14223e519524SHoward Hinnant__has_select_on_container_copy_construction_test(_Alloc&& __a) 14233e519524SHoward Hinnant -> decltype(__a.select_on_container_copy_construction(), true_type()); 14243e519524SHoward Hinnant 14253e519524SHoward Hinnanttemplate <class _Alloc> 14263e519524SHoward Hinnantauto 14273e519524SHoward Hinnant__has_select_on_container_copy_construction_test(const volatile _Alloc& __a) 14283e519524SHoward Hinnant -> false_type; 14293e519524SHoward Hinnant 14303e519524SHoward Hinnanttemplate <class _Alloc> 14313e519524SHoward Hinnantstruct __has_select_on_container_copy_construction 14323e519524SHoward Hinnant : integral_constant<bool, 14333e519524SHoward Hinnant is_same< 14343e519524SHoward Hinnant decltype(__has_select_on_container_copy_construction_test(declval<_Alloc&>())), 14353e519524SHoward Hinnant true_type>::value> 14363e519524SHoward Hinnant{ 14373e519524SHoward Hinnant}; 14383e519524SHoward Hinnant 143954613ab4SEric Fiselier#else // _LIBCPP_CXX03_LANG 14403e519524SHoward Hinnant 14413e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 14423e519524SHoward Hinnant 14433e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer, class ..._Args> 14443e519524SHoward Hinnantstruct __has_construct 14453e519524SHoward Hinnant : false_type 14463e519524SHoward Hinnant{ 14473e519524SHoward Hinnant}; 14483e519524SHoward Hinnant 14499741d6c9SHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 14509741d6c9SHoward Hinnant 14519741d6c9SHoward Hinnanttemplate <class _Alloc, class _Pointer, class _Args> 14529741d6c9SHoward Hinnantstruct __has_construct 14539741d6c9SHoward Hinnant : false_type 14549741d6c9SHoward Hinnant{ 14559741d6c9SHoward Hinnant}; 14569741d6c9SHoward Hinnant 1457b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 14583e519524SHoward Hinnant 14593e519524SHoward Hinnanttemplate <class _Alloc, class _Pointer> 14603e519524SHoward Hinnantstruct __has_destroy 14613e519524SHoward Hinnant : false_type 14623e519524SHoward Hinnant{ 14633e519524SHoward Hinnant}; 14643e519524SHoward Hinnant 14653e519524SHoward Hinnanttemplate <class _Alloc> 14663e519524SHoward Hinnantstruct __has_max_size 14673e519524SHoward Hinnant : true_type 14683e519524SHoward Hinnant{ 14693e519524SHoward Hinnant}; 14703e519524SHoward Hinnant 14713e519524SHoward Hinnanttemplate <class _Alloc> 14723e519524SHoward Hinnantstruct __has_select_on_container_copy_construction 14733e519524SHoward Hinnant : false_type 14743e519524SHoward Hinnant{ 14753e519524SHoward Hinnant}; 14763e519524SHoward Hinnant 147754613ab4SEric Fiselier#endif // _LIBCPP_CXX03_LANG 14783e519524SHoward Hinnant 1479a4a1ef1fSHoward Hinnanttemplate <class _Alloc, class _Ptr, bool = __has_difference_type<_Alloc>::value> 1480a4a1ef1fSHoward Hinnantstruct __alloc_traits_difference_type 1481a4a1ef1fSHoward Hinnant{ 1482a4a1ef1fSHoward Hinnant typedef typename pointer_traits<_Ptr>::difference_type type; 1483a4a1ef1fSHoward Hinnant}; 1484a4a1ef1fSHoward Hinnant 1485a4a1ef1fSHoward Hinnanttemplate <class _Alloc, class _Ptr> 1486a4a1ef1fSHoward Hinnantstruct __alloc_traits_difference_type<_Alloc, _Ptr, true> 1487a4a1ef1fSHoward Hinnant{ 1488a4a1ef1fSHoward Hinnant typedef typename _Alloc::difference_type type; 1489a4a1ef1fSHoward Hinnant}; 1490a4a1ef1fSHoward Hinnant 14913e519524SHoward Hinnanttemplate <class _Alloc> 1492*e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS allocator_traits 14933e519524SHoward Hinnant{ 14943e519524SHoward Hinnant typedef _Alloc allocator_type; 14953e519524SHoward Hinnant typedef typename allocator_type::value_type value_type; 14963e519524SHoward Hinnant 14973e519524SHoward Hinnant typedef typename __pointer_type<value_type, allocator_type>::type pointer; 14983e519524SHoward Hinnant typedef typename __const_pointer<value_type, pointer, allocator_type>::type const_pointer; 14993e519524SHoward Hinnant typedef typename __void_pointer<pointer, allocator_type>::type void_pointer; 15003e519524SHoward Hinnant typedef typename __const_void_pointer<pointer, allocator_type>::type const_void_pointer; 15013e519524SHoward Hinnant 1502a4a1ef1fSHoward Hinnant typedef typename __alloc_traits_difference_type<allocator_type, pointer>::type difference_type; 1503a4a1ef1fSHoward Hinnant typedef typename __size_type<allocator_type, difference_type>::type size_type; 15043e519524SHoward Hinnant 15053e519524SHoward Hinnant typedef typename __propagate_on_container_copy_assignment<allocator_type>::type 15063e519524SHoward Hinnant propagate_on_container_copy_assignment; 15073e519524SHoward Hinnant typedef typename __propagate_on_container_move_assignment<allocator_type>::type 15083e519524SHoward Hinnant propagate_on_container_move_assignment; 15093e519524SHoward Hinnant typedef typename __propagate_on_container_swap<allocator_type>::type 15103e519524SHoward Hinnant propagate_on_container_swap; 151131a47313SMarshall Clow typedef typename __is_always_equal<allocator_type>::type 151231a47313SMarshall Clow is_always_equal; 15133e519524SHoward Hinnant 151454613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 15153e519524SHoward Hinnant template <class _Tp> using rebind_alloc = 1516f7384975SHoward Hinnant typename __allocator_traits_rebind<allocator_type, _Tp>::type; 15173e519524SHoward Hinnant template <class _Tp> using rebind_traits = allocator_traits<rebind_alloc<_Tp>>; 151854613ab4SEric Fiselier#else // _LIBCPP_CXX03_LANG 15193e519524SHoward Hinnant template <class _Tp> struct rebind_alloc 15203e519524SHoward Hinnant {typedef typename __allocator_traits_rebind<allocator_type, _Tp>::type other;}; 15213e519524SHoward Hinnant template <class _Tp> struct rebind_traits 15223e519524SHoward Hinnant {typedef allocator_traits<typename rebind_alloc<_Tp>::other> other;}; 152354613ab4SEric Fiselier#endif // _LIBCPP_CXX03_LANG 15243e519524SHoward Hinnant 1525848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15263e519524SHoward Hinnant static pointer allocate(allocator_type& __a, size_type __n) 15273e519524SHoward Hinnant {return __a.allocate(__n);} 1528848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15293e519524SHoward Hinnant static pointer allocate(allocator_type& __a, size_type __n, const_void_pointer __hint) 15303e519524SHoward Hinnant {return allocate(__a, __n, __hint, 15313e519524SHoward Hinnant __has_allocate_hint<allocator_type, size_type, const_void_pointer>());} 15323e519524SHoward Hinnant 1533848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15343739fe79SHoward Hinnant static void deallocate(allocator_type& __a, pointer __p, size_type __n) _NOEXCEPT 15353e519524SHoward Hinnant {__a.deallocate(__p, __n);} 15363e519524SHoward Hinnant 15373e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 15383e519524SHoward Hinnant template <class _Tp, class... _Args> 1539848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15403e519524SHoward Hinnant static void construct(allocator_type& __a, _Tp* __p, _Args&&... __args) 1541981f31acSMarshall Clow {__construct(__has_construct<allocator_type, _Tp*, _Args...>(), 1542ce48a113SHoward Hinnant __a, __p, _VSTD::forward<_Args>(__args)...);} 1543b3371f6fSHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 15443e519524SHoward Hinnant template <class _Tp> 1545848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15463e519524SHoward Hinnant static void construct(allocator_type& __a, _Tp* __p) 15473e519524SHoward Hinnant { 15483e519524SHoward Hinnant ::new ((void*)__p) _Tp(); 15493e519524SHoward Hinnant } 15503e519524SHoward Hinnant template <class _Tp, class _A0> 1551848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15523e519524SHoward Hinnant static void construct(allocator_type& __a, _Tp* __p, const _A0& __a0) 15533e519524SHoward Hinnant { 15543e519524SHoward Hinnant ::new ((void*)__p) _Tp(__a0); 15553e519524SHoward Hinnant } 15563e519524SHoward Hinnant template <class _Tp, class _A0, class _A1> 1557848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15583e519524SHoward Hinnant static void construct(allocator_type& __a, _Tp* __p, const _A0& __a0, 15593e519524SHoward Hinnant const _A1& __a1) 15603e519524SHoward Hinnant { 15613e519524SHoward Hinnant ::new ((void*)__p) _Tp(__a0, __a1); 15623e519524SHoward Hinnant } 15633e519524SHoward Hinnant template <class _Tp, class _A0, class _A1, class _A2> 1564848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15653e519524SHoward Hinnant static void construct(allocator_type& __a, _Tp* __p, const _A0& __a0, 15663e519524SHoward Hinnant const _A1& __a1, const _A2& __a2) 15673e519524SHoward Hinnant { 15683e519524SHoward Hinnant ::new ((void*)__p) _Tp(__a0, __a1, __a2); 15693e519524SHoward Hinnant } 1570b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 15713e519524SHoward Hinnant 15723e519524SHoward Hinnant template <class _Tp> 1573848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15743e519524SHoward Hinnant static void destroy(allocator_type& __a, _Tp* __p) 15753e519524SHoward Hinnant {__destroy(__has_destroy<allocator_type, _Tp*>(), __a, __p);} 15763e519524SHoward Hinnant 1577848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 157806fbed03SMarshall Clow static size_type max_size(const allocator_type& __a) _NOEXCEPT 15793e519524SHoward Hinnant {return __max_size(__has_max_size<const allocator_type>(), __a);} 15803e519524SHoward Hinnant 1581848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15823e519524SHoward Hinnant static allocator_type 15833e519524SHoward Hinnant select_on_container_copy_construction(const allocator_type& __a) 15843e519524SHoward Hinnant {return select_on_container_copy_construction( 15853e519524SHoward Hinnant __has_select_on_container_copy_construction<const allocator_type>(), 15863e519524SHoward Hinnant __a);} 15873e519524SHoward Hinnant 15889741d6c9SHoward Hinnant template <class _Ptr> 15899741d6c9SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15909741d6c9SHoward Hinnant static 15919741d6c9SHoward Hinnant void 15929741d6c9SHoward Hinnant __construct_forward(allocator_type& __a, _Ptr __begin1, _Ptr __end1, _Ptr& __begin2) 15939741d6c9SHoward Hinnant { 15949741d6c9SHoward Hinnant for (; __begin1 != __end1; ++__begin1, ++__begin2) 15959741d6c9SHoward Hinnant construct(__a, _VSTD::__to_raw_pointer(__begin2), _VSTD::move_if_noexcept(*__begin1)); 15969741d6c9SHoward Hinnant } 15979741d6c9SHoward Hinnant 15989741d6c9SHoward Hinnant template <class _Tp> 15999741d6c9SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16009741d6c9SHoward Hinnant static 16019741d6c9SHoward Hinnant typename enable_if 16029741d6c9SHoward Hinnant < 16039741d6c9SHoward Hinnant (is_same<allocator_type, allocator<_Tp> >::value 16049741d6c9SHoward Hinnant || !__has_construct<allocator_type, _Tp*, _Tp>::value) && 16059741d6c9SHoward Hinnant is_trivially_move_constructible<_Tp>::value, 16069741d6c9SHoward Hinnant void 16079741d6c9SHoward Hinnant >::type 1608fd838227SEric Fiselier __construct_forward(allocator_type&, _Tp* __begin1, _Tp* __end1, _Tp*& __begin2) 16099741d6c9SHoward Hinnant { 16109741d6c9SHoward Hinnant ptrdiff_t _Np = __end1 - __begin1; 161187601befSMarshall Clow if (_Np > 0) 1612e6230742SMarshall Clow { 16139741d6c9SHoward Hinnant _VSTD::memcpy(__begin2, __begin1, _Np * sizeof(_Tp)); 16149741d6c9SHoward Hinnant __begin2 += _Np; 16159741d6c9SHoward Hinnant } 1616e6230742SMarshall Clow } 16179741d6c9SHoward Hinnant 1618e782178eSEric Fiselier template <class _Iter, class _Ptr> 1619e782178eSEric Fiselier _LIBCPP_INLINE_VISIBILITY 1620e782178eSEric Fiselier static 1621e782178eSEric Fiselier void 1622e782178eSEric Fiselier __construct_range_forward(allocator_type& __a, _Iter __begin1, _Iter __end1, _Ptr& __begin2) 1623e782178eSEric Fiselier { 1624e782178eSEric Fiselier for (; __begin1 != __end1; ++__begin1, (void) ++__begin2) 1625e782178eSEric Fiselier construct(__a, _VSTD::__to_raw_pointer(__begin2), *__begin1); 1626e782178eSEric Fiselier } 1627e782178eSEric Fiselier 1628e782178eSEric Fiselier template <class _Tp> 1629e782178eSEric Fiselier _LIBCPP_INLINE_VISIBILITY 1630e782178eSEric Fiselier static 1631e782178eSEric Fiselier typename enable_if 1632e782178eSEric Fiselier < 1633e782178eSEric Fiselier (is_same<allocator_type, allocator<_Tp> >::value 1634e782178eSEric Fiselier || !__has_construct<allocator_type, _Tp*, _Tp>::value) && 1635e782178eSEric Fiselier is_trivially_move_constructible<_Tp>::value, 1636e782178eSEric Fiselier void 1637e782178eSEric Fiselier >::type 1638fd838227SEric Fiselier __construct_range_forward(allocator_type&, _Tp* __begin1, _Tp* __end1, _Tp*& __begin2) 1639e782178eSEric Fiselier { 1640e782178eSEric Fiselier typedef typename remove_const<_Tp>::type _Vp; 1641e782178eSEric Fiselier ptrdiff_t _Np = __end1 - __begin1; 164287601befSMarshall Clow if (_Np > 0) 1643e6230742SMarshall Clow { 1644e782178eSEric Fiselier _VSTD::memcpy(const_cast<_Vp*>(__begin2), __begin1, _Np * sizeof(_Tp)); 1645e782178eSEric Fiselier __begin2 += _Np; 1646e782178eSEric Fiselier } 1647e6230742SMarshall Clow } 1648e782178eSEric Fiselier 16499741d6c9SHoward Hinnant template <class _Ptr> 16509741d6c9SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16519741d6c9SHoward Hinnant static 16529741d6c9SHoward Hinnant void 16539741d6c9SHoward Hinnant __construct_backward(allocator_type& __a, _Ptr __begin1, _Ptr __end1, _Ptr& __end2) 16549741d6c9SHoward Hinnant { 16559741d6c9SHoward Hinnant while (__end1 != __begin1) 16568d9aec88SHoward Hinnant { 16578d9aec88SHoward Hinnant construct(__a, _VSTD::__to_raw_pointer(__end2-1), _VSTD::move_if_noexcept(*--__end1)); 16588d9aec88SHoward Hinnant --__end2; 16598d9aec88SHoward Hinnant } 16609741d6c9SHoward Hinnant } 16619741d6c9SHoward Hinnant 16629741d6c9SHoward Hinnant template <class _Tp> 16639741d6c9SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16649741d6c9SHoward Hinnant static 16659741d6c9SHoward Hinnant typename enable_if 16669741d6c9SHoward Hinnant < 16679741d6c9SHoward Hinnant (is_same<allocator_type, allocator<_Tp> >::value 16689741d6c9SHoward Hinnant || !__has_construct<allocator_type, _Tp*, _Tp>::value) && 16699741d6c9SHoward Hinnant is_trivially_move_constructible<_Tp>::value, 16709741d6c9SHoward Hinnant void 16719741d6c9SHoward Hinnant >::type 1672fd838227SEric Fiselier __construct_backward(allocator_type&, _Tp* __begin1, _Tp* __end1, _Tp*& __end2) 16739741d6c9SHoward Hinnant { 16749741d6c9SHoward Hinnant ptrdiff_t _Np = __end1 - __begin1; 16759741d6c9SHoward Hinnant __end2 -= _Np; 167687601befSMarshall Clow if (_Np > 0) 16779741d6c9SHoward Hinnant _VSTD::memcpy(__end2, __begin1, _Np * sizeof(_Tp)); 16789741d6c9SHoward Hinnant } 16799741d6c9SHoward Hinnant 16803e519524SHoward Hinnantprivate: 16813e519524SHoward Hinnant 1682848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16833e519524SHoward Hinnant static pointer allocate(allocator_type& __a, size_type __n, 16843e519524SHoward Hinnant const_void_pointer __hint, true_type) 16853e519524SHoward Hinnant {return __a.allocate(__n, __hint);} 1686848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16873e519524SHoward Hinnant static pointer allocate(allocator_type& __a, size_type __n, 1688c206366fSHoward Hinnant const_void_pointer, false_type) 16893e519524SHoward Hinnant {return __a.allocate(__n);} 16903e519524SHoward Hinnant 16913e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 16923e519524SHoward Hinnant template <class _Tp, class... _Args> 1693848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16943e519524SHoward Hinnant static void __construct(true_type, allocator_type& __a, _Tp* __p, _Args&&... __args) 1695ce48a113SHoward Hinnant {__a.construct(__p, _VSTD::forward<_Args>(__args)...);} 16963e519524SHoward Hinnant template <class _Tp, class... _Args> 1697848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16983e519524SHoward Hinnant static void __construct(false_type, allocator_type&, _Tp* __p, _Args&&... __args) 16993e519524SHoward Hinnant { 1700ce48a113SHoward Hinnant ::new ((void*)__p) _Tp(_VSTD::forward<_Args>(__args)...); 17013e519524SHoward Hinnant } 1702b3371f6fSHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 17033e519524SHoward Hinnant 17043e519524SHoward Hinnant template <class _Tp> 1705848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17063e519524SHoward Hinnant static void __destroy(true_type, allocator_type& __a, _Tp* __p) 17073e519524SHoward Hinnant {__a.destroy(__p);} 17083e519524SHoward Hinnant template <class _Tp> 1709848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17103e519524SHoward Hinnant static void __destroy(false_type, allocator_type&, _Tp* __p) 17113e519524SHoward Hinnant { 17123e519524SHoward Hinnant __p->~_Tp(); 17133e519524SHoward Hinnant } 17143e519524SHoward Hinnant 1715848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17163e519524SHoward Hinnant static size_type __max_size(true_type, const allocator_type& __a) 17173e519524SHoward Hinnant {return __a.max_size();} 1718848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17193e519524SHoward Hinnant static size_type __max_size(false_type, const allocator_type&) 1720b631c243SMarshall Clow {return numeric_limits<size_type>::max() / sizeof(value_type);} 17213e519524SHoward Hinnant 1722848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17233e519524SHoward Hinnant static allocator_type 17243e519524SHoward Hinnant select_on_container_copy_construction(true_type, const allocator_type& __a) 17253e519524SHoward Hinnant {return __a.select_on_container_copy_construction();} 1726848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17273e519524SHoward Hinnant static allocator_type 17283e519524SHoward Hinnant select_on_container_copy_construction(false_type, const allocator_type& __a) 17293e519524SHoward Hinnant {return __a;} 17303e519524SHoward Hinnant}; 17313e519524SHoward Hinnant 17321f508014SMarshall Clowtemplate <class _Traits, class _Tp> 17331f508014SMarshall Clowstruct __rebind_alloc_helper 17341f508014SMarshall Clow{ 173554613ab4SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 17361f508014SMarshall Clow typedef typename _Traits::template rebind_alloc<_Tp> type; 17371f508014SMarshall Clow#else 17381f508014SMarshall Clow typedef typename _Traits::template rebind_alloc<_Tp>::other type; 17391f508014SMarshall Clow#endif 17401f508014SMarshall Clow}; 17411f508014SMarshall Clow 17423e519524SHoward Hinnant// allocator 17433e519524SHoward Hinnant 17443e519524SHoward Hinnanttemplate <class _Tp> 1745*e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS allocator 17463e519524SHoward Hinnant{ 17473e519524SHoward Hinnantpublic: 17483e519524SHoward Hinnant typedef size_t size_type; 17493e519524SHoward Hinnant typedef ptrdiff_t difference_type; 17503e519524SHoward Hinnant typedef _Tp* pointer; 17513e519524SHoward Hinnant typedef const _Tp* const_pointer; 17523e519524SHoward Hinnant typedef _Tp& reference; 17533e519524SHoward Hinnant typedef const _Tp& const_reference; 17543e519524SHoward Hinnant typedef _Tp value_type; 17553e519524SHoward Hinnant 1756b58f59cdSHoward Hinnant typedef true_type propagate_on_container_move_assignment; 175731a47313SMarshall Clow typedef true_type is_always_equal; 1758b58f59cdSHoward Hinnant 17593e519524SHoward Hinnant template <class _Up> struct rebind {typedef allocator<_Up> other;}; 17603e519524SHoward Hinnant 17613739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY allocator() _NOEXCEPT {} 17623739fe79SHoward Hinnant template <class _Up> _LIBCPP_INLINE_VISIBILITY allocator(const allocator<_Up>&) _NOEXCEPT {} 17633739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer address(reference __x) const _NOEXCEPT 1764ce48a113SHoward Hinnant {return _VSTD::addressof(__x);} 17653739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY const_pointer address(const_reference __x) const _NOEXCEPT 1766ce48a113SHoward Hinnant {return _VSTD::addressof(__x);} 17673e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer allocate(size_type __n, allocator<void>::const_pointer = 0) 17684cec709eSMarshall Clow { 17694cec709eSMarshall Clow if (__n > max_size()) 17700fc8cec7SMarshall Clow __throw_length_error("allocator<T>::allocate(size_t n)" 17710fc8cec7SMarshall Clow " 'n' exceeds maximum supported size"); 17724cec709eSMarshall Clow return static_cast<pointer>(_VSTD::__allocate(__n * sizeof(_Tp))); 17734cec709eSMarshall Clow } 17743739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void deallocate(pointer __p, size_type) _NOEXCEPT 1775ff0aff3cSRichard Smith {_VSTD::__deallocate((void*)__p);} 17763739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT 17773739fe79SHoward Hinnant {return size_type(~0) / sizeof(_Tp);} 17787609c9b6SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 17793e519524SHoward Hinnant template <class _Up, class... _Args> 17803e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17813e519524SHoward Hinnant void 17823e519524SHoward Hinnant construct(_Up* __p, _Args&&... __args) 17833e519524SHoward Hinnant { 1784ce48a113SHoward Hinnant ::new((void*)__p) _Up(_VSTD::forward<_Args>(__args)...); 17853e519524SHoward Hinnant } 17867609c9b6SHoward Hinnant#else // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 17873e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17883e519524SHoward Hinnant void 17893e519524SHoward Hinnant construct(pointer __p) 17903e519524SHoward Hinnant { 17913e519524SHoward Hinnant ::new((void*)__p) _Tp(); 17923e519524SHoward Hinnant } 1793f5799be4SMichael J. Spencer# if defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) 1794bff1bfc6SHoward Hinnant 17953e519524SHoward Hinnant template <class _A0> 17963e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17973e519524SHoward Hinnant void 17983e519524SHoward Hinnant construct(pointer __p, _A0& __a0) 17993e519524SHoward Hinnant { 18003e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0); 18013e519524SHoward Hinnant } 18023e519524SHoward Hinnant template <class _A0> 18033e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18043e519524SHoward Hinnant void 18053e519524SHoward Hinnant construct(pointer __p, const _A0& __a0) 18063e519524SHoward Hinnant { 18073e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0); 18083e519524SHoward Hinnant } 1809f5799be4SMichael J. Spencer# endif // defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) 18103e519524SHoward Hinnant template <class _A0, class _A1> 18113e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18123e519524SHoward Hinnant void 18133e519524SHoward Hinnant construct(pointer __p, _A0& __a0, _A1& __a1) 18143e519524SHoward Hinnant { 18153e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 18163e519524SHoward Hinnant } 18173e519524SHoward Hinnant template <class _A0, class _A1> 18183e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18193e519524SHoward Hinnant void 18203e519524SHoward Hinnant construct(pointer __p, const _A0& __a0, _A1& __a1) 18213e519524SHoward Hinnant { 18223e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 18233e519524SHoward Hinnant } 18243e519524SHoward Hinnant template <class _A0, class _A1> 18253e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18263e519524SHoward Hinnant void 18273e519524SHoward Hinnant construct(pointer __p, _A0& __a0, const _A1& __a1) 18283e519524SHoward Hinnant { 18293e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 18303e519524SHoward Hinnant } 18313e519524SHoward Hinnant template <class _A0, class _A1> 18323e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18333e519524SHoward Hinnant void 18343e519524SHoward Hinnant construct(pointer __p, const _A0& __a0, const _A1& __a1) 18353e519524SHoward Hinnant { 18363e519524SHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 18373e519524SHoward Hinnant } 18387609c9b6SHoward Hinnant#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 18393e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void destroy(pointer __p) {__p->~_Tp();} 18403e519524SHoward Hinnant}; 18413e519524SHoward Hinnant 18428e25104bSHoward Hinnanttemplate <class _Tp> 1843*e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS allocator<const _Tp> 18448e25104bSHoward Hinnant{ 18458e25104bSHoward Hinnantpublic: 18468e25104bSHoward Hinnant typedef size_t size_type; 18478e25104bSHoward Hinnant typedef ptrdiff_t difference_type; 18488e25104bSHoward Hinnant typedef const _Tp* pointer; 18498e25104bSHoward Hinnant typedef const _Tp* const_pointer; 18508e25104bSHoward Hinnant typedef const _Tp& reference; 18518e25104bSHoward Hinnant typedef const _Tp& const_reference; 185230444adcSHoward Hinnant typedef const _Tp value_type; 18538e25104bSHoward Hinnant 18548e25104bSHoward Hinnant typedef true_type propagate_on_container_move_assignment; 1855f43a42d5SMarshall Clow typedef true_type is_always_equal; 18568e25104bSHoward Hinnant 18578e25104bSHoward Hinnant template <class _Up> struct rebind {typedef allocator<_Up> other;}; 18588e25104bSHoward Hinnant 18598e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY allocator() _NOEXCEPT {} 18608e25104bSHoward Hinnant template <class _Up> _LIBCPP_INLINE_VISIBILITY allocator(const allocator<_Up>&) _NOEXCEPT {} 18618e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY const_pointer address(const_reference __x) const _NOEXCEPT 18628e25104bSHoward Hinnant {return _VSTD::addressof(__x);} 18638e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer allocate(size_type __n, allocator<void>::const_pointer = 0) 18644cec709eSMarshall Clow { 18654cec709eSMarshall Clow if (__n > max_size()) 18660fc8cec7SMarshall Clow __throw_length_error("allocator<const T>::allocate(size_t n)" 18670fc8cec7SMarshall Clow " 'n' exceeds maximum supported size"); 18684cec709eSMarshall Clow return static_cast<pointer>(_VSTD::__allocate(__n * sizeof(_Tp))); 18694cec709eSMarshall Clow } 18708e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY void deallocate(pointer __p, size_type) _NOEXCEPT 1871ff0aff3cSRichard Smith {_VSTD::__deallocate((void*)__p);} 18728e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT 18738e25104bSHoward Hinnant {return size_type(~0) / sizeof(_Tp);} 18748e25104bSHoward Hinnant#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 18758e25104bSHoward Hinnant template <class _Up, class... _Args> 18768e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18778e25104bSHoward Hinnant void 18788e25104bSHoward Hinnant construct(_Up* __p, _Args&&... __args) 18798e25104bSHoward Hinnant { 18808e25104bSHoward Hinnant ::new((void*)__p) _Up(_VSTD::forward<_Args>(__args)...); 18818e25104bSHoward Hinnant } 18828e25104bSHoward Hinnant#else // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 18838e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18848e25104bSHoward Hinnant void 18858e25104bSHoward Hinnant construct(pointer __p) 18868e25104bSHoward Hinnant { 18878e25104bSHoward Hinnant ::new((void*)__p) _Tp(); 18888e25104bSHoward Hinnant } 18898e25104bSHoward Hinnant# if defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) 1890bff1bfc6SHoward Hinnant 18918e25104bSHoward Hinnant template <class _A0> 18928e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18938e25104bSHoward Hinnant void 18948e25104bSHoward Hinnant construct(pointer __p, _A0& __a0) 18958e25104bSHoward Hinnant { 18968e25104bSHoward Hinnant ::new((void*)__p) _Tp(__a0); 18978e25104bSHoward Hinnant } 18988e25104bSHoward Hinnant template <class _A0> 18998e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19008e25104bSHoward Hinnant void 19018e25104bSHoward Hinnant construct(pointer __p, const _A0& __a0) 19028e25104bSHoward Hinnant { 19038e25104bSHoward Hinnant ::new((void*)__p) _Tp(__a0); 19048e25104bSHoward Hinnant } 19058e25104bSHoward Hinnant# endif // defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) 19068e25104bSHoward Hinnant template <class _A0, class _A1> 19078e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19088e25104bSHoward Hinnant void 19098e25104bSHoward Hinnant construct(pointer __p, _A0& __a0, _A1& __a1) 19108e25104bSHoward Hinnant { 19118e25104bSHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 19128e25104bSHoward Hinnant } 19138e25104bSHoward Hinnant template <class _A0, class _A1> 19148e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19158e25104bSHoward Hinnant void 19168e25104bSHoward Hinnant construct(pointer __p, const _A0& __a0, _A1& __a1) 19178e25104bSHoward Hinnant { 19188e25104bSHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 19198e25104bSHoward Hinnant } 19208e25104bSHoward Hinnant template <class _A0, class _A1> 19218e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19228e25104bSHoward Hinnant void 19238e25104bSHoward Hinnant construct(pointer __p, _A0& __a0, const _A1& __a1) 19248e25104bSHoward Hinnant { 19258e25104bSHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 19268e25104bSHoward Hinnant } 19278e25104bSHoward Hinnant template <class _A0, class _A1> 19288e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19298e25104bSHoward Hinnant void 19308e25104bSHoward Hinnant construct(pointer __p, const _A0& __a0, const _A1& __a1) 19318e25104bSHoward Hinnant { 19328e25104bSHoward Hinnant ::new((void*)__p) _Tp(__a0, __a1); 19338e25104bSHoward Hinnant } 19348e25104bSHoward Hinnant#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 19358e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY void destroy(pointer __p) {__p->~_Tp();} 19368e25104bSHoward Hinnant}; 19378e25104bSHoward Hinnant 19383e519524SHoward Hinnanttemplate <class _Tp, class _Up> 19393e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 19403739fe79SHoward Hinnantbool operator==(const allocator<_Tp>&, const allocator<_Up>&) _NOEXCEPT {return true;} 19413e519524SHoward Hinnant 19423e519524SHoward Hinnanttemplate <class _Tp, class _Up> 19433e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 19443739fe79SHoward Hinnantbool operator!=(const allocator<_Tp>&, const allocator<_Up>&) _NOEXCEPT {return false;} 19453e519524SHoward Hinnant 19463e519524SHoward Hinnanttemplate <class _OutputIterator, class _Tp> 1947*e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS raw_storage_iterator 19483e519524SHoward Hinnant : public iterator<output_iterator_tag, 19493e519524SHoward Hinnant _Tp, // purposefully not C++03 19503e519524SHoward Hinnant ptrdiff_t, // purposefully not C++03 19513e519524SHoward Hinnant _Tp*, // purposefully not C++03 19523e519524SHoward Hinnant raw_storage_iterator<_OutputIterator, _Tp>&> // purposefully not C++03 19533e519524SHoward Hinnant{ 19543e519524SHoward Hinnantprivate: 19553e519524SHoward Hinnant _OutputIterator __x_; 19563e519524SHoward Hinnantpublic: 19573e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit raw_storage_iterator(_OutputIterator __x) : __x_(__x) {} 19583e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator*() {return *this;} 19593e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator=(const _Tp& __element) 19603e519524SHoward Hinnant {::new(&*__x_) _Tp(__element); return *this;} 19612603b075SMarshall Clow#if _LIBCPP_STD_VER >= 14 19622603b075SMarshall Clow _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator=(_Tp&& __element) 19632603b075SMarshall Clow {::new(&*__x_) _Tp(_VSTD::move(__element)); return *this;} 19642603b075SMarshall Clow#endif 19653e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator++() {++__x_; return *this;} 19663e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY raw_storage_iterator operator++(int) 19673e519524SHoward Hinnant {raw_storage_iterator __t(*this); ++__x_; return __t;} 1968783b372aSMarshall Clow#if _LIBCPP_STD_VER >= 14 1969783b372aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _OutputIterator base() const { return __x_; } 1970783b372aSMarshall Clow#endif 19713e519524SHoward Hinnant}; 19723e519524SHoward Hinnant 19733e519524SHoward Hinnanttemplate <class _Tp> 19743e519524SHoward Hinnantpair<_Tp*, ptrdiff_t> 19753739fe79SHoward Hinnantget_temporary_buffer(ptrdiff_t __n) _NOEXCEPT 19763e519524SHoward Hinnant{ 19773e519524SHoward Hinnant pair<_Tp*, ptrdiff_t> __r(0, 0); 19783e519524SHoward Hinnant const ptrdiff_t __m = (~ptrdiff_t(0) ^ 19793e519524SHoward Hinnant ptrdiff_t(ptrdiff_t(1) << (sizeof(ptrdiff_t) * __CHAR_BIT__ - 1))) 19803e519524SHoward Hinnant / sizeof(_Tp); 19813e519524SHoward Hinnant if (__n > __m) 19823e519524SHoward Hinnant __n = __m; 19833e519524SHoward Hinnant while (__n > 0) 19843e519524SHoward Hinnant { 19853e519524SHoward Hinnant __r.first = static_cast<_Tp*>(::operator new(__n * sizeof(_Tp), nothrow)); 19863e519524SHoward Hinnant if (__r.first) 19873e519524SHoward Hinnant { 19883e519524SHoward Hinnant __r.second = __n; 19893e519524SHoward Hinnant break; 19903e519524SHoward Hinnant } 19913e519524SHoward Hinnant __n /= 2; 19923e519524SHoward Hinnant } 19933e519524SHoward Hinnant return __r; 19943e519524SHoward Hinnant} 19953e519524SHoward Hinnant 19963e519524SHoward Hinnanttemplate <class _Tp> 19973e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 19983739fe79SHoward Hinnantvoid return_temporary_buffer(_Tp* __p) _NOEXCEPT {::operator delete(__p);} 19993e519524SHoward Hinnant 20003e519524SHoward Hinnanttemplate <class _Tp> 20013e519524SHoward Hinnantstruct auto_ptr_ref 20023e519524SHoward Hinnant{ 20033e519524SHoward Hinnant _Tp* __ptr_; 20043e519524SHoward Hinnant}; 20053e519524SHoward Hinnant 20063e519524SHoward Hinnanttemplate<class _Tp> 2007*e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS auto_ptr 20083e519524SHoward Hinnant{ 20093e519524SHoward Hinnantprivate: 20103e519524SHoward Hinnant _Tp* __ptr_; 20113e519524SHoward Hinnantpublic: 20123e519524SHoward Hinnant typedef _Tp element_type; 20133e519524SHoward Hinnant 20143e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit auto_ptr(_Tp* __p = 0) throw() : __ptr_(__p) {} 20153e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr& __p) throw() : __ptr_(__p.release()) {} 20163e519524SHoward Hinnant template<class _Up> _LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr<_Up>& __p) throw() 20173e519524SHoward Hinnant : __ptr_(__p.release()) {} 20183e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr& __p) throw() 20193e519524SHoward Hinnant {reset(__p.release()); return *this;} 20203e519524SHoward Hinnant template<class _Up> _LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr<_Up>& __p) throw() 20213e519524SHoward Hinnant {reset(__p.release()); return *this;} 20223e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr_ref<_Tp> __p) throw() 20233e519524SHoward Hinnant {reset(__p.__ptr_); return *this;} 20243e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY ~auto_ptr() throw() {delete __ptr_;} 20253e519524SHoward Hinnant 20263e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Tp& operator*() const throw() 20273e519524SHoward Hinnant {return *__ptr_;} 20283e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Tp* operator->() const throw() {return __ptr_;} 20293e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Tp* get() const throw() {return __ptr_;} 20303e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Tp* release() throw() 20313e519524SHoward Hinnant { 20323e519524SHoward Hinnant _Tp* __t = __ptr_; 20333e519524SHoward Hinnant __ptr_ = 0; 20343e519524SHoward Hinnant return __t; 20353e519524SHoward Hinnant } 20363e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void reset(_Tp* __p = 0) throw() 20373e519524SHoward Hinnant { 20383e519524SHoward Hinnant if (__ptr_ != __p) 20393e519524SHoward Hinnant delete __ptr_; 20403e519524SHoward Hinnant __ptr_ = __p; 20413e519524SHoward Hinnant } 20423e519524SHoward Hinnant 20433e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr_ref<_Tp> __p) throw() : __ptr_(__p.__ptr_) {} 20443e519524SHoward Hinnant template<class _Up> _LIBCPP_INLINE_VISIBILITY operator auto_ptr_ref<_Up>() throw() 20453e519524SHoward Hinnant {auto_ptr_ref<_Up> __t; __t.__ptr_ = release(); return __t;} 20463e519524SHoward Hinnant template<class _Up> _LIBCPP_INLINE_VISIBILITY operator auto_ptr<_Up>() throw() 20473e519524SHoward Hinnant {return auto_ptr<_Up>(release());} 20483e519524SHoward Hinnant}; 20493e519524SHoward Hinnant 20503e519524SHoward Hinnanttemplate <> 2051*e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS auto_ptr<void> 20523e519524SHoward Hinnant{ 20533e519524SHoward Hinnantpublic: 20543e519524SHoward Hinnant typedef void element_type; 20553e519524SHoward Hinnant}; 20563e519524SHoward Hinnant 20573e519524SHoward Hinnanttemplate <class _T1, class _T2, bool = is_same<typename remove_cv<_T1>::type, 20583e519524SHoward Hinnant typename remove_cv<_T2>::type>::value, 205942b8bb50SHoward Hinnant bool = is_empty<_T1>::value 2060ee187e24SEric Fiselier && !__libcpp_is_final<_T1>::value, 206142b8bb50SHoward Hinnant bool = is_empty<_T2>::value 2062ee187e24SEric Fiselier && !__libcpp_is_final<_T2>::value 206342b8bb50SHoward Hinnant > 20643e519524SHoward Hinnantstruct __libcpp_compressed_pair_switch; 20653e519524SHoward Hinnant 20663e519524SHoward Hinnanttemplate <class _T1, class _T2, bool IsSame> 20673e519524SHoward Hinnantstruct __libcpp_compressed_pair_switch<_T1, _T2, IsSame, false, false> {enum {value = 0};}; 20683e519524SHoward Hinnant 20693e519524SHoward Hinnanttemplate <class _T1, class _T2, bool IsSame> 20703e519524SHoward Hinnantstruct __libcpp_compressed_pair_switch<_T1, _T2, IsSame, true, false> {enum {value = 1};}; 20713e519524SHoward Hinnant 20723e519524SHoward Hinnanttemplate <class _T1, class _T2, bool IsSame> 20733e519524SHoward Hinnantstruct __libcpp_compressed_pair_switch<_T1, _T2, IsSame, false, true> {enum {value = 2};}; 20743e519524SHoward Hinnant 20753e519524SHoward Hinnanttemplate <class _T1, class _T2> 20763e519524SHoward Hinnantstruct __libcpp_compressed_pair_switch<_T1, _T2, false, true, true> {enum {value = 3};}; 20773e519524SHoward Hinnant 20783e519524SHoward Hinnanttemplate <class _T1, class _T2> 20793e519524SHoward Hinnantstruct __libcpp_compressed_pair_switch<_T1, _T2, true, true, true> {enum {value = 1};}; 20803e519524SHoward Hinnant 20813e519524SHoward Hinnanttemplate <class _T1, class _T2, unsigned = __libcpp_compressed_pair_switch<_T1, _T2>::value> 20823e519524SHoward Hinnantclass __libcpp_compressed_pair_imp; 20833e519524SHoward Hinnant 20843e519524SHoward Hinnanttemplate <class _T1, class _T2> 20853e519524SHoward Hinnantclass __libcpp_compressed_pair_imp<_T1, _T2, 0> 20863e519524SHoward Hinnant{ 20873e519524SHoward Hinnantprivate: 20883e519524SHoward Hinnant _T1 __first_; 20893e519524SHoward Hinnant _T2 __second_; 20903e519524SHoward Hinnantpublic: 20913e519524SHoward Hinnant typedef _T1 _T1_param; 20923e519524SHoward Hinnant typedef _T2 _T2_param; 20933e519524SHoward Hinnant 20943e519524SHoward Hinnant typedef typename remove_reference<_T1>::type& _T1_reference; 20953e519524SHoward Hinnant typedef typename remove_reference<_T2>::type& _T2_reference; 20963e519524SHoward Hinnant 20973e519524SHoward Hinnant typedef const typename remove_reference<_T1>::type& _T1_const_reference; 20983e519524SHoward Hinnant typedef const typename remove_reference<_T2>::type& _T2_const_reference; 20993e519524SHoward Hinnant 210005fc0f25SMarshall Clow _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp() : __first_(), __second_() {} 21018e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T1_param __t1) 210205fc0f25SMarshall Clow : __first_(_VSTD::forward<_T1_param>(__t1)), __second_() {} 21038e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T2_param __t2) 210405fc0f25SMarshall Clow : __first_(), __second_(_VSTD::forward<_T2_param>(__t2)) {} 21053e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(_T1_param __t1, _T2_param __t2) 2106ce48a113SHoward Hinnant : __first_(_VSTD::forward<_T1_param>(__t1)), __second_(_VSTD::forward<_T2_param>(__t2)) {} 21073e519524SHoward Hinnant 2108a87b5e34SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 2109a87b5e34SHoward Hinnant 2110a87b5e34SHoward Hinnant template <class... _Args1, class... _Args2, size_t... _I1, size_t... _I2> 2111a87b5e34SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2112fd838227SEric Fiselier __libcpp_compressed_pair_imp(piecewise_construct_t, 2113a87b5e34SHoward Hinnant tuple<_Args1...> __first_args, 2114a87b5e34SHoward Hinnant tuple<_Args2...> __second_args, 2115a87b5e34SHoward Hinnant __tuple_indices<_I1...>, 2116a87b5e34SHoward Hinnant __tuple_indices<_I2...>) 2117f9af6140SMarshall Clow : __first_(_VSTD::forward<_Args1>(_VSTD::get<_I1>(__first_args))...), 2118f9af6140SMarshall Clow __second_(_VSTD::forward<_Args2>(_VSTD::get<_I2>(__second_args))...) 2119a87b5e34SHoward Hinnant {} 2120a87b5e34SHoward Hinnant 2121a87b5e34SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 2122a87b5e34SHoward Hinnant 21233739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return __first_;} 21243739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return __first_;} 21253e519524SHoward Hinnant 21263739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_reference second() _NOEXCEPT {return __second_;} 21273739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_const_reference second() const _NOEXCEPT {return __second_;} 21283e519524SHoward Hinnant 21293e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void swap(__libcpp_compressed_pair_imp& __x) 21303739fe79SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && 2131afa72ed4SMarshall Clow __is_nothrow_swappable<_T2>::value) 21323e519524SHoward Hinnant { 2133ce48a113SHoward Hinnant using _VSTD::swap; 21343e519524SHoward Hinnant swap(__first_, __x.__first_); 21353e519524SHoward Hinnant swap(__second_, __x.__second_); 21363e519524SHoward Hinnant } 21373e519524SHoward Hinnant}; 21383e519524SHoward Hinnant 21393e519524SHoward Hinnanttemplate <class _T1, class _T2> 21403e519524SHoward Hinnantclass __libcpp_compressed_pair_imp<_T1, _T2, 1> 21413e519524SHoward Hinnant : private _T1 21423e519524SHoward Hinnant{ 21433e519524SHoward Hinnantprivate: 21443e519524SHoward Hinnant _T2 __second_; 21453e519524SHoward Hinnantpublic: 21463e519524SHoward Hinnant typedef _T1 _T1_param; 21473e519524SHoward Hinnant typedef _T2 _T2_param; 21483e519524SHoward Hinnant 21493e519524SHoward Hinnant typedef _T1& _T1_reference; 21503e519524SHoward Hinnant typedef typename remove_reference<_T2>::type& _T2_reference; 21513e519524SHoward Hinnant 21523e519524SHoward Hinnant typedef const _T1& _T1_const_reference; 21533e519524SHoward Hinnant typedef const typename remove_reference<_T2>::type& _T2_const_reference; 21543e519524SHoward Hinnant 215505fc0f25SMarshall Clow _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp() : __second_() {} 21568e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T1_param __t1) 215705fc0f25SMarshall Clow : _T1(_VSTD::forward<_T1_param>(__t1)), __second_() {} 21588e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T2_param __t2) 2159ce48a113SHoward Hinnant : __second_(_VSTD::forward<_T2_param>(__t2)) {} 21603e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(_T1_param __t1, _T2_param __t2) 2161ce48a113SHoward Hinnant : _T1(_VSTD::forward<_T1_param>(__t1)), __second_(_VSTD::forward<_T2_param>(__t2)) {} 21623e519524SHoward Hinnant 2163a87b5e34SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 2164a87b5e34SHoward Hinnant 2165a87b5e34SHoward Hinnant template <class... _Args1, class... _Args2, size_t... _I1, size_t... _I2> 2166a87b5e34SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2167fd838227SEric Fiselier __libcpp_compressed_pair_imp(piecewise_construct_t, 2168a87b5e34SHoward Hinnant tuple<_Args1...> __first_args, 2169a87b5e34SHoward Hinnant tuple<_Args2...> __second_args, 2170a87b5e34SHoward Hinnant __tuple_indices<_I1...>, 2171a87b5e34SHoward Hinnant __tuple_indices<_I2...>) 2172f9af6140SMarshall Clow : _T1(_VSTD::forward<_Args1>(_VSTD::get<_I1>(__first_args))...), 2173f9af6140SMarshall Clow __second_(_VSTD::forward<_Args2>(_VSTD::get<_I2>(__second_args))...) 2174a87b5e34SHoward Hinnant {} 2175a87b5e34SHoward Hinnant 2176a87b5e34SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 2177a87b5e34SHoward Hinnant 21783739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return *this;} 21793739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return *this;} 21803e519524SHoward Hinnant 21813739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_reference second() _NOEXCEPT {return __second_;} 21823739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_const_reference second() const _NOEXCEPT {return __second_;} 21833e519524SHoward Hinnant 21843e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void swap(__libcpp_compressed_pair_imp& __x) 21853739fe79SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && 2186afa72ed4SMarshall Clow __is_nothrow_swappable<_T2>::value) 21873e519524SHoward Hinnant { 2188ce48a113SHoward Hinnant using _VSTD::swap; 21893e519524SHoward Hinnant swap(__second_, __x.__second_); 21903e519524SHoward Hinnant } 21913e519524SHoward Hinnant}; 21923e519524SHoward Hinnant 21933e519524SHoward Hinnanttemplate <class _T1, class _T2> 21943e519524SHoward Hinnantclass __libcpp_compressed_pair_imp<_T1, _T2, 2> 21953e519524SHoward Hinnant : private _T2 21963e519524SHoward Hinnant{ 21973e519524SHoward Hinnantprivate: 21983e519524SHoward Hinnant _T1 __first_; 21993e519524SHoward Hinnantpublic: 22003e519524SHoward Hinnant typedef _T1 _T1_param; 22013e519524SHoward Hinnant typedef _T2 _T2_param; 22023e519524SHoward Hinnant 22033e519524SHoward Hinnant typedef typename remove_reference<_T1>::type& _T1_reference; 22043e519524SHoward Hinnant typedef _T2& _T2_reference; 22053e519524SHoward Hinnant 22063e519524SHoward Hinnant typedef const typename remove_reference<_T1>::type& _T1_const_reference; 22073e519524SHoward Hinnant typedef const _T2& _T2_const_reference; 22083e519524SHoward Hinnant 220905fc0f25SMarshall Clow _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp() : __first_() {} 22103e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T1_param __t1) 2211ce48a113SHoward Hinnant : __first_(_VSTD::forward<_T1_param>(__t1)) {} 22123e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T2_param __t2) 221305fc0f25SMarshall Clow : _T2(_VSTD::forward<_T2_param>(__t2)), __first_() {} 22143e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(_T1_param __t1, _T2_param __t2) 22153739fe79SHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<_T1>::value && 22163739fe79SHoward Hinnant is_nothrow_move_constructible<_T2>::value) 2217ce48a113SHoward Hinnant : _T2(_VSTD::forward<_T2_param>(__t2)), __first_(_VSTD::forward<_T1_param>(__t1)) {} 22183e519524SHoward Hinnant 2219a87b5e34SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 2220a87b5e34SHoward Hinnant 2221a87b5e34SHoward Hinnant template <class... _Args1, class... _Args2, size_t... _I1, size_t... _I2> 2222a87b5e34SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2223fd838227SEric Fiselier __libcpp_compressed_pair_imp(piecewise_construct_t, 2224a87b5e34SHoward Hinnant tuple<_Args1...> __first_args, 2225a87b5e34SHoward Hinnant tuple<_Args2...> __second_args, 2226a87b5e34SHoward Hinnant __tuple_indices<_I1...>, 2227a87b5e34SHoward Hinnant __tuple_indices<_I2...>) 2228f9af6140SMarshall Clow : _T2(_VSTD::forward<_Args2>(_VSTD::get<_I2>(__second_args))...), 2229f9af6140SMarshall Clow __first_(_VSTD::forward<_Args1>(_VSTD::get<_I1>(__first_args))...) 2230a87b5e34SHoward Hinnant 2231a87b5e34SHoward Hinnant {} 2232a87b5e34SHoward Hinnant 2233a87b5e34SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 2234a87b5e34SHoward Hinnant 22353739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return __first_;} 22363739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return __first_;} 22373e519524SHoward Hinnant 22383739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_reference second() _NOEXCEPT {return *this;} 22393739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_const_reference second() const _NOEXCEPT {return *this;} 22403e519524SHoward Hinnant 22413e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void swap(__libcpp_compressed_pair_imp& __x) 22423739fe79SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && 2243afa72ed4SMarshall Clow __is_nothrow_swappable<_T2>::value) 22443e519524SHoward Hinnant { 2245ce48a113SHoward Hinnant using _VSTD::swap; 22463e519524SHoward Hinnant swap(__first_, __x.__first_); 22473e519524SHoward Hinnant } 22483e519524SHoward Hinnant}; 22493e519524SHoward Hinnant 22503e519524SHoward Hinnanttemplate <class _T1, class _T2> 22513e519524SHoward Hinnantclass __libcpp_compressed_pair_imp<_T1, _T2, 3> 22523e519524SHoward Hinnant : private _T1, 22533e519524SHoward Hinnant private _T2 22543e519524SHoward Hinnant{ 22553e519524SHoward Hinnantpublic: 22563e519524SHoward Hinnant typedef _T1 _T1_param; 22573e519524SHoward Hinnant typedef _T2 _T2_param; 22583e519524SHoward Hinnant 22593e519524SHoward Hinnant typedef _T1& _T1_reference; 22603e519524SHoward Hinnant typedef _T2& _T2_reference; 22613e519524SHoward Hinnant 22623e519524SHoward Hinnant typedef const _T1& _T1_const_reference; 22633e519524SHoward Hinnant typedef const _T2& _T2_const_reference; 22643e519524SHoward Hinnant 22653e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp() {} 22663e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T1_param __t1) 2267ce48a113SHoward Hinnant : _T1(_VSTD::forward<_T1_param>(__t1)) {} 22683e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T2_param __t2) 2269ce48a113SHoward Hinnant : _T2(_VSTD::forward<_T2_param>(__t2)) {} 22703e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(_T1_param __t1, _T2_param __t2) 2271ce48a113SHoward Hinnant : _T1(_VSTD::forward<_T1_param>(__t1)), _T2(_VSTD::forward<_T2_param>(__t2)) {} 22723e519524SHoward Hinnant 2273a87b5e34SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 2274a87b5e34SHoward Hinnant 2275a87b5e34SHoward Hinnant template <class... _Args1, class... _Args2, size_t... _I1, size_t... _I2> 2276a87b5e34SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2277fd838227SEric Fiselier __libcpp_compressed_pair_imp(piecewise_construct_t, 2278a87b5e34SHoward Hinnant tuple<_Args1...> __first_args, 2279a87b5e34SHoward Hinnant tuple<_Args2...> __second_args, 2280a87b5e34SHoward Hinnant __tuple_indices<_I1...>, 2281a87b5e34SHoward Hinnant __tuple_indices<_I2...>) 2282f9af6140SMarshall Clow : _T1(_VSTD::forward<_Args1>(_VSTD::get<_I1>(__first_args))...), 2283f9af6140SMarshall Clow _T2(_VSTD::forward<_Args2>(_VSTD::get<_I2>(__second_args))...) 2284a87b5e34SHoward Hinnant {} 2285a87b5e34SHoward Hinnant 2286a87b5e34SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 2287a87b5e34SHoward Hinnant 22883739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return *this;} 22893739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return *this;} 22903e519524SHoward Hinnant 22913739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_reference second() _NOEXCEPT {return *this;} 22923739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_const_reference second() const _NOEXCEPT {return *this;} 22933e519524SHoward Hinnant 2294c206366fSHoward Hinnant _LIBCPP_INLINE_VISIBILITY void swap(__libcpp_compressed_pair_imp&) 22953739fe79SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && 2296afa72ed4SMarshall Clow __is_nothrow_swappable<_T2>::value) 22973e519524SHoward Hinnant { 22983e519524SHoward Hinnant } 22993e519524SHoward Hinnant}; 23003e519524SHoward Hinnant 23013e519524SHoward Hinnanttemplate <class _T1, class _T2> 23023e519524SHoward Hinnantclass __compressed_pair 23033e519524SHoward Hinnant : private __libcpp_compressed_pair_imp<_T1, _T2> 23043e519524SHoward Hinnant{ 23053e519524SHoward Hinnant typedef __libcpp_compressed_pair_imp<_T1, _T2> base; 23063e519524SHoward Hinnantpublic: 23073e519524SHoward Hinnant typedef typename base::_T1_param _T1_param; 23083e519524SHoward Hinnant typedef typename base::_T2_param _T2_param; 23093e519524SHoward Hinnant 23103e519524SHoward Hinnant typedef typename base::_T1_reference _T1_reference; 23113e519524SHoward Hinnant typedef typename base::_T2_reference _T2_reference; 23123e519524SHoward Hinnant 23133e519524SHoward Hinnant typedef typename base::_T1_const_reference _T1_const_reference; 23143e519524SHoward Hinnant typedef typename base::_T2_const_reference _T2_const_reference; 23153e519524SHoward Hinnant 23163e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __compressed_pair() {} 23178e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __compressed_pair(_T1_param __t1) 2318ce48a113SHoward Hinnant : base(_VSTD::forward<_T1_param>(__t1)) {} 23198e25104bSHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __compressed_pair(_T2_param __t2) 2320ce48a113SHoward Hinnant : base(_VSTD::forward<_T2_param>(__t2)) {} 23213e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __compressed_pair(_T1_param __t1, _T2_param __t2) 2322ce48a113SHoward Hinnant : base(_VSTD::forward<_T1_param>(__t1), _VSTD::forward<_T2_param>(__t2)) {} 23233e519524SHoward Hinnant 2324a87b5e34SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 2325a87b5e34SHoward Hinnant 2326a87b5e34SHoward Hinnant template <class... _Args1, class... _Args2> 2327a87b5e34SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2328a87b5e34SHoward Hinnant __compressed_pair(piecewise_construct_t __pc, tuple<_Args1...> __first_args, 2329a87b5e34SHoward Hinnant tuple<_Args2...> __second_args) 23308e25104bSHoward Hinnant : base(__pc, _VSTD::move(__first_args), _VSTD::move(__second_args), 2331a87b5e34SHoward Hinnant typename __make_tuple_indices<sizeof...(_Args1)>::type(), 2332a87b5e34SHoward Hinnant typename __make_tuple_indices<sizeof...(_Args2) >::type()) 2333a87b5e34SHoward Hinnant {} 2334a87b5e34SHoward Hinnant 2335a87b5e34SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 2336a87b5e34SHoward Hinnant 23373739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return base::first();} 23383739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return base::first();} 23393e519524SHoward Hinnant 23403739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_reference second() _NOEXCEPT {return base::second();} 23413739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _T2_const_reference second() const _NOEXCEPT {return base::second();} 23423e519524SHoward Hinnant 23433739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void swap(__compressed_pair& __x) 23443739fe79SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && 2345afa72ed4SMarshall Clow __is_nothrow_swappable<_T2>::value) 23463739fe79SHoward Hinnant {base::swap(__x);} 23473e519524SHoward Hinnant}; 23483e519524SHoward Hinnant 23493e519524SHoward Hinnanttemplate <class _T1, class _T2> 23503e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 23513e519524SHoward Hinnantvoid 23523e519524SHoward Hinnantswap(__compressed_pair<_T1, _T2>& __x, __compressed_pair<_T1, _T2>& __y) 23533739fe79SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && 2354afa72ed4SMarshall Clow __is_nothrow_swappable<_T2>::value) 23553e519524SHoward Hinnant {__x.swap(__y);} 23563e519524SHoward Hinnant 23578e25104bSHoward Hinnant// __same_or_less_cv_qualified 23588e25104bSHoward Hinnant 23598e25104bSHoward Hinnanttemplate <class _Ptr1, class _Ptr2, 23608e25104bSHoward Hinnant bool = is_same<typename remove_cv<typename pointer_traits<_Ptr1>::element_type>::type, 23618e25104bSHoward Hinnant typename remove_cv<typename pointer_traits<_Ptr2>::element_type>::type 23628e25104bSHoward Hinnant >::value 23638e25104bSHoward Hinnant > 23648e25104bSHoward Hinnantstruct __same_or_less_cv_qualified_imp 23658e25104bSHoward Hinnant : is_convertible<_Ptr1, _Ptr2> {}; 23668e25104bSHoward Hinnant 23678e25104bSHoward Hinnanttemplate <class _Ptr1, class _Ptr2> 23688e25104bSHoward Hinnantstruct __same_or_less_cv_qualified_imp<_Ptr1, _Ptr2, false> 23698e25104bSHoward Hinnant : false_type {}; 23708e25104bSHoward Hinnant 237185d3e7a7SMarshall Clowtemplate <class _Ptr1, class _Ptr2, bool = is_pointer<_Ptr1>::value || 237285d3e7a7SMarshall Clow is_same<_Ptr1, _Ptr2>::value || 237385d3e7a7SMarshall Clow __has_element_type<_Ptr1>::value> 23748e25104bSHoward Hinnantstruct __same_or_less_cv_qualified 23758e25104bSHoward Hinnant : __same_or_less_cv_qualified_imp<_Ptr1, _Ptr2> {}; 23768e25104bSHoward Hinnant 23778e25104bSHoward Hinnanttemplate <class _Ptr1, class _Ptr2> 237885d3e7a7SMarshall Clowstruct __same_or_less_cv_qualified<_Ptr1, _Ptr2, false> 23798e25104bSHoward Hinnant : false_type {}; 23808e25104bSHoward Hinnant 23818e25104bSHoward Hinnant// default_delete 23828e25104bSHoward Hinnant 23833e519524SHoward Hinnanttemplate <class _Tp> 2384*e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS default_delete 23853e519524SHoward Hinnant{ 2386f9980200SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 2387c0937e8aSHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR default_delete() _NOEXCEPT = default; 2388c0937e8aSHoward Hinnant#else 2389c0937e8aSHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR default_delete() _NOEXCEPT {} 2390c0937e8aSHoward Hinnant#endif 23913e519524SHoward Hinnant template <class _Up> 23923e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY default_delete(const default_delete<_Up>&, 23933739fe79SHoward Hinnant typename enable_if<is_convertible<_Up*, _Tp*>::value>::type* = 0) _NOEXCEPT {} 23943739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void operator() (_Tp* __ptr) const _NOEXCEPT 23953e519524SHoward Hinnant { 23963e519524SHoward Hinnant static_assert(sizeof(_Tp) > 0, "default_delete can not delete incomplete type"); 239703ec04f9SHoward Hinnant static_assert(!is_void<_Tp>::value, "default_delete can not delete incomplete type"); 23983e519524SHoward Hinnant delete __ptr; 23993e519524SHoward Hinnant } 24003e519524SHoward Hinnant}; 24013e519524SHoward Hinnant 24023e519524SHoward Hinnanttemplate <class _Tp> 2403*e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS default_delete<_Tp[]> 24043e519524SHoward Hinnant{ 2405e4097ad7SHoward Hinnantpublic: 2406f9980200SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 2407c0937e8aSHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR default_delete() _NOEXCEPT = default; 2408c0937e8aSHoward Hinnant#else 2409c0937e8aSHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR default_delete() _NOEXCEPT {} 2410c0937e8aSHoward Hinnant#endif 2411e4097ad7SHoward Hinnant template <class _Up> 2412e4097ad7SHoward Hinnant _LIBCPP_INLINE_VISIBILITY default_delete(const default_delete<_Up[]>&, 24138e25104bSHoward Hinnant typename enable_if<__same_or_less_cv_qualified<_Up*, _Tp*>::value>::type* = 0) _NOEXCEPT {} 2414e4097ad7SHoward Hinnant template <class _Up> 2415e4097ad7SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2416e4097ad7SHoward Hinnant void operator() (_Up* __ptr, 24178e25104bSHoward Hinnant typename enable_if<__same_or_less_cv_qualified<_Up*, _Tp*>::value>::type* = 0) const _NOEXCEPT 24183e519524SHoward Hinnant { 24193e519524SHoward Hinnant static_assert(sizeof(_Tp) > 0, "default_delete can not delete incomplete type"); 2420026b8056SMarshall Clow static_assert(!is_void<_Tp>::value, "default_delete can not delete void type"); 24213e519524SHoward Hinnant delete [] __ptr; 24223e519524SHoward Hinnant } 24233e519524SHoward Hinnant}; 24243e519524SHoward Hinnant 24253e519524SHoward Hinnanttemplate <class _Tp, class _Dp = default_delete<_Tp> > 2426*e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS unique_ptr 24273e519524SHoward Hinnant{ 24283e519524SHoward Hinnantpublic: 24293e519524SHoward Hinnant typedef _Tp element_type; 24303e519524SHoward Hinnant typedef _Dp deleter_type; 24313e519524SHoward Hinnant typedef typename __pointer_type<_Tp, deleter_type>::type pointer; 24323e519524SHoward Hinnantprivate: 24333e519524SHoward Hinnant __compressed_pair<pointer, deleter_type> __ptr_; 24343e519524SHoward Hinnant 24358e25104bSHoward Hinnant#ifdef _LIBCPP_HAS_NO_RVALUE_REFERENCES 24363e519524SHoward Hinnant unique_ptr(unique_ptr&); 24373e519524SHoward Hinnant template <class _Up, class _Ep> 24383e519524SHoward Hinnant unique_ptr(unique_ptr<_Up, _Ep>&); 24393e519524SHoward Hinnant unique_ptr& operator=(unique_ptr&); 24403e519524SHoward Hinnant template <class _Up, class _Ep> 24413e519524SHoward Hinnant unique_ptr& operator=(unique_ptr<_Up, _Ep>&); 24427609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 24433e519524SHoward Hinnant 24443e519524SHoward Hinnant struct __nat {int __for_bool_;}; 24453e519524SHoward Hinnant 24463e519524SHoward Hinnant typedef typename remove_reference<deleter_type>::type& _Dp_reference; 24473e519524SHoward Hinnant typedef const typename remove_reference<deleter_type>::type& _Dp_const_reference; 24483e519524SHoward Hinnantpublic: 2449c0937e8aSHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR unique_ptr() _NOEXCEPT 24503e519524SHoward Hinnant : __ptr_(pointer()) 24513e519524SHoward Hinnant { 24523e519524SHoward Hinnant static_assert(!is_pointer<deleter_type>::value, 24533e519524SHoward Hinnant "unique_ptr constructed with null function pointer deleter"); 24543e519524SHoward Hinnant } 2455c0937e8aSHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR unique_ptr(nullptr_t) _NOEXCEPT 24563e519524SHoward Hinnant : __ptr_(pointer()) 24573e519524SHoward Hinnant { 24583e519524SHoward Hinnant static_assert(!is_pointer<deleter_type>::value, 24593e519524SHoward Hinnant "unique_ptr constructed with null function pointer deleter"); 24603e519524SHoward Hinnant } 24613739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit unique_ptr(pointer __p) _NOEXCEPT 2462ce48a113SHoward Hinnant : __ptr_(_VSTD::move(__p)) 24633e519524SHoward Hinnant { 24643e519524SHoward Hinnant static_assert(!is_pointer<deleter_type>::value, 24653e519524SHoward Hinnant "unique_ptr constructed with null function pointer deleter"); 24663e519524SHoward Hinnant } 24673e519524SHoward Hinnant 24687609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 24693e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(pointer __p, typename conditional< 24703e519524SHoward Hinnant is_reference<deleter_type>::value, 24713e519524SHoward Hinnant deleter_type, 24723e519524SHoward Hinnant typename add_lvalue_reference<const deleter_type>::type>::type __d) 24733739fe79SHoward Hinnant _NOEXCEPT 24743e519524SHoward Hinnant : __ptr_(__p, __d) {} 24753e519524SHoward Hinnant 24763e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(pointer __p, typename remove_reference<deleter_type>::type&& __d) 24773739fe79SHoward Hinnant _NOEXCEPT 2478ce48a113SHoward Hinnant : __ptr_(__p, _VSTD::move(__d)) 24793e519524SHoward Hinnant { 24803e519524SHoward Hinnant static_assert(!is_reference<deleter_type>::value, "rvalue deleter bound to reference"); 24813e519524SHoward Hinnant } 24823739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(unique_ptr&& __u) _NOEXCEPT 2483ce48a113SHoward Hinnant : __ptr_(__u.release(), _VSTD::forward<deleter_type>(__u.get_deleter())) {} 24843e519524SHoward Hinnant template <class _Up, class _Ep> 24853e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 24863e519524SHoward Hinnant unique_ptr(unique_ptr<_Up, _Ep>&& __u, 24873e519524SHoward Hinnant typename enable_if 24883e519524SHoward Hinnant < 24893e519524SHoward Hinnant !is_array<_Up>::value && 24903e519524SHoward Hinnant is_convertible<typename unique_ptr<_Up, _Ep>::pointer, pointer>::value && 24913e519524SHoward Hinnant is_convertible<_Ep, deleter_type>::value && 24923e519524SHoward Hinnant ( 24933e519524SHoward Hinnant !is_reference<deleter_type>::value || 24943e519524SHoward Hinnant is_same<deleter_type, _Ep>::value 24953e519524SHoward Hinnant ), 24963e519524SHoward Hinnant __nat 24973739fe79SHoward Hinnant >::type = __nat()) _NOEXCEPT 2498ce48a113SHoward Hinnant : __ptr_(__u.release(), _VSTD::forward<_Ep>(__u.get_deleter())) {} 24993e519524SHoward Hinnant 25003e519524SHoward Hinnant template <class _Up> 25013e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(auto_ptr<_Up>&& __p, 25023e519524SHoward Hinnant typename enable_if< 25033e519524SHoward Hinnant is_convertible<_Up*, _Tp*>::value && 25043e519524SHoward Hinnant is_same<_Dp, default_delete<_Tp> >::value, 25053e519524SHoward Hinnant __nat 25063739fe79SHoward Hinnant >::type = __nat()) _NOEXCEPT 25073e519524SHoward Hinnant : __ptr_(__p.release()) 25083e519524SHoward Hinnant { 25093e519524SHoward Hinnant } 25103e519524SHoward Hinnant 25113739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(unique_ptr&& __u) _NOEXCEPT 25123e519524SHoward Hinnant { 25133e519524SHoward Hinnant reset(__u.release()); 2514ce48a113SHoward Hinnant __ptr_.second() = _VSTD::forward<deleter_type>(__u.get_deleter()); 25153e519524SHoward Hinnant return *this; 25163e519524SHoward Hinnant } 25173e519524SHoward Hinnant 25183e519524SHoward Hinnant template <class _Up, class _Ep> 25193e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 25203e519524SHoward Hinnant typename enable_if 25213e519524SHoward Hinnant < 25228e25104bSHoward Hinnant !is_array<_Up>::value && 25238e25104bSHoward Hinnant is_convertible<typename unique_ptr<_Up, _Ep>::pointer, pointer>::value && 25248e25104bSHoward Hinnant is_assignable<deleter_type&, _Ep&&>::value, 25253e519524SHoward Hinnant unique_ptr& 25263e519524SHoward Hinnant >::type 25273739fe79SHoward Hinnant operator=(unique_ptr<_Up, _Ep>&& __u) _NOEXCEPT 25283e519524SHoward Hinnant { 25293e519524SHoward Hinnant reset(__u.release()); 2530ce48a113SHoward Hinnant __ptr_.second() = _VSTD::forward<_Ep>(__u.get_deleter()); 25313e519524SHoward Hinnant return *this; 25323e519524SHoward Hinnant } 25337609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 25343e519524SHoward Hinnant 25353e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY operator __rv<unique_ptr>() 25363e519524SHoward Hinnant { 25373e519524SHoward Hinnant return __rv<unique_ptr>(*this); 25383e519524SHoward Hinnant } 25393e519524SHoward Hinnant 25403e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(__rv<unique_ptr> __u) 2541ce48a113SHoward Hinnant : __ptr_(__u->release(), _VSTD::forward<deleter_type>(__u->get_deleter())) {} 25423e519524SHoward Hinnant 25433e519524SHoward Hinnant template <class _Up, class _Ep> 2544d48306e7SEric Fiselier _LIBCPP_INLINE_VISIBILITY 2545d48306e7SEric Fiselier typename enable_if< 2546d48306e7SEric Fiselier !is_array<_Up>::value && 2547d48306e7SEric Fiselier is_convertible<typename unique_ptr<_Up, _Ep>::pointer, pointer>::value && 2548d48306e7SEric Fiselier is_assignable<deleter_type&, _Ep&>::value, 2549d48306e7SEric Fiselier unique_ptr& 2550d48306e7SEric Fiselier >::type 2551d48306e7SEric Fiselier operator=(unique_ptr<_Up, _Ep> __u) 25523e519524SHoward Hinnant { 25533e519524SHoward Hinnant reset(__u.release()); 2554d48306e7SEric Fiselier __ptr_.second() = _VSTD::forward<_Ep>(__u.get_deleter()); 25553e519524SHoward Hinnant return *this; 25563e519524SHoward Hinnant } 25573e519524SHoward Hinnant 25583e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(pointer __p, deleter_type __d) 2559ce48a113SHoward Hinnant : __ptr_(_VSTD::move(__p), _VSTD::move(__d)) {} 25603e519524SHoward Hinnant 25613e519524SHoward Hinnant template <class _Up> 25623e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 25633e519524SHoward Hinnant typename enable_if< 25643e519524SHoward Hinnant is_convertible<_Up*, _Tp*>::value && 25653e519524SHoward Hinnant is_same<_Dp, default_delete<_Tp> >::value, 25663e519524SHoward Hinnant unique_ptr& 25673e519524SHoward Hinnant >::type 25683e519524SHoward Hinnant operator=(auto_ptr<_Up> __p) 25693e519524SHoward Hinnant {reset(__p.release()); return *this;} 25703e519524SHoward Hinnant 25717609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 25723e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY ~unique_ptr() {reset();} 25733e519524SHoward Hinnant 25743739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(nullptr_t) _NOEXCEPT 25753e519524SHoward Hinnant { 25763e519524SHoward Hinnant reset(); 25773e519524SHoward Hinnant return *this; 25783e519524SHoward Hinnant } 25793e519524SHoward Hinnant 25803e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY typename add_lvalue_reference<_Tp>::type operator*() const 25813e519524SHoward Hinnant {return *__ptr_.first();} 25823739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer operator->() const _NOEXCEPT {return __ptr_.first();} 25833739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer get() const _NOEXCEPT {return __ptr_.first();} 25843739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Dp_reference get_deleter() _NOEXCEPT 25853739fe79SHoward Hinnant {return __ptr_.second();} 25863739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Dp_const_reference get_deleter() const _NOEXCEPT 25873739fe79SHoward Hinnant {return __ptr_.second();} 2588f2f2d8b9SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2589f2f2d8b9SHoward Hinnant _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT 2590f2f2d8b9SHoward Hinnant {return __ptr_.first() != nullptr;} 25913e519524SHoward Hinnant 25923739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer release() _NOEXCEPT 25933e519524SHoward Hinnant { 25943e519524SHoward Hinnant pointer __t = __ptr_.first(); 25953e519524SHoward Hinnant __ptr_.first() = pointer(); 25963e519524SHoward Hinnant return __t; 25973e519524SHoward Hinnant } 25983e519524SHoward Hinnant 25993739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void reset(pointer __p = pointer()) _NOEXCEPT 26003e519524SHoward Hinnant { 26013e519524SHoward Hinnant pointer __tmp = __ptr_.first(); 26023e519524SHoward Hinnant __ptr_.first() = __p; 26033e519524SHoward Hinnant if (__tmp) 26043e519524SHoward Hinnant __ptr_.second()(__tmp); 26053e519524SHoward Hinnant } 26063e519524SHoward Hinnant 26073739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void swap(unique_ptr& __u) _NOEXCEPT 26083739fe79SHoward Hinnant {__ptr_.swap(__u.__ptr_);} 26093e519524SHoward Hinnant}; 26103e519524SHoward Hinnant 26113e519524SHoward Hinnanttemplate <class _Tp, class _Dp> 2612*e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS unique_ptr<_Tp[], _Dp> 26133e519524SHoward Hinnant{ 26143e519524SHoward Hinnantpublic: 26153e519524SHoward Hinnant typedef _Tp element_type; 26163e519524SHoward Hinnant typedef _Dp deleter_type; 26173e519524SHoward Hinnant typedef typename __pointer_type<_Tp, deleter_type>::type pointer; 26183e519524SHoward Hinnantprivate: 26193e519524SHoward Hinnant __compressed_pair<pointer, deleter_type> __ptr_; 26203e519524SHoward Hinnant 26218e25104bSHoward Hinnant#ifdef _LIBCPP_HAS_NO_RVALUE_REFERENCES 26223e519524SHoward Hinnant unique_ptr(unique_ptr&); 26233e519524SHoward Hinnant template <class _Up> 26243e519524SHoward Hinnant unique_ptr(unique_ptr<_Up>&); 26253e519524SHoward Hinnant unique_ptr& operator=(unique_ptr&); 26263e519524SHoward Hinnant template <class _Up> 26273e519524SHoward Hinnant unique_ptr& operator=(unique_ptr<_Up>&); 26287609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 26293e519524SHoward Hinnant 26303e519524SHoward Hinnant struct __nat {int __for_bool_;}; 26313e519524SHoward Hinnant 26323e519524SHoward Hinnant typedef typename remove_reference<deleter_type>::type& _Dp_reference; 26333e519524SHoward Hinnant typedef const typename remove_reference<deleter_type>::type& _Dp_const_reference; 26343e519524SHoward Hinnantpublic: 2635c0937e8aSHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR unique_ptr() _NOEXCEPT 26363e519524SHoward Hinnant : __ptr_(pointer()) 26373e519524SHoward Hinnant { 26383e519524SHoward Hinnant static_assert(!is_pointer<deleter_type>::value, 26393e519524SHoward Hinnant "unique_ptr constructed with null function pointer deleter"); 26403e519524SHoward Hinnant } 2641c0937e8aSHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR unique_ptr(nullptr_t) _NOEXCEPT 26423e519524SHoward Hinnant : __ptr_(pointer()) 26433e519524SHoward Hinnant { 26443e519524SHoward Hinnant static_assert(!is_pointer<deleter_type>::value, 26453e519524SHoward Hinnant "unique_ptr constructed with null function pointer deleter"); 26463e519524SHoward Hinnant } 26477609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 264822747e62SLogan Chien template <class _Pp> 264922747e62SLogan Chien _LIBCPP_INLINE_VISIBILITY explicit unique_ptr(_Pp __p, 265022747e62SLogan Chien typename enable_if<__same_or_less_cv_qualified<_Pp, pointer>::value, __nat>::type = __nat()) _NOEXCEPT 26513e519524SHoward Hinnant : __ptr_(__p) 26523e519524SHoward Hinnant { 26533e519524SHoward Hinnant static_assert(!is_pointer<deleter_type>::value, 26543e519524SHoward Hinnant "unique_ptr constructed with null function pointer deleter"); 26553e519524SHoward Hinnant } 26563e519524SHoward Hinnant 265722747e62SLogan Chien template <class _Pp> 2658c003db1fSHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(_Pp __p, typename conditional< 26593e519524SHoward Hinnant is_reference<deleter_type>::value, 26603e519524SHoward Hinnant deleter_type, 266122747e62SLogan Chien typename add_lvalue_reference<const deleter_type>::type>::type __d, 266222747e62SLogan Chien typename enable_if<__same_or_less_cv_qualified<_Pp, pointer>::value, __nat>::type = __nat()) 26633739fe79SHoward Hinnant _NOEXCEPT 26643e519524SHoward Hinnant : __ptr_(__p, __d) {} 26653e519524SHoward Hinnant 26663e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(nullptr_t, typename conditional< 26673e519524SHoward Hinnant is_reference<deleter_type>::value, 26683e519524SHoward Hinnant deleter_type, 26693e519524SHoward Hinnant typename add_lvalue_reference<const deleter_type>::type>::type __d) 26703739fe79SHoward Hinnant _NOEXCEPT 26713e519524SHoward Hinnant : __ptr_(pointer(), __d) {} 26723e519524SHoward Hinnant 267322747e62SLogan Chien template <class _Pp> 267422747e62SLogan Chien _LIBCPP_INLINE_VISIBILITY unique_ptr(_Pp __p, 267522747e62SLogan Chien typename remove_reference<deleter_type>::type&& __d, 267622747e62SLogan Chien typename enable_if<__same_or_less_cv_qualified<_Pp, pointer>::value, __nat>::type = __nat()) 26773739fe79SHoward Hinnant _NOEXCEPT 2678ce48a113SHoward Hinnant : __ptr_(__p, _VSTD::move(__d)) 26793e519524SHoward Hinnant { 26803e519524SHoward Hinnant static_assert(!is_reference<deleter_type>::value, "rvalue deleter bound to reference"); 26813e519524SHoward Hinnant } 26823e519524SHoward Hinnant 26833e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(nullptr_t, typename remove_reference<deleter_type>::type&& __d) 26843739fe79SHoward Hinnant _NOEXCEPT 2685ce48a113SHoward Hinnant : __ptr_(pointer(), _VSTD::move(__d)) 26863e519524SHoward Hinnant { 26873e519524SHoward Hinnant static_assert(!is_reference<deleter_type>::value, "rvalue deleter bound to reference"); 26883e519524SHoward Hinnant } 26893e519524SHoward Hinnant 26903739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(unique_ptr&& __u) _NOEXCEPT 2691ce48a113SHoward Hinnant : __ptr_(__u.release(), _VSTD::forward<deleter_type>(__u.get_deleter())) {} 26923e519524SHoward Hinnant 26933739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(unique_ptr&& __u) _NOEXCEPT 26943e519524SHoward Hinnant { 26953e519524SHoward Hinnant reset(__u.release()); 2696ce48a113SHoward Hinnant __ptr_.second() = _VSTD::forward<deleter_type>(__u.get_deleter()); 26973e519524SHoward Hinnant return *this; 26983e519524SHoward Hinnant } 2699e4097ad7SHoward Hinnant 2700e4097ad7SHoward Hinnant template <class _Up, class _Ep> 2701e4097ad7SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2702e4097ad7SHoward Hinnant unique_ptr(unique_ptr<_Up, _Ep>&& __u, 2703e4097ad7SHoward Hinnant typename enable_if 2704e4097ad7SHoward Hinnant < 2705e4097ad7SHoward Hinnant is_array<_Up>::value && 27068e25104bSHoward Hinnant __same_or_less_cv_qualified<typename unique_ptr<_Up, _Ep>::pointer, pointer>::value 2707e4097ad7SHoward Hinnant && is_convertible<_Ep, deleter_type>::value && 2708e4097ad7SHoward Hinnant ( 2709e4097ad7SHoward Hinnant !is_reference<deleter_type>::value || 2710e4097ad7SHoward Hinnant is_same<deleter_type, _Ep>::value 2711e4097ad7SHoward Hinnant ), 2712e4097ad7SHoward Hinnant __nat 2713e4097ad7SHoward Hinnant >::type = __nat() 2714e4097ad7SHoward Hinnant ) _NOEXCEPT 2715e4097ad7SHoward Hinnant : __ptr_(__u.release(), _VSTD::forward<deleter_type>(__u.get_deleter())) {} 2716e4097ad7SHoward Hinnant 2717e4097ad7SHoward Hinnant 2718e4097ad7SHoward Hinnant template <class _Up, class _Ep> 2719e4097ad7SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2720e4097ad7SHoward Hinnant typename enable_if 2721e4097ad7SHoward Hinnant < 2722e4097ad7SHoward Hinnant is_array<_Up>::value && 27238e25104bSHoward Hinnant __same_or_less_cv_qualified<typename unique_ptr<_Up, _Ep>::pointer, pointer>::value && 27248e25104bSHoward Hinnant is_assignable<deleter_type&, _Ep&&>::value, 2725e4097ad7SHoward Hinnant unique_ptr& 2726e4097ad7SHoward Hinnant >::type 2727e4097ad7SHoward Hinnant operator=(unique_ptr<_Up, _Ep>&& __u) _NOEXCEPT 2728e4097ad7SHoward Hinnant { 2729e4097ad7SHoward Hinnant reset(__u.release()); 2730e4097ad7SHoward Hinnant __ptr_.second() = _VSTD::forward<_Ep>(__u.get_deleter()); 2731e4097ad7SHoward Hinnant return *this; 2732e4097ad7SHoward Hinnant } 27337609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 27343e519524SHoward Hinnant 27353e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit unique_ptr(pointer __p) 27363e519524SHoward Hinnant : __ptr_(__p) 27373e519524SHoward Hinnant { 27383e519524SHoward Hinnant static_assert(!is_pointer<deleter_type>::value, 27393e519524SHoward Hinnant "unique_ptr constructed with null function pointer deleter"); 27403e519524SHoward Hinnant } 27413e519524SHoward Hinnant 27423e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(pointer __p, deleter_type __d) 2743ce48a113SHoward Hinnant : __ptr_(__p, _VSTD::forward<deleter_type>(__d)) {} 27443e519524SHoward Hinnant 27453e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(nullptr_t, deleter_type __d) 2746ce48a113SHoward Hinnant : __ptr_(pointer(), _VSTD::forward<deleter_type>(__d)) {} 27473e519524SHoward Hinnant 27483e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY operator __rv<unique_ptr>() 27493e519524SHoward Hinnant { 27503e519524SHoward Hinnant return __rv<unique_ptr>(*this); 27513e519524SHoward Hinnant } 27523e519524SHoward Hinnant 27533e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr(__rv<unique_ptr> __u) 2754ce48a113SHoward Hinnant : __ptr_(__u->release(), _VSTD::forward<deleter_type>(__u->get_deleter())) {} 27553e519524SHoward Hinnant 27563e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(__rv<unique_ptr> __u) 27573e519524SHoward Hinnant { 27583e519524SHoward Hinnant reset(__u->release()); 2759ce48a113SHoward Hinnant __ptr_.second() = _VSTD::forward<deleter_type>(__u->get_deleter()); 27603e519524SHoward Hinnant return *this; 27613e519524SHoward Hinnant } 27623e519524SHoward Hinnant 27637609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 27643e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY ~unique_ptr() {reset();} 27653e519524SHoward Hinnant 27663739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(nullptr_t) _NOEXCEPT 27673e519524SHoward Hinnant { 27683e519524SHoward Hinnant reset(); 27693e519524SHoward Hinnant return *this; 27703e519524SHoward Hinnant } 27713e519524SHoward Hinnant 27723e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY typename add_lvalue_reference<_Tp>::type operator[](size_t __i) const 27733e519524SHoward Hinnant {return __ptr_.first()[__i];} 27743739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer get() const _NOEXCEPT {return __ptr_.first();} 27753739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Dp_reference get_deleter() _NOEXCEPT 27763739fe79SHoward Hinnant {return __ptr_.second();} 27773739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY _Dp_const_reference get_deleter() const _NOEXCEPT 27783739fe79SHoward Hinnant {return __ptr_.second();} 2779f2f2d8b9SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2780f2f2d8b9SHoward Hinnant _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT 2781f2f2d8b9SHoward Hinnant {return __ptr_.first() != nullptr;} 27823e519524SHoward Hinnant 27833739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY pointer release() _NOEXCEPT 27843e519524SHoward Hinnant { 27853e519524SHoward Hinnant pointer __t = __ptr_.first(); 27863e519524SHoward Hinnant __ptr_.first() = pointer(); 27873e519524SHoward Hinnant return __t; 27883e519524SHoward Hinnant } 27893e519524SHoward Hinnant 279022747e62SLogan Chien template <class _Pp> 279122747e62SLogan Chien _LIBCPP_INLINE_VISIBILITY 279222747e62SLogan Chien typename enable_if<__same_or_less_cv_qualified<_Pp, pointer>::value, void>::type 279322747e62SLogan Chien reset(_Pp __p) _NOEXCEPT 27943e519524SHoward Hinnant { 27953e519524SHoward Hinnant pointer __tmp = __ptr_.first(); 27963e519524SHoward Hinnant __ptr_.first() = __p; 27973e519524SHoward Hinnant if (__tmp) 27983e519524SHoward Hinnant __ptr_.second()(__tmp); 27993e519524SHoward Hinnant } 2800026b8056SMarshall Clow _LIBCPP_INLINE_VISIBILITY void reset(nullptr_t = nullptr) _NOEXCEPT 28013e519524SHoward Hinnant { 28023e519524SHoward Hinnant pointer __tmp = __ptr_.first(); 28033e519524SHoward Hinnant __ptr_.first() = nullptr; 28043e519524SHoward Hinnant if (__tmp) 28053e519524SHoward Hinnant __ptr_.second()(__tmp); 28063e519524SHoward Hinnant } 28073e519524SHoward Hinnant 28083e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void swap(unique_ptr& __u) {__ptr_.swap(__u.__ptr_);} 28093e519524SHoward Hinnantprivate: 28103e519524SHoward Hinnant 28117609c9b6SHoward Hinnant#ifdef _LIBCPP_HAS_NO_RVALUE_REFERENCES 28123e519524SHoward Hinnant template <class _Up> 28133e519524SHoward Hinnant explicit unique_ptr(_Up); 28143e519524SHoward Hinnant template <class _Up> 28153e519524SHoward Hinnant unique_ptr(_Up __u, 28163e519524SHoward Hinnant typename conditional< 28173e519524SHoward Hinnant is_reference<deleter_type>::value, 28183e519524SHoward Hinnant deleter_type, 28193e519524SHoward Hinnant typename add_lvalue_reference<const deleter_type>::type>::type, 28203e519524SHoward Hinnant typename enable_if 28213e519524SHoward Hinnant < 28223e519524SHoward Hinnant is_convertible<_Up, pointer>::value, 28233e519524SHoward Hinnant __nat 28243e519524SHoward Hinnant >::type = __nat()); 28257609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 28263e519524SHoward Hinnant}; 28273e519524SHoward Hinnant 28283e519524SHoward Hinnanttemplate <class _Tp, class _Dp> 28293e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 2830f07dd8d0SEric Fiseliertypename enable_if< 2831f07dd8d0SEric Fiselier __is_swappable<_Dp>::value, 28323e519524SHoward Hinnant void 2833f07dd8d0SEric Fiselier>::type 28343739fe79SHoward Hinnantswap(unique_ptr<_Tp, _Dp>& __x, unique_ptr<_Tp, _Dp>& __y) _NOEXCEPT {__x.swap(__y);} 28353e519524SHoward Hinnant 28363e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 28373e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 28383e519524SHoward Hinnantbool 28393e519524SHoward Hinnantoperator==(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return __x.get() == __y.get();} 28403e519524SHoward Hinnant 28413e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 28423e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 28433e519524SHoward Hinnantbool 28443e519524SHoward Hinnantoperator!=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__x == __y);} 28453e519524SHoward Hinnant 28463e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 28473e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 28483e519524SHoward Hinnantbool 284967f39647SHoward Hinnantoperator< (const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) 285067f39647SHoward Hinnant{ 285167f39647SHoward Hinnant typedef typename unique_ptr<_T1, _D1>::pointer _P1; 285267f39647SHoward Hinnant typedef typename unique_ptr<_T2, _D2>::pointer _P2; 28536fe361c1SEric Fiselier typedef typename common_type<_P1, _P2>::type _Vp; 28546fe361c1SEric Fiselier return less<_Vp>()(__x.get(), __y.get()); 285567f39647SHoward Hinnant} 28563e519524SHoward Hinnant 28573e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 28583e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 28593e519524SHoward Hinnantbool 28603e519524SHoward Hinnantoperator> (const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return __y < __x;} 28613e519524SHoward Hinnant 28623e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 28633e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 28643e519524SHoward Hinnantbool 28653e519524SHoward Hinnantoperator<=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__y < __x);} 28663e519524SHoward Hinnant 28673e519524SHoward Hinnanttemplate <class _T1, class _D1, class _T2, class _D2> 28683e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 28693e519524SHoward Hinnantbool 28703e519524SHoward Hinnantoperator>=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__x < __y);} 28713e519524SHoward Hinnant 287267f39647SHoward Hinnanttemplate <class _T1, class _D1> 287367f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 287467f39647SHoward Hinnantbool 2875c0937e8aSHoward Hinnantoperator==(const unique_ptr<_T1, _D1>& __x, nullptr_t) _NOEXCEPT 287667f39647SHoward Hinnant{ 287767f39647SHoward Hinnant return !__x; 287867f39647SHoward Hinnant} 287967f39647SHoward Hinnant 288067f39647SHoward Hinnanttemplate <class _T1, class _D1> 288167f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 288267f39647SHoward Hinnantbool 2883c0937e8aSHoward Hinnantoperator==(nullptr_t, const unique_ptr<_T1, _D1>& __x) _NOEXCEPT 288467f39647SHoward Hinnant{ 288567f39647SHoward Hinnant return !__x; 288667f39647SHoward Hinnant} 288767f39647SHoward Hinnant 288867f39647SHoward Hinnanttemplate <class _T1, class _D1> 288967f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 289067f39647SHoward Hinnantbool 2891c0937e8aSHoward Hinnantoperator!=(const unique_ptr<_T1, _D1>& __x, nullptr_t) _NOEXCEPT 289267f39647SHoward Hinnant{ 289367f39647SHoward Hinnant return static_cast<bool>(__x); 289467f39647SHoward Hinnant} 289567f39647SHoward Hinnant 289667f39647SHoward Hinnanttemplate <class _T1, class _D1> 289767f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 289867f39647SHoward Hinnantbool 2899c0937e8aSHoward Hinnantoperator!=(nullptr_t, const unique_ptr<_T1, _D1>& __x) _NOEXCEPT 290067f39647SHoward Hinnant{ 290167f39647SHoward Hinnant return static_cast<bool>(__x); 290267f39647SHoward Hinnant} 290367f39647SHoward Hinnant 290467f39647SHoward Hinnanttemplate <class _T1, class _D1> 290567f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 290667f39647SHoward Hinnantbool 290767f39647SHoward Hinnantoperator<(const unique_ptr<_T1, _D1>& __x, nullptr_t) 290867f39647SHoward Hinnant{ 290967f39647SHoward Hinnant typedef typename unique_ptr<_T1, _D1>::pointer _P1; 291067f39647SHoward Hinnant return less<_P1>()(__x.get(), nullptr); 291167f39647SHoward Hinnant} 291267f39647SHoward Hinnant 291367f39647SHoward Hinnanttemplate <class _T1, class _D1> 291467f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 291567f39647SHoward Hinnantbool 291667f39647SHoward Hinnantoperator<(nullptr_t, const unique_ptr<_T1, _D1>& __x) 291767f39647SHoward Hinnant{ 291867f39647SHoward Hinnant typedef typename unique_ptr<_T1, _D1>::pointer _P1; 291967f39647SHoward Hinnant return less<_P1>()(nullptr, __x.get()); 292067f39647SHoward Hinnant} 292167f39647SHoward Hinnant 292267f39647SHoward Hinnanttemplate <class _T1, class _D1> 292367f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 292467f39647SHoward Hinnantbool 292567f39647SHoward Hinnantoperator>(const unique_ptr<_T1, _D1>& __x, nullptr_t) 292667f39647SHoward Hinnant{ 292767f39647SHoward Hinnant return nullptr < __x; 292867f39647SHoward Hinnant} 292967f39647SHoward Hinnant 293067f39647SHoward Hinnanttemplate <class _T1, class _D1> 293167f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 293267f39647SHoward Hinnantbool 293367f39647SHoward Hinnantoperator>(nullptr_t, const unique_ptr<_T1, _D1>& __x) 293467f39647SHoward Hinnant{ 293567f39647SHoward Hinnant return __x < nullptr; 293667f39647SHoward Hinnant} 293767f39647SHoward Hinnant 293867f39647SHoward Hinnanttemplate <class _T1, class _D1> 293967f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 294067f39647SHoward Hinnantbool 294167f39647SHoward Hinnantoperator<=(const unique_ptr<_T1, _D1>& __x, nullptr_t) 294267f39647SHoward Hinnant{ 294367f39647SHoward Hinnant return !(nullptr < __x); 294467f39647SHoward Hinnant} 294567f39647SHoward Hinnant 294667f39647SHoward Hinnanttemplate <class _T1, class _D1> 294767f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 294867f39647SHoward Hinnantbool 294967f39647SHoward Hinnantoperator<=(nullptr_t, const unique_ptr<_T1, _D1>& __x) 295067f39647SHoward Hinnant{ 295167f39647SHoward Hinnant return !(__x < nullptr); 295267f39647SHoward Hinnant} 295367f39647SHoward Hinnant 295467f39647SHoward Hinnanttemplate <class _T1, class _D1> 295567f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 295667f39647SHoward Hinnantbool 295767f39647SHoward Hinnantoperator>=(const unique_ptr<_T1, _D1>& __x, nullptr_t) 295867f39647SHoward Hinnant{ 295967f39647SHoward Hinnant return !(__x < nullptr); 296067f39647SHoward Hinnant} 296167f39647SHoward Hinnant 296267f39647SHoward Hinnanttemplate <class _T1, class _D1> 296367f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 296467f39647SHoward Hinnantbool 296567f39647SHoward Hinnantoperator>=(nullptr_t, const unique_ptr<_T1, _D1>& __x) 296667f39647SHoward Hinnant{ 296767f39647SHoward Hinnant return !(nullptr < __x); 296867f39647SHoward Hinnant} 296967f39647SHoward Hinnant 2970bff1bfc6SHoward Hinnant#ifdef _LIBCPP_HAS_NO_RVALUE_REFERENCES 2971bff1bfc6SHoward Hinnant 2972bff1bfc6SHoward Hinnanttemplate <class _Tp, class _Dp> 2973bff1bfc6SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 2974bff1bfc6SHoward Hinnantunique_ptr<_Tp, _Dp> 2975bff1bfc6SHoward Hinnantmove(unique_ptr<_Tp, _Dp>& __t) 2976bff1bfc6SHoward Hinnant{ 2977bff1bfc6SHoward Hinnant return unique_ptr<_Tp, _Dp>(__rv<unique_ptr<_Tp, _Dp> >(__t)); 2978bff1bfc6SHoward Hinnant} 2979bff1bfc6SHoward Hinnant 2980bff1bfc6SHoward Hinnant#endif 2981bff1bfc6SHoward Hinnant 298228d8ba5fSMarshall Clow#if _LIBCPP_STD_VER > 11 298328d8ba5fSMarshall Clow 298428d8ba5fSMarshall Clowtemplate<class _Tp> 298528d8ba5fSMarshall Clowstruct __unique_if 298628d8ba5fSMarshall Clow{ 298728d8ba5fSMarshall Clow typedef unique_ptr<_Tp> __unique_single; 298828d8ba5fSMarshall Clow}; 298928d8ba5fSMarshall Clow 299028d8ba5fSMarshall Clowtemplate<class _Tp> 299128d8ba5fSMarshall Clowstruct __unique_if<_Tp[]> 299228d8ba5fSMarshall Clow{ 299328d8ba5fSMarshall Clow typedef unique_ptr<_Tp[]> __unique_array_unknown_bound; 299428d8ba5fSMarshall Clow}; 299528d8ba5fSMarshall Clow 299628d8ba5fSMarshall Clowtemplate<class _Tp, size_t _Np> 299728d8ba5fSMarshall Clowstruct __unique_if<_Tp[_Np]> 299828d8ba5fSMarshall Clow{ 299928d8ba5fSMarshall Clow typedef void __unique_array_known_bound; 300028d8ba5fSMarshall Clow}; 300128d8ba5fSMarshall Clow 300228d8ba5fSMarshall Clowtemplate<class _Tp, class... _Args> 300395ddb530SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 300428d8ba5fSMarshall Clowtypename __unique_if<_Tp>::__unique_single 300528d8ba5fSMarshall Clowmake_unique(_Args&&... __args) 300628d8ba5fSMarshall Clow{ 300728d8ba5fSMarshall Clow return unique_ptr<_Tp>(new _Tp(_VSTD::forward<_Args>(__args)...)); 300828d8ba5fSMarshall Clow} 300928d8ba5fSMarshall Clow 301028d8ba5fSMarshall Clowtemplate<class _Tp> 301195ddb530SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 301228d8ba5fSMarshall Clowtypename __unique_if<_Tp>::__unique_array_unknown_bound 301328d8ba5fSMarshall Clowmake_unique(size_t __n) 301428d8ba5fSMarshall Clow{ 301528d8ba5fSMarshall Clow typedef typename remove_extent<_Tp>::type _Up; 301628d8ba5fSMarshall Clow return unique_ptr<_Tp>(new _Up[__n]()); 301728d8ba5fSMarshall Clow} 301828d8ba5fSMarshall Clow 301928d8ba5fSMarshall Clowtemplate<class _Tp, class... _Args> 302028d8ba5fSMarshall Clow typename __unique_if<_Tp>::__unique_array_known_bound 302128d8ba5fSMarshall Clow make_unique(_Args&&...) = delete; 302228d8ba5fSMarshall Clow 302328d8ba5fSMarshall Clow#endif // _LIBCPP_STD_VER > 11 302428d8ba5fSMarshall Clow 302584b569d5SHoward Hinnanttemplate <class _Size> 302684b569d5SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 302784b569d5SHoward Hinnant_Size 302884b569d5SHoward Hinnant__loadword(const void* __p) 302984b569d5SHoward Hinnant{ 303084b569d5SHoward Hinnant _Size __r; 303184b569d5SHoward Hinnant std::memcpy(&__r, __p, sizeof(__r)); 303284b569d5SHoward Hinnant return __r; 303384b569d5SHoward Hinnant} 303484b569d5SHoward Hinnant 303553d2fb0aSHoward Hinnant// We use murmur2 when size_t is 32 bits, and cityhash64 when size_t 303653d2fb0aSHoward Hinnant// is 64 bits. This is because cityhash64 uses 64bit x 64bit 303753d2fb0aSHoward Hinnant// multiplication, which can be very slow on 32-bit systems. 3038f3d14a65SHoward Hinnanttemplate <class _Size, size_t = sizeof(_Size)*__CHAR_BIT__> 303953d2fb0aSHoward Hinnantstruct __murmur2_or_cityhash; 3040f3d14a65SHoward Hinnant 3041f3d14a65SHoward Hinnanttemplate <class _Size> 304253d2fb0aSHoward Hinnantstruct __murmur2_or_cityhash<_Size, 32> 3043f3d14a65SHoward Hinnant{ 3044f3d14a65SHoward Hinnant _Size operator()(const void* __key, _Size __len); 3045f3d14a65SHoward Hinnant}; 3046f3d14a65SHoward Hinnant 304753d2fb0aSHoward Hinnant// murmur2 3048f3d14a65SHoward Hinnanttemplate <class _Size> 3049f3d14a65SHoward Hinnant_Size 3050ec880422SMarshall Clow__murmur2_or_cityhash<_Size, 32>::operator()(const void* __key, _Size __len) _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK 3051f3d14a65SHoward Hinnant{ 3052f3d14a65SHoward Hinnant const _Size __m = 0x5bd1e995; 3053f3d14a65SHoward Hinnant const _Size __r = 24; 3054f3d14a65SHoward Hinnant _Size __h = __len; 3055f3d14a65SHoward Hinnant const unsigned char* __data = static_cast<const unsigned char*>(__key); 3056f3d14a65SHoward Hinnant for (; __len >= 4; __data += 4, __len -= 4) 3057f3d14a65SHoward Hinnant { 305884b569d5SHoward Hinnant _Size __k = __loadword<_Size>(__data); 3059f3d14a65SHoward Hinnant __k *= __m; 3060f3d14a65SHoward Hinnant __k ^= __k >> __r; 3061f3d14a65SHoward Hinnant __k *= __m; 3062f3d14a65SHoward Hinnant __h *= __m; 3063f3d14a65SHoward Hinnant __h ^= __k; 3064f3d14a65SHoward Hinnant } 3065f3d14a65SHoward Hinnant switch (__len) 3066f3d14a65SHoward Hinnant { 3067f3d14a65SHoward Hinnant case 3: 3068f3d14a65SHoward Hinnant __h ^= __data[2] << 16; 3069f3d14a65SHoward Hinnant case 2: 3070f3d14a65SHoward Hinnant __h ^= __data[1] << 8; 3071f3d14a65SHoward Hinnant case 1: 3072f3d14a65SHoward Hinnant __h ^= __data[0]; 3073f3d14a65SHoward Hinnant __h *= __m; 3074f3d14a65SHoward Hinnant } 3075f3d14a65SHoward Hinnant __h ^= __h >> 13; 3076f3d14a65SHoward Hinnant __h *= __m; 3077f3d14a65SHoward Hinnant __h ^= __h >> 15; 3078f3d14a65SHoward Hinnant return __h; 3079f3d14a65SHoward Hinnant} 3080f3d14a65SHoward Hinnant 3081f3d14a65SHoward Hinnanttemplate <class _Size> 308253d2fb0aSHoward Hinnantstruct __murmur2_or_cityhash<_Size, 64> 3083f3d14a65SHoward Hinnant{ 3084f3d14a65SHoward Hinnant _Size operator()(const void* __key, _Size __len); 308553d2fb0aSHoward Hinnant 308653d2fb0aSHoward Hinnant private: 308753d2fb0aSHoward Hinnant // Some primes between 2^63 and 2^64. 308853d2fb0aSHoward Hinnant static const _Size __k0 = 0xc3a5c85c97cb3127ULL; 308953d2fb0aSHoward Hinnant static const _Size __k1 = 0xb492b66fbe98f273ULL; 309053d2fb0aSHoward Hinnant static const _Size __k2 = 0x9ae16a3b2f90404fULL; 309153d2fb0aSHoward Hinnant static const _Size __k3 = 0xc949d7c7509e6557ULL; 309253d2fb0aSHoward Hinnant 309353d2fb0aSHoward Hinnant static _Size __rotate(_Size __val, int __shift) { 309453d2fb0aSHoward Hinnant return __shift == 0 ? __val : ((__val >> __shift) | (__val << (64 - __shift))); 309553d2fb0aSHoward Hinnant } 309653d2fb0aSHoward Hinnant 309753d2fb0aSHoward Hinnant static _Size __rotate_by_at_least_1(_Size __val, int __shift) { 309853d2fb0aSHoward Hinnant return (__val >> __shift) | (__val << (64 - __shift)); 309953d2fb0aSHoward Hinnant } 310053d2fb0aSHoward Hinnant 310153d2fb0aSHoward Hinnant static _Size __shift_mix(_Size __val) { 310253d2fb0aSHoward Hinnant return __val ^ (__val >> 47); 310353d2fb0aSHoward Hinnant } 310453d2fb0aSHoward Hinnant 310553d2fb0aSHoward Hinnant static _Size __hash_len_16(_Size __u, _Size __v) { 310653d2fb0aSHoward Hinnant const _Size __mul = 0x9ddfea08eb382d69ULL; 310753d2fb0aSHoward Hinnant _Size __a = (__u ^ __v) * __mul; 310853d2fb0aSHoward Hinnant __a ^= (__a >> 47); 310953d2fb0aSHoward Hinnant _Size __b = (__v ^ __a) * __mul; 311053d2fb0aSHoward Hinnant __b ^= (__b >> 47); 311153d2fb0aSHoward Hinnant __b *= __mul; 311253d2fb0aSHoward Hinnant return __b; 311353d2fb0aSHoward Hinnant } 311453d2fb0aSHoward Hinnant 311553d2fb0aSHoward Hinnant static _Size __hash_len_0_to_16(const char* __s, _Size __len) { 311653d2fb0aSHoward Hinnant if (__len > 8) { 311784b569d5SHoward Hinnant const _Size __a = __loadword<_Size>(__s); 311884b569d5SHoward Hinnant const _Size __b = __loadword<_Size>(__s + __len - 8); 311953d2fb0aSHoward Hinnant return __hash_len_16(__a, __rotate_by_at_least_1(__b + __len, __len)) ^ __b; 312053d2fb0aSHoward Hinnant } 312153d2fb0aSHoward Hinnant if (__len >= 4) { 312284b569d5SHoward Hinnant const uint32_t __a = __loadword<uint32_t>(__s); 312384b569d5SHoward Hinnant const uint32_t __b = __loadword<uint32_t>(__s + __len - 4); 312453d2fb0aSHoward Hinnant return __hash_len_16(__len + (__a << 3), __b); 312553d2fb0aSHoward Hinnant } 312653d2fb0aSHoward Hinnant if (__len > 0) { 312753d2fb0aSHoward Hinnant const unsigned char __a = __s[0]; 312853d2fb0aSHoward Hinnant const unsigned char __b = __s[__len >> 1]; 312953d2fb0aSHoward Hinnant const unsigned char __c = __s[__len - 1]; 313053d2fb0aSHoward Hinnant const uint32_t __y = static_cast<uint32_t>(__a) + 313153d2fb0aSHoward Hinnant (static_cast<uint32_t>(__b) << 8); 313253d2fb0aSHoward Hinnant const uint32_t __z = __len + (static_cast<uint32_t>(__c) << 2); 313353d2fb0aSHoward Hinnant return __shift_mix(__y * __k2 ^ __z * __k3) * __k2; 313453d2fb0aSHoward Hinnant } 313553d2fb0aSHoward Hinnant return __k2; 313653d2fb0aSHoward Hinnant } 313753d2fb0aSHoward Hinnant 313853d2fb0aSHoward Hinnant static _Size __hash_len_17_to_32(const char *__s, _Size __len) { 313984b569d5SHoward Hinnant const _Size __a = __loadword<_Size>(__s) * __k1; 314084b569d5SHoward Hinnant const _Size __b = __loadword<_Size>(__s + 8); 314184b569d5SHoward Hinnant const _Size __c = __loadword<_Size>(__s + __len - 8) * __k2; 314284b569d5SHoward Hinnant const _Size __d = __loadword<_Size>(__s + __len - 16) * __k0; 314353d2fb0aSHoward Hinnant return __hash_len_16(__rotate(__a - __b, 43) + __rotate(__c, 30) + __d, 314453d2fb0aSHoward Hinnant __a + __rotate(__b ^ __k3, 20) - __c + __len); 314553d2fb0aSHoward Hinnant } 314653d2fb0aSHoward Hinnant 314753d2fb0aSHoward Hinnant // Return a 16-byte hash for 48 bytes. Quick and dirty. 314853d2fb0aSHoward Hinnant // Callers do best to use "random-looking" values for a and b. 314953d2fb0aSHoward Hinnant static pair<_Size, _Size> __weak_hash_len_32_with_seeds( 315053d2fb0aSHoward Hinnant _Size __w, _Size __x, _Size __y, _Size __z, _Size __a, _Size __b) { 315153d2fb0aSHoward Hinnant __a += __w; 315253d2fb0aSHoward Hinnant __b = __rotate(__b + __a + __z, 21); 315353d2fb0aSHoward Hinnant const _Size __c = __a; 315453d2fb0aSHoward Hinnant __a += __x; 315553d2fb0aSHoward Hinnant __a += __y; 315653d2fb0aSHoward Hinnant __b += __rotate(__a, 44); 315753d2fb0aSHoward Hinnant return pair<_Size, _Size>(__a + __z, __b + __c); 315853d2fb0aSHoward Hinnant } 315953d2fb0aSHoward Hinnant 316053d2fb0aSHoward Hinnant // Return a 16-byte hash for s[0] ... s[31], a, and b. Quick and dirty. 316153d2fb0aSHoward Hinnant static pair<_Size, _Size> __weak_hash_len_32_with_seeds( 316253d2fb0aSHoward Hinnant const char* __s, _Size __a, _Size __b) { 316384b569d5SHoward Hinnant return __weak_hash_len_32_with_seeds(__loadword<_Size>(__s), 316484b569d5SHoward Hinnant __loadword<_Size>(__s + 8), 316584b569d5SHoward Hinnant __loadword<_Size>(__s + 16), 316684b569d5SHoward Hinnant __loadword<_Size>(__s + 24), 316753d2fb0aSHoward Hinnant __a, 316853d2fb0aSHoward Hinnant __b); 316953d2fb0aSHoward Hinnant } 317053d2fb0aSHoward Hinnant 317153d2fb0aSHoward Hinnant // Return an 8-byte hash for 33 to 64 bytes. 317253d2fb0aSHoward Hinnant static _Size __hash_len_33_to_64(const char *__s, size_t __len) { 317384b569d5SHoward Hinnant _Size __z = __loadword<_Size>(__s + 24); 317484b569d5SHoward Hinnant _Size __a = __loadword<_Size>(__s) + 317584b569d5SHoward Hinnant (__len + __loadword<_Size>(__s + __len - 16)) * __k0; 317653d2fb0aSHoward Hinnant _Size __b = __rotate(__a + __z, 52); 317753d2fb0aSHoward Hinnant _Size __c = __rotate(__a, 37); 317884b569d5SHoward Hinnant __a += __loadword<_Size>(__s + 8); 317953d2fb0aSHoward Hinnant __c += __rotate(__a, 7); 318084b569d5SHoward Hinnant __a += __loadword<_Size>(__s + 16); 318153d2fb0aSHoward Hinnant _Size __vf = __a + __z; 318253d2fb0aSHoward Hinnant _Size __vs = __b + __rotate(__a, 31) + __c; 318384b569d5SHoward Hinnant __a = __loadword<_Size>(__s + 16) + __loadword<_Size>(__s + __len - 32); 318484b569d5SHoward Hinnant __z += __loadword<_Size>(__s + __len - 8); 318553d2fb0aSHoward Hinnant __b = __rotate(__a + __z, 52); 318653d2fb0aSHoward Hinnant __c = __rotate(__a, 37); 318784b569d5SHoward Hinnant __a += __loadword<_Size>(__s + __len - 24); 318853d2fb0aSHoward Hinnant __c += __rotate(__a, 7); 318984b569d5SHoward Hinnant __a += __loadword<_Size>(__s + __len - 16); 319053d2fb0aSHoward Hinnant _Size __wf = __a + __z; 319153d2fb0aSHoward Hinnant _Size __ws = __b + __rotate(__a, 31) + __c; 319253d2fb0aSHoward Hinnant _Size __r = __shift_mix((__vf + __ws) * __k2 + (__wf + __vs) * __k0); 319353d2fb0aSHoward Hinnant return __shift_mix(__r * __k0 + __vs) * __k2; 319453d2fb0aSHoward Hinnant } 3195f3d14a65SHoward Hinnant}; 3196f3d14a65SHoward Hinnant 319753d2fb0aSHoward Hinnant// cityhash64 3198f3d14a65SHoward Hinnanttemplate <class _Size> 3199f3d14a65SHoward Hinnant_Size 3200ec880422SMarshall Clow__murmur2_or_cityhash<_Size, 64>::operator()(const void* __key, _Size __len) _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK 3201f3d14a65SHoward Hinnant{ 320253d2fb0aSHoward Hinnant const char* __s = static_cast<const char*>(__key); 320353d2fb0aSHoward Hinnant if (__len <= 32) { 320453d2fb0aSHoward Hinnant if (__len <= 16) { 320553d2fb0aSHoward Hinnant return __hash_len_0_to_16(__s, __len); 320653d2fb0aSHoward Hinnant } else { 320753d2fb0aSHoward Hinnant return __hash_len_17_to_32(__s, __len); 3208f3d14a65SHoward Hinnant } 320953d2fb0aSHoward Hinnant } else if (__len <= 64) { 321053d2fb0aSHoward Hinnant return __hash_len_33_to_64(__s, __len); 3211f3d14a65SHoward Hinnant } 321253d2fb0aSHoward Hinnant 321353d2fb0aSHoward Hinnant // For strings over 64 bytes we hash the end first, and then as we 321453d2fb0aSHoward Hinnant // loop we keep 56 bytes of state: v, w, x, y, and z. 321584b569d5SHoward Hinnant _Size __x = __loadword<_Size>(__s + __len - 40); 321684b569d5SHoward Hinnant _Size __y = __loadword<_Size>(__s + __len - 16) + 321784b569d5SHoward Hinnant __loadword<_Size>(__s + __len - 56); 321884b569d5SHoward Hinnant _Size __z = __hash_len_16(__loadword<_Size>(__s + __len - 48) + __len, 321984b569d5SHoward Hinnant __loadword<_Size>(__s + __len - 24)); 322053d2fb0aSHoward Hinnant pair<_Size, _Size> __v = __weak_hash_len_32_with_seeds(__s + __len - 64, __len, __z); 322153d2fb0aSHoward Hinnant pair<_Size, _Size> __w = __weak_hash_len_32_with_seeds(__s + __len - 32, __y + __k1, __x); 322284b569d5SHoward Hinnant __x = __x * __k1 + __loadword<_Size>(__s); 322353d2fb0aSHoward Hinnant 322453d2fb0aSHoward Hinnant // Decrease len to the nearest multiple of 64, and operate on 64-byte chunks. 322553d2fb0aSHoward Hinnant __len = (__len - 1) & ~static_cast<_Size>(63); 322653d2fb0aSHoward Hinnant do { 322784b569d5SHoward Hinnant __x = __rotate(__x + __y + __v.first + __loadword<_Size>(__s + 8), 37) * __k1; 322884b569d5SHoward Hinnant __y = __rotate(__y + __v.second + __loadword<_Size>(__s + 48), 42) * __k1; 322953d2fb0aSHoward Hinnant __x ^= __w.second; 323084b569d5SHoward Hinnant __y += __v.first + __loadword<_Size>(__s + 40); 323153d2fb0aSHoward Hinnant __z = __rotate(__z + __w.first, 33) * __k1; 323253d2fb0aSHoward Hinnant __v = __weak_hash_len_32_with_seeds(__s, __v.second * __k1, __x + __w.first); 323353d2fb0aSHoward Hinnant __w = __weak_hash_len_32_with_seeds(__s + 32, __z + __w.second, 323484b569d5SHoward Hinnant __y + __loadword<_Size>(__s + 16)); 323553d2fb0aSHoward Hinnant std::swap(__z, __x); 323653d2fb0aSHoward Hinnant __s += 64; 323753d2fb0aSHoward Hinnant __len -= 64; 323853d2fb0aSHoward Hinnant } while (__len != 0); 323953d2fb0aSHoward Hinnant return __hash_len_16( 324053d2fb0aSHoward Hinnant __hash_len_16(__v.first, __w.first) + __shift_mix(__y) * __k1 + __z, 324153d2fb0aSHoward Hinnant __hash_len_16(__v.second, __w.second) + __x); 3242f3d14a65SHoward Hinnant} 3243f3d14a65SHoward Hinnant 32449b0cd149SHoward Hinnanttemplate <class _Tp, size_t = sizeof(_Tp) / sizeof(size_t)> 32459b0cd149SHoward Hinnantstruct __scalar_hash; 32469b0cd149SHoward Hinnant 3247d1803b6cSHoward Hinnanttemplate <class _Tp> 32489b0cd149SHoward Hinnantstruct __scalar_hash<_Tp, 0> 32499b0cd149SHoward Hinnant : public unary_function<_Tp, size_t> 3250d1803b6cSHoward Hinnant{ 3251848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 32529b0cd149SHoward Hinnant size_t operator()(_Tp __v) const _NOEXCEPT 3253d1803b6cSHoward Hinnant { 32549b0cd149SHoward Hinnant union 32559b0cd149SHoward Hinnant { 32569b0cd149SHoward Hinnant _Tp __t; 32579b0cd149SHoward Hinnant size_t __a; 32589b0cd149SHoward Hinnant } __u; 32599b0cd149SHoward Hinnant __u.__a = 0; 32609b0cd149SHoward Hinnant __u.__t = __v; 32619b0cd149SHoward Hinnant return __u.__a; 3262d1803b6cSHoward Hinnant } 3263d1803b6cSHoward Hinnant}; 3264d1803b6cSHoward Hinnant 32659b0cd149SHoward Hinnanttemplate <class _Tp> 32669b0cd149SHoward Hinnantstruct __scalar_hash<_Tp, 1> 32679b0cd149SHoward Hinnant : public unary_function<_Tp, size_t> 32689b0cd149SHoward Hinnant{ 32699b0cd149SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 32709b0cd149SHoward Hinnant size_t operator()(_Tp __v) const _NOEXCEPT 32719b0cd149SHoward Hinnant { 32729b0cd149SHoward Hinnant union 32739b0cd149SHoward Hinnant { 32749b0cd149SHoward Hinnant _Tp __t; 32759b0cd149SHoward Hinnant size_t __a; 32769b0cd149SHoward Hinnant } __u; 32779b0cd149SHoward Hinnant __u.__t = __v; 32789b0cd149SHoward Hinnant return __u.__a; 32799b0cd149SHoward Hinnant } 32809b0cd149SHoward Hinnant}; 32819b0cd149SHoward Hinnant 32829b0cd149SHoward Hinnanttemplate <class _Tp> 32839b0cd149SHoward Hinnantstruct __scalar_hash<_Tp, 2> 32849b0cd149SHoward Hinnant : public unary_function<_Tp, size_t> 32859b0cd149SHoward Hinnant{ 32869b0cd149SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 32879b0cd149SHoward Hinnant size_t operator()(_Tp __v) const _NOEXCEPT 32889b0cd149SHoward Hinnant { 32899b0cd149SHoward Hinnant union 32909b0cd149SHoward Hinnant { 32919b0cd149SHoward Hinnant _Tp __t; 32929b0cd149SHoward Hinnant struct 32939b0cd149SHoward Hinnant { 32949b0cd149SHoward Hinnant size_t __a; 32959b0cd149SHoward Hinnant size_t __b; 329687a82490SEric Fiselier } __s; 32979b0cd149SHoward Hinnant } __u; 32989b0cd149SHoward Hinnant __u.__t = __v; 329953d2fb0aSHoward Hinnant return __murmur2_or_cityhash<size_t>()(&__u, sizeof(__u)); 33009b0cd149SHoward Hinnant } 33019b0cd149SHoward Hinnant}; 33029b0cd149SHoward Hinnant 33039b0cd149SHoward Hinnanttemplate <class _Tp> 33049b0cd149SHoward Hinnantstruct __scalar_hash<_Tp, 3> 33059b0cd149SHoward Hinnant : public unary_function<_Tp, size_t> 33069b0cd149SHoward Hinnant{ 33079b0cd149SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 33089b0cd149SHoward Hinnant size_t operator()(_Tp __v) const _NOEXCEPT 33099b0cd149SHoward Hinnant { 33109b0cd149SHoward Hinnant union 33119b0cd149SHoward Hinnant { 33129b0cd149SHoward Hinnant _Tp __t; 33139b0cd149SHoward Hinnant struct 33149b0cd149SHoward Hinnant { 33159b0cd149SHoward Hinnant size_t __a; 33169b0cd149SHoward Hinnant size_t __b; 33179b0cd149SHoward Hinnant size_t __c; 331887a82490SEric Fiselier } __s; 33199b0cd149SHoward Hinnant } __u; 33209b0cd149SHoward Hinnant __u.__t = __v; 332153d2fb0aSHoward Hinnant return __murmur2_or_cityhash<size_t>()(&__u, sizeof(__u)); 33229b0cd149SHoward Hinnant } 33239b0cd149SHoward Hinnant}; 33249b0cd149SHoward Hinnant 33259b0cd149SHoward Hinnanttemplate <class _Tp> 33269b0cd149SHoward Hinnantstruct __scalar_hash<_Tp, 4> 33279b0cd149SHoward Hinnant : public unary_function<_Tp, size_t> 33289b0cd149SHoward Hinnant{ 33299b0cd149SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 33309b0cd149SHoward Hinnant size_t operator()(_Tp __v) const _NOEXCEPT 33319b0cd149SHoward Hinnant { 33329b0cd149SHoward Hinnant union 33339b0cd149SHoward Hinnant { 33349b0cd149SHoward Hinnant _Tp __t; 33359b0cd149SHoward Hinnant struct 33369b0cd149SHoward Hinnant { 33379b0cd149SHoward Hinnant size_t __a; 33389b0cd149SHoward Hinnant size_t __b; 33399b0cd149SHoward Hinnant size_t __c; 33409b0cd149SHoward Hinnant size_t __d; 334187a82490SEric Fiselier } __s; 33429b0cd149SHoward Hinnant } __u; 33439b0cd149SHoward Hinnant __u.__t = __v; 334453d2fb0aSHoward Hinnant return __murmur2_or_cityhash<size_t>()(&__u, sizeof(__u)); 33459b0cd149SHoward Hinnant } 33469b0cd149SHoward Hinnant}; 33479b0cd149SHoward Hinnant 3348918f32fcSEric Fiselier_LIBCPP_INLINE_VISIBILITY 3349918f32fcSEric Fiselierinline size_t __hash_combine(size_t __lhs, size_t __rhs) _NOEXCEPT { 3350918f32fcSEric Fiselier struct _PairT { 3351918f32fcSEric Fiselier size_t first; 3352918f32fcSEric Fiselier size_t second; 3353918f32fcSEric Fiselier }; 3354918f32fcSEric Fiselier typedef __scalar_hash<_PairT> _HashT; 335558779201SEric Fiselier const _PairT __p = {__lhs, __rhs}; 3356918f32fcSEric Fiselier return _HashT()(__p); 3357918f32fcSEric Fiselier} 3358918f32fcSEric Fiselier 33599b0cd149SHoward Hinnanttemplate<class _Tp> 3360*e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS hash<_Tp*> 3361d77851e8SHoward Hinnant : public unary_function<_Tp*, size_t> 33629b0cd149SHoward Hinnant{ 3363d77851e8SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 3364d77851e8SHoward Hinnant size_t operator()(_Tp* __v) const _NOEXCEPT 3365d77851e8SHoward Hinnant { 3366d77851e8SHoward Hinnant union 3367d77851e8SHoward Hinnant { 3368d77851e8SHoward Hinnant _Tp* __t; 3369d77851e8SHoward Hinnant size_t __a; 3370d77851e8SHoward Hinnant } __u; 3371d77851e8SHoward Hinnant __u.__t = __v; 3372d77851e8SHoward Hinnant return __murmur2_or_cityhash<size_t>()(&__u, sizeof(__u)); 3373d77851e8SHoward Hinnant } 33749b0cd149SHoward Hinnant}; 33759b0cd149SHoward Hinnant 3376d1803b6cSHoward Hinnanttemplate <class _Tp, class _Dp> 3377*e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS hash<unique_ptr<_Tp, _Dp> > 3378d1803b6cSHoward Hinnant{ 3379d1803b6cSHoward Hinnant typedef unique_ptr<_Tp, _Dp> argument_type; 3380d1803b6cSHoward Hinnant typedef size_t result_type; 3381848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 33823739fe79SHoward Hinnant result_type operator()(const argument_type& __ptr) const _NOEXCEPT 3383d1803b6cSHoward Hinnant { 3384d1803b6cSHoward Hinnant typedef typename argument_type::pointer pointer; 3385d1803b6cSHoward Hinnant return hash<pointer>()(__ptr.get()); 3386d1803b6cSHoward Hinnant } 3387d1803b6cSHoward Hinnant}; 3388d1803b6cSHoward Hinnant 33893e519524SHoward Hinnantstruct __destruct_n 33903e519524SHoward Hinnant{ 33913e519524SHoward Hinnantprivate: 33923e519524SHoward Hinnant size_t size; 33933e519524SHoward Hinnant 33943e519524SHoward Hinnant template <class _Tp> 33953739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __process(_Tp* __p, false_type) _NOEXCEPT 33963e519524SHoward Hinnant {for (size_t __i = 0; __i < size; ++__i, ++__p) __p->~_Tp();} 33973e519524SHoward Hinnant 33983e519524SHoward Hinnant template <class _Tp> 33993739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __process(_Tp*, true_type) _NOEXCEPT 34003e519524SHoward Hinnant {} 34013e519524SHoward Hinnant 34023739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __incr(false_type) _NOEXCEPT 34033e519524SHoward Hinnant {++size;} 34043739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __incr(true_type) _NOEXCEPT 34053e519524SHoward Hinnant {} 34063e519524SHoward Hinnant 34073739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __set(size_t __s, false_type) _NOEXCEPT 34083e519524SHoward Hinnant {size = __s;} 34093739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __set(size_t, true_type) _NOEXCEPT 34103e519524SHoward Hinnant {} 34113e519524SHoward Hinnantpublic: 34123739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY explicit __destruct_n(size_t __s) _NOEXCEPT 34133739fe79SHoward Hinnant : size(__s) {} 34143e519524SHoward Hinnant 34153e519524SHoward Hinnant template <class _Tp> 34163739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __incr(_Tp*) _NOEXCEPT 3417ca740483SHoward Hinnant {__incr(integral_constant<bool, is_trivially_destructible<_Tp>::value>());} 34183e519524SHoward Hinnant 34193e519524SHoward Hinnant template <class _Tp> 34203739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void __set(size_t __s, _Tp*) _NOEXCEPT 3421ca740483SHoward Hinnant {__set(__s, integral_constant<bool, is_trivially_destructible<_Tp>::value>());} 34223e519524SHoward Hinnant 34233e519524SHoward Hinnant template <class _Tp> 34243739fe79SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __p) _NOEXCEPT 3425ca740483SHoward Hinnant {__process(__p, integral_constant<bool, is_trivially_destructible<_Tp>::value>());} 34263e519524SHoward Hinnant}; 34273e519524SHoward Hinnant 34283e519524SHoward Hinnanttemplate <class _Alloc> 34293e519524SHoward Hinnantclass __allocator_destructor 34303e519524SHoward Hinnant{ 34313e519524SHoward Hinnant typedef allocator_traits<_Alloc> __alloc_traits; 34323e519524SHoward Hinnantpublic: 34333e519524SHoward Hinnant typedef typename __alloc_traits::pointer pointer; 34343e519524SHoward Hinnant typedef typename __alloc_traits::size_type size_type; 34353e519524SHoward Hinnantprivate: 34363e519524SHoward Hinnant _Alloc& __alloc_; 34373e519524SHoward Hinnant size_type __s_; 34383e519524SHoward Hinnantpublic: 34393e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __allocator_destructor(_Alloc& __a, size_type __s) 34403739fe79SHoward Hinnant _NOEXCEPT 34413e519524SHoward Hinnant : __alloc_(__a), __s_(__s) {} 3442848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 34433739fe79SHoward Hinnant void operator()(pointer __p) _NOEXCEPT 34443739fe79SHoward Hinnant {__alloc_traits::deallocate(__alloc_, __p, __s_);} 34453e519524SHoward Hinnant}; 34463e519524SHoward Hinnant 34473e519524SHoward Hinnanttemplate <class _InputIterator, class _ForwardIterator> 34483e519524SHoward Hinnant_ForwardIterator 34493e519524SHoward Hinnantuninitialized_copy(_InputIterator __f, _InputIterator __l, _ForwardIterator __r) 34503e519524SHoward Hinnant{ 34513e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 3452b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3453b34b4819SHoward Hinnant _ForwardIterator __s = __r; 3454b34b4819SHoward Hinnant try 3455b34b4819SHoward Hinnant { 3456b34b4819SHoward Hinnant#endif 3457a00932bdSMarshall Clow for (; __f != __l; ++__f, (void) ++__r) 3458a00932bdSMarshall Clow ::new (static_cast<void*>(_VSTD::addressof(*__r))) value_type(*__f); 3459b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3460b34b4819SHoward Hinnant } 3461b34b4819SHoward Hinnant catch (...) 3462b34b4819SHoward Hinnant { 3463b34b4819SHoward Hinnant for (; __s != __r; ++__s) 3464b34b4819SHoward Hinnant __s->~value_type(); 3465b34b4819SHoward Hinnant throw; 3466b34b4819SHoward Hinnant } 3467b34b4819SHoward Hinnant#endif 34683e519524SHoward Hinnant return __r; 34693e519524SHoward Hinnant} 34703e519524SHoward Hinnant 34713e519524SHoward Hinnanttemplate <class _InputIterator, class _Size, class _ForwardIterator> 34723e519524SHoward Hinnant_ForwardIterator 34733e519524SHoward Hinnantuninitialized_copy_n(_InputIterator __f, _Size __n, _ForwardIterator __r) 34743e519524SHoward Hinnant{ 34753e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 3476b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3477b34b4819SHoward Hinnant _ForwardIterator __s = __r; 3478b34b4819SHoward Hinnant try 3479b34b4819SHoward Hinnant { 3480b34b4819SHoward Hinnant#endif 3481a00932bdSMarshall Clow for (; __n > 0; ++__f, (void) ++__r, (void) --__n) 3482a00932bdSMarshall Clow ::new (static_cast<void*>(_VSTD::addressof(*__r))) value_type(*__f); 3483b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3484b34b4819SHoward Hinnant } 3485b34b4819SHoward Hinnant catch (...) 3486b34b4819SHoward Hinnant { 3487b34b4819SHoward Hinnant for (; __s != __r; ++__s) 3488b34b4819SHoward Hinnant __s->~value_type(); 3489b34b4819SHoward Hinnant throw; 3490b34b4819SHoward Hinnant } 3491b34b4819SHoward Hinnant#endif 34923e519524SHoward Hinnant return __r; 34933e519524SHoward Hinnant} 34943e519524SHoward Hinnant 34953e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Tp> 34963e519524SHoward Hinnantvoid 34973e519524SHoward Hinnantuninitialized_fill(_ForwardIterator __f, _ForwardIterator __l, const _Tp& __x) 34983e519524SHoward Hinnant{ 34993e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 3500b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3501b34b4819SHoward Hinnant _ForwardIterator __s = __f; 3502b34b4819SHoward Hinnant try 3503b34b4819SHoward Hinnant { 3504b34b4819SHoward Hinnant#endif 3505b34b4819SHoward Hinnant for (; __f != __l; ++__f) 3506a00932bdSMarshall Clow ::new (static_cast<void*>(_VSTD::addressof(*__f))) value_type(__x); 3507b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3508b34b4819SHoward Hinnant } 3509b34b4819SHoward Hinnant catch (...) 3510b34b4819SHoward Hinnant { 3511b34b4819SHoward Hinnant for (; __s != __f; ++__s) 3512b34b4819SHoward Hinnant __s->~value_type(); 3513b34b4819SHoward Hinnant throw; 3514b34b4819SHoward Hinnant } 3515b34b4819SHoward Hinnant#endif 35163e519524SHoward Hinnant} 35173e519524SHoward Hinnant 35183e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Size, class _Tp> 351948d05bd2SHoward Hinnant_ForwardIterator 35203e519524SHoward Hinnantuninitialized_fill_n(_ForwardIterator __f, _Size __n, const _Tp& __x) 35213e519524SHoward Hinnant{ 35223e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 3523b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3524b34b4819SHoward Hinnant _ForwardIterator __s = __f; 3525b34b4819SHoward Hinnant try 3526b34b4819SHoward Hinnant { 3527b34b4819SHoward Hinnant#endif 3528a00932bdSMarshall Clow for (; __n > 0; ++__f, (void) --__n) 3529a00932bdSMarshall Clow ::new (static_cast<void*>(_VSTD::addressof(*__f))) value_type(__x); 3530b34b4819SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 3531b34b4819SHoward Hinnant } 3532b34b4819SHoward Hinnant catch (...) 3533b34b4819SHoward Hinnant { 3534b34b4819SHoward Hinnant for (; __s != __f; ++__s) 3535b34b4819SHoward Hinnant __s->~value_type(); 3536b34b4819SHoward Hinnant throw; 3537b34b4819SHoward Hinnant } 3538b34b4819SHoward Hinnant#endif 353948d05bd2SHoward Hinnant return __f; 35403e519524SHoward Hinnant} 35413e519524SHoward Hinnant 3542e4d9c316SEric Fiselier#if _LIBCPP_STD_VER > 14 3543e4d9c316SEric Fiselier 3544e4d9c316SEric Fiseliertemplate <class _Tp> 3545e4d9c316SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3546e4d9c316SEric Fiseliervoid destroy_at(_Tp* __loc) { 3547e4d9c316SEric Fiselier _LIBCPP_ASSERT(__loc, "null pointer given to destroy_at"); 3548e4d9c316SEric Fiselier __loc->~_Tp(); 3549e4d9c316SEric Fiselier} 3550e4d9c316SEric Fiselier 3551e4d9c316SEric Fiseliertemplate <class _ForwardIterator> 3552e4d9c316SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3553e4d9c316SEric Fiseliervoid destroy(_ForwardIterator __first, _ForwardIterator __last) { 3554e4d9c316SEric Fiselier for (; __first != __last; ++__first) 3555e4d9c316SEric Fiselier _VSTD::destroy_at(_VSTD::addressof(*__first)); 3556e4d9c316SEric Fiselier} 3557e4d9c316SEric Fiselier 3558e4d9c316SEric Fiseliertemplate <class _ForwardIterator, class _Size> 3559e4d9c316SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3560e4d9c316SEric Fiselier_ForwardIterator destroy_n(_ForwardIterator __first, _Size __n) { 3561e4d9c316SEric Fiselier for (; __n > 0; (void)++__first, --__n) 3562e4d9c316SEric Fiselier _VSTD::destroy_at(_VSTD::addressof(*__first)); 3563e4d9c316SEric Fiselier return __first; 3564e4d9c316SEric Fiselier} 3565e4d9c316SEric Fiselier 3566e778d10cSEric Fiseliertemplate <class _ForwardIterator> 3567e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3568e778d10cSEric Fiseliervoid uninitialized_default_construct(_ForwardIterator __first, _ForwardIterator __last) { 3569e778d10cSEric Fiselier using _Vt = typename iterator_traits<_ForwardIterator>::value_type; 3570e778d10cSEric Fiselier auto __idx = __first; 3571e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3572e778d10cSEric Fiselier try { 3573e778d10cSEric Fiselier#endif 3574e778d10cSEric Fiselier for (; __idx != __last; ++__idx) 3575e778d10cSEric Fiselier ::new((void*)_VSTD::addressof(*__idx)) _Vt; 3576e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3577e778d10cSEric Fiselier } catch (...) { 3578e778d10cSEric Fiselier _VSTD::destroy(__first, __idx); 3579e778d10cSEric Fiselier throw; 3580e778d10cSEric Fiselier } 3581e778d10cSEric Fiselier#endif 3582e778d10cSEric Fiselier} 3583e778d10cSEric Fiselier 3584e778d10cSEric Fiseliertemplate <class _ForwardIterator, class _Size> 3585e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3586e778d10cSEric Fiselier_ForwardIterator uninitialized_default_construct_n(_ForwardIterator __first, _Size __n) { 3587e778d10cSEric Fiselier using _Vt = typename iterator_traits<_ForwardIterator>::value_type; 3588e778d10cSEric Fiselier auto __idx = __first; 3589e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3590e778d10cSEric Fiselier try { 3591e778d10cSEric Fiselier#endif 3592e778d10cSEric Fiselier for (; __n > 0; (void)++__idx, --__n) 3593e778d10cSEric Fiselier ::new((void*)_VSTD::addressof(*__idx)) _Vt; 3594e778d10cSEric Fiselier return __idx; 3595e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3596e778d10cSEric Fiselier } catch (...) { 3597e778d10cSEric Fiselier _VSTD::destroy(__first, __idx); 3598e778d10cSEric Fiselier throw; 3599e778d10cSEric Fiselier } 3600e778d10cSEric Fiselier#endif 3601e778d10cSEric Fiselier} 3602e778d10cSEric Fiselier 3603e778d10cSEric Fiselier 3604e778d10cSEric Fiseliertemplate <class _ForwardIterator> 3605e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3606e778d10cSEric Fiseliervoid uninitialized_value_construct(_ForwardIterator __first, _ForwardIterator __last) { 3607e778d10cSEric Fiselier using _Vt = typename iterator_traits<_ForwardIterator>::value_type; 3608e778d10cSEric Fiselier auto __idx = __first; 3609e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3610e778d10cSEric Fiselier try { 3611e778d10cSEric Fiselier#endif 3612e778d10cSEric Fiselier for (; __idx != __last; ++__idx) 3613e778d10cSEric Fiselier ::new((void*)_VSTD::addressof(*__idx)) _Vt(); 3614e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3615e778d10cSEric Fiselier } catch (...) { 3616e778d10cSEric Fiselier _VSTD::destroy(__first, __idx); 3617e778d10cSEric Fiselier throw; 3618e778d10cSEric Fiselier } 3619e778d10cSEric Fiselier#endif 3620e778d10cSEric Fiselier} 3621e778d10cSEric Fiselier 3622e778d10cSEric Fiseliertemplate <class _ForwardIterator, class _Size> 3623e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3624e778d10cSEric Fiselier_ForwardIterator uninitialized_value_construct_n(_ForwardIterator __first, _Size __n) { 3625e778d10cSEric Fiselier using _Vt = typename iterator_traits<_ForwardIterator>::value_type; 3626e778d10cSEric Fiselier auto __idx = __first; 3627e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3628e778d10cSEric Fiselier try { 3629e778d10cSEric Fiselier#endif 3630e778d10cSEric Fiselier for (; __n > 0; (void)++__idx, --__n) 3631e778d10cSEric Fiselier ::new((void*)_VSTD::addressof(*__idx)) _Vt(); 3632e778d10cSEric Fiselier return __idx; 3633e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3634e778d10cSEric Fiselier } catch (...) { 3635e778d10cSEric Fiselier _VSTD::destroy(__first, __idx); 3636e778d10cSEric Fiselier throw; 3637e778d10cSEric Fiselier } 3638e778d10cSEric Fiselier#endif 3639e778d10cSEric Fiselier} 3640e778d10cSEric Fiselier 3641e778d10cSEric Fiselier 3642e778d10cSEric Fiseliertemplate <class _InputIt, class _ForwardIt> 3643e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3644e778d10cSEric Fiselier_ForwardIt uninitialized_move(_InputIt __first, _InputIt __last, _ForwardIt __first_res) { 3645e778d10cSEric Fiselier using _Vt = typename iterator_traits<_ForwardIt>::value_type; 3646e778d10cSEric Fiselier auto __idx = __first_res; 3647e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3648e778d10cSEric Fiselier try { 3649e778d10cSEric Fiselier#endif 3650e778d10cSEric Fiselier for (; __first != __last; (void)++__idx, ++__first) 3651e778d10cSEric Fiselier ::new((void*)_VSTD::addressof(*__idx)) _Vt(std::move(*__first)); 3652e778d10cSEric Fiselier return __idx; 3653e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3654e778d10cSEric Fiselier } catch (...) { 3655e778d10cSEric Fiselier _VSTD::destroy(__first_res, __idx); 3656e778d10cSEric Fiselier throw; 3657e778d10cSEric Fiselier } 3658e778d10cSEric Fiselier#endif 3659e778d10cSEric Fiselier} 3660e778d10cSEric Fiselier 3661e778d10cSEric Fiseliertemplate <class _InputIt, class _Size, class _ForwardIt> 3662e778d10cSEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 3663e778d10cSEric Fiselierpair<_InputIt, _ForwardIt> 3664e778d10cSEric Fiselieruninitialized_move_n(_InputIt __first, _Size __n, _ForwardIt __first_res) { 3665e778d10cSEric Fiselier using _Vt = typename iterator_traits<_ForwardIt>::value_type; 3666e778d10cSEric Fiselier auto __idx = __first_res; 3667e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3668e778d10cSEric Fiselier try { 3669e778d10cSEric Fiselier#endif 3670e778d10cSEric Fiselier for (; __n > 0; ++__idx, (void)++__first, --__n) 3671e778d10cSEric Fiselier ::new((void*)_VSTD::addressof(*__idx)) _Vt(std::move(*__first)); 3672e778d10cSEric Fiselier return {__first, __idx}; 3673e778d10cSEric Fiselier#ifndef _LIBCPP_NO_EXCEPTIONS 3674e778d10cSEric Fiselier } catch (...) { 3675e778d10cSEric Fiselier _VSTD::destroy(__first_res, __idx); 3676e778d10cSEric Fiselier throw; 3677e778d10cSEric Fiselier } 3678e778d10cSEric Fiselier#endif 3679e778d10cSEric Fiselier} 3680e778d10cSEric Fiselier 3681e778d10cSEric Fiselier 3682e4d9c316SEric Fiselier#endif // _LIBCPP_STD_VER > 14 3683e4d9c316SEric Fiselier 3684848a5374SHoward Hinnantclass _LIBCPP_EXCEPTION_ABI bad_weak_ptr 36853e519524SHoward Hinnant : public std::exception 36863e519524SHoward Hinnant{ 36873e519524SHoward Hinnantpublic: 36883739fe79SHoward Hinnant virtual ~bad_weak_ptr() _NOEXCEPT; 36893739fe79SHoward Hinnant virtual const char* what() const _NOEXCEPT; 36903e519524SHoward Hinnant}; 36913e519524SHoward Hinnant 3692d437fa5cSMarshall Clow_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE 3693d437fa5cSMarshall Clowvoid __throw_bad_weak_ptr() 3694d437fa5cSMarshall Clow{ 3695d437fa5cSMarshall Clow#ifndef _LIBCPP_NO_EXCEPTIONS 3696d437fa5cSMarshall Clow throw bad_weak_ptr(); 3697d437fa5cSMarshall Clow#else 3698d437fa5cSMarshall Clow _VSTD::abort(); 3699d437fa5cSMarshall Clow#endif 3700d437fa5cSMarshall Clow} 3701d437fa5cSMarshall Clow 3702*e2f2d1edSEric Fiseliertemplate<class _Tp> class _LIBCPP_TEMPLATE_VIS weak_ptr; 37033e519524SHoward Hinnant 3704f0544c20SHoward Hinnantclass _LIBCPP_TYPE_VIS __shared_count 37053e519524SHoward Hinnant{ 37063e519524SHoward Hinnant __shared_count(const __shared_count&); 37073e519524SHoward Hinnant __shared_count& operator=(const __shared_count&); 37083e519524SHoward Hinnant 37093e519524SHoward Hinnantprotected: 37103e519524SHoward Hinnant long __shared_owners_; 37113e519524SHoward Hinnant virtual ~__shared_count(); 37123e519524SHoward Hinnantprivate: 37133739fe79SHoward Hinnant virtual void __on_zero_shared() _NOEXCEPT = 0; 37143e519524SHoward Hinnant 37153e519524SHoward Hinnantpublic: 3716848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 37173739fe79SHoward Hinnant explicit __shared_count(long __refs = 0) _NOEXCEPT 37183e519524SHoward Hinnant : __shared_owners_(__refs) {} 37193e519524SHoward Hinnant 37203739fe79SHoward Hinnant void __add_shared() _NOEXCEPT; 37213739fe79SHoward Hinnant bool __release_shared() _NOEXCEPT; 3722848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 37231faf289eSEric Fiselier long use_count() const _NOEXCEPT { 37241faf289eSEric Fiselier return __libcpp_relaxed_load(&__shared_owners_) + 1; 37251faf289eSEric Fiselier } 37263e519524SHoward Hinnant}; 37273e519524SHoward Hinnant 3728f0544c20SHoward Hinnantclass _LIBCPP_TYPE_VIS __shared_weak_count 37293e519524SHoward Hinnant : private __shared_count 37303e519524SHoward Hinnant{ 37313e519524SHoward Hinnant long __shared_weak_owners_; 37323e519524SHoward Hinnant 37333e519524SHoward Hinnantpublic: 3734848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 37353739fe79SHoward Hinnant explicit __shared_weak_count(long __refs = 0) _NOEXCEPT 37363e519524SHoward Hinnant : __shared_count(__refs), 37373e519524SHoward Hinnant __shared_weak_owners_(__refs) {} 37383e519524SHoward Hinnantprotected: 37393e519524SHoward Hinnant virtual ~__shared_weak_count(); 37403e519524SHoward Hinnant 37413e519524SHoward Hinnantpublic: 37423739fe79SHoward Hinnant void __add_shared() _NOEXCEPT; 37433739fe79SHoward Hinnant void __add_weak() _NOEXCEPT; 37443739fe79SHoward Hinnant void __release_shared() _NOEXCEPT; 37453739fe79SHoward Hinnant void __release_weak() _NOEXCEPT; 3746848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 37473739fe79SHoward Hinnant long use_count() const _NOEXCEPT {return __shared_count::use_count();} 37483739fe79SHoward Hinnant __shared_weak_count* lock() _NOEXCEPT; 37493e519524SHoward Hinnant 3750a9f69800SHoward Hinnant // Define the function out only if we build static libc++ without RTTI. 3751a9f69800SHoward Hinnant // Otherwise we may break clients who need to compile their projects with 3752a9f69800SHoward Hinnant // -fno-rtti and yet link against a libc++.dylib compiled 3753a9f69800SHoward Hinnant // without -fno-rtti. 3754a9f69800SHoward Hinnant#if !defined(_LIBCPP_NO_RTTI) || !defined(_LIBCPP_BUILD_STATIC) 37553739fe79SHoward Hinnant virtual const void* __get_deleter(const type_info&) const _NOEXCEPT; 3756a9f69800SHoward Hinnant#endif 37573e519524SHoward Hinnantprivate: 37583739fe79SHoward Hinnant virtual void __on_zero_shared_weak() _NOEXCEPT = 0; 37593e519524SHoward Hinnant}; 37603e519524SHoward Hinnant 37613e519524SHoward Hinnanttemplate <class _Tp, class _Dp, class _Alloc> 37623e519524SHoward Hinnantclass __shared_ptr_pointer 37633e519524SHoward Hinnant : public __shared_weak_count 37643e519524SHoward Hinnant{ 37653e519524SHoward Hinnant __compressed_pair<__compressed_pair<_Tp, _Dp>, _Alloc> __data_; 37663e519524SHoward Hinnantpublic: 3767848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 37683e519524SHoward Hinnant __shared_ptr_pointer(_Tp __p, _Dp __d, _Alloc __a) 3769ce48a113SHoward Hinnant : __data_(__compressed_pair<_Tp, _Dp>(__p, _VSTD::move(__d)), _VSTD::move(__a)) {} 37703e519524SHoward Hinnant 377154b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI 37723739fe79SHoward Hinnant virtual const void* __get_deleter(const type_info&) const _NOEXCEPT; 377354b409fdSHoward Hinnant#endif 37743e519524SHoward Hinnant 37753e519524SHoward Hinnantprivate: 37763739fe79SHoward Hinnant virtual void __on_zero_shared() _NOEXCEPT; 37773739fe79SHoward Hinnant virtual void __on_zero_shared_weak() _NOEXCEPT; 37783e519524SHoward Hinnant}; 37793e519524SHoward Hinnant 378054b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI 378154b409fdSHoward Hinnant 37823e519524SHoward Hinnanttemplate <class _Tp, class _Dp, class _Alloc> 37833e519524SHoward Hinnantconst void* 37843739fe79SHoward Hinnant__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__get_deleter(const type_info& __t) const _NOEXCEPT 37853e519524SHoward Hinnant{ 3786278ddec2SMarshall Clow return __t == typeid(_Dp) ? _VSTD::addressof(__data_.first().second()) : 0; 37873e519524SHoward Hinnant} 37883e519524SHoward Hinnant 3789b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_RTTI 379054b409fdSHoward Hinnant 37913e519524SHoward Hinnanttemplate <class _Tp, class _Dp, class _Alloc> 37923e519524SHoward Hinnantvoid 37933739fe79SHoward Hinnant__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__on_zero_shared() _NOEXCEPT 37943e519524SHoward Hinnant{ 37953e519524SHoward Hinnant __data_.first().second()(__data_.first().first()); 37963e519524SHoward Hinnant __data_.first().second().~_Dp(); 37973e519524SHoward Hinnant} 37983e519524SHoward Hinnant 37993e519524SHoward Hinnanttemplate <class _Tp, class _Dp, class _Alloc> 38003e519524SHoward Hinnantvoid 38013739fe79SHoward Hinnant__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__on_zero_shared_weak() _NOEXCEPT 38023e519524SHoward Hinnant{ 38036fe361c1SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, __shared_ptr_pointer>::type _Al; 38046fe361c1SEric Fiselier typedef allocator_traits<_Al> _ATraits; 3805319be722SEric Fiselier typedef pointer_traits<typename _ATraits::pointer> _PTraits; 3806319be722SEric Fiselier 38076fe361c1SEric Fiselier _Al __a(__data_.second()); 38083e519524SHoward Hinnant __data_.second().~_Alloc(); 3809319be722SEric Fiselier __a.deallocate(_PTraits::pointer_to(*this), 1); 38103e519524SHoward Hinnant} 38113e519524SHoward Hinnant 38123e519524SHoward Hinnanttemplate <class _Tp, class _Alloc> 38133e519524SHoward Hinnantclass __shared_ptr_emplace 38143e519524SHoward Hinnant : public __shared_weak_count 38153e519524SHoward Hinnant{ 38163e519524SHoward Hinnant __compressed_pair<_Alloc, _Tp> __data_; 38173e519524SHoward Hinnantpublic: 38183e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 38193e519524SHoward Hinnant 3820848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 38213e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a) 3822ce48a113SHoward Hinnant : __data_(_VSTD::move(__a)) {} 38233e519524SHoward Hinnant 38243e519524SHoward Hinnant template <class ..._Args> 3825848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 38263e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a, _Args&& ...__args) 3827a87b5e34SHoward Hinnant : __data_(piecewise_construct, _VSTD::forward_as_tuple(__a), 3828a87b5e34SHoward Hinnant _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)) {} 38293e519524SHoward Hinnant 38303e519524SHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 38313e519524SHoward Hinnant 3832848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 38333e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a) 38343e519524SHoward Hinnant : __data_(__a) {} 38353e519524SHoward Hinnant 38363e519524SHoward Hinnant template <class _A0> 3837848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 38383e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a, _A0& __a0) 38393e519524SHoward Hinnant : __data_(__a, _Tp(__a0)) {} 38403e519524SHoward Hinnant 38413e519524SHoward Hinnant template <class _A0, class _A1> 3842848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 38433e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a, _A0& __a0, _A1& __a1) 38443e519524SHoward Hinnant : __data_(__a, _Tp(__a0, __a1)) {} 38453e519524SHoward Hinnant 38463e519524SHoward Hinnant template <class _A0, class _A1, class _A2> 3847848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 38483e519524SHoward Hinnant __shared_ptr_emplace(_Alloc __a, _A0& __a0, _A1& __a1, _A2& __a2) 38493e519524SHoward Hinnant : __data_(__a, _Tp(__a0, __a1, __a2)) {} 38503e519524SHoward Hinnant 38513e519524SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 38523e519524SHoward Hinnant 38533e519524SHoward Hinnantprivate: 38543739fe79SHoward Hinnant virtual void __on_zero_shared() _NOEXCEPT; 38553739fe79SHoward Hinnant virtual void __on_zero_shared_weak() _NOEXCEPT; 38563e519524SHoward Hinnantpublic: 3857848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 38583739fe79SHoward Hinnant _Tp* get() _NOEXCEPT {return &__data_.second();} 38593e519524SHoward Hinnant}; 38603e519524SHoward Hinnant 38613e519524SHoward Hinnanttemplate <class _Tp, class _Alloc> 38623e519524SHoward Hinnantvoid 38633739fe79SHoward Hinnant__shared_ptr_emplace<_Tp, _Alloc>::__on_zero_shared() _NOEXCEPT 38643e519524SHoward Hinnant{ 38653e519524SHoward Hinnant __data_.second().~_Tp(); 38663e519524SHoward Hinnant} 38673e519524SHoward Hinnant 38683e519524SHoward Hinnanttemplate <class _Tp, class _Alloc> 38693e519524SHoward Hinnantvoid 38703739fe79SHoward Hinnant__shared_ptr_emplace<_Tp, _Alloc>::__on_zero_shared_weak() _NOEXCEPT 38713e519524SHoward Hinnant{ 38726fe361c1SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, __shared_ptr_emplace>::type _Al; 38736fe361c1SEric Fiselier typedef allocator_traits<_Al> _ATraits; 3874319be722SEric Fiselier typedef pointer_traits<typename _ATraits::pointer> _PTraits; 38756fe361c1SEric Fiselier _Al __a(__data_.first()); 38763e519524SHoward Hinnant __data_.first().~_Alloc(); 3877319be722SEric Fiselier __a.deallocate(_PTraits::pointer_to(*this), 1); 38783e519524SHoward Hinnant} 38793e519524SHoward Hinnant 3880*e2f2d1edSEric Fiseliertemplate<class _Tp> class _LIBCPP_TEMPLATE_VIS enable_shared_from_this; 38813e519524SHoward Hinnant 38823e519524SHoward Hinnanttemplate<class _Tp> 3883*e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS shared_ptr 38843e519524SHoward Hinnant{ 38853e519524SHoward Hinnantpublic: 38863e519524SHoward Hinnant typedef _Tp element_type; 388768436a9bSEric Fiselier#if _LIBCPP_STD_VER > 14 388868436a9bSEric Fiselier typedef weak_ptr<_Tp> weak_type; 388968436a9bSEric Fiselier#endif 38903e519524SHoward Hinnantprivate: 38913e519524SHoward Hinnant element_type* __ptr_; 38923e519524SHoward Hinnant __shared_weak_count* __cntrl_; 38933e519524SHoward Hinnant 38943e519524SHoward Hinnant struct __nat {int __for_bool_;}; 38953e519524SHoward Hinnantpublic: 3896906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 3897c0937e8aSHoward Hinnant _LIBCPP_CONSTEXPR shared_ptr() _NOEXCEPT; 3898906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 3899c0937e8aSHoward Hinnant _LIBCPP_CONSTEXPR shared_ptr(nullptr_t) _NOEXCEPT; 390022747e62SLogan Chien template<class _Yp> 390122747e62SLogan Chien explicit shared_ptr(_Yp* __p, 390222747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat()); 390322747e62SLogan Chien template<class _Yp, class _Dp> 390422747e62SLogan Chien shared_ptr(_Yp* __p, _Dp __d, 390522747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat()); 390622747e62SLogan Chien template<class _Yp, class _Dp, class _Alloc> 390722747e62SLogan Chien shared_ptr(_Yp* __p, _Dp __d, _Alloc __a, 390822747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat()); 39093e519524SHoward Hinnant template <class _Dp> shared_ptr(nullptr_t __p, _Dp __d); 39103e519524SHoward Hinnant template <class _Dp, class _Alloc> shared_ptr(nullptr_t __p, _Dp __d, _Alloc __a); 3911906c872dSEvgeniy Stepanov template<class _Yp> _LIBCPP_INLINE_VISIBILITY shared_ptr(const shared_ptr<_Yp>& __r, element_type* __p) _NOEXCEPT; 3912906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 39133739fe79SHoward Hinnant shared_ptr(const shared_ptr& __r) _NOEXCEPT; 39143e519524SHoward Hinnant template<class _Yp> 3915906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 39163e519524SHoward Hinnant shared_ptr(const shared_ptr<_Yp>& __r, 39173739fe79SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type = __nat()) 39183739fe79SHoward Hinnant _NOEXCEPT; 39197609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 3920906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 39213739fe79SHoward Hinnant shared_ptr(shared_ptr&& __r) _NOEXCEPT; 3922906c872dSEvgeniy Stepanov template<class _Yp> _LIBCPP_INLINE_VISIBILITY shared_ptr(shared_ptr<_Yp>&& __r, 39233739fe79SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type = __nat()) 39243739fe79SHoward Hinnant _NOEXCEPT; 39257609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 39263e519524SHoward Hinnant template<class _Yp> explicit shared_ptr(const weak_ptr<_Yp>& __r, 39273e519524SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type= __nat()); 39287609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 392922747e62SLogan Chien template<class _Yp> 393022747e62SLogan Chien shared_ptr(auto_ptr<_Yp>&& __r, 393122747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat()); 3932b3371f6fSHoward Hinnant#else 393322747e62SLogan Chien template<class _Yp> 393422747e62SLogan Chien shared_ptr(auto_ptr<_Yp> __r, 393522747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat()); 39363e519524SHoward Hinnant#endif 39377609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 393822747e62SLogan Chien template <class _Yp, class _Dp> 39398e25104bSHoward Hinnant shared_ptr(unique_ptr<_Yp, _Dp>&&, 394022747e62SLogan Chien typename enable_if 39418e25104bSHoward Hinnant < 394222747e62SLogan Chien !is_lvalue_reference<_Dp>::value && 39438e25104bSHoward Hinnant !is_array<_Yp>::value && 394422747e62SLogan Chien is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 394522747e62SLogan Chien __nat 394622747e62SLogan Chien >::type = __nat()); 394722747e62SLogan Chien template <class _Yp, class _Dp> 39488e25104bSHoward Hinnant shared_ptr(unique_ptr<_Yp, _Dp>&&, 394922747e62SLogan Chien typename enable_if 395022747e62SLogan Chien < 395122747e62SLogan Chien is_lvalue_reference<_Dp>::value && 395222747e62SLogan Chien !is_array<_Yp>::value && 395322747e62SLogan Chien is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 395422747e62SLogan Chien __nat 395522747e62SLogan Chien >::type = __nat()); 39567609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 395722747e62SLogan Chien template <class _Yp, class _Dp> 39588e25104bSHoward Hinnant shared_ptr(unique_ptr<_Yp, _Dp>, 395922747e62SLogan Chien typename enable_if 396022747e62SLogan Chien < 396122747e62SLogan Chien !is_lvalue_reference<_Dp>::value && 396222747e62SLogan Chien !is_array<_Yp>::value && 396322747e62SLogan Chien is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 396422747e62SLogan Chien __nat 396522747e62SLogan Chien >::type = __nat()); 396622747e62SLogan Chien template <class _Yp, class _Dp> 396722747e62SLogan Chien shared_ptr(unique_ptr<_Yp, _Dp>, 396822747e62SLogan Chien typename enable_if 396922747e62SLogan Chien < 397022747e62SLogan Chien is_lvalue_reference<_Dp>::value && 397122747e62SLogan Chien !is_array<_Yp>::value && 397222747e62SLogan Chien is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 397322747e62SLogan Chien __nat 397422747e62SLogan Chien >::type = __nat()); 39757609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 39763e519524SHoward Hinnant 39773e519524SHoward Hinnant ~shared_ptr(); 39783e519524SHoward Hinnant 3979906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 39803739fe79SHoward Hinnant shared_ptr& operator=(const shared_ptr& __r) _NOEXCEPT; 39818e25104bSHoward Hinnant template<class _Yp> 39828e25104bSHoward Hinnant typename enable_if 39838e25104bSHoward Hinnant < 39848e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 39858e25104bSHoward Hinnant shared_ptr& 39868e25104bSHoward Hinnant >::type 3987906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 39888e25104bSHoward Hinnant operator=(const shared_ptr<_Yp>& __r) _NOEXCEPT; 39897609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 3990906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 39913739fe79SHoward Hinnant shared_ptr& operator=(shared_ptr&& __r) _NOEXCEPT; 39928e25104bSHoward Hinnant template<class _Yp> 39938e25104bSHoward Hinnant typename enable_if 39948e25104bSHoward Hinnant < 39958e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 39968e25104bSHoward Hinnant shared_ptr<_Tp>& 39978e25104bSHoward Hinnant >::type 3998906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 39998e25104bSHoward Hinnant operator=(shared_ptr<_Yp>&& __r); 40008e25104bSHoward Hinnant template<class _Yp> 400189dd1dd2SEric Fiselier _LIBCPP_INLINE_VISIBILITY 40028e25104bSHoward Hinnant typename enable_if 40038e25104bSHoward Hinnant < 40048e25104bSHoward Hinnant !is_array<_Yp>::value && 40058e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 400684f996fbSHoward Hinnant shared_ptr 400784f996fbSHoward Hinnant >::type& 40088e25104bSHoward Hinnant operator=(auto_ptr<_Yp>&& __r); 40097609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 40108e25104bSHoward Hinnant template<class _Yp> 401189dd1dd2SEric Fiselier _LIBCPP_INLINE_VISIBILITY 40128e25104bSHoward Hinnant typename enable_if 40138e25104bSHoward Hinnant < 40148e25104bSHoward Hinnant !is_array<_Yp>::value && 40158e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 40168e25104bSHoward Hinnant shared_ptr& 40178e25104bSHoward Hinnant >::type 40188e25104bSHoward Hinnant operator=(auto_ptr<_Yp> __r); 40193e519524SHoward Hinnant#endif 40208e25104bSHoward Hinnant template <class _Yp, class _Dp> 40218e25104bSHoward Hinnant typename enable_if 40228e25104bSHoward Hinnant < 40238e25104bSHoward Hinnant !is_array<_Yp>::value && 40248e25104bSHoward Hinnant is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 40258e25104bSHoward Hinnant shared_ptr& 40268e25104bSHoward Hinnant >::type 40277609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 4028906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 40298e25104bSHoward Hinnant operator=(unique_ptr<_Yp, _Dp>&& __r); 40307609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 403102b8e949SEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 40328e25104bSHoward Hinnant operator=(unique_ptr<_Yp, _Dp> __r); 40333e519524SHoward Hinnant#endif 40343e519524SHoward Hinnant 4035906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 40363739fe79SHoward Hinnant void swap(shared_ptr& __r) _NOEXCEPT; 4037906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 40383739fe79SHoward Hinnant void reset() _NOEXCEPT; 40398e25104bSHoward Hinnant template<class _Yp> 40408e25104bSHoward Hinnant typename enable_if 40418e25104bSHoward Hinnant < 40428e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 40438e25104bSHoward Hinnant void 40448e25104bSHoward Hinnant >::type 4045906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 40468e25104bSHoward Hinnant reset(_Yp* __p); 40478e25104bSHoward Hinnant template<class _Yp, class _Dp> 40488e25104bSHoward Hinnant typename enable_if 40498e25104bSHoward Hinnant < 40508e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 40518e25104bSHoward Hinnant void 40528e25104bSHoward Hinnant >::type 4053906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 40548e25104bSHoward Hinnant reset(_Yp* __p, _Dp __d); 40558e25104bSHoward Hinnant template<class _Yp, class _Dp, class _Alloc> 40568e25104bSHoward Hinnant typename enable_if 40578e25104bSHoward Hinnant < 40588e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 40598e25104bSHoward Hinnant void 40608e25104bSHoward Hinnant >::type 4061906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 40628e25104bSHoward Hinnant reset(_Yp* __p, _Dp __d, _Alloc __a); 40633e519524SHoward Hinnant 4064848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 40653739fe79SHoward Hinnant element_type* get() const _NOEXCEPT {return __ptr_;} 4066848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 40673739fe79SHoward Hinnant typename add_lvalue_reference<element_type>::type operator*() const _NOEXCEPT 40683739fe79SHoward Hinnant {return *__ptr_;} 4069848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 40703739fe79SHoward Hinnant element_type* operator->() const _NOEXCEPT {return __ptr_;} 4071848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 40723739fe79SHoward Hinnant long use_count() const _NOEXCEPT {return __cntrl_ ? __cntrl_->use_count() : 0;} 4073848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 40743739fe79SHoward Hinnant bool unique() const _NOEXCEPT {return use_count() == 1;} 4075848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4076f2f2d8b9SHoward Hinnant _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT {return get() != 0;} 4077c003db1fSHoward Hinnant template <class _Up> 4078848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4079c003db1fSHoward Hinnant bool owner_before(shared_ptr<_Up> const& __p) const 40803e519524SHoward Hinnant {return __cntrl_ < __p.__cntrl_;} 4081c003db1fSHoward Hinnant template <class _Up> 4082848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4083c003db1fSHoward Hinnant bool owner_before(weak_ptr<_Up> const& __p) const 40843e519524SHoward Hinnant {return __cntrl_ < __p.__cntrl_;} 4085d77851e8SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4086d77851e8SHoward Hinnant bool 4087d77851e8SHoward Hinnant __owner_equivalent(const shared_ptr& __p) const 4088d77851e8SHoward Hinnant {return __cntrl_ == __p.__cntrl_;} 40893e519524SHoward Hinnant 409054b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI 40913e519524SHoward Hinnant template <class _Dp> 4092848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 40933739fe79SHoward Hinnant _Dp* __get_deleter() const _NOEXCEPT 40943e519524SHoward Hinnant {return (_Dp*)(__cntrl_ ? __cntrl_->__get_deleter(typeid(_Dp)) : 0);} 4095b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_RTTI 40963e519524SHoward Hinnant 40973e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 40983e519524SHoward Hinnant 40993e519524SHoward Hinnant template<class ..._Args> 41003e519524SHoward Hinnant static 41013e519524SHoward Hinnant shared_ptr<_Tp> 41023e519524SHoward Hinnant make_shared(_Args&& ...__args); 41033e519524SHoward Hinnant 41043e519524SHoward Hinnant template<class _Alloc, class ..._Args> 41053e519524SHoward Hinnant static 41063e519524SHoward Hinnant shared_ptr<_Tp> 41073e519524SHoward Hinnant allocate_shared(const _Alloc& __a, _Args&& ...__args); 41083e519524SHoward Hinnant 41093e519524SHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 41103e519524SHoward Hinnant 41113e519524SHoward Hinnant static shared_ptr<_Tp> make_shared(); 41123e519524SHoward Hinnant 41133e519524SHoward Hinnant template<class _A0> 41143e519524SHoward Hinnant static shared_ptr<_Tp> make_shared(_A0&); 41153e519524SHoward Hinnant 41163e519524SHoward Hinnant template<class _A0, class _A1> 41173e519524SHoward Hinnant static shared_ptr<_Tp> make_shared(_A0&, _A1&); 41183e519524SHoward Hinnant 41193e519524SHoward Hinnant template<class _A0, class _A1, class _A2> 41203e519524SHoward Hinnant static shared_ptr<_Tp> make_shared(_A0&, _A1&, _A2&); 41213e519524SHoward Hinnant 41223e519524SHoward Hinnant template<class _Alloc> 41233e519524SHoward Hinnant static shared_ptr<_Tp> 41243e519524SHoward Hinnant allocate_shared(const _Alloc& __a); 41253e519524SHoward Hinnant 41263e519524SHoward Hinnant template<class _Alloc, class _A0> 41273e519524SHoward Hinnant static shared_ptr<_Tp> 41283e519524SHoward Hinnant allocate_shared(const _Alloc& __a, _A0& __a0); 41293e519524SHoward Hinnant 41303e519524SHoward Hinnant template<class _Alloc, class _A0, class _A1> 41313e519524SHoward Hinnant static shared_ptr<_Tp> 41323e519524SHoward Hinnant allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1); 41333e519524SHoward Hinnant 41343e519524SHoward Hinnant template<class _Alloc, class _A0, class _A1, class _A2> 41353e519524SHoward Hinnant static shared_ptr<_Tp> 41363e519524SHoward Hinnant allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1, _A2& __a2); 41373e519524SHoward Hinnant 41383e519524SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 41393e519524SHoward Hinnant 41403e519524SHoward Hinnantprivate: 41413e519524SHoward Hinnant 414239005d30SEric Fiselier template <class _Yp, class _OrigPtr> 4143848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 41443e519524SHoward Hinnant void 414539005d30SEric Fiselier __enable_weak_this(const enable_shared_from_this<_Yp>* __e, 414639005d30SEric Fiselier _OrigPtr* __ptr) _NOEXCEPT 41473e519524SHoward Hinnant { 414839005d30SEric Fiselier typedef typename remove_cv<_Yp>::type _RawYp; 414988f5bfdcSEric Fiselier if (__e && __e->__weak_this_.expired()) 415055112defSMarshall Clow { 415139005d30SEric Fiselier __e->__weak_this_ = shared_ptr<_RawYp>(*this, 415239005d30SEric Fiselier const_cast<_RawYp*>(static_cast<const _Yp*>(__ptr))); 415355112defSMarshall Clow } 41543e519524SHoward Hinnant } 41553e519524SHoward Hinnant 4156848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 415739005d30SEric Fiselier void __enable_weak_this(const volatile void*, const volatile void*) _NOEXCEPT {} 41583e519524SHoward Hinnant 4159*e2f2d1edSEric Fiselier template <class _Up> friend class _LIBCPP_TEMPLATE_VIS shared_ptr; 4160*e2f2d1edSEric Fiselier template <class _Up> friend class _LIBCPP_TEMPLATE_VIS weak_ptr; 41613e519524SHoward Hinnant}; 41623e519524SHoward Hinnant 41633e519524SHoward Hinnanttemplate<class _Tp> 4164906c872dSEvgeniy Stepanovinline 4165c0937e8aSHoward Hinnant_LIBCPP_CONSTEXPR 41663739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr() _NOEXCEPT 41673e519524SHoward Hinnant : __ptr_(0), 41683e519524SHoward Hinnant __cntrl_(0) 41693e519524SHoward Hinnant{ 41703e519524SHoward Hinnant} 41713e519524SHoward Hinnant 41723e519524SHoward Hinnanttemplate<class _Tp> 4173906c872dSEvgeniy Stepanovinline 4174c0937e8aSHoward Hinnant_LIBCPP_CONSTEXPR 41753739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr(nullptr_t) _NOEXCEPT 41763e519524SHoward Hinnant : __ptr_(0), 41773e519524SHoward Hinnant __cntrl_(0) 41783e519524SHoward Hinnant{ 41793e519524SHoward Hinnant} 41803e519524SHoward Hinnant 41813e519524SHoward Hinnanttemplate<class _Tp> 418222747e62SLogan Chientemplate<class _Yp> 418322747e62SLogan Chienshared_ptr<_Tp>::shared_ptr(_Yp* __p, 418422747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type) 41853e519524SHoward Hinnant : __ptr_(__p) 41863e519524SHoward Hinnant{ 41873e519524SHoward Hinnant unique_ptr<_Yp> __hold(__p); 41883e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, default_delete<_Yp>, allocator<_Yp> > _CntrlBlk; 41893e519524SHoward Hinnant __cntrl_ = new _CntrlBlk(__p, default_delete<_Yp>(), allocator<_Yp>()); 41903e519524SHoward Hinnant __hold.release(); 419139005d30SEric Fiselier __enable_weak_this(__p, __p); 41923e519524SHoward Hinnant} 41933e519524SHoward Hinnant 41943e519524SHoward Hinnanttemplate<class _Tp> 419522747e62SLogan Chientemplate<class _Yp, class _Dp> 419622747e62SLogan Chienshared_ptr<_Tp>::shared_ptr(_Yp* __p, _Dp __d, 419722747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type) 41983e519524SHoward Hinnant : __ptr_(__p) 41993e519524SHoward Hinnant{ 42003e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 42013e519524SHoward Hinnant try 42023e519524SHoward Hinnant { 4203b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 42043e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, _Dp, allocator<_Yp> > _CntrlBlk; 42053e519524SHoward Hinnant __cntrl_ = new _CntrlBlk(__p, __d, allocator<_Yp>()); 420639005d30SEric Fiselier __enable_weak_this(__p, __p); 42073e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 42083e519524SHoward Hinnant } 42093e519524SHoward Hinnant catch (...) 42103e519524SHoward Hinnant { 42113e519524SHoward Hinnant __d(__p); 42123e519524SHoward Hinnant throw; 42133e519524SHoward Hinnant } 4214b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 42153e519524SHoward Hinnant} 42163e519524SHoward Hinnant 42173e519524SHoward Hinnanttemplate<class _Tp> 42183e519524SHoward Hinnanttemplate<class _Dp> 42193e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(nullptr_t __p, _Dp __d) 42203e519524SHoward Hinnant : __ptr_(0) 42213e519524SHoward Hinnant{ 42223e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 42233e519524SHoward Hinnant try 42243e519524SHoward Hinnant { 4225b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 42263e519524SHoward Hinnant typedef __shared_ptr_pointer<nullptr_t, _Dp, allocator<_Tp> > _CntrlBlk; 42273e519524SHoward Hinnant __cntrl_ = new _CntrlBlk(__p, __d, allocator<_Tp>()); 42283e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 42293e519524SHoward Hinnant } 42303e519524SHoward Hinnant catch (...) 42313e519524SHoward Hinnant { 42323e519524SHoward Hinnant __d(__p); 42333e519524SHoward Hinnant throw; 42343e519524SHoward Hinnant } 4235b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 42363e519524SHoward Hinnant} 42373e519524SHoward Hinnant 42383e519524SHoward Hinnanttemplate<class _Tp> 423922747e62SLogan Chientemplate<class _Yp, class _Dp, class _Alloc> 424022747e62SLogan Chienshared_ptr<_Tp>::shared_ptr(_Yp* __p, _Dp __d, _Alloc __a, 424122747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type) 42423e519524SHoward Hinnant : __ptr_(__p) 42433e519524SHoward Hinnant{ 42443e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 42453e519524SHoward Hinnant try 42463e519524SHoward Hinnant { 4247b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 42483e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, _Dp, _Alloc> _CntrlBlk; 4249319be722SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _A2; 42503e519524SHoward Hinnant typedef __allocator_destructor<_A2> _D2; 42513e519524SHoward Hinnant _A2 __a2(__a); 42523e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); 4253319be722SEric Fiselier ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4254319be722SEric Fiselier _CntrlBlk(__p, __d, __a); 4255319be722SEric Fiselier __cntrl_ = _VSTD::addressof(*__hold2.release()); 425639005d30SEric Fiselier __enable_weak_this(__p, __p); 42573e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 42583e519524SHoward Hinnant } 42593e519524SHoward Hinnant catch (...) 42603e519524SHoward Hinnant { 42613e519524SHoward Hinnant __d(__p); 42623e519524SHoward Hinnant throw; 42633e519524SHoward Hinnant } 4264b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 42653e519524SHoward Hinnant} 42663e519524SHoward Hinnant 42673e519524SHoward Hinnanttemplate<class _Tp> 42683e519524SHoward Hinnanttemplate<class _Dp, class _Alloc> 42693e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(nullptr_t __p, _Dp __d, _Alloc __a) 42703e519524SHoward Hinnant : __ptr_(0) 42713e519524SHoward Hinnant{ 42723e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 42733e519524SHoward Hinnant try 42743e519524SHoward Hinnant { 4275b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 42763e519524SHoward Hinnant typedef __shared_ptr_pointer<nullptr_t, _Dp, _Alloc> _CntrlBlk; 4277319be722SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _A2; 42783e519524SHoward Hinnant typedef __allocator_destructor<_A2> _D2; 42793e519524SHoward Hinnant _A2 __a2(__a); 42803e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); 4281319be722SEric Fiselier ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4282319be722SEric Fiselier _CntrlBlk(__p, __d, __a); 4283319be722SEric Fiselier __cntrl_ = _VSTD::addressof(*__hold2.release()); 42843e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 42853e519524SHoward Hinnant } 42863e519524SHoward Hinnant catch (...) 42873e519524SHoward Hinnant { 42883e519524SHoward Hinnant __d(__p); 42893e519524SHoward Hinnant throw; 42903e519524SHoward Hinnant } 4291b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 42923e519524SHoward Hinnant} 42933e519524SHoward Hinnant 42943e519524SHoward Hinnanttemplate<class _Tp> 42953e519524SHoward Hinnanttemplate<class _Yp> 4296906c872dSEvgeniy Stepanovinline 42973739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr(const shared_ptr<_Yp>& __r, element_type *__p) _NOEXCEPT 42983e519524SHoward Hinnant : __ptr_(__p), 42993e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 43003e519524SHoward Hinnant{ 43013e519524SHoward Hinnant if (__cntrl_) 43023e519524SHoward Hinnant __cntrl_->__add_shared(); 43033e519524SHoward Hinnant} 43043e519524SHoward Hinnant 43053e519524SHoward Hinnanttemplate<class _Tp> 4306906c872dSEvgeniy Stepanovinline 43073739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr(const shared_ptr& __r) _NOEXCEPT 43083e519524SHoward Hinnant : __ptr_(__r.__ptr_), 43093e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 43103e519524SHoward Hinnant{ 43113e519524SHoward Hinnant if (__cntrl_) 43123e519524SHoward Hinnant __cntrl_->__add_shared(); 43133e519524SHoward Hinnant} 43143e519524SHoward Hinnant 43153e519524SHoward Hinnanttemplate<class _Tp> 43163e519524SHoward Hinnanttemplate<class _Yp> 4317906c872dSEvgeniy Stepanovinline 43183e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(const shared_ptr<_Yp>& __r, 43193e519524SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type) 43203739fe79SHoward Hinnant _NOEXCEPT 43213e519524SHoward Hinnant : __ptr_(__r.__ptr_), 43223e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 43233e519524SHoward Hinnant{ 43243e519524SHoward Hinnant if (__cntrl_) 43253e519524SHoward Hinnant __cntrl_->__add_shared(); 43263e519524SHoward Hinnant} 43273e519524SHoward Hinnant 43287609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 43293e519524SHoward Hinnant 43303e519524SHoward Hinnanttemplate<class _Tp> 4331906c872dSEvgeniy Stepanovinline 43323739fe79SHoward Hinnantshared_ptr<_Tp>::shared_ptr(shared_ptr&& __r) _NOEXCEPT 43333e519524SHoward Hinnant : __ptr_(__r.__ptr_), 43343e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 43353e519524SHoward Hinnant{ 43363e519524SHoward Hinnant __r.__ptr_ = 0; 43373e519524SHoward Hinnant __r.__cntrl_ = 0; 43383e519524SHoward Hinnant} 43393e519524SHoward Hinnant 43403e519524SHoward Hinnanttemplate<class _Tp> 43413e519524SHoward Hinnanttemplate<class _Yp> 4342906c872dSEvgeniy Stepanovinline 43433e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(shared_ptr<_Yp>&& __r, 43443e519524SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type) 43453739fe79SHoward Hinnant _NOEXCEPT 43463e519524SHoward Hinnant : __ptr_(__r.__ptr_), 43473e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 43483e519524SHoward Hinnant{ 43493e519524SHoward Hinnant __r.__ptr_ = 0; 43503e519524SHoward Hinnant __r.__cntrl_ = 0; 43513e519524SHoward Hinnant} 43523e519524SHoward Hinnant 43537609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 43543e519524SHoward Hinnant 43553e519524SHoward Hinnanttemplate<class _Tp> 435622747e62SLogan Chientemplate<class _Yp> 43577609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 435822747e62SLogan Chienshared_ptr<_Tp>::shared_ptr(auto_ptr<_Yp>&& __r, 43593e519524SHoward Hinnant#else 436022747e62SLogan Chienshared_ptr<_Tp>::shared_ptr(auto_ptr<_Yp> __r, 43613e519524SHoward Hinnant#endif 436222747e62SLogan Chien typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type) 43633e519524SHoward Hinnant : __ptr_(__r.get()) 43643e519524SHoward Hinnant{ 43653e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, default_delete<_Yp>, allocator<_Yp> > _CntrlBlk; 43663e519524SHoward Hinnant __cntrl_ = new _CntrlBlk(__r.get(), default_delete<_Yp>(), allocator<_Yp>()); 436739005d30SEric Fiselier __enable_weak_this(__r.get(), __r.get()); 43683e519524SHoward Hinnant __r.release(); 43693e519524SHoward Hinnant} 43703e519524SHoward Hinnant 43713e519524SHoward Hinnanttemplate<class _Tp> 437222747e62SLogan Chientemplate <class _Yp, class _Dp> 43737609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 43743e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp>&& __r, 43753e519524SHoward Hinnant#else 43763e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp> __r, 43773e519524SHoward Hinnant#endif 437822747e62SLogan Chien typename enable_if 437922747e62SLogan Chien < 438022747e62SLogan Chien !is_lvalue_reference<_Dp>::value && 438122747e62SLogan Chien !is_array<_Yp>::value && 438222747e62SLogan Chien is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 438322747e62SLogan Chien __nat 438422747e62SLogan Chien >::type) 43853e519524SHoward Hinnant : __ptr_(__r.get()) 43863e519524SHoward Hinnant{ 4387c34f847bSMarshall Clow#if _LIBCPP_STD_VER > 11 4388c34f847bSMarshall Clow if (__ptr_ == nullptr) 4389c34f847bSMarshall Clow __cntrl_ = nullptr; 4390c34f847bSMarshall Clow else 4391c34f847bSMarshall Clow#endif 4392c34f847bSMarshall Clow { 43933e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, _Dp, allocator<_Yp> > _CntrlBlk; 43943e519524SHoward Hinnant __cntrl_ = new _CntrlBlk(__r.get(), __r.get_deleter(), allocator<_Yp>()); 439539005d30SEric Fiselier __enable_weak_this(__r.get(), __r.get()); 4396c34f847bSMarshall Clow } 43973e519524SHoward Hinnant __r.release(); 43983e519524SHoward Hinnant} 43993e519524SHoward Hinnant 44003e519524SHoward Hinnanttemplate<class _Tp> 440122747e62SLogan Chientemplate <class _Yp, class _Dp> 44027609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 44033e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp>&& __r, 44043e519524SHoward Hinnant#else 44053e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp> __r, 44063e519524SHoward Hinnant#endif 440722747e62SLogan Chien typename enable_if 440822747e62SLogan Chien < 440922747e62SLogan Chien is_lvalue_reference<_Dp>::value && 441022747e62SLogan Chien !is_array<_Yp>::value && 441122747e62SLogan Chien is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, 441222747e62SLogan Chien __nat 441322747e62SLogan Chien >::type) 44143e519524SHoward Hinnant : __ptr_(__r.get()) 44153e519524SHoward Hinnant{ 4416c34f847bSMarshall Clow#if _LIBCPP_STD_VER > 11 4417c34f847bSMarshall Clow if (__ptr_ == nullptr) 4418c34f847bSMarshall Clow __cntrl_ = nullptr; 4419c34f847bSMarshall Clow else 4420c34f847bSMarshall Clow#endif 4421c34f847bSMarshall Clow { 44223e519524SHoward Hinnant typedef __shared_ptr_pointer<_Yp*, 44233e519524SHoward Hinnant reference_wrapper<typename remove_reference<_Dp>::type>, 44243e519524SHoward Hinnant allocator<_Yp> > _CntrlBlk; 44253e519524SHoward Hinnant __cntrl_ = new _CntrlBlk(__r.get(), ref(__r.get_deleter()), allocator<_Yp>()); 442639005d30SEric Fiselier __enable_weak_this(__r.get(), __r.get()); 4427c34f847bSMarshall Clow } 44283e519524SHoward Hinnant __r.release(); 44293e519524SHoward Hinnant} 44303e519524SHoward Hinnant 44313e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 44323e519524SHoward Hinnant 44333e519524SHoward Hinnanttemplate<class _Tp> 44343e519524SHoward Hinnanttemplate<class ..._Args> 44353e519524SHoward Hinnantshared_ptr<_Tp> 44363e519524SHoward Hinnantshared_ptr<_Tp>::make_shared(_Args&& ...__args) 44373e519524SHoward Hinnant{ 44383e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 44393e519524SHoward Hinnant typedef allocator<_CntrlBlk> _A2; 44403e519524SHoward Hinnant typedef __allocator_destructor<_A2> _D2; 44413e519524SHoward Hinnant _A2 __a2; 44423e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); 4443ce48a113SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__a2, _VSTD::forward<_Args>(__args)...); 44443e519524SHoward Hinnant shared_ptr<_Tp> __r; 44453e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 44463e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 444739005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 44483e519524SHoward Hinnant return __r; 44493e519524SHoward Hinnant} 44503e519524SHoward Hinnant 44513e519524SHoward Hinnanttemplate<class _Tp> 44523e519524SHoward Hinnanttemplate<class _Alloc, class ..._Args> 44533e519524SHoward Hinnantshared_ptr<_Tp> 44543e519524SHoward Hinnantshared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _Args&& ...__args) 44553e519524SHoward Hinnant{ 44563e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 4457319be722SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _A2; 44583e519524SHoward Hinnant typedef __allocator_destructor<_A2> _D2; 44593e519524SHoward Hinnant _A2 __a2(__a); 44603e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); 4461319be722SEric Fiselier ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4462319be722SEric Fiselier _CntrlBlk(__a, _VSTD::forward<_Args>(__args)...); 44633e519524SHoward Hinnant shared_ptr<_Tp> __r; 44643e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 4465319be722SEric Fiselier __r.__cntrl_ = _VSTD::addressof(*__hold2.release()); 446639005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 44673e519524SHoward Hinnant return __r; 44683e519524SHoward Hinnant} 44693e519524SHoward Hinnant 44703e519524SHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 44713e519524SHoward Hinnant 44723e519524SHoward Hinnanttemplate<class _Tp> 44733e519524SHoward Hinnantshared_ptr<_Tp> 44743e519524SHoward Hinnantshared_ptr<_Tp>::make_shared() 44753e519524SHoward Hinnant{ 44763e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 44773e519524SHoward Hinnant typedef allocator<_CntrlBlk> _Alloc2; 44783e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 44793e519524SHoward Hinnant _Alloc2 __alloc2; 44803e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 44813e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__alloc2); 44823e519524SHoward Hinnant shared_ptr<_Tp> __r; 44833e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 44843e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 448539005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 44863e519524SHoward Hinnant return __r; 44873e519524SHoward Hinnant} 44883e519524SHoward Hinnant 44893e519524SHoward Hinnanttemplate<class _Tp> 44903e519524SHoward Hinnanttemplate<class _A0> 44913e519524SHoward Hinnantshared_ptr<_Tp> 44923e519524SHoward Hinnantshared_ptr<_Tp>::make_shared(_A0& __a0) 44933e519524SHoward Hinnant{ 44943e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 44953e519524SHoward Hinnant typedef allocator<_CntrlBlk> _Alloc2; 44963e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 44973e519524SHoward Hinnant _Alloc2 __alloc2; 44983e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 44993e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__alloc2, __a0); 45003e519524SHoward Hinnant shared_ptr<_Tp> __r; 45013e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 45023e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 450339005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 45043e519524SHoward Hinnant return __r; 45053e519524SHoward Hinnant} 45063e519524SHoward Hinnant 45073e519524SHoward Hinnanttemplate<class _Tp> 45083e519524SHoward Hinnanttemplate<class _A0, class _A1> 45093e519524SHoward Hinnantshared_ptr<_Tp> 45103e519524SHoward Hinnantshared_ptr<_Tp>::make_shared(_A0& __a0, _A1& __a1) 45113e519524SHoward Hinnant{ 45123e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 45133e519524SHoward Hinnant typedef allocator<_CntrlBlk> _Alloc2; 45143e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 45153e519524SHoward Hinnant _Alloc2 __alloc2; 45163e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 45173e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__alloc2, __a0, __a1); 45183e519524SHoward Hinnant shared_ptr<_Tp> __r; 45193e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 45203e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 452139005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 45223e519524SHoward Hinnant return __r; 45233e519524SHoward Hinnant} 45243e519524SHoward Hinnant 45253e519524SHoward Hinnanttemplate<class _Tp> 45263e519524SHoward Hinnanttemplate<class _A0, class _A1, class _A2> 45273e519524SHoward Hinnantshared_ptr<_Tp> 45283e519524SHoward Hinnantshared_ptr<_Tp>::make_shared(_A0& __a0, _A1& __a1, _A2& __a2) 45293e519524SHoward Hinnant{ 45303e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; 45313e519524SHoward Hinnant typedef allocator<_CntrlBlk> _Alloc2; 45323e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 45333e519524SHoward Hinnant _Alloc2 __alloc2; 45343e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 45353e519524SHoward Hinnant ::new(__hold2.get()) _CntrlBlk(__alloc2, __a0, __a1, __a2); 45363e519524SHoward Hinnant shared_ptr<_Tp> __r; 45373e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 45383e519524SHoward Hinnant __r.__cntrl_ = __hold2.release(); 453939005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 45403e519524SHoward Hinnant return __r; 45413e519524SHoward Hinnant} 45423e519524SHoward Hinnant 45433e519524SHoward Hinnanttemplate<class _Tp> 45443e519524SHoward Hinnanttemplate<class _Alloc> 45453e519524SHoward Hinnantshared_ptr<_Tp> 45463e519524SHoward Hinnantshared_ptr<_Tp>::allocate_shared(const _Alloc& __a) 45473e519524SHoward Hinnant{ 45483e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 4549319be722SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _Alloc2; 45503e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 45513e519524SHoward Hinnant _Alloc2 __alloc2(__a); 45523e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 4553319be722SEric Fiselier ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4554319be722SEric Fiselier _CntrlBlk(__a); 45553e519524SHoward Hinnant shared_ptr<_Tp> __r; 45563e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 4557319be722SEric Fiselier __r.__cntrl_ = _VSTD::addressof(*__hold2.release()); 455839005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 45593e519524SHoward Hinnant return __r; 45603e519524SHoward Hinnant} 45613e519524SHoward Hinnant 45623e519524SHoward Hinnanttemplate<class _Tp> 45633e519524SHoward Hinnanttemplate<class _Alloc, class _A0> 45643e519524SHoward Hinnantshared_ptr<_Tp> 45653e519524SHoward Hinnantshared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _A0& __a0) 45663e519524SHoward Hinnant{ 45673e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 4568319be722SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _Alloc2; 45693e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 45703e519524SHoward Hinnant _Alloc2 __alloc2(__a); 45713e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 4572319be722SEric Fiselier ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4573319be722SEric Fiselier _CntrlBlk(__a, __a0); 45743e519524SHoward Hinnant shared_ptr<_Tp> __r; 45753e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 4576319be722SEric Fiselier __r.__cntrl_ = _VSTD::addressof(*__hold2.release()); 457739005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 45783e519524SHoward Hinnant return __r; 45793e519524SHoward Hinnant} 45803e519524SHoward Hinnant 45813e519524SHoward Hinnanttemplate<class _Tp> 45823e519524SHoward Hinnanttemplate<class _Alloc, class _A0, class _A1> 45833e519524SHoward Hinnantshared_ptr<_Tp> 45843e519524SHoward Hinnantshared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1) 45853e519524SHoward Hinnant{ 45863e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 4587319be722SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _Alloc2; 45883e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 45893e519524SHoward Hinnant _Alloc2 __alloc2(__a); 45903e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 4591319be722SEric Fiselier ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4592319be722SEric Fiselier _CntrlBlk(__a, __a0, __a1); 45933e519524SHoward Hinnant shared_ptr<_Tp> __r; 45943e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 4595319be722SEric Fiselier __r.__cntrl_ = _VSTD::addressof(*__hold2.release()); 459639005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 45973e519524SHoward Hinnant return __r; 45983e519524SHoward Hinnant} 45993e519524SHoward Hinnant 46003e519524SHoward Hinnanttemplate<class _Tp> 46013e519524SHoward Hinnanttemplate<class _Alloc, class _A0, class _A1, class _A2> 46023e519524SHoward Hinnantshared_ptr<_Tp> 46033e519524SHoward Hinnantshared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1, _A2& __a2) 46043e519524SHoward Hinnant{ 46053e519524SHoward Hinnant typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; 4606319be722SEric Fiselier typedef typename __allocator_traits_rebind<_Alloc, _CntrlBlk>::type _Alloc2; 46073e519524SHoward Hinnant typedef __allocator_destructor<_Alloc2> _D2; 46083e519524SHoward Hinnant _Alloc2 __alloc2(__a); 46093e519524SHoward Hinnant unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); 4610319be722SEric Fiselier ::new(static_cast<void*>(_VSTD::addressof(*__hold2.get()))) 4611319be722SEric Fiselier _CntrlBlk(__a, __a0, __a1, __a2); 46123e519524SHoward Hinnant shared_ptr<_Tp> __r; 46133e519524SHoward Hinnant __r.__ptr_ = __hold2.get()->get(); 4614319be722SEric Fiselier __r.__cntrl_ = _VSTD::addressof(*__hold2.release()); 461539005d30SEric Fiselier __r.__enable_weak_this(__r.__ptr_, __r.__ptr_); 46163e519524SHoward Hinnant return __r; 46173e519524SHoward Hinnant} 46183e519524SHoward Hinnant 46193e519524SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 46203e519524SHoward Hinnant 46213e519524SHoward Hinnanttemplate<class _Tp> 46223e519524SHoward Hinnantshared_ptr<_Tp>::~shared_ptr() 46233e519524SHoward Hinnant{ 46243e519524SHoward Hinnant if (__cntrl_) 46253e519524SHoward Hinnant __cntrl_->__release_shared(); 46263e519524SHoward Hinnant} 46273e519524SHoward Hinnant 46283e519524SHoward Hinnanttemplate<class _Tp> 4629906c872dSEvgeniy Stepanovinline 46303e519524SHoward Hinnantshared_ptr<_Tp>& 46313739fe79SHoward Hinnantshared_ptr<_Tp>::operator=(const shared_ptr& __r) _NOEXCEPT 46323e519524SHoward Hinnant{ 46333e519524SHoward Hinnant shared_ptr(__r).swap(*this); 46343e519524SHoward Hinnant return *this; 46353e519524SHoward Hinnant} 46363e519524SHoward Hinnant 46373e519524SHoward Hinnanttemplate<class _Tp> 46383e519524SHoward Hinnanttemplate<class _Yp> 4639906c872dSEvgeniy Stepanovinline 46408e25104bSHoward Hinnanttypename enable_if 46418e25104bSHoward Hinnant< 46428e25104bSHoward Hinnant is_convertible<_Yp*, _Tp*>::value, 46433e519524SHoward Hinnant shared_ptr<_Tp>& 46448e25104bSHoward Hinnant>::type 46453739fe79SHoward Hinnantshared_ptr<_Tp>::operator=(const shared_ptr<_Yp>& __r) _NOEXCEPT 46463e519524SHoward Hinnant{ 46473e519524SHoward Hinnant shared_ptr(__r).swap(*this); 46483e519524SHoward Hinnant return *this; 46493e519524SHoward Hinnant} 46503e519524SHoward Hinnant 46517609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 46523e519524SHoward Hinnant 46533e519524SHoward Hinnanttemplate<class _Tp> 4654906c872dSEvgeniy Stepanovinline 46553e519524SHoward Hinnantshared_ptr<_Tp>& 46563739fe79SHoward Hinnantshared_ptr<_Tp>::operator=(shared_ptr&& __r) _NOEXCEPT 46573e519524SHoward Hinnant{ 4658ce48a113SHoward Hinnant shared_ptr(_VSTD::move(__r)).swap(*this); 46593e519524SHoward Hinnant return *this; 46603e519524SHoward Hinnant} 46613e519524SHoward Hinnant 46623e519524SHoward Hinnanttemplate<class _Tp> 46633e519524SHoward Hinnanttemplate<class _Yp> 4664906c872dSEvgeniy Stepanovinline 46658e25104bSHoward Hinnanttypename enable_if 46668e25104bSHoward Hinnant< 46678e25104bSHoward Hinnant is_convertible<_Yp*, _Tp*>::value, 46683e519524SHoward Hinnant shared_ptr<_Tp>& 46698e25104bSHoward Hinnant>::type 46703e519524SHoward Hinnantshared_ptr<_Tp>::operator=(shared_ptr<_Yp>&& __r) 46713e519524SHoward Hinnant{ 4672ce48a113SHoward Hinnant shared_ptr(_VSTD::move(__r)).swap(*this); 46733e519524SHoward Hinnant return *this; 46743e519524SHoward Hinnant} 46753e519524SHoward Hinnant 46763e519524SHoward Hinnanttemplate<class _Tp> 46773e519524SHoward Hinnanttemplate<class _Yp> 4678906c872dSEvgeniy Stepanovinline 46798e25104bSHoward Hinnanttypename enable_if 46808e25104bSHoward Hinnant< 46818e25104bSHoward Hinnant !is_array<_Yp>::value && 46828e25104bSHoward Hinnant is_convertible<_Yp*, _Tp*>::value, 468384f996fbSHoward Hinnant shared_ptr<_Tp> 468484f996fbSHoward Hinnant>::type& 46853e519524SHoward Hinnantshared_ptr<_Tp>::operator=(auto_ptr<_Yp>&& __r) 46863e519524SHoward Hinnant{ 4687ce48a113SHoward Hinnant shared_ptr(_VSTD::move(__r)).swap(*this); 46883e519524SHoward Hinnant return *this; 46893e519524SHoward Hinnant} 46903e519524SHoward Hinnant 46913e519524SHoward Hinnanttemplate<class _Tp> 46923e519524SHoward Hinnanttemplate <class _Yp, class _Dp> 4693906c872dSEvgeniy Stepanovinline 46948e25104bSHoward Hinnanttypename enable_if 46958e25104bSHoward Hinnant< 46968e25104bSHoward Hinnant !is_array<_Yp>::value && 46978e25104bSHoward Hinnant is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, _Tp*>::value, 46983e519524SHoward Hinnant shared_ptr<_Tp>& 46998e25104bSHoward Hinnant>::type 47003e519524SHoward Hinnantshared_ptr<_Tp>::operator=(unique_ptr<_Yp, _Dp>&& __r) 47013e519524SHoward Hinnant{ 4702ce48a113SHoward Hinnant shared_ptr(_VSTD::move(__r)).swap(*this); 47033e519524SHoward Hinnant return *this; 47043e519524SHoward Hinnant} 47053e519524SHoward Hinnant 47067609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 47073e519524SHoward Hinnant 47083e519524SHoward Hinnanttemplate<class _Tp> 47093e519524SHoward Hinnanttemplate<class _Yp> 47103e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 47118e25104bSHoward Hinnanttypename enable_if 47128e25104bSHoward Hinnant< 47138e25104bSHoward Hinnant !is_array<_Yp>::value && 47148e25104bSHoward Hinnant is_convertible<_Yp*, _Tp*>::value, 47153e519524SHoward Hinnant shared_ptr<_Tp>& 47168e25104bSHoward Hinnant>::type 4717b3371f6fSHoward Hinnantshared_ptr<_Tp>::operator=(auto_ptr<_Yp> __r) 47183e519524SHoward Hinnant{ 47193e519524SHoward Hinnant shared_ptr(__r).swap(*this); 47203e519524SHoward Hinnant return *this; 47213e519524SHoward Hinnant} 47223e519524SHoward Hinnant 47233e519524SHoward Hinnanttemplate<class _Tp> 47243e519524SHoward Hinnanttemplate <class _Yp, class _Dp> 47253e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 47268e25104bSHoward Hinnanttypename enable_if 47278e25104bSHoward Hinnant< 47288e25104bSHoward Hinnant !is_array<_Yp>::value && 47298e25104bSHoward Hinnant is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, _Tp*>::value, 47303e519524SHoward Hinnant shared_ptr<_Tp>& 47318e25104bSHoward Hinnant>::type 47323e519524SHoward Hinnantshared_ptr<_Tp>::operator=(unique_ptr<_Yp, _Dp> __r) 47333e519524SHoward Hinnant{ 4734ce48a113SHoward Hinnant shared_ptr(_VSTD::move(__r)).swap(*this); 47353e519524SHoward Hinnant return *this; 47363e519524SHoward Hinnant} 47373e519524SHoward Hinnant 47387609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 47393e519524SHoward Hinnant 47403e519524SHoward Hinnanttemplate<class _Tp> 4741906c872dSEvgeniy Stepanovinline 47423e519524SHoward Hinnantvoid 47433739fe79SHoward Hinnantshared_ptr<_Tp>::swap(shared_ptr& __r) _NOEXCEPT 47443e519524SHoward Hinnant{ 4745ce48a113SHoward Hinnant _VSTD::swap(__ptr_, __r.__ptr_); 4746ce48a113SHoward Hinnant _VSTD::swap(__cntrl_, __r.__cntrl_); 47473e519524SHoward Hinnant} 47483e519524SHoward Hinnant 47493e519524SHoward Hinnanttemplate<class _Tp> 4750906c872dSEvgeniy Stepanovinline 47513e519524SHoward Hinnantvoid 47523739fe79SHoward Hinnantshared_ptr<_Tp>::reset() _NOEXCEPT 47533e519524SHoward Hinnant{ 47543e519524SHoward Hinnant shared_ptr().swap(*this); 47553e519524SHoward Hinnant} 47563e519524SHoward Hinnant 47573e519524SHoward Hinnanttemplate<class _Tp> 47583e519524SHoward Hinnanttemplate<class _Yp> 4759906c872dSEvgeniy Stepanovinline 47608e25104bSHoward Hinnanttypename enable_if 47618e25104bSHoward Hinnant< 47628e25104bSHoward Hinnant is_convertible<_Yp*, _Tp*>::value, 47633e519524SHoward Hinnant void 47648e25104bSHoward Hinnant>::type 47653e519524SHoward Hinnantshared_ptr<_Tp>::reset(_Yp* __p) 47663e519524SHoward Hinnant{ 47673e519524SHoward Hinnant shared_ptr(__p).swap(*this); 47683e519524SHoward Hinnant} 47693e519524SHoward Hinnant 47703e519524SHoward Hinnanttemplate<class _Tp> 47713e519524SHoward Hinnanttemplate<class _Yp, class _Dp> 4772906c872dSEvgeniy Stepanovinline 47738e25104bSHoward Hinnanttypename enable_if 47748e25104bSHoward Hinnant< 47758e25104bSHoward Hinnant is_convertible<_Yp*, _Tp*>::value, 47763e519524SHoward Hinnant void 47778e25104bSHoward Hinnant>::type 47783e519524SHoward Hinnantshared_ptr<_Tp>::reset(_Yp* __p, _Dp __d) 47793e519524SHoward Hinnant{ 47803e519524SHoward Hinnant shared_ptr(__p, __d).swap(*this); 47813e519524SHoward Hinnant} 47823e519524SHoward Hinnant 47833e519524SHoward Hinnanttemplate<class _Tp> 47843e519524SHoward Hinnanttemplate<class _Yp, class _Dp, class _Alloc> 4785906c872dSEvgeniy Stepanovinline 47868e25104bSHoward Hinnanttypename enable_if 47878e25104bSHoward Hinnant< 47888e25104bSHoward Hinnant is_convertible<_Yp*, _Tp*>::value, 47893e519524SHoward Hinnant void 47908e25104bSHoward Hinnant>::type 47913e519524SHoward Hinnantshared_ptr<_Tp>::reset(_Yp* __p, _Dp __d, _Alloc __a) 47923e519524SHoward Hinnant{ 47933e519524SHoward Hinnant shared_ptr(__p, __d, __a).swap(*this); 47943e519524SHoward Hinnant} 47953e519524SHoward Hinnant 47963e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 47973e519524SHoward Hinnant 47983e519524SHoward Hinnanttemplate<class _Tp, class ..._Args> 47993e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 48008e25104bSHoward Hinnanttypename enable_if 48018e25104bSHoward Hinnant< 48028e25104bSHoward Hinnant !is_array<_Tp>::value, 48033e519524SHoward Hinnant shared_ptr<_Tp> 48048e25104bSHoward Hinnant>::type 48053e519524SHoward Hinnantmake_shared(_Args&& ...__args) 48063e519524SHoward Hinnant{ 4807ce48a113SHoward Hinnant return shared_ptr<_Tp>::make_shared(_VSTD::forward<_Args>(__args)...); 48083e519524SHoward Hinnant} 48093e519524SHoward Hinnant 48103e519524SHoward Hinnanttemplate<class _Tp, class _Alloc, class ..._Args> 48113e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 48128e25104bSHoward Hinnanttypename enable_if 48138e25104bSHoward Hinnant< 48148e25104bSHoward Hinnant !is_array<_Tp>::value, 48153e519524SHoward Hinnant shared_ptr<_Tp> 48168e25104bSHoward Hinnant>::type 48173e519524SHoward Hinnantallocate_shared(const _Alloc& __a, _Args&& ...__args) 48183e519524SHoward Hinnant{ 4819ce48a113SHoward Hinnant return shared_ptr<_Tp>::allocate_shared(__a, _VSTD::forward<_Args>(__args)...); 48203e519524SHoward Hinnant} 48213e519524SHoward Hinnant 48223e519524SHoward Hinnant#else // _LIBCPP_HAS_NO_VARIADICS 48233e519524SHoward Hinnant 48243e519524SHoward Hinnanttemplate<class _Tp> 48253e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 48263e519524SHoward Hinnantshared_ptr<_Tp> 48273e519524SHoward Hinnantmake_shared() 48283e519524SHoward Hinnant{ 48293e519524SHoward Hinnant return shared_ptr<_Tp>::make_shared(); 48303e519524SHoward Hinnant} 48313e519524SHoward Hinnant 48323e519524SHoward Hinnanttemplate<class _Tp, class _A0> 48333e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 48343e519524SHoward Hinnantshared_ptr<_Tp> 48353e519524SHoward Hinnantmake_shared(_A0& __a0) 48363e519524SHoward Hinnant{ 48373e519524SHoward Hinnant return shared_ptr<_Tp>::make_shared(__a0); 48383e519524SHoward Hinnant} 48393e519524SHoward Hinnant 48403e519524SHoward Hinnanttemplate<class _Tp, class _A0, class _A1> 48413e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 48423e519524SHoward Hinnantshared_ptr<_Tp> 48433e519524SHoward Hinnantmake_shared(_A0& __a0, _A1& __a1) 48443e519524SHoward Hinnant{ 48453e519524SHoward Hinnant return shared_ptr<_Tp>::make_shared(__a0, __a1); 48463e519524SHoward Hinnant} 48473e519524SHoward Hinnant 48483e519524SHoward Hinnanttemplate<class _Tp, class _A0, class _A1, class _A2> 48493e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 48503e519524SHoward Hinnantshared_ptr<_Tp> 48513e519524SHoward Hinnantmake_shared(_A0& __a0, _A1& __a1, _A2& __a2) 48523e519524SHoward Hinnant{ 48533e519524SHoward Hinnant return shared_ptr<_Tp>::make_shared(__a0, __a1, __a2); 48543e519524SHoward Hinnant} 48553e519524SHoward Hinnant 48563e519524SHoward Hinnanttemplate<class _Tp, class _Alloc> 48573e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 48583e519524SHoward Hinnantshared_ptr<_Tp> 48593e519524SHoward Hinnantallocate_shared(const _Alloc& __a) 48603e519524SHoward Hinnant{ 48613e519524SHoward Hinnant return shared_ptr<_Tp>::allocate_shared(__a); 48623e519524SHoward Hinnant} 48633e519524SHoward Hinnant 48643e519524SHoward Hinnanttemplate<class _Tp, class _Alloc, class _A0> 48653e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 48663e519524SHoward Hinnantshared_ptr<_Tp> 48673e519524SHoward Hinnantallocate_shared(const _Alloc& __a, _A0& __a0) 48683e519524SHoward Hinnant{ 48693e519524SHoward Hinnant return shared_ptr<_Tp>::allocate_shared(__a, __a0); 48703e519524SHoward Hinnant} 48713e519524SHoward Hinnant 48723e519524SHoward Hinnanttemplate<class _Tp, class _Alloc, class _A0, class _A1> 48733e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 48743e519524SHoward Hinnantshared_ptr<_Tp> 48753e519524SHoward Hinnantallocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1) 48763e519524SHoward Hinnant{ 48773e519524SHoward Hinnant return shared_ptr<_Tp>::allocate_shared(__a, __a0, __a1); 48783e519524SHoward Hinnant} 48793e519524SHoward Hinnant 48803e519524SHoward Hinnanttemplate<class _Tp, class _Alloc, class _A0, class _A1, class _A2> 48813e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 48823e519524SHoward Hinnantshared_ptr<_Tp> 48833e519524SHoward Hinnantallocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1, _A2& __a2) 48843e519524SHoward Hinnant{ 48853e519524SHoward Hinnant return shared_ptr<_Tp>::allocate_shared(__a, __a0, __a1, __a2); 48863e519524SHoward Hinnant} 48873e519524SHoward Hinnant 48883e519524SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 48893e519524SHoward Hinnant 48903e519524SHoward Hinnanttemplate<class _Tp, class _Up> 48913e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 48923e519524SHoward Hinnantbool 48933739fe79SHoward Hinnantoperator==(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 48943e519524SHoward Hinnant{ 48953e519524SHoward Hinnant return __x.get() == __y.get(); 48963e519524SHoward Hinnant} 48973e519524SHoward Hinnant 48983e519524SHoward Hinnanttemplate<class _Tp, class _Up> 48993e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 49003e519524SHoward Hinnantbool 49013739fe79SHoward Hinnantoperator!=(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 49023e519524SHoward Hinnant{ 49033e519524SHoward Hinnant return !(__x == __y); 49043e519524SHoward Hinnant} 49053e519524SHoward Hinnant 49063e519524SHoward Hinnanttemplate<class _Tp, class _Up> 49073e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 49083e519524SHoward Hinnantbool 49093739fe79SHoward Hinnantoperator<(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 49103e519524SHoward Hinnant{ 49116fe361c1SEric Fiselier typedef typename common_type<_Tp*, _Up*>::type _Vp; 49126fe361c1SEric Fiselier return less<_Vp>()(__x.get(), __y.get()); 491367f39647SHoward Hinnant} 491467f39647SHoward Hinnant 491567f39647SHoward Hinnanttemplate<class _Tp, class _Up> 491667f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 491767f39647SHoward Hinnantbool 491867f39647SHoward Hinnantoperator>(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 491967f39647SHoward Hinnant{ 492067f39647SHoward Hinnant return __y < __x; 492167f39647SHoward Hinnant} 492267f39647SHoward Hinnant 492367f39647SHoward Hinnanttemplate<class _Tp, class _Up> 492467f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 492567f39647SHoward Hinnantbool 492667f39647SHoward Hinnantoperator<=(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 492767f39647SHoward Hinnant{ 492867f39647SHoward Hinnant return !(__y < __x); 492967f39647SHoward Hinnant} 493067f39647SHoward Hinnant 493167f39647SHoward Hinnanttemplate<class _Tp, class _Up> 493267f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 493367f39647SHoward Hinnantbool 493467f39647SHoward Hinnantoperator>=(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT 493567f39647SHoward Hinnant{ 493667f39647SHoward Hinnant return !(__x < __y); 493767f39647SHoward Hinnant} 493867f39647SHoward Hinnant 493967f39647SHoward Hinnanttemplate<class _Tp> 494067f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 494167f39647SHoward Hinnantbool 494267f39647SHoward Hinnantoperator==(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 494367f39647SHoward Hinnant{ 494467f39647SHoward Hinnant return !__x; 494567f39647SHoward Hinnant} 494667f39647SHoward Hinnant 494767f39647SHoward Hinnanttemplate<class _Tp> 494867f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 494967f39647SHoward Hinnantbool 495067f39647SHoward Hinnantoperator==(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 495167f39647SHoward Hinnant{ 495267f39647SHoward Hinnant return !__x; 495367f39647SHoward Hinnant} 495467f39647SHoward Hinnant 495567f39647SHoward Hinnanttemplate<class _Tp> 495667f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 495767f39647SHoward Hinnantbool 495867f39647SHoward Hinnantoperator!=(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 495967f39647SHoward Hinnant{ 496067f39647SHoward Hinnant return static_cast<bool>(__x); 496167f39647SHoward Hinnant} 496267f39647SHoward Hinnant 496367f39647SHoward Hinnanttemplate<class _Tp> 496467f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 496567f39647SHoward Hinnantbool 496667f39647SHoward Hinnantoperator!=(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 496767f39647SHoward Hinnant{ 496867f39647SHoward Hinnant return static_cast<bool>(__x); 496967f39647SHoward Hinnant} 497067f39647SHoward Hinnant 497167f39647SHoward Hinnanttemplate<class _Tp> 497267f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 497367f39647SHoward Hinnantbool 497467f39647SHoward Hinnantoperator<(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 497567f39647SHoward Hinnant{ 497667f39647SHoward Hinnant return less<_Tp*>()(__x.get(), nullptr); 497767f39647SHoward Hinnant} 497867f39647SHoward Hinnant 497967f39647SHoward Hinnanttemplate<class _Tp> 498067f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 498167f39647SHoward Hinnantbool 498267f39647SHoward Hinnantoperator<(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 498367f39647SHoward Hinnant{ 498467f39647SHoward Hinnant return less<_Tp*>()(nullptr, __x.get()); 498567f39647SHoward Hinnant} 498667f39647SHoward Hinnant 498767f39647SHoward Hinnanttemplate<class _Tp> 498867f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 498967f39647SHoward Hinnantbool 499067f39647SHoward Hinnantoperator>(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 499167f39647SHoward Hinnant{ 499267f39647SHoward Hinnant return nullptr < __x; 499367f39647SHoward Hinnant} 499467f39647SHoward Hinnant 499567f39647SHoward Hinnanttemplate<class _Tp> 499667f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 499767f39647SHoward Hinnantbool 499867f39647SHoward Hinnantoperator>(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 499967f39647SHoward Hinnant{ 500067f39647SHoward Hinnant return __x < nullptr; 500167f39647SHoward Hinnant} 500267f39647SHoward Hinnant 500367f39647SHoward Hinnanttemplate<class _Tp> 500467f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 500567f39647SHoward Hinnantbool 500667f39647SHoward Hinnantoperator<=(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 500767f39647SHoward Hinnant{ 500867f39647SHoward Hinnant return !(nullptr < __x); 500967f39647SHoward Hinnant} 501067f39647SHoward Hinnant 501167f39647SHoward Hinnanttemplate<class _Tp> 501267f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 501367f39647SHoward Hinnantbool 501467f39647SHoward Hinnantoperator<=(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 501567f39647SHoward Hinnant{ 501667f39647SHoward Hinnant return !(__x < nullptr); 501767f39647SHoward Hinnant} 501867f39647SHoward Hinnant 501967f39647SHoward Hinnanttemplate<class _Tp> 502067f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 502167f39647SHoward Hinnantbool 502267f39647SHoward Hinnantoperator>=(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT 502367f39647SHoward Hinnant{ 502467f39647SHoward Hinnant return !(__x < nullptr); 502567f39647SHoward Hinnant} 502667f39647SHoward Hinnant 502767f39647SHoward Hinnanttemplate<class _Tp> 502867f39647SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 502967f39647SHoward Hinnantbool 503067f39647SHoward Hinnantoperator>=(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT 503167f39647SHoward Hinnant{ 503267f39647SHoward Hinnant return !(nullptr < __x); 50333e519524SHoward Hinnant} 50343e519524SHoward Hinnant 50353e519524SHoward Hinnanttemplate<class _Tp> 50363e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 50373e519524SHoward Hinnantvoid 50383739fe79SHoward Hinnantswap(shared_ptr<_Tp>& __x, shared_ptr<_Tp>& __y) _NOEXCEPT 50393e519524SHoward Hinnant{ 50403e519524SHoward Hinnant __x.swap(__y); 50413e519524SHoward Hinnant} 50423e519524SHoward Hinnant 50433e519524SHoward Hinnanttemplate<class _Tp, class _Up> 50443e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 50458e25104bSHoward Hinnanttypename enable_if 50468e25104bSHoward Hinnant< 50478e25104bSHoward Hinnant !is_array<_Tp>::value && !is_array<_Up>::value, 50483e519524SHoward Hinnant shared_ptr<_Tp> 50498e25104bSHoward Hinnant>::type 50503739fe79SHoward Hinnantstatic_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT 50513e519524SHoward Hinnant{ 50523e519524SHoward Hinnant return shared_ptr<_Tp>(__r, static_cast<_Tp*>(__r.get())); 50533e519524SHoward Hinnant} 50543e519524SHoward Hinnant 50553e519524SHoward Hinnanttemplate<class _Tp, class _Up> 50563e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 50578e25104bSHoward Hinnanttypename enable_if 50588e25104bSHoward Hinnant< 50598e25104bSHoward Hinnant !is_array<_Tp>::value && !is_array<_Up>::value, 50603e519524SHoward Hinnant shared_ptr<_Tp> 50618e25104bSHoward Hinnant>::type 50623739fe79SHoward Hinnantdynamic_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT 50633e519524SHoward Hinnant{ 50643e519524SHoward Hinnant _Tp* __p = dynamic_cast<_Tp*>(__r.get()); 50653e519524SHoward Hinnant return __p ? shared_ptr<_Tp>(__r, __p) : shared_ptr<_Tp>(); 50663e519524SHoward Hinnant} 50673e519524SHoward Hinnant 50683e519524SHoward Hinnanttemplate<class _Tp, class _Up> 50698e25104bSHoward Hinnanttypename enable_if 50708e25104bSHoward Hinnant< 50718e25104bSHoward Hinnant is_array<_Tp>::value == is_array<_Up>::value, 50723e519524SHoward Hinnant shared_ptr<_Tp> 50738e25104bSHoward Hinnant>::type 50743739fe79SHoward Hinnantconst_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT 50753e519524SHoward Hinnant{ 50768e25104bSHoward Hinnant typedef typename remove_extent<_Tp>::type _RTp; 50778e25104bSHoward Hinnant return shared_ptr<_Tp>(__r, const_cast<_RTp*>(__r.get())); 50783e519524SHoward Hinnant} 50793e519524SHoward Hinnant 508054b409fdSHoward Hinnant#ifndef _LIBCPP_NO_RTTI 508154b409fdSHoward Hinnant 50823e519524SHoward Hinnanttemplate<class _Dp, class _Tp> 50833e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 50843e519524SHoward Hinnant_Dp* 50853739fe79SHoward Hinnantget_deleter(const shared_ptr<_Tp>& __p) _NOEXCEPT 50863e519524SHoward Hinnant{ 50873e519524SHoward Hinnant return __p.template __get_deleter<_Dp>(); 50883e519524SHoward Hinnant} 50893e519524SHoward Hinnant 5090b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_RTTI 509154b409fdSHoward Hinnant 50923e519524SHoward Hinnanttemplate<class _Tp> 5093*e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS weak_ptr 50943e519524SHoward Hinnant{ 50953e519524SHoward Hinnantpublic: 50963e519524SHoward Hinnant typedef _Tp element_type; 50973e519524SHoward Hinnantprivate: 50983e519524SHoward Hinnant element_type* __ptr_; 50993e519524SHoward Hinnant __shared_weak_count* __cntrl_; 51003e519524SHoward Hinnant 51013e519524SHoward Hinnantpublic: 5102906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 5103c0937e8aSHoward Hinnant _LIBCPP_CONSTEXPR weak_ptr() _NOEXCEPT; 5104906c872dSEvgeniy Stepanov template<class _Yp> _LIBCPP_INLINE_VISIBILITY weak_ptr(shared_ptr<_Yp> const& __r, 51053739fe79SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0) 51063739fe79SHoward Hinnant _NOEXCEPT; 5107906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 51083739fe79SHoward Hinnant weak_ptr(weak_ptr const& __r) _NOEXCEPT; 5109906c872dSEvgeniy Stepanov template<class _Yp> _LIBCPP_INLINE_VISIBILITY weak_ptr(weak_ptr<_Yp> const& __r, 51103739fe79SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0) 51113739fe79SHoward Hinnant _NOEXCEPT; 51123e519524SHoward Hinnant 51138e25104bSHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 5114906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 51158e25104bSHoward Hinnant weak_ptr(weak_ptr&& __r) _NOEXCEPT; 5116906c872dSEvgeniy Stepanov template<class _Yp> _LIBCPP_INLINE_VISIBILITY weak_ptr(weak_ptr<_Yp>&& __r, 51178e25104bSHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0) 51188e25104bSHoward Hinnant _NOEXCEPT; 51198e25104bSHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 51203e519524SHoward Hinnant ~weak_ptr(); 51213e519524SHoward Hinnant 5122906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 51233739fe79SHoward Hinnant weak_ptr& operator=(weak_ptr const& __r) _NOEXCEPT; 51248e25104bSHoward Hinnant template<class _Yp> 51258e25104bSHoward Hinnant typename enable_if 51268e25104bSHoward Hinnant < 51278e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 51288e25104bSHoward Hinnant weak_ptr& 51298e25104bSHoward Hinnant >::type 5130906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 51318e25104bSHoward Hinnant operator=(weak_ptr<_Yp> const& __r) _NOEXCEPT; 51328e25104bSHoward Hinnant 51338e25104bSHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 51348e25104bSHoward Hinnant 5135906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 51368e25104bSHoward Hinnant weak_ptr& operator=(weak_ptr&& __r) _NOEXCEPT; 51378e25104bSHoward Hinnant template<class _Yp> 51388e25104bSHoward Hinnant typename enable_if 51398e25104bSHoward Hinnant < 51408e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 51418e25104bSHoward Hinnant weak_ptr& 51428e25104bSHoward Hinnant >::type 5143906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 51448e25104bSHoward Hinnant operator=(weak_ptr<_Yp>&& __r) _NOEXCEPT; 51458e25104bSHoward Hinnant 51468e25104bSHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 51478e25104bSHoward Hinnant 51488e25104bSHoward Hinnant template<class _Yp> 51498e25104bSHoward Hinnant typename enable_if 51508e25104bSHoward Hinnant < 51518e25104bSHoward Hinnant is_convertible<_Yp*, element_type*>::value, 51528e25104bSHoward Hinnant weak_ptr& 51538e25104bSHoward Hinnant >::type 5154906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 51558e25104bSHoward Hinnant operator=(shared_ptr<_Yp> const& __r) _NOEXCEPT; 51563e519524SHoward Hinnant 5157906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 51583739fe79SHoward Hinnant void swap(weak_ptr& __r) _NOEXCEPT; 5159906c872dSEvgeniy Stepanov _LIBCPP_INLINE_VISIBILITY 51603739fe79SHoward Hinnant void reset() _NOEXCEPT; 51613e519524SHoward Hinnant 5162848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 51633739fe79SHoward Hinnant long use_count() const _NOEXCEPT 51643739fe79SHoward Hinnant {return __cntrl_ ? __cntrl_->use_count() : 0;} 5165848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 51663739fe79SHoward Hinnant bool expired() const _NOEXCEPT 51673739fe79SHoward Hinnant {return __cntrl_ == 0 || __cntrl_->use_count() == 0;} 51683739fe79SHoward Hinnant shared_ptr<_Tp> lock() const _NOEXCEPT; 5169848a5374SHoward Hinnant template<class _Up> 5170848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5171848a5374SHoward Hinnant bool owner_before(const shared_ptr<_Up>& __r) const 51723e519524SHoward Hinnant {return __cntrl_ < __r.__cntrl_;} 5173848a5374SHoward Hinnant template<class _Up> 5174848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5175848a5374SHoward Hinnant bool owner_before(const weak_ptr<_Up>& __r) const 51763e519524SHoward Hinnant {return __cntrl_ < __r.__cntrl_;} 51773e519524SHoward Hinnant 5178*e2f2d1edSEric Fiselier template <class _Up> friend class _LIBCPP_TEMPLATE_VIS weak_ptr; 5179*e2f2d1edSEric Fiselier template <class _Up> friend class _LIBCPP_TEMPLATE_VIS shared_ptr; 51803e519524SHoward Hinnant}; 51813e519524SHoward Hinnant 51823e519524SHoward Hinnanttemplate<class _Tp> 5183906c872dSEvgeniy Stepanovinline 5184c0937e8aSHoward Hinnant_LIBCPP_CONSTEXPR 51853739fe79SHoward Hinnantweak_ptr<_Tp>::weak_ptr() _NOEXCEPT 51863e519524SHoward Hinnant : __ptr_(0), 51873e519524SHoward Hinnant __cntrl_(0) 51883e519524SHoward Hinnant{ 51893e519524SHoward Hinnant} 51903e519524SHoward Hinnant 51913e519524SHoward Hinnanttemplate<class _Tp> 5192906c872dSEvgeniy Stepanovinline 51933739fe79SHoward Hinnantweak_ptr<_Tp>::weak_ptr(weak_ptr const& __r) _NOEXCEPT 51943e519524SHoward Hinnant : __ptr_(__r.__ptr_), 51953e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 51963e519524SHoward Hinnant{ 51973e519524SHoward Hinnant if (__cntrl_) 51983e519524SHoward Hinnant __cntrl_->__add_weak(); 51993e519524SHoward Hinnant} 52003e519524SHoward Hinnant 52013e519524SHoward Hinnanttemplate<class _Tp> 52023e519524SHoward Hinnanttemplate<class _Yp> 5203906c872dSEvgeniy Stepanovinline 52043e519524SHoward Hinnantweak_ptr<_Tp>::weak_ptr(shared_ptr<_Yp> const& __r, 52055eb6bdfaSHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type) 52063739fe79SHoward Hinnant _NOEXCEPT 52073e519524SHoward Hinnant : __ptr_(__r.__ptr_), 52083e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 52093e519524SHoward Hinnant{ 52103e519524SHoward Hinnant if (__cntrl_) 52113e519524SHoward Hinnant __cntrl_->__add_weak(); 52123e519524SHoward Hinnant} 52133e519524SHoward Hinnant 52143e519524SHoward Hinnanttemplate<class _Tp> 52153e519524SHoward Hinnanttemplate<class _Yp> 5216906c872dSEvgeniy Stepanovinline 52173e519524SHoward Hinnantweak_ptr<_Tp>::weak_ptr(weak_ptr<_Yp> const& __r, 52185eb6bdfaSHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type) 52193739fe79SHoward Hinnant _NOEXCEPT 52203e519524SHoward Hinnant : __ptr_(__r.__ptr_), 52213e519524SHoward Hinnant __cntrl_(__r.__cntrl_) 52223e519524SHoward Hinnant{ 52233e519524SHoward Hinnant if (__cntrl_) 52243e519524SHoward Hinnant __cntrl_->__add_weak(); 52253e519524SHoward Hinnant} 52263e519524SHoward Hinnant 52278e25104bSHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 52288e25104bSHoward Hinnant 52298e25104bSHoward Hinnanttemplate<class _Tp> 5230906c872dSEvgeniy Stepanovinline 52318e25104bSHoward Hinnantweak_ptr<_Tp>::weak_ptr(weak_ptr&& __r) _NOEXCEPT 52328e25104bSHoward Hinnant : __ptr_(__r.__ptr_), 52338e25104bSHoward Hinnant __cntrl_(__r.__cntrl_) 52348e25104bSHoward Hinnant{ 52358e25104bSHoward Hinnant __r.__ptr_ = 0; 52368e25104bSHoward Hinnant __r.__cntrl_ = 0; 52378e25104bSHoward Hinnant} 52388e25104bSHoward Hinnant 52398e25104bSHoward Hinnanttemplate<class _Tp> 52408e25104bSHoward Hinnanttemplate<class _Yp> 5241906c872dSEvgeniy Stepanovinline 52428e25104bSHoward Hinnantweak_ptr<_Tp>::weak_ptr(weak_ptr<_Yp>&& __r, 52438e25104bSHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type) 52448e25104bSHoward Hinnant _NOEXCEPT 52458e25104bSHoward Hinnant : __ptr_(__r.__ptr_), 52468e25104bSHoward Hinnant __cntrl_(__r.__cntrl_) 52478e25104bSHoward Hinnant{ 52488e25104bSHoward Hinnant __r.__ptr_ = 0; 52498e25104bSHoward Hinnant __r.__cntrl_ = 0; 52508e25104bSHoward Hinnant} 52518e25104bSHoward Hinnant 52528e25104bSHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 52538e25104bSHoward Hinnant 52543e519524SHoward Hinnanttemplate<class _Tp> 52553e519524SHoward Hinnantweak_ptr<_Tp>::~weak_ptr() 52563e519524SHoward Hinnant{ 52573e519524SHoward Hinnant if (__cntrl_) 52583e519524SHoward Hinnant __cntrl_->__release_weak(); 52593e519524SHoward Hinnant} 52603e519524SHoward Hinnant 52613e519524SHoward Hinnanttemplate<class _Tp> 5262906c872dSEvgeniy Stepanovinline 52633e519524SHoward Hinnantweak_ptr<_Tp>& 52643739fe79SHoward Hinnantweak_ptr<_Tp>::operator=(weak_ptr const& __r) _NOEXCEPT 52653e519524SHoward Hinnant{ 52663e519524SHoward Hinnant weak_ptr(__r).swap(*this); 52673e519524SHoward Hinnant return *this; 52683e519524SHoward Hinnant} 52693e519524SHoward Hinnant 52703e519524SHoward Hinnanttemplate<class _Tp> 52713e519524SHoward Hinnanttemplate<class _Yp> 5272906c872dSEvgeniy Stepanovinline 52738e25104bSHoward Hinnanttypename enable_if 52748e25104bSHoward Hinnant< 52758e25104bSHoward Hinnant is_convertible<_Yp*, _Tp*>::value, 52763e519524SHoward Hinnant weak_ptr<_Tp>& 52778e25104bSHoward Hinnant>::type 52783739fe79SHoward Hinnantweak_ptr<_Tp>::operator=(weak_ptr<_Yp> const& __r) _NOEXCEPT 52793e519524SHoward Hinnant{ 52803e519524SHoward Hinnant weak_ptr(__r).swap(*this); 52813e519524SHoward Hinnant return *this; 52823e519524SHoward Hinnant} 52833e519524SHoward Hinnant 52848e25104bSHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 52858e25104bSHoward Hinnant 52868e25104bSHoward Hinnanttemplate<class _Tp> 5287906c872dSEvgeniy Stepanovinline 52888e25104bSHoward Hinnantweak_ptr<_Tp>& 52898e25104bSHoward Hinnantweak_ptr<_Tp>::operator=(weak_ptr&& __r) _NOEXCEPT 52908e25104bSHoward Hinnant{ 52918e25104bSHoward Hinnant weak_ptr(_VSTD::move(__r)).swap(*this); 52928e25104bSHoward Hinnant return *this; 52938e25104bSHoward Hinnant} 52948e25104bSHoward Hinnant 52953e519524SHoward Hinnanttemplate<class _Tp> 52963e519524SHoward Hinnanttemplate<class _Yp> 5297906c872dSEvgeniy Stepanovinline 52988e25104bSHoward Hinnanttypename enable_if 52998e25104bSHoward Hinnant< 53008e25104bSHoward Hinnant is_convertible<_Yp*, _Tp*>::value, 53013e519524SHoward Hinnant weak_ptr<_Tp>& 53028e25104bSHoward Hinnant>::type 53038e25104bSHoward Hinnantweak_ptr<_Tp>::operator=(weak_ptr<_Yp>&& __r) _NOEXCEPT 53048e25104bSHoward Hinnant{ 53058e25104bSHoward Hinnant weak_ptr(_VSTD::move(__r)).swap(*this); 53068e25104bSHoward Hinnant return *this; 53078e25104bSHoward Hinnant} 53088e25104bSHoward Hinnant 53098e25104bSHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 53108e25104bSHoward Hinnant 53118e25104bSHoward Hinnanttemplate<class _Tp> 53128e25104bSHoward Hinnanttemplate<class _Yp> 5313906c872dSEvgeniy Stepanovinline 53148e25104bSHoward Hinnanttypename enable_if 53158e25104bSHoward Hinnant< 53168e25104bSHoward Hinnant is_convertible<_Yp*, _Tp*>::value, 53178e25104bSHoward Hinnant weak_ptr<_Tp>& 53188e25104bSHoward Hinnant>::type 53193739fe79SHoward Hinnantweak_ptr<_Tp>::operator=(shared_ptr<_Yp> const& __r) _NOEXCEPT 53203e519524SHoward Hinnant{ 53213e519524SHoward Hinnant weak_ptr(__r).swap(*this); 53223e519524SHoward Hinnant return *this; 53233e519524SHoward Hinnant} 53243e519524SHoward Hinnant 53253e519524SHoward Hinnanttemplate<class _Tp> 5326906c872dSEvgeniy Stepanovinline 53273e519524SHoward Hinnantvoid 53283739fe79SHoward Hinnantweak_ptr<_Tp>::swap(weak_ptr& __r) _NOEXCEPT 53293e519524SHoward Hinnant{ 5330ce48a113SHoward Hinnant _VSTD::swap(__ptr_, __r.__ptr_); 5331ce48a113SHoward Hinnant _VSTD::swap(__cntrl_, __r.__cntrl_); 53323e519524SHoward Hinnant} 53333e519524SHoward Hinnant 53343e519524SHoward Hinnanttemplate<class _Tp> 53353e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 53363e519524SHoward Hinnantvoid 53373739fe79SHoward Hinnantswap(weak_ptr<_Tp>& __x, weak_ptr<_Tp>& __y) _NOEXCEPT 53383e519524SHoward Hinnant{ 53393e519524SHoward Hinnant __x.swap(__y); 53403e519524SHoward Hinnant} 53413e519524SHoward Hinnant 53423e519524SHoward Hinnanttemplate<class _Tp> 5343906c872dSEvgeniy Stepanovinline 53443e519524SHoward Hinnantvoid 53453739fe79SHoward Hinnantweak_ptr<_Tp>::reset() _NOEXCEPT 53463e519524SHoward Hinnant{ 53473e519524SHoward Hinnant weak_ptr().swap(*this); 53483e519524SHoward Hinnant} 53493e519524SHoward Hinnant 53503e519524SHoward Hinnanttemplate<class _Tp> 53513e519524SHoward Hinnanttemplate<class _Yp> 53523e519524SHoward Hinnantshared_ptr<_Tp>::shared_ptr(const weak_ptr<_Yp>& __r, 53533e519524SHoward Hinnant typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type) 53543e519524SHoward Hinnant : __ptr_(__r.__ptr_), 53553e519524SHoward Hinnant __cntrl_(__r.__cntrl_ ? __r.__cntrl_->lock() : __r.__cntrl_) 53563e519524SHoward Hinnant{ 53573e519524SHoward Hinnant if (__cntrl_ == 0) 5358d437fa5cSMarshall Clow __throw_bad_weak_ptr(); 53593e519524SHoward Hinnant} 53603e519524SHoward Hinnant 53613e519524SHoward Hinnanttemplate<class _Tp> 53623e519524SHoward Hinnantshared_ptr<_Tp> 53633739fe79SHoward Hinnantweak_ptr<_Tp>::lock() const _NOEXCEPT 53643e519524SHoward Hinnant{ 53653e519524SHoward Hinnant shared_ptr<_Tp> __r; 53663e519524SHoward Hinnant __r.__cntrl_ = __cntrl_ ? __cntrl_->lock() : __cntrl_; 53673e519524SHoward Hinnant if (__r.__cntrl_) 53683e519524SHoward Hinnant __r.__ptr_ = __ptr_; 53693e519524SHoward Hinnant return __r; 53703e519524SHoward Hinnant} 53713e519524SHoward Hinnant 5372183c010cSMarshall Clow#if _LIBCPP_STD_VER > 14 5373183c010cSMarshall Clowtemplate <class _Tp = void> struct owner_less; 5374183c010cSMarshall Clow#else 53753e519524SHoward Hinnanttemplate <class _Tp> struct owner_less; 5376183c010cSMarshall Clow#endif 53773e519524SHoward Hinnant 53783e519524SHoward Hinnanttemplate <class _Tp> 5379*e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS owner_less<shared_ptr<_Tp> > 53803e519524SHoward Hinnant : binary_function<shared_ptr<_Tp>, shared_ptr<_Tp>, bool> 53813e519524SHoward Hinnant{ 53823e519524SHoward Hinnant typedef bool result_type; 5383848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 53843e519524SHoward Hinnant bool operator()(shared_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const 53853e519524SHoward Hinnant {return __x.owner_before(__y);} 5386848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 53873e519524SHoward Hinnant bool operator()(shared_ptr<_Tp> const& __x, weak_ptr<_Tp> const& __y) const 53883e519524SHoward Hinnant {return __x.owner_before(__y);} 5389848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 53903e519524SHoward Hinnant bool operator()( weak_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const 53913e519524SHoward Hinnant {return __x.owner_before(__y);} 53923e519524SHoward Hinnant}; 53933e519524SHoward Hinnant 53943e519524SHoward Hinnanttemplate <class _Tp> 5395*e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS owner_less<weak_ptr<_Tp> > 53963e519524SHoward Hinnant : binary_function<weak_ptr<_Tp>, weak_ptr<_Tp>, bool> 53973e519524SHoward Hinnant{ 53983e519524SHoward Hinnant typedef bool result_type; 5399848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 54003e519524SHoward Hinnant bool operator()( weak_ptr<_Tp> const& __x, weak_ptr<_Tp> const& __y) const 54013e519524SHoward Hinnant {return __x.owner_before(__y);} 5402848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 54033e519524SHoward Hinnant bool operator()(shared_ptr<_Tp> const& __x, weak_ptr<_Tp> const& __y) const 54043e519524SHoward Hinnant {return __x.owner_before(__y);} 5405848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 54063e519524SHoward Hinnant bool operator()( weak_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const 54073e519524SHoward Hinnant {return __x.owner_before(__y);} 54083e519524SHoward Hinnant}; 54093e519524SHoward Hinnant 5410183c010cSMarshall Clow#if _LIBCPP_STD_VER > 14 5411183c010cSMarshall Clowtemplate <> 5412*e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS owner_less<void> 5413183c010cSMarshall Clow{ 5414183c010cSMarshall Clow template <class _Tp, class _Up> 5415183c010cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 5416183c010cSMarshall Clow bool operator()( shared_ptr<_Tp> const& __x, shared_ptr<_Up> const& __y) const 5417183c010cSMarshall Clow {return __x.owner_before(__y);} 5418183c010cSMarshall Clow template <class _Tp, class _Up> 5419183c010cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 5420183c010cSMarshall Clow bool operator()( shared_ptr<_Tp> const& __x, weak_ptr<_Up> const& __y) const 5421183c010cSMarshall Clow {return __x.owner_before(__y);} 5422183c010cSMarshall Clow template <class _Tp, class _Up> 5423183c010cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 5424183c010cSMarshall Clow bool operator()( weak_ptr<_Tp> const& __x, shared_ptr<_Up> const& __y) const 5425183c010cSMarshall Clow {return __x.owner_before(__y);} 5426183c010cSMarshall Clow template <class _Tp, class _Up> 5427183c010cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 5428183c010cSMarshall Clow bool operator()( weak_ptr<_Tp> const& __x, weak_ptr<_Up> const& __y) const 5429183c010cSMarshall Clow {return __x.owner_before(__y);} 5430183c010cSMarshall Clow typedef void is_transparent; 5431183c010cSMarshall Clow}; 5432183c010cSMarshall Clow#endif 5433183c010cSMarshall Clow 54343e519524SHoward Hinnanttemplate<class _Tp> 5435*e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS enable_shared_from_this 54363e519524SHoward Hinnant{ 54373e519524SHoward Hinnant mutable weak_ptr<_Tp> __weak_this_; 54383e519524SHoward Hinnantprotected: 5439c0937e8aSHoward Hinnant _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 54403739fe79SHoward Hinnant enable_shared_from_this() _NOEXCEPT {} 5441848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 54423739fe79SHoward Hinnant enable_shared_from_this(enable_shared_from_this const&) _NOEXCEPT {} 5443848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 54443739fe79SHoward Hinnant enable_shared_from_this& operator=(enable_shared_from_this const&) _NOEXCEPT 54453739fe79SHoward Hinnant {return *this;} 5446848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 54473e519524SHoward Hinnant ~enable_shared_from_this() {} 54483e519524SHoward Hinnantpublic: 5449848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 54503739fe79SHoward Hinnant shared_ptr<_Tp> shared_from_this() 54513739fe79SHoward Hinnant {return shared_ptr<_Tp>(__weak_this_);} 5452848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 54533739fe79SHoward Hinnant shared_ptr<_Tp const> shared_from_this() const 54543739fe79SHoward Hinnant {return shared_ptr<const _Tp>(__weak_this_);} 54553e519524SHoward Hinnant 545688f5bfdcSEric Fiselier#if _LIBCPP_STD_VER > 14 545788f5bfdcSEric Fiselier _LIBCPP_INLINE_VISIBILITY 545888f5bfdcSEric Fiselier weak_ptr<_Tp> weak_from_this() _NOEXCEPT 545988f5bfdcSEric Fiselier { return __weak_this_; } 546088f5bfdcSEric Fiselier 546188f5bfdcSEric Fiselier _LIBCPP_INLINE_VISIBILITY 546288f5bfdcSEric Fiselier weak_ptr<const _Tp> weak_from_this() const _NOEXCEPT 546388f5bfdcSEric Fiselier { return __weak_this_; } 546488f5bfdcSEric Fiselier#endif // _LIBCPP_STD_VER > 14 546588f5bfdcSEric Fiselier 54663e519524SHoward Hinnant template <class _Up> friend class shared_ptr; 54673e519524SHoward Hinnant}; 54683e519524SHoward Hinnant 5469d1803b6cSHoward Hinnanttemplate <class _Tp> 5470*e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS hash<shared_ptr<_Tp> > 5471d1803b6cSHoward Hinnant{ 5472d1803b6cSHoward Hinnant typedef shared_ptr<_Tp> argument_type; 5473d1803b6cSHoward Hinnant typedef size_t result_type; 5474848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 54753739fe79SHoward Hinnant result_type operator()(const argument_type& __ptr) const _NOEXCEPT 5476d1803b6cSHoward Hinnant { 5477d1803b6cSHoward Hinnant return hash<_Tp*>()(__ptr.get()); 5478d1803b6cSHoward Hinnant } 5479d1803b6cSHoward Hinnant}; 5480d1803b6cSHoward Hinnant 5481c003db1fSHoward Hinnanttemplate<class _CharT, class _Traits, class _Yp> 5482e3163f5aSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5483e3163f5aSHoward Hinnantbasic_ostream<_CharT, _Traits>& 5484c003db1fSHoward Hinnantoperator<<(basic_ostream<_CharT, _Traits>& __os, shared_ptr<_Yp> const& __p); 5485e3163f5aSHoward Hinnant 5486df93bad1SEric Fiselier 5487df93bad1SEric Fiselier#if !defined(_LIBCPP_HAS_NO_ATOMIC_HEADER) 5488d77851e8SHoward Hinnant 5489f0544c20SHoward Hinnantclass _LIBCPP_TYPE_VIS __sp_mut 5490d77851e8SHoward Hinnant{ 549154d333a6SHoward Hinnant void* __lx; 5492d77851e8SHoward Hinnantpublic: 5493d77851e8SHoward Hinnant void lock() _NOEXCEPT; 5494d77851e8SHoward Hinnant void unlock() _NOEXCEPT; 5495d77851e8SHoward Hinnant 5496d77851e8SHoward Hinnantprivate: 5497d77851e8SHoward Hinnant _LIBCPP_CONSTEXPR __sp_mut(void*) _NOEXCEPT; 5498d77851e8SHoward Hinnant __sp_mut(const __sp_mut&); 5499d77851e8SHoward Hinnant __sp_mut& operator=(const __sp_mut&); 5500d77851e8SHoward Hinnant 55016e41256fSHoward Hinnant friend _LIBCPP_FUNC_VIS __sp_mut& __get_sp_mut(const void*); 5502d77851e8SHoward Hinnant}; 5503d77851e8SHoward Hinnant 55046e41256fSHoward Hinnant_LIBCPP_FUNC_VIS __sp_mut& __get_sp_mut(const void*); 5505d77851e8SHoward Hinnant 5506d77851e8SHoward Hinnanttemplate <class _Tp> 5507d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5508d77851e8SHoward Hinnantbool 5509d77851e8SHoward Hinnantatomic_is_lock_free(const shared_ptr<_Tp>*) 5510d77851e8SHoward Hinnant{ 5511d77851e8SHoward Hinnant return false; 5512d77851e8SHoward Hinnant} 5513d77851e8SHoward Hinnant 5514d77851e8SHoward Hinnanttemplate <class _Tp> 5515d77851e8SHoward Hinnantshared_ptr<_Tp> 5516d77851e8SHoward Hinnantatomic_load(const shared_ptr<_Tp>* __p) 5517d77851e8SHoward Hinnant{ 5518d77851e8SHoward Hinnant __sp_mut& __m = __get_sp_mut(__p); 5519d77851e8SHoward Hinnant __m.lock(); 5520d77851e8SHoward Hinnant shared_ptr<_Tp> __q = *__p; 5521d77851e8SHoward Hinnant __m.unlock(); 5522d77851e8SHoward Hinnant return __q; 5523d77851e8SHoward Hinnant} 5524d77851e8SHoward Hinnant 5525d77851e8SHoward Hinnanttemplate <class _Tp> 5526d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5527d77851e8SHoward Hinnantshared_ptr<_Tp> 5528d77851e8SHoward Hinnantatomic_load_explicit(const shared_ptr<_Tp>* __p, memory_order) 5529d77851e8SHoward Hinnant{ 5530d77851e8SHoward Hinnant return atomic_load(__p); 5531d77851e8SHoward Hinnant} 5532d77851e8SHoward Hinnant 5533d77851e8SHoward Hinnanttemplate <class _Tp> 5534d77851e8SHoward Hinnantvoid 5535d77851e8SHoward Hinnantatomic_store(shared_ptr<_Tp>* __p, shared_ptr<_Tp> __r) 5536d77851e8SHoward Hinnant{ 5537d77851e8SHoward Hinnant __sp_mut& __m = __get_sp_mut(__p); 5538d77851e8SHoward Hinnant __m.lock(); 5539d77851e8SHoward Hinnant __p->swap(__r); 5540d77851e8SHoward Hinnant __m.unlock(); 5541d77851e8SHoward Hinnant} 5542d77851e8SHoward Hinnant 5543d77851e8SHoward Hinnanttemplate <class _Tp> 5544d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5545d77851e8SHoward Hinnantvoid 5546d77851e8SHoward Hinnantatomic_store_explicit(shared_ptr<_Tp>* __p, shared_ptr<_Tp> __r, memory_order) 5547d77851e8SHoward Hinnant{ 5548d77851e8SHoward Hinnant atomic_store(__p, __r); 5549d77851e8SHoward Hinnant} 5550d77851e8SHoward Hinnant 5551d77851e8SHoward Hinnanttemplate <class _Tp> 5552d77851e8SHoward Hinnantshared_ptr<_Tp> 5553d77851e8SHoward Hinnantatomic_exchange(shared_ptr<_Tp>* __p, shared_ptr<_Tp> __r) 5554d77851e8SHoward Hinnant{ 5555d77851e8SHoward Hinnant __sp_mut& __m = __get_sp_mut(__p); 5556d77851e8SHoward Hinnant __m.lock(); 5557d77851e8SHoward Hinnant __p->swap(__r); 5558d77851e8SHoward Hinnant __m.unlock(); 5559d77851e8SHoward Hinnant return __r; 5560d77851e8SHoward Hinnant} 5561d77851e8SHoward Hinnant 5562d77851e8SHoward Hinnanttemplate <class _Tp> 5563d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5564d77851e8SHoward Hinnantshared_ptr<_Tp> 5565d77851e8SHoward Hinnantatomic_exchange_explicit(shared_ptr<_Tp>* __p, shared_ptr<_Tp> __r, memory_order) 5566d77851e8SHoward Hinnant{ 5567d77851e8SHoward Hinnant return atomic_exchange(__p, __r); 5568d77851e8SHoward Hinnant} 5569d77851e8SHoward Hinnant 5570d77851e8SHoward Hinnanttemplate <class _Tp> 5571d77851e8SHoward Hinnantbool 5572d77851e8SHoward Hinnantatomic_compare_exchange_strong(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v, shared_ptr<_Tp> __w) 5573d77851e8SHoward Hinnant{ 55743379baebSMarshall Clow shared_ptr<_Tp> __temp; 5575d77851e8SHoward Hinnant __sp_mut& __m = __get_sp_mut(__p); 5576d77851e8SHoward Hinnant __m.lock(); 5577d77851e8SHoward Hinnant if (__p->__owner_equivalent(*__v)) 5578d77851e8SHoward Hinnant { 55793379baebSMarshall Clow _VSTD::swap(__temp, *__p); 5580d77851e8SHoward Hinnant *__p = __w; 5581d77851e8SHoward Hinnant __m.unlock(); 5582d77851e8SHoward Hinnant return true; 5583d77851e8SHoward Hinnant } 55843379baebSMarshall Clow _VSTD::swap(__temp, *__v); 5585d77851e8SHoward Hinnant *__v = *__p; 5586d77851e8SHoward Hinnant __m.unlock(); 5587d77851e8SHoward Hinnant return false; 5588d77851e8SHoward Hinnant} 5589d77851e8SHoward Hinnant 5590d77851e8SHoward Hinnanttemplate <class _Tp> 5591d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5592d77851e8SHoward Hinnantbool 5593d77851e8SHoward Hinnantatomic_compare_exchange_weak(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v, shared_ptr<_Tp> __w) 5594d77851e8SHoward Hinnant{ 5595d77851e8SHoward Hinnant return atomic_compare_exchange_strong(__p, __v, __w); 5596d77851e8SHoward Hinnant} 5597d77851e8SHoward Hinnant 5598d77851e8SHoward Hinnanttemplate <class _Tp> 5599d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5600d77851e8SHoward Hinnantbool 5601d77851e8SHoward Hinnantatomic_compare_exchange_strong_explicit(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v, 5602d77851e8SHoward Hinnant shared_ptr<_Tp> __w, memory_order, memory_order) 5603d77851e8SHoward Hinnant{ 5604d77851e8SHoward Hinnant return atomic_compare_exchange_strong(__p, __v, __w); 5605d77851e8SHoward Hinnant} 5606d77851e8SHoward Hinnant 5607d77851e8SHoward Hinnanttemplate <class _Tp> 5608d77851e8SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5609d77851e8SHoward Hinnantbool 5610d77851e8SHoward Hinnantatomic_compare_exchange_weak_explicit(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v, 5611d77851e8SHoward Hinnant shared_ptr<_Tp> __w, memory_order, memory_order) 5612d77851e8SHoward Hinnant{ 5613d77851e8SHoward Hinnant return atomic_compare_exchange_weak(__p, __v, __w); 5614d77851e8SHoward Hinnant} 5615d77851e8SHoward Hinnant 5616df93bad1SEric Fiselier#endif // !defined(_LIBCPP_HAS_NO_ATOMIC_HEADER) 5617d77851e8SHoward Hinnant 56183e519524SHoward Hinnant//enum class 56196e41256fSHoward Hinnantstruct _LIBCPP_TYPE_VIS pointer_safety 56203e519524SHoward Hinnant{ 562154d333a6SHoward Hinnant enum __lx 56223e519524SHoward Hinnant { 56233e519524SHoward Hinnant relaxed, 56243e519524SHoward Hinnant preferred, 56253e519524SHoward Hinnant strict 56263e519524SHoward Hinnant }; 56273e519524SHoward Hinnant 562854d333a6SHoward Hinnant __lx __v_; 56293e519524SHoward Hinnant 5630848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 563154d333a6SHoward Hinnant pointer_safety(__lx __v) : __v_(__v) {} 5632848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 56333e519524SHoward Hinnant operator int() const {return __v_;} 56343e519524SHoward Hinnant}; 56353e519524SHoward Hinnant 5636f0544c20SHoward Hinnant_LIBCPP_FUNC_VIS void declare_reachable(void* __p); 5637f0544c20SHoward Hinnant_LIBCPP_FUNC_VIS void declare_no_pointers(char* __p, size_t __n); 5638f0544c20SHoward Hinnant_LIBCPP_FUNC_VIS void undeclare_no_pointers(char* __p, size_t __n); 5639f0544c20SHoward Hinnant_LIBCPP_FUNC_VIS pointer_safety get_pointer_safety() _NOEXCEPT; 5640f0544c20SHoward Hinnant_LIBCPP_FUNC_VIS void* __undeclare_reachable(void* __p); 56413e519524SHoward Hinnant 56423e519524SHoward Hinnanttemplate <class _Tp> 56433e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 56443e519524SHoward Hinnant_Tp* 56453e519524SHoward Hinnantundeclare_reachable(_Tp* __p) 56463e519524SHoward Hinnant{ 56473e519524SHoward Hinnant return static_cast<_Tp*>(__undeclare_reachable(__p)); 56483e519524SHoward Hinnant} 56493e519524SHoward Hinnant 5650f0544c20SHoward Hinnant_LIBCPP_FUNC_VIS void* align(size_t __align, size_t __sz, void*& __ptr, size_t& __space); 56513e519524SHoward Hinnant 5652e3fbe143SMarshall Clow// --- Helper for container swap -- 5653e3fbe143SMarshall Clowtemplate <typename _Alloc> 565489dd1dd2SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 5655e3fbe143SMarshall Clowvoid __swap_allocator(_Alloc & __a1, _Alloc & __a2) 5656e3fbe143SMarshall Clow#if _LIBCPP_STD_VER >= 14 5657e3fbe143SMarshall Clow _NOEXCEPT 5658e3fbe143SMarshall Clow#else 5659e3fbe143SMarshall Clow _NOEXCEPT_(__is_nothrow_swappable<_Alloc>::value) 5660e3fbe143SMarshall Clow#endif 5661e3fbe143SMarshall Clow{ 5662e3fbe143SMarshall Clow __swap_allocator(__a1, __a2, 5663e3fbe143SMarshall Clow integral_constant<bool, _VSTD::allocator_traits<_Alloc>::propagate_on_container_swap::value>()); 5664e3fbe143SMarshall Clow} 5665e3fbe143SMarshall Clow 5666e3fbe143SMarshall Clowtemplate <typename _Alloc> 5667e3fbe143SMarshall Clow_LIBCPP_INLINE_VISIBILITY 5668e3fbe143SMarshall Clowvoid __swap_allocator(_Alloc & __a1, _Alloc & __a2, true_type) 5669e3fbe143SMarshall Clow#if _LIBCPP_STD_VER >= 14 5670e3fbe143SMarshall Clow _NOEXCEPT 5671e3fbe143SMarshall Clow#else 5672e3fbe143SMarshall Clow _NOEXCEPT_(__is_nothrow_swappable<_Alloc>::value) 5673e3fbe143SMarshall Clow#endif 5674e3fbe143SMarshall Clow{ 5675e3fbe143SMarshall Clow using _VSTD::swap; 5676e3fbe143SMarshall Clow swap(__a1, __a2); 5677e3fbe143SMarshall Clow} 5678e3fbe143SMarshall Clow 5679e3fbe143SMarshall Clowtemplate <typename _Alloc> 568089dd1dd2SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY 5681e3fbe143SMarshall Clowvoid __swap_allocator(_Alloc &, _Alloc &, false_type) _NOEXCEPT {} 5682e3fbe143SMarshall Clow 56831378a5aeSMarshall Clowtemplate <typename _Alloc, typename _Traits=allocator_traits<_Alloc> > 56841378a5aeSMarshall Clowstruct __noexcept_move_assign_container : public integral_constant<bool, 56851378a5aeSMarshall Clow _Traits::propagate_on_container_move_assignment::value 56861378a5aeSMarshall Clow#if _LIBCPP_STD_VER > 14 56871378a5aeSMarshall Clow || _Traits::is_always_equal::value 56881378a5aeSMarshall Clow#else 56891378a5aeSMarshall Clow && is_nothrow_move_assignable<_Alloc>::value 56901378a5aeSMarshall Clow#endif 56911378a5aeSMarshall Clow > {}; 5692e3fbe143SMarshall Clow 5693dc3eb83dSMarshall Clow 5694dc3eb83dSMarshall Clow#ifndef _LIBCPP_HAS_NO_VARIADICS 5695dc3eb83dSMarshall Clowtemplate <class _Tp, class _Alloc> 5696dc3eb83dSMarshall Clowstruct __temp_value { 5697dc3eb83dSMarshall Clow typedef allocator_traits<_Alloc> _Traits; 5698dc3eb83dSMarshall Clow 5699dc3eb83dSMarshall Clow typename aligned_storage<sizeof(_Tp), alignof(_Tp)>::type __v; 5700dc3eb83dSMarshall Clow _Alloc &__a; 5701dc3eb83dSMarshall Clow 5702dc3eb83dSMarshall Clow _Tp *__addr() { return reinterpret_cast<_Tp *>(addressof(__v)); } 5703dc3eb83dSMarshall Clow _Tp & get() { return *__addr(); } 5704dc3eb83dSMarshall Clow 5705dc3eb83dSMarshall Clow template<class... _Args> 5706dc3eb83dSMarshall Clow __temp_value(_Alloc &__alloc, _Args&& ... __args) : __a(__alloc) 5707dc3eb83dSMarshall Clow { _Traits::construct(__a, __addr(), _VSTD::forward<_Args>(__args)...); } 5708dc3eb83dSMarshall Clow 5709dc3eb83dSMarshall Clow ~__temp_value() { _Traits::destroy(__a, __addr()); } 5710dc3eb83dSMarshall Clow }; 5711dc3eb83dSMarshall Clow#endif 5712dc3eb83dSMarshall Clow 57133e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD 57143e519524SHoward Hinnant 57153e519524SHoward Hinnant#endif // _LIBCPP_MEMORY 5716