home *** CD-ROM | disk | FTP | other *** search
/ PC Format (South-Africa) 2001 June / PCFJune.iso / Xenon / C++ / FreeCommandLineTools.exe / Include / algorith.h < prev    next >
Encoding:
C/C++ Source or Header  |  2000-01-31  |  68.8 KB  |  1,688 lines

  1. #ifndef __ALGORITH_H
  2. #define __ALGORITH_H
  3. #pragma option push -b -a8 -pc -Vx- -Ve- -w-inl -w-aus -w-sig
  4. // -*- C++ -*-
  5. #ifndef __STD_ALGORITHM
  6. #define __STD_ALGORITHM 
  7.  
  8. /***************************************************************************
  9.  *
  10.  * algorithm - Declarations and inline definitions 
  11.  *             for the Standard Library algorithms
  12.  *
  13.  ***************************************************************************
  14.  *
  15.  * Copyright (c) 1994
  16.  * Hewlett-Packard Company
  17.  *
  18.  * Permission to use, copy, modify, distribute and sell this software
  19.  * and its documentation for any purpose is hereby granted without fee,
  20.  * provided that the above copyright notice appear in all copies and
  21.  * that both that copyright notice and this permission notice appear
  22.  * in supporting documentation.  Hewlett-Packard Company makes no
  23.  * representations about the suitability of this software for any
  24.  * purpose.  It is provided "as is" without express or implied warranty.
  25.  *
  26.  *
  27.  ***************************************************************************
  28.  *
  29.  * Copyright (c) 1994-1999 Rogue Wave Software, Inc.  All Rights Reserved.
  30.  *
  31.  * This computer software is owned by Rogue Wave Software, Inc. and is
  32.  * protected by U.S. copyright laws and other laws and by international
  33.  * treaties.  This computer software is furnished by Rogue Wave Software,
  34.  * Inc. pursuant to a written license agreement and may be used, copied,
  35.  * transmitted, and stored only in accordance with the terms of such
  36.  * license and with the inclusion of the above copyright notice.  This
  37.  * computer software or any other copies thereof may not be provided or
  38.  * otherwise made available to any other person.
  39.  *
  40.  * U.S. Government Restricted Rights.  This computer software is provided
  41.  * with Restricted Rights.  Use, duplication, or disclosure by the
  42.  * Government is subject to restrictions as set forth in subparagraph (c)
  43.  * (1) (ii) of The Rights in Technical Data and Computer Software clause
  44.  * at DFARS 252.227-7013 or subparagraphs (c) (1) and (2) of the
  45.  * Commercial Computer Software รป Restricted Rights at 48 CFR 52.227-19,
  46.  * as applicable.  Manufacturer is Rogue Wave Software, Inc., 5500
  47.  * Flatiron Parkway, Boulder, Colorado 80301 USA.
  48.  *
  49.  **************************************************************************/
  50.  
  51. #include <stdcomp.h>
  52.  
  53. #ifndef _RWSTD_NO_NEW_HEADER
  54. #include <cstdlib>
  55. #else
  56. #include <stdlib.h>
  57. #endif
  58.  
  59. #include <iterator>
  60. #include <memory>
  61. #include <utility>
  62.  
  63. // Some compilers have min and max macros
  64. // We use function templates in their stead
  65. #ifdef max
  66. # undef max
  67. # undef __MINMAX_DEFINED  // __BORLANDC__
  68. #endif
  69. #ifdef min
  70. # undef min
  71. # undef __MINMAX_DEFINED  // __BORLANDC__
  72. #endif
  73.  
  74. #ifndef _RWSTD_NO_NAMESPACE
  75. namespace std {
  76. #endif
  77.  
  78. //
  79. // Forward declare raw_storage_iterator 
  80. //   
  81.   template <class OutputIterator, class T>
  82.   class raw_storage_iterator;
  83.   template <class T>
  84. #ifndef __BORLANDC__
  85.   inline
  86. #endif
  87.   void __initialize (T& t, T val) { t = val; }
  88.  
  89. //
  90. // Non-modifying sequence operations.
  91. //
  92.  
  93.   template <class InputIterator, class Function>
  94.   Function for_each (InputIterator first, InputIterator last, Function f);
  95.  
  96.   template <class InputIterator, class T>
  97.   InputIterator find (InputIterator first, InputIterator last, const T& value);
  98.  
  99.   template <class InputIterator, class Predicate>
  100.   InputIterator find_if (InputIterator first, InputIterator last, Predicate pred);
  101.  
  102.   template <class ForwardIterator1, class ForwardIterator2, 
  103.   class Distance>
  104.   ForwardIterator1 __find_end (ForwardIterator1 first1,
  105.                                ForwardIterator1 last1,
  106.                                ForwardIterator2 first2,
  107.                                ForwardIterator2 last2,
  108.                                Distance*);
  109.  
  110.   template <class ForwardIterator1, class ForwardIterator2>
  111.   ForwardIterator1 find_end (ForwardIterator1 first1,
  112.                              ForwardIterator1 last1,
  113.                              ForwardIterator2 first2,
  114.                              ForwardIterator2 last2);
  115.  
  116.   template <class ForwardIterator1, class ForwardIterator2, 
  117.   class BinaryPredicate, class Distance>
  118.   ForwardIterator1 __find_end (ForwardIterator1 first1,
  119.                                ForwardIterator1 last1,
  120.                                ForwardIterator2 first2,
  121.                                ForwardIterator2 last2,
  122.                                BinaryPredicate pred,
  123.                                Distance*);
  124.  
  125.   template <class ForwardIterator1, class ForwardIterator2, 
  126.   class BinaryPredicate>
  127.   ForwardIterator1 find_end (ForwardIterator1 first1,
  128.                              ForwardIterator1 last1,
  129.                              ForwardIterator2 first2,
  130.                              ForwardIterator2 last2,
  131.                              BinaryPredicate pred);
  132.  
  133.   template <class ForwardIterator1, class ForwardIterator2>
  134.   ForwardIterator1 find_first_of (ForwardIterator1 first1, ForwardIterator1 last1,
  135.                                   ForwardIterator2 first2, ForwardIterator2 last2);
  136.  
  137.   template <class ForwardIterator1, class ForwardIterator2,
  138.   class BinaryPredicate>
  139.   ForwardIterator1 find_first_of (ForwardIterator1 first1,ForwardIterator1 last1,
  140.                                   ForwardIterator2 first2,ForwardIterator2 last2,
  141.                                   BinaryPredicate pred);
  142.  
  143.   template <class ForwardIterator>
  144.   ForwardIterator adjacent_find (ForwardIterator first, ForwardIterator last);
  145.  
  146.   template <class ForwardIterator, class BinaryPredicate>
  147.   ForwardIterator adjacent_find (ForwardIterator first, ForwardIterator last,
  148.                                  BinaryPredicate binary_pred);
  149.  
  150. #ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
  151.   template <class InputIterator, class T>
  152.   _TYPENAME iterator_traits<InputIterator>::difference_type
  153.   count (InputIterator first, InputIterator last, const T& value);
  154.  
  155.   template <class InputIterator, class Predicate>
  156.   _TYPENAME iterator_traits<InputIterator>::difference_type
  157.   count_if (InputIterator first, InputIterator last, Predicate pred);
  158. #endif /* _RWSTD_NO_CLASS_PARTIAL_SPEC */
  159.  
  160. #ifndef _RWSTD_NO_OLD_COUNT
  161.   template <class InputIterator, class T, class Size>
  162.   void count (InputIterator first, InputIterator last, const T& value, Size& n);
  163.  
  164.   template <class InputIterator, class Predicate, class Size>
  165.   void count_if (InputIterator first, InputIterator last, Predicate pred, 
  166.                  Size& n);
  167. #endif /* _RWSTD_NO_OLD_COUNT */
  168.  
  169.   template <class InputIterator1, class InputIterator2>
  170.   pair<InputIterator1, InputIterator2> mismatch(InputIterator1 first1,
  171.                                                 InputIterator1 last1,
  172.                                                 InputIterator2 first2);
  173.  
  174.   template <class InputIterator1, class InputIterator2, class BinaryPredicate>
  175.   pair<InputIterator1, InputIterator2> mismatch (InputIterator1 first1,
  176.                                                  InputIterator1 last1,
  177.                                                  InputIterator2 first2,
  178.                                                  BinaryPredicate binary_pred);
  179.  
  180.   template <class InputIterator1, class InputIterator2>
  181.   inline bool equal (InputIterator1 first1, InputIterator1 last1,
  182.                      InputIterator2 first2)
  183.   {
  184.     return mismatch(first1, last1, first2).first == last1;
  185.   }
  186.  
  187.   template <class InputIterator1, class InputIterator2, class BinaryPredicate>
  188.   inline bool equal (InputIterator1 first1, InputIterator1 last1,
  189.                      InputIterator2 first2, BinaryPredicate binary_pred)
  190.   {
  191.     return mismatch(first1, last1, first2, binary_pred).first == last1;
  192.   }
  193.  
  194.   template <class ForwardIterator1, class ForwardIterator2,
  195.   class Distance1, class Distance2>
  196.   ForwardIterator1 __search (ForwardIterator1 first1, ForwardIterator1 last1,
  197.                              ForwardIterator2 first2, ForwardIterator2 last2,
  198.                              Distance1*, Distance2*);
  199.  
  200.   template <class ForwardIterator1, class ForwardIterator2>
  201.   inline ForwardIterator1 search (ForwardIterator1 first1,ForwardIterator1 last1,
  202.                                   ForwardIterator2 first2,ForwardIterator2 last2)
  203.   {
  204.     return __search(first1, last1, first2, last2, __distance_type(first1),
  205.                     __distance_type(first2));
  206.   }
  207.  
  208.   template <class ForwardIterator1, class ForwardIterator2,
  209.   class BinaryPredicate, class Distance1, class Distance2>
  210.   ForwardIterator1 __search (ForwardIterator1 first1, ForwardIterator1 last1,
  211.                              ForwardIterator2 first2, ForwardIterator2 last2,
  212.                              BinaryPredicate binary_pred, Distance1*, Distance2*);
  213.  
  214.   template <class ForwardIterator1, class ForwardIterator2,
  215.   class BinaryPredicate>
  216.   inline ForwardIterator1 search (ForwardIterator1 first1,ForwardIterator1 last1,
  217.                                   ForwardIterator2 first2,ForwardIterator2 last2,
  218.                                   BinaryPredicate binary_pred)
  219.   {
  220.     return __search(first1, last1, first2, last2, binary_pred,
  221.                     __distance_type(first1), __distance_type(first2));
  222.   }
  223.  
  224.   template <class ForwardIterator, class Distance, class Size, class T>
  225.   ForwardIterator __search_n (ForwardIterator first, ForwardIterator last,
  226.                               Distance*, Size count, const T& value);
  227.  
  228.   template <class ForwardIterator, class Size, class T>
  229.   inline ForwardIterator search_n (ForwardIterator first, ForwardIterator last,
  230.                                    Size count, const T& value)
  231.   {
  232.     if (count) 
  233.       return __search_n(first, last, __distance_type(first), count, value);
  234.     else
  235.       return first;
  236.   }
  237.  
  238.   template <class ForwardIterator, class Distance, class Size, class T,
  239.   class BinaryPredicate>
  240.   ForwardIterator __search_n (ForwardIterator first, ForwardIterator last,
  241.                               Distance*, Size count, const T& value,
  242.                               BinaryPredicate pred);
  243.  
  244.   template <class ForwardIterator, class Size, class T, class BinaryPredicate>
  245.   inline ForwardIterator search_n (ForwardIterator first, ForwardIterator last,
  246.                                    Size count, const T& value,
  247.                                    BinaryPredicate pred)
  248.   {
  249.     if (count) 
  250.       return  __search_n(first, last, __distance_type(first), count,value, pred);
  251.     else
  252.       return first;
  253.   }
  254.  
  255. //
  256. // Modifying sequence operations.
  257. //
  258.  
  259.   template <class InputIterator, class OutputIterator>
  260.   OutputIterator copy (InputIterator first, InputIterator last,
  261.                        OutputIterator result);
  262.  
  263.   template <class BidirectionalIterator1, class BidirectionalIterator2>
  264.   BidirectionalIterator2 copy_backward (BidirectionalIterator1 first, 
  265.                                         BidirectionalIterator1 last, 
  266.                                         BidirectionalIterator2 result);
  267.  
  268.   template <class T>
  269.   inline void swap (T& a, T& b)
  270.   {
  271.     T tmp = a;
  272.     a = b;
  273.     b = tmp;
  274.   }
  275.  
  276.   template <class ForwardIterator1, class ForwardIterator2, class T>
  277.   inline void __iter_swap (ForwardIterator1 a, ForwardIterator2 b, T*)
  278.   {
  279.     T tmp = *a;
  280.     *a = *b;
  281.     *b = tmp;
  282.   }
  283.  
  284.   template <class ForwardIterator1, class ForwardIterator2>
  285.   inline void iter_swap (ForwardIterator1 a, ForwardIterator2 b)
  286.   {
  287.     __iter_swap(a, b, _RWSTD_VALUE_TYPE(a));
  288.   }
  289.  
  290.   template <class ForwardIterator1, class ForwardIterator2>
  291.   ForwardIterator2 swap_ranges (ForwardIterator1 first1, ForwardIterator1 last1,
  292.                                 ForwardIterator2 first2);
  293.  
  294.   template <class InputIterator, class OutputIterator, class UnaryOperation>
  295.   OutputIterator transform (InputIterator first, InputIterator last,
  296.                             OutputIterator result, UnaryOperation op);
  297.  
  298.   template <class InputIterator1, class InputIterator2, class OutputIterator,
  299.   class BinaryOperation>
  300.   OutputIterator transform (InputIterator1 first1, InputIterator1 last1,
  301.                             InputIterator2 first2, OutputIterator result,
  302.                             BinaryOperation binary_op);
  303.  
  304.   template <class ForwardIterator, class T>
  305.   void replace (ForwardIterator first, ForwardIterator last, const T& old_value,
  306.                 const T& new_value);
  307.  
  308.   template <class ForwardIterator, class Predicate, class T>
  309.   void replace_if (ForwardIterator first, ForwardIterator last, Predicate pred,
  310.                    const T& new_value);
  311.  
  312.   template <class InputIterator, class OutputIterator, class T>
  313.   OutputIterator replace_copy (InputIterator first, InputIterator last,
  314.                                OutputIterator result, const T& old_value,
  315.                                const T& new_value);
  316.  
  317.   template <class Iterator, class OutputIterator, class Predicate, class T>
  318.   OutputIterator replace_copy_if (Iterator first, Iterator last,
  319.                                   OutputIterator result, Predicate pred,
  320.                                   const T& new_value);
  321.  
  322.   template <class ForwardIterator, class T>
  323. #ifdef _RWSTD_FILL_NAME_CLASH
  324.   void std_fill (ForwardIterator first, ForwardIterator last, const T& value);
  325. #else
  326.   void fill (ForwardIterator first, ForwardIterator last, const T& value);
  327. #endif
  328.  
  329.   template <class OutputIterator, class Size, class T>
  330.   void fill_n (OutputIterator first, Size n, const T& value);
  331.  
  332.   template <class ForwardIterator, class Generator>
  333.   void generate (ForwardIterator first, ForwardIterator last, Generator gen);
  334.  
  335.   template <class OutputIterator, class Size, class Generator>
  336.   void generate_n (OutputIterator first, Size n, Generator gen);
  337.  
  338.   template <class InputIterator, class OutputIterator, class T>
  339.   OutputIterator remove_copy (InputIterator first, InputIterator last,
  340.                               OutputIterator result, const T& value);
  341.  
  342.   template <class InputIterator, class OutputIterator, class Predicate>
  343.   OutputIterator remove_copy_if (InputIterator first, InputIterator last,
  344.                                  OutputIterator result, Predicate pred);
  345.  
  346.   template <class ForwardIterator, class T>
  347.   inline ForwardIterator remove (ForwardIterator first, ForwardIterator last,
  348.                                  const T& value)
  349.   {
  350.     first = find(first, last, value);
  351.     ForwardIterator next = first;
  352.     return first == last ? first : remove_copy(++next, last, first, value);
  353.   }
  354.  
  355.   template <class ForwardIterator, class Predicate>
  356.   inline ForwardIterator remove_if (ForwardIterator first, ForwardIterator last,
  357.                                     Predicate pred)
  358.   {
  359.     first = find_if(first, last, pred);
  360.     ForwardIterator next = first;
  361.     return first == last ? first : remove_copy_if(++next, last, first, pred);
  362.   }
  363.  
  364.   template <class InputIterator, class ForwardIterator>
  365.   ForwardIterator __unique_copy (InputIterator first, InputIterator last,
  366.                                  ForwardIterator result, forward_iterator_tag);
  367.  
  368.   template <class InputIterator, class BidirectionalIterator>
  369.   inline BidirectionalIterator __unique_copy (InputIterator first, 
  370.                                               InputIterator last,
  371.                                               BidirectionalIterator result, 
  372.                                               bidirectional_iterator_tag)
  373.   {
  374.     return __unique_copy(first, last, result, forward_iterator_tag());
  375.   }
  376.  
  377.   template <class InputIterator, class RandomAccessIterator>
  378.   inline RandomAccessIterator __unique_copy (InputIterator first, 
  379.                                              InputIterator last,
  380.                                              RandomAccessIterator result, 
  381.                                              random_access_iterator_tag)
  382.   {
  383.     return __unique_copy(first, last, result, forward_iterator_tag());
  384.   }
  385.  
  386.   template <class InputIterator, class OutputIterator, class T>
  387.   OutputIterator __unique_copy (InputIterator first, InputIterator last,
  388.                                 OutputIterator result, T*);
  389.  
  390.   template <class InputIterator, class OutputIterator>
  391.   inline OutputIterator __unique_copy (InputIterator first, InputIterator last,
  392.                                        OutputIterator result, 
  393.                                        output_iterator_tag)
  394.   {
  395.     return __unique_copy(first, last, result, _RWSTD_VALUE_TYPE(first));
  396.   }
  397.  
  398.   template <class InputIterator, class OutputIterator>
  399.   inline OutputIterator unique_copy (InputIterator first, InputIterator last,
  400.                                      OutputIterator result)
  401.   {
  402.     return first == last ? result :
  403. #ifndef _RWSTD_NO_BASE_CLASS_MATCH
  404.     __unique_copy(first, last, result, __iterator_category(result));
  405. #else
  406.     __unique_copy(first, last, result, output_iterator_tag());
  407. #endif
  408.   }
  409.  
  410.   template <class InputIterator, class ForwardIterator, class BinaryPredicate>
  411.   ForwardIterator __unique_copy (InputIterator first, InputIterator last,
  412.                                  ForwardIterator result, 
  413.                                  BinaryPredicate binary_pred,
  414.                                  forward_iterator_tag);
  415.   template <class InputIterator, class BidirectionalIterator,
  416.   class BinaryPredicate>
  417.   inline BidirectionalIterator __unique_copy (InputIterator first, 
  418.                                               InputIterator last,
  419.                                               BidirectionalIterator result, 
  420.                                               BinaryPredicate binary_pred,
  421.                                               bidirectional_iterator_tag)
  422.   {
  423.     return __unique_copy(first, last, result, binary_pred,
  424.                          forward_iterator_tag());
  425.   }
  426.  
  427.   template <class InputIterator, class RandomAccessIterator,
  428.   class BinaryPredicate>
  429.   inline RandomAccessIterator __unique_copy (InputIterator first, 
  430.                                              InputIterator last,
  431.                                              RandomAccessIterator result, 
  432.                                              BinaryPredicate binary_pred,
  433.                                              random_access_iterator_tag)
  434.   {
  435.     return __unique_copy(first, last, result, binary_pred, 
  436.                          forward_iterator_tag());
  437.   }
  438.  
  439.   template <class InputIterator, class OutputIterator, class BinaryPredicate,
  440.   class T>
  441.   OutputIterator __unique_copy (InputIterator first, InputIterator last,
  442.                                 OutputIterator result,
  443.                                 BinaryPredicate binary_pred, T*);
  444.  
  445.   template <class InputIterator, class OutputIterator, class BinaryPredicate>
  446.   inline OutputIterator __unique_copy (InputIterator first, InputIterator last,
  447.                                        OutputIterator result,
  448.                                        BinaryPredicate binary_pred,
  449.                                        output_iterator_tag)
  450.   {
  451.     return __unique_copy(first, last, result, binary_pred,
  452.                          _RWSTD_VALUE_TYPE(first));
  453.   }
  454.  
  455.   template <class InputIterator, class OutputIterator, class BinaryPredicate>
  456.   inline OutputIterator unique_copy (InputIterator first, InputIterator last,
  457.                                      OutputIterator result,
  458.                                      BinaryPredicate binary_pred)
  459.   {
  460.     return first == last ? result :
  461. #ifndef _RWSTD_NO_BASE_CLASS_MATCH
  462.     __unique_copy(first, last, result, binary_pred, __iterator_category(result));
  463. #else
  464.     __unique_copy(first, last, result, binary_pred, output_iterator_tag());
  465. #endif
  466.   }
  467.  
  468.   template <class ForwardIterator>
  469.   inline ForwardIterator unique (ForwardIterator first, ForwardIterator last)
  470.   {
  471.     first = adjacent_find(first, last);
  472.     return unique_copy(first, last, first);
  473.   }
  474.  
  475.   template <class ForwardIterator, class BinaryPredicate>
  476.   inline ForwardIterator unique (ForwardIterator first, ForwardIterator last,
  477.                                  BinaryPredicate binary_pred)
  478.   {
  479.     first = adjacent_find(first, last, binary_pred);
  480.     return unique_copy(first, last, first, binary_pred);
  481.   }
  482.  
  483.   template <class BidirectionalIterator>
  484.   void __reverse (BidirectionalIterator first, BidirectionalIterator last, 
  485.                   bidirectional_iterator_tag);
  486.  
  487.   template <class RandomAccessIterator>
  488.   void __reverse (RandomAccessIterator first, RandomAccessIterator last,
  489.                   random_access_iterator_tag);
  490.  
  491.   template <class BidirectionalIterator>
  492.   inline void reverse (BidirectionalIterator first, BidirectionalIterator last)
  493.   {
  494. #ifndef _RWSTD_NO_BASE_CLASS_MATCH
  495.     __reverse(first, last, __iterator_category(first));
  496. #else
  497.     __reverse(first, last, bidirectional_iterator_tag());
  498. #endif
  499.   }
  500.  
  501.   template <class BidirectionalIterator, class OutputIterator>
  502.   OutputIterator reverse_copy (BidirectionalIterator first,
  503.                                BidirectionalIterator last,
  504.                                OutputIterator result);
  505.  
  506.   template <class ForwardIterator, class Distance>
  507.   void __rotate (ForwardIterator first, ForwardIterator middle,
  508.                  ForwardIterator last, Distance*, forward_iterator_tag);
  509.  
  510.   template <class BidirectionalIterator, class Distance>
  511.   inline void __rotate (BidirectionalIterator first, 
  512.                         BidirectionalIterator middle,
  513.                         BidirectionalIterator last, Distance*,
  514.                         bidirectional_iterator_tag)
  515.   {
  516.     reverse(first, middle);
  517.     reverse(middle, last);
  518.     reverse(first, last);
  519.   }
  520.  
  521.   template <class EuclideanRingElement>
  522.   EuclideanRingElement __gcd (EuclideanRingElement m, EuclideanRingElement n);
  523.  
  524.   template <class RandomAccessIterator, class Distance, class T>
  525.   void __rotate_cycle (RandomAccessIterator first, RandomAccessIterator last,
  526.                        RandomAccessIterator initial, Distance shift, T*);
  527.  
  528.   template <class RandomAccessIterator, class Distance>
  529.   void __rotate (RandomAccessIterator first, RandomAccessIterator middle,
  530.                  RandomAccessIterator last, Distance*,
  531.                  random_access_iterator_tag);
  532.  
  533.   template <class ForwardIterator>
  534.   inline void rotate (ForwardIterator first, ForwardIterator middle,
  535.                       ForwardIterator last)
  536.   {
  537.     if (!(first == middle || middle == last))
  538.     {
  539.  
  540. #ifndef _RWSTD_NO_BASE_CLASS_MATCH
  541.       __rotate(first, middle, last, __distance_type(first), __iterator_category(first));
  542. #else
  543.       __rotate(first, middle, last, __distance_type(first), forward_iterator_tag());
  544. #endif
  545.     }
  546.   }
  547.  
  548.   template <class ForwardIterator, class OutputIterator>
  549.   inline OutputIterator rotate_copy (ForwardIterator first,
  550.                                      ForwardIterator middle,
  551.                                      ForwardIterator last,
  552.                                      OutputIterator result)
  553.   {
  554.     return copy(first, middle, copy(middle, last, result));
  555.   }
  556.  
  557.   template <class RandomAccessIterator, class Distance>
  558.   void __random_shuffle (RandomAccessIterator first, RandomAccessIterator last,
  559.                          Distance*);
  560.  
  561.   template <class RandomAccessIterator>
  562.   inline void random_shuffle (RandomAccessIterator first,
  563.                               RandomAccessIterator last)
  564.   {
  565.     __random_shuffle(first, last, __distance_type(first));
  566.   }
  567.  
  568.   template <class RandomAccessIterator, class RandomNumberGenerator>
  569.   void random_shuffle (RandomAccessIterator first, RandomAccessIterator last,
  570.                        RandomNumberGenerator& rand);
  571.  
  572.   template <class BidirectionalIterator, class Predicate>
  573.   BidirectionalIterator partition (BidirectionalIterator first,
  574.                                    BidirectionalIterator last, Predicate pred);
  575.  
  576.   template <class BidirectionalIterator, class Predicate, class Distance>
  577.   BidirectionalIterator __inplace_stable_partition (BidirectionalIterator first,
  578.                                                     BidirectionalIterator last,
  579.                                                     Predicate pred,
  580.                                                     Distance len);
  581.  
  582.   template <class BidirectionalIterator, class Pointer, class Predicate,
  583.   class Distance, class T>
  584.   BidirectionalIterator __stable_partition_adaptive (BidirectionalIterator first,
  585.                                                      BidirectionalIterator last,
  586.                                                      Predicate pred, Distance len,
  587.                                                      Pointer buffer,
  588.                                                      Distance buffer_size,
  589.                                                      Distance& fill_pointer, T*);
  590.  
  591.   template <class BidirectionalIterator, class Predicate, class Pointer,
  592.   class Distance>
  593.   BidirectionalIterator __stable_partition (BidirectionalIterator first,
  594.                                             BidirectionalIterator last,
  595.                                             Predicate pred, Distance len,
  596.                                             pair<Pointer, Distance> p);
  597.  
  598.   template <class BidirectionalIterator, class Predicate, class Distance>
  599.   inline BidirectionalIterator __stable_partition_aux (BidirectionalIterator first,
  600.                                                        BidirectionalIterator last, 
  601.                                                        Predicate pred,
  602.                                                        Distance*)
  603.   {
  604.     Distance len;
  605.     __initialize(len, Distance(0));
  606.     distance(first, last, len);
  607.  
  608.     return len == 0 ? last :
  609.     __stable_partition(first, last, pred, len,
  610. #ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
  611.            get_temporary_buffer<_TYPENAME 
  612.                iterator_traits<BidirectionalIterator>::value_type >(len));
  613. #else
  614.               get_temporary_buffer(len,_RWSTD_VALUE_TYPE(first)));
  615. #endif
  616.   }
  617.  
  618.   template <class BidirectionalIterator, class Predicate>
  619.   inline BidirectionalIterator stable_partition (BidirectionalIterator first,
  620.                                                  BidirectionalIterator last, 
  621.                                                  Predicate pred)
  622.   {
  623.     return __stable_partition_aux(first, last, pred, __distance_type(first));
  624.   }
  625.  
  626. //
  627. // Sorting and related operations.
  628. //
  629.  
  630.   template <class T>
  631.   inline const T& __median (const T& a, const T& b, const T& c)
  632.   {
  633.     if (a < b)
  634.       if (b < c)
  635.         return b;
  636.       else if (a < c)
  637.         return c;
  638.       else
  639.         return a;
  640.     else if (a < c)
  641.       return a;
  642.     else if (b < c)
  643.       return c;
  644.     else
  645.       return b;
  646.   }
  647.  
  648.   template <class T, class Compare>
  649.   inline const T& __median (const T& a, const T& b, const T& c, Compare comp)
  650.   {
  651.     if (comp(a, b))
  652.       if (comp(b, c))
  653.         return b;
  654.       else if (comp(a, c))
  655.         return c;
  656.       else
  657.         return a;
  658.     else if (comp(a, c))
  659.       return a;
  660.     else if (comp(b, c))
  661.       return c;
  662.     else
  663.       return b;
  664.   }
  665.  
  666.   template <class RandomAccessIterator, class T>
  667.   RandomAccessIterator __unguarded_partition (RandomAccessIterator first, 
  668.                                               RandomAccessIterator last, 
  669.                                               T pivot);
  670.  
  671.   template <class RandomAccessIterator, class T, class Compare>
  672.   RandomAccessIterator __unguarded_partition (RandomAccessIterator first, 
  673.                                               RandomAccessIterator last, 
  674.                                               T pivot, Compare comp);
  675.  
  676.   template <class RandomAccessIterator, class T>
  677.   void __quick_sort_loop_aux (RandomAccessIterator first,
  678.                               RandomAccessIterator last, T*);
  679.  
  680.   template <class RandomAccessIterator>
  681.   inline void __quick_sort_loop (RandomAccessIterator first,
  682.                                  RandomAccessIterator last)
  683.   {
  684.     __quick_sort_loop_aux(first, last, _RWSTD_VALUE_TYPE(first));
  685.   }
  686.  
  687.   template <class RandomAccessIterator, class T, class Compare>
  688.   void __quick_sort_loop_aux (RandomAccessIterator first, 
  689.                               RandomAccessIterator last, T*, Compare comp);
  690.  
  691.   template <class RandomAccessIterator, class Compare>
  692.   inline void __quick_sort_loop (RandomAccessIterator first, 
  693.                                  RandomAccessIterator last, Compare comp)
  694.   {
  695.     __quick_sort_loop_aux(first, last, _RWSTD_VALUE_TYPE(first), comp);
  696.   }
  697.  
  698.   template <class RandomAccessIterator, class T>
  699.   void __unguarded_linear_insert (RandomAccessIterator last, T value);
  700.  
  701.   template <class RandomAccessIterator, class T, class Compare>
  702.   void __unguarded_linear_insert (RandomAccessIterator last,T value,Compare comp);
  703.  
  704.   template <class RandomAccessIterator, class T>
  705.   inline void __linear_insert (RandomAccessIterator first, 
  706.                                RandomAccessIterator last, T*)
  707.   {
  708.     T value = *last;
  709.     if (value < *first)
  710.     {
  711.       copy_backward(first, last, last + 1);
  712.       *first = value;
  713.     }
  714.     else
  715.       __unguarded_linear_insert(last, value);
  716.   }
  717.  
  718.   template <class RandomAccessIterator, class T, class Compare>
  719.   inline void __linear_insert (RandomAccessIterator first, 
  720.                                RandomAccessIterator last, T*, Compare comp)
  721.   {
  722.     T value = *last;
  723.     if (comp(value, *first))
  724.     {
  725.       copy_backward(first, last, last + 1);
  726.       *first = value;
  727.     }
  728.     else
  729.       __unguarded_linear_insert(last, value, comp);
  730.   }
  731.  
  732.   template <class RandomAccessIterator>
  733.   void __insertion_sort (RandomAccessIterator first, RandomAccessIterator last);
  734.  
  735.   template <class RandomAccessIterator, class Compare>
  736.   void __insertion_sort (RandomAccessIterator first,
  737.                          RandomAccessIterator last, Compare comp);
  738.  
  739.   template <class RandomAccessIterator, class T>
  740.   void __unguarded_insertion_sort_aux (RandomAccessIterator first, 
  741.                                        RandomAccessIterator last, T*);
  742.  
  743.   template <class RandomAccessIterator>
  744.   inline void __unguarded_insertion_sort(RandomAccessIterator first, 
  745.                                          RandomAccessIterator last)
  746.   {
  747.     __unguarded_insertion_sort_aux(first, last, _RWSTD_VALUE_TYPE(first));
  748.   }
  749.  
  750.   template <class RandomAccessIterator, class T, class Compare>
  751.   void __unguarded_insertion_sort_aux (RandomAccessIterator first, 
  752.                                        RandomAccessIterator last,
  753.                                        T*, Compare comp);
  754.  
  755.   template <class RandomAccessIterator, class Compare>
  756.   inline void __unguarded_insertion_sort (RandomAccessIterator first, 
  757.                                           RandomAccessIterator last,
  758.                                           Compare comp)
  759.   {
  760.     __unguarded_insertion_sort_aux(first, last, _RWSTD_VALUE_TYPE(first), comp);
  761.   }
  762.  
  763.   template <class RandomAccessIterator>
  764.   void __final_insertion_sort (RandomAccessIterator first, 
  765.                                RandomAccessIterator last);
  766.  
  767.   template <class RandomAccessIterator, class Compare>
  768.   void __final_insertion_sort (RandomAccessIterator first, 
  769.                                RandomAccessIterator last, Compare comp);
  770.  
  771.   template <class RandomAccessIterator>
  772.   inline void sort (RandomAccessIterator first, RandomAccessIterator last)
  773.   {
  774.     if (!(first == last))
  775.     {
  776.       __quick_sort_loop(first, last);
  777.       __final_insertion_sort(first, last);
  778.     }
  779.   }
  780.  
  781.   template <class RandomAccessIterator, class Compare>
  782.   inline void sort (RandomAccessIterator first, 
  783.                     RandomAccessIterator last, Compare comp)
  784.   {
  785.     if (!(first == last))
  786.     {
  787.       __quick_sort_loop(first, last, comp);
  788.       __final_insertion_sort(first, last, comp);
  789.     }
  790.   }
  791.  
  792.   template <class RandomAccessIterator>
  793.   inline void __inplace_stable_sort (RandomAccessIterator first,
  794.                                      RandomAccessIterator last)
  795.   {
  796.     if (last - first < 15)
  797.       __insertion_sort(first, last);
  798.     else
  799.     {
  800.       RandomAccessIterator middle = first + (last - first) / 2;
  801.       __inplace_stable_sort(first, middle);
  802.       __inplace_stable_sort(middle, last);
  803.       __merge_without_buffer(first, middle, last, middle - first,
  804.                              last - middle);
  805.     }
  806.   }
  807.  
  808.   template <class RandomAccessIterator, class Compare>
  809.   inline void __inplace_stable_sort (RandomAccessIterator first,
  810.                                      RandomAccessIterator last, Compare comp)
  811.   {
  812.     if (last - first < 15)
  813.       __insertion_sort(first, last, comp);
  814.     else
  815.     {
  816.       RandomAccessIterator middle = first + (last - first) / 2;
  817.       __inplace_stable_sort(first, middle, comp);
  818.       __inplace_stable_sort(middle, last, comp);
  819.       __merge_without_buffer(first, middle, last, middle - first,
  820.                              last - middle, comp);
  821.     }
  822.   }
  823.  
  824.   template <class RandomAccessIterator1, class RandomAccessIterator2,
  825.   class Distance>
  826.   void __merge_sort_loop (RandomAccessIterator1 first,
  827.                           RandomAccessIterator1 last, 
  828.                           RandomAccessIterator2 result, Distance step_size);
  829.  
  830.   template <class RandomAccessIterator1, class RandomAccessIterator2,
  831.   class Distance, class Compare>
  832.   void __merge_sort_loop (RandomAccessIterator1 first,
  833.                           RandomAccessIterator1 last, 
  834.                           RandomAccessIterator2 result, Distance step_size,
  835.                           Compare comp);
  836.  
  837.   template <class RandomAccessIterator, class Distance>
  838.   void __chunk_insertion_sort (RandomAccessIterator first, 
  839.                                RandomAccessIterator last, Distance chunk_size);
  840.  
  841.   template <class RandomAccessIterator, class Distance, class Compare>
  842.   void __chunk_insertion_sort (RandomAccessIterator first, 
  843.                                RandomAccessIterator last,
  844.                                Distance chunk_size, Compare comp);
  845.  
  846.   template <class RandomAccessIterator, class Pointer, class Distance, class T>
  847.   void __merge_sort_with_buffer (RandomAccessIterator first, 
  848.                                  RandomAccessIterator last,
  849.                                  Pointer buffer, Distance*, T*);
  850.  
  851.   template <class RandomAccessIterator, class Pointer, class Distance, class T,
  852.   class Compare>
  853.   void __merge_sort_with_buffer (RandomAccessIterator first, 
  854.                                  RandomAccessIterator last, Pointer buffer,
  855.                                  Distance*, T*, Compare comp);
  856.  
  857.   template <class RandomAccessIterator, class Pointer, class Distance, class T>
  858.   void __stable_sort_adaptive (RandomAccessIterator first, 
  859.                                RandomAccessIterator last, Pointer buffer,
  860.                                Distance buffer_size, T*);
  861.  
  862.   template <class RandomAccessIterator, class Pointer, class Distance, class T,
  863.   class Compare>
  864.   void __stable_sort_adaptive (RandomAccessIterator first, 
  865.                                RandomAccessIterator last, Pointer buffer,
  866.                                Distance buffer_size, T*, Compare comp);
  867.  
  868.   template <class RandomAccessIterator, class Pointer, class Distance, class T>
  869.   inline void __stable_sort (RandomAccessIterator first,
  870.                              RandomAccessIterator last,
  871.                              pair<Pointer, Distance>& p, T*)
  872.   {
  873.     if (p.first == 0)
  874.       __inplace_stable_sort(first, last);
  875.     else
  876.     {
  877.       Distance len = min((int)p.second, (int)(last - first));
  878.       copy(first, first + len, raw_storage_iterator<Pointer, T>(p.first));
  879.       __stable_sort_adaptive(first, last, p.first, p.second, _RWSTD_STATIC_CAST(T*,0));
  880.       __RWSTD::__destroy(p.first, p.first + len);
  881.       return_temporary_buffer(p.first);
  882.     }
  883.   }
  884.  
  885.   template <class RandomAccessIterator, class Pointer, class Distance, class T,
  886.   class Compare>
  887.   inline void __stable_sort (RandomAccessIterator first,
  888.                              RandomAccessIterator last,
  889.                              pair<Pointer, Distance>& p, T*, Compare comp)
  890.   {
  891.     if (p.first == 0)
  892.       __inplace_stable_sort(first, last, comp);
  893.     else
  894.     {
  895.       Distance len = min((int)p.second, (int)(last - first));
  896.       copy(first, first + len, raw_storage_iterator<Pointer, T>(p.first));
  897.       __stable_sort_adaptive(first, last, p.first, p.second, _RWSTD_STATIC_CAST(T*,0), comp);
  898.       __RWSTD::__destroy(p.first, p.first + len);
  899.       return_temporary_buffer(p.first);
  900.     }
  901.   }
  902.  
  903.   template <class RandomAccessIterator, class T, class Distance>
  904.   inline void __stable_sort_aux (RandomAccessIterator first,
  905.                                  RandomAccessIterator last, T*, Distance*)
  906.   {
  907.  
  908.     pair<T*, Distance> tmp = 
  909. #ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
  910.          get_temporary_buffer<T>(Distance(last-first));
  911. #else
  912.          get_temporary_buffer(Distance(last-first),_RWSTD_STATIC_CAST(T*,0));
  913. #endif
  914.     __stable_sort(first, last, tmp, _RWSTD_STATIC_CAST(T*,0));
  915.   }
  916.  
  917.   template <class RandomAccessIterator, class T, class Distance, class Compare>
  918.   inline void __stable_sort_aux (RandomAccessIterator first,
  919.                                  RandomAccessIterator last, T*, Distance*,
  920.                                  Compare comp)
  921.   {
  922.     pair<T*, Distance> tmp = 
  923. #ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
  924.         get_temporary_buffer<T>(Distance(last-first));
  925. #else
  926.         get_temporary_buffer(Distance(last-first),_RWSTD_STATIC_CAST(T*,0));
  927. #endif
  928.     __stable_sort(first, last, tmp, _RWSTD_STATIC_CAST(T*,0), comp);
  929.   }
  930.  
  931.   template <class RandomAccessIterator>
  932.   inline void stable_sort (RandomAccessIterator first,
  933.                            RandomAccessIterator last)
  934.   {
  935.     if (!(first == last))
  936.     {
  937.       __stable_sort_aux(first, last, _RWSTD_VALUE_TYPE(first),
  938.                         __distance_type(first));
  939.     }
  940.   }
  941.  
  942.   template <class RandomAccessIterator, class Compare>
  943.   inline void stable_sort (RandomAccessIterator first,
  944.                            RandomAccessIterator last, Compare comp)
  945.   {
  946.     if (!(first == last))
  947.     {
  948.       __stable_sort_aux(first, last, _RWSTD_VALUE_TYPE(first),
  949.                         __distance_type(first), comp);
  950.     }
  951.   }
  952.  
  953.   template <class RandomAccessIterator, class T>
  954.   void __partial_sort (RandomAccessIterator first, RandomAccessIterator middle,
  955.                        RandomAccessIterator last, T*);
  956.  
  957.   template <class RandomAccessIterator>
  958.   inline void partial_sort (RandomAccessIterator first,
  959.                             RandomAccessIterator middle,
  960.                             RandomAccessIterator last)
  961.   {
  962.     if (!(first == middle))
  963.       __partial_sort(first, middle, last, _RWSTD_VALUE_TYPE(first));
  964.   }
  965.  
  966.   template <class RandomAccessIterator, class T, class Compare>
  967.   void __partial_sort (RandomAccessIterator first, RandomAccessIterator middle,
  968.                        RandomAccessIterator last, T*, Compare comp);
  969.  
  970.   template <class RandomAccessIterator, class Compare>
  971.   inline void partial_sort (RandomAccessIterator first,
  972.                             RandomAccessIterator middle,
  973.                             RandomAccessIterator last, Compare comp)
  974.   {
  975.     if (!(first == middle))
  976.       __partial_sort(first, middle, last, _RWSTD_VALUE_TYPE(first), comp);
  977.   }
  978.  
  979.   template <class InputIterator, class RandomAccessIterator, class Distance,
  980.   class T>
  981.   RandomAccessIterator __partial_sort_copy (InputIterator first,
  982.                                             InputIterator last,
  983.                                             RandomAccessIterator result_first,
  984.                                             RandomAccessIterator result_last, 
  985.                                             Distance*, T*);
  986.  
  987.   template <class InputIterator, class RandomAccessIterator>
  988.   inline RandomAccessIterator
  989.   partial_sort_copy (InputIterator first, InputIterator last,
  990.                      RandomAccessIterator result_first,
  991.                      RandomAccessIterator result_last)
  992.   {
  993.     return first == last ? result_first :
  994.     __partial_sort_copy(first, last, result_first, result_last, 
  995.                         __distance_type(result_first),
  996.                         _RWSTD_VALUE_TYPE(first));
  997.   }
  998.  
  999.   template <class InputIterator, class RandomAccessIterator, class Compare,
  1000.   class Distance, class T>
  1001.   RandomAccessIterator __partial_sort_copy (InputIterator first,
  1002.                                             InputIterator last,
  1003.                                             RandomAccessIterator result_first,
  1004.                                             RandomAccessIterator result_last,
  1005.                                             Compare comp, Distance*, T*);
  1006.  
  1007.   template <class InputIterator, class RandomAccessIterator, class Compare>
  1008.   inline RandomAccessIterator
  1009.   partial_sort_copy (InputIterator first, InputIterator last,
  1010.                      RandomAccessIterator result_first,
  1011.                      RandomAccessIterator result_last, Compare comp)
  1012.   {
  1013.     return first == last ? result_first :
  1014.     __partial_sort_copy(first, last, result_first, result_last, comp,
  1015.                         __distance_type(result_first),
  1016.                         _RWSTD_VALUE_TYPE(first));
  1017.   }
  1018.  
  1019.   template <class RandomAccessIterator, class T>
  1020.   void __nth_element (RandomAccessIterator first, RandomAccessIterator nth,
  1021.                       RandomAccessIterator last, T*);
  1022.  
  1023.   template <class RandomAccessIterator>
  1024.   inline void nth_element (RandomAccessIterator first, RandomAccessIterator nth,
  1025.                            RandomAccessIterator last)
  1026.   {
  1027.     if (!(first == last))
  1028.       __nth_element(first, nth, last, _RWSTD_VALUE_TYPE(first));
  1029.   }
  1030.  
  1031.   template <class RandomAccessIterator, class T, class Compare>
  1032.   void __nth_element (RandomAccessIterator first, RandomAccessIterator nth,
  1033.                       RandomAccessIterator last, T*, Compare comp);
  1034.  
  1035.   template <class RandomAccessIterator, class Compare>
  1036.   inline void nth_element (RandomAccessIterator first, RandomAccessIterator nth,
  1037.                            RandomAccessIterator last, Compare comp)
  1038.   {
  1039.     if (!(first == last))
  1040.       __nth_element(first, nth, last, _RWSTD_VALUE_TYPE(first), comp);
  1041.   }
  1042.  
  1043. //
  1044. // Binary search.
  1045. //
  1046.  
  1047.   template <class ForwardIterator, class T, class Distance>
  1048.   ForwardIterator __lower_bound (ForwardIterator first, ForwardIterator last,
  1049.                                  const T& value, Distance*,
  1050.                                  forward_iterator_tag);
  1051.  
  1052.   template <class ForwardIterator, class T, class Distance>
  1053.   inline ForwardIterator __lower_bound (ForwardIterator first,
  1054.                                         ForwardIterator last,
  1055.                                         const T& value, Distance*,
  1056.                                         bidirectional_iterator_tag)
  1057.   {
  1058.     return __lower_bound(first, last, value, _RWSTD_STATIC_CAST(Distance*,0),
  1059.                          forward_iterator_tag());
  1060.   }
  1061.  
  1062.   template <class RandomAccessIterator, class T, class Distance>
  1063.   RandomAccessIterator __lower_bound (RandomAccessIterator first,
  1064.                                       RandomAccessIterator last, const T& value,
  1065.                                       Distance*, random_access_iterator_tag);
  1066.  
  1067.   template <class ForwardIterator, class T>
  1068.   inline ForwardIterator lower_bound (ForwardIterator first,ForwardIterator last,
  1069.                                       const T& value)
  1070.   {
  1071.  
  1072. #ifndef _RWSTD_NO_BASE_CLASS_MATCH
  1073.     return __lower_bound(first, last, value, __distance_type(first),                         __iterator_category(first));
  1074. #else
  1075.     return __lower_bound(first, last, value, __distance_type(first), 
  1076.                          forward_iterator_tag());
  1077. #endif
  1078.   }
  1079.  
  1080.   template <class ForwardIterator, class T, class Compare, class Distance>
  1081.   ForwardIterator __lower_bound (ForwardIterator first, ForwardIterator last,
  1082.                                  const T& value, Compare comp, Distance*,
  1083.                                  forward_iterator_tag);
  1084.  
  1085.   template <class ForwardIterator, class T, class Compare, class Distance>
  1086.   inline ForwardIterator __lower_bound (ForwardIterator first,
  1087.                                         ForwardIterator last,
  1088.                                         const T& value, Compare comp, Distance*,
  1089.                                         bidirectional_iterator_tag)
  1090.   {
  1091.     return __lower_bound(first, last, value, comp,_RWSTD_STATIC_CAST(Distance*,0),
  1092.                          forward_iterator_tag());
  1093.   }
  1094.  
  1095.   template <class RandomAccessIterator, class T, class Compare, class Distance>
  1096.   RandomAccessIterator __lower_bound (RandomAccessIterator first,
  1097.                                       RandomAccessIterator last,
  1098.                                       const T& value, Compare comp, Distance*,
  1099.                                       random_access_iterator_tag);
  1100.  
  1101.   template <class ForwardIterator, class T, class Compare>
  1102.   inline ForwardIterator lower_bound (ForwardIterator first,ForwardIterator last,
  1103.                                       const T& value, Compare comp)
  1104.   {
  1105. #ifndef _RWSTD_NO_BASE_CLASS_MATCH
  1106.     return __lower_bound(first, last, value, comp, __distance_type(first),
  1107.                          __iterator_category(first));
  1108. #else
  1109.     return __lower_bound(first, last, value, comp, __distance_type(first),
  1110.                          forward_iterator_tag());
  1111. #endif
  1112.   }
  1113.  
  1114.   template <class ForwardIterator, class T, class Distance>
  1115.   ForwardIterator __upper_bound (ForwardIterator first, ForwardIterator last,
  1116.                                  const T& value, Distance*,
  1117.                                  forward_iterator_tag);
  1118.  
  1119.   template <class ForwardIterator, class T, class Distance>
  1120.   inline ForwardIterator __upper_bound (ForwardIterator first,
  1121.                                         ForwardIterator last,
  1122.                                         const T& value, Distance*,
  1123.                                         bidirectional_iterator_tag)
  1124.   {
  1125.     return __upper_bound(first, last, value, _RWSTD_STATIC_CAST(Distance*,0),
  1126.                          forward_iterator_tag());
  1127.   }
  1128.  
  1129.   template <class RandomAccessIterator, class T, class Distance>
  1130.   RandomAccessIterator __upper_bound (RandomAccessIterator first,
  1131.                                       RandomAccessIterator last, const T& value,
  1132.                                       Distance*, random_access_iterator_tag);
  1133.  
  1134.   template <class ForwardIterator, class T>
  1135.   inline ForwardIterator upper_bound (ForwardIterator first,ForwardIterator last,
  1136.                                       const T& value)
  1137.   {
  1138. #ifndef _RWSTD_NO_BASE_CLASS_MATCH
  1139.     return __upper_bound(first, last, value, __distance_type(first),
  1140.                          __iterator_category(first));
  1141. #else
  1142.     return __upper_bound(first, last, value, __distance_type(first),
  1143.                          forward_iterator_tag());
  1144. #endif
  1145.   }
  1146.  
  1147.   template <class ForwardIterator, class T, class Compare, class Distance>
  1148.   ForwardIterator __upper_bound (ForwardIterator first, ForwardIterator last,
  1149.                                  const T& value, Compare comp, Distance*,
  1150.                                  forward_iterator_tag);
  1151.  
  1152.   template <class ForwardIterator, class T, class Compare, class Distance>
  1153.   inline ForwardIterator __upper_bound (ForwardIterator first,
  1154.                                         ForwardIterator last,
  1155.                                         const T& value, Compare comp, Distance*,
  1156.                                         bidirectional_iterator_tag)
  1157.   {
  1158.     return __upper_bound(first, last, value, comp, _RWSTD_STATIC_CAST(Distance*,0),
  1159.                          forward_iterator_tag());
  1160.   }
  1161.  
  1162.   template <class RandomAccessIterator, class T, class Compare, class Distance>
  1163.   RandomAccessIterator __upper_bound (RandomAccessIterator first,
  1164.                                       RandomAccessIterator last,
  1165.                                       const T& value, Compare comp, Distance*,
  1166.                                       random_access_iterator_tag);
  1167.  
  1168.   template <class ForwardIterator, class T, class Compare>
  1169.   inline ForwardIterator upper_bound (ForwardIterator first,ForwardIterator last,
  1170.                                       const T& value, Compare comp)
  1171.   {
  1172. #ifndef _RWSTD_NO_BASE_CLASS_MATCH
  1173.     return __upper_bound(first, last, value, comp, __distance_type(first),
  1174.                          __iterator_category(first));
  1175. #else
  1176.     return __upper_bound(first, last, value, comp, __distance_type(first),
  1177.                          forward_iterator_tag());
  1178. #endif
  1179.   }
  1180.  
  1181.   template <class ForwardIterator, class T, class Distance>
  1182.   pair<ForwardIterator, ForwardIterator>
  1183.   __equal_range (ForwardIterator first, ForwardIterator last, const T& value,
  1184.                  Distance*, forward_iterator_tag);
  1185.  
  1186.   template <class ForwardIterator, class T, class Distance>
  1187.   inline pair<ForwardIterator, ForwardIterator>
  1188.   __equal_range (ForwardIterator first, ForwardIterator last, const T& value,
  1189.                  Distance*, bidirectional_iterator_tag)
  1190.   {
  1191.     return __equal_range(first, last, value, _RWSTD_STATIC_CAST(Distance*,0), 
  1192.                          forward_iterator_tag());
  1193.   }
  1194.  
  1195.   template <class RandomAccessIterator, class T, class Distance>
  1196.   pair<RandomAccessIterator, RandomAccessIterator>
  1197.   __equal_range (RandomAccessIterator first, RandomAccessIterator last,
  1198.                  const T& value, Distance*, random_access_iterator_tag);
  1199.  
  1200.   template <class ForwardIterator, class T>
  1201.   inline pair<ForwardIterator, ForwardIterator>
  1202.   equal_range (ForwardIterator first, ForwardIterator last, const T& value)
  1203.   {
  1204. #ifndef _RWSTD_NO_BASE_CLASS_MATCH
  1205.     return __equal_range(first, last, value, __distance_type(first),
  1206.                          __iterator_category(first));
  1207. #else
  1208.     return __equal_range(first, last, value, __distance_type(first),
  1209.                          forward_iterator_tag());
  1210. #endif
  1211.   }
  1212.  
  1213.   template <class ForwardIterator, class T, class Compare, class Distance>
  1214.   pair<ForwardIterator, ForwardIterator>
  1215.   __equal_range (ForwardIterator first, ForwardIterator last, const T& value,
  1216.                  Compare comp, Distance*, forward_iterator_tag);
  1217.  
  1218.   template <class ForwardIterator, class T, class Compare, class Distance>
  1219.   inline pair<ForwardIterator, ForwardIterator>
  1220.   __equal_range (ForwardIterator first, ForwardIterator last, const T& value,
  1221.                  Compare comp, Distance*, bidirectional_iterator_tag)
  1222.   {
  1223.     return __equal_range(first, last, value, comp, _RWSTD_STATIC_CAST(Distance*,0), 
  1224.                          forward_iterator_tag());
  1225.   }
  1226.  
  1227.   template <class RandomAccessIterator, class T, class Compare, class Distance>
  1228.   pair<RandomAccessIterator, RandomAccessIterator>
  1229.   __equal_range (RandomAccessIterator first, RandomAccessIterator last,
  1230.                  const T& value, Compare comp, Distance*,
  1231.                  random_access_iterator_tag);
  1232.  
  1233.   template <class ForwardIterator, class T, class Compare>
  1234.   inline pair<ForwardIterator, ForwardIterator>
  1235.   equal_range (ForwardIterator first, ForwardIterator last, const T& value,
  1236.                Compare comp)
  1237.   {
  1238. #ifndef _RWSTD_NO_BASE_CLASS_MATCH
  1239.     return __equal_range(first, last, value, comp, __distance_type(first),
  1240.                          __iterator_category(first));
  1241. #else
  1242.     return __equal_range(first, last, value, comp, __distance_type(first),
  1243.                          forward_iterator_tag());
  1244. #endif
  1245.   }    
  1246.  
  1247.   template <class ForwardIterator, class T>
  1248.   inline bool binary_search (ForwardIterator first, ForwardIterator last,
  1249.                              const T& value)
  1250.   {
  1251.     ForwardIterator i = lower_bound(first, last, value);
  1252.     return i != last && !(value < *i);
  1253.   }
  1254.  
  1255.   template <class ForwardIterator, class T, class Compare>
  1256.   inline bool binary_search (ForwardIterator first, ForwardIterator last,
  1257.                              const T& value, Compare comp)
  1258.   {
  1259.     ForwardIterator i = lower_bound(first, last, value, comp);
  1260.     return i != last && !comp(value, *i);
  1261.   }
  1262.  
  1263. //
  1264. // Merge
  1265. //
  1266.  
  1267.   template <class InputIterator1, class InputIterator2, class OutputIterator>
  1268.   OutputIterator merge (InputIterator1 first1, InputIterator1 last1,
  1269.                         InputIterator2 first2, InputIterator2 last2,
  1270.                         OutputIterator result);
  1271.  
  1272.   template <class InputIterator1, class InputIterator2, class OutputIterator,
  1273.   class Compare>
  1274.   OutputIterator merge (InputIterator1 first1, InputIterator1 last1,
  1275.                         InputIterator2 first2, InputIterator2 last2,
  1276.                         OutputIterator result, Compare comp);
  1277.  
  1278.   template <class BidirectionalIterator, class Distance>
  1279.   void __merge_without_buffer (BidirectionalIterator first,
  1280.                                BidirectionalIterator middle,
  1281.                                BidirectionalIterator last,
  1282.                                Distance len1, Distance len2);
  1283.  
  1284.   template <class BidirectionalIterator, class Distance, class Compare>
  1285.   void __merge_without_buffer (BidirectionalIterator first,
  1286.                                BidirectionalIterator middle,
  1287.                                BidirectionalIterator last,
  1288.                                Distance len1, Distance len2, Compare comp);
  1289.  
  1290.   template <class BidirectionalIterator1, class BidirectionalIterator2,
  1291.   class Distance>
  1292.   BidirectionalIterator1 __rotate_adaptive (BidirectionalIterator1 first,
  1293.                                             BidirectionalIterator1 middle,
  1294.                                             BidirectionalIterator1 last,
  1295.                                             Distance len1, Distance len2,
  1296.                                             BidirectionalIterator2 buffer,
  1297.                                             Distance buffer_size);
  1298.  
  1299.   template <class BidirectionalIterator1, class BidirectionalIterator2,
  1300.   class BidirectionalIterator3>
  1301.   BidirectionalIterator3 __merge_backward (BidirectionalIterator1 first1,
  1302.                                            BidirectionalIterator1 last1,
  1303.                                            BidirectionalIterator2 first2,
  1304.                                            BidirectionalIterator2 last2,
  1305.                                            BidirectionalIterator3 result);
  1306.  
  1307.   template <class BidirectionalIterator1, class BidirectionalIterator2,
  1308.   class BidirectionalIterator3, class Compare>
  1309.   BidirectionalIterator3 __merge_backward (BidirectionalIterator1 first1,
  1310.                                            BidirectionalIterator1 last1,
  1311.                                            BidirectionalIterator2 first2,
  1312.                                            BidirectionalIterator2 last2,
  1313.                                            BidirectionalIterator3 result,
  1314.                                            Compare comp);
  1315.  
  1316.   template <class BidirectionalIterator, class Distance, class Pointer, class T>
  1317.   void __merge_adaptive (BidirectionalIterator first,
  1318.                          BidirectionalIterator middle,
  1319.                          BidirectionalIterator last, Distance len1,Distance len2,
  1320.                          Pointer buffer, Distance buffer_size, T*);
  1321.  
  1322.   template <class BidirectionalIterator, class Distance, class Pointer, class T,
  1323.   class Compare>
  1324.   void __merge_adaptive (BidirectionalIterator first,
  1325.                          BidirectionalIterator middle,
  1326.                          BidirectionalIterator last, Distance len1,Distance len2,
  1327.                          Pointer buffer, Distance buffer_size, T*, Compare comp);
  1328.  
  1329.   template <class BidirectionalIterator, class Distance, class Pointer, class T>
  1330.   void __inplace_merge (BidirectionalIterator first,
  1331.                         BidirectionalIterator middle, 
  1332.                         BidirectionalIterator last, Distance len1,
  1333.                         Distance len2, pair<Pointer, Distance> p, T*);
  1334.  
  1335.   template <class BidirectionalIterator, class Distance, class Pointer, class T,
  1336.   class Compare>
  1337.   void __inplace_merge (BidirectionalIterator first,
  1338.                         BidirectionalIterator middle,
  1339.                         BidirectionalIterator last, Distance len1,
  1340.                         Distance len2, pair<Pointer, Distance> p, T*,
  1341.                         Compare comp);
  1342.  
  1343.   template <class BidirectionalIterator, class T, class Distance>
  1344.   inline void __inplace_merge_aux (BidirectionalIterator first,
  1345.                                    BidirectionalIterator middle,
  1346.                                    BidirectionalIterator last, T*, Distance*)
  1347.   {
  1348.     Distance len1;
  1349.     __initialize(len1, Distance(0));
  1350.     distance(first, middle, len1);
  1351.     Distance len2;
  1352.     __initialize(len2, Distance(0));
  1353.     distance(middle, last, len2);
  1354.     __inplace_merge(first, middle, last, len1, len2, 
  1355. #ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
  1356.         get_temporary_buffer<T>(len1+len2),_RWSTD_STATIC_CAST(T*,0));
  1357. #else
  1358.         get_temporary_buffer(len1+len2,_RWSTD_STATIC_CAST(T*,0)),_RWSTD_STATIC_CAST(T*,0));
  1359. #endif
  1360.  
  1361.   }
  1362.  
  1363.   template <class BidirectionalIterator, class T, class Distance, class Compare>
  1364.   inline void __inplace_merge_aux (BidirectionalIterator first,
  1365.                                    BidirectionalIterator middle,
  1366.                                    BidirectionalIterator last, T*, Distance*,
  1367.                                    Compare comp)
  1368.   {
  1369.     Distance len1;
  1370.     __initialize(len1, Distance(0));
  1371.     distance(first, middle, len1);
  1372.     Distance len2;
  1373.     __initialize(len2, Distance(0));
  1374.     distance(middle, last, len2);
  1375.     __inplace_merge(first, middle, last, len1, len2, 
  1376. #ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
  1377.         get_temporary_buffer<T>(len1+len2), _RWSTD_STATIC_CAST(T*,0), comp);
  1378. #else
  1379.         get_temporary_buffer(len1 + len2, _RWSTD_STATIC_CAST(T*,0)), _RWSTD_STATIC_CAST(T*,0), comp);
  1380. #endif
  1381.   }
  1382.  
  1383.   template <class BidirectionalIterator>
  1384.   inline void inplace_merge (BidirectionalIterator first,
  1385.                              BidirectionalIterator middle,
  1386.                              BidirectionalIterator last)
  1387.   {
  1388.     if (!(first == middle || middle == last))
  1389.       __inplace_merge_aux(first, middle, last, _RWSTD_VALUE_TYPE(first),
  1390.                           __distance_type(first));
  1391.   }
  1392.  
  1393.   template <class BidirectionalIterator, class Compare>
  1394.   inline void inplace_merge (BidirectionalIterator first,
  1395.                              BidirectionalIterator middle,
  1396.                              BidirectionalIterator last, Compare comp)
  1397.   {
  1398.     if (!(first == middle || middle == last))
  1399.       __inplace_merge_aux(first, middle, last, _RWSTD_VALUE_TYPE(first),
  1400.                           __distance_type(first), comp);
  1401.   }
  1402.  
  1403. //
  1404. // Set operations.
  1405. //
  1406.  
  1407.   template <class InputIterator1, class InputIterator2>
  1408.   bool includes (InputIterator1 first1, InputIterator1 last1,
  1409.                  InputIterator2 first2, InputIterator2 last2);
  1410.  
  1411.   template <class InputIterator1, class InputIterator2, class Compare>
  1412.   bool includes (InputIterator1 first1, InputIterator1 last1,
  1413.                  InputIterator2 first2, InputIterator2 last2, 
  1414.                  Compare comp);
  1415.  
  1416.   template <class InputIterator1, class InputIterator2, class OutputIterator>
  1417.   OutputIterator set_union (InputIterator1 first1, InputIterator1 last1,
  1418.                             InputIterator2 first2, InputIterator2 last2,
  1419.                             OutputIterator result);
  1420.  
  1421.   template <class InputIterator1, class InputIterator2, class OutputIterator,
  1422.   class Compare>
  1423.   OutputIterator set_union (InputIterator1 first1, InputIterator1 last1,
  1424.                             InputIterator2 first2, InputIterator2 last2,
  1425.                             OutputIterator result, Compare comp);
  1426.  
  1427.   template <class InputIterator1, class InputIterator2, class OutputIterator>
  1428.   OutputIterator set_intersection (InputIterator1 first1, InputIterator1 last1,
  1429.                                    InputIterator2 first2, InputIterator2 last2,
  1430.                                    OutputIterator result);
  1431.  
  1432.   template <class InputIterator1, class InputIterator2, class OutputIterator,
  1433.   class Compare>
  1434.   OutputIterator set_intersection (InputIterator1 first1, InputIterator1 last1,
  1435.                                    InputIterator2 first2, InputIterator2 last2,
  1436.                                    OutputIterator result, Compare comp);
  1437.  
  1438.   template <class InputIterator1, class InputIterator2, class OutputIterator>
  1439.   OutputIterator set_difference (InputIterator1 first1, InputIterator1 last1,
  1440.                                  InputIterator2 first2, InputIterator2 last2,
  1441.                                  OutputIterator result);
  1442.  
  1443.   template <class InputIterator1, class InputIterator2, class OutputIterator, 
  1444.   class Compare>
  1445.   OutputIterator set_difference (InputIterator1 first1, InputIterator1 last1,
  1446.                                  InputIterator2 first2, InputIterator2 last2, 
  1447.                                  OutputIterator result, Compare comp);
  1448.  
  1449.   template <class InputIterator1, class InputIterator2, class OutputIterator>
  1450.   OutputIterator set_symmetric_difference (InputIterator1 first1,
  1451.                                            InputIterator1 last1,
  1452.                                            InputIterator2 first2,
  1453.                                            InputIterator2 last2,
  1454.                                            OutputIterator result);
  1455.  
  1456.   template <class InputIterator1, class InputIterator2, class OutputIterator,
  1457.   class Compare>
  1458.   OutputIterator set_symmetric_difference (InputIterator1 first1,
  1459.                                            InputIterator1 last1,
  1460.                                            InputIterator2 first2,
  1461.                                            InputIterator2 last2,
  1462.                                            OutputIterator result, 
  1463.                                            Compare comp);
  1464.  
  1465. //
  1466. // Heap operations.
  1467. //
  1468.  
  1469.   template <class RandomAccessIterator, class Distance, class T>
  1470.   void __push_heap (RandomAccessIterator first, Distance holeIndex,
  1471.                     Distance topIndex, T value);
  1472.  
  1473.   template <class RandomAccessIterator, class Distance, class T>
  1474.   inline void __push_heap_aux (RandomAccessIterator first,
  1475.                                RandomAccessIterator last, Distance*, T*)
  1476.   {
  1477.     __push_heap(first, Distance((last-first)-1), Distance(0), T(*(last-1)));
  1478.   }
  1479.  
  1480.   template <class RandomAccessIterator>
  1481.   inline void push_heap (RandomAccessIterator first, RandomAccessIterator last)
  1482.   {
  1483.     if (!(first == last))
  1484.       __push_heap_aux(first, last, __distance_type(first),
  1485.                       _RWSTD_VALUE_TYPE(first));
  1486.   }
  1487.  
  1488.   template <class RandomAccessIterator, class Distance, class T, class Compare>
  1489.   void __push_heap (RandomAccessIterator first, Distance holeIndex,
  1490.                     Distance topIndex, T value, Compare comp);
  1491.  
  1492.   template <class RandomAccessIterator, class Compare,  class Distance, class T>
  1493.   inline void __push_heap_aux (RandomAccessIterator first,
  1494.                                RandomAccessIterator last, Compare comp,
  1495.                                Distance*, T*)
  1496.   {
  1497.     __push_heap(first, Distance((last-first)-1), Distance(0),
  1498.                 T(*(last - 1)), comp);
  1499.   }
  1500.  
  1501.   template <class RandomAccessIterator, class Compare>
  1502.   inline void push_heap (RandomAccessIterator first, RandomAccessIterator last,
  1503.                          Compare comp)
  1504.   {
  1505.     if (!(first == last))
  1506.       __push_heap_aux(first, last, comp, __distance_type(first),
  1507.                       _RWSTD_VALUE_TYPE(first));
  1508.   }
  1509.  
  1510.   template <class RandomAccessIterator, class Distance, class T>
  1511.   void __adjust_heap (RandomAccessIterator first, Distance holeIndex,
  1512.                       Distance len, T value);
  1513.  
  1514.   template <class RandomAccessIterator, class T, class Distance>
  1515.   inline void __pop_heap (RandomAccessIterator first, RandomAccessIterator last,
  1516.                           RandomAccessIterator result, T value, Distance*)
  1517.   {
  1518.     *result = *first;
  1519.     __adjust_heap(first, Distance(0), Distance(last - first), value);
  1520.   }
  1521.  
  1522.   template <class RandomAccessIterator, class T>
  1523.   inline void __pop_heap_aux (RandomAccessIterator first,
  1524.                               RandomAccessIterator last, T*)
  1525.   {
  1526.     __pop_heap(first, last-1, last-1, T(*(last-1)), __distance_type(first));
  1527.   }
  1528.  
  1529.   template <class RandomAccessIterator>
  1530.   inline void pop_heap (RandomAccessIterator first, RandomAccessIterator last)
  1531.   {
  1532.     if (!(first == last))
  1533.       __pop_heap_aux(first, last, _RWSTD_VALUE_TYPE(first));
  1534.   }
  1535.  
  1536.   template <class RandomAccessIterator, class Distance, class T, class Compare>
  1537.   void __adjust_heap (RandomAccessIterator first, Distance holeIndex,
  1538.                       Distance len, T value, Compare comp);
  1539.  
  1540.   template <class RandomAccessIterator, class T, class Compare, class Distance>
  1541.   inline void __pop_heap (RandomAccessIterator first, RandomAccessIterator last,
  1542.                           RandomAccessIterator result, T value, Compare comp,
  1543.                           Distance*)
  1544.   {
  1545.     *result = *first;
  1546.     __adjust_heap(first, Distance(0), Distance(last - first), value, comp);
  1547.   }
  1548.  
  1549.   template <class RandomAccessIterator, class T, class Compare>
  1550.   inline void __pop_heap_aux (RandomAccessIterator first,
  1551.                               RandomAccessIterator last, T*, Compare comp)
  1552.   {
  1553.     __pop_heap(first, last - 1, last - 1, T(*(last - 1)), comp,
  1554.                __distance_type(first));
  1555.   }
  1556.  
  1557.   template <class RandomAccessIterator, class Compare>
  1558.   inline void pop_heap (RandomAccessIterator first, RandomAccessIterator last,
  1559.                         Compare comp)
  1560.   {
  1561.     if (!(first == last))
  1562.       __pop_heap_aux(first, last, _RWSTD_VALUE_TYPE(first), comp);
  1563.   }
  1564.  
  1565.   template <class RandomAccessIterator, class T, class Distance>
  1566.   void __make_heap (RandomAccessIterator first, RandomAccessIterator last, T*,
  1567.                     Distance*);
  1568.  
  1569.   template <class RandomAccessIterator>
  1570.   inline void make_heap (RandomAccessIterator first, RandomAccessIterator last)
  1571.   {
  1572.     if (!(last - first < 2))
  1573.       __make_heap(first, last, _RWSTD_VALUE_TYPE(first),
  1574.                   __distance_type(first));
  1575.   }
  1576.  
  1577.   template <class RandomAccessIterator, class Compare, class T, class Distance>
  1578.   void __make_heap (RandomAccessIterator first, RandomAccessIterator last,
  1579.                     Compare comp, T*, Distance*);
  1580.  
  1581.   template <class RandomAccessIterator, class Compare>
  1582.   inline void make_heap (RandomAccessIterator first, RandomAccessIterator last,
  1583.                          Compare comp)
  1584.   {
  1585.     if (!(last - first < 2))
  1586.       __make_heap(first, last, comp, _RWSTD_VALUE_TYPE(first),
  1587.                   __distance_type(first));
  1588.   }
  1589.  
  1590.   template <class RandomAccessIterator>
  1591.   void sort_heap (RandomAccessIterator first, RandomAccessIterator last);
  1592.  
  1593.   template <class RandomAccessIterator, class Compare>
  1594.   void sort_heap (RandomAccessIterator first, RandomAccessIterator last,
  1595.                   Compare comp);
  1596.  
  1597. //
  1598. // Minimum and maximum.
  1599. //
  1600.  
  1601. #if !defined(__MINMAX_DEFINED) 
  1602.   template <class T>
  1603.   inline const T& min (const T& a, const T& b)
  1604.   {
  1605.     return b < a ? b : a;
  1606.   }
  1607. #endif
  1608.  
  1609.   template <class T, class Compare>
  1610.   inline const T& min (const T& a, const T& b, Compare comp)
  1611.   {
  1612.     return comp(b, a) ? b : a;
  1613.   }
  1614.  
  1615. #if !defined(__MINMAX_DEFINED) 
  1616.   template <class T>
  1617.   inline const T& max (const T& a, const T& b)
  1618.   {
  1619.     return  a < b ? b : a;
  1620.   }
  1621. #endif
  1622.  
  1623.   template <class T, class Compare>
  1624.   inline const T& max (const T& a, const T& b, Compare comp)
  1625.   {
  1626.     return comp(a, b) ? b : a;
  1627.   }
  1628.  
  1629.   template <class ForwardIterator>
  1630.   ForwardIterator min_element (ForwardIterator first, ForwardIterator last);
  1631.  
  1632.   template <class ForwardIterator, class Compare>
  1633.   ForwardIterator min_element (ForwardIterator first, ForwardIterator last,
  1634.                                Compare comp);
  1635.  
  1636.   template <class ForwardIterator>
  1637.   ForwardIterator max_element (ForwardIterator first, ForwardIterator last);
  1638.  
  1639.   template <class ForwardIterator, class Compare>
  1640.   ForwardIterator max_element (ForwardIterator first, ForwardIterator last,
  1641.                                Compare comp);
  1642.  
  1643.   template <class InputIterator1, class InputIterator2>
  1644.   bool lexicographical_compare (InputIterator1 first1, InputIterator1 last1,
  1645.                                 InputIterator2 first2, InputIterator2 last2);
  1646.  
  1647.   template <class InputIterator1, class InputIterator2, class Compare>
  1648.   bool lexicographical_compare(InputIterator1 first1, InputIterator1 last1,
  1649.                                InputIterator2 first2, InputIterator2 last2,
  1650.                                Compare comp);
  1651.  
  1652. //
  1653. // Permutations.
  1654. //
  1655.  
  1656.   template <class BidirectionalIterator>
  1657.   bool next_permutation (BidirectionalIterator first,
  1658.                          BidirectionalIterator last);
  1659.  
  1660.   template <class BidirectionalIterator, class Compare>
  1661.   bool next_permutation (BidirectionalIterator first, BidirectionalIterator last,
  1662.                          Compare comp);
  1663.  
  1664.   template <class BidirectionalIterator>
  1665.   bool prev_permutation (BidirectionalIterator first,
  1666.                          BidirectionalIterator last);
  1667.  
  1668.   template <class BidirectionalIterator, class Compare>
  1669.   bool prev_permutation (BidirectionalIterator first, BidirectionalIterator last,
  1670.                          Compare comp);
  1671.  
  1672. #ifndef _RWSTD_NO_NAMESPACE
  1673. }
  1674. #endif
  1675.  
  1676. #ifdef _RWSTD_NO_TEMPLATE_REPOSITORY
  1677. #include <algorith.cc> 
  1678. #endif
  1679.  
  1680. #endif /*__STD_ALGORITHM*/
  1681.  
  1682. #ifndef __USING_STD_NAMES__
  1683.   using namespace std;
  1684. #endif
  1685.  
  1686. #pragma option pop
  1687. #endif /* __ALGORITH_H */
  1688.