/* */ #ifndef D_SIMPLE_RANDOMIZER_H #define D_SIMPLE_RANDOMIZER_H #include "Randomizer.h" #include #include #ifdef __MINGW32__ # include #endif namespace aria2 { class SimpleRandomizer : public Randomizer { private: static std::unique_ptr randomizer_; SimpleRandomizer(); private: #ifdef __MINGW32__ HCRYPTPROV provider_; #else std::random_device dev_; #endif // ! __MINGW32__ public: typedef std::random_device::result_type result_type; static const std::unique_ptr& getInstance(); virtual ~SimpleRandomizer(); /** * Returns random number in [0, to). */ virtual long int getRandomNumber(long int to) CXX11_OVERRIDE; void getRandomBytes(unsigned char *buf, size_t len); long int operator()(long int to) { return getRandomNumber(to); } result_type operator()() { result_type rv; getRandomBytes(reinterpret_cast(&rv), sizeof(rv)); return rv; } static constexpr result_type min() { return std::numeric_limits::min(); } static constexpr result_type max() { return std::numeric_limits::max(); } static double entropy() { return 0.0; } }; } // namespace aria2 #endif // D_SIMPLE_RANDOMIZER_H