/*============================================================================= 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_MAKE_PARTIAL_HEAP_HPP #define SPROUT_ALGORITHM_FIXED_MAKE_PARTIAL_HEAP_HPP #include #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::results::algorithm::type make_partial_heap_impl_1( 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 middle_size, typename sprout::container_traits::difference_type n ) { return n < size ? comp(*sprout::next(sprout::internal_begin(cont), offset + n), *sprout::next(sprout::internal_begin(cont), offset)) ? sprout::fixed::detail::make_partial_heap_impl_1( sprout::fixed::detail::pop_heap_impl( sprout::fixed::swap_element( cont, sprout::next(sprout::internal_begin(cont), offset + n), sprout::next(sprout::internal_begin(cont), offset) ), comp, offset, middle_size ), comp, offset, size, middle_size, n + 1 ) : sprout::fixed::detail::make_partial_heap_impl_1(cont, comp, offset, size, middle_size, n + 1) : sprout::deep_copy(cont) ; } template inline SPROUT_CONSTEXPR typename sprout::fixed::results::algorithm::type make_partial_heap_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 middle_size ) { return sprout::fixed::detail::make_partial_heap_impl_1( sprout::fixed::detail::make_heap_impl(cont, comp, offset, middle_size), comp, offset, size, middle_size, middle_size ); } } // namespace detail // // make_partial_heap // template inline SPROUT_CONSTEXPR typename sprout::fixed::results::algorithm::type make_partial_heap(Container const& cont, typename sprout::container_traits::const_iterator middle, Compare comp) { return sprout::fixed::detail::make_partial_heap_impl( cont, comp, sprout::internal_begin_offset(cont), sprout::size(cont), sprout::distance(sprout::begin(cont), middle) ); } // // make_partial_heap // template inline SPROUT_CONSTEXPR typename sprout::fixed::results::algorithm::type make_partial_heap(Container const& cont, typename sprout::container_traits::const_iterator middle) { return sprout::fixed::detail::make_partial_heap_impl( cont, NS_SSCRISK_CEL_OR_SPROUT::less::value_type>(), sprout::internal_begin_offset(cont), sprout::size(cont), sprout::distance(sprout::begin(cont), middle) ); } } // namespace fixed using sprout::fixed::make_partial_heap; } // namespace sprout #endif // #ifndef SPROUT_ALGORITHM_FIXED_MAKE_PARTIAL_HEAP_HPP