93 lines · cpp
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-exception6//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 22template <class T, T a, T c, T m>23void24test1()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 33template <class T>34void35test()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 = 042 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 < w48 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 = 054 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 64template <class T>65void test_ext() {66 const T M(static_cast<T>(-1));67 68 // Cases where m is odd and m % a > m / a69 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 77int 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 __int12887#ifndef TEST_HAS_NO_INT12888 test_ext<unsigned long long>();89#endif90 91 return 0;92}93