queue revision 227825
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
17namespace std
18{
19
20template <class T, class Container = deque<T>>
21class queue
22{
23public:
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
30protected:
31    container_type c;
32
33public:
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
72template <class T, class Container>
73  bool operator==(const queue<T, Container>& x,const queue<T, Container>& y);
74
75template <class T, class Container>
76  bool operator< (const queue<T, Container>& x,const queue<T, Container>& y);
77
78template <class T, class Container>
79  bool operator!=(const queue<T, Container>& x,const queue<T, Container>& y);
80
81template <class T, class Container>
82  bool operator> (const queue<T, Container>& x,const queue<T, Container>& y);
83
84template <class T, class Container>
85  bool operator>=(const queue<T, Container>& x,const queue<T, Container>& y);
86
87template <class T, class Container>
88  bool operator<=(const queue<T, Container>& x,const queue<T, Container>& y);
89
90template <class T, class Container>
91  void swap(queue<T, Container>& x, queue<T, Container>& y)
92  noexcept(noexcept(x.swap(y)));
93
94template <class T, class Container = vector<T>,
95          class Compare = less<typename Container::value_type>>
96class priority_queue
97{
98public:
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
105protected:
106    container_type c;
107    Compare comp;
108
109public:
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
159template <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
180template <class _Tp, class _Container> class queue;
181
182template <class _Tp, class _Container>
183bool
184operator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y);
185
186template <class _Tp, class _Container>
187bool
188operator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y);
189
190template <class _Tp, class _Container = deque<_Tp> >
191class _LIBCPP_VISIBLE queue
192{
193public:
194    typedef _Container                               container_type;
195    typedef typename container_type::value_type      value_type;
196    typedef typename container_type::reference       reference;
197    typedef typename container_type::const_reference const_reference;
198    typedef typename container_type::size_type       size_type;
199
200protected:
201    container_type c;
202
203public:
204    _LIBCPP_INLINE_VISIBILITY
205    queue()
206        _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value)
207        : c() {}
208
209    _LIBCPP_INLINE_VISIBILITY
210    queue(const queue& __q) : c(__q.c) {}
211
212#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
213    _LIBCPP_INLINE_VISIBILITY
214    queue(queue&& __q)
215        _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value)
216        : c(_VSTD::move(__q.c)) {}
217#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
218
219    _LIBCPP_INLINE_VISIBILITY
220    queue& operator=(const queue& __q) {c = __q.c; return *this;}
221
222#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
223    _LIBCPP_INLINE_VISIBILITY
224    queue& operator=(queue&& __q)
225        _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value)
226        {c = _VSTD::move(__q.c); return *this;}
227#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
228
229    _LIBCPP_INLINE_VISIBILITY
230    explicit queue(const container_type& __c)  : c(__c) {}
231#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
232    _LIBCPP_INLINE_VISIBILITY
233    explicit queue(container_type&& __c) : c(_VSTD::move(__c)) {}
234#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
235    template <class _Alloc>
236        _LIBCPP_INLINE_VISIBILITY
237        explicit queue(const _Alloc& __a,
238                       typename enable_if<uses_allocator<container_type,
239                                                         _Alloc>::value>::type* = 0)
240            : c(__a) {}
241    template <class _Alloc>
242        _LIBCPP_INLINE_VISIBILITY
243        queue(const queue& __q, const _Alloc& __a,
244                       typename enable_if<uses_allocator<container_type,
245                                                         _Alloc>::value>::type* = 0)
246            : c(__q.c, __a) {}
247    template <class _Alloc>
248        _LIBCPP_INLINE_VISIBILITY
249        queue(const container_type& __c, const _Alloc& __a,
250                       typename enable_if<uses_allocator<container_type,
251                                                         _Alloc>::value>::type* = 0)
252            : c(__c, __a) {}
253#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
254    template <class _Alloc>
255        _LIBCPP_INLINE_VISIBILITY
256        queue(container_type&& __c, const _Alloc& __a,
257                       typename enable_if<uses_allocator<container_type,
258                                                         _Alloc>::value>::type* = 0)
259            : c(_VSTD::move(__c), __a) {}
260    template <class _Alloc>
261        _LIBCPP_INLINE_VISIBILITY
262        queue(queue&& __q, const _Alloc& __a,
263                       typename enable_if<uses_allocator<container_type,
264                                                         _Alloc>::value>::type* = 0)
265            : c(_VSTD::move(__q.c), __a) {}
266
267#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
268
269    _LIBCPP_INLINE_VISIBILITY
270    bool      empty() const {return c.empty();}
271    _LIBCPP_INLINE_VISIBILITY
272    size_type size() const  {return c.size();}
273
274    _LIBCPP_INLINE_VISIBILITY
275    reference       front()       {return c.front();}
276    _LIBCPP_INLINE_VISIBILITY
277    const_reference front() const {return c.front();}
278    _LIBCPP_INLINE_VISIBILITY
279    reference       back()        {return c.back();}
280    _LIBCPP_INLINE_VISIBILITY
281    const_reference back() const  {return c.back();}
282
283    _LIBCPP_INLINE_VISIBILITY
284    void push(const value_type& __v) {c.push_back(__v);}
285#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
286    _LIBCPP_INLINE_VISIBILITY
287    void push(value_type&& __v)      {c.push_back(_VSTD::move(__v));}
288#ifndef _LIBCPP_HAS_NO_VARIADICS
289    template <class... _Args>
290        _LIBCPP_INLINE_VISIBILITY
291        void emplace(_Args&&... __args)
292            {c.emplace_back(_VSTD::forward<_Args>(__args)...);}
293#endif  // _LIBCPP_HAS_NO_VARIADICS
294#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
295    _LIBCPP_INLINE_VISIBILITY
296    void pop() {c.pop_front();}
297
298    _LIBCPP_INLINE_VISIBILITY
299    void swap(queue& __q)
300        _NOEXCEPT_(__is_nothrow_swappable<container_type>::value)
301    {
302        using _VSTD::swap;
303        swap(c, __q.c);
304    }
305
306    template <class _T1, class _C1>
307    friend
308    _LIBCPP_INLINE_VISIBILITY
309    bool
310    operator==(const queue<_T1, _C1>& __x,const queue<_T1, _C1>& __y);
311
312    template <class _T1, class _C1>
313    friend
314    _LIBCPP_INLINE_VISIBILITY
315    bool
316    operator< (const queue<_T1, _C1>& __x,const queue<_T1, _C1>& __y);
317};
318
319template <class _Tp, class _Container>
320inline _LIBCPP_INLINE_VISIBILITY
321bool
322operator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
323{
324    return __x.c == __y.c;
325}
326
327template <class _Tp, class _Container>
328inline _LIBCPP_INLINE_VISIBILITY
329bool
330operator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
331{
332    return __x.c < __y.c;
333}
334
335template <class _Tp, class _Container>
336inline _LIBCPP_INLINE_VISIBILITY
337bool
338operator!=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
339{
340    return !(__x == __y);
341}
342
343template <class _Tp, class _Container>
344inline _LIBCPP_INLINE_VISIBILITY
345bool
346operator> (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
347{
348    return __y < __x;
349}
350
351template <class _Tp, class _Container>
352inline _LIBCPP_INLINE_VISIBILITY
353bool
354operator>=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
355{
356    return !(__x < __y);
357}
358
359template <class _Tp, class _Container>
360inline _LIBCPP_INLINE_VISIBILITY
361bool
362operator<=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y)
363{
364    return !(__y < __x);
365}
366
367template <class _Tp, class _Container>
368inline _LIBCPP_INLINE_VISIBILITY
369void
370swap(queue<_Tp, _Container>& __x, queue<_Tp, _Container>& __y)
371    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
372{
373    __x.swap(__y);
374}
375
376template <class _Tp, class _Container, class _Alloc>
377struct _LIBCPP_VISIBLE uses_allocator<queue<_Tp, _Container>, _Alloc>
378    : public uses_allocator<_Container, _Alloc>
379{
380};
381
382template <class _Tp, class _Container = vector<_Tp>,
383          class _Compare = less<typename _Container::value_type> >
384class _LIBCPP_VISIBLE priority_queue
385{
386public:
387    typedef _Container                               container_type;
388    typedef _Compare                                 value_compare;
389    typedef typename container_type::value_type      value_type;
390    typedef typename container_type::reference       reference;
391    typedef typename container_type::const_reference const_reference;
392    typedef typename container_type::size_type       size_type;
393
394protected:
395    container_type c;
396    value_compare comp;
397
398public:
399    _LIBCPP_INLINE_VISIBILITY
400    priority_queue()
401        _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value &&
402                   is_nothrow_default_constructible<value_compare>::value)
403        : c(), comp() {}
404
405    _LIBCPP_INLINE_VISIBILITY
406    priority_queue(const priority_queue& __q) : c(__q.c), comp(__q.comp) {}
407
408#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
409    _LIBCPP_INLINE_VISIBILITY
410    priority_queue(priority_queue&& __q)
411        _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value &&
412                   is_nothrow_move_constructible<value_compare>::value)
413        : c(_VSTD::move(__q.c)), comp(_VSTD::move(__q.comp)) {}
414#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
415
416    _LIBCPP_INLINE_VISIBILITY
417    priority_queue& operator=(const priority_queue& __q)
418        {c = __q.c; comp = __q.comp; return *this;}
419
420#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
421    _LIBCPP_INLINE_VISIBILITY
422    priority_queue& operator=(priority_queue&& __q)
423        _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value &&
424                   is_nothrow_move_assignable<value_compare>::value)
425        {c = _VSTD::move(__q.c); comp = _VSTD::move(__q.comp); return *this;}
426#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
427
428    _LIBCPP_INLINE_VISIBILITY
429    explicit priority_queue(const value_compare& __comp)
430        : c(), comp(__comp) {}
431    priority_queue(const value_compare& __comp, const container_type& __c);
432#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
433    explicit priority_queue(const value_compare& __comp, container_type&& __c);
434#endif
435    template <class _InputIter>
436        priority_queue(_InputIter __f, _InputIter __l,
437                       const value_compare& __comp = value_compare());
438    template <class _InputIter>
439        priority_queue(_InputIter __f, _InputIter __l,
440                       const value_compare& __comp, const container_type& __c);
441#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
442    template <class _InputIter>
443        priority_queue(_InputIter __f, _InputIter __l,
444                       const value_compare& __comp, container_type&& __c);
445#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
446    template <class _Alloc>
447        explicit priority_queue(const _Alloc& __a,
448                       typename enable_if<uses_allocator<container_type,
449                                                         _Alloc>::value>::type* = 0);
450    template <class _Alloc>
451        priority_queue(const value_compare& __comp, const _Alloc& __a,
452                       typename enable_if<uses_allocator<container_type,
453                                                         _Alloc>::value>::type* = 0);
454    template <class _Alloc>
455        priority_queue(const value_compare& __comp, const container_type& __c,
456                       const _Alloc& __a,
457                       typename enable_if<uses_allocator<container_type,
458                                                         _Alloc>::value>::type* = 0);
459    template <class _Alloc>
460        priority_queue(const priority_queue& __q, const _Alloc& __a,
461                       typename enable_if<uses_allocator<container_type,
462                                                         _Alloc>::value>::type* = 0);
463#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
464    template <class _Alloc>
465        priority_queue(const value_compare& __comp, container_type&& __c,
466                       const _Alloc& __a,
467                       typename enable_if<uses_allocator<container_type,
468                                                         _Alloc>::value>::type* = 0);
469    template <class _Alloc>
470        priority_queue(priority_queue&& __q, const _Alloc& __a,
471                       typename enable_if<uses_allocator<container_type,
472                                                         _Alloc>::value>::type* = 0);
473#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
474
475    _LIBCPP_INLINE_VISIBILITY
476    bool            empty() const {return c.empty();}
477    _LIBCPP_INLINE_VISIBILITY
478    size_type       size() const  {return c.size();}
479    _LIBCPP_INLINE_VISIBILITY
480    const_reference top() const   {return c.front();}
481
482    void push(const value_type& __v);
483#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
484    void push(value_type&& __v);
485#ifndef _LIBCPP_HAS_NO_VARIADICS
486    template <class... _Args> void emplace(_Args&&... __args);
487#endif
488#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
489    void pop();
490
491    void swap(priority_queue& __q)
492        _NOEXCEPT_(__is_nothrow_swappable<container_type>::value &&
493                   __is_nothrow_swappable<value_compare>::value);
494};
495
496template <class _Tp, class _Container, class _Compare>
497inline _LIBCPP_INLINE_VISIBILITY
498priority_queue<_Tp, _Container, _Compare>::priority_queue(const _Compare& __comp,
499                                                          const container_type& __c)
500    : c(__c),
501      comp(__comp)
502{
503    _VSTD::make_heap(c.begin(), c.end(), comp);
504}
505
506#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
507
508template <class _Tp, class _Container, class _Compare>
509inline _LIBCPP_INLINE_VISIBILITY
510priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
511                                                          container_type&& __c)
512    : c(_VSTD::move(__c)),
513      comp(__comp)
514{
515    _VSTD::make_heap(c.begin(), c.end(), comp);
516}
517
518#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
519
520template <class _Tp, class _Container, class _Compare>
521template <class _InputIter>
522inline _LIBCPP_INLINE_VISIBILITY
523priority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
524                                                          const value_compare& __comp)
525    : c(__f, __l),
526      comp(__comp)
527{
528    _VSTD::make_heap(c.begin(), c.end(), comp);
529}
530
531template <class _Tp, class _Container, class _Compare>
532template <class _InputIter>
533inline _LIBCPP_INLINE_VISIBILITY
534priority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
535                                                          const value_compare& __comp,
536                                                          const container_type& __c)
537    : c(__c),
538      comp(__comp)
539{
540    c.insert(c.end(), __f, __l);
541    _VSTD::make_heap(c.begin(), c.end(), comp);
542}
543
544#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
545
546template <class _Tp, class _Container, class _Compare>
547template <class _InputIter>
548inline _LIBCPP_INLINE_VISIBILITY
549priority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l,
550                                                          const value_compare& __comp,
551                                                          container_type&& __c)
552    : c(_VSTD::move(__c)),
553      comp(__comp)
554{
555    c.insert(c.end(), __f, __l);
556    _VSTD::make_heap(c.begin(), c.end(), comp);
557}
558
559#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
560
561template <class _Tp, class _Container, class _Compare>
562template <class _Alloc>
563inline _LIBCPP_INLINE_VISIBILITY
564priority_queue<_Tp, _Container, _Compare>::priority_queue(const _Alloc& __a,
565                       typename enable_if<uses_allocator<container_type,
566                                                         _Alloc>::value>::type*)
567    : c(__a)
568{
569}
570
571template <class _Tp, class _Container, class _Compare>
572template <class _Alloc>
573inline _LIBCPP_INLINE_VISIBILITY
574priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
575                                                          const _Alloc& __a,
576                       typename enable_if<uses_allocator<container_type,
577                                                         _Alloc>::value>::type*)
578    : c(__a),
579      comp(__comp)
580{
581}
582
583template <class _Tp, class _Container, class _Compare>
584template <class _Alloc>
585inline _LIBCPP_INLINE_VISIBILITY
586priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
587                                                          const container_type& __c,
588                                                          const _Alloc& __a,
589                       typename enable_if<uses_allocator<container_type,
590                                                         _Alloc>::value>::type*)
591    : c(__c, __a),
592      comp(__comp)
593{
594    _VSTD::make_heap(c.begin(), c.end(), comp);
595}
596
597template <class _Tp, class _Container, class _Compare>
598template <class _Alloc>
599inline _LIBCPP_INLINE_VISIBILITY
600priority_queue<_Tp, _Container, _Compare>::priority_queue(const priority_queue& __q,
601                                                          const _Alloc& __a,
602                       typename enable_if<uses_allocator<container_type,
603                                                         _Alloc>::value>::type*)
604    : c(__q.c, __a),
605      comp(__q.comp)
606{
607    _VSTD::make_heap(c.begin(), c.end(), comp);
608}
609
610#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
611
612template <class _Tp, class _Container, class _Compare>
613template <class _Alloc>
614inline _LIBCPP_INLINE_VISIBILITY
615priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp,
616                                                          container_type&& __c,
617                                                          const _Alloc& __a,
618                       typename enable_if<uses_allocator<container_type,
619                                                         _Alloc>::value>::type*)
620    : c(_VSTD::move(__c), __a),
621      comp(__comp)
622{
623    _VSTD::make_heap(c.begin(), c.end(), comp);
624}
625
626template <class _Tp, class _Container, class _Compare>
627template <class _Alloc>
628inline _LIBCPP_INLINE_VISIBILITY
629priority_queue<_Tp, _Container, _Compare>::priority_queue(priority_queue&& __q,
630                                                          const _Alloc& __a,
631                       typename enable_if<uses_allocator<container_type,
632                                                         _Alloc>::value>::type*)
633    : c(_VSTD::move(__q.c), __a),
634      comp(_VSTD::move(__q.comp))
635{
636    _VSTD::make_heap(c.begin(), c.end(), comp);
637}
638
639#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
640
641template <class _Tp, class _Container, class _Compare>
642inline _LIBCPP_INLINE_VISIBILITY
643void
644priority_queue<_Tp, _Container, _Compare>::push(const value_type& __v)
645{
646    c.push_back(__v);
647    _VSTD::push_heap(c.begin(), c.end(), comp);
648}
649
650#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
651
652template <class _Tp, class _Container, class _Compare>
653inline _LIBCPP_INLINE_VISIBILITY
654void
655priority_queue<_Tp, _Container, _Compare>::push(value_type&& __v)
656{
657    c.push_back(_VSTD::move(__v));
658    _VSTD::push_heap(c.begin(), c.end(), comp);
659}
660
661#ifndef _LIBCPP_HAS_NO_VARIADICS
662
663template <class _Tp, class _Container, class _Compare>
664template <class... _Args>
665inline _LIBCPP_INLINE_VISIBILITY
666void
667priority_queue<_Tp, _Container, _Compare>::emplace(_Args&&... __args)
668{
669    c.emplace_back(_VSTD::forward<_Args>(__args)...);
670    _VSTD::push_heap(c.begin(), c.end(), comp);
671}
672
673#endif  // _LIBCPP_HAS_NO_VARIADICS
674#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
675
676template <class _Tp, class _Container, class _Compare>
677inline _LIBCPP_INLINE_VISIBILITY
678void
679priority_queue<_Tp, _Container, _Compare>::pop()
680{
681    _VSTD::pop_heap(c.begin(), c.end(), comp);
682    c.pop_back();
683}
684
685template <class _Tp, class _Container, class _Compare>
686inline _LIBCPP_INLINE_VISIBILITY
687void
688priority_queue<_Tp, _Container, _Compare>::swap(priority_queue& __q)
689        _NOEXCEPT_(__is_nothrow_swappable<container_type>::value &&
690                   __is_nothrow_swappable<value_compare>::value)
691{
692    using _VSTD::swap;
693    swap(c, __q.c);
694    swap(comp, __q.comp);
695}
696
697template <class _Tp, class _Container, class _Compare>
698inline _LIBCPP_INLINE_VISIBILITY
699void
700swap(priority_queue<_Tp, _Container, _Compare>& __x,
701     priority_queue<_Tp, _Container, _Compare>& __y)
702    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
703{
704    __x.swap(__y);
705}
706
707template <class _Tp, class _Container, class _Compare, class _Alloc>
708struct _LIBCPP_VISIBLE uses_allocator<priority_queue<_Tp, _Container, _Compare>, _Alloc>
709    : public uses_allocator<_Container, _Alloc>
710{
711};
712
713_LIBCPP_END_NAMESPACE_STD
714
715#endif  // _LIBCPP_QUEUE
716