20 #include "EngineTraits.hpp" 21 #include "SplitMix.hpp" 22 #include "Squares3_128.hpp" 23 #include "Squares4_128.hpp" 24 #include "Squares3_64.hpp" 25 #include "Squares4_64.hpp" 31 template <
typename Engine123>
34 typedef unsigned trigger_type;
37 typedef Engine123 engine_type;
49 : engine_(engine_type{})
50 , cache_(state_type{})
51 , state_(state_type{})
56 for (
unsigned i = 0; i < temp.size(); ++i) {
57 temp[i] = detail::splitmix<result_type>(seed);
63 Engine(result_type seed, uint32_t stream)
64 : engine_(engine_type{})
65 , cache_(state_type{})
66 , state_(state_type{})
71 for (
unsigned i = 0; i < temp.size(); ++i) {
72 temp[i] = detail::splitmix<result_type>(seed);
75 state_[arity - 1] = stream;
76 state_[arity - 1] = state_[arity - 1] << 32;
82 : engine_(engine_type{})
83 , cache_(state_type{})
84 , state_(state_type{})
88 Engine(init_type seed, uint32_t stream)
89 : engine_(engine_type{})
90 , cache_(state_type{})
91 , state_(state_type{})
94 state_[arity - 1] = stream;
95 state_[arity - 1] << 32;
99 : engine_(engine_type{})
100 , cache_(other.getCache())
101 , state_(other.getState())
102 , seed_(other.getSeed())
103 , trigger_(other.getTrigger()) {}
107 if (
this == &other)
return *
this;
109 engine_ = engine_type{};
110 cache_ = other.getCache();
111 state_ = other.getState();
112 seed_ = other.getSeed();
113 trigger_ = other.getTrigger();
117 inline result_type operator()(
void) {
118 result_type result = 0;
120 if (trigger_ == arity) {
123 cache_ = engine_(state_.incr(), seed_);
124 result = cache_[trigger_];
127 result = cache_[trigger_];
134 inline void discard(advance_type n) {
140 inline void reset(
void) {
142 state_ = state_type{};
143 cache_ = state_type{};
146 inline const seed_type& getSeed()
const {
return seed_; }
148 inline void setSeed(seed_type seed) { seed_ = seed; }
150 inline void setSeed(result_type seed) {
153 for (
unsigned i = 0; i < temp.size(); ++i) {
154 temp[i] = detail::splitmix<result_type>(seed);
159 inline const state_type& getState()
const {
return state_; }
161 inline void setState(
const state_type& state) { state_ = state; }
163 inline trigger_type getTrigger()
const {
return trigger_; }
165 inline void setTrigger(trigger_type trigger) { trigger_ = trigger; }
166 static constexpr result_type min() {
return 0; }
168 static constexpr result_type max() {
169 return std::numeric_limits<result_type>::max();
172 friend inline std::ostream& operator<<(std::ostream& os,
174 return os <<
"state: " << be.getState() <<
" seed: " << be.getSeed()
175 <<
" trigger: " << be.getTrigger();
179 inline state_type getCache()
const {
return cache_; }
185 trigger_type trigger_;
195 #if RANDOM_ITERATOR_R123_USE_AES_NI