1*4d6fc14bSjoerg// -*- C++ -*- 2*4d6fc14bSjoerg//===-------------------------- scoped_allocator --------------------------===// 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_SCOPED_ALLOCATOR 11*4d6fc14bSjoerg#define _LIBCPP_SCOPED_ALLOCATOR 12*4d6fc14bSjoerg 13*4d6fc14bSjoerg/* 14*4d6fc14bSjoerg scoped_allocator synopsis 15*4d6fc14bSjoerg 16*4d6fc14bSjoergnamespace std 17*4d6fc14bSjoerg{ 18*4d6fc14bSjoerg 19*4d6fc14bSjoergtemplate <class OuterAlloc, class... InnerAllocs> 20*4d6fc14bSjoergclass scoped_allocator_adaptor : public OuterAlloc 21*4d6fc14bSjoerg{ 22*4d6fc14bSjoerg typedef allocator_traits<OuterAlloc> OuterTraits; // exposition only 23*4d6fc14bSjoerg scoped_allocator_adaptor<InnerAllocs...> inner; // exposition only 24*4d6fc14bSjoergpublic: 25*4d6fc14bSjoerg 26*4d6fc14bSjoerg typedef OuterAlloc outer_allocator_type; 27*4d6fc14bSjoerg typedef see below inner_allocator_type; 28*4d6fc14bSjoerg 29*4d6fc14bSjoerg typedef typename OuterTraits::value_type value_type; 30*4d6fc14bSjoerg typedef typename OuterTraits::size_type size_type; 31*4d6fc14bSjoerg typedef typename OuterTraits::difference_type difference_type; 32*4d6fc14bSjoerg typedef typename OuterTraits::pointer pointer; 33*4d6fc14bSjoerg typedef typename OuterTraits::const_pointer const_pointer; 34*4d6fc14bSjoerg typedef typename OuterTraits::void_pointer void_pointer; 35*4d6fc14bSjoerg typedef typename OuterTraits::const_void_pointer const_void_pointer; 36*4d6fc14bSjoerg 37*4d6fc14bSjoerg typedef see below propagate_on_container_copy_assignment; 38*4d6fc14bSjoerg typedef see below propagate_on_container_move_assignment; 39*4d6fc14bSjoerg typedef see below propagate_on_container_swap; 40*4d6fc14bSjoerg typedef see below is_always_equal; 41*4d6fc14bSjoerg 42*4d6fc14bSjoerg template <class Tp> 43*4d6fc14bSjoerg struct rebind 44*4d6fc14bSjoerg { 45*4d6fc14bSjoerg typedef scoped_allocator_adaptor< 46*4d6fc14bSjoerg OuterTraits::template rebind_alloc<Tp>, InnerAllocs...> other; 47*4d6fc14bSjoerg }; 48*4d6fc14bSjoerg 49*4d6fc14bSjoerg scoped_allocator_adaptor(); 50*4d6fc14bSjoerg template <class OuterA2> 51*4d6fc14bSjoerg scoped_allocator_adaptor(OuterA2&& outerAlloc, 52*4d6fc14bSjoerg const InnerAllocs&... innerAllocs) noexcept; 53*4d6fc14bSjoerg scoped_allocator_adaptor(const scoped_allocator_adaptor& other) noexcept; 54*4d6fc14bSjoerg scoped_allocator_adaptor(scoped_allocator_adaptor&& other) noexcept; 55*4d6fc14bSjoerg template <class OuterA2> 56*4d6fc14bSjoerg scoped_allocator_adaptor(const scoped_allocator_adaptor<OuterA2, InnerAllocs...>& other) noexcept; 57*4d6fc14bSjoerg template <class OuterA2> 58*4d6fc14bSjoerg scoped_allocator_adaptor(const scoped_allocator_adaptor<OuterA2, InnerAllocs...>&& other) noexcept; 59*4d6fc14bSjoerg 60*4d6fc14bSjoerg scoped_allocator_adaptor& operator=(const scoped_allocator_adaptor&) = default; 61*4d6fc14bSjoerg scoped_allocator_adaptor& operator=(scoped_allocator_adaptor&&) = default; 62*4d6fc14bSjoerg ~scoped_allocator_adaptor(); 63*4d6fc14bSjoerg 64*4d6fc14bSjoerg inner_allocator_type& inner_allocator() noexcept; 65*4d6fc14bSjoerg const inner_allocator_type& inner_allocator() const noexcept; 66*4d6fc14bSjoerg 67*4d6fc14bSjoerg outer_allocator_type& outer_allocator() noexcept; 68*4d6fc14bSjoerg const outer_allocator_type& outer_allocator() const noexcept; 69*4d6fc14bSjoerg 70*4d6fc14bSjoerg pointer allocate(size_type n); // [[nodiscard]] in C++20 71*4d6fc14bSjoerg pointer allocate(size_type n, const_void_pointer hint); // [[nodiscard]] in C++20 72*4d6fc14bSjoerg void deallocate(pointer p, size_type n) noexcept; 73*4d6fc14bSjoerg 74*4d6fc14bSjoerg size_type max_size() const; 75*4d6fc14bSjoerg template <class T, class... Args> void construct(T* p, Args&& args); 76*4d6fc14bSjoerg template <class T1, class T2, class... Args1, class... Args2> 77*4d6fc14bSjoerg void construct(pair<T1, T2>* p, piecewise_construct t, tuple<Args1...> x, 78*4d6fc14bSjoerg tuple<Args2...> y); 79*4d6fc14bSjoerg template <class T1, class T2> 80*4d6fc14bSjoerg void construct(pair<T1, T2>* p); 81*4d6fc14bSjoerg template <class T1, class T2, class U, class V> 82*4d6fc14bSjoerg void construct(pair<T1, T2>* p, U&& x, V&& y); 83*4d6fc14bSjoerg template <class T1, class T2, class U, class V> 84*4d6fc14bSjoerg void construct(pair<T1, T2>* p, const pair<U, V>& x); 85*4d6fc14bSjoerg template <class T1, class T2, class U, class V> 86*4d6fc14bSjoerg void construct(pair<T1, T2>* p, pair<U, V>&& x); 87*4d6fc14bSjoerg template <class T> void destroy(T* p); 88*4d6fc14bSjoerg 89*4d6fc14bSjoerg template <class T> void destroy(T* p) noexcept; 90*4d6fc14bSjoerg 91*4d6fc14bSjoerg scoped_allocator_adaptor select_on_container_copy_construction() const noexcept; 92*4d6fc14bSjoerg}; 93*4d6fc14bSjoerg 94*4d6fc14bSjoergtemplate <class OuterA1, class OuterA2, class... InnerAllocs> 95*4d6fc14bSjoerg bool 96*4d6fc14bSjoerg operator==(const scoped_allocator_adaptor<OuterA1, InnerAllocs...>& a, 97*4d6fc14bSjoerg const scoped_allocator_adaptor<OuterA2, InnerAllocs...>& b) noexcept; 98*4d6fc14bSjoerg 99*4d6fc14bSjoergtemplate <class OuterA1, class OuterA2, class... InnerAllocs> 100*4d6fc14bSjoerg bool 101*4d6fc14bSjoerg operator!=(const scoped_allocator_adaptor<OuterA1, InnerAllocs...>& a, 102*4d6fc14bSjoerg const scoped_allocator_adaptor<OuterA2, InnerAllocs...>& b) noexcept; 103*4d6fc14bSjoerg 104*4d6fc14bSjoerg} // std 105*4d6fc14bSjoerg 106*4d6fc14bSjoerg*/ 107*4d6fc14bSjoerg 108*4d6fc14bSjoerg#include <__config> 109*4d6fc14bSjoerg#include <memory> 110*4d6fc14bSjoerg#include <version> 111*4d6fc14bSjoerg 112*4d6fc14bSjoerg#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 113*4d6fc14bSjoerg#pragma GCC system_header 114*4d6fc14bSjoerg#endif 115*4d6fc14bSjoerg 116*4d6fc14bSjoerg_LIBCPP_BEGIN_NAMESPACE_STD 117*4d6fc14bSjoerg 118*4d6fc14bSjoerg#if !defined(_LIBCPP_CXX03_LANG) 119*4d6fc14bSjoerg 120*4d6fc14bSjoerg// scoped_allocator_adaptor 121*4d6fc14bSjoerg 122*4d6fc14bSjoergtemplate <class ..._Allocs> 123*4d6fc14bSjoergclass scoped_allocator_adaptor; 124*4d6fc14bSjoerg 125*4d6fc14bSjoergtemplate <class ..._Allocs> struct __get_poc_copy_assignment; 126*4d6fc14bSjoerg 127*4d6fc14bSjoergtemplate <class _A0> 128*4d6fc14bSjoergstruct __get_poc_copy_assignment<_A0> 129*4d6fc14bSjoerg{ 130*4d6fc14bSjoerg static const bool value = allocator_traits<_A0>:: 131*4d6fc14bSjoerg propagate_on_container_copy_assignment::value; 132*4d6fc14bSjoerg}; 133*4d6fc14bSjoerg 134*4d6fc14bSjoergtemplate <class _A0, class ..._Allocs> 135*4d6fc14bSjoergstruct __get_poc_copy_assignment<_A0, _Allocs...> 136*4d6fc14bSjoerg{ 137*4d6fc14bSjoerg static const bool value = 138*4d6fc14bSjoerg allocator_traits<_A0>::propagate_on_container_copy_assignment::value || 139*4d6fc14bSjoerg __get_poc_copy_assignment<_Allocs...>::value; 140*4d6fc14bSjoerg}; 141*4d6fc14bSjoerg 142*4d6fc14bSjoergtemplate <class ..._Allocs> struct __get_poc_move_assignment; 143*4d6fc14bSjoerg 144*4d6fc14bSjoergtemplate <class _A0> 145*4d6fc14bSjoergstruct __get_poc_move_assignment<_A0> 146*4d6fc14bSjoerg{ 147*4d6fc14bSjoerg static const bool value = allocator_traits<_A0>:: 148*4d6fc14bSjoerg propagate_on_container_move_assignment::value; 149*4d6fc14bSjoerg}; 150*4d6fc14bSjoerg 151*4d6fc14bSjoergtemplate <class _A0, class ..._Allocs> 152*4d6fc14bSjoergstruct __get_poc_move_assignment<_A0, _Allocs...> 153*4d6fc14bSjoerg{ 154*4d6fc14bSjoerg static const bool value = 155*4d6fc14bSjoerg allocator_traits<_A0>::propagate_on_container_move_assignment::value || 156*4d6fc14bSjoerg __get_poc_move_assignment<_Allocs...>::value; 157*4d6fc14bSjoerg}; 158*4d6fc14bSjoerg 159*4d6fc14bSjoergtemplate <class ..._Allocs> struct __get_poc_swap; 160*4d6fc14bSjoerg 161*4d6fc14bSjoergtemplate <class _A0> 162*4d6fc14bSjoergstruct __get_poc_swap<_A0> 163*4d6fc14bSjoerg{ 164*4d6fc14bSjoerg static const bool value = allocator_traits<_A0>:: 165*4d6fc14bSjoerg propagate_on_container_swap::value; 166*4d6fc14bSjoerg}; 167*4d6fc14bSjoerg 168*4d6fc14bSjoergtemplate <class _A0, class ..._Allocs> 169*4d6fc14bSjoergstruct __get_poc_swap<_A0, _Allocs...> 170*4d6fc14bSjoerg{ 171*4d6fc14bSjoerg static const bool value = 172*4d6fc14bSjoerg allocator_traits<_A0>::propagate_on_container_swap::value || 173*4d6fc14bSjoerg __get_poc_swap<_Allocs...>::value; 174*4d6fc14bSjoerg}; 175*4d6fc14bSjoerg 176*4d6fc14bSjoergtemplate <class ..._Allocs> struct __get_is_always_equal; 177*4d6fc14bSjoerg 178*4d6fc14bSjoergtemplate <class _A0> 179*4d6fc14bSjoergstruct __get_is_always_equal<_A0> 180*4d6fc14bSjoerg{ 181*4d6fc14bSjoerg static const bool value = allocator_traits<_A0>::is_always_equal::value; 182*4d6fc14bSjoerg}; 183*4d6fc14bSjoerg 184*4d6fc14bSjoergtemplate <class _A0, class ..._Allocs> 185*4d6fc14bSjoergstruct __get_is_always_equal<_A0, _Allocs...> 186*4d6fc14bSjoerg{ 187*4d6fc14bSjoerg static const bool value = 188*4d6fc14bSjoerg allocator_traits<_A0>::is_always_equal::value && 189*4d6fc14bSjoerg __get_is_always_equal<_Allocs...>::value; 190*4d6fc14bSjoerg}; 191*4d6fc14bSjoerg 192*4d6fc14bSjoergtemplate <class ..._Allocs> 193*4d6fc14bSjoergclass __scoped_allocator_storage; 194*4d6fc14bSjoerg 195*4d6fc14bSjoergtemplate <class _OuterAlloc, class... _InnerAllocs> 196*4d6fc14bSjoergclass __scoped_allocator_storage<_OuterAlloc, _InnerAllocs...> 197*4d6fc14bSjoerg : public _OuterAlloc 198*4d6fc14bSjoerg{ 199*4d6fc14bSjoerg typedef _OuterAlloc outer_allocator_type; 200*4d6fc14bSjoergprotected: 201*4d6fc14bSjoerg typedef scoped_allocator_adaptor<_InnerAllocs...> inner_allocator_type; 202*4d6fc14bSjoerg 203*4d6fc14bSjoergprivate: 204*4d6fc14bSjoerg inner_allocator_type __inner_; 205*4d6fc14bSjoerg 206*4d6fc14bSjoergprotected: 207*4d6fc14bSjoerg 208*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 209*4d6fc14bSjoerg __scoped_allocator_storage() _NOEXCEPT {} 210*4d6fc14bSjoerg 211*4d6fc14bSjoerg template <class _OuterA2, 212*4d6fc14bSjoerg class = typename enable_if< 213*4d6fc14bSjoerg is_constructible<outer_allocator_type, _OuterA2>::value 214*4d6fc14bSjoerg >::type> 215*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 216*4d6fc14bSjoerg __scoped_allocator_storage(_OuterA2&& __outerAlloc, 217*4d6fc14bSjoerg const _InnerAllocs& ...__innerAllocs) _NOEXCEPT 218*4d6fc14bSjoerg : outer_allocator_type(_VSTD::forward<_OuterA2>(__outerAlloc)), 219*4d6fc14bSjoerg __inner_(__innerAllocs...) {} 220*4d6fc14bSjoerg 221*4d6fc14bSjoerg template <class _OuterA2, 222*4d6fc14bSjoerg class = typename enable_if< 223*4d6fc14bSjoerg is_constructible<outer_allocator_type, const _OuterA2&>::value 224*4d6fc14bSjoerg >::type> 225*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 226*4d6fc14bSjoerg __scoped_allocator_storage( 227*4d6fc14bSjoerg const __scoped_allocator_storage<_OuterA2, _InnerAllocs...>& __other) _NOEXCEPT 228*4d6fc14bSjoerg : outer_allocator_type(__other.outer_allocator()), 229*4d6fc14bSjoerg __inner_(__other.inner_allocator()) {} 230*4d6fc14bSjoerg 231*4d6fc14bSjoerg template <class _OuterA2, 232*4d6fc14bSjoerg class = typename enable_if< 233*4d6fc14bSjoerg is_constructible<outer_allocator_type, _OuterA2>::value 234*4d6fc14bSjoerg >::type> 235*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 236*4d6fc14bSjoerg __scoped_allocator_storage( 237*4d6fc14bSjoerg __scoped_allocator_storage<_OuterA2, _InnerAllocs...>&& __other) _NOEXCEPT 238*4d6fc14bSjoerg : outer_allocator_type(_VSTD::move(__other.outer_allocator())), 239*4d6fc14bSjoerg __inner_(_VSTD::move(__other.inner_allocator())) {} 240*4d6fc14bSjoerg 241*4d6fc14bSjoerg template <class _OuterA2, 242*4d6fc14bSjoerg class = typename enable_if< 243*4d6fc14bSjoerg is_constructible<outer_allocator_type, _OuterA2>::value 244*4d6fc14bSjoerg >::type> 245*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 246*4d6fc14bSjoerg __scoped_allocator_storage(_OuterA2&& __o, 247*4d6fc14bSjoerg const inner_allocator_type& __i) _NOEXCEPT 248*4d6fc14bSjoerg : outer_allocator_type(_VSTD::forward<_OuterA2>(__o)), 249*4d6fc14bSjoerg __inner_(__i) 250*4d6fc14bSjoerg { 251*4d6fc14bSjoerg } 252*4d6fc14bSjoerg 253*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 254*4d6fc14bSjoerg inner_allocator_type& inner_allocator() _NOEXCEPT {return __inner_;} 255*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 256*4d6fc14bSjoerg const inner_allocator_type& inner_allocator() const _NOEXCEPT {return __inner_;} 257*4d6fc14bSjoerg 258*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 259*4d6fc14bSjoerg outer_allocator_type& outer_allocator() _NOEXCEPT 260*4d6fc14bSjoerg {return static_cast<outer_allocator_type&>(*this);} 261*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 262*4d6fc14bSjoerg const outer_allocator_type& outer_allocator() const _NOEXCEPT 263*4d6fc14bSjoerg {return static_cast<const outer_allocator_type&>(*this);} 264*4d6fc14bSjoerg 265*4d6fc14bSjoerg scoped_allocator_adaptor<outer_allocator_type, _InnerAllocs...> 266*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 267*4d6fc14bSjoerg select_on_container_copy_construction() const _NOEXCEPT 268*4d6fc14bSjoerg { 269*4d6fc14bSjoerg return scoped_allocator_adaptor<outer_allocator_type, _InnerAllocs...> 270*4d6fc14bSjoerg ( 271*4d6fc14bSjoerg allocator_traits<outer_allocator_type>:: 272*4d6fc14bSjoerg select_on_container_copy_construction(outer_allocator()), 273*4d6fc14bSjoerg allocator_traits<inner_allocator_type>:: 274*4d6fc14bSjoerg select_on_container_copy_construction(inner_allocator()) 275*4d6fc14bSjoerg ); 276*4d6fc14bSjoerg } 277*4d6fc14bSjoerg 278*4d6fc14bSjoerg template <class...> friend class __scoped_allocator_storage; 279*4d6fc14bSjoerg}; 280*4d6fc14bSjoerg 281*4d6fc14bSjoergtemplate <class _OuterAlloc> 282*4d6fc14bSjoergclass __scoped_allocator_storage<_OuterAlloc> 283*4d6fc14bSjoerg : public _OuterAlloc 284*4d6fc14bSjoerg{ 285*4d6fc14bSjoerg typedef _OuterAlloc outer_allocator_type; 286*4d6fc14bSjoergprotected: 287*4d6fc14bSjoerg typedef scoped_allocator_adaptor<_OuterAlloc> inner_allocator_type; 288*4d6fc14bSjoerg 289*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 290*4d6fc14bSjoerg __scoped_allocator_storage() _NOEXCEPT {} 291*4d6fc14bSjoerg 292*4d6fc14bSjoerg template <class _OuterA2, 293*4d6fc14bSjoerg class = typename enable_if< 294*4d6fc14bSjoerg is_constructible<outer_allocator_type, _OuterA2>::value 295*4d6fc14bSjoerg >::type> 296*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 297*4d6fc14bSjoerg __scoped_allocator_storage(_OuterA2&& __outerAlloc) _NOEXCEPT 298*4d6fc14bSjoerg : outer_allocator_type(_VSTD::forward<_OuterA2>(__outerAlloc)) {} 299*4d6fc14bSjoerg 300*4d6fc14bSjoerg template <class _OuterA2, 301*4d6fc14bSjoerg class = typename enable_if< 302*4d6fc14bSjoerg is_constructible<outer_allocator_type, const _OuterA2&>::value 303*4d6fc14bSjoerg >::type> 304*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 305*4d6fc14bSjoerg __scoped_allocator_storage( 306*4d6fc14bSjoerg const __scoped_allocator_storage<_OuterA2>& __other) _NOEXCEPT 307*4d6fc14bSjoerg : outer_allocator_type(__other.outer_allocator()) {} 308*4d6fc14bSjoerg 309*4d6fc14bSjoerg template <class _OuterA2, 310*4d6fc14bSjoerg class = typename enable_if< 311*4d6fc14bSjoerg is_constructible<outer_allocator_type, _OuterA2>::value 312*4d6fc14bSjoerg >::type> 313*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 314*4d6fc14bSjoerg __scoped_allocator_storage( 315*4d6fc14bSjoerg __scoped_allocator_storage<_OuterA2>&& __other) _NOEXCEPT 316*4d6fc14bSjoerg : outer_allocator_type(_VSTD::move(__other.outer_allocator())) {} 317*4d6fc14bSjoerg 318*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 319*4d6fc14bSjoerg inner_allocator_type& inner_allocator() _NOEXCEPT 320*4d6fc14bSjoerg {return static_cast<inner_allocator_type&>(*this);} 321*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 322*4d6fc14bSjoerg const inner_allocator_type& inner_allocator() const _NOEXCEPT 323*4d6fc14bSjoerg {return static_cast<const inner_allocator_type&>(*this);} 324*4d6fc14bSjoerg 325*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 326*4d6fc14bSjoerg outer_allocator_type& outer_allocator() _NOEXCEPT 327*4d6fc14bSjoerg {return static_cast<outer_allocator_type&>(*this);} 328*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 329*4d6fc14bSjoerg const outer_allocator_type& outer_allocator() const _NOEXCEPT 330*4d6fc14bSjoerg {return static_cast<const outer_allocator_type&>(*this);} 331*4d6fc14bSjoerg 332*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 333*4d6fc14bSjoerg scoped_allocator_adaptor<outer_allocator_type> 334*4d6fc14bSjoerg select_on_container_copy_construction() const _NOEXCEPT 335*4d6fc14bSjoerg {return scoped_allocator_adaptor<outer_allocator_type>( 336*4d6fc14bSjoerg allocator_traits<outer_allocator_type>:: 337*4d6fc14bSjoerg select_on_container_copy_construction(outer_allocator()) 338*4d6fc14bSjoerg );} 339*4d6fc14bSjoerg 340*4d6fc14bSjoerg __scoped_allocator_storage(const outer_allocator_type& __o, 341*4d6fc14bSjoerg const inner_allocator_type& __i) _NOEXCEPT; 342*4d6fc14bSjoerg 343*4d6fc14bSjoerg template <class...> friend class __scoped_allocator_storage; 344*4d6fc14bSjoerg}; 345*4d6fc14bSjoerg 346*4d6fc14bSjoerg// __outermost 347*4d6fc14bSjoerg 348*4d6fc14bSjoergtemplate <class _Alloc> 349*4d6fc14bSjoergdecltype(declval<_Alloc>().outer_allocator(), true_type()) 350*4d6fc14bSjoerg__has_outer_allocator_test(_Alloc&& __a); 351*4d6fc14bSjoerg 352*4d6fc14bSjoergtemplate <class _Alloc> 353*4d6fc14bSjoergfalse_type 354*4d6fc14bSjoerg__has_outer_allocator_test(const volatile _Alloc& __a); 355*4d6fc14bSjoerg 356*4d6fc14bSjoergtemplate <class _Alloc> 357*4d6fc14bSjoergstruct __has_outer_allocator 358*4d6fc14bSjoerg : public common_type 359*4d6fc14bSjoerg < 360*4d6fc14bSjoerg decltype(__has_outer_allocator_test(declval<_Alloc&>())) 361*4d6fc14bSjoerg >::type 362*4d6fc14bSjoerg{ 363*4d6fc14bSjoerg}; 364*4d6fc14bSjoerg 365*4d6fc14bSjoergtemplate <class _Alloc, bool = __has_outer_allocator<_Alloc>::value> 366*4d6fc14bSjoergstruct __outermost 367*4d6fc14bSjoerg{ 368*4d6fc14bSjoerg typedef _Alloc type; 369*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 370*4d6fc14bSjoerg type& operator()(type& __a) const _NOEXCEPT {return __a;} 371*4d6fc14bSjoerg}; 372*4d6fc14bSjoerg 373*4d6fc14bSjoergtemplate <class _Alloc> 374*4d6fc14bSjoergstruct __outermost<_Alloc, true> 375*4d6fc14bSjoerg{ 376*4d6fc14bSjoerg typedef typename remove_reference 377*4d6fc14bSjoerg < 378*4d6fc14bSjoerg decltype(declval<_Alloc>().outer_allocator()) 379*4d6fc14bSjoerg >::type _OuterAlloc; 380*4d6fc14bSjoerg typedef typename __outermost<_OuterAlloc>::type type; 381*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 382*4d6fc14bSjoerg type& operator()(_Alloc& __a) const _NOEXCEPT 383*4d6fc14bSjoerg {return __outermost<_OuterAlloc>()(__a.outer_allocator());} 384*4d6fc14bSjoerg}; 385*4d6fc14bSjoerg 386*4d6fc14bSjoergtemplate <class _OuterAlloc, class... _InnerAllocs> 387*4d6fc14bSjoergclass _LIBCPP_TEMPLATE_VIS scoped_allocator_adaptor<_OuterAlloc, _InnerAllocs...> 388*4d6fc14bSjoerg : public __scoped_allocator_storage<_OuterAlloc, _InnerAllocs...> 389*4d6fc14bSjoerg{ 390*4d6fc14bSjoerg typedef __scoped_allocator_storage<_OuterAlloc, _InnerAllocs...> base; 391*4d6fc14bSjoerg typedef allocator_traits<_OuterAlloc> _OuterTraits; 392*4d6fc14bSjoergpublic: 393*4d6fc14bSjoerg typedef _OuterAlloc outer_allocator_type; 394*4d6fc14bSjoerg typedef typename base::inner_allocator_type inner_allocator_type; 395*4d6fc14bSjoerg typedef typename _OuterTraits::size_type size_type; 396*4d6fc14bSjoerg typedef typename _OuterTraits::difference_type difference_type; 397*4d6fc14bSjoerg typedef typename _OuterTraits::pointer pointer; 398*4d6fc14bSjoerg typedef typename _OuterTraits::const_pointer const_pointer; 399*4d6fc14bSjoerg typedef typename _OuterTraits::void_pointer void_pointer; 400*4d6fc14bSjoerg typedef typename _OuterTraits::const_void_pointer const_void_pointer; 401*4d6fc14bSjoerg 402*4d6fc14bSjoerg typedef integral_constant 403*4d6fc14bSjoerg < 404*4d6fc14bSjoerg bool, 405*4d6fc14bSjoerg __get_poc_copy_assignment<outer_allocator_type, 406*4d6fc14bSjoerg _InnerAllocs...>::value 407*4d6fc14bSjoerg > propagate_on_container_copy_assignment; 408*4d6fc14bSjoerg typedef integral_constant 409*4d6fc14bSjoerg < 410*4d6fc14bSjoerg bool, 411*4d6fc14bSjoerg __get_poc_move_assignment<outer_allocator_type, 412*4d6fc14bSjoerg _InnerAllocs...>::value 413*4d6fc14bSjoerg > propagate_on_container_move_assignment; 414*4d6fc14bSjoerg typedef integral_constant 415*4d6fc14bSjoerg < 416*4d6fc14bSjoerg bool, 417*4d6fc14bSjoerg __get_poc_swap<outer_allocator_type, _InnerAllocs...>::value 418*4d6fc14bSjoerg > propagate_on_container_swap; 419*4d6fc14bSjoerg typedef integral_constant 420*4d6fc14bSjoerg < 421*4d6fc14bSjoerg bool, 422*4d6fc14bSjoerg __get_is_always_equal<outer_allocator_type, _InnerAllocs...>::value 423*4d6fc14bSjoerg > is_always_equal; 424*4d6fc14bSjoerg 425*4d6fc14bSjoerg template <class _Tp> 426*4d6fc14bSjoerg struct rebind 427*4d6fc14bSjoerg { 428*4d6fc14bSjoerg typedef scoped_allocator_adaptor 429*4d6fc14bSjoerg < 430*4d6fc14bSjoerg typename _OuterTraits::template rebind_alloc<_Tp>, _InnerAllocs... 431*4d6fc14bSjoerg > other; 432*4d6fc14bSjoerg }; 433*4d6fc14bSjoerg 434*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 435*4d6fc14bSjoerg scoped_allocator_adaptor() _NOEXCEPT {} 436*4d6fc14bSjoerg template <class _OuterA2, 437*4d6fc14bSjoerg class = typename enable_if< 438*4d6fc14bSjoerg is_constructible<outer_allocator_type, _OuterA2>::value 439*4d6fc14bSjoerg >::type> 440*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 441*4d6fc14bSjoerg scoped_allocator_adaptor(_OuterA2&& __outerAlloc, 442*4d6fc14bSjoerg const _InnerAllocs& ...__innerAllocs) _NOEXCEPT 443*4d6fc14bSjoerg : base(_VSTD::forward<_OuterA2>(__outerAlloc), __innerAllocs...) {} 444*4d6fc14bSjoerg // scoped_allocator_adaptor(const scoped_allocator_adaptor& __other) = default; 445*4d6fc14bSjoerg template <class _OuterA2, 446*4d6fc14bSjoerg class = typename enable_if< 447*4d6fc14bSjoerg is_constructible<outer_allocator_type, const _OuterA2&>::value 448*4d6fc14bSjoerg >::type> 449*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 450*4d6fc14bSjoerg scoped_allocator_adaptor( 451*4d6fc14bSjoerg const scoped_allocator_adaptor<_OuterA2, _InnerAllocs...>& __other) _NOEXCEPT 452*4d6fc14bSjoerg : base(__other) {} 453*4d6fc14bSjoerg template <class _OuterA2, 454*4d6fc14bSjoerg class = typename enable_if< 455*4d6fc14bSjoerg is_constructible<outer_allocator_type, _OuterA2>::value 456*4d6fc14bSjoerg >::type> 457*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 458*4d6fc14bSjoerg scoped_allocator_adaptor( 459*4d6fc14bSjoerg scoped_allocator_adaptor<_OuterA2, _InnerAllocs...>&& __other) _NOEXCEPT 460*4d6fc14bSjoerg : base(_VSTD::move(__other)) {} 461*4d6fc14bSjoerg 462*4d6fc14bSjoerg // scoped_allocator_adaptor& operator=(const scoped_allocator_adaptor&) = default; 463*4d6fc14bSjoerg // scoped_allocator_adaptor& operator=(scoped_allocator_adaptor&&) = default; 464*4d6fc14bSjoerg // ~scoped_allocator_adaptor() = default; 465*4d6fc14bSjoerg 466*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 467*4d6fc14bSjoerg inner_allocator_type& inner_allocator() _NOEXCEPT 468*4d6fc14bSjoerg {return base::inner_allocator();} 469*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 470*4d6fc14bSjoerg const inner_allocator_type& inner_allocator() const _NOEXCEPT 471*4d6fc14bSjoerg {return base::inner_allocator();} 472*4d6fc14bSjoerg 473*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 474*4d6fc14bSjoerg outer_allocator_type& outer_allocator() _NOEXCEPT 475*4d6fc14bSjoerg {return base::outer_allocator();} 476*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 477*4d6fc14bSjoerg const outer_allocator_type& outer_allocator() const _NOEXCEPT 478*4d6fc14bSjoerg {return base::outer_allocator();} 479*4d6fc14bSjoerg 480*4d6fc14bSjoerg _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 481*4d6fc14bSjoerg pointer allocate(size_type __n) 482*4d6fc14bSjoerg {return allocator_traits<outer_allocator_type>:: 483*4d6fc14bSjoerg allocate(outer_allocator(), __n);} 484*4d6fc14bSjoerg _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 485*4d6fc14bSjoerg pointer allocate(size_type __n, const_void_pointer __hint) 486*4d6fc14bSjoerg {return allocator_traits<outer_allocator_type>:: 487*4d6fc14bSjoerg allocate(outer_allocator(), __n, __hint);} 488*4d6fc14bSjoerg 489*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 490*4d6fc14bSjoerg void deallocate(pointer __p, size_type __n) _NOEXCEPT 491*4d6fc14bSjoerg {allocator_traits<outer_allocator_type>:: 492*4d6fc14bSjoerg deallocate(outer_allocator(), __p, __n);} 493*4d6fc14bSjoerg 494*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 495*4d6fc14bSjoerg size_type max_size() const 496*4d6fc14bSjoerg {return allocator_traits<outer_allocator_type>::max_size(outer_allocator());} 497*4d6fc14bSjoerg 498*4d6fc14bSjoerg template <class _Tp, class... _Args> 499*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 500*4d6fc14bSjoerg void construct(_Tp* __p, _Args&& ...__args) 501*4d6fc14bSjoerg {__construct(__uses_alloc_ctor<_Tp, inner_allocator_type&, _Args...>(), 502*4d6fc14bSjoerg __p, _VSTD::forward<_Args>(__args)...);} 503*4d6fc14bSjoerg 504*4d6fc14bSjoerg template <class _T1, class _T2, class... _Args1, class... _Args2> 505*4d6fc14bSjoerg void construct(pair<_T1, _T2>* __p, piecewise_construct_t, 506*4d6fc14bSjoerg tuple<_Args1...> __x, tuple<_Args2...> __y) 507*4d6fc14bSjoerg { 508*4d6fc14bSjoerg typedef __outermost<outer_allocator_type> _OM; 509*4d6fc14bSjoerg allocator_traits<typename _OM::type>::construct( 510*4d6fc14bSjoerg _OM()(outer_allocator()), __p, piecewise_construct 511*4d6fc14bSjoerg , __transform_tuple( 512*4d6fc14bSjoerg typename __uses_alloc_ctor< 513*4d6fc14bSjoerg _T1, inner_allocator_type&, _Args1... 514*4d6fc14bSjoerg >::type() 515*4d6fc14bSjoerg , _VSTD::move(__x) 516*4d6fc14bSjoerg , typename __make_tuple_indices<sizeof...(_Args1)>::type{} 517*4d6fc14bSjoerg ) 518*4d6fc14bSjoerg , __transform_tuple( 519*4d6fc14bSjoerg typename __uses_alloc_ctor< 520*4d6fc14bSjoerg _T2, inner_allocator_type&, _Args2... 521*4d6fc14bSjoerg >::type() 522*4d6fc14bSjoerg , _VSTD::move(__y) 523*4d6fc14bSjoerg , typename __make_tuple_indices<sizeof...(_Args2)>::type{} 524*4d6fc14bSjoerg ) 525*4d6fc14bSjoerg ); 526*4d6fc14bSjoerg } 527*4d6fc14bSjoerg 528*4d6fc14bSjoerg template <class _T1, class _T2> 529*4d6fc14bSjoerg void construct(pair<_T1, _T2>* __p) 530*4d6fc14bSjoerg { construct(__p, piecewise_construct, tuple<>{}, tuple<>{}); } 531*4d6fc14bSjoerg 532*4d6fc14bSjoerg template <class _T1, class _T2, class _Up, class _Vp> 533*4d6fc14bSjoerg void construct(pair<_T1, _T2>* __p, _Up&& __x, _Vp&& __y) { 534*4d6fc14bSjoerg construct(__p, piecewise_construct, 535*4d6fc14bSjoerg _VSTD::forward_as_tuple(_VSTD::forward<_Up>(__x)), 536*4d6fc14bSjoerg _VSTD::forward_as_tuple(_VSTD::forward<_Vp>(__y))); 537*4d6fc14bSjoerg } 538*4d6fc14bSjoerg 539*4d6fc14bSjoerg template <class _T1, class _T2, class _Up, class _Vp> 540*4d6fc14bSjoerg void construct(pair<_T1, _T2>* __p, const pair<_Up, _Vp>& __x) { 541*4d6fc14bSjoerg construct(__p, piecewise_construct, 542*4d6fc14bSjoerg _VSTD::forward_as_tuple(__x.first), 543*4d6fc14bSjoerg _VSTD::forward_as_tuple(__x.second)); 544*4d6fc14bSjoerg } 545*4d6fc14bSjoerg 546*4d6fc14bSjoerg template <class _T1, class _T2, class _Up, class _Vp> 547*4d6fc14bSjoerg void construct(pair<_T1, _T2>* __p, pair<_Up, _Vp>&& __x) { 548*4d6fc14bSjoerg construct(__p, piecewise_construct, 549*4d6fc14bSjoerg _VSTD::forward_as_tuple(_VSTD::forward<_Up>(__x.first)), 550*4d6fc14bSjoerg _VSTD::forward_as_tuple(_VSTD::forward<_Vp>(__x.second))); 551*4d6fc14bSjoerg } 552*4d6fc14bSjoerg 553*4d6fc14bSjoerg template <class _Tp> 554*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 555*4d6fc14bSjoerg void destroy(_Tp* __p) 556*4d6fc14bSjoerg { 557*4d6fc14bSjoerg typedef __outermost<outer_allocator_type> _OM; 558*4d6fc14bSjoerg allocator_traits<typename _OM::type>:: 559*4d6fc14bSjoerg destroy(_OM()(outer_allocator()), __p); 560*4d6fc14bSjoerg } 561*4d6fc14bSjoerg 562*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 563*4d6fc14bSjoerg scoped_allocator_adaptor select_on_container_copy_construction() const _NOEXCEPT 564*4d6fc14bSjoerg {return base::select_on_container_copy_construction();} 565*4d6fc14bSjoerg 566*4d6fc14bSjoergprivate: 567*4d6fc14bSjoerg 568*4d6fc14bSjoerg 569*4d6fc14bSjoerg template <class _OuterA2, 570*4d6fc14bSjoerg class = typename enable_if< 571*4d6fc14bSjoerg is_constructible<outer_allocator_type, _OuterA2>::value 572*4d6fc14bSjoerg >::type> 573*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 574*4d6fc14bSjoerg scoped_allocator_adaptor(_OuterA2&& __o, 575*4d6fc14bSjoerg const inner_allocator_type& __i) _NOEXCEPT 576*4d6fc14bSjoerg : base(_VSTD::forward<_OuterA2>(__o), __i) {} 577*4d6fc14bSjoerg 578*4d6fc14bSjoerg template <class _Tp, class... _Args> 579*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 580*4d6fc14bSjoerg void __construct(integral_constant<int, 0>, _Tp* __p, _Args&& ...__args) 581*4d6fc14bSjoerg { 582*4d6fc14bSjoerg typedef __outermost<outer_allocator_type> _OM; 583*4d6fc14bSjoerg allocator_traits<typename _OM::type>::construct 584*4d6fc14bSjoerg ( 585*4d6fc14bSjoerg _OM()(outer_allocator()), 586*4d6fc14bSjoerg __p, 587*4d6fc14bSjoerg _VSTD::forward<_Args>(__args)... 588*4d6fc14bSjoerg ); 589*4d6fc14bSjoerg } 590*4d6fc14bSjoerg 591*4d6fc14bSjoerg template <class _Tp, class... _Args> 592*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 593*4d6fc14bSjoerg void __construct(integral_constant<int, 1>, _Tp* __p, _Args&& ...__args) 594*4d6fc14bSjoerg { 595*4d6fc14bSjoerg typedef __outermost<outer_allocator_type> _OM; 596*4d6fc14bSjoerg allocator_traits<typename _OM::type>::construct 597*4d6fc14bSjoerg ( 598*4d6fc14bSjoerg _OM()(outer_allocator()), 599*4d6fc14bSjoerg __p, allocator_arg, inner_allocator(), 600*4d6fc14bSjoerg _VSTD::forward<_Args>(__args)... 601*4d6fc14bSjoerg ); 602*4d6fc14bSjoerg } 603*4d6fc14bSjoerg 604*4d6fc14bSjoerg template <class _Tp, class... _Args> 605*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 606*4d6fc14bSjoerg void __construct(integral_constant<int, 2>, _Tp* __p, _Args&& ...__args) 607*4d6fc14bSjoerg { 608*4d6fc14bSjoerg typedef __outermost<outer_allocator_type> _OM; 609*4d6fc14bSjoerg allocator_traits<typename _OM::type>::construct 610*4d6fc14bSjoerg ( 611*4d6fc14bSjoerg _OM()(outer_allocator()), 612*4d6fc14bSjoerg __p, 613*4d6fc14bSjoerg _VSTD::forward<_Args>(__args)..., 614*4d6fc14bSjoerg inner_allocator() 615*4d6fc14bSjoerg ); 616*4d6fc14bSjoerg } 617*4d6fc14bSjoerg 618*4d6fc14bSjoerg template <class ..._Args, size_t ..._Idx> 619*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 620*4d6fc14bSjoerg tuple<_Args&&...> 621*4d6fc14bSjoerg __transform_tuple(integral_constant<int, 0>, tuple<_Args...>&& __t, 622*4d6fc14bSjoerg __tuple_indices<_Idx...>) 623*4d6fc14bSjoerg { 624*4d6fc14bSjoerg return _VSTD::forward_as_tuple(_VSTD::get<_Idx>(_VSTD::move(__t))...); 625*4d6fc14bSjoerg } 626*4d6fc14bSjoerg 627*4d6fc14bSjoerg template <class ..._Args, size_t ..._Idx> 628*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 629*4d6fc14bSjoerg tuple<allocator_arg_t, inner_allocator_type&, _Args&&...> 630*4d6fc14bSjoerg __transform_tuple(integral_constant<int, 1>, tuple<_Args...> && __t, 631*4d6fc14bSjoerg __tuple_indices<_Idx...>) 632*4d6fc14bSjoerg { 633*4d6fc14bSjoerg using _Tup = tuple<allocator_arg_t, inner_allocator_type&, _Args&&...>; 634*4d6fc14bSjoerg return _Tup(allocator_arg, inner_allocator(), 635*4d6fc14bSjoerg _VSTD::get<_Idx>(_VSTD::move(__t))...); 636*4d6fc14bSjoerg } 637*4d6fc14bSjoerg 638*4d6fc14bSjoerg template <class ..._Args, size_t ..._Idx> 639*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 640*4d6fc14bSjoerg tuple<_Args&&..., inner_allocator_type&> 641*4d6fc14bSjoerg __transform_tuple(integral_constant<int, 2>, tuple<_Args...> && __t, 642*4d6fc14bSjoerg __tuple_indices<_Idx...>) 643*4d6fc14bSjoerg { 644*4d6fc14bSjoerg using _Tup = tuple<_Args&&..., inner_allocator_type&>; 645*4d6fc14bSjoerg return _Tup(_VSTD::get<_Idx>(_VSTD::move(__t))..., inner_allocator()); 646*4d6fc14bSjoerg } 647*4d6fc14bSjoerg 648*4d6fc14bSjoerg template <class...> friend class __scoped_allocator_storage; 649*4d6fc14bSjoerg}; 650*4d6fc14bSjoerg 651*4d6fc14bSjoergtemplate <class _OuterA1, class _OuterA2> 652*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 653*4d6fc14bSjoergbool 654*4d6fc14bSjoergoperator==(const scoped_allocator_adaptor<_OuterA1>& __a, 655*4d6fc14bSjoerg const scoped_allocator_adaptor<_OuterA2>& __b) _NOEXCEPT 656*4d6fc14bSjoerg{ 657*4d6fc14bSjoerg return __a.outer_allocator() == __b.outer_allocator(); 658*4d6fc14bSjoerg} 659*4d6fc14bSjoerg 660*4d6fc14bSjoergtemplate <class _OuterA1, class _OuterA2, class _InnerA0, class... _InnerAllocs> 661*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 662*4d6fc14bSjoergbool 663*4d6fc14bSjoergoperator==(const scoped_allocator_adaptor<_OuterA1, _InnerA0, _InnerAllocs...>& __a, 664*4d6fc14bSjoerg const scoped_allocator_adaptor<_OuterA2, _InnerA0, _InnerAllocs...>& __b) _NOEXCEPT 665*4d6fc14bSjoerg{ 666*4d6fc14bSjoerg return __a.outer_allocator() == __b.outer_allocator() && 667*4d6fc14bSjoerg __a.inner_allocator() == __b.inner_allocator(); 668*4d6fc14bSjoerg} 669*4d6fc14bSjoerg 670*4d6fc14bSjoergtemplate <class _OuterA1, class _OuterA2, class... _InnerAllocs> 671*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 672*4d6fc14bSjoergbool 673*4d6fc14bSjoergoperator!=(const scoped_allocator_adaptor<_OuterA1, _InnerAllocs...>& __a, 674*4d6fc14bSjoerg const scoped_allocator_adaptor<_OuterA2, _InnerAllocs...>& __b) _NOEXCEPT 675*4d6fc14bSjoerg{ 676*4d6fc14bSjoerg return !(__a == __b); 677*4d6fc14bSjoerg} 678*4d6fc14bSjoerg 679*4d6fc14bSjoerg#endif // !defined(_LIBCPP_CXX03_LANG) 680*4d6fc14bSjoerg 681*4d6fc14bSjoerg_LIBCPP_END_NAMESPACE_STD 682*4d6fc14bSjoerg 683*4d6fc14bSjoerg#endif // _LIBCPP_SCOPED_ALLOCATOR 684