14824e7fdSDimitry Andric //===----------------------------------------------------------------------===//
24824e7fdSDimitry Andric //
34824e7fdSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
44824e7fdSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
54824e7fdSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
64824e7fdSDimitry Andric //
74824e7fdSDimitry Andric //===----------------------------------------------------------------------===//
84824e7fdSDimitry Andric
94824e7fdSDimitry Andric #ifndef _LIBCPP___RANDOM_MERSENNE_TWISTER_ENGINE_H
104824e7fdSDimitry Andric #define _LIBCPP___RANDOM_MERSENNE_TWISTER_ENGINE_H
114824e7fdSDimitry Andric
124824e7fdSDimitry Andric #include <__algorithm/equal.h>
134824e7fdSDimitry Andric #include <__algorithm/min.h>
144824e7fdSDimitry Andric #include <__config>
154824e7fdSDimitry Andric #include <__random/is_seed_sequence.h>
164824e7fdSDimitry Andric #include <cstddef>
174824e7fdSDimitry Andric #include <cstdint>
184824e7fdSDimitry Andric #include <iosfwd>
194824e7fdSDimitry Andric #include <limits>
204824e7fdSDimitry Andric
214824e7fdSDimitry Andric #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
224824e7fdSDimitry Andric # pragma GCC system_header
234824e7fdSDimitry Andric #endif
244824e7fdSDimitry Andric
254824e7fdSDimitry Andric _LIBCPP_PUSH_MACROS
264824e7fdSDimitry Andric #include <__undef_macros>
274824e7fdSDimitry Andric
284824e7fdSDimitry Andric _LIBCPP_BEGIN_NAMESPACE_STD
294824e7fdSDimitry Andric
30*cb14a3feSDimitry Andric template <class _UIntType,
31*cb14a3feSDimitry Andric size_t __w,
32*cb14a3feSDimitry Andric size_t __n,
33*cb14a3feSDimitry Andric size_t __m,
34*cb14a3feSDimitry Andric size_t __r,
35*cb14a3feSDimitry Andric _UIntType __a,
36*cb14a3feSDimitry Andric size_t __u,
37*cb14a3feSDimitry Andric _UIntType __d,
38*cb14a3feSDimitry Andric size_t __s,
39*cb14a3feSDimitry Andric _UIntType __b,
40*cb14a3feSDimitry Andric size_t __t,
41*cb14a3feSDimitry Andric _UIntType __c,
42*cb14a3feSDimitry Andric size_t __l,
43*cb14a3feSDimitry Andric _UIntType __f>
444824e7fdSDimitry Andric class _LIBCPP_TEMPLATE_VIS mersenne_twister_engine;
454824e7fdSDimitry Andric
46*cb14a3feSDimitry Andric template <class _UInt,
47*cb14a3feSDimitry Andric size_t _Wp,
48*cb14a3feSDimitry Andric size_t _Np,
49*cb14a3feSDimitry Andric size_t _Mp,
50*cb14a3feSDimitry Andric size_t _Rp,
51*cb14a3feSDimitry Andric _UInt _Ap,
52*cb14a3feSDimitry Andric size_t _Up,
53*cb14a3feSDimitry Andric _UInt _Dp,
54*cb14a3feSDimitry Andric size_t _Sp,
55*cb14a3feSDimitry Andric _UInt _Bp,
56*cb14a3feSDimitry Andric size_t _Tp,
57*cb14a3feSDimitry Andric _UInt _Cp,
58*cb14a3feSDimitry Andric size_t _Lp,
59*cb14a3feSDimitry Andric _UInt _Fp>
60bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI bool
61*cb14a3feSDimitry Andric operator==(const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, _Bp, _Tp, _Cp, _Lp, _Fp>& __x,
62*cb14a3feSDimitry Andric const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, _Bp, _Tp, _Cp, _Lp, _Fp>& __y);
634824e7fdSDimitry Andric
64*cb14a3feSDimitry Andric template <class _UInt,
65*cb14a3feSDimitry Andric size_t _Wp,
66*cb14a3feSDimitry Andric size_t _Np,
67*cb14a3feSDimitry Andric size_t _Mp,
68*cb14a3feSDimitry Andric size_t _Rp,
69*cb14a3feSDimitry Andric _UInt _Ap,
70*cb14a3feSDimitry Andric size_t _Up,
71*cb14a3feSDimitry Andric _UInt _Dp,
72*cb14a3feSDimitry Andric size_t _Sp,
73*cb14a3feSDimitry Andric _UInt _Bp,
74*cb14a3feSDimitry Andric size_t _Tp,
75*cb14a3feSDimitry Andric _UInt _Cp,
76*cb14a3feSDimitry Andric size_t _Lp,
77*cb14a3feSDimitry Andric _UInt _Fp>
78*cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI bool
79*cb14a3feSDimitry Andric operator!=(const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, _Bp, _Tp, _Cp, _Lp, _Fp>& __x,
80*cb14a3feSDimitry Andric const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, _Bp, _Tp, _Cp, _Lp, _Fp>& __y);
814824e7fdSDimitry Andric
82*cb14a3feSDimitry Andric template <class _CharT,
83*cb14a3feSDimitry Andric class _Traits,
84*cb14a3feSDimitry Andric class _UInt,
85*cb14a3feSDimitry Andric size_t _Wp,
86*cb14a3feSDimitry Andric size_t _Np,
87*cb14a3feSDimitry Andric size_t _Mp,
88*cb14a3feSDimitry Andric size_t _Rp,
89*cb14a3feSDimitry Andric _UInt _Ap,
90*cb14a3feSDimitry Andric size_t _Up,
91*cb14a3feSDimitry Andric _UInt _Dp,
92*cb14a3feSDimitry Andric size_t _Sp,
93*cb14a3feSDimitry Andric _UInt _Bp,
94*cb14a3feSDimitry Andric size_t _Tp,
95*cb14a3feSDimitry Andric _UInt _Cp,
96*cb14a3feSDimitry Andric size_t _Lp,
97*cb14a3feSDimitry Andric _UInt _Fp>
98bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
994824e7fdSDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os,
100*cb14a3feSDimitry Andric const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, _Bp, _Tp, _Cp, _Lp, _Fp>& __x);
1014824e7fdSDimitry Andric
102*cb14a3feSDimitry Andric template <class _CharT,
103*cb14a3feSDimitry Andric class _Traits,
104*cb14a3feSDimitry Andric class _UInt,
105*cb14a3feSDimitry Andric size_t _Wp,
106*cb14a3feSDimitry Andric size_t _Np,
107*cb14a3feSDimitry Andric size_t _Mp,
108*cb14a3feSDimitry Andric size_t _Rp,
109*cb14a3feSDimitry Andric _UInt _Ap,
110*cb14a3feSDimitry Andric size_t _Up,
111*cb14a3feSDimitry Andric _UInt _Dp,
112*cb14a3feSDimitry Andric size_t _Sp,
113*cb14a3feSDimitry Andric _UInt _Bp,
114*cb14a3feSDimitry Andric size_t _Tp,
115*cb14a3feSDimitry Andric _UInt _Cp,
116*cb14a3feSDimitry Andric size_t _Lp,
117*cb14a3feSDimitry Andric _UInt _Fp>
118bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
1194824e7fdSDimitry Andric operator>>(basic_istream<_CharT, _Traits>& __is,
120*cb14a3feSDimitry Andric mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, _Bp, _Tp, _Cp, _Lp, _Fp>& __x);
1214824e7fdSDimitry Andric
122*cb14a3feSDimitry Andric template <class _UIntType,
123*cb14a3feSDimitry Andric size_t __w,
124*cb14a3feSDimitry Andric size_t __n,
125*cb14a3feSDimitry Andric size_t __m,
126*cb14a3feSDimitry Andric size_t __r,
127*cb14a3feSDimitry Andric _UIntType __a,
128*cb14a3feSDimitry Andric size_t __u,
129*cb14a3feSDimitry Andric _UIntType __d,
130*cb14a3feSDimitry Andric size_t __s,
131*cb14a3feSDimitry Andric _UIntType __b,
132*cb14a3feSDimitry Andric size_t __t,
133*cb14a3feSDimitry Andric _UIntType __c,
134*cb14a3feSDimitry Andric size_t __l,
135*cb14a3feSDimitry Andric _UIntType __f>
136*cb14a3feSDimitry Andric class _LIBCPP_TEMPLATE_VIS mersenne_twister_engine {
1374824e7fdSDimitry Andric public:
1384824e7fdSDimitry Andric // types
1394824e7fdSDimitry Andric typedef _UIntType result_type;
1404824e7fdSDimitry Andric
1414824e7fdSDimitry Andric private:
1424824e7fdSDimitry Andric result_type __x_[__n];
1434824e7fdSDimitry Andric size_t __i_;
1444824e7fdSDimitry Andric
1454824e7fdSDimitry Andric static_assert(0 < __m, "mersenne_twister_engine invalid parameters");
1464824e7fdSDimitry Andric static_assert(__m <= __n, "mersenne_twister_engine invalid parameters");
1474824e7fdSDimitry Andric static _LIBCPP_CONSTEXPR const result_type _Dt = numeric_limits<result_type>::digits;
1484824e7fdSDimitry Andric static_assert(__w <= _Dt, "mersenne_twister_engine invalid parameters");
1494824e7fdSDimitry Andric static_assert(2 <= __w, "mersenne_twister_engine invalid parameters");
1504824e7fdSDimitry Andric static_assert(__r <= __w, "mersenne_twister_engine invalid parameters");
1514824e7fdSDimitry Andric static_assert(__u <= __w, "mersenne_twister_engine invalid parameters");
1524824e7fdSDimitry Andric static_assert(__s <= __w, "mersenne_twister_engine invalid parameters");
1534824e7fdSDimitry Andric static_assert(__t <= __w, "mersenne_twister_engine invalid parameters");
1544824e7fdSDimitry Andric static_assert(__l <= __w, "mersenne_twister_engine invalid parameters");
155*cb14a3feSDimitry Andric
1564824e7fdSDimitry Andric public:
1574824e7fdSDimitry Andric static _LIBCPP_CONSTEXPR const result_type _Min = 0;
158*cb14a3feSDimitry Andric static _LIBCPP_CONSTEXPR const result_type _Max =
159*cb14a3feSDimitry Andric __w == _Dt ? result_type(~0) : (result_type(1) << __w) - result_type(1);
1604824e7fdSDimitry Andric static_assert(_Min < _Max, "mersenne_twister_engine invalid parameters");
1614824e7fdSDimitry Andric static_assert(__a <= _Max, "mersenne_twister_engine invalid parameters");
1624824e7fdSDimitry Andric static_assert(__b <= _Max, "mersenne_twister_engine invalid parameters");
1634824e7fdSDimitry Andric static_assert(__c <= _Max, "mersenne_twister_engine invalid parameters");
1644824e7fdSDimitry Andric static_assert(__d <= _Max, "mersenne_twister_engine invalid parameters");
1654824e7fdSDimitry Andric static_assert(__f <= _Max, "mersenne_twister_engine invalid parameters");
1664824e7fdSDimitry Andric
1674824e7fdSDimitry Andric // engine characteristics
1684824e7fdSDimitry Andric static _LIBCPP_CONSTEXPR const size_t word_size = __w;
1694824e7fdSDimitry Andric static _LIBCPP_CONSTEXPR const size_t state_size = __n;
1704824e7fdSDimitry Andric static _LIBCPP_CONSTEXPR const size_t shift_size = __m;
1714824e7fdSDimitry Andric static _LIBCPP_CONSTEXPR const size_t mask_bits = __r;
1724824e7fdSDimitry Andric static _LIBCPP_CONSTEXPR const result_type xor_mask = __a;
1734824e7fdSDimitry Andric static _LIBCPP_CONSTEXPR const size_t tempering_u = __u;
1744824e7fdSDimitry Andric static _LIBCPP_CONSTEXPR const result_type tempering_d = __d;
1754824e7fdSDimitry Andric static _LIBCPP_CONSTEXPR const size_t tempering_s = __s;
1764824e7fdSDimitry Andric static _LIBCPP_CONSTEXPR const result_type tempering_b = __b;
1774824e7fdSDimitry Andric static _LIBCPP_CONSTEXPR const size_t tempering_t = __t;
1784824e7fdSDimitry Andric static _LIBCPP_CONSTEXPR const result_type tempering_c = __c;
1794824e7fdSDimitry Andric static _LIBCPP_CONSTEXPR const size_t tempering_l = __l;
1804824e7fdSDimitry Andric static _LIBCPP_CONSTEXPR const result_type initialization_multiplier = __f;
min()181*cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR result_type min() { return _Min; }
max()182*cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR result_type max() { return _Max; }
1834824e7fdSDimitry Andric static _LIBCPP_CONSTEXPR const result_type default_seed = 5489u;
1844824e7fdSDimitry Andric
1854824e7fdSDimitry Andric // constructors and seeding functions
1864824e7fdSDimitry Andric #ifndef _LIBCPP_CXX03_LANG
mersenne_twister_engine()187*cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI mersenne_twister_engine() : mersenne_twister_engine(default_seed) {}
mersenne_twister_engine(result_type __sd)188*cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI explicit mersenne_twister_engine(result_type __sd) { seed(__sd); }
1894824e7fdSDimitry Andric #else
190*cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI explicit mersenne_twister_engine(result_type __sd = default_seed) { seed(__sd); }
1914824e7fdSDimitry Andric #endif
1925f757f3fSDimitry Andric template <class _Sseq, __enable_if_t<__is_seed_sequence<_Sseq, mersenne_twister_engine>::value, int> = 0>
mersenne_twister_engine(_Sseq & __q)193*cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI explicit mersenne_twister_engine(_Sseq& __q) {
194*cb14a3feSDimitry Andric seed(__q);
195*cb14a3feSDimitry Andric }
19606c3fb27SDimitry Andric _LIBCPP_HIDE_FROM_ABI void seed(result_type __sd = default_seed);
1975f757f3fSDimitry Andric template <class _Sseq, __enable_if_t<__is_seed_sequence<_Sseq, mersenne_twister_engine>::value, int> = 0>
seed(_Sseq & __q)198*cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI void seed(_Sseq& __q) {
199*cb14a3feSDimitry Andric __seed(__q, integral_constant<unsigned, 1 + (__w - 1) / 32>());
200*cb14a3feSDimitry Andric }
2014824e7fdSDimitry Andric
2024824e7fdSDimitry Andric // generating functions
20306c3fb27SDimitry Andric _LIBCPP_HIDE_FROM_ABI result_type operator()();
discard(unsigned long long __z)204*cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI void discard(unsigned long long __z) {
205*cb14a3feSDimitry Andric for (; __z; --__z)
206*cb14a3feSDimitry Andric operator()();
207*cb14a3feSDimitry Andric }
2084824e7fdSDimitry Andric
209*cb14a3feSDimitry Andric template <class _UInt,
210*cb14a3feSDimitry Andric size_t _Wp,
211*cb14a3feSDimitry Andric size_t _Np,
212*cb14a3feSDimitry Andric size_t _Mp,
213*cb14a3feSDimitry Andric size_t _Rp,
214*cb14a3feSDimitry Andric _UInt _Ap,
215*cb14a3feSDimitry Andric size_t _Up,
216*cb14a3feSDimitry Andric _UInt _Dp,
217*cb14a3feSDimitry Andric size_t _Sp,
218*cb14a3feSDimitry Andric _UInt _Bp,
219*cb14a3feSDimitry Andric size_t _Tp,
220*cb14a3feSDimitry Andric _UInt _Cp,
221*cb14a3feSDimitry Andric size_t _Lp,
222*cb14a3feSDimitry Andric _UInt _Fp>
223*cb14a3feSDimitry Andric friend bool operator==(
224*cb14a3feSDimitry Andric const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, _Bp, _Tp, _Cp, _Lp, _Fp>& __x,
225*cb14a3feSDimitry Andric const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, _Bp, _Tp, _Cp, _Lp, _Fp>& __y);
2264824e7fdSDimitry Andric
227*cb14a3feSDimitry Andric template <class _UInt,
228*cb14a3feSDimitry Andric size_t _Wp,
229*cb14a3feSDimitry Andric size_t _Np,
230*cb14a3feSDimitry Andric size_t _Mp,
231*cb14a3feSDimitry Andric size_t _Rp,
232*cb14a3feSDimitry Andric _UInt _Ap,
233*cb14a3feSDimitry Andric size_t _Up,
234*cb14a3feSDimitry Andric _UInt _Dp,
235*cb14a3feSDimitry Andric size_t _Sp,
236*cb14a3feSDimitry Andric _UInt _Bp,
237*cb14a3feSDimitry Andric size_t _Tp,
238*cb14a3feSDimitry Andric _UInt _Cp,
239*cb14a3feSDimitry Andric size_t _Lp,
240*cb14a3feSDimitry Andric _UInt _Fp>
241*cb14a3feSDimitry Andric friend bool operator!=(
242*cb14a3feSDimitry Andric const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, _Bp, _Tp, _Cp, _Lp, _Fp>& __x,
243*cb14a3feSDimitry Andric const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, _Bp, _Tp, _Cp, _Lp, _Fp>& __y);
2444824e7fdSDimitry Andric
245*cb14a3feSDimitry Andric template <class _CharT,
246*cb14a3feSDimitry Andric class _Traits,
247*cb14a3feSDimitry Andric class _UInt,
248*cb14a3feSDimitry Andric size_t _Wp,
249*cb14a3feSDimitry Andric size_t _Np,
250*cb14a3feSDimitry Andric size_t _Mp,
251*cb14a3feSDimitry Andric size_t _Rp,
252*cb14a3feSDimitry Andric _UInt _Ap,
253*cb14a3feSDimitry Andric size_t _Up,
254*cb14a3feSDimitry Andric _UInt _Dp,
255*cb14a3feSDimitry Andric size_t _Sp,
256*cb14a3feSDimitry Andric _UInt _Bp,
257*cb14a3feSDimitry Andric size_t _Tp,
258*cb14a3feSDimitry Andric _UInt _Cp,
259*cb14a3feSDimitry Andric size_t _Lp,
260*cb14a3feSDimitry Andric _UInt _Fp>
261*cb14a3feSDimitry Andric friend basic_ostream<_CharT, _Traits>& operator<<(
262*cb14a3feSDimitry Andric basic_ostream<_CharT, _Traits>& __os,
263*cb14a3feSDimitry Andric const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, _Bp, _Tp, _Cp, _Lp, _Fp>& __x);
2644824e7fdSDimitry Andric
265*cb14a3feSDimitry Andric template <class _CharT,
266*cb14a3feSDimitry Andric class _Traits,
267*cb14a3feSDimitry Andric class _UInt,
268*cb14a3feSDimitry Andric size_t _Wp,
269*cb14a3feSDimitry Andric size_t _Np,
270*cb14a3feSDimitry Andric size_t _Mp,
271*cb14a3feSDimitry Andric size_t _Rp,
272*cb14a3feSDimitry Andric _UInt _Ap,
273*cb14a3feSDimitry Andric size_t _Up,
274*cb14a3feSDimitry Andric _UInt _Dp,
275*cb14a3feSDimitry Andric size_t _Sp,
276*cb14a3feSDimitry Andric _UInt _Bp,
277*cb14a3feSDimitry Andric size_t _Tp,
278*cb14a3feSDimitry Andric _UInt _Cp,
279*cb14a3feSDimitry Andric size_t _Lp,
280*cb14a3feSDimitry Andric _UInt _Fp>
281*cb14a3feSDimitry Andric friend basic_istream<_CharT, _Traits>&
2824824e7fdSDimitry Andric operator>>(basic_istream<_CharT, _Traits>& __is,
283*cb14a3feSDimitry Andric mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, _Bp, _Tp, _Cp, _Lp, _Fp>& __x);
2844824e7fdSDimitry Andric
285*cb14a3feSDimitry Andric private:
2864824e7fdSDimitry Andric template <class _Sseq>
28706c3fb27SDimitry Andric _LIBCPP_HIDE_FROM_ABI void __seed(_Sseq& __q, integral_constant<unsigned, 1>);
2884824e7fdSDimitry Andric template <class _Sseq>
28906c3fb27SDimitry Andric _LIBCPP_HIDE_FROM_ABI void __seed(_Sseq& __q, integral_constant<unsigned, 2>);
2904824e7fdSDimitry Andric
291*cb14a3feSDimitry Andric template <size_t __count,
292*cb14a3feSDimitry Andric __enable_if_t<__count< __w, int> = 0> _LIBCPP_HIDE_FROM_ABI static result_type __lshift(result_type __x) {
293*cb14a3feSDimitry Andric return (__x << __count) & _Max;
294*cb14a3feSDimitry Andric }
2954824e7fdSDimitry Andric
2965f757f3fSDimitry Andric template <size_t __count, __enable_if_t<(__count >= __w), int> = 0>
__lshift(result_type)297*cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI static result_type __lshift(result_type) {
298*cb14a3feSDimitry Andric return result_type(0);
299*cb14a3feSDimitry Andric }
3004824e7fdSDimitry Andric
301*cb14a3feSDimitry Andric template <size_t __count,
302*cb14a3feSDimitry Andric __enable_if_t<__count< _Dt, int> = 0> _LIBCPP_HIDE_FROM_ABI static result_type __rshift(result_type __x) {
303*cb14a3feSDimitry Andric return __x >> __count;
304*cb14a3feSDimitry Andric }
3054824e7fdSDimitry Andric
3065f757f3fSDimitry Andric template <size_t __count, __enable_if_t<(__count >= _Dt), int> = 0>
__rshift(result_type)307*cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI static result_type __rshift(result_type) {
308*cb14a3feSDimitry Andric return result_type(0);
309*cb14a3feSDimitry Andric }
3104824e7fdSDimitry Andric };
3114824e7fdSDimitry Andric
312*cb14a3feSDimitry Andric template <class _UIntType,
313*cb14a3feSDimitry Andric size_t __w,
314*cb14a3feSDimitry Andric size_t __n,
315*cb14a3feSDimitry Andric size_t __m,
316*cb14a3feSDimitry Andric size_t __r,
317*cb14a3feSDimitry Andric _UIntType __a,
318*cb14a3feSDimitry Andric size_t __u,
319*cb14a3feSDimitry Andric _UIntType __d,
320*cb14a3feSDimitry Andric size_t __s,
321*cb14a3feSDimitry Andric _UIntType __b,
322*cb14a3feSDimitry Andric size_t __t,
323*cb14a3feSDimitry Andric _UIntType __c,
324*cb14a3feSDimitry Andric size_t __l,
325*cb14a3feSDimitry Andric _UIntType __f>
3264824e7fdSDimitry Andric _LIBCPP_CONSTEXPR const size_t
3274824e7fdSDimitry Andric mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::word_size;
3284824e7fdSDimitry Andric
329*cb14a3feSDimitry Andric template <class _UIntType,
330*cb14a3feSDimitry Andric size_t __w,
331*cb14a3feSDimitry Andric size_t __n,
332*cb14a3feSDimitry Andric size_t __m,
333*cb14a3feSDimitry Andric size_t __r,
334*cb14a3feSDimitry Andric _UIntType __a,
335*cb14a3feSDimitry Andric size_t __u,
336*cb14a3feSDimitry Andric _UIntType __d,
337*cb14a3feSDimitry Andric size_t __s,
338*cb14a3feSDimitry Andric _UIntType __b,
339*cb14a3feSDimitry Andric size_t __t,
340*cb14a3feSDimitry Andric _UIntType __c,
341*cb14a3feSDimitry Andric size_t __l,
342*cb14a3feSDimitry Andric _UIntType __f>
3434824e7fdSDimitry Andric _LIBCPP_CONSTEXPR const size_t
3444824e7fdSDimitry Andric mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::state_size;
3454824e7fdSDimitry Andric
346*cb14a3feSDimitry Andric template <class _UIntType,
347*cb14a3feSDimitry Andric size_t __w,
348*cb14a3feSDimitry Andric size_t __n,
349*cb14a3feSDimitry Andric size_t __m,
350*cb14a3feSDimitry Andric size_t __r,
351*cb14a3feSDimitry Andric _UIntType __a,
352*cb14a3feSDimitry Andric size_t __u,
353*cb14a3feSDimitry Andric _UIntType __d,
354*cb14a3feSDimitry Andric size_t __s,
355*cb14a3feSDimitry Andric _UIntType __b,
356*cb14a3feSDimitry Andric size_t __t,
357*cb14a3feSDimitry Andric _UIntType __c,
358*cb14a3feSDimitry Andric size_t __l,
359*cb14a3feSDimitry Andric _UIntType __f>
3604824e7fdSDimitry Andric _LIBCPP_CONSTEXPR const size_t
3614824e7fdSDimitry Andric mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::shift_size;
3624824e7fdSDimitry Andric
363*cb14a3feSDimitry Andric template <class _UIntType,
364*cb14a3feSDimitry Andric size_t __w,
365*cb14a3feSDimitry Andric size_t __n,
366*cb14a3feSDimitry Andric size_t __m,
367*cb14a3feSDimitry Andric size_t __r,
368*cb14a3feSDimitry Andric _UIntType __a,
369*cb14a3feSDimitry Andric size_t __u,
370*cb14a3feSDimitry Andric _UIntType __d,
371*cb14a3feSDimitry Andric size_t __s,
372*cb14a3feSDimitry Andric _UIntType __b,
373*cb14a3feSDimitry Andric size_t __t,
374*cb14a3feSDimitry Andric _UIntType __c,
375*cb14a3feSDimitry Andric size_t __l,
376*cb14a3feSDimitry Andric _UIntType __f>
3774824e7fdSDimitry Andric _LIBCPP_CONSTEXPR const size_t
3784824e7fdSDimitry Andric mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::mask_bits;
3794824e7fdSDimitry Andric
380*cb14a3feSDimitry Andric template <class _UIntType,
381*cb14a3feSDimitry Andric size_t __w,
382*cb14a3feSDimitry Andric size_t __n,
383*cb14a3feSDimitry Andric size_t __m,
384*cb14a3feSDimitry Andric size_t __r,
385*cb14a3feSDimitry Andric _UIntType __a,
386*cb14a3feSDimitry Andric size_t __u,
387*cb14a3feSDimitry Andric _UIntType __d,
388*cb14a3feSDimitry Andric size_t __s,
389*cb14a3feSDimitry Andric _UIntType __b,
390*cb14a3feSDimitry Andric size_t __t,
391*cb14a3feSDimitry Andric _UIntType __c,
392*cb14a3feSDimitry Andric size_t __l,
393*cb14a3feSDimitry Andric _UIntType __f>
394*cb14a3feSDimitry Andric _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<
395*cb14a3feSDimitry Andric _UIntType,
396*cb14a3feSDimitry Andric __w,
397*cb14a3feSDimitry Andric __n,
398*cb14a3feSDimitry Andric __m,
399*cb14a3feSDimitry Andric __r,
400*cb14a3feSDimitry Andric __a,
401*cb14a3feSDimitry Andric __u,
402*cb14a3feSDimitry Andric __d,
403*cb14a3feSDimitry Andric __s,
404*cb14a3feSDimitry Andric __b,
405*cb14a3feSDimitry Andric __t,
406*cb14a3feSDimitry Andric __c,
407*cb14a3feSDimitry Andric __l,
408*cb14a3feSDimitry Andric __f>::result_type
4094824e7fdSDimitry Andric mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::xor_mask;
4104824e7fdSDimitry Andric
411*cb14a3feSDimitry Andric template <class _UIntType,
412*cb14a3feSDimitry Andric size_t __w,
413*cb14a3feSDimitry Andric size_t __n,
414*cb14a3feSDimitry Andric size_t __m,
415*cb14a3feSDimitry Andric size_t __r,
416*cb14a3feSDimitry Andric _UIntType __a,
417*cb14a3feSDimitry Andric size_t __u,
418*cb14a3feSDimitry Andric _UIntType __d,
419*cb14a3feSDimitry Andric size_t __s,
420*cb14a3feSDimitry Andric _UIntType __b,
421*cb14a3feSDimitry Andric size_t __t,
422*cb14a3feSDimitry Andric _UIntType __c,
423*cb14a3feSDimitry Andric size_t __l,
424*cb14a3feSDimitry Andric _UIntType __f>
4254824e7fdSDimitry Andric _LIBCPP_CONSTEXPR const size_t
4264824e7fdSDimitry Andric mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_u;
4274824e7fdSDimitry Andric
428*cb14a3feSDimitry Andric template <class _UIntType,
429*cb14a3feSDimitry Andric size_t __w,
430*cb14a3feSDimitry Andric size_t __n,
431*cb14a3feSDimitry Andric size_t __m,
432*cb14a3feSDimitry Andric size_t __r,
433*cb14a3feSDimitry Andric _UIntType __a,
434*cb14a3feSDimitry Andric size_t __u,
435*cb14a3feSDimitry Andric _UIntType __d,
436*cb14a3feSDimitry Andric size_t __s,
437*cb14a3feSDimitry Andric _UIntType __b,
438*cb14a3feSDimitry Andric size_t __t,
439*cb14a3feSDimitry Andric _UIntType __c,
440*cb14a3feSDimitry Andric size_t __l,
441*cb14a3feSDimitry Andric _UIntType __f>
442*cb14a3feSDimitry Andric _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<
443*cb14a3feSDimitry Andric _UIntType,
444*cb14a3feSDimitry Andric __w,
445*cb14a3feSDimitry Andric __n,
446*cb14a3feSDimitry Andric __m,
447*cb14a3feSDimitry Andric __r,
448*cb14a3feSDimitry Andric __a,
449*cb14a3feSDimitry Andric __u,
450*cb14a3feSDimitry Andric __d,
451*cb14a3feSDimitry Andric __s,
452*cb14a3feSDimitry Andric __b,
453*cb14a3feSDimitry Andric __t,
454*cb14a3feSDimitry Andric __c,
455*cb14a3feSDimitry Andric __l,
456*cb14a3feSDimitry Andric __f>::result_type
4574824e7fdSDimitry Andric mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_d;
4584824e7fdSDimitry Andric
459*cb14a3feSDimitry Andric template <class _UIntType,
460*cb14a3feSDimitry Andric size_t __w,
461*cb14a3feSDimitry Andric size_t __n,
462*cb14a3feSDimitry Andric size_t __m,
463*cb14a3feSDimitry Andric size_t __r,
464*cb14a3feSDimitry Andric _UIntType __a,
465*cb14a3feSDimitry Andric size_t __u,
466*cb14a3feSDimitry Andric _UIntType __d,
467*cb14a3feSDimitry Andric size_t __s,
468*cb14a3feSDimitry Andric _UIntType __b,
469*cb14a3feSDimitry Andric size_t __t,
470*cb14a3feSDimitry Andric _UIntType __c,
471*cb14a3feSDimitry Andric size_t __l,
472*cb14a3feSDimitry Andric _UIntType __f>
4734824e7fdSDimitry Andric _LIBCPP_CONSTEXPR const size_t
4744824e7fdSDimitry Andric mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_s;
4754824e7fdSDimitry Andric
476*cb14a3feSDimitry Andric template <class _UIntType,
477*cb14a3feSDimitry Andric size_t __w,
478*cb14a3feSDimitry Andric size_t __n,
479*cb14a3feSDimitry Andric size_t __m,
480*cb14a3feSDimitry Andric size_t __r,
481*cb14a3feSDimitry Andric _UIntType __a,
482*cb14a3feSDimitry Andric size_t __u,
483*cb14a3feSDimitry Andric _UIntType __d,
484*cb14a3feSDimitry Andric size_t __s,
485*cb14a3feSDimitry Andric _UIntType __b,
486*cb14a3feSDimitry Andric size_t __t,
487*cb14a3feSDimitry Andric _UIntType __c,
488*cb14a3feSDimitry Andric size_t __l,
489*cb14a3feSDimitry Andric _UIntType __f>
490*cb14a3feSDimitry Andric _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<
491*cb14a3feSDimitry Andric _UIntType,
492*cb14a3feSDimitry Andric __w,
493*cb14a3feSDimitry Andric __n,
494*cb14a3feSDimitry Andric __m,
495*cb14a3feSDimitry Andric __r,
496*cb14a3feSDimitry Andric __a,
497*cb14a3feSDimitry Andric __u,
498*cb14a3feSDimitry Andric __d,
499*cb14a3feSDimitry Andric __s,
500*cb14a3feSDimitry Andric __b,
501*cb14a3feSDimitry Andric __t,
502*cb14a3feSDimitry Andric __c,
503*cb14a3feSDimitry Andric __l,
504*cb14a3feSDimitry Andric __f>::result_type
5054824e7fdSDimitry Andric mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_b;
5064824e7fdSDimitry Andric
507*cb14a3feSDimitry Andric template <class _UIntType,
508*cb14a3feSDimitry Andric size_t __w,
509*cb14a3feSDimitry Andric size_t __n,
510*cb14a3feSDimitry Andric size_t __m,
511*cb14a3feSDimitry Andric size_t __r,
512*cb14a3feSDimitry Andric _UIntType __a,
513*cb14a3feSDimitry Andric size_t __u,
514*cb14a3feSDimitry Andric _UIntType __d,
515*cb14a3feSDimitry Andric size_t __s,
516*cb14a3feSDimitry Andric _UIntType __b,
517*cb14a3feSDimitry Andric size_t __t,
518*cb14a3feSDimitry Andric _UIntType __c,
519*cb14a3feSDimitry Andric size_t __l,
520*cb14a3feSDimitry Andric _UIntType __f>
5214824e7fdSDimitry Andric _LIBCPP_CONSTEXPR const size_t
5224824e7fdSDimitry Andric mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_t;
5234824e7fdSDimitry Andric
524*cb14a3feSDimitry Andric template <class _UIntType,
525*cb14a3feSDimitry Andric size_t __w,
526*cb14a3feSDimitry Andric size_t __n,
527*cb14a3feSDimitry Andric size_t __m,
528*cb14a3feSDimitry Andric size_t __r,
529*cb14a3feSDimitry Andric _UIntType __a,
530*cb14a3feSDimitry Andric size_t __u,
531*cb14a3feSDimitry Andric _UIntType __d,
532*cb14a3feSDimitry Andric size_t __s,
533*cb14a3feSDimitry Andric _UIntType __b,
534*cb14a3feSDimitry Andric size_t __t,
535*cb14a3feSDimitry Andric _UIntType __c,
536*cb14a3feSDimitry Andric size_t __l,
537*cb14a3feSDimitry Andric _UIntType __f>
538*cb14a3feSDimitry Andric _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<
539*cb14a3feSDimitry Andric _UIntType,
540*cb14a3feSDimitry Andric __w,
541*cb14a3feSDimitry Andric __n,
542*cb14a3feSDimitry Andric __m,
543*cb14a3feSDimitry Andric __r,
544*cb14a3feSDimitry Andric __a,
545*cb14a3feSDimitry Andric __u,
546*cb14a3feSDimitry Andric __d,
547*cb14a3feSDimitry Andric __s,
548*cb14a3feSDimitry Andric __b,
549*cb14a3feSDimitry Andric __t,
550*cb14a3feSDimitry Andric __c,
551*cb14a3feSDimitry Andric __l,
552*cb14a3feSDimitry Andric __f>::result_type
5534824e7fdSDimitry Andric mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_c;
5544824e7fdSDimitry Andric
555*cb14a3feSDimitry Andric template <class _UIntType,
556*cb14a3feSDimitry Andric size_t __w,
557*cb14a3feSDimitry Andric size_t __n,
558*cb14a3feSDimitry Andric size_t __m,
559*cb14a3feSDimitry Andric size_t __r,
560*cb14a3feSDimitry Andric _UIntType __a,
561*cb14a3feSDimitry Andric size_t __u,
562*cb14a3feSDimitry Andric _UIntType __d,
563*cb14a3feSDimitry Andric size_t __s,
564*cb14a3feSDimitry Andric _UIntType __b,
565*cb14a3feSDimitry Andric size_t __t,
566*cb14a3feSDimitry Andric _UIntType __c,
567*cb14a3feSDimitry Andric size_t __l,
568*cb14a3feSDimitry Andric _UIntType __f>
5694824e7fdSDimitry Andric _LIBCPP_CONSTEXPR const size_t
5704824e7fdSDimitry Andric mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_l;
5714824e7fdSDimitry Andric
572*cb14a3feSDimitry Andric template <class _UIntType,
573*cb14a3feSDimitry Andric size_t __w,
574*cb14a3feSDimitry Andric size_t __n,
575*cb14a3feSDimitry Andric size_t __m,
576*cb14a3feSDimitry Andric size_t __r,
577*cb14a3feSDimitry Andric _UIntType __a,
578*cb14a3feSDimitry Andric size_t __u,
579*cb14a3feSDimitry Andric _UIntType __d,
580*cb14a3feSDimitry Andric size_t __s,
581*cb14a3feSDimitry Andric _UIntType __b,
582*cb14a3feSDimitry Andric size_t __t,
583*cb14a3feSDimitry Andric _UIntType __c,
584*cb14a3feSDimitry Andric size_t __l,
585*cb14a3feSDimitry Andric _UIntType __f>
586*cb14a3feSDimitry Andric _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<
587*cb14a3feSDimitry Andric _UIntType,
588*cb14a3feSDimitry Andric __w,
589*cb14a3feSDimitry Andric __n,
590*cb14a3feSDimitry Andric __m,
591*cb14a3feSDimitry Andric __r,
592*cb14a3feSDimitry Andric __a,
593*cb14a3feSDimitry Andric __u,
594*cb14a3feSDimitry Andric __d,
595*cb14a3feSDimitry Andric __s,
596*cb14a3feSDimitry Andric __b,
597*cb14a3feSDimitry Andric __t,
598*cb14a3feSDimitry Andric __c,
599*cb14a3feSDimitry Andric __l,
600*cb14a3feSDimitry Andric __f>::result_type
601*cb14a3feSDimitry Andric mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::
602*cb14a3feSDimitry Andric initialization_multiplier;
6034824e7fdSDimitry Andric
604*cb14a3feSDimitry Andric template <class _UIntType,
605*cb14a3feSDimitry Andric size_t __w,
606*cb14a3feSDimitry Andric size_t __n,
607*cb14a3feSDimitry Andric size_t __m,
608*cb14a3feSDimitry Andric size_t __r,
609*cb14a3feSDimitry Andric _UIntType __a,
610*cb14a3feSDimitry Andric size_t __u,
611*cb14a3feSDimitry Andric _UIntType __d,
612*cb14a3feSDimitry Andric size_t __s,
613*cb14a3feSDimitry Andric _UIntType __b,
614*cb14a3feSDimitry Andric size_t __t,
615*cb14a3feSDimitry Andric _UIntType __c,
616*cb14a3feSDimitry Andric size_t __l,
617*cb14a3feSDimitry Andric _UIntType __f>
618*cb14a3feSDimitry Andric _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<
619*cb14a3feSDimitry Andric _UIntType,
620*cb14a3feSDimitry Andric __w,
621*cb14a3feSDimitry Andric __n,
622*cb14a3feSDimitry Andric __m,
623*cb14a3feSDimitry Andric __r,
624*cb14a3feSDimitry Andric __a,
625*cb14a3feSDimitry Andric __u,
626*cb14a3feSDimitry Andric __d,
627*cb14a3feSDimitry Andric __s,
628*cb14a3feSDimitry Andric __b,
629*cb14a3feSDimitry Andric __t,
630*cb14a3feSDimitry Andric __c,
631*cb14a3feSDimitry Andric __l,
632*cb14a3feSDimitry Andric __f>::result_type
6334824e7fdSDimitry Andric mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::default_seed;
6344824e7fdSDimitry Andric
635*cb14a3feSDimitry Andric template <class _UIntType,
636*cb14a3feSDimitry Andric size_t __w,
637*cb14a3feSDimitry Andric size_t __n,
638*cb14a3feSDimitry Andric size_t __m,
639*cb14a3feSDimitry Andric size_t __r,
640*cb14a3feSDimitry Andric _UIntType __a,
641*cb14a3feSDimitry Andric size_t __u,
642*cb14a3feSDimitry Andric _UIntType __d,
643*cb14a3feSDimitry Andric size_t __s,
644*cb14a3feSDimitry Andric _UIntType __b,
645*cb14a3feSDimitry Andric size_t __t,
646*cb14a3feSDimitry Andric _UIntType __c,
647*cb14a3feSDimitry Andric size_t __l,
648*cb14a3feSDimitry Andric _UIntType __f>
seed(result_type __sd)649*cb14a3feSDimitry Andric void mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::seed(
650*cb14a3feSDimitry Andric result_type __sd) _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK { // __w >= 2
6514824e7fdSDimitry Andric __x_[0] = __sd & _Max;
6524824e7fdSDimitry Andric for (size_t __i = 1; __i < __n; ++__i)
6534824e7fdSDimitry Andric __x_[__i] = (__f * (__x_[__i - 1] ^ __rshift<__w - 2>(__x_[__i - 1])) + __i) & _Max;
6544824e7fdSDimitry Andric __i_ = 0;
6554824e7fdSDimitry Andric }
6564824e7fdSDimitry Andric
657*cb14a3feSDimitry Andric template <class _UIntType,
658*cb14a3feSDimitry Andric size_t __w,
659*cb14a3feSDimitry Andric size_t __n,
660*cb14a3feSDimitry Andric size_t __m,
661*cb14a3feSDimitry Andric size_t __r,
662*cb14a3feSDimitry Andric _UIntType __a,
663*cb14a3feSDimitry Andric size_t __u,
664*cb14a3feSDimitry Andric _UIntType __d,
665*cb14a3feSDimitry Andric size_t __s,
666*cb14a3feSDimitry Andric _UIntType __b,
667*cb14a3feSDimitry Andric size_t __t,
668*cb14a3feSDimitry Andric _UIntType __c,
669*cb14a3feSDimitry Andric size_t __l,
670*cb14a3feSDimitry Andric _UIntType __f>
6714824e7fdSDimitry Andric template <class _Sseq>
__seed(_Sseq & __q,integral_constant<unsigned,1>)672*cb14a3feSDimitry Andric void mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::__seed(
673*cb14a3feSDimitry Andric _Sseq& __q, integral_constant<unsigned, 1>) {
6744824e7fdSDimitry Andric const unsigned __k = 1;
6754824e7fdSDimitry Andric uint32_t __ar[__n * __k];
6764824e7fdSDimitry Andric __q.generate(__ar, __ar + __n * __k);
6774824e7fdSDimitry Andric for (size_t __i = 0; __i < __n; ++__i)
6784824e7fdSDimitry Andric __x_[__i] = static_cast<result_type>(__ar[__i] & _Max);
679*cb14a3feSDimitry Andric const result_type __mask = __r == _Dt ? result_type(~0) : (result_type(1) << __r) - result_type(1);
6804824e7fdSDimitry Andric __i_ = 0;
681*cb14a3feSDimitry Andric if ((__x_[0] & ~__mask) == 0) {
6824824e7fdSDimitry Andric for (size_t __i = 1; __i < __n; ++__i)
6834824e7fdSDimitry Andric if (__x_[__i] != 0)
6844824e7fdSDimitry Andric return;
6854824e7fdSDimitry Andric __x_[0] = result_type(1) << (__w - 1);
6864824e7fdSDimitry Andric }
6874824e7fdSDimitry Andric }
6884824e7fdSDimitry Andric
689*cb14a3feSDimitry Andric template <class _UIntType,
690*cb14a3feSDimitry Andric size_t __w,
691*cb14a3feSDimitry Andric size_t __n,
692*cb14a3feSDimitry Andric size_t __m,
693*cb14a3feSDimitry Andric size_t __r,
694*cb14a3feSDimitry Andric _UIntType __a,
695*cb14a3feSDimitry Andric size_t __u,
696*cb14a3feSDimitry Andric _UIntType __d,
697*cb14a3feSDimitry Andric size_t __s,
698*cb14a3feSDimitry Andric _UIntType __b,
699*cb14a3feSDimitry Andric size_t __t,
700*cb14a3feSDimitry Andric _UIntType __c,
701*cb14a3feSDimitry Andric size_t __l,
702*cb14a3feSDimitry Andric _UIntType __f>
7034824e7fdSDimitry Andric template <class _Sseq>
__seed(_Sseq & __q,integral_constant<unsigned,2>)704*cb14a3feSDimitry Andric void mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::__seed(
705*cb14a3feSDimitry Andric _Sseq& __q, integral_constant<unsigned, 2>) {
7064824e7fdSDimitry Andric const unsigned __k = 2;
7074824e7fdSDimitry Andric uint32_t __ar[__n * __k];
7084824e7fdSDimitry Andric __q.generate(__ar, __ar + __n * __k);
7094824e7fdSDimitry Andric for (size_t __i = 0; __i < __n; ++__i)
710*cb14a3feSDimitry Andric __x_[__i] = static_cast<result_type>((__ar[2 * __i] + ((uint64_t)__ar[2 * __i + 1] << 32)) & _Max);
711*cb14a3feSDimitry Andric const result_type __mask = __r == _Dt ? result_type(~0) : (result_type(1) << __r) - result_type(1);
7124824e7fdSDimitry Andric __i_ = 0;
713*cb14a3feSDimitry Andric if ((__x_[0] & ~__mask) == 0) {
7144824e7fdSDimitry Andric for (size_t __i = 1; __i < __n; ++__i)
7154824e7fdSDimitry Andric if (__x_[__i] != 0)
7164824e7fdSDimitry Andric return;
7174824e7fdSDimitry Andric __x_[0] = result_type(1) << (__w - 1);
7184824e7fdSDimitry Andric }
7194824e7fdSDimitry Andric }
7204824e7fdSDimitry Andric
721*cb14a3feSDimitry Andric template <class _UIntType,
722*cb14a3feSDimitry Andric size_t __w,
723*cb14a3feSDimitry Andric size_t __n,
724*cb14a3feSDimitry Andric size_t __m,
725*cb14a3feSDimitry Andric size_t __r,
726*cb14a3feSDimitry Andric _UIntType __a,
727*cb14a3feSDimitry Andric size_t __u,
728*cb14a3feSDimitry Andric _UIntType __d,
729*cb14a3feSDimitry Andric size_t __s,
730*cb14a3feSDimitry Andric _UIntType __b,
731*cb14a3feSDimitry Andric size_t __t,
732*cb14a3feSDimitry Andric _UIntType __c,
733*cb14a3feSDimitry Andric size_t __l,
734*cb14a3feSDimitry Andric _UIntType __f>
7354824e7fdSDimitry Andric _UIntType
operator()736*cb14a3feSDimitry Andric mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::operator()() {
7374824e7fdSDimitry Andric const size_t __j = (__i_ + 1) % __n;
738*cb14a3feSDimitry Andric const result_type __mask = __r == _Dt ? result_type(~0) : (result_type(1) << __r) - result_type(1);
73906c3fb27SDimitry Andric const result_type __yp = (__x_[__i_] & ~__mask) | (__x_[__j] & __mask);
7404824e7fdSDimitry Andric const size_t __k = (__i_ + __m) % __n;
74106c3fb27SDimitry Andric __x_[__i_] = __x_[__k] ^ __rshift<1>(__yp) ^ (__a * (__yp & 1));
7424824e7fdSDimitry Andric result_type __z = __x_[__i_] ^ (__rshift<__u>(__x_[__i_]) & __d);
7434824e7fdSDimitry Andric __i_ = __j;
7444824e7fdSDimitry Andric __z ^= __lshift<__s>(__z) & __b;
7454824e7fdSDimitry Andric __z ^= __lshift<__t>(__z) & __c;
7464824e7fdSDimitry Andric return __z ^ __rshift<__l>(__z);
7474824e7fdSDimitry Andric }
7484824e7fdSDimitry Andric
749*cb14a3feSDimitry Andric template <class _UInt,
750*cb14a3feSDimitry Andric size_t _Wp,
751*cb14a3feSDimitry Andric size_t _Np,
752*cb14a3feSDimitry Andric size_t _Mp,
753*cb14a3feSDimitry Andric size_t _Rp,
754*cb14a3feSDimitry Andric _UInt _Ap,
755*cb14a3feSDimitry Andric size_t _Up,
756*cb14a3feSDimitry Andric _UInt _Dp,
757*cb14a3feSDimitry Andric size_t _Sp,
758*cb14a3feSDimitry Andric _UInt _Bp,
759*cb14a3feSDimitry Andric size_t _Tp,
760*cb14a3feSDimitry Andric _UInt _Cp,
761*cb14a3feSDimitry Andric size_t _Lp,
762*cb14a3feSDimitry Andric _UInt _Fp>
763bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI bool
764*cb14a3feSDimitry Andric operator==(const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, _Bp, _Tp, _Cp, _Lp, _Fp>& __x,
765*cb14a3feSDimitry Andric const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, _Bp, _Tp, _Cp, _Lp, _Fp>& __y) {
7664824e7fdSDimitry Andric if (__x.__i_ == __y.__i_)
7675f757f3fSDimitry Andric return std::equal(__x.__x_, __x.__x_ + _Np, __y.__x_);
768*cb14a3feSDimitry Andric if (__x.__i_ == 0 || __y.__i_ == 0) {
7695f757f3fSDimitry Andric size_t __j = std::min(_Np - __x.__i_, _Np - __y.__i_);
770*cb14a3feSDimitry Andric if (!std::equal(__x.__x_ + __x.__i_, __x.__x_ + __x.__i_ + __j, __y.__x_ + __y.__i_))
7714824e7fdSDimitry Andric return false;
7724824e7fdSDimitry Andric if (__x.__i_ == 0)
7735f757f3fSDimitry Andric return std::equal(__x.__x_ + __j, __x.__x_ + _Np, __y.__x_);
7745f757f3fSDimitry Andric return std::equal(__x.__x_, __x.__x_ + (_Np - __j), __y.__x_ + __j);
7754824e7fdSDimitry Andric }
776*cb14a3feSDimitry Andric if (__x.__i_ < __y.__i_) {
7774824e7fdSDimitry Andric size_t __j = _Np - __y.__i_;
778*cb14a3feSDimitry Andric if (!std::equal(__x.__x_ + __x.__i_, __x.__x_ + (__x.__i_ + __j), __y.__x_ + __y.__i_))
7794824e7fdSDimitry Andric return false;
780*cb14a3feSDimitry Andric if (!std::equal(__x.__x_ + (__x.__i_ + __j), __x.__x_ + _Np, __y.__x_))
7814824e7fdSDimitry Andric return false;
782*cb14a3feSDimitry Andric return std::equal(__x.__x_, __x.__x_ + __x.__i_, __y.__x_ + (_Np - (__x.__i_ + __j)));
7834824e7fdSDimitry Andric }
7844824e7fdSDimitry Andric size_t __j = _Np - __x.__i_;
785*cb14a3feSDimitry Andric if (!std::equal(__y.__x_ + __y.__i_, __y.__x_ + (__y.__i_ + __j), __x.__x_ + __x.__i_))
7864824e7fdSDimitry Andric return false;
787*cb14a3feSDimitry Andric if (!std::equal(__y.__x_ + (__y.__i_ + __j), __y.__x_ + _Np, __x.__x_))
7884824e7fdSDimitry Andric return false;
789*cb14a3feSDimitry Andric return std::equal(__y.__x_, __y.__x_ + __y.__i_, __x.__x_ + (_Np - (__y.__i_ + __j)));
7904824e7fdSDimitry Andric }
7914824e7fdSDimitry Andric
792*cb14a3feSDimitry Andric template <class _UInt,
793*cb14a3feSDimitry Andric size_t _Wp,
794*cb14a3feSDimitry Andric size_t _Np,
795*cb14a3feSDimitry Andric size_t _Mp,
796*cb14a3feSDimitry Andric size_t _Rp,
797*cb14a3feSDimitry Andric _UInt _Ap,
798*cb14a3feSDimitry Andric size_t _Up,
799*cb14a3feSDimitry Andric _UInt _Dp,
800*cb14a3feSDimitry Andric size_t _Sp,
801*cb14a3feSDimitry Andric _UInt _Bp,
802*cb14a3feSDimitry Andric size_t _Tp,
803*cb14a3feSDimitry Andric _UInt _Cp,
804*cb14a3feSDimitry Andric size_t _Lp,
805*cb14a3feSDimitry Andric _UInt _Fp>
806*cb14a3feSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI bool
807*cb14a3feSDimitry Andric operator!=(const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, _Bp, _Tp, _Cp, _Lp, _Fp>& __x,
808*cb14a3feSDimitry Andric const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, _Bp, _Tp, _Cp, _Lp, _Fp>& __y) {
8094824e7fdSDimitry Andric return !(__x == __y);
8104824e7fdSDimitry Andric }
8114824e7fdSDimitry Andric
812*cb14a3feSDimitry Andric template <class _CharT,
813*cb14a3feSDimitry Andric class _Traits,
814*cb14a3feSDimitry Andric class _UInt,
815*cb14a3feSDimitry Andric size_t _Wp,
816*cb14a3feSDimitry Andric size_t _Np,
817*cb14a3feSDimitry Andric size_t _Mp,
818*cb14a3feSDimitry Andric size_t _Rp,
819*cb14a3feSDimitry Andric _UInt _Ap,
820*cb14a3feSDimitry Andric size_t _Up,
821*cb14a3feSDimitry Andric _UInt _Dp,
822*cb14a3feSDimitry Andric size_t _Sp,
823*cb14a3feSDimitry Andric _UInt _Bp,
824*cb14a3feSDimitry Andric size_t _Tp,
825*cb14a3feSDimitry Andric _UInt _Cp,
826*cb14a3feSDimitry Andric size_t _Lp,
827*cb14a3feSDimitry Andric _UInt _Fp>
828bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
8294824e7fdSDimitry Andric operator<<(basic_ostream<_CharT, _Traits>& __os,
830*cb14a3feSDimitry Andric const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, _Bp, _Tp, _Cp, _Lp, _Fp>& __x) {
8314824e7fdSDimitry Andric __save_flags<_CharT, _Traits> __lx(__os);
8324824e7fdSDimitry Andric typedef basic_ostream<_CharT, _Traits> _Ostream;
8334824e7fdSDimitry Andric __os.flags(_Ostream::dec | _Ostream::left);
8344824e7fdSDimitry Andric _CharT __sp = __os.widen(' ');
8354824e7fdSDimitry Andric __os.fill(__sp);
8364824e7fdSDimitry Andric __os << __x.__x_[__x.__i_];
8374824e7fdSDimitry Andric for (size_t __j = __x.__i_ + 1; __j < _Np; ++__j)
8384824e7fdSDimitry Andric __os << __sp << __x.__x_[__j];
8394824e7fdSDimitry Andric for (size_t __j = 0; __j < __x.__i_; ++__j)
8404824e7fdSDimitry Andric __os << __sp << __x.__x_[__j];
8414824e7fdSDimitry Andric return __os;
8424824e7fdSDimitry Andric }
8434824e7fdSDimitry Andric
844*cb14a3feSDimitry Andric template <class _CharT,
845*cb14a3feSDimitry Andric class _Traits,
846*cb14a3feSDimitry Andric class _UInt,
847*cb14a3feSDimitry Andric size_t _Wp,
848*cb14a3feSDimitry Andric size_t _Np,
849*cb14a3feSDimitry Andric size_t _Mp,
850*cb14a3feSDimitry Andric size_t _Rp,
851*cb14a3feSDimitry Andric _UInt _Ap,
852*cb14a3feSDimitry Andric size_t _Up,
853*cb14a3feSDimitry Andric _UInt _Dp,
854*cb14a3feSDimitry Andric size_t _Sp,
855*cb14a3feSDimitry Andric _UInt _Bp,
856*cb14a3feSDimitry Andric size_t _Tp,
857*cb14a3feSDimitry Andric _UInt _Cp,
858*cb14a3feSDimitry Andric size_t _Lp,
859*cb14a3feSDimitry Andric _UInt _Fp>
860bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
8614824e7fdSDimitry Andric operator>>(basic_istream<_CharT, _Traits>& __is,
862*cb14a3feSDimitry Andric mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, _Bp, _Tp, _Cp, _Lp, _Fp>& __x) {
8634824e7fdSDimitry Andric __save_flags<_CharT, _Traits> __lx(__is);
8644824e7fdSDimitry Andric typedef basic_istream<_CharT, _Traits> _Istream;
8654824e7fdSDimitry Andric __is.flags(_Istream::dec | _Istream::skipws);
8664824e7fdSDimitry Andric _UInt __t[_Np];
8674824e7fdSDimitry Andric for (size_t __i = 0; __i < _Np; ++__i)
8684824e7fdSDimitry Andric __is >> __t[__i];
869*cb14a3feSDimitry Andric if (!__is.fail()) {
8704824e7fdSDimitry Andric for (size_t __i = 0; __i < _Np; ++__i)
8714824e7fdSDimitry Andric __x.__x_[__i] = __t[__i];
8724824e7fdSDimitry Andric __x.__i_ = 0;
8734824e7fdSDimitry Andric }
8744824e7fdSDimitry Andric return __is;
8754824e7fdSDimitry Andric }
8764824e7fdSDimitry Andric
877*cb14a3feSDimitry Andric typedef mersenne_twister_engine<
878*cb14a3feSDimitry Andric uint_fast32_t,
879*cb14a3feSDimitry Andric 32,
880*cb14a3feSDimitry Andric 624,
881*cb14a3feSDimitry Andric 397,
882*cb14a3feSDimitry Andric 31,
883*cb14a3feSDimitry Andric 0x9908b0df,
884*cb14a3feSDimitry Andric 11,
885*cb14a3feSDimitry Andric 0xffffffff,
886*cb14a3feSDimitry Andric 7,
887*cb14a3feSDimitry Andric 0x9d2c5680,
888*cb14a3feSDimitry Andric 15,
889*cb14a3feSDimitry Andric 0xefc60000,
890*cb14a3feSDimitry Andric 18,
891*cb14a3feSDimitry Andric 1812433253>
892*cb14a3feSDimitry Andric mt19937;
893*cb14a3feSDimitry Andric typedef mersenne_twister_engine<
894*cb14a3feSDimitry Andric uint_fast64_t,
895*cb14a3feSDimitry Andric 64,
896*cb14a3feSDimitry Andric 312,
897*cb14a3feSDimitry Andric 156,
898*cb14a3feSDimitry Andric 31,
899*cb14a3feSDimitry Andric 0xb5026f5aa96619e9ULL,
900*cb14a3feSDimitry Andric 29,
901*cb14a3feSDimitry Andric 0x5555555555555555ULL,
902*cb14a3feSDimitry Andric 17,
903*cb14a3feSDimitry Andric 0x71d67fffeda60000ULL,
904*cb14a3feSDimitry Andric 37,
905*cb14a3feSDimitry Andric 0xfff7eee000000000ULL,
906*cb14a3feSDimitry Andric 43,
907*cb14a3feSDimitry Andric 6364136223846793005ULL>
908*cb14a3feSDimitry Andric mt19937_64;
9094824e7fdSDimitry Andric
9104824e7fdSDimitry Andric _LIBCPP_END_NAMESPACE_STD
9114824e7fdSDimitry Andric
9124824e7fdSDimitry Andric _LIBCPP_POP_MACROS
9134824e7fdSDimitry Andric
9144824e7fdSDimitry Andric #endif // _LIBCPP___RANDOM_MERSENNE_TWISTER_ENGINE_H
915