| 
									
										
										
										
											2004-07-01 20:16:38 +00:00
										 |  |  | //  (C) Copyright Herve Bronnimann 2004.
 | 
					
						
							| 
									
										
										
										
											2006-07-27 10:27:37 +00:00
										 |  |  | //
 | 
					
						
							|  |  |  | // Distributed under the Boost Software License, Version 1.0. (See accompanying
 | 
					
						
							|  |  |  | // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 | 
					
						
							| 
									
										
										
										
											2004-07-01 20:16:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  Revision history: | 
					
						
							|  |  |  |    1 July 2004 | 
					
						
							|  |  |  |       Split the code into two headers to lessen dependence on | 
					
						
							|  |  |  |       Boost.tuple. (Herve) | 
					
						
							|  |  |  |    26 June 2004 | 
					
						
							|  |  |  |       Added the code for the boost minmax library. (Herve) | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef BOOST_ALGORITHM_MINMAX_ELEMENT_HPP
 | 
					
						
							|  |  |  | #define BOOST_ALGORITHM_MINMAX_ELEMENT_HPP
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* PROPOSED STANDARD EXTENSIONS:
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * minmax_element(first, last) | 
					
						
							|  |  |  |  * Effect: std::make_pair( std::min_element(first, last), | 
					
						
							|  |  |  |  *                         std::max_element(first, last) ); | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * minmax_element(first, last, comp) | 
					
						
							|  |  |  |  * Effect: std::make_pair( std::min_element(first, last, comp), | 
					
						
							|  |  |  |  *                         std::max_element(first, last, comp) ); | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <utility> // for std::pair and std::make_pair
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace boost { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   namespace detail {  // for obtaining a uniform version of minmax_element
 | 
					
						
							|  |  |  |     // that compiles with VC++ 6.0 -- avoid the iterator_traits by
 | 
					
						
							|  |  |  |     // having comparison object over iterator, not over dereferenced value
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <typename Iterator> | 
					
						
							|  |  |  |     struct less_over_iter { | 
					
						
							|  |  |  |       bool operator()(Iterator const& it1, | 
					
						
							|  |  |  |                       Iterator const& it2) const { return *it1 < *it2; } | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <typename Iterator, class BinaryPredicate> | 
					
						
							|  |  |  |     struct binary_pred_over_iter { | 
					
						
							|  |  |  |       explicit binary_pred_over_iter(BinaryPredicate const& p ) : m_p( p ) {} | 
					
						
							|  |  |  |       bool operator()(Iterator const& it1, | 
					
						
							|  |  |  |                       Iterator const& it2) const { return m_p(*it1, *it2); } | 
					
						
							|  |  |  |     private: | 
					
						
							|  |  |  |       BinaryPredicate m_p; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // common base for the two minmax_element overloads
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <typename ForwardIter, class Compare > | 
					
						
							|  |  |  |     std::pair<ForwardIter,ForwardIter> | 
					
						
							|  |  |  |     basic_minmax_element(ForwardIter first, ForwardIter last, Compare comp) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       if (first == last) | 
					
						
							|  |  |  |         return std::make_pair(last,last); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       ForwardIter min_result = first; | 
					
						
							|  |  |  |       ForwardIter max_result = first; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // if only one element
 | 
					
						
							|  |  |  |       ForwardIter second = first; ++second; | 
					
						
							|  |  |  |       if (second == last) | 
					
						
							| 
									
										
										
										
											2004-07-25 15:09:51 +00:00
										 |  |  |         return std::make_pair(min_result, max_result); | 
					
						
							| 
									
										
										
										
											2004-07-01 20:16:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |       // treat first pair separately (only one comparison for first two elements)
 | 
					
						
							|  |  |  |       ForwardIter potential_min_result = last; | 
					
						
							|  |  |  |       if (comp(first, second)) | 
					
						
							| 
									
										
										
										
											2004-07-25 15:09:51 +00:00
										 |  |  |         max_result = second; | 
					
						
							| 
									
										
										
										
											2004-07-01 20:16:38 +00:00
										 |  |  |       else { | 
					
						
							| 
									
										
										
										
											2004-07-25 15:09:51 +00:00
										 |  |  |         min_result = second; | 
					
						
							|  |  |  |         potential_min_result = first; | 
					
						
							| 
									
										
										
										
											2004-07-01 20:16:38 +00:00
										 |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // then each element by pairs, with at most 3 comparisons per pair
 | 
					
						
							|  |  |  |       first = ++second; if (first != last) ++second; | 
					
						
							|  |  |  |       while (second != last) { | 
					
						
							| 
									
										
										
										
											2004-07-25 15:09:51 +00:00
										 |  |  |         if (comp(first, second)) { | 
					
						
							|  |  |  |           if (comp(first, min_result)) { | 
					
						
							|  |  |  |             min_result = first; | 
					
						
							|  |  |  |             potential_min_result = last; | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           if (comp(max_result, second)) | 
					
						
							|  |  |  |             max_result = second; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |           if (comp(second, min_result)) { | 
					
						
							|  |  |  |             min_result = second; | 
					
						
							|  |  |  |             potential_min_result = first; | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           if (comp(max_result, first)) | 
					
						
							|  |  |  |             max_result = first; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         first = ++second; | 
					
						
							|  |  |  |         if (first != last) ++second; | 
					
						
							| 
									
										
										
										
											2004-07-01 20:16:38 +00:00
										 |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // if odd number of elements, treat last element
 | 
					
						
							|  |  |  |       if (first != last) { // odd number of elements
 | 
					
						
							| 
									
										
										
										
											2004-07-25 15:09:51 +00:00
										 |  |  |         if (comp(first, min_result)) | 
					
						
							|  |  |  |           min_result = first, potential_min_result = last; | 
					
						
							|  |  |  |         else if (comp(max_result, first)) | 
					
						
							|  |  |  |           max_result = first; | 
					
						
							| 
									
										
										
										
											2004-07-01 20:16:38 +00:00
										 |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // resolve min_result being incorrect with one extra comparison
 | 
					
						
							|  |  |  |       // (in which case potential_min_result is necessarily the correct result)
 | 
					
						
							|  |  |  |       if (potential_min_result != last | 
					
						
							| 
									
										
										
										
											2004-07-25 15:09:51 +00:00
										 |  |  |         && !comp(min_result, potential_min_result)) | 
					
						
							|  |  |  |         min_result = potential_min_result; | 
					
						
							| 
									
										
										
										
											2004-07-01 20:16:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |       return std::make_pair(min_result,max_result); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   } // namespace detail
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename ForwardIter> | 
					
						
							|  |  |  |   std::pair<ForwardIter,ForwardIter> | 
					
						
							|  |  |  |   minmax_element(ForwardIter first, ForwardIter last) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     return detail::basic_minmax_element(first, last, | 
					
						
							|  |  |  |              detail::less_over_iter<ForwardIter>() ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename ForwardIter, class BinaryPredicate> | 
					
						
							|  |  |  |   std::pair<ForwardIter,ForwardIter> | 
					
						
							|  |  |  |   minmax_element(ForwardIter first, ForwardIter last, BinaryPredicate comp) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     return detail::basic_minmax_element(first, last, | 
					
						
							|  |  |  |              detail::binary_pred_over_iter<ForwardIter,BinaryPredicate>(comp) ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* PROPOSED BOOST EXTENSIONS
 | 
					
						
							|  |  |  |  * In the description below, [rfirst,rlast) denotes the reversed range | 
					
						
							|  |  |  |  * of [first,last). Even though the iterator type of first and last may | 
					
						
							|  |  |  |  * be only a Forward Iterator, it is possible to explain the semantics | 
					
						
							|  |  |  |  * by assuming that it is a Bidirectional Iterator. In the sequel, | 
					
						
							|  |  |  |  * reverse(ForwardIterator&) returns the reverse_iterator adaptor. | 
					
						
							|  |  |  |  * This is not how the functions would be implemented! | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * first_min_element(first, last) | 
					
						
							|  |  |  |  * Effect: std::min_element(first, last); | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * first_min_element(first, last, comp) | 
					
						
							|  |  |  |  * Effect: std::min_element(first, last, comp); | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * last_min_element(first, last) | 
					
						
							|  |  |  |  * Effect: reverse( std::min_element(reverse(last), reverse(first)) ); | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * last_min_element(first, last, comp) | 
					
						
							|  |  |  |  * Effect: reverse( std::min_element(reverse(last), reverse(first), comp) ); | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * first_max_element(first, last) | 
					
						
							|  |  |  |  * Effect: std::max_element(first, last); | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * first_max_element(first, last, comp) | 
					
						
							|  |  |  |  * Effect: max_element(first, last); | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * last_max_element(first, last) | 
					
						
							|  |  |  |  * Effect: reverse( std::max_element(reverse(last), reverse(first)) ); | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * last_max_element(first, last, comp) | 
					
						
							|  |  |  |  * Effect: reverse( std::max_element(reverse(last), reverse(first), comp) ); | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * first_min_first_max_element(first, last) | 
					
						
							|  |  |  |  * Effect: std::make_pair( first_min_element(first, last), | 
					
						
							|  |  |  |  *                         first_max_element(first, last) ); | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * first_min_first_max_element(first, last, comp) | 
					
						
							|  |  |  |  * Effect: std::make_pair( first_min_element(first, last, comp), | 
					
						
							|  |  |  |  *                         first_max_element(first, last, comp) ); | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * first_min_last_max_element(first, last) | 
					
						
							|  |  |  |  * Effect: std::make_pair( first_min_element(first, last), | 
					
						
							|  |  |  |  *                         last_max_element(first, last) ); | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * first_min_last_max_element(first, last, comp) | 
					
						
							|  |  |  |  * Effect: std::make_pair( first_min_element(first, last, comp), | 
					
						
							|  |  |  |  *                         last_max_element(first, last, comp) ); | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * last_min_first_max_element(first, last) | 
					
						
							|  |  |  |  * Effect: std::make_pair( last_min_element(first, last), | 
					
						
							|  |  |  |  *                         first_max_element(first, last) ); | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * last_min_first_max_element(first, last, comp) | 
					
						
							|  |  |  |  * Effect: std::make_pair( last_min_element(first, last, comp), | 
					
						
							|  |  |  |  *                         first_max_element(first, last, comp) ); | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * last_min_last_max_element(first, last) | 
					
						
							|  |  |  |  * Effect: std::make_pair( last_min_element(first, last), | 
					
						
							|  |  |  |  *                         last_max_element(first, last) ); | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * last_min_last_max_element(first, last, comp) | 
					
						
							|  |  |  |  * Effect: std::make_pair( last_min_element(first, last, comp), | 
					
						
							|  |  |  |  *                         last_max_element(first, last, comp) ); | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace boost { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Min_element and max_element variants
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   namespace detail {  // common base for the overloads
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename ForwardIter, class BinaryPredicate> | 
					
						
							|  |  |  |   ForwardIter | 
					
						
							|  |  |  |   basic_first_min_element(ForwardIter first, ForwardIter last, | 
					
						
							|  |  |  |                           BinaryPredicate comp) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     if (first == last) return last; | 
					
						
							|  |  |  |     ForwardIter min_result = first; | 
					
						
							|  |  |  |     while (++first != last) | 
					
						
							|  |  |  |       if (comp(first, min_result)) | 
					
						
							|  |  |  |         min_result = first; | 
					
						
							|  |  |  |     return min_result; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename ForwardIter, class BinaryPredicate> | 
					
						
							|  |  |  |   ForwardIter | 
					
						
							|  |  |  |   basic_last_min_element(ForwardIter first, ForwardIter last, | 
					
						
							|  |  |  |                          BinaryPredicate comp) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     if (first == last) return last; | 
					
						
							|  |  |  |     ForwardIter min_result = first; | 
					
						
							|  |  |  |     while (++first != last) | 
					
						
							|  |  |  |       if (!comp(min_result, first)) | 
					
						
							|  |  |  |         min_result = first; | 
					
						
							|  |  |  |     return min_result; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename ForwardIter, class BinaryPredicate> | 
					
						
							|  |  |  |   ForwardIter | 
					
						
							|  |  |  |   basic_first_max_element(ForwardIter first, ForwardIter last, | 
					
						
							|  |  |  |                           BinaryPredicate comp) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     if (first == last) return last; | 
					
						
							|  |  |  |     ForwardIter max_result = first; | 
					
						
							|  |  |  |     while (++first != last) | 
					
						
							|  |  |  |       if (comp(max_result, first)) | 
					
						
							|  |  |  |         max_result = first; | 
					
						
							|  |  |  |     return max_result; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename ForwardIter, class BinaryPredicate> | 
					
						
							|  |  |  |   ForwardIter | 
					
						
							|  |  |  |   basic_last_max_element(ForwardIter first, ForwardIter last, | 
					
						
							|  |  |  |                          BinaryPredicate comp) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     if (first == last) return last; | 
					
						
							|  |  |  |     ForwardIter max_result = first; | 
					
						
							|  |  |  |     while (++first != last) | 
					
						
							|  |  |  |       if (!comp(first, max_result)) | 
					
						
							|  |  |  |         max_result = first; | 
					
						
							|  |  |  |     return max_result; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   } // namespace detail
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename ForwardIter> | 
					
						
							|  |  |  |   ForwardIter | 
					
						
							|  |  |  |   first_min_element(ForwardIter first, ForwardIter last) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     return detail::basic_first_min_element(first, last, | 
					
						
							|  |  |  |              detail::less_over_iter<ForwardIter>() ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename ForwardIter, class BinaryPredicate> | 
					
						
							|  |  |  |   ForwardIter | 
					
						
							|  |  |  |   first_min_element(ForwardIter first, ForwardIter last, BinaryPredicate comp) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     return detail::basic_first_min_element(first, last, | 
					
						
							|  |  |  |              detail::binary_pred_over_iter<ForwardIter,BinaryPredicate>(comp) ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename ForwardIter> | 
					
						
							|  |  |  |   ForwardIter | 
					
						
							|  |  |  |   last_min_element(ForwardIter first, ForwardIter last) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     return detail::basic_last_min_element(first, last, | 
					
						
							|  |  |  |              detail::less_over_iter<ForwardIter>() ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename ForwardIter, class BinaryPredicate> | 
					
						
							|  |  |  |   ForwardIter | 
					
						
							|  |  |  |   last_min_element(ForwardIter first, ForwardIter last, BinaryPredicate comp) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     return detail::basic_last_min_element(first, last, | 
					
						
							|  |  |  |              detail::binary_pred_over_iter<ForwardIter,BinaryPredicate>(comp) ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename ForwardIter> | 
					
						
							|  |  |  |   ForwardIter | 
					
						
							|  |  |  |   first_max_element(ForwardIter first, ForwardIter last) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     return detail::basic_first_max_element(first, last, | 
					
						
							|  |  |  |              detail::less_over_iter<ForwardIter>() ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename ForwardIter, class BinaryPredicate> | 
					
						
							|  |  |  |   ForwardIter | 
					
						
							|  |  |  |   first_max_element(ForwardIter first, ForwardIter last, BinaryPredicate comp) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     return detail::basic_first_max_element(first, last, | 
					
						
							|  |  |  |              detail::binary_pred_over_iter<ForwardIter,BinaryPredicate>(comp) ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename ForwardIter> | 
					
						
							|  |  |  |   ForwardIter | 
					
						
							|  |  |  |   last_max_element(ForwardIter first, ForwardIter last) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     return detail::basic_last_max_element(first, last, | 
					
						
							|  |  |  |              detail::less_over_iter<ForwardIter>() ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename ForwardIter, class BinaryPredicate> | 
					
						
							|  |  |  |   ForwardIter | 
					
						
							|  |  |  |   last_max_element(ForwardIter first, ForwardIter last, BinaryPredicate comp) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     return detail::basic_last_max_element(first, last, | 
					
						
							|  |  |  |              detail::binary_pred_over_iter<ForwardIter,BinaryPredicate>(comp) ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Minmax_element variants -- comments removed
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   namespace detail { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename ForwardIter, class BinaryPredicate> | 
					
						
							|  |  |  |   std::pair<ForwardIter,ForwardIter> | 
					
						
							|  |  |  |   basic_first_min_last_max_element(ForwardIter first, ForwardIter last, | 
					
						
							|  |  |  |                                    BinaryPredicate comp) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     if (first == last) | 
					
						
							|  |  |  |       return std::make_pair(last,last); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ForwardIter min_result = first; | 
					
						
							|  |  |  |     ForwardIter max_result = first; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ForwardIter second = ++first; | 
					
						
							|  |  |  |     if (second == last) | 
					
						
							|  |  |  |       return std::make_pair(min_result, max_result); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (comp(second, min_result)) | 
					
						
							|  |  |  |       min_result = second; | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       max_result = second; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     first = ++second; if (first != last) ++second; | 
					
						
							|  |  |  |     while (second != last) { | 
					
						
							|  |  |  |       if (!comp(second, first)) { | 
					
						
							|  |  |  |         if (comp(first, min_result)) | 
					
						
							| 
									
										
										
										
											2004-07-25 15:09:51 +00:00
										 |  |  |                  min_result = first; | 
					
						
							| 
									
										
										
										
											2004-07-01 20:16:38 +00:00
										 |  |  |         if (!comp(second, max_result)) | 
					
						
							| 
									
										
										
										
											2004-07-25 15:09:51 +00:00
										 |  |  |           max_result = second; | 
					
						
							| 
									
										
										
										
											2004-07-01 20:16:38 +00:00
										 |  |  |       } else { | 
					
						
							|  |  |  |         if (comp(second, min_result)) | 
					
						
							| 
									
										
										
										
											2004-07-25 15:09:51 +00:00
										 |  |  |           min_result = second; | 
					
						
							| 
									
										
										
										
											2004-07-01 20:16:38 +00:00
										 |  |  |         if (!comp(first, max_result)) | 
					
						
							| 
									
										
										
										
											2004-07-25 15:09:51 +00:00
										 |  |  |               max_result = first; | 
					
						
							| 
									
										
										
										
											2004-07-01 20:16:38 +00:00
										 |  |  |       } | 
					
						
							|  |  |  |       first = ++second; if (first != last) ++second; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (first != last) { | 
					
						
							|  |  |  |       if (comp(first, min_result)) | 
					
						
							| 
									
										
										
										
											2004-07-25 15:09:51 +00:00
										 |  |  |          min_result = first; | 
					
						
							| 
									
										
										
										
											2004-07-01 20:16:38 +00:00
										 |  |  |       else if (!comp(first, max_result)) | 
					
						
							| 
									
										
										
										
											2004-07-25 15:09:51 +00:00
										 |  |  |                max_result = first; | 
					
						
							| 
									
										
										
										
											2004-07-01 20:16:38 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return std::make_pair(min_result, max_result); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename ForwardIter, class BinaryPredicate> | 
					
						
							|  |  |  |   std::pair<ForwardIter,ForwardIter> | 
					
						
							|  |  |  |   basic_last_min_first_max_element(ForwardIter first, ForwardIter last, | 
					
						
							|  |  |  |                                    BinaryPredicate comp) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     if (first == last) return std::make_pair(last,last); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ForwardIter min_result = first; | 
					
						
							|  |  |  |     ForwardIter max_result = first; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ForwardIter second = ++first; | 
					
						
							|  |  |  |     if (second == last) | 
					
						
							|  |  |  |       return std::make_pair(min_result, max_result); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (comp(max_result, second)) | 
					
						
							|  |  |  |       max_result = second; | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       min_result = second; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     first = ++second; if (first != last) ++second; | 
					
						
							|  |  |  |     while (second != last)  { | 
					
						
							|  |  |  |       if (comp(first, second)) { | 
					
						
							|  |  |  |         if (!comp(min_result, first)) | 
					
						
							|  |  |  |           min_result = first; | 
					
						
							|  |  |  |         if (comp(max_result, second)) | 
					
						
							|  |  |  |           max_result = second; | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  |         if (!comp(min_result, second)) | 
					
						
							|  |  |  |           min_result = second; | 
					
						
							|  |  |  |         if (comp(max_result, first)) | 
					
						
							|  |  |  |           max_result = first; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       first = ++second; if (first != last) ++second; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (first != last) { | 
					
						
							|  |  |  |       if (!comp(min_result, first)) | 
					
						
							|  |  |  |         min_result = first; | 
					
						
							|  |  |  |       else if (comp(max_result, first)) | 
					
						
							|  |  |  |         max_result = first; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return std::make_pair(min_result, max_result); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename ForwardIter, class BinaryPredicate> | 
					
						
							|  |  |  |   std::pair<ForwardIter,ForwardIter> | 
					
						
							|  |  |  |   basic_last_min_last_max_element(ForwardIter first, ForwardIter last, | 
					
						
							|  |  |  |                                   BinaryPredicate comp) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     if (first == last) return std::make_pair(last,last); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ForwardIter min_result = first; | 
					
						
							|  |  |  |     ForwardIter max_result = first; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ForwardIter second = first; ++second; | 
					
						
							|  |  |  |     if (second == last) | 
					
						
							|  |  |  |       return std::make_pair(min_result,max_result); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ForwardIter potential_max_result = last; | 
					
						
							|  |  |  |     if (comp(first, second)) | 
					
						
							|  |  |  |       max_result = second; | 
					
						
							|  |  |  |     else { | 
					
						
							|  |  |  |       min_result = second; | 
					
						
							|  |  |  |       potential_max_result = second; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     first = ++second; if (first != last) ++second; | 
					
						
							|  |  |  |     while (second != last) { | 
					
						
							|  |  |  |       if (comp(first, second)) { | 
					
						
							|  |  |  |         if (!comp(min_result, first)) | 
					
						
							|  |  |  |           min_result = first; | 
					
						
							|  |  |  |         if (!comp(second, max_result)) { | 
					
						
							|  |  |  |           max_result = second; | 
					
						
							| 
									
										
										
										
											2004-07-25 15:09:51 +00:00
										 |  |  |           potential_max_result = last; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2004-07-01 20:16:38 +00:00
										 |  |  |       } else { | 
					
						
							|  |  |  |         if (!comp(min_result, second)) | 
					
						
							|  |  |  |           min_result = second; | 
					
						
							|  |  |  |         if (!comp(first, max_result)) { | 
					
						
							|  |  |  |           max_result = first; | 
					
						
							| 
									
										
										
										
											2004-07-25 15:09:51 +00:00
										 |  |  |           potential_max_result = second; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2004-07-01 20:16:38 +00:00
										 |  |  |       } | 
					
						
							|  |  |  |       first = ++second; | 
					
						
							|  |  |  |       if (first != last) ++second; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (first != last) { | 
					
						
							|  |  |  |       if (!comp(min_result, first)) | 
					
						
							|  |  |  |         min_result = first; | 
					
						
							|  |  |  |       if (!comp(first, max_result)) { | 
					
						
							|  |  |  |         max_result = first; | 
					
						
							| 
									
										
										
										
											2004-07-25 15:09:51 +00:00
										 |  |  |                potential_max_result = last; | 
					
						
							| 
									
										
										
										
											2004-07-01 20:16:38 +00:00
										 |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (potential_max_result != last | 
					
						
							|  |  |  |         && !comp(potential_max_result, max_result)) | 
					
						
							|  |  |  |       max_result = potential_max_result; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return std::make_pair(min_result,max_result); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   } // namespace detail
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename ForwardIter> | 
					
						
							|  |  |  |   inline std::pair<ForwardIter,ForwardIter> | 
					
						
							|  |  |  |   first_min_first_max_element(ForwardIter first, ForwardIter last) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     return minmax_element(first, last); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename ForwardIter, class BinaryPredicate> | 
					
						
							|  |  |  |   inline std::pair<ForwardIter,ForwardIter> | 
					
						
							|  |  |  |   first_min_first_max_element(ForwardIter first, ForwardIter last, | 
					
						
							|  |  |  |                               BinaryPredicate comp) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     return minmax_element(first, last, comp); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename ForwardIter> | 
					
						
							|  |  |  |   std::pair<ForwardIter,ForwardIter> | 
					
						
							|  |  |  |   first_min_last_max_element(ForwardIter first, ForwardIter last) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     return detail::basic_first_min_last_max_element(first, last, | 
					
						
							|  |  |  |              detail::less_over_iter<ForwardIter>() ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename ForwardIter, class BinaryPredicate> | 
					
						
							|  |  |  |   inline std::pair<ForwardIter,ForwardIter> | 
					
						
							|  |  |  |   first_min_last_max_element(ForwardIter first, ForwardIter last, | 
					
						
							|  |  |  |                               BinaryPredicate comp) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     return detail::basic_first_min_last_max_element(first, last, | 
					
						
							|  |  |  |              detail::binary_pred_over_iter<ForwardIter,BinaryPredicate>(comp) ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename ForwardIter> | 
					
						
							|  |  |  |   std::pair<ForwardIter,ForwardIter> | 
					
						
							|  |  |  |   last_min_first_max_element(ForwardIter first, ForwardIter last) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     return detail::basic_last_min_first_max_element(first, last, | 
					
						
							|  |  |  |              detail::less_over_iter<ForwardIter>() ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename ForwardIter, class BinaryPredicate> | 
					
						
							|  |  |  |   inline std::pair<ForwardIter,ForwardIter> | 
					
						
							|  |  |  |   last_min_first_max_element(ForwardIter first, ForwardIter last, | 
					
						
							|  |  |  |                               BinaryPredicate comp) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     return detail::basic_last_min_first_max_element(first, last, | 
					
						
							|  |  |  |              detail::binary_pred_over_iter<ForwardIter,BinaryPredicate>(comp) ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename ForwardIter> | 
					
						
							|  |  |  |   std::pair<ForwardIter,ForwardIter> | 
					
						
							|  |  |  |   last_min_last_max_element(ForwardIter first, ForwardIter last) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     return detail::basic_last_min_last_max_element(first, last, | 
					
						
							|  |  |  |              detail::less_over_iter<ForwardIter>() ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename ForwardIter, class BinaryPredicate> | 
					
						
							|  |  |  |   inline std::pair<ForwardIter,ForwardIter> | 
					
						
							|  |  |  |   last_min_last_max_element(ForwardIter first, ForwardIter last, | 
					
						
							|  |  |  |                               BinaryPredicate comp) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     return detail::basic_last_min_last_max_element(first, last, | 
					
						
							|  |  |  |              detail::binary_pred_over_iter<ForwardIter,BinaryPredicate>(comp) ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace boost
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif // BOOST_ALGORITHM_MINMAX_ELEMENT_HPP
 |