1b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner//===----------------------------------------------------------------------===// 2b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner// 3b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner// The LLVM Compiler Infrastructure 4b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner// 5b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner// This file is dual licensed under the MIT and the University of Illinois Open 6b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner// Source Licenses. See LICENSE.TXT for details. 7b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner// 8b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner//===----------------------------------------------------------------------===// 9b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner 10b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner// <random> 11b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner 12b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner// template <class UIntType, UIntType a, UIntType c, UIntType m> 13b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner// class linear_congruential_engine 14b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner// { 15b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner// public: 16b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner// engine characteristics 17b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner// static constexpr result_type multiplier = a; 18b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner// static constexpr result_type increment = c; 19b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner// static constexpr result_type modulus = m; 20b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner// static constexpr result_type min() { return c == 0u ? 1u: 0u;} 21b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner// static constexpr result_type max() { return m - 1u;} 22b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner// static constexpr result_type default_seed = 1u; 23b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner 24b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner#include <random> 25b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner#include <type_traits> 26b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner#include <cassert> 27b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner 28b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnertemplate <class _Tp> 29b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnervoid where(const _Tp &) {} 30b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner 31b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnertemplate <class T, T a, T c, T m> 32b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnervoid 33b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnertest1() 34b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner{ 35b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner typedef std::linear_congruential_engine<T, a, c, m> LCE; 36b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner typedef typename LCE::result_type result_type; 37b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner static_assert((LCE::multiplier == a), ""); 38b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner static_assert((LCE::increment == c), ""); 39b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner static_assert((LCE::modulus == m), ""); 40b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner /*static_*/assert((LCE::min() == (c == 0u ? 1u: 0u))/*, ""*/); 41b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner /*static_*/assert((LCE::max() == result_type(m - 1u))/*, ""*/); 42b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner static_assert((LCE::default_seed == 1), ""); 43b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner where(LCE::multiplier); 44b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner where(LCE::increment); 45b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner where(LCE::modulus); 46b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner where(LCE::default_seed); 47b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner} 48b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner 49b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnertemplate <class T> 50b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnervoid 51b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnertest() 52b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner{ 53b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner test1<T, 0, 0, 0>(); 54b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner test1<T, 0, 1, 2>(); 55b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner test1<T, 1, 1, 2>(); 56b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner const T M(~0); 57b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner test1<T, 0, 0, M>(); 58b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner test1<T, 0, M-2, M>(); 59b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner test1<T, 0, M-1, M>(); 60b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner test1<T, M-2, 0, M>(); 61b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner test1<T, M-2, M-2, M>(); 62b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner test1<T, M-2, M-1, M>(); 63b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner test1<T, M-1, 0, M>(); 64b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner test1<T, M-1, M-2, M>(); 65b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner test1<T, M-1, M-1, M>(); 66b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner} 67b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner 68b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerint main() 69b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner{ 70b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner test<unsigned short>(); 71b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner test<unsigned int>(); 72b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner test<unsigned long>(); 73b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner test<unsigned long long>(); 74b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner} 75