| /* boost random/detail/uniform_int_float.hpp header file |
| * |
| * Copyright Jens Maurer 2000-2001 |
| * 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: uniform_int_float.hpp 52492 2009-04-19 14:55:57Z steven_watanabe $ |
| * |
| */ |
| |
| #ifndef BOOST_RANDOM_DETAIL_UNIFORM_INT_FLOAT_HPP |
| #define BOOST_RANDOM_DETAIL_UNIFORM_INT_FLOAT_HPP |
| |
| #include <boost/config.hpp> |
| #include <boost/random/detail/config.hpp> |
| #include <boost/random/uniform_01.hpp> |
| |
| |
| namespace boost { |
| namespace random { |
| namespace detail { |
| |
| template<class UniformRandomNumberGenerator, class IntType = unsigned long> |
| class uniform_int_float |
| { |
| public: |
| typedef UniformRandomNumberGenerator base_type; |
| typedef IntType result_type; |
| |
| uniform_int_float(base_type rng, IntType min_arg = 0, IntType max_arg = 0xffffffff) |
| : _rng(rng), _min(min_arg), _max(max_arg) |
| { |
| init(); |
| } |
| |
| result_type min BOOST_PREVENT_MACRO_SUBSTITUTION () const { return _min; } |
| result_type max BOOST_PREVENT_MACRO_SUBSTITUTION () const { return _max; } |
| base_type& base() { return _rng.base(); } |
| const base_type& base() const { return _rng.base(); } |
| |
| result_type operator()() |
| { |
| return static_cast<IntType>(_rng() * _range) + _min; |
| } |
| |
| #ifndef BOOST_RANDOM_NO_STREAM_OPERATORS |
| template<class CharT, class Traits> |
| friend std::basic_ostream<CharT,Traits>& |
| operator<<(std::basic_ostream<CharT,Traits>& os, const uniform_int_float& ud) |
| { |
| os << ud._min << " " << ud._max; |
| return os; |
| } |
| |
| template<class CharT, class Traits> |
| friend std::basic_istream<CharT,Traits>& |
| operator>>(std::basic_istream<CharT,Traits>& is, uniform_int_float& ud) |
| { |
| is >> std::ws >> ud._min >> std::ws >> ud._max; |
| ud.init(); |
| return is; |
| } |
| #endif |
| |
| private: |
| void init() |
| { |
| _range = static_cast<base_result>(_max-_min)+1; |
| } |
| |
| typedef typename base_type::result_type base_result; |
| uniform_01<base_type> _rng; |
| result_type _min, _max; |
| base_result _range; |
| }; |
| |
| |
| } // namespace detail |
| } // namespace random |
| } // namespace boost |
| |
| #endif // BOOST_RANDOM_DETAIL_UNIFORM_INT_FLOAT_HPP |