- typedef typename decorated_engine::base_type engine_value_type;
- typedef Engine engine_type;
- typedef Distribution distribution_type;
- typedef typename Distribution::result_type result_type;
-
- /**
- * Constructs a @c variate_generator object with the associated
- * \uniform_random_number_generator eng and the associated
- * \random_distribution d.
- *
- * Throws: If and what the copy constructor of Engine or
- * Distribution throws.
- */
- variate_generator(Engine e, Distribution d)
- : _eng(decorated_engine(e)), _dist(d) { }
-
- /**
- * Returns: distribution()(e)
- *
- * Notes: The sequence of numbers produced by the
- * \uniform_random_number_generator e, s<sub>e</sub>, is
- * obtained from the sequence of numbers produced by the
- * associated \uniform_random_number_generator eng, s<sub>eng</sub>,
- * as follows: Consider the values of @c numeric_limits<T>::is_integer
- * for @c T both @c Distribution::input_type and
- * @c engine_value_type::result_type. If the values for both types are
- * true, then se is identical to s<sub>eng</sub>. Otherwise, if the
- * values for both types are false, then the numbers in s<sub>eng</sub>
- * are divided by engine().max()-engine().min() to obtain the numbers
- * in s<sub>e</sub>. Otherwise, if the value for
- * @c engine_value_type::result_type is true and the value for
- * @c Distribution::input_type is false, then the numbers in s<sub>eng</sub>
- * are divided by engine().max()-engine().min()+1 to obtain the numbers in
- * s<sub>e</sub>. Otherwise, the mapping from s<sub>eng</sub> to
- * s<sub>e</sub> is implementation-defined. In all cases, an
- * implicit conversion from @c engine_value_type::result_type to
- * @c Distribution::input_type is performed. If such a conversion does
- * not exist, the program is ill-formed.
- */
- result_type operator()() { return _dist(_eng); }
- /**
- * Returns: distribution()(e, value).
- * For the semantics of e, see the description of operator()().
- */
- template<class T>
- result_type operator()(T value) { return _dist(_eng, value); }
-
- /**
- * Returns: A reference to the associated uniform random number generator.
- */
- engine_value_type& engine() { return _eng.base().base(); }
- /**
- * Returns: A reference to the associated uniform random number generator.
- */
- const engine_value_type& engine() const { return _eng.base().base(); }
-
- /**
- * Returns: A reference to the associated random distribution.
- */
- distribution_type& distribution() { return _dist; }
- /**
- * Returns: A reference to the associated random distribution.
- */
- const distribution_type& distribution() const { return _dist; }
-
- /**
- * Precondition: distribution().min() is well-formed
- *
- * Returns: distribution().min()
- */
- result_type min BOOST_PREVENT_MACRO_SUBSTITUTION () const { return (distribution().min)(); }
- /**
- * Precondition: distribution().max() is well-formed
- *
- * Returns: distribution().max()
- */
- result_type max BOOST_PREVENT_MACRO_SUBSTITUTION () const { return (distribution().max)(); }
+ typedef typename helper_type::value_type engine_value_type;
+ typedef Engine engine_type;
+ typedef Distribution distribution_type;
+ typedef typename Distribution::result_type result_type;
+
+ /**
+ * Constructs a @c variate_generator object with the associated
+ * \uniform_random_number_generator eng and the associated
+ * \random_distribution d.
+ *
+ * Throws: If and what the copy constructor of Engine or
+ * Distribution throws.
+ */
+ variate_generator(Engine e, Distribution d)
+ : _eng(e), _dist(d) { }
+
+ /** Returns: distribution()(engine()) */
+ result_type operator()() { return _dist(engine()); }
+ /**
+ * Returns: distribution()(engine(), value).
+ */
+ template<class T>
+ result_type operator()(const T& value) { return _dist(engine(), value); }
+
+ /**
+ * Returns: A reference to the associated uniform random number generator.
+ */
+ engine_value_type& engine() { return helper_type::ref(_eng); }
+ /**
+ * Returns: A reference to the associated uniform random number generator.
+ */
+ const engine_value_type& engine() const { return helper_type::ref(_eng); }
+
+ /** Returns: A reference to the associated \random_distribution. */
+ distribution_type& distribution() { return _dist; }
+ /**
+ * Returns: A reference to the associated random distribution.
+ */
+ const distribution_type& distribution() const { return _dist; }
+
+ /**
+ * Precondition: distribution().min() is well-formed
+ *
+ * Returns: distribution().min()
+ */
+ result_type min BOOST_PREVENT_MACRO_SUBSTITUTION () const { return (distribution().min)(); }
+ /**
+ * Precondition: distribution().max() is well-formed
+ *
+ * Returns: distribution().max()
+ */
+ result_type max BOOST_PREVENT_MACRO_SUBSTITUTION () const { return (distribution().max)(); }