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

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.  * Copyright (c) 1997
  15.  * Silicon Graphics Computer Systems, Inc.
  16.  *
  17.  * Permission to use, copy, modify, distribute and sell this software
  18.  * and its documentation for any purpose is hereby granted without fee,
  19.  * provided that the above copyright notice appear in all copies and
  20.  * that both that copyright notice and this permission notice appear
  21.  * in supporting documentation.  Silicon Graphics makes no
  22.  * representations about the suitability of this software for any
  23.  * purpose.  It is provided "as is" without express or implied warranty.
  24.  */
  25. /* NOTE: This is an internal header file, included by other STL headers.
  26.  *   You should not attempt to use it directly.
  27.  */
  28. #ifndef __SGI_STL_INTERNAL_HEAP_H
  29. #define __SGI_STL_INTERNAL_HEAP_H
  30. __STL_BEGIN_NAMESPACE
  31. #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
  32. #pragma set woff 1209
  33. #endif
  34. // Heap-manipulation functions: push_heap, pop_heap, make_heap, sort_heap.
  35. template <class _RandomAccessIterator, class _Distance, class _T>
  36. void 
  37. __push_heap(_RandomAccessIterator __first,
  38.             _Distance __holeIndex, _Distance __topIndex, _T __value)
  39. {
  40.   _Distance __parent = (__holeIndex - 1) / 2;
  41.   while (__holeIndex > __topIndex && *(__first + __parent) < __value) {
  42.     *(__first + __holeIndex) = *(__first + __parent);
  43.     __holeIndex = __parent;
  44.     __parent = (__holeIndex - 1) / 2;
  45.   }    
  46.   *(__first + __holeIndex) = __value;
  47. }
  48. template <class _RandomAccessIterator, class _Distance, class _T>
  49. inline void 
  50. __push_heap_aux(_RandomAccessIterator __first,
  51.                 _RandomAccessIterator __last, _Distance*, _T*)
  52. {
  53.   __push_heap(__first, _Distance((__last - __first) - 1), _Distance(0), 
  54.               _T(*(__last - 1)));
  55. }
  56. template <class _RandomAccessIterator>
  57. inline void 
  58. push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
  59. {
  60.   __push_heap_aux(__first, __last,
  61.                   __DISTANCE_TYPE(__first), __VALUE_TYPE(__first));
  62. }
  63. template <class _RandomAccessIterator, class _Distance, class _T, 
  64.           class _Compare>
  65. void
  66. __push_heap(_RandomAccessIterator __first, _Distance __holeIndex,
  67.             _Distance __topIndex, _T __value, _Compare __comp)
  68. {
  69.   _Distance __parent = (__holeIndex - 1) / 2;
  70.   while (__holeIndex > __topIndex && __comp(*(__first + __parent), __value)) {
  71.     *(__first + __holeIndex) = *(__first + __parent);
  72.     __holeIndex = __parent;
  73.     __parent = (__holeIndex - 1) / 2;
  74.   }
  75.   *(__first + __holeIndex) = __value;
  76. }
  77. template <class _RandomAccessIterator, class _Compare,
  78.           class _Distance, class _T>
  79. inline void 
  80. __push_heap_aux(_RandomAccessIterator __first,
  81.                 _RandomAccessIterator __last, _Compare __comp,
  82.                 _Distance*, _T*) 
  83. {
  84.   __push_heap(__first, _Distance((__last - __first) - 1), _Distance(0), 
  85.               _T(*(__last - 1)), __comp);
  86. }
  87. template <class _RandomAccessIterator, class _Compare>
  88. inline void 
  89. push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
  90.           _Compare __comp)
  91. {
  92.   __push_heap_aux(__first, __last, __comp,
  93.                   __DISTANCE_TYPE(__first), __VALUE_TYPE(__first));
  94. }
  95. template <class _RandomAccessIterator, class _Distance, class _T>
  96. void 
  97. __adjust_heap(_RandomAccessIterator __first, _Distance __holeIndex,
  98.               _Distance __len, _T __value)
  99. {
  100.   _Distance __topIndex = __holeIndex;
  101.   _Distance __secondChild = 2 * __holeIndex + 2;
  102.   while (__secondChild < __len) {
  103.     if (*(__first + __secondChild) < *(__first + (__secondChild - 1)))
  104.       __secondChild--;
  105.     *(__first + __holeIndex) = *(__first + __secondChild);
  106.     __holeIndex = __secondChild;
  107.     __secondChild = 2 * (__secondChild + 1);
  108.   }
  109.   if (__secondChild == __len) {
  110.     *(__first + __holeIndex) = *(__first + (__secondChild - 1));
  111.     __holeIndex = __secondChild - 1;
  112.   }
  113.   __push_heap(__first, __holeIndex, __topIndex, __value);
  114. }
  115. template <class _RandomAccessIterator, class _T, class _Distance>
  116. inline void 
  117. __pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
  118.            _RandomAccessIterator __result, _T __value, _Distance*)
  119. {
  120.   *__result = *__first;
  121.   __adjust_heap(__first, _Distance(0), _Distance(__last - __first), __value);
  122. }
  123. template <class _RandomAccessIterator, class _T>
  124. inline void 
  125. __pop_heap_aux(_RandomAccessIterator __first, _RandomAccessIterator __last,
  126.                _T*)
  127. {
  128.   __pop_heap(__first, __last - 1, __last - 1, 
  129.              _T(*(__last - 1)), __DISTANCE_TYPE(__first));
  130. }
  131. template <class _RandomAccessIterator>
  132. inline void pop_heap(_RandomAccessIterator __first, 
  133.                      _RandomAccessIterator __last)
  134. {
  135.   __pop_heap_aux(__first, __last, __VALUE_TYPE(__first));
  136. }
  137. template <class _RandomAccessIterator, class _Distance,
  138.           class _T, class _Compare>
  139. void
  140. __adjust_heap(_RandomAccessIterator __first, _Distance __holeIndex,
  141.               _Distance __len, _T __value, _Compare __comp)
  142. {
  143.   _Distance __topIndex = __holeIndex;
  144.   _Distance __secondChild = 2 * __holeIndex + 2;
  145.   while (__secondChild < __len) {
  146.     if (__comp(*(__first + __secondChild), *(__first + (__secondChild - 1))))
  147.       __secondChild--;
  148.     *(__first + __holeIndex) = *(__first + __secondChild);
  149.     __holeIndex = __secondChild;
  150.     __secondChild = 2 * (__secondChild + 1);
  151.   }
  152.   if (__secondChild == __len) {
  153.     *(__first + __holeIndex) = *(__first + (__secondChild - 1));
  154.     __holeIndex = __secondChild - 1;
  155.   }
  156.   __push_heap(__first, __holeIndex, __topIndex, __value, __comp);
  157. }
  158. template <class _RandomAccessIterator, class _T, class _Compare, 
  159.           class _Distance>
  160. inline void 
  161. __pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
  162.            _RandomAccessIterator __result, _T __value, _Compare __comp,
  163.            _Distance*)
  164. {
  165.   *__result = *__first;
  166.   __adjust_heap(__first, _Distance(0), _Distance(__last - __first), 
  167.                 __value, __comp);
  168. }
  169. template <class _RandomAccessIterator, class _T, class _Compare>
  170. inline void 
  171. __pop_heap_aux(_RandomAccessIterator __first,
  172.                _RandomAccessIterator __last, _T*, _Compare __comp)
  173. {
  174.   __pop_heap(__first, __last - 1, __last - 1, _T(*(__last - 1)), __comp,
  175.              __DISTANCE_TYPE(__first));
  176. }
  177. template <class _RandomAccessIterator, class _Compare>
  178. inline void 
  179. pop_heap(_RandomAccessIterator __first,
  180.          _RandomAccessIterator __last, _Compare __comp)
  181. {
  182.     __pop_heap_aux(__first, __last, __VALUE_TYPE(__first), __comp);
  183. }
  184. template <class _RandomAccessIterator, class _T, class _Distance>
  185. void 
  186. __make_heap(_RandomAccessIterator __first,
  187.             _RandomAccessIterator __last, _T*, _Distance*)
  188. {
  189.   if (__last - __first < 2) return;
  190.   _Distance __len = __last - __first;
  191.   _Distance __parent = (__len - 2)/2;
  192.     
  193.   while (true) {
  194.     __adjust_heap(__first, __parent, __len, _T(*(__first + __parent)));
  195.     if (__parent == 0) return;
  196.     __parent--;
  197.   }
  198. }
  199. template <class _RandomAccessIterator>
  200. inline void 
  201. make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
  202. {
  203.   __make_heap(__first, __last,
  204.               __VALUE_TYPE(__first), __DISTANCE_TYPE(__first));
  205. }
  206. template <class _RandomAccessIterator, class _Compare,
  207.           class _T, class _Distance>
  208. void
  209. __make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
  210.             _Compare __comp, _T*, _Distance*)
  211. {
  212.   if (__last - __first < 2) return;
  213.   _Distance __len = __last - __first;
  214.   _Distance __parent = (__len - 2)/2;
  215.     
  216.   while (true) {
  217.     __adjust_heap(__first, __parent, __len, _T(*(__first + __parent)),
  218.                   __comp);
  219.     if (__parent == 0) return;
  220.     __parent--;
  221.   }
  222. }
  223. template <class _RandomAccessIterator, class _Compare>
  224. inline void 
  225. make_heap(_RandomAccessIterator __first, 
  226.           _RandomAccessIterator __last, _Compare __comp)
  227. {
  228.   __make_heap(__first, __last, __comp,
  229.               __VALUE_TYPE(__first), __DISTANCE_TYPE(__first));
  230. }
  231. template <class _RandomAccessIterator>
  232. void sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
  233. {
  234.   while (__last - __first > 1)
  235.     pop_heap(__first, __last--);
  236. }
  237. template <class _RandomAccessIterator, class _Compare>
  238. void 
  239. sort_heap(_RandomAccessIterator __first,
  240.           _RandomAccessIterator __last, _Compare __comp)
  241. {
  242.   while (__last - __first > 1)
  243.     pop_heap(__first, __last--, __comp);
  244. }
  245. #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
  246. #pragma reset woff 1209
  247. #endif
  248. __STL_END_NAMESPACE
  249. #endif /* __SGI_STL_INTERNAL_HEAP_H */
  250. // Local Variables:
  251. // mode:C++
  252. // End: