Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / c++ / scoped_allocator

History | View | Annotate | Download (21.7 KB)

1 13 up20180614
// -*- 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