#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