/* 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 #include #include namespace boost { namespace random { namespace detail { template class pass_through_engine { private: typedef ptr_helper 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(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 std::basic_ostream& operator<<( std::basic_ostream& os , const pass_through_engine& ud ) { return os << ud.base(); } template std::basic_istream& operator>>( std::basic_istream& is , const pass_through_engine& ud ) { return is >> ud.base(); } #else // no new streams template inline std::ostream& operator<<(std::ostream& os, const pass_through_engine& ud) { return os << ud.base(); } template inline std::istream& operator>>(std::istream& is, const pass_through_engine& ud) { return is >> ud.base(); } #endif } // namespace detail } // namespace random } // namespace boost #include #endif // BOOST_RANDOM_DETAIL_PASS_THROUGH_ENGINE_HPP