1 //  Copyright Neil Groves 2009. Use, modification and
2 //  distribution is subject to the Boost Software License, Version
3 //  1.0. (See accompanying file LICENSE_1_0.txt or copy at
4 //  http://www.boost.org/LICENSE_1_0.txt)
5 //
6 //
7 // For more information, see http://www.boost.org/libs/range/
8 //
9 #ifndef BOOST_RANGE_ALGORITHM_MAX_ELEMENT_HPP_INCLUDED
10 #define BOOST_RANGE_ALGORITHM_MAX_ELEMENT_HPP_INCLUDED
11 
12 #include <boost/concept_check.hpp>
13 #include <boost/range/begin.hpp>
14 #include <boost/range/end.hpp>
15 #include <boost/range/concepts.hpp>
16 #include <boost/range/detail/range_return.hpp>
17 #include <algorithm>
18 
19 namespace pdalboost
20 {
21     namespace range
22     {
23 
24 /// \brief template function max_element
25 ///
26 /// range-based version of the max_element std algorithm
27 ///
28 /// \pre ForwardRange is a model of the ForwardRangeConcept
29 /// \pre BinaryPredicate is a model of the BinaryPredicateConcept
30 template<class ForwardRange>
31 inline BOOST_DEDUCED_TYPENAME range_iterator<ForwardRange>::type
max_element(ForwardRange & rng)32 max_element(ForwardRange& rng)
33 {
34     BOOST_RANGE_CONCEPT_ASSERT(( ForwardRangeConcept<ForwardRange> ));
35     return std::max_element(pdalboost::begin(rng), pdalboost::end(rng));
36 }
37 
38 /// \overload
39 template<class ForwardRange>
40 inline BOOST_DEDUCED_TYPENAME range_iterator<const ForwardRange>::type
max_element(const ForwardRange & rng)41 max_element(const ForwardRange& rng)
42 {
43     BOOST_RANGE_CONCEPT_ASSERT(( ForwardRangeConcept<const ForwardRange> ));
44     return std::max_element(pdalboost::begin(rng), pdalboost::end(rng));
45 }
46 
47 /// \overload
48 template<class ForwardRange, class BinaryPredicate>
49 inline BOOST_DEDUCED_TYPENAME range_iterator<ForwardRange>::type
max_element(ForwardRange & rng,BinaryPredicate pred)50 max_element(ForwardRange& rng, BinaryPredicate pred)
51 {
52     BOOST_RANGE_CONCEPT_ASSERT(( ForwardRangeConcept<ForwardRange> ));
53     return std::max_element(pdalboost::begin(rng), pdalboost::end(rng), pred);
54 }
55 
56 /// \overload
57 template<class ForwardRange, class BinaryPredicate>
58 inline BOOST_DEDUCED_TYPENAME range_iterator<const ForwardRange>::type
max_element(const ForwardRange & rng,BinaryPredicate pred)59 max_element(const ForwardRange& rng, BinaryPredicate pred)
60 {
61     BOOST_RANGE_CONCEPT_ASSERT(( ForwardRangeConcept<const ForwardRange> ));
62     return std::max_element(pdalboost::begin(rng), pdalboost::end(rng), pred);
63 }
64 
65 // range_return overloads
66 
67 /// \overload
68 template<range_return_value re, class ForwardRange>
69 inline BOOST_DEDUCED_TYPENAME range_return<ForwardRange,re>::type
max_element(ForwardRange & rng)70 max_element(ForwardRange& rng)
71 {
72     BOOST_RANGE_CONCEPT_ASSERT(( ForwardRangeConcept<ForwardRange> ));
73     return range_return<ForwardRange,re>::pack(
74         std::max_element(pdalboost::begin(rng), pdalboost::end(rng)),
75         rng);
76 }
77 
78 /// \overload
79 template<range_return_value re, class ForwardRange>
80 inline BOOST_DEDUCED_TYPENAME range_return<const ForwardRange,re>::type
max_element(const ForwardRange & rng)81 max_element(const ForwardRange& rng)
82 {
83     BOOST_RANGE_CONCEPT_ASSERT(( ForwardRangeConcept<const ForwardRange> ));
84     return range_return<const ForwardRange,re>::pack(
85         std::max_element(pdalboost::begin(rng), pdalboost::end(rng)),
86         rng);
87 }
88 
89 /// \overload
90 template<range_return_value re, class ForwardRange, class BinaryPredicate>
91 inline BOOST_DEDUCED_TYPENAME range_return<ForwardRange,re>::type
max_element(ForwardRange & rng,BinaryPredicate pred)92 max_element(ForwardRange& rng, BinaryPredicate pred)
93 {
94     BOOST_RANGE_CONCEPT_ASSERT(( ForwardRangeConcept<ForwardRange> ));
95     return range_return<ForwardRange,re>::pack(
96         std::max_element(pdalboost::begin(rng), pdalboost::end(rng), pred),
97         rng);
98 }
99 
100 /// \overload
101 template<range_return_value re, class ForwardRange, class BinaryPredicate>
102 inline BOOST_DEDUCED_TYPENAME range_return<const ForwardRange,re>::type
max_element(const ForwardRange & rng,BinaryPredicate pred)103 max_element(const ForwardRange& rng, BinaryPredicate pred)
104 {
105     BOOST_RANGE_CONCEPT_ASSERT(( ForwardRangeConcept<const ForwardRange> ));
106     return range_return<const ForwardRange,re>::pack(
107         std::max_element(pdalboost::begin(rng), pdalboost::end(rng), pred),
108         rng);
109 }
110 
111     } // namespace range
112     using range::max_element;
113 } // namespace pdalboost
114 
115 #endif // include guard
116