/* 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: pass_through_engine.hpp 58649 2010-01-02 21:23:17Z steven_watanabe $ | |
* | |
*/ | |
#ifndef BOOST_RANDOM_DETAIL_PASS_THROUGH_ENGINE_HPP | |
#define BOOST_RANDOM_DETAIL_PASS_THROUGH_ENGINE_HPP | |
#include <boost/config.hpp> | |
#include <boost/random/detail/ptr_helper.hpp> | |
#include <boost/random/detail/disable_warnings.hpp> | |
namespace boost { | |
namespace random { | |
namespace detail { | |
template<class UniformRandomNumberGenerator> | |
class pass_through_engine | |
{ | |
private: | |
typedef ptr_helper<UniformRandomNumberGenerator> helper_type; | |
public: | |
typedef typename helper_type::value_type base_type; | |
typedef typename base_type::result_type result_type; | |
explicit pass_through_engine(UniformRandomNumberGenerator rng) | |
// make argument an rvalue to avoid matching Generator& constructor | |
: _rng(static_cast<typename helper_type::rvalue_type>(rng)) | |
{ } | |
result_type min BOOST_PREVENT_MACRO_SUBSTITUTION () const { return (base().min)(); } | |
result_type max BOOST_PREVENT_MACRO_SUBSTITUTION () const { return (base().max)(); } | |
base_type& base() { return helper_type::ref(_rng); } | |
const base_type& base() const { return helper_type::ref(_rng); } | |
result_type operator()() { return base()(); } | |
private: | |
UniformRandomNumberGenerator _rng; | |
}; | |
#ifndef BOOST_NO_STD_LOCALE | |
template<class UniformRandomNumberGenerator, class CharT, class Traits> | |
std::basic_ostream<CharT,Traits>& | |
operator<<( | |
std::basic_ostream<CharT,Traits>& os | |
, const pass_through_engine<UniformRandomNumberGenerator>& ud | |
) | |
{ | |
return os << ud.base(); | |
} | |
template<class UniformRandomNumberGenerator, class CharT, class Traits> | |
std::basic_istream<CharT,Traits>& | |
operator>>( | |
std::basic_istream<CharT,Traits>& is | |
, const pass_through_engine<UniformRandomNumberGenerator>& ud | |
) | |
{ | |
return is >> ud.base(); | |
} | |
#else // no new streams | |
template<class UniformRandomNumberGenerator> | |
inline std::ostream& | |
operator<<(std::ostream& os, | |
const pass_through_engine<UniformRandomNumberGenerator>& ud) | |
{ | |
return os << ud.base(); | |
} | |
template<class UniformRandomNumberGenerator> | |
inline std::istream& | |
operator>>(std::istream& is, | |
const pass_through_engine<UniformRandomNumberGenerator>& ud) | |
{ | |
return is >> ud.base(); | |
} | |
#endif | |
} // namespace detail | |
} // namespace random | |
} // namespace boost | |
#include <boost/random/detail/enable_warnings.hpp> | |
#endif // BOOST_RANDOM_DETAIL_PASS_THROUGH_ENGINE_HPP | |