diff --git a/sprout/algorithm/minmax.hpp b/sprout/algorithm/minmax.hpp index 9d4eb898..26ff3d2a 100644 --- a/sprout/algorithm/minmax.hpp +++ b/sprout/algorithm/minmax.hpp @@ -9,24 +9,60 @@ #ifndef SPROUT_ALGORITHM_MINMAX_HPP #define SPROUT_ALGORITHM_MINMAX_HPP +#include #include #include +#include +#include #include HDR_FUNCTIONAL_SSCRISK_CEL_OR_SPROUT namespace sprout { - // 25.4.7 Minimum and maximum template - inline SPROUT_CONSTEXPR sprout::pair + inline SPROUT_CONSTEXPR sprout::pair minmax(T const& a, T const& b, Compare comp) { - return comp(b, a) ? sprout::pair(b, a) : sprout::pair(a, b); + return comp(b, a) ? sprout::pair(b, a) : sprout::pair(a, b); + } + + template + inline SPROUT_CONSTEXPR sprout::pair + minmax(T const& a, T const& b) { + return sprout::minmax(a, b, NS_SSCRISK_CEL_OR_SPROUT::less()); + } + + namespace detail { + template + inline SPROUT_CONSTEXPR sprout::pair + minmax_impl(sprout::pair const& p) { + return sprout::pair(*p.first, *p.second); + } + } // namespace detail + +#ifdef SPROUT_NO_CXX14_INITIALIZER_LIST + template + inline SPROUT_CONSTEXPR sprout::pair + minmax(std::initializer_list t, Compare comp) { + return sprout::detail::minmax_impl(sprout::minmax_element(sprout::ptr_index(t.begin(), 0), sprout::ptr_index(t.begin(), t.size()), comp)); } template inline SPROUT_CONSTEXPR sprout::pair - minmax(T const& a, T const& b) { - return sprout::minmax(a, b, NS_SSCRISK_CEL_OR_SPROUT::less()); + minmax(std::initializer_list t) { + return sprout::minmax(t, NS_SSCRISK_CEL_OR_SPROUT::less()); } +#else // #ifdef SPROUT_NO_CXX14_INITIALIZER_LIST + template + inline sprout::pair + minmax(std::initializer_list t, Compare comp) { + return sprout::detail::minmax_impl(sprout::minmax_element(sprout::ptr_index(t.begin(), 0), sprout::ptr_index(t.begin(), t.size()), comp)); + } + + template + inline sprout::pair + minmax(std::initializer_list t) { + return sprout::minmax(t, NS_SSCRISK_CEL_OR_SPROUT::less()); + } +#endif // #ifdef SPROUT_NO_CXX14_INITIALIZER_LIST } // namespace sprout #endif // #ifndef SPROUT_ALGORITHM_MINMAX_HPP