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