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 // public:
16 // // types
17 // typedef typename Engine::result_type result_type;
18
19 #include <random>
20 #include <type_traits>
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 #ifdef _LIBCPP_HAS_NO_CONSTEXPR
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 _LIBCPP_CONSTEXPR result_type min() {return Min;}
max()42 static _LIBCPP_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_ < Min)
47 x_ = Min;
48 if (x_ > Max)
49 x_ = Max;
50 }
51
operator ()()52 result_type operator()()
53 {
54 result_type r = x_;
55 if (x_ < Max)
56 ++x_;
57 else
58 x_ = Min;
59 return r;
60 }
61 };
62
63 void
test1()64 test1()
65 {
66 static_assert((std::is_same<
67 std::shuffle_order_engine<rand1<unsigned long, 0, 10>, 16>::result_type,
68 unsigned long>::value), "");
69 }
70
71 void
test2()72 test2()
73 {
74 static_assert((std::is_same<
75 std::shuffle_order_engine<rand1<unsigned long long, 0, 10>, 16>::result_type,
76 unsigned long long>::value), "");
77 }
78
main()79 int main()
80 {
81 test1();
82 test2();
83 }
84