1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===//
2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
3f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant//                     The LLVM Compiler Infrastructure
4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details.
7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===//
9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
10bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// <random>
11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
12bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template<class Engine, size_t k>
13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// class shuffle_order_engine
14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// {
15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// public:
16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//     // types
17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//     typedef typename Engine::result_type result_type;
18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <random>
20bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <type_traits>
21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
22a7b77ebd18eea99dc19123e7345e91893c887940Eric Fiselier#include "test_macros.h"
23a7b77ebd18eea99dc19123e7345e91893c887940Eric Fiselier
24bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class UIntType, UIntType Min, UIntType Max>
25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantclass rand1
26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    // types
29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef UIntType result_type;
30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprivate:
32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    result_type x_;
33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static_assert(Min < Max, "rand1 invalid parameters");
35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
37a7b77ebd18eea99dc19123e7345e91893c887940Eric Fiselier#if TEST_STD_VER < 11 && defined(_LIBCPP_VERSION)
388efd3dac5deb4581795bcded571a52b93a239613Howard Hinnant    // Workaround for lack of constexpr in C++03
39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const result_type _Min = Min;
40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const result_type _Max = Max;
418efd3dac5deb4581795bcded571a52b93a239613Howard Hinnant#endif
42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
43a7b77ebd18eea99dc19123e7345e91893c887940Eric Fiselier    static TEST_CONSTEXPR  result_type min() {return Min;}
44a7b77ebd18eea99dc19123e7345e91893c887940Eric Fiselier    static TEST_CONSTEXPR  result_type max() {return Max;}
45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit rand1(result_type sd = Min) : x_(sd)
47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (x_ < Min)
49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            x_ = Min;
50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (x_ > Max)
51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            x_ = Max;
52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    result_type operator()()
55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        result_type r = x_;
57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (x_ < Max)
58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++x_;
59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else
60bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            x_ = Min;
61bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return r;
62bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
63bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
64bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
65bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
66bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttest1()
67bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
68bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static_assert((std::is_same<
69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::shuffle_order_engine<rand1<unsigned long, 0, 10>, 16>::result_type,
70bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        unsigned long>::value), "");
71bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
72bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
73bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
74bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttest2()
75bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
76bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static_assert((std::is_same<
77bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::shuffle_order_engine<rand1<unsigned long long, 0, 10>, 16>::result_type,
78bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        unsigned long long>::value), "");
79bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint main()
82bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test1();
84bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test2();
85bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
86