Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / c++ / queue @ 14

History | View | Annotate | Download (24.4 KB)

1
// -*- C++ -*-
2
//===--------------------------- queue ------------------------------------===//
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_QUEUE
12
#define _LIBCPP_QUEUE
13

    
14
/*
15
    queue synopsis
16

    
17
namespace std
18
{
19

    
20
template <class T, class Container = deque<T>>
21
class queue
22
{
23
public:
24
    typedef Container                                container_type;
25
    typedef typename container_type::value_type      value_type;
26
    typedef typename container_type::reference       reference;
27
    typedef typename container_type::const_reference const_reference;
28
    typedef typename container_type::size_type       size_type;
29

    
30
protected:
31
    container_type c;
32

    
33
public:
34
    queue() = default;
35
    ~queue() = default;
36

    
37
    queue(const queue& q) = default;
38
    queue(queue&& q) = default;
39

    
40
    queue& operator=(const queue& q) = default;
41
    queue& operator=(queue&& q) = default;
42

    
43
    explicit queue(const container_type& c);
44
    explicit queue(container_type&& c)
45
    template <class Alloc>
46
        explicit queue(const Alloc& a);
47
    template <class Alloc>
48
        queue(const container_type& c, const Alloc& a);
49
    template <class Alloc>
50
        queue(container_type&& c, const Alloc& a);
51
    template <class Alloc>
52
        queue(const queue& q, const Alloc& a);
53
    template <class Alloc>
54
        queue(queue&& q, const Alloc& a);
55

    
56
    bool      empty() const;
57
    size_type size() const;
58

    
59
    reference       front();
60
    const_reference front() const;
61
    reference       back();
62
    const_reference back() const;
63

    
64
    void push(const value_type& v);
65
    void push(value_type&& v);
66
    template <class... Args> void emplace(Args&&... args);
67
    void pop();
68

    
69
    void swap(queue& q) noexcept(noexcept(swap(c, q.c)));
70
};
71

    
72
template <class T, class Container>
73
  bool operator==(const queue<T, Container>& x,const queue<T, Container>& y);
74

    
75
template <class T, class Container>
76
  bool operator< (const queue<T, Container>& x,const queue<T, Container>& y);
77

    
78
template <class T, class Container>
79
  bool operator!=(const queue<T, Container>& x,const queue<T, Container>& y);
80

    
81
template <class T, class Container>
82
  bool operator> (const queue<T, Container>& x,const queue<T, Container>& y);
83

    
84
template <class T, class Container>
85
  bool operator>=(const queue<T, Container>& x,const queue<T, Container>& y);
86

    
87
template <class T, class Container>
88
  bool operator<=(const queue<T, Container>& x,const queue<T, Container>& y);
89

    
90
template <class T, class Container>
91
  void swap(queue<T, Container>& x, queue<T, Container>& y)
92
  noexcept(noexcept(x.swap(y)));
93

    
94
template <class T, class Container = vector<T>,
95
          class Compare = less<typename Container::value_type>>
96
class priority_queue
97
{
98
public:
99
    typedef Container                                container_type;
100
    typedef typename container_type::value_type      value_type;
101
    typedef typename container_type::reference       reference;
102
    typedef typename container_type::const_reference const_reference;
103
    typedef typename container_type::size_type       size_type;
104

    
105
protected:
106
    container_type c;
107
    Compare comp;
108

    
109
public:
110
    priority_queue() = default;
111
    ~priority_queue() = default;
112

    
113
    priority_queue(const priority_queue& q) = default;
114
    priority_queue(priority_queue&& q) = default;
115

    
116
    priority_queue& operator=(const priority_queue& q) = default;
117
    priority_queue& operator=(priority_queue&& q) = default;
118

    
119
    explicit priority_queue(const Compare& comp);
120
    priority_queue(const Compare& comp, const container_type& c);
121
    explicit priority_queue(const Compare& comp, container_type&& c);
122
    template <class InputIterator>
123
        priority_queue(InputIterator first, InputIterator last,
124
                       const Compare& comp = Compare());
125
    template <class InputIterator>
126
        priority_queue(InputIterator first, InputIterator last,
127
                       const Compare& comp, const container_type& c);
128
    template <class InputIterator>
129
        priority_queue(InputIterator first, InputIterator last,
130
                       const Compare& comp, container_type&& c);
131
    template <class Alloc>
132
        explicit priority_queue(const Alloc& a);
133
    template <class Alloc>
134
        priority_queue(const Compare& comp, const Alloc& a);
135
    template <class Alloc>
136
        priority_queue(const Compare& comp, const container_type& c,
137
                       const Alloc& a);
138
    template <class Alloc>
139
        priority_queue(const Compare& comp, container_type&& c,
140
                       const Alloc& a);
141
    template <class Alloc>
142
        priority_queue(const priority_queue& q, const Alloc& a);
143
    template <class Alloc>
144
        priority_queue(priority_queue&& q, const Alloc& a);
145

    
146
    bool            empty() const;
147
    size_type       size() const;
148
    const_reference top() const;
149

    
150
    void push(const value_type& v);
151
    void push(value_type&& v);
152
    template <class... Args> void emplace(Args&&... args);
153
    void pop();
154

    
155
    void swap(priority_queue& q)
156
        noexcept(noexcept(swap(c, q.c)) && noexcept(swap(comp.q.comp)));
157
};
158

    
159
template <class T, class Container, class Compare>
160
  void swap(priority_queue<T, Container, Compare>& x,
161
            priority_queue<T, Container, Compare>& y)
162
            noexcept(noexcept(x.swap(y)));
163

    
164
}  // std
165

    
166
*/
167

    
168
#include <__config>
169
#include <deque>
170
#include <vector>
171
#include <functional>
172
#include <algorithm>
173

    
174
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
175
#pragma GCC system_header
176
#endif
177

    
178
_LIBCPP_BEGIN_NAMESPACE_STD
179

    
180
template <class _Tp, class _Container = deque<_Tp> > class _LIBCPP_TYPE_VIS_ONLY queue;
181

    
182
template <class _Tp, class _Container>
183
_LIBCPP_INLINE_VISIBILITY
184
bool
185
operator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y);
186

    
187
template <class _Tp, class _Container>
188
_LIBCPP_INLINE_VISIBILITY
189
bool
190
operator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y);
191

    
192
template <class _Tp, class _Container /*= deque<_Tp>*/>
193
class _LIBCPP_TYPE_VIS_ONLY queue
194
{
195
public:
196
    typedef _Container                               container_type;
197
    typedef typename container_type::value_type      value_type;
198
    typedef typename container_type::reference       reference;
199
    typedef typename container_type::const_reference const_reference;
200
    typedef typename container_type::size_type       size_type;
201

    
202
protected:
203
    container_type c;
204

    
205
public:
206
    _LIBCPP_INLINE_VISIBILITY
207
    queue()
208
        _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value)
209
        : c() {}
210

    
211
    _LIBCPP_INLINE_VISIBILITY
212
    queue(const queue& __q) : c(__q.c) {}
213

    
214
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
215
    _LIBCPP_INLINE_VISIBILITY
216
    queue(queue&& __q)
217
        _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value)
218
        : c(_VSTD::move(__q.c)) {}
219
#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
220

    
221
    _LIBCPP_INLINE_VISIBILITY
222
    queue& operator=(const queue& __q) {c = __q.c; return *this;}
223

    
224
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
225
    _LIBCPP_INLINE_VISIBILITY
226
    queue& operator=(queue&& __q)
227
        _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value)
228
        {c = _VSTD::move(__q.c); return *this;}
229
#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
230

    
231
    _LIBCPP_INLINE_VISIBILITY
232
    explicit queue(const container_type& __c)  : c(__c) {}
233
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
234
    _LIBCPP_INLINE_VISIBILITY
235
    explicit queue(container_type&& __c) : c(_VSTD::move(__c)) {}
236
#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
237
    template <class _Alloc>
238
        _LIBCPP_INLINE_VISIBILITY
239
        explicit queue(const _Alloc& __a,
240
                       typename enable_if<uses_allocator<container_type,
241
                                                         _Alloc>::value>::type* = 0)
242
            : c(__a) {}
243
    template <class _Alloc>
244
        _LIBCPP_INLINE_VISIBILITY
245
        queue(const queue& __q, const _Alloc& __a,
246
                       typename enable_if<uses_allocator<container_type,
247
                                                         _Alloc>::value>::type* = 0)
248
            : c(__q.c, __a) {}
249
    template <class _Alloc>
250
        _LIBCPP_INLINE_VISIBILITY
251
        queue(const container_type& __c, const _Alloc& __a,
252
                       typename enable_if<uses_allocator<container_type,
253
                                                         _Alloc>::value>::type* = 0)
254
            : c(__c, __a) {}
255
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
256
    template <class _Alloc>
257
        _LIBCPP_INLINE_VISIBILITY
258
        queue(container_type&& __c, const _Alloc& __a,
259
                       typename enable_if<uses_allocator<container_type,
260
                                                         _Alloc>::value>::type* = 0)
261
            : c(_VSTD::move(__c), __a) {}
262
    template <class _Alloc>
263
        _LIBCPP_INLINE_VISIBILITY
264
        queue(queue&& __q, const _Alloc& __a,
265
                       typename enable_if<uses_allocator<container_type,
266
                                                         _Alloc>::value>::type* = 0)
267
            : c(_VSTD::move(__q.c), __a) {}
268

    
269
#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
270

    
271
    _LIBCPP_INLINE_VISIBILITY
272
    bool      empty() const {return c.empty();}
273
    _LIBCPP_INLINE_VISIBILITY
274
    size_type size() const  {return c.size();}
275

    
276
    _LIBCPP_INLINE_VISIBILITY
277
    reference       front()       {return c.front();}
278
    _LIBCPP_INLINE_VISIBILITY
279
    const_reference front() const {return c.front();}
280
    _LIBCPP_INLINE_VISIBILITY
281
    reference       back()        {return c.back();}
282
    _LIBCPP_INLINE_VISIBILITY
283
    const_reference back() const  {return c.back();}
284

    
285
    _LIBCPP_INLINE_VISIBILITY
286
    void push(const value_type& __v) {c.push_back(__v);}
287
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
288
    _LIBCPP_INLINE_VISIBILITY
289
    void push(value_type&& __v)      {c.push_back(_VSTD::move(__v));}
290
#ifndef _LIBCPP_HAS_NO_VARIADICS
291
    template <class... _Args>
292
        _LIBCPP_INLINE_VISIBILITY
293
        void emplace(_Args&&... __args)
294
            {c.emplace_back(_VSTD::forward<_Args>(__args)...);}
295
#endif  // _LIBCPP_HAS_NO_VARIADICS
296
#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
297
    _LIBCPP_INLINE_VISIBILITY
298
    void pop() {c.pop_front();}
299

    
300
    _LIBCPP_INLINE_VISIBILITY
301
    void swap(queue& __q)
302
        _NOEXCEPT_(__is_nothrow_swappable<container_type>::value)
303
    {
304
        using _VSTD::swap;
305
        swap(c, __q.c);
306
    }
307

    
308
    template <class _T1, class _C1>
309
    friend
310
    _LIBCPP_INLINE_VISIBILITY
311
    bool
312
    operator==(const queue<_T1, _C1>& __x,const queue<_T1, _C1>& __y);
313

    
314
    template <class _T1, class _C1>
315
    friend
316
    _LIBCPP_INLINE_VISIBILITY
317
    bool
318
    operator< (const queue<_T1, _C1>& __x,const queue<_T1, _C1>& __y);
319
};
320

    
321
template <class _Tp, class _Container>
322
inline _LIBCPP_INLINE_VISIBILITY
323
bool
324
operator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
325
{
326
    return __x.c == __y.c;
327
}
328

    
329
template <class _Tp, class _Container>
330
inline _LIBCPP_INLINE_VISIBILITY
331
bool
332
operator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
333
{
334
    return __x.c < __y.c;
335
}
336

    
337
template <class _Tp, class _Container>
338
inline _LIBCPP_INLINE_VISIBILITY
339
bool
340
operator!=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
341
{
342
    return !(__x == __y);
343
}
344

    
345
template <class _Tp, class _Container>
346
inline _LIBCPP_INLINE_VISIBILITY
347
bool
348
operator> (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
349
{
350
    return __y < __x;
351
}
352

    
353
template <class _Tp, class _Container>
354
inline _LIBCPP_INLINE_VISIBILITY
355
bool
356
operator>=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
357
{
358
    return !(__x < __y);
359
}
360

    
361
template <class _Tp, class _Container>
362
inline _LIBCPP_INLINE_VISIBILITY
363
bool
364
operator<=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
365
{
366
    return !(__y < __x);
367
}
368

    
369
template <class _Tp, class _Container>
370
inline _LIBCPP_INLINE_VISIBILITY
371
void
372
swap(queue<_Tp, _Container>& __x, queue<_Tp, _Container>& __y)
373
    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
374
{
375
    __x.swap(__y);
376
}
377

    
378
template <class _Tp, class _Container, class _Alloc>
379
struct _LIBCPP_TYPE_VIS_ONLY uses_allocator<queue<_Tp, _Container>, _Alloc>
380
    : public uses_allocator<_Container, _Alloc>
381
{
382
};
383

    
384
template <class _Tp, class _Container = vector<_Tp>,
385
          class _Compare = less<typename _Container::value_type> >
386
class _LIBCPP_TYPE_VIS_ONLY priority_queue
387
{
388
public:
389
    typedef _Container                               container_type;
390
    typedef _Compare                                 value_compare;
391
    typedef typename container_type::value_type      value_type;
392
    typedef typename container_type::reference       reference;
393
    typedef typename container_type::const_reference const_reference;
394
    typedef typename container_type::size_type       size_type;
395

    
396
protected:
397
    container_type c;
398
    value_compare comp;
399

    
400
public:
401
    _LIBCPP_INLINE_VISIBILITY
402
    priority_queue()
403
        _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value &&
404
                   is_nothrow_default_constructible<value_compare>::value)
405
        : c(), comp() {}
406

    
407
    _LIBCPP_INLINE_VISIBILITY
408
    priority_queue(const priority_queue& __q) : c(__q.c), comp(__q.comp) {}
409

    
410
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
411
    _LIBCPP_INLINE_VISIBILITY
412
    priority_queue(priority_queue&& __q)
413
        _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value &&
414
                   is_nothrow_move_constructible<value_compare>::value)
415
        : c(_VSTD::move(__q.c)), comp(_VSTD::move(__q.comp)) {}
416
#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
417

    
418
    _LIBCPP_INLINE_VISIBILITY
419
    priority_queue& operator=(const priority_queue& __q)
420
        {c = __q.c; comp = __q.comp; return *this;}
421

    
422
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
423
    _LIBCPP_INLINE_VISIBILITY
424
    priority_queue& operator=(priority_queue&& __q)
425
        _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value &&
426
                   is_nothrow_move_assignable<value_compare>::value)
427
        {c = _VSTD::move(__q.c); comp = _VSTD::move(__q.comp); return *this;}
428
#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
429

    
430
    _LIBCPP_INLINE_VISIBILITY
431
    explicit priority_queue(const value_compare& __comp)
432
        : c(), comp(__comp) {}
433
    priority_queue(const value_compare& __comp, const container_type& __c);
434
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
435
    explicit priority_queue(const value_compare& __comp, container_type&& __c);
436
#endif
437
    template <class _InputIter>
438
        priority_queue(_InputIter __f, _InputIter __l,
439
                       const value_compare& __comp = value_compare());
440
    template <class _InputIter>
441
        priority_queue(_InputIter __f, _InputIter __l,
442
                       const value_compare& __comp, const container_type& __c);
443
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
444
    template <class _InputIter>
445
        priority_queue(_InputIter __f, _InputIter __l,
446
                       const value_compare& __comp, container_type&& __c);
447
#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
448
    template <class _Alloc>
449
        explicit priority_queue(const _Alloc& __a,
450
                       typename enable_if<uses_allocator<container_type,
451
                                                         _Alloc>::value>::type* = 0);
452
    template <class _Alloc>
453
        priority_queue(const value_compare& __comp, const _Alloc& __a,
454
                       typename enable_if<uses_allocator<container_type,
455
                                                         _Alloc>::value>::type* = 0);
456
    template <class _Alloc>
457
        priority_queue(const value_compare& __comp, const container_type& __c,
458
                       const _Alloc& __a,
459
                       typename enable_if<uses_allocator<container_type,
460
                                                         _Alloc>::value>::type* = 0);
461
    template <class _Alloc>
462
        priority_queue(const priority_queue& __q, const _Alloc& __a,
463
                       typename enable_if<uses_allocator<container_type,
464
                                                         _Alloc>::value>::type* = 0);
465
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
466
    template <class _Alloc>
467
        priority_queue(const value_compare& __comp, container_type&& __c,
468
                       const _Alloc& __a,
469
                       typename enable_if<uses_allocator<container_type,
470
                                                         _Alloc>::value>::type* = 0);
471
    template <class _Alloc>
472
        priority_queue(priority_queue&& __q, const _Alloc& __a,
473
                       typename enable_if<uses_allocator<container_type,
474
                                                         _Alloc>::value>::type* = 0);
475
#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
476

    
477
    _LIBCPP_INLINE_VISIBILITY
478
    bool            empty() const {return c.empty();}
479
    _LIBCPP_INLINE_VISIBILITY
480
    size_type       size() const  {return c.size();}
481
    _LIBCPP_INLINE_VISIBILITY
482
    const_reference top() const   {return c.front();}
483

    
484
    void push(const value_type& __v);
485
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
486
    void push(value_type&& __v);
487
#ifndef _LIBCPP_HAS_NO_VARIADICS
488
    template <class... _Args> void emplace(_Args&&... __args);
489
#endif
490
#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
491
    void pop();
492

    
493
    void swap(priority_queue& __q)
494
        _NOEXCEPT_(__is_nothrow_swappable<container_type>::value &&
495
                   __is_nothrow_swappable<value_compare>::value);
496
};
497

    
498
template <class _Tp, class _Container, class _Compare>
499
inline _LIBCPP_INLINE_VISIBILITY
500
priority_queue<_Tp, _Container, _Compare>::priority_queue(const _Compare& __comp,
501
                                                          const container_type& __c)
502
    : c(__c),
503
      comp(__comp)
504
{
505
    _VSTD::make_heap(c.begin(), c.end(), comp);
506
}
507

    
508
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
509

    
510
template <class _Tp, class _Container, class _Compare>
511
inline _LIBCPP_INLINE_VISIBILITY
512
priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
513
                                                          container_type&& __c)
514
    : c(_VSTD::move(__c)),
515
      comp(__comp)
516
{
517
    _VSTD::make_heap(c.begin(), c.end(), comp);
518
}
519

    
520
#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
521

    
522
template <class _Tp, class _Container, class _Compare>
523
template <class _InputIter>
524
inline _LIBCPP_INLINE_VISIBILITY
525
priority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
526
                                                          const value_compare& __comp)
527
    : c(__f, __l),
528
      comp(__comp)
529
{
530
    _VSTD::make_heap(c.begin(), c.end(), comp);
531
}
532

    
533
template <class _Tp, class _Container, class _Compare>
534
template <class _InputIter>
535
inline _LIBCPP_INLINE_VISIBILITY
536
priority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
537
                                                          const value_compare& __comp,
538
                                                          const container_type& __c)
539
    : c(__c),
540
      comp(__comp)
541
{
542
    c.insert(c.end(), __f, __l);
543
    _VSTD::make_heap(c.begin(), c.end(), comp);
544
}
545

    
546
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
547

    
548
template <class _Tp, class _Container, class _Compare>
549
template <class _InputIter>
550
inline _LIBCPP_INLINE_VISIBILITY
551
priority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
552
                                                          const value_compare& __comp,
553
                                                          container_type&& __c)
554
    : c(_VSTD::move(__c)),
555
      comp(__comp)
556
{
557
    c.insert(c.end(), __f, __l);
558
    _VSTD::make_heap(c.begin(), c.end(), comp);
559
}
560

    
561
#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
562

    
563
template <class _Tp, class _Container, class _Compare>
564
template <class _Alloc>
565
inline _LIBCPP_INLINE_VISIBILITY
566
priority_queue<_Tp, _Container, _Compare>::priority_queue(const _Alloc& __a,
567
                       typename enable_if<uses_allocator<container_type,
568
                                                         _Alloc>::value>::type*)
569
    : c(__a)
570
{
571
}
572

    
573
template <class _Tp, class _Container, class _Compare>
574
template <class _Alloc>
575
inline _LIBCPP_INLINE_VISIBILITY
576
priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
577
                                                          const _Alloc& __a,
578
                       typename enable_if<uses_allocator<container_type,
579
                                                         _Alloc>::value>::type*)
580
    : c(__a),
581
      comp(__comp)
582
{
583
}
584

    
585
template <class _Tp, class _Container, class _Compare>
586
template <class _Alloc>
587
inline _LIBCPP_INLINE_VISIBILITY
588
priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
589
                                                          const container_type& __c,
590
                                                          const _Alloc& __a,
591
                       typename enable_if<uses_allocator<container_type,
592
                                                         _Alloc>::value>::type*)
593
    : c(__c, __a),
594
      comp(__comp)
595
{
596
    _VSTD::make_heap(c.begin(), c.end(), comp);
597
}
598

    
599
template <class _Tp, class _Container, class _Compare>
600
template <class _Alloc>
601
inline _LIBCPP_INLINE_VISIBILITY
602
priority_queue<_Tp, _Container, _Compare>::priority_queue(const priority_queue& __q,
603
                                                          const _Alloc& __a,
604
                       typename enable_if<uses_allocator<container_type,
605
                                                         _Alloc>::value>::type*)
606
    : c(__q.c, __a),
607
      comp(__q.comp)
608
{
609
    _VSTD::make_heap(c.begin(), c.end(), comp);
610
}
611

    
612
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
613

    
614
template <class _Tp, class _Container, class _Compare>
615
template <class _Alloc>
616
inline _LIBCPP_INLINE_VISIBILITY
617
priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
618
                                                          container_type&& __c,
619
                                                          const _Alloc& __a,
620
                       typename enable_if<uses_allocator<container_type,
621
                                                         _Alloc>::value>::type*)
622
    : c(_VSTD::move(__c), __a),
623
      comp(__comp)
624
{
625
    _VSTD::make_heap(c.begin(), c.end(), comp);
626
}
627

    
628
template <class _Tp, class _Container, class _Compare>
629
template <class _Alloc>
630
inline _LIBCPP_INLINE_VISIBILITY
631
priority_queue<_Tp, _Container, _Compare>::priority_queue(priority_queue&& __q,
632
                                                          const _Alloc& __a,
633
                       typename enable_if<uses_allocator<container_type,
634
                                                         _Alloc>::value>::type*)
635
    : c(_VSTD::move(__q.c), __a),
636
      comp(_VSTD::move(__q.comp))
637
{
638
    _VSTD::make_heap(c.begin(), c.end(), comp);
639
}
640

    
641
#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
642

    
643
template <class _Tp, class _Container, class _Compare>
644
inline _LIBCPP_INLINE_VISIBILITY
645
void
646
priority_queue<_Tp, _Container, _Compare>::push(const value_type& __v)
647
{
648
    c.push_back(__v);
649
    _VSTD::push_heap(c.begin(), c.end(), comp);
650
}
651

    
652
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
653

    
654
template <class _Tp, class _Container, class _Compare>
655
inline _LIBCPP_INLINE_VISIBILITY
656
void
657
priority_queue<_Tp, _Container, _Compare>::push(value_type&& __v)
658
{
659
    c.push_back(_VSTD::move(__v));
660
    _VSTD::push_heap(c.begin(), c.end(), comp);
661
}
662

    
663
#ifndef _LIBCPP_HAS_NO_VARIADICS
664

    
665
template <class _Tp, class _Container, class _Compare>
666
template <class... _Args>
667
inline _LIBCPP_INLINE_VISIBILITY
668
void
669
priority_queue<_Tp, _Container, _Compare>::emplace(_Args&&... __args)
670
{
671
    c.emplace_back(_VSTD::forward<_Args>(__args)...);
672
    _VSTD::push_heap(c.begin(), c.end(), comp);
673
}
674

    
675
#endif  // _LIBCPP_HAS_NO_VARIADICS
676
#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
677

    
678
template <class _Tp, class _Container, class _Compare>
679
inline _LIBCPP_INLINE_VISIBILITY
680
void
681
priority_queue<_Tp, _Container, _Compare>::pop()
682
{
683
    _VSTD::pop_heap(c.begin(), c.end(), comp);
684
    c.pop_back();
685
}
686

    
687
template <class _Tp, class _Container, class _Compare>
688
inline _LIBCPP_INLINE_VISIBILITY
689
void
690
priority_queue<_Tp, _Container, _Compare>::swap(priority_queue& __q)
691
        _NOEXCEPT_(__is_nothrow_swappable<container_type>::value &&
692
                   __is_nothrow_swappable<value_compare>::value)
693
{
694
    using _VSTD::swap;
695
    swap(c, __q.c);
696
    swap(comp, __q.comp);
697
}
698

    
699
template <class _Tp, class _Container, class _Compare>
700
inline _LIBCPP_INLINE_VISIBILITY
701
void
702
swap(priority_queue<_Tp, _Container, _Compare>& __x,
703
     priority_queue<_Tp, _Container, _Compare>& __y)
704
    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
705
{
706
    __x.swap(__y);
707
}
708

    
709
template <class _Tp, class _Container, class _Compare, class _Alloc>
710
struct _LIBCPP_TYPE_VIS_ONLY uses_allocator<priority_queue<_Tp, _Container, _Compare>, _Alloc>
711
    : public uses_allocator<_Container, _Alloc>
712
{
713
};
714

    
715
_LIBCPP_END_NAMESPACE_STD
716

    
717
#endif  // _LIBCPP_QUEUE