/// \file // Range v3 library // // Copyright Filip Matzner 2015 // // Use, modification and distribution is subject to 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) // // Project home: https://github.com/ericniebler/range-v3 // #ifndef RANGES_V3_ACTION_SHUFFLE_HPP #define RANGES_V3_ACTION_SHUFFLE_HPP #include #include #include #include #include #include #include #include #include #include namespace ranges { /// \addtogroup group-actions /// @{ namespace actions { struct shuffle_fn { template(typename Gen)( requires uniform_random_bit_generator) constexpr auto operator()(Gen & gen) const { return make_action_closure( bind_back(shuffle_fn{}, detail::reference_wrapper_(gen))); } template(typename Gen)( requires uniform_random_bit_generator) constexpr auto operator()(Gen && gen) const { return make_action_closure( bind_back(shuffle_fn{}, static_cast(gen))); } template(typename Rng, typename Gen)( requires random_access_range AND permutable> AND uniform_random_bit_generator> AND convertible_to, range_difference_t>) Rng operator()(Rng && rng, Gen && gen) const { ranges::shuffle(rng, static_cast(gen)); return static_cast(rng); } /// \cond template invoke_result_t // operator()(Rng && rng, detail::reference_wrapper_ r) const { return (*this)(static_cast(rng), r.get()); } /// \endcond }; /// \relates actions::shuffle_fn /// \sa `action_closure` RANGES_INLINE_VARIABLE(shuffle_fn, shuffle) } // namespace actions /// @} } // namespace ranges #include #endif