/*============================================================================= Copyright (c) 2011-2016 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_FIT_NEXT_PERMUTATION_HPP #define SPROUT_ALGORITHM_FIT_NEXT_PERMUTATION_HPP #include #include #include #include #include #include #include #include namespace sprout { namespace fit { namespace detail { template inline SPROUT_CONSTEXPR sprout::pair::type, bool> next_permutation_impl_1( Container const& cont, Permutation const& perm, typename sprout::container_traits::difference_type offset ) { return sprout::pair::type, bool>( sprout::sub_copy( sprout::get_internal(perm.first), offset, offset + sprout::size(cont) ), perm.second ); } template inline SPROUT_CONSTEXPR sprout::pair::type, bool> next_permutation_impl( Container const& cont, Compare comp, typename sprout::container_traits::difference_type offset ) { return next_permutation_impl_1(cont, sprout::fixed::next_permutation(cont, comp), offset); } } // namespace detail // // next_permutation // template inline SPROUT_CONSTEXPR sprout::pair::type, bool> next_permutation(Container const& cont, Compare comp) { return sprout::fit::detail::next_permutation_impl(cont, comp, sprout::internal_begin_offset(cont)); } namespace detail { template inline SPROUT_CONSTEXPR sprout::pair::type, bool> next_permutation_impl( Container const& cont, typename sprout::container_traits::difference_type offset ) { return next_permutation_impl_1(cont, sprout::fixed::next_permutation(cont), offset); } } // namespace detail // // next_permutation // template inline SPROUT_CONSTEXPR sprout::pair::type, bool> next_permutation(Container const& cont) { return sprout::fit::detail::next_permutation_impl(cont, sprout::internal_begin_offset(cont)); } } // namespace fit } // namespace sprout #endif // #ifndef SPROUT_ALGORITHM_FIT_NEXT_PERMUTATION_HPP