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 k>
13 // class shuffle_order_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::knuth_b E;
65 
66     E e;
67     assert(e() == 152607844u);
68 }
69 
70 void
test2()71 test2()
72 {
73     typedef rand1<unsigned long long, 0, 0xFFFFFFFFFFFFFFFFull> E0;
74     typedef std::shuffle_order_engine<E0, 101> E;
75     E e;
76     e.discard(400);
77     assert(e() == 501);
78 }
79 
80 void
test3()81 test3()
82 {
83     typedef rand1<unsigned long long, 0, 0xFFFFFFFFFFFFFFFFull> E0;
84     typedef std::shuffle_order_engine<E0, 100> E;
85     E e;
86     e.discard(400);
87     assert(e() == 500);
88 }
89 
main()90 int main()
91 {
92     test1();
93     test2();
94     test3();
95 }
96