brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.2 KiB · ad473bd Raw
98 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(const 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> E;27    E e1;28    E e2 = e1;29    assert(e1 == e2);30    (void)e1();31    (void)e2();32    assert(e1 == e2);33}34 35template <class T>36void37test()38{39  const int W = sizeof(T) * CHAR_BIT;40  const T M(static_cast<T>(-1));41  const T A(static_cast<T>((static_cast<T>(1) << (W / 2)) - 1));42 43  // Cases where m = 044  test1<T, 0, 0, 0>();45  test1<T, A, 0, 0>();46  test1<T, 0, 1, 0>();47  test1<T, A, 1, 0>();48 49  // Cases where m = 2^n for n < w50  test1<T, 0, 0, 256>();51  test1<T, 5, 0, 256>();52  test1<T, 0, 1, 256>();53  test1<T, 5, 1, 256>();54 55  // Cases where m is odd and a = 056  test1<T, 0, 0, M>();57  test1<T, 0, M - 2, M>();58  test1<T, 0, M - 1, M>();59 60  // Cases where m is odd and m % a <= m / a (Schrage)61  test1<T, A, 0, M>();62  test1<T, A, M - 2, M>();63  test1<T, A, M - 1, M>();64}65 66template <class T>67void test_ext() {68  const T M(static_cast<T>(-1));69 70  // Cases where m is odd and m % a > m / a71  test1<T, M - 2, 0, M>();72  test1<T, M - 2, M - 2, M>();73  test1<T, M - 2, M - 1, M>();74  test1<T, M - 1, 0, M>();75  test1<T, M - 1, M - 2, M>();76  test1<T, M - 1, M - 1, M>();77}78 79int main(int, char**)80{81    test<unsigned short>();82    test_ext<unsigned short>();83    test<unsigned int>();84    test_ext<unsigned int>();85    test<unsigned long>();86    // This isn't implemented on platforms without __int12887#ifndef TEST_HAS_NO_INT12888    test_ext<unsigned long>();89#endif90    test<unsigned long long>();91    // This isn't implemented on platforms without __int12892#ifndef TEST_HAS_NO_INT12893    test_ext<unsigned long long>();94#endif95 96    return 0;97}98