home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Internet 2000 May / MICD_2000_05.iso / CBuilder5 / INSTALL / DATA1.CAB / Program_Built_Files / Include / algorith.cc < prev    next >
C/C++ Source or Header  |  2000-02-01  |  81KB  |  2,513 lines

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