stl_queue.h
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:6k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. /*
  2.  *
  3.  * Copyright (c) 1994
  4.  * Hewlett-Packard Company
  5.  *
  6.  * Permission to use, copy, modify, distribute and sell this software
  7.  * and its documentation for any purpose is hereby granted without fee,
  8.  * provided that the above copyright notice appear in all copies and
  9.  * that both that copyright notice and this permission notice appear
  10.  * in supporting documentation.  Hewlett-Packard Company makes no
  11.  * representations about the suitability of this software for any
  12.  * purpose.  It is provided "as is" without express or implied warranty.
  13.  *
  14.  *
  15.  * Copyright (c) 1996,1997
  16.  * Silicon Graphics Computer Systems, Inc.
  17.  *
  18.  * Permission to use, copy, modify, distribute and sell this software
  19.  * and its documentation for any purpose is hereby granted without fee,
  20.  * provided that the above copyright notice appear in all copies and
  21.  * that both that copyright notice and this permission notice appear
  22.  * in supporting documentation.  Silicon Graphics makes no
  23.  * representations about the suitability of this software for any
  24.  * purpose.  It is provided "as is" without express or implied warranty.
  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. #ifndef __SGI_STL_INTERNAL_QUEUE_H
  30. #define __SGI_STL_INTERNAL_QUEUE_H
  31. __STL_BEGIN_NAMESPACE
  32. #ifndef __STL_LIMITED_DEFAULT_TEMPLATES
  33. template <class _T, class _Sequence = deque<_T> >
  34. #else
  35. template <class _T, class _Sequence>
  36. #endif
  37. class queue {
  38.   friend bool operator== __STL_NULL_TMPL_ARGS (const queue&, const queue&);
  39.   friend bool operator< __STL_NULL_TMPL_ARGS (const queue&, const queue&);
  40. public:
  41.   typedef typename _Sequence::value_type      value_type;
  42.   typedef typename _Sequence::size_type       size_type;
  43.   typedef          _Sequence                  container_type;
  44.   typedef typename _Sequence::reference       reference;
  45.   typedef typename _Sequence::const_reference const_reference;
  46. protected:
  47.   _Sequence _M_c;
  48. public:
  49.   queue() : _M_c() {}
  50.   explicit queue(const _Sequence& __c) : _M_c(__c) {}
  51.   bool empty() const { return _M_c.empty(); }
  52.   size_type size() const { return _M_c.size(); }
  53.   reference front() { return _M_c.front(); }
  54.   const_reference front() const { return _M_c.front(); }
  55.   reference back() { return _M_c.back(); }
  56.   const_reference back() const { return _M_c.back(); }
  57.   void push(const value_type& __x) { _M_c.push_back(__x); }
  58.   void pop() { _M_c.pop_front(); }
  59. };
  60. template <class _T, class _Sequence>
  61. bool 
  62. operator==(const queue<_T, _Sequence>& __x, const queue<_T, _Sequence>& __y)
  63. {
  64.   return __x._M_c == __y._M_c;
  65. }
  66. template <class _T, class _Sequence>
  67. bool
  68. operator<(const queue<_T, _Sequence>& __x, const queue<_T, _Sequence>& __y)
  69. {
  70.   return __x._M_c < __y._M_c;
  71. }
  72. #ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER
  73. template <class _T, class _Sequence>
  74. bool
  75. operator!=(const queue<_T, _Sequence>& __x, const queue<_T, _Sequence>& __y)
  76. {
  77.   return !(__x == __y);
  78. }
  79. template <class _T, class _Sequence>
  80. bool 
  81. operator>(const queue<_T, _Sequence>& __x, const queue<_T, _Sequence>& __y)
  82. {
  83.   return __y < __x;
  84. }
  85. template <class _T, class _Sequence>
  86. bool 
  87. operator<=(const queue<_T, _Sequence>& __x, const queue<_T, _Sequence>& __y)
  88. {
  89.   return !(__y < __x);
  90. }
  91. template <class _T, class _Sequence>
  92. bool 
  93. operator>=(const queue<_T, _Sequence>& __x, const queue<_T, _Sequence>& __y)
  94. {
  95.   return !(__x < __y);
  96. }
  97. #endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */
  98. #ifndef __STL_LIMITED_DEFAULT_TEMPLATES
  99. template <class _T, class _Sequence = vector<_T>, 
  100.           class _Compare = less<typename _Sequence::value_type> >
  101. #else
  102. template <class _T, class _Sequence, class _Compare>
  103. #endif
  104. class  priority_queue {
  105. public:
  106.   typedef typename _Sequence::value_type      value_type;
  107.   typedef typename _Sequence::size_type       size_type;
  108.   typedef          _Sequence                  container_type;
  109.   typedef typename _Sequence::reference       reference;
  110.   typedef typename _Sequence::const_reference const_reference;
  111. protected:
  112.   _Sequence _M_c;
  113.   _Compare _M_comp;
  114. public:
  115.   priority_queue() : _M_c() {}
  116.   explicit priority_queue(const _Compare& __x) :  _M_c(), _M_comp(__x) {}
  117.   priority_queue(const _Compare& __x, const _Sequence& __s) 
  118.     : _M_c(__s), _M_comp(__x) 
  119.     { make_heap(_M_c.begin(), _M_c.end(), _M_comp); }
  120. #ifdef __STL_MEMBER_TEMPLATES
  121.   template <class _InputIterator>
  122.   priority_queue(_InputIterator __first, _InputIterator __last) 
  123.     : _M_c(__first, __last) { make_heap(_M_c.begin(), _M_c.end(), _M_comp); }
  124.   template <class _InputIterator>
  125.   priority_queue(_InputIterator __first, 
  126.                  _InputIterator __last, const _Compare& __x)
  127.     : _M_c(__first, __last), _M_comp(__x) 
  128.     { make_heap(_M_c.begin(), _M_c.end(), _M_comp); }
  129.   template <class _InputIterator>
  130.   priority_queue(_InputIterator __first, _InputIterator __last,
  131.                  const _Compare& __x, const _Sequence& __s)
  132.   : _M_c(__s), _M_comp(__x)
  133.   { 
  134.     _M_c.insert(_M_c.end(), __first, __last);
  135.     make_heap(_M_c.begin(), _M_c.end(), _M_comp);
  136.   }
  137. #else /* __STL_MEMBER_TEMPLATES */
  138.   priority_queue(const value_type* __first, const value_type* __last) 
  139.     : _M_c(__first, __last) { make_heap(_M_c.begin(), _M_c.end(), _M_comp); }
  140.   priority_queue(const value_type* __first, const value_type* __last, 
  141.                  const _Compare& __x) 
  142.     : _M_c(__first, __last), _M_comp(__x)
  143.     { make_heap(_M_c.begin(), _M_c.end(), _M_comp); }
  144.   priority_queue(const value_type* __first, const value_type* __last, 
  145.                  const _Compare& __x, const _Sequence& __c)
  146.     : _M_c(__c), _M_comp(__x) 
  147.   { 
  148.     _M_c.insert(_M_c.end(), __first, __last);
  149.     make_heap(_M_c.begin(), _M_c.end(), _M_comp);
  150.   }
  151. #endif /* __STL_MEMBER_TEMPLATES */
  152.   bool empty() const { return _M_c.empty(); }
  153.   size_type size() const { return _M_c.size(); }
  154.   const_reference top() const { return _M_c.front(); }
  155.   void push(const value_type& __x) {
  156.     __STL_TRY {
  157.       _M_c.push_back(__x); 
  158.       push_heap(_M_c.begin(), _M_c.end(), _M_comp);
  159.     }
  160.     __STL_UNWIND(_M_c.clear());
  161.   }
  162.   void pop() {
  163.     __STL_TRY {
  164.       pop_heap(_M_c.begin(), _M_c.end(), _M_comp);
  165.       _M_c.pop_back();
  166.     }
  167.     __STL_UNWIND(_M_c.clear());
  168.   }
  169. };
  170. // no equality is provided
  171. __STL_END_NAMESPACE
  172. #endif /* __SGI_STL_INTERNAL_QUEUE_H */
  173. // Local Variables:
  174. // mode:C++
  175. // End: