diff --git a/include/boost/range/algorithm/max_element.hpp b/include/boost/range/algorithm/max_element.hpp index dd2b9cb..50669b3 100644 --- a/include/boost/range/algorithm/max_element.hpp +++ b/include/boost/range/algorithm/max_element.hpp @@ -3,17 +3,18 @@ // 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // +// Copyright 2019 Glen Joseph Fernandes (glenjofe@gmail.com) // // For more information, see http://www.boost.org/libs/range/ // #ifndef BOOST_RANGE_ALGORITHM_MAX_ELEMENT_HPP_INCLUDED #define BOOST_RANGE_ALGORITHM_MAX_ELEMENT_HPP_INCLUDED -#include #include #include #include #include +#include #include namespace boost @@ -21,6 +22,27 @@ namespace boost namespace range { +namespace detail +{ + +template +inline Iterator +max_element(Iterator first, Iterator last, Predicate comp) +{ + if (first == last) { + return last; + } + Iterator result = first; + while (++first != last) { + if (comp(*result, *first)) { + result = first; + } + } + return result; +} + +} // namespace detail + /// \brief template function max_element /// /// range-based version of the max_element std algorithm @@ -32,7 +54,7 @@ inline BOOST_DEDUCED_TYPENAME range_iterator::type max_element(ForwardRange& rng) { BOOST_RANGE_CONCEPT_ASSERT(( ForwardRangeConcept )); - return boost::first_max_element(boost::begin(rng), boost::end(rng)); + return detail::max_element(boost::begin(rng), boost::end(rng), detail::less()); } /// \overload @@ -41,7 +63,7 @@ inline BOOST_DEDUCED_TYPENAME range_iterator::type max_element(const ForwardRange& rng) { BOOST_RANGE_CONCEPT_ASSERT(( ForwardRangeConcept )); - return boost::first_max_element(boost::begin(rng), boost::end(rng)); + return detail::max_element(boost::begin(rng), boost::end(rng), detail::less()); } /// \overload @@ -50,7 +72,7 @@ inline BOOST_DEDUCED_TYPENAME range_iterator::type max_element(ForwardRange& rng, BinaryPredicate pred) { BOOST_RANGE_CONCEPT_ASSERT(( ForwardRangeConcept )); - return boost::first_max_element(boost::begin(rng), boost::end(rng), pred); + return detail::max_element(boost::begin(rng), boost::end(rng), pred); } /// \overload @@ -59,7 +81,7 @@ inline BOOST_DEDUCED_TYPENAME range_iterator::type max_element(const ForwardRange& rng, BinaryPredicate pred) { BOOST_RANGE_CONCEPT_ASSERT(( ForwardRangeConcept )); - return boost::first_max_element(boost::begin(rng), boost::end(rng), pred); + return detail::max_element(boost::begin(rng), boost::end(rng), pred); } // range_return overloads @@ -71,7 +93,7 @@ max_element(ForwardRange& rng) { BOOST_RANGE_CONCEPT_ASSERT(( ForwardRangeConcept )); return range_return::pack( - boost::first_max_element(boost::begin(rng), boost::end(rng)), + detail::max_element(boost::begin(rng), boost::end(rng), detail::less()), rng); } @@ -82,7 +104,7 @@ max_element(const ForwardRange& rng) { BOOST_RANGE_CONCEPT_ASSERT(( ForwardRangeConcept )); return range_return::pack( - boost::first_max_element(boost::begin(rng), boost::end(rng)), + detail::max_element(boost::begin(rng), boost::end(rng), detail::less()), rng); } @@ -93,7 +115,7 @@ max_element(ForwardRange& rng, BinaryPredicate pred) { BOOST_RANGE_CONCEPT_ASSERT(( ForwardRangeConcept )); return range_return::pack( - boost::first_max_element(boost::begin(rng), boost::end(rng), pred), + detail::max_element(boost::begin(rng), boost::end(rng), pred), rng); } @@ -104,7 +126,7 @@ max_element(const ForwardRange& rng, BinaryPredicate pred) { BOOST_RANGE_CONCEPT_ASSERT(( ForwardRangeConcept )); return range_return::pack( - boost::first_max_element(boost::begin(rng), boost::end(rng), pred), + detail::max_element(boost::begin(rng), boost::end(rng), pred), rng); } diff --git a/include/boost/range/algorithm/min_element.hpp b/include/boost/range/algorithm/min_element.hpp index 339f56a..764de8b 100644 --- a/include/boost/range/algorithm/min_element.hpp +++ b/include/boost/range/algorithm/min_element.hpp @@ -3,17 +3,18 @@ // 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // +// Copyright 2019 Glen Joseph Fernandes (glenjofe@gmail.com) // // For more information, see http://www.boost.org/libs/range/ // #ifndef BOOST_RANGE_ALGORITHM_MIN_ELEMENT_HPP_INCLUDED #define BOOST_RANGE_ALGORITHM_MIN_ELEMENT_HPP_INCLUDED -#include #include #include #include #include +#include #include namespace boost @@ -21,6 +22,27 @@ namespace boost namespace range { +namespace detail +{ + +template +inline Iterator +min_element(Iterator first, Iterator last, Predicate comp) +{ + if (first == last) { + return last; + } + Iterator result = first; + while (++first != last) { + if (comp(*first, *result)) { + result = first; + } + } + return result; +} + +} // namespace detail + /// \brief template function min_element /// /// range-based version of the min_element std algorithm @@ -32,7 +54,7 @@ inline BOOST_DEDUCED_TYPENAME range_iterator::type min_element(ForwardRange& rng) { BOOST_RANGE_CONCEPT_ASSERT(( ForwardRangeConcept )); - return boost::first_min_element(boost::begin(rng), boost::end(rng)); + return detail::min_element(boost::begin(rng), boost::end(rng), detail::less()); } /// \overload @@ -41,7 +63,7 @@ inline BOOST_DEDUCED_TYPENAME range_iterator::type min_element(const ForwardRange& rng) { BOOST_RANGE_CONCEPT_ASSERT(( ForwardRangeConcept )); - return boost::first_min_element(boost::begin(rng), boost::end(rng)); + return detail::min_element(boost::begin(rng), boost::end(rng), detail::less()); } /// \overload @@ -50,7 +72,7 @@ inline BOOST_DEDUCED_TYPENAME range_iterator::type min_element(ForwardRange& rng, BinaryPredicate pred) { BOOST_RANGE_CONCEPT_ASSERT(( ForwardRangeConcept )); - return boost::first_min_element(boost::begin(rng), boost::end(rng), pred); + return detail::min_element(boost::begin(rng), boost::end(rng), pred); } /// \overload @@ -59,7 +81,7 @@ inline BOOST_DEDUCED_TYPENAME range_iterator::type min_element(const ForwardRange& rng, BinaryPredicate pred) { BOOST_RANGE_CONCEPT_ASSERT(( ForwardRangeConcept )); - return boost::first_min_element(boost::begin(rng), boost::end(rng), pred); + return detail::min_element(boost::begin(rng), boost::end(rng), pred); } // range_return overloads @@ -71,7 +93,7 @@ min_element(ForwardRange& rng) { BOOST_RANGE_CONCEPT_ASSERT(( ForwardRangeConcept )); return range_return::pack( - boost::first_min_element(boost::begin(rng), boost::end(rng)), + detail::min_element(boost::begin(rng), boost::end(rng), detail::less()), rng); } @@ -82,7 +104,7 @@ min_element(const ForwardRange& rng) { BOOST_RANGE_CONCEPT_ASSERT(( ForwardRangeConcept )); return range_return::pack( - boost::first_min_element(boost::begin(rng), boost::end(rng)), + detail::min_element(boost::begin(rng), boost::end(rng), detail::less()), rng); } @@ -93,7 +115,7 @@ min_element(ForwardRange& rng, BinaryPredicate pred) { BOOST_RANGE_CONCEPT_ASSERT(( ForwardRangeConcept )); return range_return::pack( - boost::first_min_element(boost::begin(rng), boost::end(rng), pred), + detail::min_element(boost::begin(rng), boost::end(rng), pred), rng); } @@ -104,7 +126,7 @@ min_element(const ForwardRange& rng, BinaryPredicate pred) { BOOST_RANGE_CONCEPT_ASSERT(( ForwardRangeConcept )); return range_return::pack( - boost::first_min_element(boost::begin(rng), boost::end(rng), pred), + detail::min_element(boost::begin(rng), boost::end(rng), pred), rng); } diff --git a/include/boost/range/detail/less.hpp b/include/boost/range/detail/less.hpp new file mode 100644 index 0000000..957c5b6 --- /dev/null +++ b/include/boost/range/detail/less.hpp @@ -0,0 +1,26 @@ +/* +Copyright 2019 Glen Joseph Fernandes +(glenjofe@gmail.com) + +Distributed under the Boost Software License, Version 1.0. +(http://www.boost.org/LICENSE_1_0.txt) +*/ +#ifndef BOOST_RANGE_DETAIL_LESS +#define BOOST_RANGE_DETAIL_LESS + +namespace boost { +namespace range { +namespace detail { + +struct less { + template + bool operator()(const T& lhs, const U& rhs) const { + return lhs < rhs; + } +}; + +} /* detail */ +} /* range */ +} /* boost */ + +#endif