1*4d6fc14bSjoerg// -*- C++ -*- 2*4d6fc14bSjoerg//===-------------------------- memory ------------------------------------===// 3*4d6fc14bSjoerg// 4*4d6fc14bSjoerg// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5*4d6fc14bSjoerg// See https://llvm.org/LICENSE.txt for license information. 6*4d6fc14bSjoerg// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7*4d6fc14bSjoerg// 8*4d6fc14bSjoerg//===----------------------------------------------------------------------===// 9*4d6fc14bSjoerg 10*4d6fc14bSjoerg#ifndef _LIBCPP_MEMORY 11*4d6fc14bSjoerg#define _LIBCPP_MEMORY 12*4d6fc14bSjoerg 13*4d6fc14bSjoerg/* 14*4d6fc14bSjoerg memory synopsis 15*4d6fc14bSjoerg 16*4d6fc14bSjoergnamespace std 17*4d6fc14bSjoerg{ 18*4d6fc14bSjoerg 19*4d6fc14bSjoergstruct allocator_arg_t { }; 20*4d6fc14bSjoerginline constexpr allocator_arg_t allocator_arg = allocator_arg_t(); 21*4d6fc14bSjoerg 22*4d6fc14bSjoergtemplate <class T, class Alloc> struct uses_allocator; 23*4d6fc14bSjoerg 24*4d6fc14bSjoergtemplate <class Ptr> 25*4d6fc14bSjoergstruct pointer_traits 26*4d6fc14bSjoerg{ 27*4d6fc14bSjoerg typedef Ptr pointer; 28*4d6fc14bSjoerg typedef <details> element_type; 29*4d6fc14bSjoerg typedef <details> difference_type; 30*4d6fc14bSjoerg 31*4d6fc14bSjoerg template <class U> using rebind = <details>; 32*4d6fc14bSjoerg 33*4d6fc14bSjoerg static pointer pointer_to(<details>); 34*4d6fc14bSjoerg}; 35*4d6fc14bSjoerg 36*4d6fc14bSjoergtemplate <class T> 37*4d6fc14bSjoergstruct pointer_traits<T*> 38*4d6fc14bSjoerg{ 39*4d6fc14bSjoerg typedef T* pointer; 40*4d6fc14bSjoerg typedef T element_type; 41*4d6fc14bSjoerg typedef ptrdiff_t difference_type; 42*4d6fc14bSjoerg 43*4d6fc14bSjoerg template <class U> using rebind = U*; 44*4d6fc14bSjoerg 45*4d6fc14bSjoerg static pointer pointer_to(<details>) noexcept; // constexpr in C++20 46*4d6fc14bSjoerg}; 47*4d6fc14bSjoerg 48*4d6fc14bSjoergtemplate <class T> constexpr T* to_address(T* p) noexcept; // C++20 49*4d6fc14bSjoergtemplate <class Ptr> constexpr auto to_address(const Ptr& p) noexcept; // C++20 50*4d6fc14bSjoerg 51*4d6fc14bSjoergtemplate <class Alloc> 52*4d6fc14bSjoergstruct allocator_traits 53*4d6fc14bSjoerg{ 54*4d6fc14bSjoerg typedef Alloc allocator_type; 55*4d6fc14bSjoerg typedef typename allocator_type::value_type 56*4d6fc14bSjoerg value_type; 57*4d6fc14bSjoerg 58*4d6fc14bSjoerg typedef Alloc::pointer | value_type* pointer; 59*4d6fc14bSjoerg typedef Alloc::const_pointer 60*4d6fc14bSjoerg | pointer_traits<pointer>::rebind<const value_type> 61*4d6fc14bSjoerg const_pointer; 62*4d6fc14bSjoerg typedef Alloc::void_pointer 63*4d6fc14bSjoerg | pointer_traits<pointer>::rebind<void> 64*4d6fc14bSjoerg void_pointer; 65*4d6fc14bSjoerg typedef Alloc::const_void_pointer 66*4d6fc14bSjoerg | pointer_traits<pointer>::rebind<const void> 67*4d6fc14bSjoerg const_void_pointer; 68*4d6fc14bSjoerg typedef Alloc::difference_type 69*4d6fc14bSjoerg | pointer_traits<pointer>::difference_type 70*4d6fc14bSjoerg difference_type; 71*4d6fc14bSjoerg typedef Alloc::size_type 72*4d6fc14bSjoerg | make_unsigned<difference_type>::type 73*4d6fc14bSjoerg size_type; 74*4d6fc14bSjoerg typedef Alloc::propagate_on_container_copy_assignment 75*4d6fc14bSjoerg | false_type propagate_on_container_copy_assignment; 76*4d6fc14bSjoerg typedef Alloc::propagate_on_container_move_assignment 77*4d6fc14bSjoerg | false_type propagate_on_container_move_assignment; 78*4d6fc14bSjoerg typedef Alloc::propagate_on_container_swap 79*4d6fc14bSjoerg | false_type propagate_on_container_swap; 80*4d6fc14bSjoerg typedef Alloc::is_always_equal 81*4d6fc14bSjoerg | is_empty is_always_equal; 82*4d6fc14bSjoerg 83*4d6fc14bSjoerg template <class T> using rebind_alloc = Alloc::rebind<T>::other | Alloc<T, Args...>; 84*4d6fc14bSjoerg template <class T> using rebind_traits = allocator_traits<rebind_alloc<T>>; 85*4d6fc14bSjoerg 86*4d6fc14bSjoerg static pointer allocate(allocator_type& a, size_type n); // constexpr and [[nodiscard]] in C++20 87*4d6fc14bSjoerg static pointer allocate(allocator_type& a, size_type n, const_void_pointer hint); // constexpr and [[nodiscard]] in C++20 88*4d6fc14bSjoerg 89*4d6fc14bSjoerg static void deallocate(allocator_type& a, pointer p, size_type n) noexcept; // constexpr in C++20 90*4d6fc14bSjoerg 91*4d6fc14bSjoerg template <class T, class... Args> 92*4d6fc14bSjoerg static void construct(allocator_type& a, T* p, Args&&... args); // constexpr in C++20 93*4d6fc14bSjoerg 94*4d6fc14bSjoerg template <class T> 95*4d6fc14bSjoerg static void destroy(allocator_type& a, T* p); // constexpr in C++20 96*4d6fc14bSjoerg 97*4d6fc14bSjoerg static size_type max_size(const allocator_type& a); // noexcept in C++14, constexpr in C++20 98*4d6fc14bSjoerg static allocator_type select_on_container_copy_construction(const allocator_type& a); // constexpr in C++20 99*4d6fc14bSjoerg}; 100*4d6fc14bSjoerg 101*4d6fc14bSjoergtemplate <> 102*4d6fc14bSjoergclass allocator<void> // deprecated in C++17, removed in C++20 103*4d6fc14bSjoerg{ 104*4d6fc14bSjoergpublic: 105*4d6fc14bSjoerg typedef void* pointer; 106*4d6fc14bSjoerg typedef const void* const_pointer; 107*4d6fc14bSjoerg typedef void value_type; 108*4d6fc14bSjoerg 109*4d6fc14bSjoerg template <class _Up> struct rebind {typedef allocator<_Up> other;}; 110*4d6fc14bSjoerg}; 111*4d6fc14bSjoerg 112*4d6fc14bSjoergtemplate <class T> 113*4d6fc14bSjoergclass allocator 114*4d6fc14bSjoerg{ 115*4d6fc14bSjoergpublic: 116*4d6fc14bSjoerg typedef size_t size_type; 117*4d6fc14bSjoerg typedef ptrdiff_t difference_type; 118*4d6fc14bSjoerg typedef T* pointer; // deprecated in C++17, removed in C++20 119*4d6fc14bSjoerg typedef const T* const_pointer; // deprecated in C++17, removed in C++20 120*4d6fc14bSjoerg typedef typename add_lvalue_reference<T>::type 121*4d6fc14bSjoerg reference; // deprecated in C++17, removed in C++20 122*4d6fc14bSjoerg typedef typename add_lvalue_reference<const T>::type 123*4d6fc14bSjoerg const_reference; // deprecated in C++17, removed in C++20 124*4d6fc14bSjoerg 125*4d6fc14bSjoerg typedef T value_type; 126*4d6fc14bSjoerg 127*4d6fc14bSjoerg template <class U> struct rebind {typedef allocator<U> other;}; // deprecated in C++17, removed in C++20 128*4d6fc14bSjoerg 129*4d6fc14bSjoerg typedef true_type propagate_on_container_move_assignment; 130*4d6fc14bSjoerg typedef true_type is_always_equal; 131*4d6fc14bSjoerg 132*4d6fc14bSjoerg constexpr allocator() noexcept; // constexpr in C++20 133*4d6fc14bSjoerg constexpr allocator(const allocator&) noexcept; // constexpr in C++20 134*4d6fc14bSjoerg template <class U> 135*4d6fc14bSjoerg constexpr allocator(const allocator<U>&) noexcept; // constexpr in C++20 136*4d6fc14bSjoerg ~allocator(); // constexpr in C++20 137*4d6fc14bSjoerg pointer address(reference x) const noexcept; // deprecated in C++17, removed in C++20 138*4d6fc14bSjoerg const_pointer address(const_reference x) const noexcept; // deprecated in C++17, removed in C++20 139*4d6fc14bSjoerg T* allocate(size_t n, const void* hint); // deprecated in C++17, removed in C++20 140*4d6fc14bSjoerg T* allocate(size_t n); // constexpr in C++20 141*4d6fc14bSjoerg void deallocate(T* p, size_t n) noexcept; // constexpr in C++20 142*4d6fc14bSjoerg size_type max_size() const noexcept; // deprecated in C++17, removed in C++20 143*4d6fc14bSjoerg template<class U, class... Args> 144*4d6fc14bSjoerg void construct(U* p, Args&&... args); // deprecated in C++17, removed in C++20 145*4d6fc14bSjoerg template <class U> 146*4d6fc14bSjoerg void destroy(U* p); // deprecated in C++17, removed in C++20 147*4d6fc14bSjoerg}; 148*4d6fc14bSjoerg 149*4d6fc14bSjoergtemplate <class T, class U> 150*4d6fc14bSjoergbool operator==(const allocator<T>&, const allocator<U>&) noexcept; // constexpr in C++20 151*4d6fc14bSjoerg 152*4d6fc14bSjoergtemplate <class T, class U> 153*4d6fc14bSjoergbool operator!=(const allocator<T>&, const allocator<U>&) noexcept; // constexpr in C++20 154*4d6fc14bSjoerg 155*4d6fc14bSjoergtemplate <class OutputIterator, class T> 156*4d6fc14bSjoergclass raw_storage_iterator 157*4d6fc14bSjoerg : public iterator<output_iterator_tag, 158*4d6fc14bSjoerg T, // purposefully not C++03 159*4d6fc14bSjoerg ptrdiff_t, // purposefully not C++03 160*4d6fc14bSjoerg T*, // purposefully not C++03 161*4d6fc14bSjoerg raw_storage_iterator&> // purposefully not C++03 162*4d6fc14bSjoerg{ 163*4d6fc14bSjoergpublic: 164*4d6fc14bSjoerg explicit raw_storage_iterator(OutputIterator x); 165*4d6fc14bSjoerg raw_storage_iterator& operator*(); 166*4d6fc14bSjoerg raw_storage_iterator& operator=(const T& element); 167*4d6fc14bSjoerg raw_storage_iterator& operator++(); 168*4d6fc14bSjoerg raw_storage_iterator operator++(int); 169*4d6fc14bSjoerg}; 170*4d6fc14bSjoerg 171*4d6fc14bSjoergtemplate <class T> pair<T*,ptrdiff_t> get_temporary_buffer(ptrdiff_t n) noexcept; 172*4d6fc14bSjoergtemplate <class T> void return_temporary_buffer(T* p) noexcept; 173*4d6fc14bSjoerg 174*4d6fc14bSjoergtemplate <class T> T* addressof(T& r) noexcept; 175*4d6fc14bSjoergtemplate <class T> T* addressof(const T&& r) noexcept = delete; 176*4d6fc14bSjoerg 177*4d6fc14bSjoergtemplate <class InputIterator, class ForwardIterator> 178*4d6fc14bSjoergForwardIterator 179*4d6fc14bSjoerguninitialized_copy(InputIterator first, InputIterator last, ForwardIterator result); 180*4d6fc14bSjoerg 181*4d6fc14bSjoergtemplate <class InputIterator, class Size, class ForwardIterator> 182*4d6fc14bSjoergForwardIterator 183*4d6fc14bSjoerguninitialized_copy_n(InputIterator first, Size n, ForwardIterator result); 184*4d6fc14bSjoerg 185*4d6fc14bSjoergtemplate <class ForwardIterator, class T> 186*4d6fc14bSjoergvoid uninitialized_fill(ForwardIterator first, ForwardIterator last, const T& x); 187*4d6fc14bSjoerg 188*4d6fc14bSjoergtemplate <class ForwardIterator, class Size, class T> 189*4d6fc14bSjoergForwardIterator 190*4d6fc14bSjoerguninitialized_fill_n(ForwardIterator first, Size n, const T& x); 191*4d6fc14bSjoerg 192*4d6fc14bSjoergtemplate <class T, class ...Args> 193*4d6fc14bSjoergconstexpr T* construct_at(T* location, Args&& ...args); // since C++20 194*4d6fc14bSjoerg 195*4d6fc14bSjoergtemplate <class T> 196*4d6fc14bSjoergvoid destroy_at(T* location); // constexpr in C++20 197*4d6fc14bSjoerg 198*4d6fc14bSjoergtemplate <class ForwardIterator> 199*4d6fc14bSjoergvoid destroy(ForwardIterator first, ForwardIterator last); // constexpr in C++20 200*4d6fc14bSjoerg 201*4d6fc14bSjoergtemplate <class ForwardIterator, class Size> 202*4d6fc14bSjoergForwardIterator destroy_n(ForwardIterator first, Size n); // constexpr in C++20 203*4d6fc14bSjoerg 204*4d6fc14bSjoergtemplate <class InputIterator, class ForwardIterator> 205*4d6fc14bSjoerg ForwardIterator uninitialized_move(InputIterator first, InputIterator last, ForwardIterator result); 206*4d6fc14bSjoerg 207*4d6fc14bSjoergtemplate <class InputIterator, class Size, class ForwardIterator> 208*4d6fc14bSjoerg pair<InputIterator,ForwardIterator> uninitialized_move_n(InputIterator first, Size n, ForwardIterator result); 209*4d6fc14bSjoerg 210*4d6fc14bSjoergtemplate <class ForwardIterator> 211*4d6fc14bSjoerg void uninitialized_value_construct(ForwardIterator first, ForwardIterator last); 212*4d6fc14bSjoerg 213*4d6fc14bSjoergtemplate <class ForwardIterator, class Size> 214*4d6fc14bSjoerg ForwardIterator uninitialized_value_construct_n(ForwardIterator first, Size n); 215*4d6fc14bSjoerg 216*4d6fc14bSjoergtemplate <class ForwardIterator> 217*4d6fc14bSjoerg void uninitialized_default_construct(ForwardIterator first, ForwardIterator last); 218*4d6fc14bSjoerg 219*4d6fc14bSjoergtemplate <class ForwardIterator, class Size> 220*4d6fc14bSjoerg ForwardIterator uninitialized_default_construct_n(ForwardIterator first, Size n); 221*4d6fc14bSjoerg 222*4d6fc14bSjoergtemplate <class Y> struct auto_ptr_ref {}; // deprecated in C++11, removed in C++17 223*4d6fc14bSjoerg 224*4d6fc14bSjoergtemplate<class X> 225*4d6fc14bSjoergclass auto_ptr // deprecated in C++11, removed in C++17 226*4d6fc14bSjoerg{ 227*4d6fc14bSjoergpublic: 228*4d6fc14bSjoerg typedef X element_type; 229*4d6fc14bSjoerg 230*4d6fc14bSjoerg explicit auto_ptr(X* p =0) throw(); 231*4d6fc14bSjoerg auto_ptr(auto_ptr&) throw(); 232*4d6fc14bSjoerg template<class Y> auto_ptr(auto_ptr<Y>&) throw(); 233*4d6fc14bSjoerg auto_ptr& operator=(auto_ptr&) throw(); 234*4d6fc14bSjoerg template<class Y> auto_ptr& operator=(auto_ptr<Y>&) throw(); 235*4d6fc14bSjoerg auto_ptr& operator=(auto_ptr_ref<X> r) throw(); 236*4d6fc14bSjoerg ~auto_ptr() throw(); 237*4d6fc14bSjoerg 238*4d6fc14bSjoerg typename add_lvalue_reference<X>::type operator*() const throw(); 239*4d6fc14bSjoerg X* operator->() const throw(); 240*4d6fc14bSjoerg X* get() const throw(); 241*4d6fc14bSjoerg X* release() throw(); 242*4d6fc14bSjoerg void reset(X* p =0) throw(); 243*4d6fc14bSjoerg 244*4d6fc14bSjoerg auto_ptr(auto_ptr_ref<X>) throw(); 245*4d6fc14bSjoerg template<class Y> operator auto_ptr_ref<Y>() throw(); 246*4d6fc14bSjoerg template<class Y> operator auto_ptr<Y>() throw(); 247*4d6fc14bSjoerg}; 248*4d6fc14bSjoerg 249*4d6fc14bSjoergtemplate <class T> 250*4d6fc14bSjoergstruct default_delete 251*4d6fc14bSjoerg{ 252*4d6fc14bSjoerg constexpr default_delete() noexcept = default; 253*4d6fc14bSjoerg template <class U> default_delete(const default_delete<U>&) noexcept; 254*4d6fc14bSjoerg 255*4d6fc14bSjoerg void operator()(T*) const noexcept; 256*4d6fc14bSjoerg}; 257*4d6fc14bSjoerg 258*4d6fc14bSjoergtemplate <class T> 259*4d6fc14bSjoergstruct default_delete<T[]> 260*4d6fc14bSjoerg{ 261*4d6fc14bSjoerg constexpr default_delete() noexcept = default; 262*4d6fc14bSjoerg void operator()(T*) const noexcept; 263*4d6fc14bSjoerg template <class U> void operator()(U*) const = delete; 264*4d6fc14bSjoerg}; 265*4d6fc14bSjoerg 266*4d6fc14bSjoergtemplate <class T, class D = default_delete<T>> 267*4d6fc14bSjoergclass unique_ptr 268*4d6fc14bSjoerg{ 269*4d6fc14bSjoergpublic: 270*4d6fc14bSjoerg typedef see below pointer; 271*4d6fc14bSjoerg typedef T element_type; 272*4d6fc14bSjoerg typedef D deleter_type; 273*4d6fc14bSjoerg 274*4d6fc14bSjoerg // constructors 275*4d6fc14bSjoerg constexpr unique_ptr() noexcept; 276*4d6fc14bSjoerg explicit unique_ptr(pointer p) noexcept; 277*4d6fc14bSjoerg unique_ptr(pointer p, see below d1) noexcept; 278*4d6fc14bSjoerg unique_ptr(pointer p, see below d2) noexcept; 279*4d6fc14bSjoerg unique_ptr(unique_ptr&& u) noexcept; 280*4d6fc14bSjoerg unique_ptr(nullptr_t) noexcept : unique_ptr() { } 281*4d6fc14bSjoerg template <class U, class E> 282*4d6fc14bSjoerg unique_ptr(unique_ptr<U, E>&& u) noexcept; 283*4d6fc14bSjoerg template <class U> 284*4d6fc14bSjoerg unique_ptr(auto_ptr<U>&& u) noexcept; // removed in C++17 285*4d6fc14bSjoerg 286*4d6fc14bSjoerg // destructor 287*4d6fc14bSjoerg ~unique_ptr(); 288*4d6fc14bSjoerg 289*4d6fc14bSjoerg // assignment 290*4d6fc14bSjoerg unique_ptr& operator=(unique_ptr&& u) noexcept; 291*4d6fc14bSjoerg template <class U, class E> unique_ptr& operator=(unique_ptr<U, E>&& u) noexcept; 292*4d6fc14bSjoerg unique_ptr& operator=(nullptr_t) noexcept; 293*4d6fc14bSjoerg 294*4d6fc14bSjoerg // observers 295*4d6fc14bSjoerg typename add_lvalue_reference<T>::type operator*() const; 296*4d6fc14bSjoerg pointer operator->() const noexcept; 297*4d6fc14bSjoerg pointer get() const noexcept; 298*4d6fc14bSjoerg deleter_type& get_deleter() noexcept; 299*4d6fc14bSjoerg const deleter_type& get_deleter() const noexcept; 300*4d6fc14bSjoerg explicit operator bool() const noexcept; 301*4d6fc14bSjoerg 302*4d6fc14bSjoerg // modifiers 303*4d6fc14bSjoerg pointer release() noexcept; 304*4d6fc14bSjoerg void reset(pointer p = pointer()) noexcept; 305*4d6fc14bSjoerg void swap(unique_ptr& u) noexcept; 306*4d6fc14bSjoerg}; 307*4d6fc14bSjoerg 308*4d6fc14bSjoergtemplate <class T, class D> 309*4d6fc14bSjoergclass unique_ptr<T[], D> 310*4d6fc14bSjoerg{ 311*4d6fc14bSjoergpublic: 312*4d6fc14bSjoerg typedef implementation-defined pointer; 313*4d6fc14bSjoerg typedef T element_type; 314*4d6fc14bSjoerg typedef D deleter_type; 315*4d6fc14bSjoerg 316*4d6fc14bSjoerg // constructors 317*4d6fc14bSjoerg constexpr unique_ptr() noexcept; 318*4d6fc14bSjoerg explicit unique_ptr(pointer p) noexcept; 319*4d6fc14bSjoerg unique_ptr(pointer p, see below d) noexcept; 320*4d6fc14bSjoerg unique_ptr(pointer p, see below d) noexcept; 321*4d6fc14bSjoerg unique_ptr(unique_ptr&& u) noexcept; 322*4d6fc14bSjoerg unique_ptr(nullptr_t) noexcept : unique_ptr() { } 323*4d6fc14bSjoerg 324*4d6fc14bSjoerg // destructor 325*4d6fc14bSjoerg ~unique_ptr(); 326*4d6fc14bSjoerg 327*4d6fc14bSjoerg // assignment 328*4d6fc14bSjoerg unique_ptr& operator=(unique_ptr&& u) noexcept; 329*4d6fc14bSjoerg unique_ptr& operator=(nullptr_t) noexcept; 330*4d6fc14bSjoerg 331*4d6fc14bSjoerg // observers 332*4d6fc14bSjoerg T& operator[](size_t i) const; 333*4d6fc14bSjoerg pointer get() const noexcept; 334*4d6fc14bSjoerg deleter_type& get_deleter() noexcept; 335*4d6fc14bSjoerg const deleter_type& get_deleter() const noexcept; 336*4d6fc14bSjoerg explicit operator bool() const noexcept; 337*4d6fc14bSjoerg 338*4d6fc14bSjoerg // modifiers 339*4d6fc14bSjoerg pointer release() noexcept; 340*4d6fc14bSjoerg void reset(pointer p = pointer()) noexcept; 341*4d6fc14bSjoerg void reset(nullptr_t) noexcept; 342*4d6fc14bSjoerg template <class U> void reset(U) = delete; 343*4d6fc14bSjoerg void swap(unique_ptr& u) noexcept; 344*4d6fc14bSjoerg}; 345*4d6fc14bSjoerg 346*4d6fc14bSjoergtemplate <class T, class D> 347*4d6fc14bSjoerg void swap(unique_ptr<T, D>& x, unique_ptr<T, D>& y) noexcept; 348*4d6fc14bSjoerg 349*4d6fc14bSjoergtemplate <class T1, class D1, class T2, class D2> 350*4d6fc14bSjoerg bool operator==(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 351*4d6fc14bSjoergtemplate <class T1, class D1, class T2, class D2> 352*4d6fc14bSjoerg bool operator!=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 353*4d6fc14bSjoergtemplate <class T1, class D1, class T2, class D2> 354*4d6fc14bSjoerg bool operator<(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 355*4d6fc14bSjoergtemplate <class T1, class D1, class T2, class D2> 356*4d6fc14bSjoerg bool operator<=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 357*4d6fc14bSjoergtemplate <class T1, class D1, class T2, class D2> 358*4d6fc14bSjoerg bool operator>(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 359*4d6fc14bSjoergtemplate <class T1, class D1, class T2, class D2> 360*4d6fc14bSjoerg bool operator>=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); 361*4d6fc14bSjoerg 362*4d6fc14bSjoergtemplate <class T, class D> 363*4d6fc14bSjoerg bool operator==(const unique_ptr<T, D>& x, nullptr_t) noexcept; 364*4d6fc14bSjoergtemplate <class T, class D> 365*4d6fc14bSjoerg bool operator==(nullptr_t, const unique_ptr<T, D>& y) noexcept; 366*4d6fc14bSjoergtemplate <class T, class D> 367*4d6fc14bSjoerg bool operator!=(const unique_ptr<T, D>& x, nullptr_t) noexcept; 368*4d6fc14bSjoergtemplate <class T, class D> 369*4d6fc14bSjoerg bool operator!=(nullptr_t, const unique_ptr<T, D>& y) noexcept; 370*4d6fc14bSjoerg 371*4d6fc14bSjoergtemplate <class T, class D> 372*4d6fc14bSjoerg bool operator<(const unique_ptr<T, D>& x, nullptr_t); 373*4d6fc14bSjoergtemplate <class T, class D> 374*4d6fc14bSjoerg bool operator<(nullptr_t, const unique_ptr<T, D>& y); 375*4d6fc14bSjoergtemplate <class T, class D> 376*4d6fc14bSjoerg bool operator<=(const unique_ptr<T, D>& x, nullptr_t); 377*4d6fc14bSjoergtemplate <class T, class D> 378*4d6fc14bSjoerg bool operator<=(nullptr_t, const unique_ptr<T, D>& y); 379*4d6fc14bSjoergtemplate <class T, class D> 380*4d6fc14bSjoerg bool operator>(const unique_ptr<T, D>& x, nullptr_t); 381*4d6fc14bSjoergtemplate <class T, class D> 382*4d6fc14bSjoerg bool operator>(nullptr_t, const unique_ptr<T, D>& y); 383*4d6fc14bSjoergtemplate <class T, class D> 384*4d6fc14bSjoerg bool operator>=(const unique_ptr<T, D>& x, nullptr_t); 385*4d6fc14bSjoergtemplate <class T, class D> 386*4d6fc14bSjoerg bool operator>=(nullptr_t, const unique_ptr<T, D>& y); 387*4d6fc14bSjoerg 388*4d6fc14bSjoergclass bad_weak_ptr 389*4d6fc14bSjoerg : public std::exception 390*4d6fc14bSjoerg{ 391*4d6fc14bSjoerg bad_weak_ptr() noexcept; 392*4d6fc14bSjoerg}; 393*4d6fc14bSjoerg 394*4d6fc14bSjoergtemplate<class T, class... Args> unique_ptr<T> make_unique(Args&&... args); // C++14 395*4d6fc14bSjoergtemplate<class T> unique_ptr<T> make_unique(size_t n); // C++14 396*4d6fc14bSjoergtemplate<class T, class... Args> unspecified make_unique(Args&&...) = delete; // C++14, T == U[N] 397*4d6fc14bSjoerg 398*4d6fc14bSjoergtemplate<class E, class T, class Y, class D> 399*4d6fc14bSjoerg basic_ostream<E, T>& operator<< (basic_ostream<E, T>& os, unique_ptr<Y, D> const& p); 400*4d6fc14bSjoerg 401*4d6fc14bSjoergtemplate<class T> 402*4d6fc14bSjoergclass shared_ptr 403*4d6fc14bSjoerg{ 404*4d6fc14bSjoergpublic: 405*4d6fc14bSjoerg typedef T element_type; 406*4d6fc14bSjoerg typedef weak_ptr<T> weak_type; // C++17 407*4d6fc14bSjoerg 408*4d6fc14bSjoerg // constructors: 409*4d6fc14bSjoerg constexpr shared_ptr() noexcept; 410*4d6fc14bSjoerg template<class Y> explicit shared_ptr(Y* p); 411*4d6fc14bSjoerg template<class Y, class D> shared_ptr(Y* p, D d); 412*4d6fc14bSjoerg template<class Y, class D, class A> shared_ptr(Y* p, D d, A a); 413*4d6fc14bSjoerg template <class D> shared_ptr(nullptr_t p, D d); 414*4d6fc14bSjoerg template <class D, class A> shared_ptr(nullptr_t p, D d, A a); 415*4d6fc14bSjoerg template<class Y> shared_ptr(const shared_ptr<Y>& r, T *p) noexcept; 416*4d6fc14bSjoerg shared_ptr(const shared_ptr& r) noexcept; 417*4d6fc14bSjoerg template<class Y> shared_ptr(const shared_ptr<Y>& r) noexcept; 418*4d6fc14bSjoerg shared_ptr(shared_ptr&& r) noexcept; 419*4d6fc14bSjoerg template<class Y> shared_ptr(shared_ptr<Y>&& r) noexcept; 420*4d6fc14bSjoerg template<class Y> explicit shared_ptr(const weak_ptr<Y>& r); 421*4d6fc14bSjoerg template<class Y> shared_ptr(auto_ptr<Y>&& r); // removed in C++17 422*4d6fc14bSjoerg template <class Y, class D> shared_ptr(unique_ptr<Y, D>&& r); 423*4d6fc14bSjoerg shared_ptr(nullptr_t) : shared_ptr() { } 424*4d6fc14bSjoerg 425*4d6fc14bSjoerg // destructor: 426*4d6fc14bSjoerg ~shared_ptr(); 427*4d6fc14bSjoerg 428*4d6fc14bSjoerg // assignment: 429*4d6fc14bSjoerg shared_ptr& operator=(const shared_ptr& r) noexcept; 430*4d6fc14bSjoerg template<class Y> shared_ptr& operator=(const shared_ptr<Y>& r) noexcept; 431*4d6fc14bSjoerg shared_ptr& operator=(shared_ptr&& r) noexcept; 432*4d6fc14bSjoerg template<class Y> shared_ptr& operator=(shared_ptr<Y>&& r); 433*4d6fc14bSjoerg template<class Y> shared_ptr& operator=(auto_ptr<Y>&& r); // removed in C++17 434*4d6fc14bSjoerg template <class Y, class D> shared_ptr& operator=(unique_ptr<Y, D>&& r); 435*4d6fc14bSjoerg 436*4d6fc14bSjoerg // modifiers: 437*4d6fc14bSjoerg void swap(shared_ptr& r) noexcept; 438*4d6fc14bSjoerg void reset() noexcept; 439*4d6fc14bSjoerg template<class Y> void reset(Y* p); 440*4d6fc14bSjoerg template<class Y, class D> void reset(Y* p, D d); 441*4d6fc14bSjoerg template<class Y, class D, class A> void reset(Y* p, D d, A a); 442*4d6fc14bSjoerg 443*4d6fc14bSjoerg // observers: 444*4d6fc14bSjoerg T* get() const noexcept; 445*4d6fc14bSjoerg T& operator*() const noexcept; 446*4d6fc14bSjoerg T* operator->() const noexcept; 447*4d6fc14bSjoerg long use_count() const noexcept; 448*4d6fc14bSjoerg bool unique() const noexcept; 449*4d6fc14bSjoerg explicit operator bool() const noexcept; 450*4d6fc14bSjoerg template<class U> bool owner_before(shared_ptr<U> const& b) const noexcept; 451*4d6fc14bSjoerg template<class U> bool owner_before(weak_ptr<U> const& b) const noexcept; 452*4d6fc14bSjoerg}; 453*4d6fc14bSjoerg 454*4d6fc14bSjoergtemplate<class T> 455*4d6fc14bSjoergshared_ptr(weak_ptr<T>) -> shared_ptr<T>; 456*4d6fc14bSjoergtemplate<class T, class D> 457*4d6fc14bSjoergshared_ptr(unique_ptr<T, D>) -> shared_ptr<T>; 458*4d6fc14bSjoerg 459*4d6fc14bSjoerg// shared_ptr comparisons: 460*4d6fc14bSjoergtemplate<class T, class U> 461*4d6fc14bSjoerg bool operator==(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; 462*4d6fc14bSjoergtemplate<class T, class U> 463*4d6fc14bSjoerg bool operator!=(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; 464*4d6fc14bSjoergtemplate<class T, class U> 465*4d6fc14bSjoerg bool operator<(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; 466*4d6fc14bSjoergtemplate<class T, class U> 467*4d6fc14bSjoerg bool operator>(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; 468*4d6fc14bSjoergtemplate<class T, class U> 469*4d6fc14bSjoerg bool operator<=(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; 470*4d6fc14bSjoergtemplate<class T, class U> 471*4d6fc14bSjoerg bool operator>=(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; 472*4d6fc14bSjoerg 473*4d6fc14bSjoergtemplate <class T> 474*4d6fc14bSjoerg bool operator==(const shared_ptr<T>& x, nullptr_t) noexcept; 475*4d6fc14bSjoergtemplate <class T> 476*4d6fc14bSjoerg bool operator==(nullptr_t, const shared_ptr<T>& y) noexcept; 477*4d6fc14bSjoergtemplate <class T> 478*4d6fc14bSjoerg bool operator!=(const shared_ptr<T>& x, nullptr_t) noexcept; 479*4d6fc14bSjoergtemplate <class T> 480*4d6fc14bSjoerg bool operator!=(nullptr_t, const shared_ptr<T>& y) noexcept; 481*4d6fc14bSjoergtemplate <class T> 482*4d6fc14bSjoerg bool operator<(const shared_ptr<T>& x, nullptr_t) noexcept; 483*4d6fc14bSjoergtemplate <class T> 484*4d6fc14bSjoergbool operator<(nullptr_t, const shared_ptr<T>& y) noexcept; 485*4d6fc14bSjoergtemplate <class T> 486*4d6fc14bSjoerg bool operator<=(const shared_ptr<T>& x, nullptr_t) noexcept; 487*4d6fc14bSjoergtemplate <class T> 488*4d6fc14bSjoerg bool operator<=(nullptr_t, const shared_ptr<T>& y) noexcept; 489*4d6fc14bSjoergtemplate <class T> 490*4d6fc14bSjoerg bool operator>(const shared_ptr<T>& x, nullptr_t) noexcept; 491*4d6fc14bSjoergtemplate <class T> 492*4d6fc14bSjoerg bool operator>(nullptr_t, const shared_ptr<T>& y) noexcept; 493*4d6fc14bSjoergtemplate <class T> 494*4d6fc14bSjoerg bool operator>=(const shared_ptr<T>& x, nullptr_t) noexcept; 495*4d6fc14bSjoergtemplate <class T> 496*4d6fc14bSjoerg bool operator>=(nullptr_t, const shared_ptr<T>& y) noexcept; 497*4d6fc14bSjoerg 498*4d6fc14bSjoerg// shared_ptr specialized algorithms: 499*4d6fc14bSjoergtemplate<class T> void swap(shared_ptr<T>& a, shared_ptr<T>& b) noexcept; 500*4d6fc14bSjoerg 501*4d6fc14bSjoerg// shared_ptr casts: 502*4d6fc14bSjoergtemplate<class T, class U> 503*4d6fc14bSjoerg shared_ptr<T> static_pointer_cast(shared_ptr<U> const& r) noexcept; 504*4d6fc14bSjoergtemplate<class T, class U> 505*4d6fc14bSjoerg shared_ptr<T> dynamic_pointer_cast(shared_ptr<U> const& r) noexcept; 506*4d6fc14bSjoergtemplate<class T, class U> 507*4d6fc14bSjoerg shared_ptr<T> const_pointer_cast(shared_ptr<U> const& r) noexcept; 508*4d6fc14bSjoerg 509*4d6fc14bSjoerg// shared_ptr I/O: 510*4d6fc14bSjoergtemplate<class E, class T, class Y> 511*4d6fc14bSjoerg basic_ostream<E, T>& operator<< (basic_ostream<E, T>& os, shared_ptr<Y> const& p); 512*4d6fc14bSjoerg 513*4d6fc14bSjoerg// shared_ptr get_deleter: 514*4d6fc14bSjoergtemplate<class D, class T> D* get_deleter(shared_ptr<T> const& p) noexcept; 515*4d6fc14bSjoerg 516*4d6fc14bSjoergtemplate<class T, class... Args> 517*4d6fc14bSjoerg shared_ptr<T> make_shared(Args&&... args); 518*4d6fc14bSjoergtemplate<class T, class A, class... Args> 519*4d6fc14bSjoerg shared_ptr<T> allocate_shared(const A& a, Args&&... args); 520*4d6fc14bSjoerg 521*4d6fc14bSjoergtemplate<class T> 522*4d6fc14bSjoergclass weak_ptr 523*4d6fc14bSjoerg{ 524*4d6fc14bSjoergpublic: 525*4d6fc14bSjoerg typedef T element_type; 526*4d6fc14bSjoerg 527*4d6fc14bSjoerg // constructors 528*4d6fc14bSjoerg constexpr weak_ptr() noexcept; 529*4d6fc14bSjoerg template<class Y> weak_ptr(shared_ptr<Y> const& r) noexcept; 530*4d6fc14bSjoerg weak_ptr(weak_ptr const& r) noexcept; 531*4d6fc14bSjoerg template<class Y> weak_ptr(weak_ptr<Y> const& r) noexcept; 532*4d6fc14bSjoerg weak_ptr(weak_ptr&& r) noexcept; // C++14 533*4d6fc14bSjoerg template<class Y> weak_ptr(weak_ptr<Y>&& r) noexcept; // C++14 534*4d6fc14bSjoerg 535*4d6fc14bSjoerg // destructor 536*4d6fc14bSjoerg ~weak_ptr(); 537*4d6fc14bSjoerg 538*4d6fc14bSjoerg // assignment 539*4d6fc14bSjoerg weak_ptr& operator=(weak_ptr const& r) noexcept; 540*4d6fc14bSjoerg template<class Y> weak_ptr& operator=(weak_ptr<Y> const& r) noexcept; 541*4d6fc14bSjoerg template<class Y> weak_ptr& operator=(shared_ptr<Y> const& r) noexcept; 542*4d6fc14bSjoerg weak_ptr& operator=(weak_ptr&& r) noexcept; // C++14 543*4d6fc14bSjoerg template<class Y> weak_ptr& operator=(weak_ptr<Y>&& r) noexcept; // C++14 544*4d6fc14bSjoerg 545*4d6fc14bSjoerg // modifiers 546*4d6fc14bSjoerg void swap(weak_ptr& r) noexcept; 547*4d6fc14bSjoerg void reset() noexcept; 548*4d6fc14bSjoerg 549*4d6fc14bSjoerg // observers 550*4d6fc14bSjoerg long use_count() const noexcept; 551*4d6fc14bSjoerg bool expired() const noexcept; 552*4d6fc14bSjoerg shared_ptr<T> lock() const noexcept; 553*4d6fc14bSjoerg template<class U> bool owner_before(shared_ptr<U> const& b) const noexcept; 554*4d6fc14bSjoerg template<class U> bool owner_before(weak_ptr<U> const& b) const noexcept; 555*4d6fc14bSjoerg}; 556*4d6fc14bSjoerg 557*4d6fc14bSjoergtemplate<class T> 558*4d6fc14bSjoergweak_ptr(shared_ptr<T>) -> weak_ptr<T>; 559*4d6fc14bSjoerg 560*4d6fc14bSjoerg// weak_ptr specialized algorithms: 561*4d6fc14bSjoergtemplate<class T> void swap(weak_ptr<T>& a, weak_ptr<T>& b) noexcept; 562*4d6fc14bSjoerg 563*4d6fc14bSjoerg// class owner_less: 564*4d6fc14bSjoergtemplate<class T> struct owner_less; 565*4d6fc14bSjoerg 566*4d6fc14bSjoergtemplate<class T> 567*4d6fc14bSjoergstruct owner_less<shared_ptr<T> > 568*4d6fc14bSjoerg : binary_function<shared_ptr<T>, shared_ptr<T>, bool> 569*4d6fc14bSjoerg{ 570*4d6fc14bSjoerg typedef bool result_type; 571*4d6fc14bSjoerg bool operator()(shared_ptr<T> const&, shared_ptr<T> const&) const noexcept; 572*4d6fc14bSjoerg bool operator()(shared_ptr<T> const&, weak_ptr<T> const&) const noexcept; 573*4d6fc14bSjoerg bool operator()(weak_ptr<T> const&, shared_ptr<T> const&) const noexcept; 574*4d6fc14bSjoerg}; 575*4d6fc14bSjoerg 576*4d6fc14bSjoergtemplate<class T> 577*4d6fc14bSjoergstruct owner_less<weak_ptr<T> > 578*4d6fc14bSjoerg : binary_function<weak_ptr<T>, weak_ptr<T>, bool> 579*4d6fc14bSjoerg{ 580*4d6fc14bSjoerg typedef bool result_type; 581*4d6fc14bSjoerg bool operator()(weak_ptr<T> const&, weak_ptr<T> const&) const noexcept; 582*4d6fc14bSjoerg bool operator()(shared_ptr<T> const&, weak_ptr<T> const&) const noexcept; 583*4d6fc14bSjoerg bool operator()(weak_ptr<T> const&, shared_ptr<T> const&) const noexcept; 584*4d6fc14bSjoerg}; 585*4d6fc14bSjoerg 586*4d6fc14bSjoergtemplate <> // Added in C++14 587*4d6fc14bSjoergstruct owner_less<void> 588*4d6fc14bSjoerg{ 589*4d6fc14bSjoerg template <class _Tp, class _Up> 590*4d6fc14bSjoerg bool operator()( shared_ptr<_Tp> const& __x, shared_ptr<_Up> const& __y) const noexcept; 591*4d6fc14bSjoerg template <class _Tp, class _Up> 592*4d6fc14bSjoerg bool operator()( shared_ptr<_Tp> const& __x, weak_ptr<_Up> const& __y) const noexcept; 593*4d6fc14bSjoerg template <class _Tp, class _Up> 594*4d6fc14bSjoerg bool operator()( weak_ptr<_Tp> const& __x, shared_ptr<_Up> const& __y) const noexcept; 595*4d6fc14bSjoerg template <class _Tp, class _Up> 596*4d6fc14bSjoerg bool operator()( weak_ptr<_Tp> const& __x, weak_ptr<_Up> const& __y) const noexcept; 597*4d6fc14bSjoerg 598*4d6fc14bSjoerg typedef void is_transparent; 599*4d6fc14bSjoerg}; 600*4d6fc14bSjoerg 601*4d6fc14bSjoergtemplate<class T> 602*4d6fc14bSjoergclass enable_shared_from_this 603*4d6fc14bSjoerg{ 604*4d6fc14bSjoergprotected: 605*4d6fc14bSjoerg constexpr enable_shared_from_this() noexcept; 606*4d6fc14bSjoerg enable_shared_from_this(enable_shared_from_this const&) noexcept; 607*4d6fc14bSjoerg enable_shared_from_this& operator=(enable_shared_from_this const&) noexcept; 608*4d6fc14bSjoerg ~enable_shared_from_this(); 609*4d6fc14bSjoergpublic: 610*4d6fc14bSjoerg shared_ptr<T> shared_from_this(); 611*4d6fc14bSjoerg shared_ptr<T const> shared_from_this() const; 612*4d6fc14bSjoerg}; 613*4d6fc14bSjoerg 614*4d6fc14bSjoergtemplate<class T> 615*4d6fc14bSjoerg bool atomic_is_lock_free(const shared_ptr<T>* p); 616*4d6fc14bSjoergtemplate<class T> 617*4d6fc14bSjoerg shared_ptr<T> atomic_load(const shared_ptr<T>* p); 618*4d6fc14bSjoergtemplate<class T> 619*4d6fc14bSjoerg shared_ptr<T> atomic_load_explicit(const shared_ptr<T>* p, memory_order mo); 620*4d6fc14bSjoergtemplate<class T> 621*4d6fc14bSjoerg void atomic_store(shared_ptr<T>* p, shared_ptr<T> r); 622*4d6fc14bSjoergtemplate<class T> 623*4d6fc14bSjoerg void atomic_store_explicit(shared_ptr<T>* p, shared_ptr<T> r, memory_order mo); 624*4d6fc14bSjoergtemplate<class T> 625*4d6fc14bSjoerg shared_ptr<T> atomic_exchange(shared_ptr<T>* p, shared_ptr<T> r); 626*4d6fc14bSjoergtemplate<class T> 627*4d6fc14bSjoerg shared_ptr<T> 628*4d6fc14bSjoerg atomic_exchange_explicit(shared_ptr<T>* p, shared_ptr<T> r, memory_order mo); 629*4d6fc14bSjoergtemplate<class T> 630*4d6fc14bSjoerg bool 631*4d6fc14bSjoerg atomic_compare_exchange_weak(shared_ptr<T>* p, shared_ptr<T>* v, shared_ptr<T> w); 632*4d6fc14bSjoergtemplate<class T> 633*4d6fc14bSjoerg bool 634*4d6fc14bSjoerg atomic_compare_exchange_strong( shared_ptr<T>* p, shared_ptr<T>* v, shared_ptr<T> w); 635*4d6fc14bSjoergtemplate<class T> 636*4d6fc14bSjoerg bool 637*4d6fc14bSjoerg atomic_compare_exchange_weak_explicit(shared_ptr<T>* p, shared_ptr<T>* v, 638*4d6fc14bSjoerg shared_ptr<T> w, memory_order success, 639*4d6fc14bSjoerg memory_order failure); 640*4d6fc14bSjoergtemplate<class T> 641*4d6fc14bSjoerg bool 642*4d6fc14bSjoerg atomic_compare_exchange_strong_explicit(shared_ptr<T>* p, shared_ptr<T>* v, 643*4d6fc14bSjoerg shared_ptr<T> w, memory_order success, 644*4d6fc14bSjoerg memory_order failure); 645*4d6fc14bSjoerg// Hash support 646*4d6fc14bSjoergtemplate <class T> struct hash; 647*4d6fc14bSjoergtemplate <class T, class D> struct hash<unique_ptr<T, D> >; 648*4d6fc14bSjoergtemplate <class T> struct hash<shared_ptr<T> >; 649*4d6fc14bSjoerg 650*4d6fc14bSjoergtemplate <class T, class Alloc> 651*4d6fc14bSjoerg inline constexpr bool uses_allocator_v = uses_allocator<T, Alloc>::value; 652*4d6fc14bSjoerg 653*4d6fc14bSjoerg// Pointer safety 654*4d6fc14bSjoergenum class pointer_safety { relaxed, preferred, strict }; // since C++11 655*4d6fc14bSjoergvoid declare_reachable(void *p); // since C++11 656*4d6fc14bSjoergtemplate <class T> T *undeclare_reachable(T *p); // since C++11 657*4d6fc14bSjoergvoid declare_no_pointers(char *p, size_t n); // since C++11 658*4d6fc14bSjoergvoid undeclare_no_pointers(char *p, size_t n); // since C++11 659*4d6fc14bSjoergpointer_safety get_pointer_safety() noexcept; // since C++11 660*4d6fc14bSjoerg 661*4d6fc14bSjoergvoid* align(size_t alignment, size_t size, void*& ptr, size_t& space); 662*4d6fc14bSjoerg 663*4d6fc14bSjoerg} // std 664*4d6fc14bSjoerg 665*4d6fc14bSjoerg*/ 666*4d6fc14bSjoerg 667*4d6fc14bSjoerg#include <__config> 668*4d6fc14bSjoerg#include <type_traits> 669*4d6fc14bSjoerg#include <typeinfo> 670*4d6fc14bSjoerg#include <compare> 671*4d6fc14bSjoerg#include <cstddef> 672*4d6fc14bSjoerg#include <cstdint> 673*4d6fc14bSjoerg#include <new> 674*4d6fc14bSjoerg#include <utility> 675*4d6fc14bSjoerg#include <iterator> 676*4d6fc14bSjoerg#include <__functional_base> 677*4d6fc14bSjoerg#include <iosfwd> 678*4d6fc14bSjoerg#include <tuple> 679*4d6fc14bSjoerg#include <stdexcept> 680*4d6fc14bSjoerg#include <cstring> 681*4d6fc14bSjoerg#include <__memory/addressof.h> 682*4d6fc14bSjoerg#include <__memory/allocation_guard.h> 683*4d6fc14bSjoerg#include <__memory/allocator.h> 684*4d6fc14bSjoerg#include <__memory/allocator_traits.h> 685*4d6fc14bSjoerg#include <__memory/compressed_pair.h> 686*4d6fc14bSjoerg#include <__memory/construct_at.h> 687*4d6fc14bSjoerg#include <__memory/pointer_safety.h> 688*4d6fc14bSjoerg#include <__memory/pointer_traits.h> 689*4d6fc14bSjoerg#include <__memory/raw_storage_iterator.h> 690*4d6fc14bSjoerg#include <__memory/shared_ptr.h> 691*4d6fc14bSjoerg#include <__memory/temporary_buffer.h> 692*4d6fc14bSjoerg#include <__memory/uninitialized_algorithms.h> 693*4d6fc14bSjoerg#include <__memory/unique_ptr.h> 694*4d6fc14bSjoerg#include <version> 695*4d6fc14bSjoerg 696*4d6fc14bSjoerg#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR) 697*4d6fc14bSjoerg# include <__memory/auto_ptr.h> 698*4d6fc14bSjoerg#endif 699*4d6fc14bSjoerg 700*4d6fc14bSjoerg#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 701*4d6fc14bSjoerg#pragma GCC system_header 702*4d6fc14bSjoerg#endif 703*4d6fc14bSjoerg 704*4d6fc14bSjoerg_LIBCPP_PUSH_MACROS 705*4d6fc14bSjoerg#include <__undef_macros> 706*4d6fc14bSjoerg 707*4d6fc14bSjoerg 708*4d6fc14bSjoerg_LIBCPP_BEGIN_NAMESPACE_STD 709*4d6fc14bSjoerg 710*4d6fc14bSjoergtemplate <class _Alloc, class _Ptr> 711*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY 712*4d6fc14bSjoergvoid __construct_forward_with_exception_guarantees(_Alloc& __a, _Ptr __begin1, _Ptr __end1, _Ptr& __begin2) { 713*4d6fc14bSjoerg static_assert(__is_cpp17_move_insertable<_Alloc>::value, 714*4d6fc14bSjoerg "The specified type does not meet the requirements of Cpp17MoveInsertable"); 715*4d6fc14bSjoerg typedef allocator_traits<_Alloc> _Traits; 716*4d6fc14bSjoerg for (; __begin1 != __end1; ++__begin1, (void)++__begin2) { 717*4d6fc14bSjoerg _Traits::construct(__a, _VSTD::__to_address(__begin2), 718*4d6fc14bSjoerg#ifdef _LIBCPP_NO_EXCEPTIONS 719*4d6fc14bSjoerg _VSTD::move(*__begin1) 720*4d6fc14bSjoerg#else 721*4d6fc14bSjoerg _VSTD::move_if_noexcept(*__begin1) 722*4d6fc14bSjoerg#endif 723*4d6fc14bSjoerg ); 724*4d6fc14bSjoerg } 725*4d6fc14bSjoerg} 726*4d6fc14bSjoerg 727*4d6fc14bSjoergtemplate <class _Alloc, class _Tp, typename enable_if< 728*4d6fc14bSjoerg (__is_default_allocator<_Alloc>::value || !__has_construct<_Alloc, _Tp*, _Tp>::value) && 729*4d6fc14bSjoerg is_trivially_move_constructible<_Tp>::value 730*4d6fc14bSjoerg>::type> 731*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY 732*4d6fc14bSjoergvoid __construct_forward_with_exception_guarantees(_Alloc&, _Tp* __begin1, _Tp* __end1, _Tp*& __begin2) { 733*4d6fc14bSjoerg ptrdiff_t _Np = __end1 - __begin1; 734*4d6fc14bSjoerg if (_Np > 0) { 735*4d6fc14bSjoerg _VSTD::memcpy(__begin2, __begin1, _Np * sizeof(_Tp)); 736*4d6fc14bSjoerg __begin2 += _Np; 737*4d6fc14bSjoerg } 738*4d6fc14bSjoerg} 739*4d6fc14bSjoerg 740*4d6fc14bSjoergtemplate <class _Alloc, class _Iter, class _Ptr> 741*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY 742*4d6fc14bSjoergvoid __construct_range_forward(_Alloc& __a, _Iter __begin1, _Iter __end1, _Ptr& __begin2) { 743*4d6fc14bSjoerg typedef allocator_traits<_Alloc> _Traits; 744*4d6fc14bSjoerg for (; __begin1 != __end1; ++__begin1, (void) ++__begin2) { 745*4d6fc14bSjoerg _Traits::construct(__a, _VSTD::__to_address(__begin2), *__begin1); 746*4d6fc14bSjoerg } 747*4d6fc14bSjoerg} 748*4d6fc14bSjoerg 749*4d6fc14bSjoergtemplate <class _Alloc, class _Source, class _Dest, 750*4d6fc14bSjoerg class _RawSource = typename remove_const<_Source>::type, 751*4d6fc14bSjoerg class _RawDest = typename remove_const<_Dest>::type, 752*4d6fc14bSjoerg class = 753*4d6fc14bSjoerg typename enable_if< 754*4d6fc14bSjoerg is_trivially_copy_constructible<_Dest>::value && 755*4d6fc14bSjoerg is_same<_RawSource, _RawDest>::value && 756*4d6fc14bSjoerg (__is_default_allocator<_Alloc>::value || !__has_construct<_Alloc, _Dest*, _Source&>::value) 757*4d6fc14bSjoerg >::type> 758*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY 759*4d6fc14bSjoergvoid __construct_range_forward(_Alloc&, _Source* __begin1, _Source* __end1, _Dest*& __begin2) { 760*4d6fc14bSjoerg ptrdiff_t _Np = __end1 - __begin1; 761*4d6fc14bSjoerg if (_Np > 0) { 762*4d6fc14bSjoerg _VSTD::memcpy(const_cast<_RawDest*>(__begin2), __begin1, _Np * sizeof(_Dest)); 763*4d6fc14bSjoerg __begin2 += _Np; 764*4d6fc14bSjoerg } 765*4d6fc14bSjoerg} 766*4d6fc14bSjoerg 767*4d6fc14bSjoergtemplate <class _Alloc, class _Ptr> 768*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY 769*4d6fc14bSjoergvoid __construct_backward_with_exception_guarantees(_Alloc& __a, _Ptr __begin1, _Ptr __end1, _Ptr& __end2) { 770*4d6fc14bSjoerg static_assert(__is_cpp17_move_insertable<_Alloc>::value, 771*4d6fc14bSjoerg "The specified type does not meet the requirements of Cpp17MoveInsertable"); 772*4d6fc14bSjoerg typedef allocator_traits<_Alloc> _Traits; 773*4d6fc14bSjoerg while (__end1 != __begin1) { 774*4d6fc14bSjoerg _Traits::construct(__a, _VSTD::__to_address(__end2 - 1), 775*4d6fc14bSjoerg#ifdef _LIBCPP_NO_EXCEPTIONS 776*4d6fc14bSjoerg _VSTD::move(*--__end1) 777*4d6fc14bSjoerg#else 778*4d6fc14bSjoerg _VSTD::move_if_noexcept(*--__end1) 779*4d6fc14bSjoerg#endif 780*4d6fc14bSjoerg ); 781*4d6fc14bSjoerg --__end2; 782*4d6fc14bSjoerg } 783*4d6fc14bSjoerg} 784*4d6fc14bSjoerg 785*4d6fc14bSjoergtemplate <class _Alloc, class _Tp, class = typename enable_if< 786*4d6fc14bSjoerg (__is_default_allocator<_Alloc>::value || !__has_construct<_Alloc, _Tp*, _Tp>::value) && 787*4d6fc14bSjoerg is_trivially_move_constructible<_Tp>::value 788*4d6fc14bSjoerg>::type> 789*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY 790*4d6fc14bSjoergvoid __construct_backward_with_exception_guarantees(_Alloc&, _Tp* __begin1, _Tp* __end1, _Tp*& __end2) { 791*4d6fc14bSjoerg ptrdiff_t _Np = __end1 - __begin1; 792*4d6fc14bSjoerg __end2 -= _Np; 793*4d6fc14bSjoerg if (_Np > 0) 794*4d6fc14bSjoerg _VSTD::memcpy(__end2, __begin1, _Np * sizeof(_Tp)); 795*4d6fc14bSjoerg} 796*4d6fc14bSjoerg 797*4d6fc14bSjoergstruct __destruct_n 798*4d6fc14bSjoerg{ 799*4d6fc14bSjoergprivate: 800*4d6fc14bSjoerg size_t __size_; 801*4d6fc14bSjoerg 802*4d6fc14bSjoerg template <class _Tp> 803*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY void __process(_Tp* __p, false_type) _NOEXCEPT 804*4d6fc14bSjoerg {for (size_t __i = 0; __i < __size_; ++__i, ++__p) __p->~_Tp();} 805*4d6fc14bSjoerg 806*4d6fc14bSjoerg template <class _Tp> 807*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY void __process(_Tp*, true_type) _NOEXCEPT 808*4d6fc14bSjoerg {} 809*4d6fc14bSjoerg 810*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY void __incr(false_type) _NOEXCEPT 811*4d6fc14bSjoerg {++__size_;} 812*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY void __incr(true_type) _NOEXCEPT 813*4d6fc14bSjoerg {} 814*4d6fc14bSjoerg 815*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY void __set(size_t __s, false_type) _NOEXCEPT 816*4d6fc14bSjoerg {__size_ = __s;} 817*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY void __set(size_t, true_type) _NOEXCEPT 818*4d6fc14bSjoerg {} 819*4d6fc14bSjoergpublic: 820*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY explicit __destruct_n(size_t __s) _NOEXCEPT 821*4d6fc14bSjoerg : __size_(__s) {} 822*4d6fc14bSjoerg 823*4d6fc14bSjoerg template <class _Tp> 824*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY void __incr() _NOEXCEPT 825*4d6fc14bSjoerg {__incr(integral_constant<bool, is_trivially_destructible<_Tp>::value>());} 826*4d6fc14bSjoerg 827*4d6fc14bSjoerg template <class _Tp> 828*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY void __set(size_t __s, _Tp*) _NOEXCEPT 829*4d6fc14bSjoerg {__set(__s, integral_constant<bool, is_trivially_destructible<_Tp>::value>());} 830*4d6fc14bSjoerg 831*4d6fc14bSjoerg template <class _Tp> 832*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __p) _NOEXCEPT 833*4d6fc14bSjoerg {__process(__p, integral_constant<bool, is_trivially_destructible<_Tp>::value>());} 834*4d6fc14bSjoerg}; 835*4d6fc14bSjoerg 836*4d6fc14bSjoerg_LIBCPP_FUNC_VIS void* align(size_t __align, size_t __sz, void*& __ptr, size_t& __space); 837*4d6fc14bSjoerg 838*4d6fc14bSjoerg// --- Helper for container swap -- 839*4d6fc14bSjoergtemplate <typename _Alloc> 840*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY 841*4d6fc14bSjoergvoid __swap_allocator(_Alloc & __a1, _Alloc & __a2, true_type) 842*4d6fc14bSjoerg#if _LIBCPP_STD_VER >= 14 843*4d6fc14bSjoerg _NOEXCEPT 844*4d6fc14bSjoerg#else 845*4d6fc14bSjoerg _NOEXCEPT_(__is_nothrow_swappable<_Alloc>::value) 846*4d6fc14bSjoerg#endif 847*4d6fc14bSjoerg{ 848*4d6fc14bSjoerg using _VSTD::swap; 849*4d6fc14bSjoerg swap(__a1, __a2); 850*4d6fc14bSjoerg} 851*4d6fc14bSjoerg 852*4d6fc14bSjoergtemplate <typename _Alloc> 853*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 854*4d6fc14bSjoergvoid __swap_allocator(_Alloc &, _Alloc &, false_type) _NOEXCEPT {} 855*4d6fc14bSjoerg 856*4d6fc14bSjoergtemplate <typename _Alloc> 857*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 858*4d6fc14bSjoergvoid __swap_allocator(_Alloc & __a1, _Alloc & __a2) 859*4d6fc14bSjoerg#if _LIBCPP_STD_VER >= 14 860*4d6fc14bSjoerg _NOEXCEPT 861*4d6fc14bSjoerg#else 862*4d6fc14bSjoerg _NOEXCEPT_(__is_nothrow_swappable<_Alloc>::value) 863*4d6fc14bSjoerg#endif 864*4d6fc14bSjoerg{ 865*4d6fc14bSjoerg _VSTD::__swap_allocator(__a1, __a2, 866*4d6fc14bSjoerg integral_constant<bool, allocator_traits<_Alloc>::propagate_on_container_swap::value>()); 867*4d6fc14bSjoerg} 868*4d6fc14bSjoerg 869*4d6fc14bSjoergtemplate <typename _Alloc, typename _Traits=allocator_traits<_Alloc> > 870*4d6fc14bSjoergstruct __noexcept_move_assign_container : public integral_constant<bool, 871*4d6fc14bSjoerg _Traits::propagate_on_container_move_assignment::value 872*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 14 873*4d6fc14bSjoerg || _Traits::is_always_equal::value 874*4d6fc14bSjoerg#else 875*4d6fc14bSjoerg && is_nothrow_move_assignable<_Alloc>::value 876*4d6fc14bSjoerg#endif 877*4d6fc14bSjoerg > {}; 878*4d6fc14bSjoerg 879*4d6fc14bSjoerg 880*4d6fc14bSjoergtemplate <class _Tp, class _Alloc> 881*4d6fc14bSjoergstruct __temp_value { 882*4d6fc14bSjoerg typedef allocator_traits<_Alloc> _Traits; 883*4d6fc14bSjoerg 884*4d6fc14bSjoerg typename aligned_storage<sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp)>::type __v; 885*4d6fc14bSjoerg _Alloc &__a; 886*4d6fc14bSjoerg 887*4d6fc14bSjoerg _Tp *__addr() { return reinterpret_cast<_Tp *>(addressof(__v)); } 888*4d6fc14bSjoerg _Tp & get() { return *__addr(); } 889*4d6fc14bSjoerg 890*4d6fc14bSjoerg template<class... _Args> 891*4d6fc14bSjoerg _LIBCPP_NO_CFI 892*4d6fc14bSjoerg __temp_value(_Alloc &__alloc, _Args&& ... __args) : __a(__alloc) { 893*4d6fc14bSjoerg _Traits::construct(__a, reinterpret_cast<_Tp*>(addressof(__v)), 894*4d6fc14bSjoerg _VSTD::forward<_Args>(__args)...); 895*4d6fc14bSjoerg } 896*4d6fc14bSjoerg 897*4d6fc14bSjoerg ~__temp_value() { _Traits::destroy(__a, __addr()); } 898*4d6fc14bSjoerg }; 899*4d6fc14bSjoerg 900*4d6fc14bSjoergtemplate<typename _Alloc, typename = void, typename = void> 901*4d6fc14bSjoergstruct __is_allocator : false_type {}; 902*4d6fc14bSjoerg 903*4d6fc14bSjoergtemplate<typename _Alloc> 904*4d6fc14bSjoergstruct __is_allocator<_Alloc, 905*4d6fc14bSjoerg typename __void_t<typename _Alloc::value_type>::type, 906*4d6fc14bSjoerg typename __void_t<decltype(declval<_Alloc&>().allocate(size_t(0)))>::type 907*4d6fc14bSjoerg > 908*4d6fc14bSjoerg : true_type {}; 909*4d6fc14bSjoerg 910*4d6fc14bSjoerg// __builtin_new_allocator -- A non-templated helper for allocating and 911*4d6fc14bSjoerg// deallocating memory using __builtin_operator_new and 912*4d6fc14bSjoerg// __builtin_operator_delete. It should be used in preference to 913*4d6fc14bSjoerg// `std::allocator<T>` to avoid additional instantiations. 914*4d6fc14bSjoergstruct __builtin_new_allocator { 915*4d6fc14bSjoerg struct __builtin_new_deleter { 916*4d6fc14bSjoerg typedef void* pointer_type; 917*4d6fc14bSjoerg 918*4d6fc14bSjoerg _LIBCPP_CONSTEXPR explicit __builtin_new_deleter(size_t __size, size_t __align) 919*4d6fc14bSjoerg : __size_(__size), __align_(__align) {} 920*4d6fc14bSjoerg 921*4d6fc14bSjoerg void operator()(void* p) const _NOEXCEPT { 922*4d6fc14bSjoerg _VSTD::__libcpp_deallocate(p, __size_, __align_); 923*4d6fc14bSjoerg } 924*4d6fc14bSjoerg 925*4d6fc14bSjoerg private: 926*4d6fc14bSjoerg size_t __size_; 927*4d6fc14bSjoerg size_t __align_; 928*4d6fc14bSjoerg }; 929*4d6fc14bSjoerg 930*4d6fc14bSjoerg typedef unique_ptr<void, __builtin_new_deleter> __holder_t; 931*4d6fc14bSjoerg 932*4d6fc14bSjoerg static __holder_t __allocate_bytes(size_t __s, size_t __align) { 933*4d6fc14bSjoerg return __holder_t(_VSTD::__libcpp_allocate(__s, __align), 934*4d6fc14bSjoerg __builtin_new_deleter(__s, __align)); 935*4d6fc14bSjoerg } 936*4d6fc14bSjoerg 937*4d6fc14bSjoerg static void __deallocate_bytes(void* __p, size_t __s, 938*4d6fc14bSjoerg size_t __align) _NOEXCEPT { 939*4d6fc14bSjoerg _VSTD::__libcpp_deallocate(__p, __s, __align); 940*4d6fc14bSjoerg } 941*4d6fc14bSjoerg 942*4d6fc14bSjoerg template <class _Tp> 943*4d6fc14bSjoerg _LIBCPP_NODEBUG _LIBCPP_ALWAYS_INLINE 944*4d6fc14bSjoerg static __holder_t __allocate_type(size_t __n) { 945*4d6fc14bSjoerg return __allocate_bytes(__n * sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp)); 946*4d6fc14bSjoerg } 947*4d6fc14bSjoerg 948*4d6fc14bSjoerg template <class _Tp> 949*4d6fc14bSjoerg _LIBCPP_NODEBUG _LIBCPP_ALWAYS_INLINE 950*4d6fc14bSjoerg static void __deallocate_type(void* __p, size_t __n) _NOEXCEPT { 951*4d6fc14bSjoerg __deallocate_bytes(__p, __n * sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp)); 952*4d6fc14bSjoerg } 953*4d6fc14bSjoerg}; 954*4d6fc14bSjoerg 955*4d6fc14bSjoerg 956*4d6fc14bSjoerg_LIBCPP_END_NAMESPACE_STD 957*4d6fc14bSjoerg 958*4d6fc14bSjoerg_LIBCPP_POP_MACROS 959*4d6fc14bSjoerg 960*4d6fc14bSjoerg#if defined(_LIBCPP_HAS_PARALLEL_ALGORITHMS) && _LIBCPP_STD_VER >= 17 961*4d6fc14bSjoerg# include <__pstl_memory> 962*4d6fc14bSjoerg#endif 963*4d6fc14bSjoerg 964*4d6fc14bSjoerg#endif // _LIBCPP_MEMORY 965