Home | History | Annotate | Download | only in stl
      1 /*
      2  *
      3  * Copyright (c) 1994
      4  * Hewlett-Packard Company
      5  *
      6  * Copyright (c) 1996,1997
      7  * Silicon Graphics Computer Systems, Inc.
      8  *
      9  * Copyright (c) 1997
     10  * Moscow Center for SPARC Technology
     11  *
     12  * Copyright (c) 1999
     13  * Boris Fomitchev
     14  *
     15  * This material is provided "as is", with absolutely no warranty expressed
     16  * or implied. Any use is at your own risk.
     17  *
     18  * Permission to use or copy this software for any purpose is hereby granted
     19  * without fee, provided the above notices are retained on all copies.
     20  * Permission to modify the code and to distribute modified code is granted,
     21  * provided the above notices are retained, and a notice that the code was
     22  * modified is included with the above copyright notice.
     23  *
     24  */
     25 
     26 /* NOTE: This is an internal header file, included by other STL headers.
     27  *   You should not attempt to use it directly.
     28  */
     29 
     30 #ifndef _STLP_INTERNAL_QUEUE_H
     31 #define _STLP_INTERNAL_QUEUE_H
     32 
     33 #ifndef _STLP_INTERNAL_DEQUE_H
     34 #  include <stl/_deque.h>
     35 #endif
     36 
     37 #ifndef _STLP_INTERNAL_VECTOR_H
     38 # include <stl/_vector.h>
     39 #endif
     40 
     41 #ifndef _STLP_INTERNAL_HEAP_H
     42 #  include <stl/_heap.h>
     43 #endif
     44 
     45 #ifndef _STLP_INTERNAL_FUNCTION_BASE_H
     46 #  include <stl/_function_base.h>
     47 #endif
     48 
     49 _STLP_BEGIN_NAMESPACE
     50 
     51 # if ! defined ( _STLP_LIMITED_DEFAULT_TEMPLATES )
     52 template <class _Tp, class _Sequence = deque<_Tp> >
     53 # elif defined ( _STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS )
     54 #  define _STLP_QUEUE_ARGS _Tp
     55 template <class _Tp>
     56 # else
     57 template <class _Tp, class _Sequence>
     58 # endif
     59 class queue
     60 #if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND)
     61 #  if defined (_STLP_QUEUE_ARGS)
     62             : public __stlport_class<queue<_Tp> >
     63 #  else
     64             : public __stlport_class<queue<_Tp, _Sequence> >
     65 #  endif
     66 #endif
     67 {
     68 # if defined ( _STLP_QUEUE_ARGS )
     69   typedef deque<_Tp> _Sequence;
     70   typedef queue<_Tp> _Self;
     71 # else
     72   typedef queue<_Tp, _Sequence> _Self;
     73 # endif
     74 public:
     75   typedef typename _Sequence::value_type      value_type;
     76   typedef typename _Sequence::size_type       size_type;
     77   typedef          _Sequence                  container_type;
     78 
     79   typedef typename _Sequence::reference       reference;
     80   typedef typename _Sequence::const_reference const_reference;
     81 
     82 protected:
     83   //c is a Standard name (23.2.3.1), do no make it STLport naming convention compliant.
     84   _Sequence c;
     85 public:
     86   queue() : c() {}
     87   explicit queue(const _Sequence& __c) : c(__c) {}
     88 
     89 #if !defined (_STLP_NO_MOVE_SEMANTIC)
     90   queue(__move_source<_Self> src)
     91     : c(_STLP_PRIV _AsMoveSource(src.get().c)) {}
     92 #endif
     93 
     94   bool empty() const { return c.empty(); }
     95   size_type size() const { return c.size(); }
     96   reference front() { return c.front(); }
     97   const_reference front() const { return c.front(); }
     98   reference back() { return c.back(); }
     99   const_reference back() const { return c.back(); }
    100   void push(const value_type& __x) { c.push_back(__x); }
    101   void pop() { c.pop_front(); }
    102   const _Sequence& _Get_s() const { return c; }
    103 
    104 #if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
    105   void _M_swap_workaround(_Self& __x) {
    106     _Sequence __tmp = c;
    107     c = __x.c;
    108     __x.c = __tmp;
    109   }
    110 #endif
    111 };
    112 
    113 #ifndef _STLP_QUEUE_ARGS
    114 #  define _STLP_QUEUE_ARGS _Tp, _Sequence
    115 #  define _STLP_QUEUE_HEADER_ARGS class _Tp, class _Sequence
    116 #else
    117 #  define _STLP_QUEUE_HEADER_ARGS class _Tp
    118 #endif
    119 
    120 template < _STLP_QUEUE_HEADER_ARGS >
    121 inline bool _STLP_CALL
    122 operator==(const queue<_STLP_QUEUE_ARGS >& __x, const queue<_STLP_QUEUE_ARGS >& __y) {
    123   return __x._Get_s() == __y._Get_s();
    124 }
    125 
    126 template < _STLP_QUEUE_HEADER_ARGS >
    127 inline bool _STLP_CALL
    128 operator<(const queue<_STLP_QUEUE_ARGS >& __x, const queue<_STLP_QUEUE_ARGS >& __y) {
    129   return __x._Get_s() < __y._Get_s();
    130 }
    131 
    132 _STLP_RELOPS_OPERATORS( template < _STLP_QUEUE_HEADER_ARGS >, queue<_STLP_QUEUE_ARGS > )
    133 
    134 # if !(defined ( _STLP_LIMITED_DEFAULT_TEMPLATES ) || defined ( _STLP_TEMPLATE_PARAM_SUBTYPE_BUG ))
    135 template <class _Tp, class _Sequence = vector<_Tp>,
    136           class _Compare = less<_STLP_HEADER_TYPENAME _Sequence::value_type> >
    137 # elif defined ( _STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS )
    138 template <class _Tp>
    139 # else
    140 template <class _Tp, class _Sequence, class _Compare>
    141 # endif
    142 class priority_queue
    143 #if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND)
    144 #  if defined (_STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS)
    145             : public __stlport_class<priority_queue<_Tp> >
    146 #  else
    147             : public __stlport_class<priority_queue<_Tp, _Sequence> >
    148 #  endif
    149 #endif
    150 {
    151 # ifdef _STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS
    152   typedef vector<_Tp> _Sequence;
    153   typedef less< typename vector<_Tp>::value_type> _Compare;
    154   typedef priority_queue<_Tp> _Self;
    155 # else
    156   typedef priority_queue<_Tp, _Sequence, _Compare> _Self;
    157 # endif
    158 public:
    159   typedef typename _Sequence::value_type      value_type;
    160   typedef typename _Sequence::size_type       size_type;
    161   typedef          _Sequence                  container_type;
    162 
    163   typedef typename _Sequence::reference       reference;
    164   typedef typename _Sequence::const_reference const_reference;
    165 protected:
    166   //c is a Standard name (23.2.3.2), do no make it STLport naming convention compliant.
    167   _Sequence c;
    168   _Compare comp;
    169 public:
    170   priority_queue() : c() {}
    171   explicit priority_queue(const _Compare& __x) :  c(), comp(__x) {}
    172   priority_queue(const _Compare& __x, const _Sequence& __s)
    173     : c(__s), comp(__x)
    174     { make_heap(c.begin(), c.end(), comp); }
    175 
    176 #if !defined (_STLP_NO_MOVE_SEMANTIC)
    177   priority_queue(__move_source<_Self> src)
    178     : c(_STLP_PRIV _AsMoveSource(src.get().c)),
    179       comp(_STLP_PRIV _AsMoveSource(src.get().comp)) {}
    180 #endif
    181 
    182 #ifdef _STLP_MEMBER_TEMPLATES
    183   template <class _InputIterator>
    184   priority_queue(_InputIterator __first, _InputIterator __last)
    185     : c(__first, __last) { make_heap(c.begin(), c.end(), comp); }
    186 
    187   template <class _InputIterator>
    188   priority_queue(_InputIterator __first,
    189                  _InputIterator __last, const _Compare& __x)
    190     : c(__first, __last), comp(__x)
    191     { make_heap(c.begin(), c.end(), comp); }
    192 
    193   template <class _InputIterator>
    194   priority_queue(_InputIterator __first, _InputIterator __last,
    195                  const _Compare& __x, const _Sequence& __s)
    196   : c(__s), comp(__x)
    197   {
    198     c.insert(c.end(), __first, __last);
    199     make_heap(c.begin(), c.end(), comp);
    200   }
    201 
    202 #else /* _STLP_MEMBER_TEMPLATES */
    203   priority_queue(const value_type* __first, const value_type* __last)
    204     : c(__first, __last) { make_heap(c.begin(), c.end(), comp); }
    205 
    206   priority_queue(const value_type* __first, const value_type* __last,
    207                  const _Compare& __x)
    208     : c(__first, __last), comp(__x)
    209     { make_heap(c.begin(), c.end(), comp); }
    210 
    211   priority_queue(const value_type* __first, const value_type* __last,
    212                  const _Compare& __x, const _Sequence& __c)
    213     : c(__c), comp(__x)
    214   {
    215     c.insert(c.end(), __first, __last);
    216     make_heap(c.begin(), c.end(), comp);
    217   }
    218 #endif /* _STLP_MEMBER_TEMPLATES */
    219 
    220   bool empty() const { return c.empty(); }
    221   size_type size() const { return c.size(); }
    222   const_reference top() const { return c.front(); }
    223   void push(const value_type& __x) {
    224     _STLP_TRY {
    225       c.push_back(__x);
    226       push_heap(c.begin(), c.end(), comp);
    227     }
    228     _STLP_UNWIND(c.clear())
    229   }
    230   void pop() {
    231     _STLP_TRY {
    232       pop_heap(c.begin(), c.end(), comp);
    233       c.pop_back();
    234     }
    235     _STLP_UNWIND(c.clear())
    236   }
    237 #if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
    238   void _M_swap_workaround(_Self& __x) {
    239     _Sequence __tmp = c;
    240     c = __x.c;
    241     __x.c = __tmp;
    242   }
    243 #endif
    244 };
    245 
    246 #if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) && !defined (_STLP_NO_MOVE_SEMANTIC)
    247 template <class _Tp, class _Sequence>
    248 struct __move_traits<queue<_Tp, _Sequence> > :
    249   _STLP_PRIV __move_traits_aux<_Sequence>
    250 {};
    251 
    252 template <class _Tp, class _Sequence, class _Compare>
    253 struct __move_traits<priority_queue<_Tp, _Sequence, _Compare> > :
    254   _STLP_PRIV __move_traits_aux2<_Sequence, _Compare>
    255 {};
    256 #endif
    257 
    258 _STLP_END_NAMESPACE
    259 
    260 #undef _STLP_QUEUE_ARGS
    261 #undef _STLP_QUEUE_HEADER_ARGS
    262 #undef comp
    263 
    264 #endif /* _STLP_INTERNAL_QUEUE_H */
    265 
    266 // Local Variables:
    267 // mode:C++
    268 // End:
    269