home *** CD-ROM | disk | FTP | other *** search
/ PC World 2001 May / PCWorld_2001-05_cd.bin / Software / Vyzkuste / devc / _SETUP.6 / Group14 / stl_algo.h < prev    next >
C/C++ Source or Header  |  2000-01-21  |  92KB  |  2,895 lines

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