32 #ifndef VSMC_RNG_COMBINE_HPP
33 #define VSMC_RNG_COMBINE_HPP
37 #define VSMC_STATIC_ASSERT_RNG_XOR_COMBINE_UNSIGNED(result_type) \
38 VSMC_STATIC_ASSERT((cxx11::is_unsigned<result_type>::value), \
39 USE_XorCombineEngine_WITH_ENGINES_HAVE_RESULT_TYPE_NOT_AN_UNSIGNED_INTEGER_TYPE)
41 #define VSMC_STATIC_ASSERT_RNG_XOR_COMBINE_SAME_TYPE(Eng1, Eng2) \
42 VSMC_STATIC_ASSERT((cxx11::is_same<typename Eng1::resultType, \
43 typename Eng2::resultType>::value), \
44 USE_XorCombineEngine_WITH_TWO_RNG_ENGINES_WITH_DIFFERENT_RESULT_TYPE)
46 #define VSMC_STATIC_ASSERT_RNG_XOR_COMBINE \
47 VSMC_STATIC_ASSERT_RNG_XOR_COMBINE_UNSIGNED(result_type); \
48 VSMC_STATIC_ASSERT_RNG_XOR_COMBINE_SAME_TYPE(Eng1, Eng2);
54 template <
typename Eng1,
typename Eng2,
55 typename Eng1::result_type S1 = 0,
56 typename Eng2::result_type S2 = 0>
68 template <
typename SeedSeq>
81 template <
typename SeedSeq>
91 engine1_type &
eng1 () {
return eng1_;}
93 engine2_type &
eng2 () {
return eng2_;}
107 result_type
operator() () {
return (eng1_()<<S1)^(eng2_()<<S2);}
111 for (std::size_t i = 0; i != nskip; ++i)
118 {
return (eng1.eng1_ == eng2.eng1_ && eng1.eng2_ == eng2.eng2_);}
123 {
return !(eng1 ==
eng2);}
125 template <
typename CharT,
typename Traits>
126 friend inline std::basic_ostream<CharT, Traits> &
operator<< (
127 std::basic_ostream<CharT, Traits> &os,
133 os << eng.eng1_ <<
' ' << eng.eng2_;
138 template <
typename CharT,
typename Traits>
139 friend inline std::basic_istream<CharT, Traits> &
operator>> (
140 std::basic_istream<CharT, Traits> &is,
146 engine1_type eng1_tmp;
147 engine2_type eng2_tmp;
148 is >> std::ws >> eng1_tmp;
149 is >> std::ws >> eng2_tmp;
152 #if VSMC_HAS_CXX11_RVALUE_REFERENCES
156 eng.eng1_ = eng1_tmp;
157 eng.eng2_ = eng2_tmp;
172 #endif // VSMC_RNG_COMBINE_HPP
XorCombineEngine(result_type s=1)
#define VSMC_STATIC_ASSERT_RNG_XOR_COMBINE
#define VSMC_CONSTEXPR
constexpr
static constexpr result_type max()
Eng1::result_type result_type
#define VSMC_MNE
Avoid MSVC stupid behavior: MNE = Macro No Expansion.
void discard(std::size_t nskip)
remove_reference< T >::type && move(T &&t) noexcept
void seed(SeedSeq &seq, typename cxx11::enable_if< internal::is_seed_seq< SeedSeq, result_type, XorCombineEngine< Eng1, Eng2, S1, S2 > >::value >::type *=nullptr)
friend std::basic_istream< CharT, Traits > & operator>>(std::basic_istream< CharT, Traits > &is, XorCombineEngine< Eng1, Eng2, S1, S2 > &eng)
#define VSMC_NULLPTR
nullptr
XorCombineEngine(SeedSeq &seq, typename cxx11::enable_if< internal::is_seed_seq< SeedSeq, result_type, XorCombineEngine< Eng1, Eng2, S1, S2 > >::value >::type *=nullptr)
static constexpr result_type min()
friend std::basic_ostream< CharT, Traits > & operator<<(std::basic_ostream< CharT, Traits > &os, const XorCombineEngine< Eng1, Eng2, S1, S2 > &eng)
Combine two RNG engines using XOR.
friend bool operator!=(const XorCombineEngine< Eng1, Eng2, S1, S2 > &eng1, const XorCombineEngine< Eng1, Eng2, S1, S2 > &eng2)
friend bool operator==(const XorCombineEngine< Eng1, Eng2, S1, S2 > &eng1, const XorCombineEngine< Eng1, Eng2, S1, S2 > &eng2)