32 #ifndef VSMC_RNG_GENERATOR_WRAPPER_HPP
33 #define VSMC_RNG_GENERATOR_WRAPPER_HPP
37 #define VSMC_STATIC_ASSERT_RNG_GENERATOR_WRAPPER_RESULT_TYPE(ResultType) \
38 VSMC_STATIC_ASSERT(( \
39 cxx11::is_same<ResultType, uint16_t>::value || \
40 cxx11::is_same<ResultType, uint32_t>::value || \
41 cxx11::is_same<ResultType, uint64_t>::value), \
42 USE_GeneratorWrapper_WITH_RESULT_TYPE_OTHER_THAN_uint16_t_OR_uint32_t_OR_uint64_t)
44 #define VSMC_STATIC_ASSERT_RNG_GENERATOR_WRAPPER \
45 VSMC_STATIC_ASSERT_RNG_GENERATOR_WRAPPER_RESULT_TYPE(ResultType);
53 template <
typename ResultType,
typename =
void>
58 ~(
static_cast<ResultType
>(0)));
85 template <
typename ResultType,
class Generator,
typename Traits =
86 traits::GeneratorWrapperMinMaxTrait<ResultType, Generator> >
96 template <
typename SeedSeq>
105 template <
typename SeedSeq>
112 {
return static_cast<result_type
>(generator_.generate());}
116 for (std::size_t i = 0; i != nskip; ++i)
122 const Generator &
generator ()
const {
return generator_;}
134 template <
typename CharT,
typename CharTraits>
135 friend inline std::basic_ostream<CharT, CharTraits> &
operator<< (
136 std::basic_ostream<CharT, CharTraits> &os,
140 template <
typename CharT,
typename CharTraits>
141 friend inline std::basic_istream<CharT, CharTraits> &
operator>> (
142 std::basic_istream<CharT, CharTraits> &is,
148 Generator generator_;
153 #endif // VSMC_RNG_GENERATOR_WRAPPER_HPP
friend std::basic_istream< CharT, CharTraits > & operator>>(std::basic_istream< CharT, CharTraits > &is, GeneratorWrapper< ResultType, Generator, Traits > &)
#define VSMC_STATIC_ASSERT_RNG_GENERATOR_WRAPPER
void seed(SeedSeq &, typename cxx11::enable_if< internal::is_seed_seq< SeedSeq, result_type, GeneratorWrapper< ResultType, Generator, Traits > >::value >::type *=nullptr)
#define VSMC_CONSTEXPR
constexpr
static constexpr ResultType min()
Default traits of GeneratorWrapper.
friend bool operator!=(const GeneratorWrapper< ResultType, Generator, Traits > &, const GeneratorWrapper< ResultType, Generator, Traits > &)
#define VSMC_MNE
Avoid MSVC stupid behavior: MNE = Macro No Expansion.
friend bool operator==(const GeneratorWrapper< ResultType, Generator, Traits > &, const GeneratorWrapper< ResultType, Generator, Traits > &)
void discard(std::size_t nskip)
A thin wrapper over any RNG Generator for use with C++11 API.
#define VSMC_NULLPTR
nullptr
static constexpr const ResultType _Min
friend std::basic_ostream< CharT, CharTraits > & operator<<(std::basic_ostream< CharT, CharTraits > &os, const GeneratorWrapper< ResultType, Generator, Traits > &)
static constexpr ResultType max()
const Generator & generator() const
static constexpr const ResultType _Max
GeneratorWrapper(SeedSeq &, typename cxx11::enable_if< internal::is_seed_seq< SeedSeq, result_type, GeneratorWrapper< ResultType, Generator, Traits > >::value >::type *=nullptr)
GeneratorWrapper(result_type=0)