/*============================================================================= Copyright (c) 2011-2013 Bolero MURAKAMI https://github.com/bolero-MURAKAMI/Sprout 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) =============================================================================*/ #ifndef SPROUT_ALGORITHM_FIXED_NTH_ELEMENT_HPP #define SPROUT_ALGORITHM_FIXED_NTH_ELEMENT_HPP #include #include #include #include #include #include #include #include HDR_FUNCTIONAL_SSCRISK_CEL_OR_SPROUT namespace sprout { namespace fixed { namespace detail { template inline SPROUT_CONSTEXPR typename sprout::fixed::result_of::algorithm::type nth_element_impl_1( Container const& cont, typename sprout::container_traits::difference_type offset, typename sprout::container_traits::difference_type nth_size ) { return sprout::fixed::swap_element( cont, sprout::next(sprout::internal_begin(cont), offset), sprout::next(sprout::internal_begin(cont), offset + nth_size) ); } template inline SPROUT_CONSTEXPR typename sprout::fixed::result_of::algorithm::type nth_element_impl( Container const& cont, Compare comp, typename sprout::container_traits::difference_type offset, typename sprout::container_traits::difference_type size, typename sprout::container_traits::difference_type nth_size ) { return sprout::fixed::detail::nth_element_impl_1( sprout::fixed::detail::make_partial_heap_impl(cont, comp, offset, size, nth_size + 1), offset, nth_size ); } } // namespace detail // // nth_element // template inline SPROUT_CONSTEXPR typename sprout::fixed::result_of::algorithm::type nth_element(Container const& cont, typename sprout::container_traits::const_iterator nth, Compare comp) { return sprout::fixed::detail::nth_element_impl( cont, comp, sprout::internal_begin_offset(cont), sprout::size(cont), sprout::distance(sprout::begin(cont), nth) ); } template inline SPROUT_CONSTEXPR typename sprout::fixed::result_of::algorithm::type nth_element(Container const& cont, typename sprout::container_traits::const_iterator nth) { return sprout::fixed::detail::nth_element_impl( cont, NS_SSCRISK_CEL_OR_SPROUT::less::value_type>(), sprout::internal_begin_offset(cont), sprout::size(cont), sprout::distance(sprout::begin(cont), nth) ); } } // namespace fixed using sprout::fixed::nth_element; } // namespace sprout #endif // #ifndef SPROUT_ALGORITHM_FIXED_NTH_ELEMENT_HPP