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