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 // <random> 10 11 // template <class UIntType, UIntType a, UIntType c, UIntType m> 12 // class linear_congruential_engine; 13 14 // linear_congruential_engine(); 15 16 #include <random> 17 #include <cassert> 18 #include <climits> 19 20 #include "test_macros.h" 21 22 template <class T, T a, T c, T m> 23 void 24 test1() 25 { 26 typedef std::linear_congruential_engine<T, a, c, m> LCE; 27 LCE e1; 28 LCE e2; 29 e2.seed(); 30 assert(e1 == e2); 31 } 32 33 template <class T> 34 void 35 test() 36 { 37 const int W = sizeof(T) * CHAR_BIT; 38 const T M(static_cast<T>(-1)); 39 const T A(static_cast<T>((static_cast<T>(1) << (W / 2)) - 1)); 40 41 // Cases where m = 0 42 test1<T, 0, 0, 0>(); 43 test1<T, A, 0, 0>(); 44 test1<T, 0, 1, 0>(); 45 test1<T, A, 1, 0>(); 46 47 // Cases where m = 2^n for n < w 48 test1<T, 0, 0, 256>(); 49 test1<T, 5, 0, 256>(); 50 test1<T, 0, 1, 256>(); 51 test1<T, 5, 1, 256>(); 52 53 // Cases where m is odd and a = 0 54 test1<T, 0, 0, M>(); 55 test1<T, 0, M - 2, M>(); 56 test1<T, 0, M - 1, M>(); 57 58 // Cases where m is odd and m % a <= m / a (Schrage) 59 test1<T, A, 0, M>(); 60 test1<T, A, M - 2, M>(); 61 test1<T, A, M - 1, M>(); 62 } 63 64 template <class T> 65 void test_ext() { 66 const T M(static_cast<T>(-1)); 67 68 // Cases where m is odd and m % a > m / a 69 test1<T, M - 2, 0, M>(); 70 test1<T, M - 2, M - 2, M>(); 71 test1<T, M - 2, M - 1, M>(); 72 test1<T, M - 1, 0, M>(); 73 test1<T, M - 1, M - 2, M>(); 74 test1<T, M - 1, M - 1, M>(); 75 } 76 77 int main(int, char**) 78 { 79 test<unsigned short>(); 80 test_ext<unsigned short>(); 81 test<unsigned int>(); 82 test_ext<unsigned int>(); 83 test<unsigned long>(); 84 test_ext<unsigned long>(); 85 test<unsigned long long>(); 86 // This isn't implemented on platforms without __int128 87 #ifndef TEST_HAS_NO_INT128 88 test_ext<unsigned long long>(); 89 #endif 90 91 return 0; 92 } 93