xref: /llvm-project/libcxx/include/__random/mersenne_twister_engine.h (revision b69ddbc62838f23ace237c206676b1ed1c882638)
1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef _LIBCPP___RANDOM_MERSENNE_TWISTER_ENGINE_H
10 #define _LIBCPP___RANDOM_MERSENNE_TWISTER_ENGINE_H
11 
12 #include <__algorithm/equal.h>
13 #include <__algorithm/min.h>
14 #include <__config>
15 #include <__cstddef/size_t.h>
16 #include <__random/is_seed_sequence.h>
17 #include <__type_traits/enable_if.h>
18 #include <cstdint>
19 #include <iosfwd>
20 #include <limits>
21 
22 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
23 #  pragma GCC system_header
24 #endif
25 
26 _LIBCPP_PUSH_MACROS
27 #include <__undef_macros>
28 
29 _LIBCPP_BEGIN_NAMESPACE_STD
30 
31 template <class _UIntType,
32           size_t __w,
33           size_t __n,
34           size_t __m,
35           size_t __r,
36           _UIntType __a,
37           size_t __u,
38           _UIntType __d,
39           size_t __s,
40           _UIntType __b,
41           size_t __t,
42           _UIntType __c,
43           size_t __l,
44           _UIntType __f>
45 class _LIBCPP_TEMPLATE_VIS mersenne_twister_engine;
46 
47 template <class _UInt,
48           size_t _Wp,
49           size_t _Np,
50           size_t _Mp,
51           size_t _Rp,
52           _UInt _Ap,
53           size_t _Up,
54           _UInt _Dp,
55           size_t _Sp,
56           _UInt _Bp,
57           size_t _Tp,
58           _UInt _Cp,
59           size_t _Lp,
60           _UInt _Fp>
61 _LIBCPP_HIDE_FROM_ABI bool
62 operator==(const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, _Bp, _Tp, _Cp, _Lp, _Fp>& __x,
63            const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, _Bp, _Tp, _Cp, _Lp, _Fp>& __y);
64 
65 template <class _UInt,
66           size_t _Wp,
67           size_t _Np,
68           size_t _Mp,
69           size_t _Rp,
70           _UInt _Ap,
71           size_t _Up,
72           _UInt _Dp,
73           size_t _Sp,
74           _UInt _Bp,
75           size_t _Tp,
76           _UInt _Cp,
77           size_t _Lp,
78           _UInt _Fp>
79 _LIBCPP_HIDE_FROM_ABI bool
80 operator!=(const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, _Bp, _Tp, _Cp, _Lp, _Fp>& __x,
81            const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, _Bp, _Tp, _Cp, _Lp, _Fp>& __y);
82 
83 template <class _CharT,
84           class _Traits,
85           class _UInt,
86           size_t _Wp,
87           size_t _Np,
88           size_t _Mp,
89           size_t _Rp,
90           _UInt _Ap,
91           size_t _Up,
92           _UInt _Dp,
93           size_t _Sp,
94           _UInt _Bp,
95           size_t _Tp,
96           _UInt _Cp,
97           size_t _Lp,
98           _UInt _Fp>
99 _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
100 operator<<(basic_ostream<_CharT, _Traits>& __os,
101            const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, _Bp, _Tp, _Cp, _Lp, _Fp>& __x);
102 
103 template <class _CharT,
104           class _Traits,
105           class _UInt,
106           size_t _Wp,
107           size_t _Np,
108           size_t _Mp,
109           size_t _Rp,
110           _UInt _Ap,
111           size_t _Up,
112           _UInt _Dp,
113           size_t _Sp,
114           _UInt _Bp,
115           size_t _Tp,
116           _UInt _Cp,
117           size_t _Lp,
118           _UInt _Fp>
119 _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
120 operator>>(basic_istream<_CharT, _Traits>& __is,
121            mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, _Bp, _Tp, _Cp, _Lp, _Fp>& __x);
122 
123 template <class _UIntType,
124           size_t __w,
125           size_t __n,
126           size_t __m,
127           size_t __r,
128           _UIntType __a,
129           size_t __u,
130           _UIntType __d,
131           size_t __s,
132           _UIntType __b,
133           size_t __t,
134           _UIntType __c,
135           size_t __l,
136           _UIntType __f>
137 class _LIBCPP_TEMPLATE_VIS mersenne_twister_engine {
138 public:
139   // types
140   typedef _UIntType result_type;
141 
142 private:
143   result_type __x_[__n];
144   size_t __i_;
145 
146   static_assert(0 < __m, "mersenne_twister_engine invalid parameters");
147   static_assert(__m <= __n, "mersenne_twister_engine invalid parameters");
148   static _LIBCPP_CONSTEXPR const result_type _Dt = numeric_limits<result_type>::digits;
149   static_assert(__w <= _Dt, "mersenne_twister_engine invalid parameters");
150   static_assert(2 <= __w, "mersenne_twister_engine invalid parameters");
151   static_assert(__r <= __w, "mersenne_twister_engine invalid parameters");
152   static_assert(__u <= __w, "mersenne_twister_engine invalid parameters");
153   static_assert(__s <= __w, "mersenne_twister_engine invalid parameters");
154   static_assert(__t <= __w, "mersenne_twister_engine invalid parameters");
155   static_assert(__l <= __w, "mersenne_twister_engine invalid parameters");
156 
157 public:
158   static _LIBCPP_CONSTEXPR const result_type _Min = 0;
159   static _LIBCPP_CONSTEXPR const result_type _Max =
160       __w == _Dt ? result_type(~0) : (result_type(1) << __w) - result_type(1);
161   static_assert(_Min < _Max, "mersenne_twister_engine invalid parameters");
162   static_assert(__a <= _Max, "mersenne_twister_engine invalid parameters");
163   static_assert(__b <= _Max, "mersenne_twister_engine invalid parameters");
164   static_assert(__c <= _Max, "mersenne_twister_engine invalid parameters");
165   static_assert(__d <= _Max, "mersenne_twister_engine invalid parameters");
166   static_assert(__f <= _Max, "mersenne_twister_engine invalid parameters");
167 
168   // engine characteristics
169   static inline _LIBCPP_CONSTEXPR const size_t word_size                      = __w;
170   static inline _LIBCPP_CONSTEXPR const size_t state_size                     = __n;
171   static inline _LIBCPP_CONSTEXPR const size_t shift_size                     = __m;
172   static inline _LIBCPP_CONSTEXPR const size_t mask_bits                      = __r;
173   static inline _LIBCPP_CONSTEXPR const result_type xor_mask                  = __a;
174   static inline _LIBCPP_CONSTEXPR const size_t tempering_u                    = __u;
175   static inline _LIBCPP_CONSTEXPR const result_type tempering_d               = __d;
176   static inline _LIBCPP_CONSTEXPR const size_t tempering_s                    = __s;
177   static inline _LIBCPP_CONSTEXPR const result_type tempering_b               = __b;
178   static inline _LIBCPP_CONSTEXPR const size_t tempering_t                    = __t;
179   static inline _LIBCPP_CONSTEXPR const result_type tempering_c               = __c;
180   static inline _LIBCPP_CONSTEXPR const size_t tempering_l                    = __l;
181   static inline _LIBCPP_CONSTEXPR const result_type initialization_multiplier = __f;
182   _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR result_type min() { return _Min; }
183   _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR result_type max() { return _Max; }
184   static inline _LIBCPP_CONSTEXPR const result_type default_seed = 5489u;
185 
186   // constructors and seeding functions
187 #ifndef _LIBCPP_CXX03_LANG
188   _LIBCPP_HIDE_FROM_ABI mersenne_twister_engine() : mersenne_twister_engine(default_seed) {}
189   _LIBCPP_HIDE_FROM_ABI explicit mersenne_twister_engine(result_type __sd) { seed(__sd); }
190 #else
191   _LIBCPP_HIDE_FROM_ABI explicit mersenne_twister_engine(result_type __sd = default_seed) { seed(__sd); }
192 #endif
193   template <class _Sseq, __enable_if_t<__is_seed_sequence<_Sseq, mersenne_twister_engine>::value, int> = 0>
194   _LIBCPP_HIDE_FROM_ABI explicit mersenne_twister_engine(_Sseq& __q) {
195     seed(__q);
196   }
197   _LIBCPP_HIDE_FROM_ABI void seed(result_type __sd = default_seed);
198   template <class _Sseq, __enable_if_t<__is_seed_sequence<_Sseq, mersenne_twister_engine>::value, int> = 0>
199   _LIBCPP_HIDE_FROM_ABI void seed(_Sseq& __q) {
200     __seed(__q, integral_constant<unsigned, 1 + (__w - 1) / 32>());
201   }
202 
203   // generating functions
204   _LIBCPP_HIDE_FROM_ABI result_type operator()();
205   _LIBCPP_HIDE_FROM_ABI void discard(unsigned long long __z) {
206     for (; __z; --__z)
207       operator()();
208   }
209 
210   template <class _UInt,
211             size_t _Wp,
212             size_t _Np,
213             size_t _Mp,
214             size_t _Rp,
215             _UInt _Ap,
216             size_t _Up,
217             _UInt _Dp,
218             size_t _Sp,
219             _UInt _Bp,
220             size_t _Tp,
221             _UInt _Cp,
222             size_t _Lp,
223             _UInt _Fp>
224   friend bool operator==(
225       const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, _Bp, _Tp, _Cp, _Lp, _Fp>& __x,
226       const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, _Bp, _Tp, _Cp, _Lp, _Fp>& __y);
227 
228   template <class _UInt,
229             size_t _Wp,
230             size_t _Np,
231             size_t _Mp,
232             size_t _Rp,
233             _UInt _Ap,
234             size_t _Up,
235             _UInt _Dp,
236             size_t _Sp,
237             _UInt _Bp,
238             size_t _Tp,
239             _UInt _Cp,
240             size_t _Lp,
241             _UInt _Fp>
242   friend bool operator!=(
243       const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, _Bp, _Tp, _Cp, _Lp, _Fp>& __x,
244       const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, _Bp, _Tp, _Cp, _Lp, _Fp>& __y);
245 
246   template <class _CharT,
247             class _Traits,
248             class _UInt,
249             size_t _Wp,
250             size_t _Np,
251             size_t _Mp,
252             size_t _Rp,
253             _UInt _Ap,
254             size_t _Up,
255             _UInt _Dp,
256             size_t _Sp,
257             _UInt _Bp,
258             size_t _Tp,
259             _UInt _Cp,
260             size_t _Lp,
261             _UInt _Fp>
262   friend basic_ostream<_CharT, _Traits>& operator<<(
263       basic_ostream<_CharT, _Traits>& __os,
264       const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, _Bp, _Tp, _Cp, _Lp, _Fp>& __x);
265 
266   template <class _CharT,
267             class _Traits,
268             class _UInt,
269             size_t _Wp,
270             size_t _Np,
271             size_t _Mp,
272             size_t _Rp,
273             _UInt _Ap,
274             size_t _Up,
275             _UInt _Dp,
276             size_t _Sp,
277             _UInt _Bp,
278             size_t _Tp,
279             _UInt _Cp,
280             size_t _Lp,
281             _UInt _Fp>
282   friend basic_istream<_CharT, _Traits>&
283   operator>>(basic_istream<_CharT, _Traits>& __is,
284              mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, _Bp, _Tp, _Cp, _Lp, _Fp>& __x);
285 
286 private:
287   template <class _Sseq>
288   _LIBCPP_HIDE_FROM_ABI void __seed(_Sseq& __q, integral_constant<unsigned, 1>);
289   template <class _Sseq>
290   _LIBCPP_HIDE_FROM_ABI void __seed(_Sseq& __q, integral_constant<unsigned, 2>);
291 
292   template <size_t __count,
293             __enable_if_t<__count< __w, int> = 0> _LIBCPP_HIDE_FROM_ABI static result_type __lshift(result_type __x) {
294     return (__x << __count) & _Max;
295   }
296 
297   template <size_t __count, __enable_if_t<(__count >= __w), int> = 0>
298   _LIBCPP_HIDE_FROM_ABI static result_type __lshift(result_type) {
299     return result_type(0);
300   }
301 
302   template <size_t __count,
303             __enable_if_t<__count< _Dt, int> = 0> _LIBCPP_HIDE_FROM_ABI static result_type __rshift(result_type __x) {
304     return __x >> __count;
305   }
306 
307   template <size_t __count, __enable_if_t<(__count >= _Dt), int> = 0>
308   _LIBCPP_HIDE_FROM_ABI static result_type __rshift(result_type) {
309     return result_type(0);
310   }
311 };
312 
313 template <class _UIntType,
314           size_t __w,
315           size_t __n,
316           size_t __m,
317           size_t __r,
318           _UIntType __a,
319           size_t __u,
320           _UIntType __d,
321           size_t __s,
322           _UIntType __b,
323           size_t __t,
324           _UIntType __c,
325           size_t __l,
326           _UIntType __f>
327 void mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::seed(
328     result_type __sd) _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK { // __w >= 2
329   __x_[0] = __sd & _Max;
330   for (size_t __i = 1; __i < __n; ++__i)
331     __x_[__i] = (__f * (__x_[__i - 1] ^ __rshift<__w - 2>(__x_[__i - 1])) + __i) & _Max;
332   __i_ = 0;
333 }
334 
335 template <class _UIntType,
336           size_t __w,
337           size_t __n,
338           size_t __m,
339           size_t __r,
340           _UIntType __a,
341           size_t __u,
342           _UIntType __d,
343           size_t __s,
344           _UIntType __b,
345           size_t __t,
346           _UIntType __c,
347           size_t __l,
348           _UIntType __f>
349 template <class _Sseq>
350 void mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::__seed(
351     _Sseq& __q, integral_constant<unsigned, 1>) {
352   const unsigned __k = 1;
353   uint32_t __ar[__n * __k];
354   __q.generate(__ar, __ar + __n * __k);
355   for (size_t __i = 0; __i < __n; ++__i)
356     __x_[__i] = static_cast<result_type>(__ar[__i] & _Max);
357   const result_type __mask = __r == _Dt ? result_type(~0) : (result_type(1) << __r) - result_type(1);
358   __i_                     = 0;
359   if ((__x_[0] & ~__mask) == 0) {
360     for (size_t __i = 1; __i < __n; ++__i)
361       if (__x_[__i] != 0)
362         return;
363     __x_[0] = result_type(1) << (__w - 1);
364   }
365 }
366 
367 template <class _UIntType,
368           size_t __w,
369           size_t __n,
370           size_t __m,
371           size_t __r,
372           _UIntType __a,
373           size_t __u,
374           _UIntType __d,
375           size_t __s,
376           _UIntType __b,
377           size_t __t,
378           _UIntType __c,
379           size_t __l,
380           _UIntType __f>
381 template <class _Sseq>
382 void mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::__seed(
383     _Sseq& __q, integral_constant<unsigned, 2>) {
384   const unsigned __k = 2;
385   uint32_t __ar[__n * __k];
386   __q.generate(__ar, __ar + __n * __k);
387   for (size_t __i = 0; __i < __n; ++__i)
388     __x_[__i] = static_cast<result_type>((__ar[2 * __i] + ((uint64_t)__ar[2 * __i + 1] << 32)) & _Max);
389   const result_type __mask = __r == _Dt ? result_type(~0) : (result_type(1) << __r) - result_type(1);
390   __i_                     = 0;
391   if ((__x_[0] & ~__mask) == 0) {
392     for (size_t __i = 1; __i < __n; ++__i)
393       if (__x_[__i] != 0)
394         return;
395     __x_[0] = result_type(1) << (__w - 1);
396   }
397 }
398 
399 template <class _UIntType,
400           size_t __w,
401           size_t __n,
402           size_t __m,
403           size_t __r,
404           _UIntType __a,
405           size_t __u,
406           _UIntType __d,
407           size_t __s,
408           _UIntType __b,
409           size_t __t,
410           _UIntType __c,
411           size_t __l,
412           _UIntType __f>
413 _UIntType
414 mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::operator()() {
415   const size_t __j         = (__i_ + 1) % __n;
416   const result_type __mask = __r == _Dt ? result_type(~0) : (result_type(1) << __r) - result_type(1);
417   const result_type __yp   = (__x_[__i_] & ~__mask) | (__x_[__j] & __mask);
418   const size_t __k         = (__i_ + __m) % __n;
419   __x_[__i_]               = __x_[__k] ^ __rshift<1>(__yp) ^ (__a * (__yp & 1));
420   result_type __z          = __x_[__i_] ^ (__rshift<__u>(__x_[__i_]) & __d);
421   __i_                     = __j;
422   __z ^= __lshift<__s>(__z) & __b;
423   __z ^= __lshift<__t>(__z) & __c;
424   return __z ^ __rshift<__l>(__z);
425 }
426 
427 template <class _UInt,
428           size_t _Wp,
429           size_t _Np,
430           size_t _Mp,
431           size_t _Rp,
432           _UInt _Ap,
433           size_t _Up,
434           _UInt _Dp,
435           size_t _Sp,
436           _UInt _Bp,
437           size_t _Tp,
438           _UInt _Cp,
439           size_t _Lp,
440           _UInt _Fp>
441 _LIBCPP_HIDE_FROM_ABI bool
442 operator==(const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, _Bp, _Tp, _Cp, _Lp, _Fp>& __x,
443            const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, _Bp, _Tp, _Cp, _Lp, _Fp>& __y) {
444   if (__x.__i_ == __y.__i_)
445     return std::equal(__x.__x_, __x.__x_ + _Np, __y.__x_);
446   if (__x.__i_ == 0 || __y.__i_ == 0) {
447     size_t __j = std::min(_Np - __x.__i_, _Np - __y.__i_);
448     if (!std::equal(__x.__x_ + __x.__i_, __x.__x_ + __x.__i_ + __j, __y.__x_ + __y.__i_))
449       return false;
450     if (__x.__i_ == 0)
451       return std::equal(__x.__x_ + __j, __x.__x_ + _Np, __y.__x_);
452     return std::equal(__x.__x_, __x.__x_ + (_Np - __j), __y.__x_ + __j);
453   }
454   if (__x.__i_ < __y.__i_) {
455     size_t __j = _Np - __y.__i_;
456     if (!std::equal(__x.__x_ + __x.__i_, __x.__x_ + (__x.__i_ + __j), __y.__x_ + __y.__i_))
457       return false;
458     if (!std::equal(__x.__x_ + (__x.__i_ + __j), __x.__x_ + _Np, __y.__x_))
459       return false;
460     return std::equal(__x.__x_, __x.__x_ + __x.__i_, __y.__x_ + (_Np - (__x.__i_ + __j)));
461   }
462   size_t __j = _Np - __x.__i_;
463   if (!std::equal(__y.__x_ + __y.__i_, __y.__x_ + (__y.__i_ + __j), __x.__x_ + __x.__i_))
464     return false;
465   if (!std::equal(__y.__x_ + (__y.__i_ + __j), __y.__x_ + _Np, __x.__x_))
466     return false;
467   return std::equal(__y.__x_, __y.__x_ + __y.__i_, __x.__x_ + (_Np - (__y.__i_ + __j)));
468 }
469 
470 template <class _UInt,
471           size_t _Wp,
472           size_t _Np,
473           size_t _Mp,
474           size_t _Rp,
475           _UInt _Ap,
476           size_t _Up,
477           _UInt _Dp,
478           size_t _Sp,
479           _UInt _Bp,
480           size_t _Tp,
481           _UInt _Cp,
482           size_t _Lp,
483           _UInt _Fp>
484 inline _LIBCPP_HIDE_FROM_ABI bool
485 operator!=(const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, _Bp, _Tp, _Cp, _Lp, _Fp>& __x,
486            const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, _Bp, _Tp, _Cp, _Lp, _Fp>& __y) {
487   return !(__x == __y);
488 }
489 
490 template <class _CharT,
491           class _Traits,
492           class _UInt,
493           size_t _Wp,
494           size_t _Np,
495           size_t _Mp,
496           size_t _Rp,
497           _UInt _Ap,
498           size_t _Up,
499           _UInt _Dp,
500           size_t _Sp,
501           _UInt _Bp,
502           size_t _Tp,
503           _UInt _Cp,
504           size_t _Lp,
505           _UInt _Fp>
506 _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
507 operator<<(basic_ostream<_CharT, _Traits>& __os,
508            const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, _Bp, _Tp, _Cp, _Lp, _Fp>& __x) {
509   __save_flags<_CharT, _Traits> __lx(__os);
510   typedef basic_ostream<_CharT, _Traits> _Ostream;
511   __os.flags(_Ostream::dec | _Ostream::left);
512   _CharT __sp = __os.widen(' ');
513   __os.fill(__sp);
514   __os << __x.__x_[__x.__i_];
515   for (size_t __j = __x.__i_ + 1; __j < _Np; ++__j)
516     __os << __sp << __x.__x_[__j];
517   for (size_t __j = 0; __j < __x.__i_; ++__j)
518     __os << __sp << __x.__x_[__j];
519   return __os;
520 }
521 
522 template <class _CharT,
523           class _Traits,
524           class _UInt,
525           size_t _Wp,
526           size_t _Np,
527           size_t _Mp,
528           size_t _Rp,
529           _UInt _Ap,
530           size_t _Up,
531           _UInt _Dp,
532           size_t _Sp,
533           _UInt _Bp,
534           size_t _Tp,
535           _UInt _Cp,
536           size_t _Lp,
537           _UInt _Fp>
538 _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
539 operator>>(basic_istream<_CharT, _Traits>& __is,
540            mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, _Bp, _Tp, _Cp, _Lp, _Fp>& __x) {
541   __save_flags<_CharT, _Traits> __lx(__is);
542   typedef basic_istream<_CharT, _Traits> _Istream;
543   __is.flags(_Istream::dec | _Istream::skipws);
544   _UInt __t[_Np];
545   for (size_t __i = 0; __i < _Np; ++__i)
546     __is >> __t[__i];
547   if (!__is.fail()) {
548     for (size_t __i = 0; __i < _Np; ++__i)
549       __x.__x_[__i] = __t[__i];
550     __x.__i_ = 0;
551   }
552   return __is;
553 }
554 
555 typedef mersenne_twister_engine<
556     uint_fast32_t,
557     32,
558     624,
559     397,
560     31,
561     0x9908b0df,
562     11,
563     0xffffffff,
564     7,
565     0x9d2c5680,
566     15,
567     0xefc60000,
568     18,
569     1812433253>
570     mt19937;
571 typedef mersenne_twister_engine<
572     uint_fast64_t,
573     64,
574     312,
575     156,
576     31,
577     0xb5026f5aa96619e9ULL,
578     29,
579     0x5555555555555555ULL,
580     17,
581     0x71d67fffeda60000ULL,
582     37,
583     0xfff7eee000000000ULL,
584     43,
585     6364136223846793005ULL>
586     mt19937_64;
587 
588 _LIBCPP_END_NAMESPACE_STD
589 
590 _LIBCPP_POP_MACROS
591 
592 #endif // _LIBCPP___RANDOM_MERSENNE_TWISTER_ENGINE_H
593