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// public:
16//     // types
17//     typedef UIntType result_type;
18
19#include <random>
20#include <type_traits>
21
22template <class UIntType, UIntType Min, UIntType Max>
23class rand1
24{
25public:
26    // types
27    typedef UIntType result_type;
28
29private:
30    result_type x_;
31
32    static_assert(Min < Max, "rand1 invalid parameters");
33public:
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
41    static _LIBCPP_CONSTEXPR result_type min() {return Min;}
42    static _LIBCPP_CONSTEXPR result_type max() {return Max;}
43
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
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
63void
64test1()
65{
66    static_assert((std::is_same<
67        std::independent_bits_engine<rand1<unsigned long, 0, 10>, 16, unsigned>::result_type,
68        unsigned>::value), "");
69}
70
71void
72test2()
73{
74    static_assert((std::is_same<
75        std::independent_bits_engine<rand1<unsigned long, 0, 10>, 16, unsigned long long>::result_type,
76        unsigned long long>::value), "");
77}
78
79int main()
80{
81    test1();
82    test2();
83}
84