77 lines
2.1 KiB
Plaintext
77 lines
2.1 KiB
Plaintext
|
/* boost random/detail/uniform_int_float.hpp header file
|
||
|
*
|
||
|
* Copyright Jens Maurer 2000-2001
|
||
|
* Copyright Steven Watanabe 2011
|
||
|
* 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)
|
||
|
*
|
||
|
* See http://www.boost.org for most recent version including documentation.
|
||
|
*
|
||
|
* $Id$
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#ifndef BOOST_RANDOM_DETAIL_UNIFORM_INT_FLOAT_HPP
|
||
|
#define BOOST_RANDOM_DETAIL_UNIFORM_INT_FLOAT_HPP
|
||
|
|
||
|
#include <boost/limits.hpp>
|
||
|
#include <boost/config.hpp>
|
||
|
#include <boost/integer.hpp>
|
||
|
#include <boost/random/detail/config.hpp>
|
||
|
#include <boost/random/detail/generator_bits.hpp>
|
||
|
|
||
|
#include <boost/random/detail/disable_warnings.hpp>
|
||
|
|
||
|
namespace boost {
|
||
|
namespace random {
|
||
|
namespace detail {
|
||
|
|
||
|
template<class URNG>
|
||
|
class uniform_int_float
|
||
|
{
|
||
|
public:
|
||
|
typedef URNG base_type;
|
||
|
typedef typename base_type::result_type base_result;
|
||
|
|
||
|
typedef typename boost::uint_t<
|
||
|
(std::numeric_limits<boost::uintmax_t>::digits <
|
||
|
std::numeric_limits<base_result>::digits)?
|
||
|
std::numeric_limits<boost::uintmax_t>::digits :
|
||
|
std::numeric_limits<base_result>::digits
|
||
|
>::fast result_type;
|
||
|
|
||
|
uniform_int_float(base_type& rng)
|
||
|
: _rng(rng) {}
|
||
|
|
||
|
static result_type min BOOST_PREVENT_MACRO_SUBSTITUTION ()
|
||
|
{ return 0; }
|
||
|
static result_type max BOOST_PREVENT_MACRO_SUBSTITUTION ()
|
||
|
{
|
||
|
std::size_t digits = std::numeric_limits<result_type>::digits;
|
||
|
if(detail::generator_bits<URNG>::value() < digits) {
|
||
|
digits = detail::generator_bits<URNG>::value();
|
||
|
}
|
||
|
return (result_type(2) << (digits - 1)) - 1;
|
||
|
}
|
||
|
base_type& base() { return _rng; }
|
||
|
const base_type& base() const { return _rng; }
|
||
|
|
||
|
result_type operator()()
|
||
|
{
|
||
|
base_result range = static_cast<base_result>((max)())+1;
|
||
|
return static_cast<result_type>(_rng() * range);
|
||
|
}
|
||
|
|
||
|
private:
|
||
|
base_type& _rng;
|
||
|
};
|
||
|
|
||
|
} // namespace detail
|
||
|
} // namespace random
|
||
|
} // namespace boost
|
||
|
|
||
|
#include <boost/random/detail/enable_warnings.hpp>
|
||
|
|
||
|
#endif // BOOST_RANDOM_DETAIL_UNIFORM_INT_FLOAT_HPP
|