%PDF- %PDF-
| Direktori : /lib/python3/dist-packages/pythran/pythonic/random/ |
| Current File : //lib/python3/dist-packages/pythran/pythonic/random/shuffle.hpp |
#ifndef PYTHONIC_RANDOM_SHUFFLE_HPP
#define PYTHONIC_RANDOM_SHUFFLE_HPP
#include "pythonic/include/random/shuffle.hpp"
#include "pythonic/utils/functor.hpp"
#include "pythonic/builtins/None.hpp"
#include "pythonic/random/random.hpp"
#include <limits>
PYTHONIC_NS_BEGIN
namespace random
{
template <class T>
types::none_type shuffle(T &seq)
{
std::shuffle(seq.begin(), seq.end(), __random_generator);
return builtins::None;
}
namespace details
{
template <class function>
struct URG {
URG(function &&f) : randf(f)
{
}
typedef unsigned result_type;
static constexpr result_type min()
{
return 0;
}
/* -1 because of the floor() operation performed by the float->unsigned
* conversion */
static constexpr result_type max()
{
return std::numeric_limits<result_type>::max() - 1;
}
result_type operator()()
{
return randf() * std::numeric_limits<result_type>::max();
}
function randf;
};
}
template <class T, class function>
types::none_type shuffle(T &seq, function &&randf)
{
std::shuffle(seq.begin(), seq.end(),
details::URG<function>(std::forward<function>(randf)));
return builtins::None;
}
}
PYTHONIC_NS_END
#endif