xref: /llvm-project/libcxx/test/std/numerics/rand/rand.eng/rand.eng.lcong/discard.pass.cpp (revision 7fc6a55688c816f5fc1a5481ae7af25be7500356)
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 // void discard(unsigned long long z);
15 
16 #include <random>
17 #include <cassert>
18 
19 #include "test_macros.h"
20 
21 template <class T>
22 void
rand0()23 rand0()
24 {
25     typedef std::linear_congruential_engine<T, 16807, 0, 2147483647> E;
26     E e;
27     e.discard(9999);
28     assert(e() == 1043618065);
29 }
30 
31 template <class T>
32 void
rand()33 rand()
34 {
35     typedef std::linear_congruential_engine<T, 48271, 0, 2147483647> E;
36     E e;
37     e.discard(9999);
38     assert(e() == 399268537);
39 }
40 
41 template <class T>
42 void
other()43 other()
44 {
45     typedef std::linear_congruential_engine<T, 48271, 123465789, 2147483647> E;
46     E e1;
47     E e2;
48     assert(e1 == e2);
49     e1.discard(1);
50     assert(e1 != e2);
51     (void)e2();
52     assert(e1 == e2);
53     e1.discard(3);
54     assert(e1 != e2);
55     (void)e2();
56     (void)e2();
57     (void)e2();
58     assert(e1 == e2);
59 }
60 
main(int,char **)61 int main(int, char**)
62 {
63     rand0<unsigned int>();
64     rand0<unsigned long>();
65     rand0<unsigned long long>();
66 
67     rand<unsigned int>();
68     rand<unsigned long>();
69     rand<unsigned long long>();
70 
71     other<unsigned int>();
72     other<unsigned long>();
73     other<unsigned long long>();
74 
75   return 0;
76 }
77