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

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
  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_ALGO_H
  30. #define __SGI_STL_INTERNAL_ALGO_H
  31. #include <stl_heap.h>
  32. __STL_BEGIN_NAMESPACE
  33. #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
  34. #pragma set woff 1209
  35. #endif
  36. // __median (an extension, not present in the C++ standard).
  37. template <class _T>
  38. inline const _T& __median(const _T& __a, const _T& __b, const _T& __c) {
  39.   if (__a < __b)
  40.     if (__b < __c)
  41.       return __b;
  42.     else if (__a < __c)
  43.       return __c;
  44.     else
  45.       return __a;
  46.   else if (__a < __c)
  47.     return __a;
  48.   else if (__b < __c)
  49.     return __c;
  50.   else
  51.     return __b;
  52. }
  53. template <class _T, class _Compare>
  54. inline const _T&
  55. __median(const _T& __a, const _T& __b, const _T& __c, _Compare __comp) {
  56.   if (__comp(__a, __b))
  57.     if (__comp(__b, __c))
  58.       return __b;
  59.     else if (__comp(__a, __c))
  60.       return __c;
  61.     else
  62.       return __a;
  63.   else if (__comp(__a, __c))
  64.     return __a;
  65.   else if (__comp(__b, __c))
  66.     return __c;
  67.   else
  68.     return __b;
  69. }
  70. // for_each.  Apply a function to every element of a range.
  71. template <class _InputIter, class _Function>
  72. _Function for_each(_InputIter __first, _InputIter __last, _Function __f) {
  73.   for ( ; __first != __last; ++__first)
  74.     __f(*__first);
  75.   return __f;
  76. }
  77. // find and find_if.
  78. template <class _InputIter, class _T>
  79. inline _InputIter find(_InputIter __first, _InputIter __last, const _T& __val) 
  80. {
  81.   while (__first != __last && *__first != __val)
  82.     ++__first;
  83.   return __first;
  84. }
  85. template <class _InputIter, class _Predicate>
  86. _InputIter find_if(_InputIter __first, _InputIter __last,
  87.                    _Predicate __pred) {
  88.   while (__first != __last && !__pred(*__first))
  89.     ++__first;
  90.   return __first;
  91. }
  92. // adjacent_find.
  93. template <class _ForwardIter>
  94. _ForwardIter adjacent_find(_ForwardIter __first, _ForwardIter __last) {
  95.   if (__first == __last)
  96.     return __last;
  97.   _ForwardIter __next = __first;
  98.   while(++__next != __last) {
  99.     if (*__first == *__next)
  100.       return __first;
  101.     __first = __next;
  102.   }
  103.   return __last;
  104. }
  105. template <class _ForwardIter, class _BinaryPredicate>
  106. _ForwardIter adjacent_find(_ForwardIter __first, _ForwardIter __last,
  107.                            _BinaryPredicate __binary_pred) {
  108.   if (__first == __last)
  109.     return __last;
  110.   _ForwardIter __next = __first;
  111.   while(++__next != __last) {
  112.     if (__binary_pred(*__first, *__next))
  113.       return __first;
  114.     __first = __next;
  115.   }
  116.   return __last;
  117. }
  118. // count and count_if.  There are two version of each, one whose return type
  119. // type is void and one (present only if we have partial specialization)
  120. // whose return type is iterator_traits<_InputIter>::difference_type.  The
  121. // C++ standard only has the latter version, but the former, which was present
  122. // in the HP STL, is retained for backward compatibility.
  123. template <class _InputIter, class _T, class _Size>
  124. void count(_InputIter __first, _InputIter __last, const _T& __value,
  125.            _Size& __n) {
  126.   for ( ; __first != __last; ++__first)
  127.     if (*__first == __value)
  128.       ++__n;
  129. }
  130. template <class _InputIter, class _Predicate, class _Size>
  131. void count_if(_InputIter __first, _InputIter __last, _Predicate __pred,
  132.               _Size& __n) {
  133.   for ( ; __first != __last; ++__first)
  134.     if (__pred(*__first))
  135.       ++__n;
  136. }
  137. #ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
  138. template <class _InputIter, class _T>
  139. typename iterator_traits<_InputIter>::difference_type
  140. count(_InputIter __first, _InputIter __last, const _T& __value) {
  141.   typename iterator_traits<_InputIter>::difference_type __n = 0;
  142.   for ( ; __first != __last; ++__first)
  143.     if (*__first == __value)
  144.       ++__n;
  145.   return __n;
  146. }
  147. template <class _InputIter, class _Predicate>
  148. typename iterator_traits<_InputIter>::difference_type
  149. count_if(_InputIter __first, _InputIter __last, _Predicate __pred) {
  150.   typename iterator_traits<_InputIter>::difference_type __n = 0;
  151.   for ( ; __first != __last; ++__first)
  152.     if (__pred(*__first))
  153.       ++__n;
  154.   return __n;
  155. }
  156. #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
  157. // search.
  158. template <class _ForwardIter1, class _ForwardIter2>
  159. _ForwardIter1 search(_ForwardIter1 __first1, _ForwardIter1 __last1,
  160.                      _ForwardIter2 __first2, _ForwardIter2 __last2) 
  161. {
  162.   // Test for empty ranges
  163.   if (__first1 == __last1 || __first2 == __last2)
  164.     return __first1;
  165.   // Test for a pattern of length 1.
  166.   _ForwardIter2 __tmp(__first2);
  167.   ++__tmp;
  168.   if (__tmp == __last2)
  169.     return find(__first1, __last1, *__first2);
  170.   // General case.
  171.   _ForwardIter2 __p1, __p;
  172.   __p1 = __first2; ++__p1;
  173.   _ForwardIter1 __current = __first1;
  174.   while (__first1 != __last1) {
  175.     __first1 = find(__first1, __last1, *__first2);
  176.     if (__first1 == __last1)
  177.       return __last1;
  178.     __p = __p1;
  179.     __current = __first1; 
  180.     if (++__current == __last1)
  181.       return __last1;
  182.     while (*__current == *__p) {
  183.       if (++__p == __last2)
  184.         return __first1;
  185.       if (++__current == __last1)
  186.         return __last1;
  187.     }
  188.     ++__first1;
  189.   }
  190.   return __first1;
  191. }
  192. template <class _ForwardIter1, class _ForwardIter2, class _BinaryPred>
  193. _ForwardIter1 search(_ForwardIter1 __first1, _ForwardIter1 __last1,
  194.                      _ForwardIter2 __first2, _ForwardIter2 __last2,
  195.                      _BinaryPred  __predicate) 
  196. {
  197.   // Test for empty ranges
  198.   if (__first1 == __last1 || __first2 == __last2)
  199.     return __first1;
  200.   // Test for a pattern of length 1.
  201.   _ForwardIter2 __tmp(__first2);
  202.   ++__tmp;
  203.   if (__tmp == __last2)
  204.     return find(__first1, __last1, *__first2);
  205.   // General case.
  206.   _ForwardIter2 __p1, __p;
  207.   __p1 = __first2; ++__p1;
  208.   _ForwardIter1 __current = __first1;
  209.   while (__first1 != __last1) {
  210.     while (__first1 != __last1) {
  211.       if (__predicate(*__first1, *__first2))
  212.         break;
  213.       ++__first1;
  214.     }
  215.     while (__first1 != __last1 && !__predicate(*__first1, *__first2))
  216.       ++__first1;
  217.     if (__first1 == __last1)
  218.       return __last1;
  219.     __p = __p1;
  220.     __current = __first1; 
  221.     if (++__current == __last1) return __last1;
  222.     while (__predicate(*__current, *__p)) {
  223.       if (++__p == __last2)
  224.         return __first1;
  225.       if (++__current == __last1)
  226.         return __last1;
  227.     }
  228.     ++__first1;
  229.   }
  230.   return __first1;
  231. }
  232. // search_n.  Search for __count consecutive copies of __val.
  233. template <class _ForwardIter, class _Integer, class _T>
  234. _ForwardIter search_n(_ForwardIter __first, _ForwardIter __last,
  235.                       _Integer __count, const _T& __val) {
  236.   if (__count <= 0)
  237.     return __first;
  238.   else {
  239.     __first = find(__first, __last, __val);
  240.     while (__first != __last) {
  241.       _Integer __n = __count - 1;
  242.       _ForwardIter __i = __first;
  243.       ++__i;
  244.       while (__i != __last && __n != 0 && *__i == __val) {
  245.         ++__i;
  246.         --__n;
  247.       }
  248.       if (__n == 0)
  249.         return __first;
  250.       else
  251.         __first = find(__i, __last, __val);
  252.     }
  253.     return __last;
  254.   }
  255. }
  256. template <class _ForwardIter, class _Integer, class _T, class _BinaryPred>
  257. _ForwardIter search_n(_ForwardIter __first, _ForwardIter __last,
  258.                       _Integer __count, const _T& __val,
  259.                       _BinaryPred __binary_pred) {
  260.   if (__count <= 0)
  261.     return __first;
  262.   else {
  263.     while (__first != __last) {
  264.       if (__binary_pred(*__first, __val))
  265.         break;
  266.       ++__first;
  267.     }
  268.     while (__first != __last) {
  269.       _Integer __n = __count - 1;
  270.       _ForwardIter __i = __first;
  271.       ++__i;
  272.       while (__i != __last && __n != 0 && __binary_pred(*__i, __val)) {
  273.         ++__i;
  274.         --__n;
  275.       }
  276.       if (__n == 0)
  277.         return __first;
  278.       else {
  279.         while (__i != __last) {
  280.           if (__binary_pred(*__i, __val))
  281.             break;
  282.           ++__i;
  283.         }
  284.         __first = __i;
  285.       }
  286.     }
  287.     return __last;
  288.   }
  289. // swap_ranges
  290. template <class _ForwardIter1, class _ForwardIter2>
  291. _ForwardIter2 swap_ranges(_ForwardIter1 __first1, _ForwardIter1 __last1,
  292.                           _ForwardIter2 __first2) {
  293.   for ( ; __first1 != __last1; ++__first1, ++__first2)
  294.     iter_swap(__first1, __first2);
  295.   return __first2;
  296. }
  297. // transform
  298. template <class _InputIter, class _OutputIter, class _UnaryOperation>
  299. _OutputIter transform(_InputIter __first, _InputIter __last,
  300.                       _OutputIter __result, _UnaryOperation __opr) {
  301.   for ( ; __first != __last; ++__first, ++__result)
  302.     *__result = __opr(*__first);
  303.   return __result;
  304. }
  305. template <class _InputIter1, class _InputIter2, class _OutputIter,
  306.           class _BinaryOperation>
  307. _OutputIter transform(_InputIter1 __first1, _InputIter1 __last1,
  308.                       _InputIter2 __first2, _OutputIter __result,
  309.                       _BinaryOperation __binary_op) {
  310.   for ( ; __first1 != __last1; ++__first1, ++__first2, ++__result)
  311.     *__result = __binary_op(*__first1, *__first2);
  312.   return __result;
  313. }
  314. // replace, replace_if, replace_copy, replace_copy_if
  315. template <class _ForwardIter, class _T>
  316. void replace(_ForwardIter __first, _ForwardIter __last,
  317.              const _T& __old_value, const _T& __new_value) {
  318.   for ( ; __first != __last; ++__first)
  319.     if (*__first == __old_value)
  320.       *__first = __new_value;
  321. }
  322. template <class _ForwardIter, class _Predicate, class _T>
  323. void replace_if(_ForwardIter __first, _ForwardIter __last,
  324.                 _Predicate __pred, const _T& __new_value) {
  325.   for ( ; __first != __last; ++__first)
  326.     if (__pred(*__first))
  327.       *__first = __new_value;
  328. }
  329. template <class _InputIter, class _OutputIter, class _T>
  330. _OutputIter replace_copy(_InputIter __first, _InputIter __last,
  331.                          _OutputIter __result,
  332.                          const _T& __old_value, const _T& __new_value) {
  333.   for ( ; __first != __last; ++__first, ++__result)
  334.     *__result = *__first == __old_value ? __new_value : *__first;
  335.   return __result;
  336. }
  337. template <class Iterator, class _OutputIter, class _Predicate, class _T>
  338. _OutputIter replace_copy_if(Iterator __first, Iterator __last,
  339.                             _OutputIter __result,
  340.                             _Predicate __pred, const _T& __new_value) {
  341.   for ( ; __first != __last; ++__first, ++__result)
  342.     *__result = __pred(*__first) ? __new_value : *__first;
  343.   return __result;
  344. }
  345. // generate and generate_n
  346. template <class _ForwardIter, class _Generator>
  347. void generate(_ForwardIter __first, _ForwardIter __last, _Generator __gen) {
  348.   for ( ; __first != __last; ++__first)
  349.     *__first = __gen();
  350. }
  351. template <class _OutputIter, class _Size, class _Generator>
  352. _OutputIter generate_n(_OutputIter __first, _Size __n, _Generator __gen) {
  353.   for ( ; __n > 0; --__n, ++__first)
  354.     *__first = __gen();
  355.   return __first;
  356. }
  357. // remove, remove_if, remove_copy, remove_copy_if
  358. template <class _InputIter, class _OutputIter, class _T>
  359. _OutputIter remove_copy(_InputIter __first, _InputIter __last,
  360.                         _OutputIter __result, const _T& __value) {
  361.   for ( ; __first != __last; ++__first)
  362.     if (*__first != __value) {
  363.       *__result = *__first;
  364.       ++__result;
  365.     }
  366.   return __result;
  367. }
  368. template <class _InputIter, class _OutputIter, class _Predicate>
  369. _OutputIter remove_copy_if(_InputIter __first, _InputIter __last,
  370.                            _OutputIter __result, _Predicate __pred) {
  371.   for ( ; __first != __last; ++__first)
  372.     if (!__pred(*__first)) {
  373.       *__result = *__first;
  374.       ++__result;
  375.     }
  376.   return __result;
  377. }
  378. template <class _ForwardIter, class _T>
  379. _ForwardIter remove(_ForwardIter __first, _ForwardIter __last,
  380.                     const _T& __value) {
  381.   __first = find(__first, __last, __value);
  382.   _ForwardIter __i = __first;
  383.   return __first == __last ? __first 
  384.                            : remove_copy(++__i, __last, __first, __value);
  385. }
  386. template <class _ForwardIter, class _Predicate>
  387. _ForwardIter remove_if(_ForwardIter __first, _ForwardIter __last,
  388.                        _Predicate __pred) {
  389.   __first = find_if(__first, __last, __pred);
  390.   _ForwardIter __i = __first;
  391.   return __first == __last ? __first 
  392.                            : remove_copy_if(++__i, __last, __first, __pred);
  393. }
  394. // unique and unique_copy
  395. template <class _InputIter, class _OutputIter, class _T>
  396. _OutputIter __unique_copy(_InputIter __first, _InputIter __last,
  397.                           _OutputIter __result, _T*) {
  398.   _T __value = *__first;
  399.   *__result = __value;
  400.   while (++__first != __last)
  401.     if (__value != *__first) {
  402.       __value = *__first;
  403.       *++__result = __value;
  404.     }
  405.   return ++__result;
  406. }
  407. template <class _InputIter, class _OutputIter>
  408. inline _OutputIter __unique_copy(_InputIter __first, _InputIter __last,
  409.                                  _OutputIter __result, 
  410.                                  output_iterator_tag) {
  411.   return __unique_copy(__first, __last, __result, __VALUE_TYPE(__first));
  412. }
  413. template <class _InputIter, class _ForwardIter>
  414. _ForwardIter __unique_copy(_InputIter __first, _InputIter __last,
  415.                            _ForwardIter __result, forward_iterator_tag) {
  416.   *__result = *__first;
  417.   while (++__first != __last)
  418.     if (*__result != *__first) *++__result = *__first;
  419.   return ++__result;
  420. }
  421. template <class _InputIter, class _OutputIter>
  422. inline _OutputIter unique_copy(_InputIter __first, _InputIter __last,
  423.                                _OutputIter __result) {
  424.   if (__first == __last) return __result;
  425.   return __unique_copy(__first, __last, __result,
  426.                        __ITERATOR_CATEGORY(__result));
  427. }
  428. template <class _InputIter, class _OutputIter, class _BinaryPredicate,
  429.           class _T>
  430. _OutputIter __unique_copy(_InputIter __first, _InputIter __last,
  431.                           _OutputIter __result,
  432.                           _BinaryPredicate __binary_pred, _T*) {
  433.   _T __value = *__first;
  434.   *__result = __value;
  435.   while (++__first != __last)
  436.     if (!__binary_pred(__value, *__first)) {
  437.       __value = *__first;
  438.       *++__result = __value;
  439.     }
  440.   return ++__result;
  441. }
  442. template <class _InputIter, class _OutputIter, class _BinaryPredicate>
  443. inline _OutputIter __unique_copy(_InputIter __first, _InputIter __last,
  444.                                  _OutputIter __result,
  445.                                  _BinaryPredicate __binary_pred,
  446.                                  output_iterator_tag) {
  447.   return __unique_copy(__first, __last, __result, __binary_pred,
  448.                        __VALUE_TYPE(__first));
  449. }
  450. template <class _InputIter, class _ForwardIter, class _BinaryPredicate>
  451. _ForwardIter __unique_copy(_InputIter __first, _InputIter __last,
  452.                            _ForwardIter __result, 
  453.                            _BinaryPredicate __binary_pred,
  454.                            forward_iterator_tag) {
  455.   *__result = *__first;
  456.   while (++__first != __last)
  457.     if (!__binary_pred(*__result, *__first)) *++__result = *__first;
  458.   return ++__result;
  459. }
  460. template <class _InputIter, class _OutputIter, class _BinaryPredicate>
  461. inline _OutputIter unique_copy(_InputIter __first, _InputIter __last,
  462.                                _OutputIter __result,
  463.                                _BinaryPredicate __binary_pred) {
  464.   if (__first == __last) return __result;
  465.   return __unique_copy(__first, __last, __result, __binary_pred,
  466.                        __ITERATOR_CATEGORY(__result));
  467. }
  468. template <class _ForwardIter>
  469. _ForwardIter unique(_ForwardIter __first, _ForwardIter __last) {
  470.   __first = adjacent_find(__first, __last);
  471.   return unique_copy(__first, __last, __first);
  472. }
  473. template <class _ForwardIter, class _BinaryPredicate>
  474. _ForwardIter unique(_ForwardIter __first, _ForwardIter __last,
  475.                     _BinaryPredicate __binary_pred) {
  476.   __first = adjacent_find(__first, __last, __binary_pred);
  477.   return unique_copy(__first, __last, __first, __binary_pred);
  478. }
  479. // reverse and reverse_copy, and their auxiliary functions
  480. template <class _BidirectionalIter>
  481. void __reverse(_BidirectionalIter __first, _BidirectionalIter __last, 
  482.                bidirectional_iterator_tag) {
  483.   while (true)
  484.     if (__first == __last || __first == --__last)
  485.       return;
  486.     else
  487.       iter_swap(__first++, __last);
  488. }
  489. template <class _RandomAccessIter>
  490. void __reverse(_RandomAccessIter __first, _RandomAccessIter __last,
  491.                random_access_iterator_tag) {
  492.   while (__first < __last)
  493.     iter_swap(__first++, --__last);
  494. }
  495. template <class _BidirectionalIter>
  496. inline void reverse(_BidirectionalIter __first, _BidirectionalIter __last) {
  497.   __reverse(__first, __last, __ITERATOR_CATEGORY(__first));
  498. }
  499. template <class _BidirectionalIter, class _OutputIter>
  500. _OutputIter reverse_copy(_BidirectionalIter __first,
  501.                             _BidirectionalIter __last,
  502.                             _OutputIter __result) {
  503.   while (__first != __last) {
  504.     --__last;
  505.     *__result = *__last;
  506.     ++__result;
  507.   }
  508.   return __result;
  509. }
  510. // rotate and rotate_copy, and their auxiliary functions
  511. template <class _EuclideanRingElement>
  512. _EuclideanRingElement __gcd(_EuclideanRingElement __m,
  513.                             _EuclideanRingElement __n)
  514. {
  515.   while (__n != 0) {
  516.     _EuclideanRingElement __t = __m % __n;
  517.     __m = __n;
  518.     __n = __t;
  519.   }
  520.   return __m;
  521. }
  522. template <class _ForwardIter, class _Distance>
  523. _ForwardIter __rotate(_ForwardIter __first,
  524.                       _ForwardIter __middle,
  525.                       _ForwardIter __last,
  526.                       _Distance*,
  527.                       forward_iterator_tag) {
  528.   if (__first == __middle)
  529.     return __last;
  530.   if (__last  == __middle)
  531.     return __first;
  532.   _ForwardIter __first2 = __middle;
  533.   do {
  534.     swap(*__first++, *__first2++);
  535.     if (__first == __middle)
  536.       __middle = __first2;
  537.   } while (__first2 != __last);
  538.   _ForwardIter __new_middle = __first;
  539.   __first2 = __middle;
  540.   while (__first2 != __last) {
  541.     swap (*__first++, *__first2++);
  542.     if (__first == __middle)
  543.       __middle = __first2;
  544.     else if (__first2 == __last)
  545.       __first2 = __middle;
  546.   }
  547.   return __new_middle;
  548. }
  549. template <class _BidirectionalIter, class _Distance>
  550. _BidirectionalIter __rotate(_BidirectionalIter __first,
  551.                             _BidirectionalIter __middle,
  552.                             _BidirectionalIter __last,
  553.                             _Distance*,
  554.                             bidirectional_iterator_tag) {
  555.   if (__first == __middle)
  556.     return __last;
  557.   if (__last  == __middle)
  558.     return __first;
  559.   __reverse(__first,  __middle, bidirectional_iterator_tag());
  560.   __reverse(__middle, __last,   bidirectional_iterator_tag());
  561.   while (__first != __middle && __middle != __last)
  562.     swap (*__first++, *--__last);
  563.   if (__first == __middle) {
  564.     __reverse(__middle, __last,   bidirectional_iterator_tag());
  565.     return __last;
  566.   }
  567.   else {
  568.     __reverse(__first,  __middle, bidirectional_iterator_tag());
  569.     return __first;
  570.   }
  571. }
  572. template <class _RandomAccessIter, class _Distance, class _T>
  573. _RandomAccessIter __rotate(_RandomAccessIter __first,
  574.                            _RandomAccessIter __middle,
  575.                            _RandomAccessIter __last,
  576.                            _Distance *, _T *) {
  577.   _Distance __n = __last   - __first;
  578.   _Distance __k = __middle - __first;
  579.   _Distance __l = __n - __k;
  580.   _RandomAccessIter __result = __first + (__last - __middle);
  581.   if (__k == __l) {
  582.     swap_ranges(__first, __middle, __middle);
  583.     return __result;
  584.   }
  585.   _Distance __d = __gcd(__n, __k);
  586.   for (_Distance __i = 0; __i < __d; __i++) {
  587.     _T __tmp = *__first;
  588.     _RandomAccessIter __p = __first;
  589.     if (__k < __l) {
  590.       for (_Distance __j = 0; __j < __l/__d; __j++) {
  591.         if (__p > __first + __l) {
  592.           *__p = *(__p - __l);
  593.           __p -= __l;
  594.         }
  595.         *__p = *(__p + __k);
  596.         __p += __k;
  597.       }
  598.     }
  599.     else {
  600.       for (_Distance __j = 0; __j < __k/__d - 1; __j ++) {
  601.         if (__p < __last - __k) {
  602.           *__p = *(__p + __k);
  603.           __p += __k;
  604.         }
  605.         *__p = * (__p - __l);
  606.         __p -= __l;
  607.       }
  608.     }
  609.     *__p = __tmp;
  610.     ++__first;
  611.   }
  612.   return __result;
  613. }
  614. template <class _ForwardIter>
  615. inline _ForwardIter rotate(_ForwardIter __first, _ForwardIter __middle,
  616.                            _ForwardIter __last) {
  617.   return __rotate(__first, __middle, __last,
  618.                   __DISTANCE_TYPE(__first),
  619.                   __ITERATOR_CATEGORY(__first));
  620. }
  621. template <class _ForwardIter, class _OutputIter>
  622. _OutputIter rotate_copy(_ForwardIter __first, _ForwardIter __middle,
  623.                             _ForwardIter __last, _OutputIter __result) {
  624.   return copy(__first, __middle, copy(__middle, __last, __result));
  625. }
  626. // Return a random number in the range [0, __n).  This function encapsulates
  627. // whether we're using rand (part of the standard C library) or lrand48
  628. // (not standard, but a much better choice whenever it's available).
  629. template <class _Distance>
  630. inline _Distance __random_number(_Distance __n) {
  631. #ifdef __STL_NO_DRAND48
  632.   return rand() % __n;
  633. #else
  634.   return lrand48() % __n;
  635. #endif
  636. }
  637. // random_shuffle
  638. template <class _RandomAccessIter>
  639. inline void random_shuffle(_RandomAccessIter __first,
  640.                            _RandomAccessIter __last) {
  641.   if (__first == __last) return;
  642.   for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
  643.     iter_swap(__i, __first + __random_number((__i - __first) + 1));
  644. }
  645. template <class _RandomAccessIter, class _RandomNumberGenerator>
  646. void random_shuffle(_RandomAccessIter __first, _RandomAccessIter __last,
  647.                     _RandomNumberGenerator& __rand) {
  648.   if (__first == __last) return;
  649.   for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
  650.     iter_swap(__i, __first + __rand((__i - __first) + 1));
  651. }
  652. // random_sample and random_sample_n (extensions, not part of the standard).
  653. template <class _ForwardIter, class _OutputIter, class _Distance>
  654. _OutputIter random_sample_n(_ForwardIter __first, _ForwardIter __last,
  655.                             _OutputIter __out, const _Distance __n)
  656. {
  657.   _Distance __remaining = 0;
  658.   distance(__first, __last, __remaining);
  659.   _Distance __m = min(__n, __remaining);
  660.   while (__m > 0) {
  661.     if (__random_number(__remaining) < __m) {
  662.       *__out = *__first;
  663.       ++__out;
  664.       --__m;
  665.     }
  666.     --__remaining;
  667.     ++__first;
  668.   }
  669.   return __out;
  670. }
  671. template <class _ForwardIter, class _OutputIter, class _Distance,
  672.           class _RandomNumberGenerator>
  673. _OutputIter random_sample_n(_ForwardIter __first, _ForwardIter __last,
  674.                             _OutputIter __out, const _Distance __n,
  675.                             _RandomNumberGenerator& __rand)
  676. {
  677.   _Distance __remaining = 0;
  678.   distance(__first, __last, __remaining);
  679.   _Distance __m = min(__n, __remaining);
  680.   while (__m > 0) {
  681.     if (__rand(__remaining) < __m) {
  682.       *__out = *__first;
  683.       ++__out;
  684.       --__m;
  685.     }
  686.     --__remaining;
  687.     ++__first;
  688.   }
  689.   return __out;
  690. }
  691. template <class _InputIter, class _RandomAccessIter, class _Distance>
  692. _RandomAccessIter __random_sample(_InputIter __first, _InputIter __last,
  693.                                   _RandomAccessIter __out,
  694.                                   const _Distance __n)
  695. {
  696.   _Distance __m = 0;
  697.   _Distance __t = __n;
  698.   for ( ; __first != __last && __m < __n; ++__m, ++__first) 
  699.     __out[__m] = *__first;
  700.   while (__first != __last) {
  701.     ++__t;
  702.     _Distance __M = __random_number(__t);
  703.     if (__M < __n)
  704.       __out[__M] = *__first;
  705.     ++__first;
  706.   }
  707.   return __out + __m;
  708. }
  709. template <class _InputIter, class _RandomAccessIter,
  710.           class _RandomNumberGenerator, class _Distance>
  711. _RandomAccessIter __random_sample(_InputIter __first, _InputIter __last,
  712.                                   _RandomAccessIter __out,
  713.                                   _RandomNumberGenerator& __rand,
  714.                                   const _Distance __n)
  715. {
  716.   _Distance __m = 0;
  717.   _Distance __t = __n;
  718.   for ( ; __first != __last && __m < __n; ++__m, ++__first)
  719.     __out[__m] = *__first;
  720.   while (__first != __last) {
  721.     ++__t;
  722.     _Distance __M = __rand(__t);
  723.     if (__M < __n)
  724.       __out[__M] = *__first;
  725.     ++__first;
  726.   }
  727.   return __out + __m;
  728. }
  729. template <class _InputIter, class _RandomAccessIter>
  730. inline _RandomAccessIter
  731. random_sample(_InputIter __first, _InputIter __last,
  732.               _RandomAccessIter __out_first, _RandomAccessIter __out_last) 
  733. {
  734.   return __random_sample(__first, __last,
  735.                          __out_first, __out_last - __out_first);
  736. }
  737. template <class _InputIter, class _RandomAccessIter, 
  738.           class _RandomNumberGenerator>
  739. inline _RandomAccessIter
  740. random_sample(_InputIter __first, _InputIter __last,
  741.               _RandomAccessIter __out_first, _RandomAccessIter __out_last,
  742.               _RandomNumberGenerator& __rand) 
  743. {
  744.   return __random_sample(__first, __last,
  745.                          __out_first, __rand,
  746.                          __out_last - __out_first);
  747. }
  748. // partition, stable_partition, and their auxiliary functions
  749. template <class _ForwardIter, class _Predicate>
  750. _ForwardIter __partition(_ForwardIter __first,
  751.          _ForwardIter __last,
  752.  _Predicate   __pred,
  753.  forward_iterator_tag) {
  754.   while (__first != __last && __pred(*__first)) ++__first;
  755.   if (__first == __last) return __first;
  756.   _ForwardIter __mid = __first;
  757.   while (__mid != __last && !__pred(*__mid)) ++__mid;
  758.   if (__mid == __last) return __first;
  759.   do {
  760.     swap(*__first++, *__mid);
  761.     while (__mid != __last && !__pred(*__mid)) ++__mid;
  762.   }  while (__mid != __last);
  763.   return __first;
  764. }
  765. template <class _BidirectionalIter, class _Predicate>
  766. _BidirectionalIter __partition(_BidirectionalIter __first,
  767.                                _BidirectionalIter __last,
  768.        _Predicate __pred,
  769.        bidirectional_iterator_tag) {
  770.   while (true) {
  771.     while (true)
  772.       if (__first == __last)
  773.         return __first;
  774.       else if (__pred(*__first))
  775.         ++__first;
  776.       else
  777.         break;
  778.     --__last;
  779.     while (true)
  780.       if (__first == __last)
  781.         return __first;
  782.       else if (!__pred(*__last))
  783.         --__last;
  784.       else
  785.         break;
  786.     iter_swap(__first, __last);
  787.     ++__first;
  788.   }
  789. }
  790. template <class _ForwardIter, class _Predicate>
  791. inline _ForwardIter partition(_ForwardIter __first,
  792.           _ForwardIter __last,
  793.       _Predicate   __pred) {
  794.   return __partition(__first, __last, __pred, __ITERATOR_CATEGORY(__first));
  795. }
  796. template <class _ForwardIter, class _Predicate, class _Distance>
  797. _ForwardIter __inplace_stable_partition(_ForwardIter __first,
  798.                                         _ForwardIter __last,
  799.                                         _Predicate __pred, _Distance __len) {
  800.   if (__len == 1)
  801.     return __pred(*__first) ? __last : __first;
  802.   _ForwardIter __middle = __first;
  803.   advance(__middle, __len / 2);
  804.   return rotate(__inplace_stable_partition(__first, __middle, __pred, 
  805.                                            __len / 2),
  806.                 __middle,
  807.                 __inplace_stable_partition(__middle, __last, __pred,
  808.                                            __len - __len / 2));
  809. }
  810. template <class _ForwardIter, class _Pointer, class _Predicate, 
  811.           class _Distance>
  812. _ForwardIter __stable_partition_adaptive(_ForwardIter __first,
  813.                                          _ForwardIter __last,
  814.                                          _Predicate __pred, _Distance __len,
  815.                                          _Pointer __buffer,
  816.                                          _Distance __buffer_size) 
  817. {
  818.   if (__len <= __buffer_size) {
  819.     _ForwardIter __result1 = __first;
  820.     _Pointer __result2 = __buffer;
  821.     for ( ; __first != __last ; ++__first)
  822.       if (__pred(*__first)) {
  823.         *__result1 = *__first;
  824.         ++__result1;
  825.       }
  826.       else {
  827.         *__result2 = *__first;
  828.         ++__result2;
  829.       }
  830.     copy(__buffer, __result2, __result1);
  831.     return __result1;
  832.   }
  833.   else {
  834.     _ForwardIter __middle = __first;
  835.     advance(__middle, __len / 2);
  836.     return __rotate(__stable_partition_adaptive(
  837.                           __first, __middle, __pred,
  838.                           __len / 2, __buffer, __buffer_size),
  839.                     __middle,
  840.                     __stable_partition_adaptive(
  841.                           __middle, __last, __pred,
  842.                           __len - __len / 2, __buffer, __buffer_size));
  843.   }
  844. }
  845. template <class _ForwardIter, class _Predicate, class _T, class _Distance>
  846. inline _ForwardIter __stable_partition_aux(_ForwardIter __first,
  847.                                            _ForwardIter __last, 
  848.                                            _Predicate __pred, _T*, _Distance*)
  849. {
  850.   _Temporary_buffer<_ForwardIter, _T> __buf(__first, __last);
  851.   if (__buf.size() > 0)
  852.     return __stable_partition_adaptive(__first, __last, __pred,
  853.                                        _Distance(__buf.requested_size()),
  854.                                        __buf.begin(), __buf.size());
  855.   else
  856.     return __inplace_stable_partition(__first, __last, __pred, 
  857.                                       _Distance(__buf.requested_size()));
  858. }
  859. template <class _ForwardIter, class _Predicate>
  860. inline _ForwardIter stable_partition(_ForwardIter __first,
  861.                                      _ForwardIter __last, 
  862.                                      _Predicate __pred) {
  863.   if (__first == __last)
  864.     return __first;
  865.   else
  866.     return __stable_partition_aux(__first, __last, __pred,
  867.                                   __VALUE_TYPE(__first),
  868.                                   __DISTANCE_TYPE(__first));
  869. }
  870. template <class _RandomAccessIter, class _T>
  871. _RandomAccessIter __unguarded_partition(_RandomAccessIter __first, 
  872.                                         _RandomAccessIter __last, 
  873.                                         _T __pivot) 
  874. {
  875.   while (true) {
  876.     while (*__first < __pivot)
  877.       ++__first;
  878.     --__last;
  879.     while (__pivot < *__last)
  880.       --__last;
  881.     if (!(__first < __last))
  882.       return __first;
  883.     iter_swap(__first, __last);
  884.     ++__first;
  885.   }
  886. }    
  887. template <class _RandomAccessIter, class _T, class _Compare>
  888. _RandomAccessIter __unguarded_partition(_RandomAccessIter __first, 
  889.                                         _RandomAccessIter __last, 
  890.                                         _T __pivot, _Compare __comp) 
  891. {
  892.   while (true) {
  893.     while (__comp(*__first, __pivot))
  894.       ++__first;
  895.     --__last;
  896.     while (__comp(__pivot, *__last))
  897.       --__last;
  898.     if (!(__first < __last))
  899.       return __first;
  900.     iter_swap(__first, __last);
  901.     ++__first;
  902.   }
  903. }
  904. const int __stl_threshold = 16;
  905. // sort() and its auxiliary functions. 
  906. template <class _RandomAccessIter, class _T>
  907. void __unguarded_linear_insert(_RandomAccessIter __last, _T __val) {
  908.   _RandomAccessIter __next = __last;
  909.   --__next;
  910.   while (__val < *__next) {
  911.     *__last = *__next;
  912.     __last = __next;
  913.     --__next;
  914.   }
  915.   *__last = __val;
  916. }
  917. template <class _RandomAccessIter, class _T, class _Compare>
  918. void __unguarded_linear_insert(_RandomAccessIter __last, _T __val, 
  919.                                _Compare __comp) {
  920.   _RandomAccessIter __next = __last;
  921.   --__next;  
  922.   while (__comp(__val, *__next)) {
  923.     *__last = *__next;
  924.     __last = __next;
  925.     --__next;
  926.   }
  927.   *__last = __val;
  928. }
  929. template <class _RandomAccessIter, class _T>
  930. inline void __linear_insert(_RandomAccessIter __first, 
  931.                             _RandomAccessIter __last, _T*) {
  932.   _T __val = *__last;
  933.   if (__val < *__first) {
  934.     copy_backward(__first, __last, __last + 1);
  935.     *__first = __val;
  936.   }
  937.   else
  938.     __unguarded_linear_insert(__last, __val);
  939. }
  940. template <class _RandomAccessIter, class _T, class _Compare>
  941. inline void __linear_insert(_RandomAccessIter __first, 
  942.                             _RandomAccessIter __last, _T*, _Compare __comp) {
  943.   _T __val = *__last;
  944.   if (__comp(__val, *__first)) {
  945.     copy_backward(__first, __last, __last + 1);
  946.     *__first = __val;
  947.   }
  948.   else
  949.     __unguarded_linear_insert(__last, __val, __comp);
  950. }
  951. template <class _RandomAccessIter>
  952. void __insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last) {
  953.   if (__first == __last) return; 
  954.   for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
  955.     __linear_insert(__first, __i, __VALUE_TYPE(__first));
  956. }
  957. template <class _RandomAccessIter, class _Compare>
  958. void __insertion_sort(_RandomAccessIter __first,
  959.                       _RandomAccessIter __last, _Compare __comp) {
  960.   if (__first == __last) return;
  961.   for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
  962.     __linear_insert(__first, __i, __VALUE_TYPE(__first), __comp);
  963. }
  964. template <class _RandomAccessIter, class _T>
  965. void __unguarded_insertion_sort_aux(_RandomAccessIter __first, 
  966.                                     _RandomAccessIter __last, _T*) {
  967.   for (_RandomAccessIter __i = __first; __i != __last; ++__i)
  968.     __unguarded_linear_insert(__i, _T(*__i));
  969. }
  970. template <class _RandomAccessIter>
  971. inline void __unguarded_insertion_sort(_RandomAccessIter __first, 
  972.                                 _RandomAccessIter __last) {
  973.   __unguarded_insertion_sort_aux(__first, __last, __VALUE_TYPE(__first));
  974. }
  975. template <class _RandomAccessIter, class _T, class _Compare>
  976. void __unguarded_insertion_sort_aux(_RandomAccessIter __first, 
  977.                                     _RandomAccessIter __last,
  978.                                     _T*, _Compare __comp) {
  979.   for (_RandomAccessIter __i = __first; __i != __last; ++__i)
  980.     __unguarded_linear_insert(__i, _T(*__i), __comp);
  981. }
  982. template <class _RandomAccessIter, class _Compare>
  983. inline void __unguarded_insertion_sort(_RandomAccessIter __first, 
  984.                                        _RandomAccessIter __last,
  985.                                        _Compare __comp) {
  986.   __unguarded_insertion_sort_aux(__first, __last, __VALUE_TYPE(__first),
  987.                                  __comp);
  988. }
  989. template <class _RandomAccessIter>
  990. void __final_insertion_sort(_RandomAccessIter __first, 
  991.                             _RandomAccessIter __last) {
  992.   if (__last - __first > __stl_threshold) {
  993.     __insertion_sort(__first, __first + __stl_threshold);
  994.     __unguarded_insertion_sort(__first + __stl_threshold, __last);
  995.   }
  996.   else
  997.     __insertion_sort(__first, __last);
  998. }
  999. template <class _RandomAccessIter, class _Compare>
  1000. void __final_insertion_sort(_RandomAccessIter __first, 
  1001.                             _RandomAccessIter __last, _Compare __comp) {
  1002.   if (__last - __first > __stl_threshold) {
  1003.     __insertion_sort(__first, __first + __stl_threshold, __comp);
  1004.     __unguarded_insertion_sort(__first + __stl_threshold, __last, __comp);
  1005.   }
  1006.   else
  1007.     __insertion_sort(__first, __last, __comp);
  1008. }
  1009. template <class _Size>
  1010. inline _Size __lg(_Size __n) {
  1011.   _Size __k;
  1012.   for (__k = 0; __n != 1; __n >>= 1) ++__k;
  1013.   return __k;
  1014. }
  1015. template <class _RandomAccessIter, class _T, class _Size>
  1016. void __introsort_loop(_RandomAccessIter __first,
  1017.                       _RandomAccessIter __last, _T*,
  1018.                       _Size __depth_limit)
  1019. {
  1020.   while (__last - __first > __stl_threshold) {
  1021.     if (__depth_limit == 0) {
  1022.       partial_sort(__first, __last, __last);
  1023.       return;
  1024.     }
  1025.     --__depth_limit;
  1026.     _RandomAccessIter __cut =
  1027.       __unguarded_partition(__first, __last,
  1028.                             _T(__median(*__first,
  1029.                                         *(__first + (__last - __first)/2),
  1030.                                         *(__last - 1))));
  1031.     __introsort_loop(__cut, __last, (_T*) 0, __depth_limit);
  1032.     __last = __cut;
  1033.   }
  1034. }
  1035. template <class _RandomAccessIter, class _T, class _Size, class _Compare>
  1036. void __introsort_loop(_RandomAccessIter __first,
  1037.                       _RandomAccessIter __last, _T*,
  1038.                       _Size __depth_limit, _Compare __comp)
  1039. {
  1040.   while (__last - __first > __stl_threshold) {
  1041.     if (__depth_limit == 0) {
  1042.       partial_sort(__first, __last, __last, __comp);
  1043.       return;
  1044.     }
  1045.     --__depth_limit;
  1046.     _RandomAccessIter __cut =
  1047.       __unguarded_partition(__first, __last,
  1048.                             _T(__median(*__first,
  1049.                                         *(__first + (__last - __first)/2),
  1050.                                         *(__last - 1), __comp)),
  1051.        __comp);
  1052.     __introsort_loop(__cut, __last, (_T*) 0, __depth_limit, __comp);
  1053.     __last = __cut;
  1054.   }
  1055. }
  1056. template <class _RandomAccessIter>
  1057. inline void sort(_RandomAccessIter __first, _RandomAccessIter __last) {
  1058.   if (__first != __last) {
  1059.     __introsort_loop(__first, __last,
  1060.                      __VALUE_TYPE(__first),
  1061.                      __lg(__last - __first) * 2);
  1062.     __final_insertion_sort(__first, __last);
  1063.   }
  1064. }
  1065. template <class _RandomAccessIter, class _Compare>
  1066. inline void sort(_RandomAccessIter __first, _RandomAccessIter __last,
  1067.                  _Compare __comp) {
  1068.   if (__first != __last) {
  1069.     __introsort_loop(__first, __last,
  1070.                      __VALUE_TYPE(__first),
  1071.                      __lg(__last - __first) * 2,
  1072.                      __comp);
  1073.     __final_insertion_sort(__first, __last, __comp);
  1074.   }
  1075. }
  1076. // stable_sort() and its auxiliary functions.
  1077. template <class _RandomAccessIter>
  1078. void __inplace_stable_sort(_RandomAccessIter __first,
  1079.                            _RandomAccessIter __last) {
  1080.   if (__last - __first < 15) {
  1081.     __insertion_sort(__first, __last);
  1082.     return;
  1083.   }
  1084.   _RandomAccessIter __middle = __first + (__last - __first) / 2;
  1085.   __inplace_stable_sort(__first, __middle);
  1086.   __inplace_stable_sort(__middle, __last);
  1087.   __merge_without_buffer(__first, __middle, __last,
  1088.                          __middle - __first,
  1089.                          __last - __middle);
  1090. }
  1091. template <class _RandomAccessIter, class _Compare>
  1092. void __inplace_stable_sort(_RandomAccessIter __first,
  1093.                            _RandomAccessIter __last, _Compare __comp) {
  1094.   if (__last - __first < 15) {
  1095.     __insertion_sort(__first, __last, __comp);
  1096.     return;
  1097.   }
  1098.   _RandomAccessIter __middle = __first + (__last - __first) / 2;
  1099.   __inplace_stable_sort(__first, __middle, __comp);
  1100.   __inplace_stable_sort(__middle, __last, __comp);
  1101.   __merge_without_buffer(__first, __middle, __last,
  1102.                          __middle - __first,
  1103.                          __last - __middle,
  1104.                          __comp);
  1105. }
  1106. template <class _RandomAccessIter1, class _RandomAccessIter2,
  1107.           class _Distance>
  1108. void __merge_sort_loop(_RandomAccessIter1 __first,
  1109.                        _RandomAccessIter1 __last, 
  1110.                        _RandomAccessIter2 __result, _Distance __step_size) {
  1111.   _Distance __two_step = 2 * __step_size;
  1112.   while (__last - __first >= __two_step) {
  1113.     __result = merge(__first, __first + __step_size,
  1114.                      __first + __step_size, __first + __two_step,
  1115.                      __result);
  1116.     __first += __two_step;
  1117.   }
  1118.   __step_size = min(_Distance(__last - __first), __step_size);
  1119.   merge(__first, __first + __step_size, __first + __step_size, __last,
  1120.         __result);
  1121. }
  1122. template <class _RandomAccessIter1, class _RandomAccessIter2,
  1123.           class _Distance, class _Compare>
  1124. void __merge_sort_loop(_RandomAccessIter1 __first,
  1125.                        _RandomAccessIter1 __last, 
  1126.                        _RandomAccessIter2 __result, _Distance __step_size,
  1127.                        _Compare __comp) {
  1128.   _Distance __two_step = 2 * __step_size;
  1129.   while (__last - __first >= __two_step) {
  1130.     __result = merge(__first, __first + __step_size,
  1131.                      __first + __step_size, __first + __two_step,
  1132.                      __result,
  1133.                      __comp);
  1134.     __first += __two_step;
  1135.   }
  1136.   __step_size = min(_Distance(__last - __first), __step_size);
  1137.   merge(__first, __first + __step_size,
  1138.         __first + __step_size, __last,
  1139.         __result,
  1140.         __comp);
  1141. }
  1142. const int __stl_chunk_size = 7;
  1143.         
  1144. template <class _RandomAccessIter, class _Distance>
  1145. void __chunk_insertion_sort(_RandomAccessIter __first, 
  1146.                             _RandomAccessIter __last, _Distance __chunk_size)
  1147. {
  1148.   while (__last - __first >= __chunk_size) {
  1149.     __insertion_sort(__first, __first + __chunk_size);
  1150.     __first += __chunk_size;
  1151.   }
  1152.   __insertion_sort(__first, __last);
  1153. }
  1154. template <class _RandomAccessIter, class _Distance, class _Compare>
  1155. void __chunk_insertion_sort(_RandomAccessIter __first, 
  1156.                             _RandomAccessIter __last,
  1157.                             _Distance __chunk_size, _Compare __comp)
  1158. {
  1159.   while (__last - __first >= __chunk_size) {
  1160.     __insertion_sort(__first, __first + __chunk_size, __comp);
  1161.     __first += __chunk_size;
  1162.   }
  1163.   __insertion_sort(__first, __last, __comp);
  1164. }
  1165. template <class _RandomAccessIter, class _Pointer, class _Distance>
  1166. void __merge_sort_with_buffer(_RandomAccessIter __first, 
  1167.                               _RandomAccessIter __last,
  1168.                               _Pointer __buffer, _Distance*) {
  1169.   _Distance __len = __last - __first;
  1170.   _Pointer __buffer_last = __buffer + __len;
  1171.   _Distance __step_size = __stl_chunk_size;
  1172.   __chunk_insertion_sort(__first, __last, __step_size);
  1173.   while (__step_size < __len) {
  1174.     __merge_sort_loop(__first, __last, __buffer, __step_size);
  1175.     __step_size *= 2;
  1176.     __merge_sort_loop(__buffer, __buffer_last, __first, __step_size);
  1177.     __step_size *= 2;
  1178.   }
  1179. }
  1180. template <class _RandomAccessIter, class _Pointer, class _Distance,
  1181.           class _Compare>
  1182. void __merge_sort_with_buffer(_RandomAccessIter __first, 
  1183.                               _RandomAccessIter __last, _Pointer __buffer,
  1184.                               _Distance*, _Compare __comp) {
  1185.   _Distance __len = __last - __first;
  1186.   _Pointer __buffer_last = __buffer + __len;
  1187.   _Distance __step_size = __stl_chunk_size;
  1188.   __chunk_insertion_sort(__first, __last, __step_size, __comp);
  1189.   while (__step_size < __len) {
  1190.     __merge_sort_loop(__first, __last, __buffer, __step_size, __comp);
  1191.     __step_size *= 2;
  1192.     __merge_sort_loop(__buffer, __buffer_last, __first, __step_size, __comp);
  1193.     __step_size *= 2;
  1194.   }
  1195. }
  1196. template <class _RandomAccessIter, class _Pointer, class _Distance>
  1197. void __stable_sort_adaptive(_RandomAccessIter __first, 
  1198.                             _RandomAccessIter __last, _Pointer __buffer,
  1199.                             _Distance __buffer_size) {
  1200.   _Distance __len = (__last - __first + 1) / 2;
  1201.   _RandomAccessIter __middle = __first + __len;
  1202.   if (__len > __buffer_size) {
  1203.     __stable_sort_adaptive(__first, __middle, __buffer, __buffer_size);
  1204.     __stable_sort_adaptive(__middle, __last, __buffer, __buffer_size);
  1205.   }
  1206.   else {
  1207.     __merge_sort_with_buffer(__first, __middle, __buffer, (_Distance*)0);
  1208.     __merge_sort_with_buffer(__middle, __last, __buffer, (_Distance*)0);
  1209.   }
  1210.   __merge_adaptive(__first, __middle, __last, _Distance(__middle - __first), 
  1211.                    _Distance(__last - __middle), __buffer, __buffer_size);
  1212. }
  1213. template <class _RandomAccessIter, class _Pointer, class _Distance, 
  1214.           class _Compare>
  1215. void __stable_sort_adaptive(_RandomAccessIter __first, 
  1216.                             _RandomAccessIter __last, _Pointer __buffer,
  1217.                             _Distance __buffer_size, _Compare __comp) {
  1218.   _Distance __len = (__last - __first + 1) / 2;
  1219.   _RandomAccessIter __middle = __first + __len;
  1220.   if (__len > __buffer_size) {
  1221.     __stable_sort_adaptive(__first, __middle, __buffer, __buffer_size, 
  1222.                            __comp);
  1223.     __stable_sort_adaptive(__middle, __last, __buffer, __buffer_size, 
  1224.                            __comp);
  1225.   }
  1226.   else {
  1227.     __merge_sort_with_buffer(__first, __middle, __buffer, (_Distance*)0,
  1228.                                __comp);
  1229.     __merge_sort_with_buffer(__middle, __last, __buffer, (_Distance*)0,
  1230.                                __comp);
  1231.   }
  1232.   __merge_adaptive(__first, __middle, __last, _Distance(__middle - __first), 
  1233.                    _Distance(__last - __middle), __buffer, __buffer_size,
  1234.                    __comp);
  1235. }
  1236. template <class _RandomAccessIter, class _T, class _Distance>
  1237. inline void __stable_sort_aux(_RandomAccessIter __first,
  1238.                               _RandomAccessIter __last, _T*, _Distance*) {
  1239.   _Temporary_buffer<_RandomAccessIter, _T> buf(__first, __last);
  1240.   if (buf.begin() == 0)
  1241.     __inplace_stable_sort(__first, __last);
  1242.   else 
  1243.     __stable_sort_adaptive(__first, __last, buf.begin(),
  1244.                            _Distance(buf.size()));
  1245. }
  1246. template <class _RandomAccessIter, class _T, class _Distance, class _Compare>
  1247. inline void __stable_sort_aux(_RandomAccessIter __first,
  1248.                               _RandomAccessIter __last, _T*, _Distance*,
  1249.                               _Compare __comp) {
  1250.   _Temporary_buffer<_RandomAccessIter, _T> buf(__first, __last);
  1251.   if (buf.begin() == 0)
  1252.     __inplace_stable_sort(__first, __last, __comp);
  1253.   else 
  1254.     __stable_sort_adaptive(__first, __last, buf.begin(),
  1255.                            _Distance(buf.size()),
  1256.                            __comp);
  1257. }
  1258. template <class _RandomAccessIter>
  1259. inline void stable_sort(_RandomAccessIter __first,
  1260.                         _RandomAccessIter __last) {
  1261.   __stable_sort_aux(__first, __last,
  1262.                     __VALUE_TYPE(__first),
  1263.                     __DISTANCE_TYPE(__first));
  1264. }
  1265. template <class _RandomAccessIter, class _Compare>
  1266. inline void stable_sort(_RandomAccessIter __first,
  1267.                         _RandomAccessIter __last, _Compare __comp) {
  1268.   __stable_sort_aux(__first, __last,
  1269.                     __VALUE_TYPE(__first),
  1270.                     __DISTANCE_TYPE(__first), 
  1271.                     __comp);
  1272. }
  1273. // partial_sort, partial_sort_copy, and auxiliary functions.
  1274. template <class _RandomAccessIter, class _T>
  1275. void __partial_sort(_RandomAccessIter __first, _RandomAccessIter __middle,
  1276.                     _RandomAccessIter __last, _T*) {
  1277.   make_heap(__first, __middle);
  1278.   for (_RandomAccessIter __i = __middle; __i < __last; ++__i)
  1279.     if (*__i < *__first) 
  1280.       __pop_heap(__first, __middle, __i, _T(*__i),
  1281.                  __DISTANCE_TYPE(__first));
  1282.   sort_heap(__first, __middle);
  1283. }
  1284. template <class _RandomAccessIter>
  1285. inline void partial_sort(_RandomAccessIter __first,
  1286.                          _RandomAccessIter __middle,
  1287.                          _RandomAccessIter __last) {
  1288.   __partial_sort(__first, __middle, __last, __VALUE_TYPE(__first));
  1289. }
  1290. template <class _RandomAccessIter, class _T, class _Compare>
  1291. void __partial_sort(_RandomAccessIter __first, _RandomAccessIter __middle,
  1292.                     _RandomAccessIter __last, _T*, _Compare __comp) {
  1293.   make_heap(__first, __middle, __comp);
  1294.   for (_RandomAccessIter __i = __middle; __i < __last; ++__i)
  1295.     if (__comp(*__i, *__first))
  1296.       __pop_heap(__first, __middle, __i, _T(*__i), __comp,
  1297.                  __DISTANCE_TYPE(__first));
  1298.   sort_heap(__first, __middle, __comp);
  1299. }
  1300. template <class _RandomAccessIter, class _Compare>
  1301. inline void partial_sort(_RandomAccessIter __first,
  1302.                          _RandomAccessIter __middle,
  1303.                          _RandomAccessIter __last, _Compare __comp) {
  1304.   __partial_sort(__first, __middle, __last, __VALUE_TYPE(__first), __comp);
  1305. }
  1306. template <class _InputIter, class _RandomAccessIter, class _Distance,
  1307.           class _T>
  1308. _RandomAccessIter __partial_sort_copy(_InputIter __first,
  1309.                                          _InputIter __last,
  1310.                                          _RandomAccessIter __result_first,
  1311.                                          _RandomAccessIter __result_last, 
  1312.                                          _Distance*, _T*) {
  1313.   if (__result_first == __result_last) return __result_last;
  1314.   _RandomAccessIter __result_real_last = __result_first;
  1315.   while(__first != __last && __result_real_last != __result_last) {
  1316.     *__result_real_last = *__first;
  1317.     ++__result_real_last;
  1318.     ++__first;
  1319.   }
  1320.   make_heap(__result_first, __result_real_last);
  1321.   while (__first != __last) {
  1322.     if (*__first < *__result_first) 
  1323.       __adjust_heap(__result_first, _Distance(0),
  1324.                     _Distance(__result_real_last - __result_first),
  1325.                     _T(*__first));
  1326.     ++__first;
  1327.   }
  1328.   sort_heap(__result_first, __result_real_last);
  1329.   return __result_real_last;
  1330. }
  1331. template <class _InputIter, class _RandomAccessIter>
  1332. inline _RandomAccessIter
  1333. partial_sort_copy(_InputIter __first, _InputIter __last,
  1334.                   _RandomAccessIter __result_first,
  1335.                   _RandomAccessIter __result_last) {
  1336.   return __partial_sort_copy(__first, __last, __result_first, __result_last, 
  1337.                              __DISTANCE_TYPE(__result_first),
  1338.                              __VALUE_TYPE(__first));
  1339. }
  1340. template <class _InputIter, class _RandomAccessIter, class _Compare,
  1341.           class _Distance, class _T>
  1342. _RandomAccessIter __partial_sort_copy(_InputIter __first,
  1343.                                          _InputIter __last,
  1344.                                          _RandomAccessIter __result_first,
  1345.                                          _RandomAccessIter __result_last,
  1346.                                          _Compare __comp, _Distance*, _T*) {
  1347.   if (__result_first == __result_last) return __result_last;
  1348.   _RandomAccessIter __result_real_last = __result_first;
  1349.   while(__first != __last && __result_real_last != __result_last) {
  1350.     *__result_real_last = *__first;
  1351.     ++__result_real_last;
  1352.     ++__first;
  1353.   }
  1354.   make_heap(__result_first, __result_real_last, __comp);
  1355.   while (__first != __last) {
  1356.     if (__comp(*__first, *__result_first))
  1357.       __adjust_heap(__result_first, _Distance(0),
  1358.                     _Distance(__result_real_last - __result_first),
  1359.                     _T(*__first),
  1360.                     __comp);
  1361.     ++__first;
  1362.   }
  1363.   sort_heap(__result_first, __result_real_last, __comp);
  1364.   return __result_real_last;
  1365. }
  1366. template <class _InputIter, class _RandomAccessIter, class _Compare>
  1367. inline _RandomAccessIter
  1368. partial_sort_copy(_InputIter __first, _InputIter __last,
  1369.                   _RandomAccessIter __result_first,
  1370.                   _RandomAccessIter __result_last, _Compare __comp) {
  1371.   return __partial_sort_copy(__first, __last, __result_first, __result_last,
  1372.                              __comp,
  1373.                              __DISTANCE_TYPE(__result_first),
  1374.                              __VALUE_TYPE(__first));
  1375. }
  1376. // nth_element() and its auxiliary functions.  
  1377. template <class _RandomAccessIter, class _T>
  1378. void __nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
  1379.                    _RandomAccessIter __last, _T*) {
  1380.   while (__last - __first > 3) {
  1381.     _RandomAccessIter __cut =
  1382.       __unguarded_partition(__first, __last,
  1383.                             _T(__median(*__first,
  1384.                                         *(__first + (__last - __first)/2),
  1385.                                         *(__last - 1))));
  1386.     if (__cut <= __nth)
  1387.       __first = __cut;
  1388.     else 
  1389.       __last = __cut;
  1390.   }
  1391.   __insertion_sort(__first, __last);
  1392. }
  1393. template <class _RandomAccessIter>
  1394. inline void nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
  1395.                         _RandomAccessIter __last) {
  1396.   __nth_element(__first, __nth, __last, __VALUE_TYPE(__first));
  1397. }
  1398. template <class _RandomAccessIter, class _T, class _Compare>
  1399. void __nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
  1400.                    _RandomAccessIter __last, _T*, _Compare __comp) {
  1401.   while (__last - __first > 3) {
  1402.     _RandomAccessIter __cut =
  1403.       __unguarded_partition(__first, __last,
  1404.                             _T(__median(*__first,
  1405.                                         *(__first + (__last - __first)/2), 
  1406.                                         *(__last - 1),
  1407.                                         __comp)),
  1408.                             __comp);
  1409.     if (__cut <= __nth)
  1410.       __first = __cut;
  1411.     else 
  1412.       __last = __cut;
  1413.   }
  1414.   __insertion_sort(__first, __last, __comp);
  1415. }
  1416. template <class _RandomAccessIter, class _Compare>
  1417. inline void nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
  1418.                  _RandomAccessIter __last, _Compare __comp) {
  1419.   __nth_element(__first, __nth, __last, __VALUE_TYPE(__first), __comp);
  1420. }
  1421. // Binary search (lower_bound, upper_bound, equal_range, binary_search).
  1422. template <class _ForwardIter, class _T, class _Distance>
  1423. _ForwardIter __lower_bound(_ForwardIter __first, _ForwardIter __last,
  1424.                            const _T& __val, _Distance*) 
  1425. {
  1426.   _Distance __len = 0;
  1427.   distance(__first, __last, __len);
  1428.   _Distance __half;
  1429.   _ForwardIter __middle;
  1430.   while (__len > 0) {
  1431.     __half = __len >> 1;
  1432.     __middle = __first;
  1433.     advance(__middle, __half);
  1434.     if (*__middle < __val) {
  1435.       __first = __middle;
  1436.       ++__first;
  1437.       __len = __len - __half - 1;
  1438.     }
  1439.     else
  1440.       __len = __half;
  1441.   }
  1442.   return __first;
  1443. }
  1444. template <class _ForwardIter, class _T>
  1445. inline _ForwardIter lower_bound(_ForwardIter __first, _ForwardIter __last,
  1446.                                    const _T& __val) {
  1447.   return __lower_bound(__first, __last, __val,
  1448.                        __DISTANCE_TYPE(__first));
  1449. }
  1450. template <class _ForwardIter, class _T, class _Compare, class _Distance>
  1451. _ForwardIter __lower_bound(_ForwardIter __first, _ForwardIter __last,
  1452.                               const _T& __val, _Compare __comp, _Distance*)
  1453. {
  1454.   _Distance __len = 0;
  1455.   distance(__first, __last, __len);
  1456.   _Distance __half;
  1457.   _ForwardIter __middle;
  1458.   while (__len > 0) {
  1459.     __half = __len >> 1;
  1460.     __middle = __first;
  1461.     advance(__middle, __half);
  1462.     if (__comp(*__middle, __val)) {
  1463.       __first = __middle;
  1464.       ++__first;
  1465.       __len = __len - __half - 1;
  1466.     }
  1467.     else
  1468.       __len = __half;
  1469.   }
  1470.   return __first;
  1471. }
  1472. template <class _ForwardIter, class _T, class _Compare>
  1473. inline _ForwardIter lower_bound(_ForwardIter __first, _ForwardIter __last,
  1474.                                 const _T& __val, _Compare __comp) {
  1475.   return __lower_bound(__first, __last, __val, __comp,
  1476.                        __DISTANCE_TYPE(__first));
  1477. }
  1478. template <class _ForwardIter, class _T, class _Distance>
  1479. _ForwardIter __upper_bound(_ForwardIter __first, _ForwardIter __last,
  1480.                            const _T& __val, _Distance*)
  1481. {
  1482.   _Distance __len = 0;
  1483.   distance(__first, __last, __len);
  1484.   _Distance __half;
  1485.   _ForwardIter __middle;
  1486.   while (__len > 0) {
  1487.     __half = __len >> 1;
  1488.     __middle = __first;
  1489.     advance(__middle, __half);
  1490.     if (__val < *__middle)
  1491.       __len = __half;
  1492.     else {
  1493.       __first = __middle;
  1494.       ++__first;
  1495.       __len = __len - __half - 1;
  1496.     }
  1497.   }
  1498.   return __first;
  1499. }
  1500. template <class _ForwardIter, class _T>
  1501. inline _ForwardIter upper_bound(_ForwardIter __first, _ForwardIter __last,
  1502.                                 const _T& __val) {
  1503.   return __upper_bound(__first, __last, __val,
  1504.                        __DISTANCE_TYPE(__first));
  1505. }
  1506. template <class _ForwardIter, class _T, class _Compare, class _Distance>
  1507. _ForwardIter __upper_bound(_ForwardIter __first, _ForwardIter __last,
  1508.                            const _T& __val, _Compare __comp, _Distance*)
  1509. {
  1510.   _Distance __len = 0;
  1511.   distance(__first, __last, __len);
  1512.   _Distance __half;
  1513.   _ForwardIter __middle;
  1514.   while (__len > 0) {
  1515.     __half = __len >> 1;
  1516.     __middle = __first;
  1517.     advance(__middle, __half);
  1518.     if (__comp(__val, *__middle))
  1519.       __len = __half;
  1520.     else {
  1521.       __first = __middle;
  1522.       ++__first;
  1523.       __len = __len - __half - 1;
  1524.     }
  1525.   }
  1526.   return __first;
  1527. }
  1528. template <class _ForwardIter, class _T, class _Compare>
  1529. inline _ForwardIter upper_bound(_ForwardIter __first, _ForwardIter __last,
  1530.                                 const _T& __val, _Compare __comp) {
  1531.   return __upper_bound(__first, __last, __val, __comp,
  1532.                        __DISTANCE_TYPE(__first));
  1533. }
  1534. template <class _ForwardIter, class _T, class _Distance>
  1535. pair<_ForwardIter, _ForwardIter>
  1536. __equal_range(_ForwardIter __first, _ForwardIter __last, const _T& __val,
  1537.               _Distance*)
  1538. {
  1539.   _Distance __len = 0;
  1540.   distance(__first, __last, __len);
  1541.   _Distance __half;
  1542.   _ForwardIter __middle, __left, __right;
  1543.   while (__len > 0) {
  1544.     __half = __len >> 1;
  1545.     __middle = __first;
  1546.     advance(__middle, __half);
  1547.     if (*__middle < __val) {
  1548.       __first = __middle;
  1549.       ++__first;
  1550.       __len = __len - __half - 1;
  1551.     }
  1552.     else if (__val < *__middle)
  1553.       __len = __half;
  1554.     else {
  1555.       __left = lower_bound(__first, __middle, __val);
  1556.       advance(__first, __len);
  1557.       __right = upper_bound(++__middle, __first, __val);
  1558.       return pair<_ForwardIter, _ForwardIter>(__left, __right);
  1559.     }
  1560.   }
  1561.   return pair<_ForwardIter, _ForwardIter>(__first, __first);
  1562. }
  1563. template <class _ForwardIter, class _T>
  1564. inline pair<_ForwardIter, _ForwardIter>
  1565. equal_range(_ForwardIter __first, _ForwardIter __last, const _T& __val) {
  1566.   return __equal_range(__first, __last, __val,
  1567.                        __DISTANCE_TYPE(__first));
  1568. }
  1569. template <class _ForwardIter, class _T, class _Compare, class _Distance>
  1570. pair<_ForwardIter, _ForwardIter>
  1571. __equal_range(_ForwardIter __first, _ForwardIter __last, const _T& __val,
  1572.               _Compare __comp, _Distance*)
  1573. {
  1574.   _Distance __len = 0;
  1575.   distance(__first, __last, __len);
  1576.   _Distance __half;
  1577.   _ForwardIter __middle, __left, __right;
  1578.   while (__len > 0) {
  1579.     __half = __len >> 1;
  1580.     __middle = __first;
  1581.     advance(__middle, __half);
  1582.     if (__comp(*__middle, __val)) {
  1583.       __first = __middle;
  1584.       ++__first;
  1585.       __len = __len - __half - 1;
  1586.     }
  1587.     else if (__comp(__val, *__middle))
  1588.       __len = __half;
  1589.     else {
  1590.       __left = lower_bound(__first, __middle, __val, __comp);
  1591.       advance(__first, __len);
  1592.       __right = upper_bound(++__middle, __first, __val, __comp);
  1593.       return pair<_ForwardIter, _ForwardIter>(__left, __right);
  1594.     }
  1595.   }
  1596.   return pair<_ForwardIter, _ForwardIter>(__first, __first);
  1597. }           
  1598. template <class _ForwardIter, class _T, class _Compare>
  1599. inline pair<_ForwardIter, _ForwardIter>
  1600. equal_range(_ForwardIter __first, _ForwardIter __last, const _T& __val,
  1601.             _Compare __comp) {
  1602.   return __equal_range(__first, __last, __val, __comp,
  1603.                        __DISTANCE_TYPE(__first));
  1604. template <class _ForwardIter, class _T>
  1605. bool binary_search(_ForwardIter __first, _ForwardIter __last,
  1606.                    const _T& __val) {
  1607.   _ForwardIter __i = lower_bound(__first, __last, __val);
  1608.   return __i != __last && !(__val < *__i);
  1609. }
  1610. template <class _ForwardIter, class _T, class _Compare>
  1611. bool binary_search(_ForwardIter __first, _ForwardIter __last, const _T& __val,
  1612.                    _Compare __comp) {
  1613.   _ForwardIter __i = lower_bound(__first, __last, __val, __comp);
  1614.   return __i != __last && !__comp(__val, *__i);
  1615. }
  1616. // merge, with and without an explicitly supplied comparison function.
  1617. template <class _InputIter1, class _InputIter2, class _OutputIter>
  1618. _OutputIter merge(_InputIter1 __first1, _InputIter1 __last1,
  1619.                   _InputIter2 __first2, _InputIter2 __last2,
  1620.                   _OutputIter __result) {
  1621.   while (__first1 != __last1 && __first2 != __last2) {
  1622.     if (*__first2 < *__first1) {
  1623.       *__result = *__first2;
  1624.       ++__first2;
  1625.     }
  1626.     else {
  1627.       *__result = *__first1;
  1628.       ++__first1;
  1629.     }
  1630.     ++__result;
  1631.   }
  1632.   return copy(__first2, __last2, copy(__first1, __last1, __result));
  1633. }
  1634. template <class _InputIter1, class _InputIter2, class _OutputIter,
  1635.           class _Compare>
  1636. _OutputIter merge(_InputIter1 __first1, _InputIter1 __last1,
  1637.                   _InputIter2 __first2, _InputIter2 __last2,
  1638.                   _OutputIter __result, _Compare __comp) {
  1639.   while (__first1 != __last1 && __first2 != __last2) {
  1640.     if (__comp(*__first2, *__first1)) {
  1641.       *__result = *__first2;
  1642.       ++__first2;
  1643.     }
  1644.     else {
  1645.       *__result = *__first1;
  1646.       ++__first1;
  1647.     }
  1648.     ++__result;
  1649.   }
  1650.   return copy(__first2, __last2, copy(__first1, __last1, __result));
  1651. }
  1652. // inplace_merge and its auxiliary functions. 
  1653. template <class _BidirectionalIter, class _Distance>
  1654. void __merge_without_buffer(_BidirectionalIter __first,
  1655.                             _BidirectionalIter __middle,
  1656.                             _BidirectionalIter __last,
  1657.                             _Distance __len1, _Distance __len2) {
  1658.   if (__len1 == 0 || __len2 == 0)
  1659.     return;
  1660.   if (__len1 + __len2 == 2) {
  1661.     if (*__middle < *__first)
  1662.       iter_swap(__first, __middle);
  1663.     return;
  1664.   }
  1665.   _BidirectionalIter __first_cut = __first;
  1666.   _BidirectionalIter __second_cut = __middle;
  1667.   _Distance __len11 = 0;
  1668.   _Distance __len22 = 0;
  1669.   if (__len1 > __len2) {
  1670.     __len11 = __len1 / 2;
  1671.     advance(__first_cut, __len11);
  1672.     __second_cut = lower_bound(__middle, __last, *__first_cut);
  1673.     distance(__middle, __second_cut, __len22);
  1674.   }
  1675.   else {
  1676.     __len22 = __len2 / 2;
  1677.     advance(__second_cut, __len22);
  1678.     __first_cut = upper_bound(__first, __middle, *__second_cut);
  1679.     distance(__first, __first_cut, __len11);
  1680.   }
  1681.   _BidirectionalIter __new_middle
  1682.     = rotate(__first_cut, __middle, __second_cut);
  1683.   __merge_without_buffer(__first, __first_cut, __new_middle,
  1684.                          __len11, __len22);
  1685.   __merge_without_buffer(__new_middle, __second_cut, __last, __len1 - __len11,
  1686.                          __len2 - __len22);
  1687. }
  1688. template <class _BidirectionalIter, class _Distance, class _Compare>
  1689. void __merge_without_buffer(_BidirectionalIter __first,
  1690.                             _BidirectionalIter __middle,
  1691.                             _BidirectionalIter __last,
  1692.                             _Distance __len1, _Distance __len2,
  1693.                             _Compare __comp) {
  1694.   if (__len1 == 0 || __len2 == 0)
  1695.     return;
  1696.   if (__len1 + __len2 == 2) {
  1697.     if (__comp(*__middle, *__first))
  1698.       iter_swap(__first, __middle);
  1699.     return;
  1700.   }
  1701.   _BidirectionalIter __first_cut = __first;
  1702.   _BidirectionalIter __second_cut = __middle;
  1703.   _Distance __len11 = 0;
  1704.   _Distance __len22 = 0;
  1705.   if (__len1 > __len2) {
  1706.     __len11 = __len1 / 2;
  1707.     advance(__first_cut, __len11);
  1708.     __second_cut = lower_bound(__middle, __last, *__first_cut, __comp);
  1709.     distance(__middle, __second_cut, __len22);
  1710.   }
  1711.   else {
  1712.     __len22 = __len2 / 2;
  1713.     advance(__second_cut, __len22);
  1714.     __first_cut = upper_bound(__first, __middle, *__second_cut, __comp);
  1715.     distance(__first, __first_cut, __len11);
  1716.   }
  1717.   _BidirectionalIter __new_middle
  1718.     = rotate(__first_cut, __middle, __second_cut);
  1719.   __merge_without_buffer(__first, __first_cut, __new_middle, __len11, __len22,
  1720.                          __comp);
  1721.   __merge_without_buffer(__new_middle, __second_cut, __last, __len1 - __len11,
  1722.                          __len2 - __len22, __comp);
  1723. }
  1724. template <class _BidirectionalIter1, class _BidirectionalIter2,
  1725.           class _Distance>
  1726. _BidirectionalIter1 __rotate_adaptive(_BidirectionalIter1 __first,
  1727.                                       _BidirectionalIter1 __middle,
  1728.                                       _BidirectionalIter1 __last,
  1729.                                       _Distance __len1, _Distance __len2,
  1730.                                       _BidirectionalIter2 __buffer,
  1731.                                       _Distance __buffer_size) {
  1732.   _BidirectionalIter2 __buffer_end;
  1733.   if (__len1 > __len2 && __len2 <= __buffer_size) {
  1734.     __buffer_end = copy(__middle, __last, __buffer);
  1735.     copy_backward(__first, __middle, __last);
  1736.     return copy(__buffer, __buffer_end, __first);
  1737.   }
  1738.   else if (__len1 <= __buffer_size) {
  1739.     __buffer_end = copy(__first, __middle, __buffer);
  1740.     copy(__middle, __last, __first);
  1741.     return copy_backward(__buffer, __buffer_end, __last);
  1742.   }
  1743.   else
  1744.     return rotate(__first, __middle, __last);
  1745. }
  1746. template <class _BidirectionalIter1, class _BidirectionalIter2,
  1747.           class _BidirectionalIter3>
  1748. _BidirectionalIter3 __merge_backward(_BidirectionalIter1 __first1,
  1749.                                      _BidirectionalIter1 __last1,
  1750.                                      _BidirectionalIter2 __first2,
  1751.                                      _BidirectionalIter2 __last2,
  1752.                                      _BidirectionalIter3 __result) {
  1753.   if (__first1 == __last1)
  1754.     return copy_backward(__first2, __last2, __result);
  1755.   if (__first2 == __last2)
  1756.     return copy_backward(__first1, __last1, __result);
  1757.   --__last1;
  1758.   --__last2;
  1759.   while (true) {
  1760.     if (*__last2 < *__last1) {
  1761.       *--__result = *__last1;
  1762.       if (__first1 == __last1)
  1763.         return copy_backward(__first2, ++__last2, __result);
  1764.       --__last1;
  1765.     }
  1766.     else {
  1767.       *--__result = *__last2;
  1768.       if (__first2 == __last2)
  1769.         return copy_backward(__first1, ++__last1, __result);
  1770.       --__last2;
  1771.     }
  1772.   }
  1773. }
  1774. template <class _BidirectionalIter1, class _BidirectionalIter2,
  1775.           class _BidirectionalIter3, class _Compare>
  1776. _BidirectionalIter3 __merge_backward(_BidirectionalIter1 __first1,
  1777.                                      _BidirectionalIter1 __last1,
  1778.                                      _BidirectionalIter2 __first2,
  1779.                                      _BidirectionalIter2 __last2,
  1780.                                      _BidirectionalIter3 __result,
  1781.                                      _Compare __comp) {
  1782.   if (__first1 == __last1)
  1783.     return copy_backward(__first2, __last2, __result);
  1784.   if (__first2 == __last2)
  1785.     return copy_backward(__first1, __last1, __result);
  1786.   --__last1;
  1787.   --__last2;
  1788.   while (true) {
  1789.     if (__comp(*__last2, *__last1)) {
  1790.       *--__result = *__last1;
  1791.       if (__first1 == __last1)
  1792.         return copy_backward(__first2, ++__last2, __result);
  1793.       --__last1;
  1794.     }
  1795.     else {
  1796.       *--__result = *__last2;
  1797.       if (__first2 == __last2)
  1798.         return copy_backward(__first1, ++__last1, __result);
  1799.       --__last2;
  1800.     }
  1801.   }
  1802. }
  1803. template <class _BidirectionalIter, class _Distance, class _Pointer>
  1804. void __merge_adaptive(_BidirectionalIter __first,
  1805.                       _BidirectionalIter __middle, 
  1806.                       _BidirectionalIter __last,
  1807.                       _Distance __len1, _Distance __len2,
  1808.                       _Pointer __buffer, _Distance __buffer_size) {
  1809.   if (__len1 <= __len2 && __len1 <= __buffer_size) {
  1810.     _Pointer __buffer_end = copy(__first, __middle, __buffer);
  1811.     merge(__buffer, __buffer_end, __middle, __last, __first);
  1812.   }
  1813.   else if (__len2 <= __buffer_size) {
  1814.     _Pointer __buffer_end = copy(__middle, __last, __buffer);
  1815.     __merge_backward(__first, __middle, __buffer, __buffer_end, __last);
  1816.   }
  1817.   else {
  1818.     _BidirectionalIter __first_cut = __first;
  1819.     _BidirectionalIter __second_cut = __middle;
  1820.     _Distance __len11 = 0;
  1821.     _Distance __len22 = 0;
  1822.     if (__len1 > __len2) {
  1823.       __len11 = __len1 / 2;
  1824.       advance(__first_cut, __len11);
  1825.       __second_cut = lower_bound(__middle, __last, *__first_cut);
  1826.       distance(__middle, __second_cut, __len22); 
  1827.     }
  1828.     else {
  1829.       __len22 = __len2 / 2;
  1830.       advance(__second_cut, __len22);
  1831.       __first_cut = upper_bound(__first, __middle, *__second_cut);
  1832.       distance(__first, __first_cut, __len11);
  1833.     }
  1834.     _BidirectionalIter __new_middle =
  1835.       __rotate_adaptive(__first_cut, __middle, __second_cut, __len1 - __len11,
  1836.                         __len22, __buffer, __buffer_size);
  1837.     __merge_adaptive(__first, __first_cut, __new_middle, __len11,
  1838.                      __len22, __buffer, __buffer_size);
  1839.     __merge_adaptive(__new_middle, __second_cut, __last, __len1 - __len11,
  1840.                      __len2 - __len22, __buffer, __buffer_size);
  1841.   }
  1842. }
  1843. template <class _BidirectionalIter, class _Distance, class _Pointer,
  1844.           class _Compare>
  1845. void __merge_adaptive(_BidirectionalIter __first, 
  1846.                       _BidirectionalIter __middle, 
  1847.                       _BidirectionalIter __last,
  1848.                       _Distance __len1, _Distance __len2,
  1849.                       _Pointer __buffer, _Distance __buffer_size,
  1850.                       _Compare __comp) {
  1851.   if (__len1 <= __len2 && __len1 <= __buffer_size) {
  1852.     _Pointer __buffer_end = copy(__first, __middle, __buffer);
  1853.     merge(__buffer, __buffer_end, __middle, __last, __first, __comp);
  1854.   }
  1855.   else if (__len2 <= __buffer_size) {
  1856.     _Pointer __buffer_end = copy(__middle, __last, __buffer);
  1857.     __merge_backward(__first, __middle, __buffer, __buffer_end, __last,
  1858.                      __comp);
  1859.   }
  1860.   else {
  1861.     _BidirectionalIter __first_cut = __first;
  1862.     _BidirectionalIter __second_cut = __middle;
  1863.     _Distance __len11 = 0;
  1864.     _Distance __len22 = 0;
  1865.     if (__len1 > __len2) {
  1866.       __len11 = __len1 / 2;
  1867.       advance(__first_cut, __len11);
  1868.       __second_cut = lower_bound(__middle, __last, *__first_cut, __comp);
  1869.       distance(__middle, __second_cut, __len22);   
  1870.     }
  1871.     else {
  1872.       __len22 = __len2 / 2;
  1873.       advance(__second_cut, __len22);
  1874.       __first_cut = upper_bound(__first, __middle, *__second_cut, __comp);
  1875.       distance(__first, __first_cut, __len11);
  1876.     }
  1877.     _BidirectionalIter __new_middle =
  1878.       __rotate_adaptive(__first_cut, __middle, __second_cut, __len1 - __len11,
  1879.                         __len22, __buffer, __buffer_size);
  1880.     __merge_adaptive(__first, __first_cut, __new_middle, __len11,
  1881.                      __len22, __buffer, __buffer_size, __comp);
  1882.     __merge_adaptive(__new_middle, __second_cut, __last, __len1 - __len11,
  1883.                      __len2 - __len22, __buffer, __buffer_size, __comp);
  1884.   }
  1885. }
  1886. template <class _BidirectionalIter, class _T, class _Distance>
  1887. inline void __inplace_merge_aux(_BidirectionalIter __first,
  1888.                                 _BidirectionalIter __middle,
  1889.                                 _BidirectionalIter __last, _T*, _Distance*) {
  1890.   _Distance __len1 = 0;
  1891.   distance(__first, __middle, __len1);
  1892.   _Distance __len2 = 0;
  1893.   distance(__middle, __last, __len2);
  1894.   _Temporary_buffer<_BidirectionalIter, _T> __buf(__first, __last);
  1895.   if (__buf.begin() == 0)
  1896.     __merge_without_buffer(__first, __middle, __last, __len1, __len2);
  1897.   else
  1898.     __merge_adaptive(__first, __middle, __last, __len1, __len2,
  1899.                      __buf.begin(), _Distance(__buf.size()));
  1900. }
  1901. template <class _BidirectionalIter, class _T, class _Distance, class _Compare>
  1902. inline void __inplace_merge_aux(_BidirectionalIter __first,
  1903.                                 _BidirectionalIter __middle,
  1904.                                 _BidirectionalIter __last, _T*, _Distance*,
  1905.                                 _Compare __comp) {
  1906.   _Distance __len1 = 0;
  1907.   distance(__first, __middle, __len1);
  1908.   _Distance __len2 = 0;
  1909.   distance(__middle, __last, __len2);
  1910.   _Temporary_buffer<_BidirectionalIter, _T> __buf(__first, __last);
  1911.   if (__buf.begin() == 0)
  1912.     __merge_without_buffer(__first, __middle, __last, __len1, __len2, __comp);
  1913.   else
  1914.     __merge_adaptive(__first, __middle, __last, __len1, __len2,
  1915.                      __buf.begin(), _Distance(__buf.size()),
  1916.                      __comp);
  1917. }
  1918. template <class _BidirectionalIter>
  1919. inline void inplace_merge(_BidirectionalIter __first,
  1920.                           _BidirectionalIter __middle,
  1921.                           _BidirectionalIter __last) {
  1922.   if (__first == __middle || __middle == __last)
  1923.     return;
  1924.   __inplace_merge_aux(__first, __middle, __last,
  1925.                       __VALUE_TYPE(__first), __DISTANCE_TYPE(__first));
  1926. }
  1927. template <class _BidirectionalIter, class _Compare>
  1928. inline void inplace_merge(_BidirectionalIter __first,
  1929.                           _BidirectionalIter __middle,
  1930.                           _BidirectionalIter __last, _Compare __comp) {
  1931.   if (__first == __middle || __middle == __last)
  1932.     return;
  1933.   __inplace_merge_aux(__first, __middle, __last,
  1934.                       __VALUE_TYPE(__first), __DISTANCE_TYPE(__first),
  1935.                       __comp);
  1936. }
  1937. // Set algorithms: includes, set_union, set_intersection, set_difference,
  1938. // set_symmetric_difference.  All of these algorithms have the precondition
  1939. // that their input ranges are sorted and the postcondition that their output
  1940. // ranges are sorted.
  1941. template <class _InputIter1, class _InputIter2>
  1942. bool includes(_InputIter1 __first1, _InputIter1 __last1,
  1943.               _InputIter2 __first2, _InputIter2 __last2) {
  1944.   while (__first1 != __last1 && __first2 != __last2)
  1945.     if (*__first2 < *__first1)
  1946.       return false;
  1947.     else if(*__first1 < *__first2) 
  1948.       ++__first1;
  1949.     else
  1950.       ++__first1, ++__first2;
  1951.   return __first2 == __last2;
  1952. }
  1953. template <class _InputIter1, class _InputIter2, class _Compare>
  1954. bool includes(_InputIter1 __first1, _InputIter1 __last1,
  1955.               _InputIter2 __first2, _InputIter2 __last2, _Compare __comp) {
  1956.   while (__first1 != __last1 && __first2 != __last2)
  1957.     if (__comp(*__first2, *__first1))
  1958.       return false;
  1959.     else if(__comp(*__first1, *__first2)) 
  1960.       ++__first1;
  1961.     else
  1962.       ++__first1, ++__first2;
  1963.   return __first2 == __last2;
  1964. }
  1965. template <class _InputIter1, class _InputIter2, class _OutputIter>
  1966. _OutputIter set_union(_InputIter1 __first1, _InputIter1 __last1,
  1967.                       _InputIter2 __first2, _InputIter2 __last2,
  1968.                       _OutputIter __result) {
  1969.   while (__first1 != __last1 && __first2 != __last2) {
  1970.     if (*__first1 < *__first2) {
  1971.       *__result = *__first1;
  1972.       ++__first1;
  1973.     }
  1974.     else if (*__first2 < *__first1) {
  1975.       *__result = *__first2;
  1976.       ++__first2;
  1977.     }
  1978.     else {
  1979.       *__result = *__first1;
  1980.       ++__first1;
  1981.       ++__first2;
  1982.     }
  1983.     ++__result;
  1984.   }
  1985.   return copy(__first2, __last2, copy(__first1, __last1, __result));
  1986. }
  1987. template <class _InputIter1, class _InputIter2, class _OutputIter,
  1988.           class _Compare>
  1989. _OutputIter set_union(_InputIter1 __first1, _InputIter1 __last1,
  1990.                       _InputIter2 __first2, _InputIter2 __last2,
  1991.                       _OutputIter __result, _Compare __comp) {
  1992.   while (__first1 != __last1 && __first2 != __last2) {
  1993.     if (__comp(*__first1, *__first2)) {
  1994.       *__result = *__first1;
  1995.       ++__first1;
  1996.     }
  1997.     else if (__comp(*__first2, *__first1)) {
  1998.       *__result = *__first2;
  1999.       ++__first2;
  2000.     }
  2001.     else {
  2002.       *__result = *__first1;
  2003.       ++__first1;
  2004.       ++__first2;
  2005.     }
  2006.     ++__result;
  2007.   }
  2008.   return copy(__first2, __last2, copy(__first1, __last1, __result));
  2009. }
  2010. template <class _InputIter1, class _InputIter2, class _OutputIter>
  2011. _OutputIter set_intersection(_InputIter1 __first1, _InputIter1 __last1,
  2012.                              _InputIter2 __first2, _InputIter2 __last2,
  2013.                              _OutputIter __result) {
  2014.   while (__first1 != __last1 && __first2 != __last2) 
  2015.     if (*__first1 < *__first2) 
  2016.       ++__first1;
  2017.     else if (*__first2 < *__first1) 
  2018.       ++__first2;
  2019.     else {
  2020.       *__result = *__first1;
  2021.       ++__first1;
  2022.       ++__first2;
  2023.       ++__result;
  2024.     }
  2025.   return __result;
  2026. }
  2027. template <class _InputIter1, class _InputIter2, class _OutputIter,
  2028.           class _Compare>
  2029. _OutputIter set_intersection(_InputIter1 __first1, _InputIter1 __last1,
  2030.                              _InputIter2 __first2, _InputIter2 __last2,
  2031.                              _OutputIter __result, _Compare __comp) {
  2032.   while (__first1 != __last1 && __first2 != __last2)
  2033.     if (__comp(*__first1, *__first2))
  2034.       ++__first1;
  2035.     else if (__comp(*__first2, *__first1))
  2036.       ++__first2;
  2037.     else {
  2038.       *__result = *__first1;
  2039.       ++__first1;
  2040.       ++__first2;
  2041.       ++__result;
  2042.     }
  2043.   return __result;
  2044. }
  2045. template <class _InputIter1, class _InputIter2, class _OutputIter>
  2046. _OutputIter set_difference(_InputIter1 __first1, _InputIter1 __last1,
  2047.                            _InputIter2 __first2, _InputIter2 __last2,
  2048.                            _OutputIter __result) {
  2049.   while (__first1 != __last1 && __first2 != __last2)
  2050.     if (*__first1 < *__first2) {
  2051.       *__result = *__first1;
  2052.       ++__first1;
  2053.       ++__result;
  2054.     }
  2055.     else if (*__first2 < *__first1)
  2056.       ++__first2;
  2057.     else {
  2058.       ++__first1;
  2059.       ++__first2;
  2060.     }
  2061.   return copy(__first1, __last1, __result);
  2062. }
  2063. template <class _InputIter1, class _InputIter2, class _OutputIter, 
  2064.           class _Compare>
  2065. _OutputIter set_difference(_InputIter1 __first1, _InputIter1 __last1,
  2066.                            _InputIter2 __first2, _InputIter2 __last2, 
  2067.                            _OutputIter __result, _Compare __comp) {
  2068.   while (__first1 != __last1 && __first2 != __last2)
  2069.     if (__comp(*__first1, *__first2)) {
  2070.       *__result = *__first1;
  2071.       ++__first1;
  2072.       ++__result;
  2073.     }
  2074.     else if (__comp(*__first2, *__first1))
  2075.       ++__first2;
  2076.     else {
  2077.       ++__first1;
  2078.       ++__first2;
  2079.     }
  2080.   return copy(__first1, __last1, __result);
  2081. }
  2082. template <class _InputIter1, class _InputIter2, class _OutputIter>
  2083. _OutputIter 
  2084. set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1,
  2085.                          _InputIter2 __first2, _InputIter2 __last2,
  2086.                          _OutputIter __result) {
  2087.   while (__first1 != __last1 && __first2 != __last2)
  2088.     if (*__first1 < *__first2) {
  2089.       *__result = *__first1;
  2090.       ++__first1;
  2091.       ++__result;
  2092.     }
  2093.     else if (*__first2 < *__first1) {
  2094.       *__result = *__first2;
  2095.       ++__first2;
  2096.       ++__result;
  2097.     }
  2098.     else {
  2099.       ++__first1;
  2100.       ++__first2;
  2101.     }
  2102.   return copy(__first2, __last2, copy(__first1, __last1, __result));
  2103. }
  2104. template <class _InputIter1, class _InputIter2, class _OutputIter,
  2105.           class _Compare>
  2106. _OutputIter 
  2107. set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1,
  2108.                          _InputIter2 __first2, _InputIter2 __last2,
  2109.                          _OutputIter __result,
  2110.                          _Compare __comp) {
  2111.   while (__first1 != __last1 && __first2 != __last2)
  2112.     if (__comp(*__first1, *__first2)) {
  2113.       *__result = *__first1;
  2114.       ++__first1;
  2115.       ++__result;
  2116.     }
  2117.     else if (__comp(*__first2, *__first1)) {
  2118.       *__result = *__first2;
  2119.       ++__first2;
  2120.       ++__result;
  2121.     }
  2122.     else {
  2123.       ++__first1;
  2124.       ++__first2;
  2125.     }
  2126.   return copy(__first2, __last2, copy(__first1, __last1, __result));
  2127. }
  2128. // min_element and max_element, with and without an explicitly supplied
  2129. // comparison function.
  2130. template <class _ForwardIter>
  2131. _ForwardIter max_element(_ForwardIter __first, _ForwardIter __last) {
  2132.   if (__first == __last) return __first;
  2133.   _ForwardIter __result = __first;
  2134.   while (++__first != __last) 
  2135.     if (*__result < *__first)
  2136.       __result = __first;
  2137.   return __result;
  2138. }
  2139. template <class _ForwardIter, class _Compare>
  2140. _ForwardIter max_element(_ForwardIter __first, _ForwardIter __last,
  2141.                             _Compare __comp) {
  2142.   if (__first == __last) return __first;
  2143.   _ForwardIter __result = __first;
  2144.   while (++__first != __last) 
  2145.     if (__comp(*__result, *__first)) __result = __first;
  2146.   return __result;
  2147. }
  2148. template <class _ForwardIter>
  2149. _ForwardIter min_element(_ForwardIter __first, _ForwardIter __last) {
  2150.   if (__first == __last) return __first;
  2151.   _ForwardIter __result = __first;
  2152.   while (++__first != __last) 
  2153.     if (*__first < *__result)
  2154.       __result = __first;
  2155.   return __result;
  2156. }
  2157. template <class _ForwardIter, class _Compare>
  2158. _ForwardIter min_element(_ForwardIter __first, _ForwardIter __last,
  2159.                             _Compare __comp) {
  2160.   if (__first == __last) return __first;
  2161.   _ForwardIter __result = __first;
  2162.   while (++__first != __last) 
  2163.     if (__comp(*__first, *__result))
  2164.       __result = __first;
  2165.   return __result;
  2166. }
  2167. // next_permutation and prev_permutation, with and without an explicitly 
  2168. // supplied comparison function.
  2169. template <class _BidirectionalIter>
  2170. bool next_permutation(_BidirectionalIter __first, _BidirectionalIter __last) {
  2171.   if (__first == __last)
  2172.     return false;
  2173.   _BidirectionalIter __i = __first;
  2174.   ++__i;
  2175.   if (__i == __last)
  2176.     return false;
  2177.   __i = __last;
  2178.   --__i;
  2179.   for(;;) {
  2180.     _BidirectionalIter __ii = __i;
  2181.     --__i;
  2182.     if (*__i < *__ii) {
  2183.       _BidirectionalIter __j = __last;
  2184.       while (!(*__i < *--__j))
  2185.         {}
  2186.       iter_swap(__i, __j);
  2187.       reverse(__ii, __last);
  2188.       return true;
  2189.     }
  2190.     if (__i == __first) {
  2191.       reverse(__first, __last);
  2192.       return false;
  2193.     }
  2194.   }
  2195. }
  2196. template <class _BidirectionalIter, class _Compare>
  2197. bool next_permutation(_BidirectionalIter __first, _BidirectionalIter __last,
  2198.                       _Compare __comp) {
  2199.   if (__first == __last)
  2200.     return false;
  2201.   _BidirectionalIter __i = __first;
  2202.   ++__i;
  2203.   if (__i == __last)
  2204.     return false;
  2205.   __i = __last;
  2206.   --__i;
  2207.   for(;;) {
  2208.     _BidirectionalIter __ii = __i;
  2209.     --__i;
  2210.     if (__comp(*__i, *__ii)) {
  2211.       _BidirectionalIter __j = __last;
  2212.       while (!__comp(*__i, *--__j))
  2213.         {}
  2214.       iter_swap(__i, __j);
  2215.       reverse(__ii, __last);
  2216.       return true;
  2217.     }
  2218.     if (__i == __first) {
  2219.       reverse(__first, __last);
  2220.       return false;
  2221.     }
  2222.   }
  2223. }
  2224. template <class _BidirectionalIter>
  2225. bool prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last) {
  2226.   if (__first == __last)
  2227.     return false;
  2228.   _BidirectionalIter __i = __first;
  2229.   ++__i;
  2230.   if (__i == __last)
  2231.     return false;
  2232.   __i = __last;
  2233.   --__i;
  2234.   for(;;) {
  2235.     _BidirectionalIter __ii = __i;
  2236.     --__i;
  2237.     if (*__ii < *__i) {
  2238.       _BidirectionalIter __j = __last;
  2239.       while (!(*--__j < *__i))
  2240.         {}
  2241.       iter_swap(__i, __j);
  2242.       reverse(__ii, __last);
  2243.       return true;
  2244.     }
  2245.     if (__i == __first) {
  2246.       reverse(__first, __last);
  2247.       return false;
  2248.     }
  2249.   }
  2250. }
  2251. template <class _BidirectionalIter, class _Compare>
  2252. bool prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last,
  2253.                       _Compare __comp) {
  2254.   if (__first == __last)
  2255.     return false;
  2256.   _BidirectionalIter __i = __first;
  2257.   ++__i;
  2258.   if (__i == __last)
  2259.     return false;
  2260.   __i = __last;
  2261.   --__i;
  2262.   for(;;) {
  2263.     _BidirectionalIter __ii = __i;
  2264.     --__i;
  2265.     if (__comp(*__ii, *__i)) {
  2266.       _BidirectionalIter __j = __last;
  2267.       while (!__comp(*--__j, *__i))
  2268.         {}
  2269.       iter_swap(__i, __j);
  2270.       reverse(__ii, __last);
  2271.       return true;
  2272.     }
  2273.     if (__i == __first) {
  2274.       reverse(__first, __last);
  2275.       return false;
  2276.     }
  2277.   }
  2278. }
  2279. // find_first_of, with and without an explicitly supplied comparison function.
  2280. template <class _InputIter, class _ForwardIter>
  2281. _InputIter find_first_of(_InputIter __first1, _InputIter __last1,
  2282.                          _ForwardIter __first2, _ForwardIter __last2)
  2283. {
  2284.   for ( ; __first1 != __last1; ++__first1) 
  2285.     for (_ForwardIter __iter = __first2; __iter != __last2; ++__iter)
  2286.       if (*__first1 == *__iter)
  2287.         return __first1;
  2288.   return __last1;
  2289. }
  2290. template <class _InputIter, class _ForwardIter, class _BinaryPredicate>
  2291. _InputIter find_first_of(_InputIter __first1, _InputIter __last1,
  2292.                          _ForwardIter __first2, _ForwardIter __last2,
  2293.                          _BinaryPredicate __comp)
  2294. {
  2295.   for ( ; __first1 != __last1; ++__first1) 
  2296.     for (_ForwardIter __iter = __first2; __iter != __last2; ++__iter)
  2297.       if (__comp(*__first1, *__iter))
  2298.         return __first1;
  2299.   return __last1;
  2300. }
  2301. // find_end, with and without an explicitly supplied comparison function.
  2302. // Search [first2, last2) as a subsequence in [first1, last1), and return
  2303. // the *last* possible match.  Note that find_end for bidirectional iterators
  2304. // is much faster than for forward iterators.
  2305. // find_end for forward iterators. 
  2306. template <class _ForwardIter1, class _ForwardIter2>
  2307. _ForwardIter1 __find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
  2308.                          _ForwardIter2 __first2, _ForwardIter2 __last2,
  2309.                          forward_iterator_tag, forward_iterator_tag)
  2310. {
  2311.   if (__first2 == __last2)
  2312.     return __last1;
  2313.   else {
  2314.     _ForwardIter1 __result = __last1;
  2315.     while (1) {
  2316.       _ForwardIter1 __new_result
  2317.         = search(__first1, __last1, __first2, __last2);
  2318.       if (__new_result == __last1)
  2319.         return __result;
  2320.       else {
  2321.         __result = __new_result;
  2322.         __first1 = __new_result;
  2323.         ++__first1;
  2324.       }
  2325.     }
  2326.   }
  2327. }
  2328. template <class _ForwardIter1, class _ForwardIter2,
  2329.           class _BinaryPredicate>
  2330. _ForwardIter1 __find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
  2331.                          _ForwardIter2 __first2, _ForwardIter2 __last2,
  2332.                          forward_iterator_tag, forward_iterator_tag,
  2333.                          _BinaryPredicate __comp)
  2334. {
  2335.   if (__first2 == __last2)
  2336.     return __last1;
  2337.   else {
  2338.     _ForwardIter1 __result = __last1;
  2339.     while (1) {
  2340.       _ForwardIter1 __new_result
  2341.         = search(__first1, __last1, __first2, __last2, __comp);
  2342.       if (__new_result == __last1)
  2343.         return __result;
  2344.       else {
  2345.         __result = __new_result;
  2346.         __first1 = __new_result;
  2347.         ++__first1;
  2348.       }
  2349.     }
  2350.   }
  2351. }
  2352. // find_end for bidirectional iterators.  Requires partial specialization.
  2353. #ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
  2354. template <class _BidirectionalIter1, class _BidirectionalIter2>
  2355. _BidirectionalIter1
  2356. __find_end(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1,
  2357.            _BidirectionalIter2 __first2, _BidirectionalIter2 __last2,
  2358.            bidirectional_iterator_tag, bidirectional_iterator_tag)
  2359. {
  2360.   typedef reverse_iterator<_BidirectionalIter1> _RevIter1;
  2361.   typedef reverse_iterator<_BidirectionalIter2> _RevIter2;
  2362.   _RevIter1 __rlast1(__first1);
  2363.   _RevIter2 __rlast2(__first2);
  2364.   _RevIter1 __rresult = search(_RevIter1(__last1), __rlast1,
  2365.                                _RevIter2(__last2), __rlast2);
  2366.   if (__rresult == __rlast1)
  2367.     return __last1;
  2368.   else {
  2369.     _BidirectionalIter1 __result = __rresult.base();
  2370.     advance(__result, -distance(__first2, __last2));
  2371.     return __result;
  2372.   }
  2373. }
  2374. template <class _BidirectionalIter1, class _BidirectionalIter2,
  2375.           class _BinaryPredicate>
  2376. _BidirectionalIter1
  2377. __find_end(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1,
  2378.            _BidirectionalIter2 __first2, _BidirectionalIter2 __last2,
  2379.            bidirectional_iterator_tag, bidirectional_iterator_tag, 
  2380.            _BinaryPredicate __comp)
  2381. {
  2382.   typedef reverse_iterator<_BidirectionalIter1> _RevIter1;
  2383.   typedef reverse_iterator<_BidirectionalIter2> _RevIter2;
  2384.   _RevIter1 __rlast1(__first1);
  2385.   _RevIter2 __rlast2(__first2);
  2386.   _RevIter1 __rresult = search(_RevIter1(__last1), __rlast1,
  2387.                                _RevIter2(__last2), __rlast2,
  2388.                                __comp);
  2389.   if (__rresult == __rlast1)
  2390.     return __last1;
  2391.   else {
  2392.     _BidirectionalIter1 __result = __rresult.base();
  2393.     advance(__result, -distance(__first2, __last2));
  2394.     return __result;
  2395.   }
  2396. }
  2397. #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
  2398. // Dispatching functions for find_end.
  2399. template <class _ForwardIter1, class _ForwardIter2>
  2400. inline _ForwardIter1 
  2401. find_end(_ForwardIter1 __first1, _ForwardIter1 __last1, 
  2402.          _ForwardIter2 __first2, _ForwardIter2 __last2)
  2403. {
  2404.   return __find_end(__first1, __last1, __first2, __last2,
  2405.                     __ITERATOR_CATEGORY(__first1),
  2406.                     __ITERATOR_CATEGORY(__first2));
  2407. }
  2408. template <class _ForwardIter1, class _ForwardIter2, 
  2409.           class _BinaryPredicate>
  2410. inline _ForwardIter1 
  2411. find_end(_ForwardIter1 __first1, _ForwardIter1 __last1, 
  2412.          _ForwardIter2 __first2, _ForwardIter2 __last2,
  2413.          _BinaryPredicate __comp)
  2414. {
  2415.   return __find_end(__first1, __last1, __first2, __last2,
  2416.                     __ITERATOR_CATEGORY(__first1),
  2417.                     __ITERATOR_CATEGORY(__first2),
  2418.                     __comp);
  2419. }
  2420. // is_heap, a predicate testing whether or not a range is
  2421. // a heap.  This function is an extension, not part of the C++
  2422. // standard.
  2423. template <class _RandomAccessIter, class _Distance>
  2424. bool __is_heap(_RandomAccessIter __first, _Distance __n)
  2425. {
  2426.   _Distance __parent = 0;
  2427.   for (_Distance __child = 1; __child < __n; ++__child) {
  2428.     if (__first[__parent] < __first[__child]) 
  2429.       return false;
  2430.     if ((__child & 1) == 0)
  2431.       ++__parent;
  2432.   }
  2433.   return true;
  2434. }
  2435. template <class _RandomAccessIter, class _Distance, class _StrictWeakOrdering>
  2436. bool __is_heap(_RandomAccessIter __first, _StrictWeakOrdering __comp,
  2437.                _Distance __n)
  2438. {
  2439.   _Distance __parent = 0;
  2440.   for (_Distance __child = 1; __child < __n; ++__child) {
  2441.     if (__comp(__first[__parent], __first[__child]))
  2442.       return false;
  2443.     if ((__child & 1) == 0)
  2444.       ++__parent;
  2445.   }
  2446.   return true;
  2447. }
  2448. template <class _RandomAccessIter>
  2449. inline bool is_heap(_RandomAccessIter __first, _RandomAccessIter __last)
  2450. {
  2451.   return __is_heap(__first, __last - __first);
  2452. }
  2453. template <class _RandomAccessIter, class _StrictWeakOrdering>
  2454. inline bool is_heap(_RandomAccessIter __first, _RandomAccessIter __last,
  2455.                     _StrictWeakOrdering __comp)
  2456. {
  2457.   return __is_heap(__first, __comp, __last - __first);
  2458. }
  2459. // is_sorted, a predicated testing whether a range is sorted in
  2460. // nondescending order.  This is an extension, not part of the C++
  2461. // standard.
  2462. template <class _ForwardIter>
  2463. bool is_sorted(_ForwardIter __first, _ForwardIter __last)
  2464. {
  2465.   if (__first == __last)
  2466.     return true;
  2467.   _ForwardIter __next = __first;
  2468.   for (++__next; __next != __last; __first = __next, ++__next) {
  2469.     if (*__next < *__first)
  2470.       return false;
  2471.   }
  2472.   return true;
  2473. }
  2474. template <class _ForwardIter, class _StrictWeakOrdering>
  2475. bool is_sorted(_ForwardIter __first, _ForwardIter __last,
  2476.                _StrictWeakOrdering __comp)
  2477. {
  2478.   if (__first == __last)
  2479.     return true;
  2480.   _ForwardIter __next = __first;
  2481.   for (++__next; __next != __last; __first = __next, ++__next) {
  2482.     if (__comp(*__next, *__first))
  2483.       return false;
  2484.   }
  2485.   return true;
  2486. }
  2487. #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
  2488. #pragma reset woff 1209
  2489. #endif
  2490. __STL_END_NAMESPACE
  2491. #endif /* __SGI_STL_INTERNAL_ALGO_H */
  2492. // Local Variables:
  2493. // mode:C++
  2494. // End: