• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===----------------------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 // <random>
11 
12 // template<class Engine, size_t w, class UIntType>
13 // class independent_bits_engine
14 
15 // result_type operator()();
16 
17 #include <random>
18 #include <cassert>
19 
20 #include "test_macros.h"
21 
22 template <class UIntType, UIntType Min, UIntType Max>
23 class rand1
24 {
25 public:
26     // types
27     typedef UIntType result_type;
28 
29 private:
30     result_type x_;
31 
32     static_assert(Min < Max, "rand1 invalid parameters");
33 public:
34 
35 #if TEST_STD_VER < 11 && defined(_LIBCPP_VERSION)
36     // Workaround for lack of constexpr in C++03
37     static const result_type _Min = Min;
38     static const result_type _Max = Max;
39 #endif
40 
min()41     static TEST_CONSTEXPR result_type min() {return Min;}
max()42     static TEST_CONSTEXPR result_type max() {return Max;}
43 
rand1(result_type sd=Min)44     explicit rand1(result_type sd = Min) : x_(sd)
45     {
46         if (x_ > Max)
47             x_ = Max;
48     }
49 
operator ()()50     result_type operator()()
51     {
52         result_type r = x_;
53         if (x_ < Max)
54             ++x_;
55         else
56             x_ = Min;
57         return r;
58     }
59 };
60 
61 void
test1()62 test1()
63 {
64    typedef std::independent_bits_engine<rand1<unsigned, 0, 10>, 16, unsigned> E;
65 
66     E e;
67     assert(e() == 6958);
68 }
69 
70 void
test2()71 test2()
72 {
73     typedef std::independent_bits_engine<rand1<unsigned, 0, 100>, 16, unsigned> E;
74 
75     E e;
76     assert(e() == 66);
77 }
78 
79 void
test3()80 test3()
81 {
82     typedef std::independent_bits_engine<rand1<unsigned, 0, 0xFFFFFFFF>, 32, unsigned> E;
83 
84     E e(5);
85     assert(e() == 5);
86 }
87 
88 void
test4()89 test4()
90 {
91     typedef std::independent_bits_engine<rand1<unsigned, 0, 0xFFFFFFFF>, 7, unsigned> E;
92 
93     E e(129);
94     assert(e() == 1);
95 }
96 
97 void
test5()98 test5()
99 {
100     typedef std::independent_bits_engine<rand1<unsigned, 2, 3>, 1, unsigned> E;
101 
102     E e(6);
103     assert(e() == 1);
104 }
105 
106 void
test6()107 test6()
108 {
109     typedef std::independent_bits_engine<rand1<unsigned, 2, 3>, 11, unsigned> E;
110 
111     E e(6);
112     assert(e() == 1365);
113 }
114 
115 void
test7()116 test7()
117 {
118     typedef std::independent_bits_engine<rand1<unsigned, 2, 3>, 32, unsigned> E;
119 
120     E e(6);
121     assert(e() == 2863311530u);
122 }
123 
124 void
test8()125 test8()
126 {
127     typedef std::independent_bits_engine<std::mt19937, 64, unsigned long long> E;
128 
129     E e(6);
130     assert(e() == 16470362623952407241ull);
131 }
132 
main()133 int main()
134 {
135     test1();
136     test2();
137     test3();
138     test4();
139     test5();
140     test6();
141     test7();
142     test8();
143 }
144