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#include "test_macros.h" 23 24template <class UIntType, UIntType Min, UIntType Max> 25class rand1 26{ 27public: 28 // types 29 typedef UIntType result_type; 30 31private: 32 result_type x_; 33 34 static_assert(Min < Max, "rand1 invalid parameters"); 35public: 36 37#if TEST_STD_VER < 11 && defined(_LIBCPP_VERSION) 38 // Workaround for lack of constexpr in C++03 39 static const result_type _Min = Min; 40 static const result_type _Max = Max; 41#endif 42 43 static TEST_CONSTEXPR result_type min() {return Min;} 44 static TEST_CONSTEXPR result_type max() {return Max;} 45 46 explicit rand1(result_type sd = Min) : x_(sd) 47 { 48 if (x_ < Min) 49 x_ = Min; 50 if (x_ > Max) 51 x_ = Max; 52 } 53 54 result_type operator()() 55 { 56 result_type r = x_; 57 if (x_ < Max) 58 ++x_; 59 else 60 x_ = Min; 61 return r; 62 } 63}; 64 65void 66test1() 67{ 68 static_assert((std::is_same< 69 std::shuffle_order_engine<rand1<unsigned long, 0, 10>, 16>::result_type, 70 unsigned long>::value), ""); 71} 72 73void 74test2() 75{ 76 static_assert((std::is_same< 77 std::shuffle_order_engine<rand1<unsigned long long, 0, 10>, 16>::result_type, 78 unsigned long long>::value), ""); 79} 80 81int main() 82{ 83 test1(); 84 test2(); 85} 86