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)