// ============================================================================ // // Copyright (c) 2003 The CGAL Consortium // // This software and related documentation is part of an INTERNAL release // of the Computational Geometry Algorithms Library (CGAL). It is not // intended for general use. // // ---------------------------------------------------------------------------- // // release : $CGAL_Revision: $ // release_date : $CGAL_Date: $ // // file : algorithm.h // chapter : $CGAL_Chapter: STL Extensions for CGAL $ // package : $CGAL_Package: STL_Extension $ // source : stl_extension.fw // revision : $Revision$ // revision_date : $Date$ // author(s) : Michael Hoffmann // Lutz Kettner // Sylvain Pion // // maintainer : Michael Hoffmann // coordinator : ETH // // STL like algorithms // ============================================================================ #ifndef CGAL_ALGORITHM_H #define CGAL_ALGORITHM_H 1 #include #include #include CGAL_BEGIN_NAMESPACE template < class ForwardIterator > std::pair< ForwardIterator, ForwardIterator > min_max_element(ForwardIterator first, ForwardIterator last) { typedef std::pair< ForwardIterator, ForwardIterator > FP; FP result(first, first); if (first != last) while (++first != last) { if (*first < *result.first) result.first = first; if (*result.second < *first) result.second = first; } return result; } template < class ForwardIterator, class CompareMin, class CompareMax > std::pair< ForwardIterator, ForwardIterator > min_max_element(ForwardIterator first, ForwardIterator last, CompareMin comp_min, CompareMax comp_max) { typedef std::pair< ForwardIterator, ForwardIterator > FP; FP result(first, first); if (first != last) while (++first != last) { if (comp_min(*first, *result.first)) result.first = first; if (comp_max(*result.second, *first)) result.second = first; } return result; } template < class ForwardIterator, class Predicate > ForwardIterator min_element_if(ForwardIterator first, ForwardIterator last, Predicate pred) { ForwardIterator result = first = std::find_if(first, last, pred); if (first != last) while (++first != last) if (*first < *result && pred(*first)) result = first; return result; } template < class ForwardIterator, class Compare, class Predicate > ForwardIterator min_element_if(ForwardIterator first, ForwardIterator last, Compare comp, Predicate pred) { ForwardIterator result = first = std::find_if(first, last, pred); if (first != last) while (++first != last) if (comp(*first, *result) && pred(*first)) result = first; return result; } template < class ForwardIterator, class Predicate > ForwardIterator max_element_if(ForwardIterator first, ForwardIterator last, Predicate pred) { ForwardIterator result = first = std::find_if(first, last, pred); if (first != last) while (++first != last) if (*result < *first && pred(*first)) result = first; return result; } template < class ForwardIterator, class Compare, class Predicate > ForwardIterator max_element_if(ForwardIterator first, ForwardIterator last, Compare comp, Predicate pred) { ForwardIterator result = first = std::find_if(first, last, pred); if (first != last) while (++first != last) if (comp(*result, *first) && pred(*first)) result = first; return result; } CGAL_END_NAMESPACE #endif // CGAL_ALGORITHM_H // // EOF //