1eb1c5037SNikolas Klauser //===----------------------------------------------------------------------===// 2eb1c5037SNikolas Klauser // 3eb1c5037SNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4eb1c5037SNikolas Klauser // See https://llvm.org/LICENSE.txt for license information. 5eb1c5037SNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6eb1c5037SNikolas Klauser // 7eb1c5037SNikolas Klauser //===----------------------------------------------------------------------===// 8eb1c5037SNikolas Klauser // 9eb1c5037SNikolas Klauser // UNSUPPORTED: c++03 10eb1c5037SNikolas Klauser 11eb1c5037SNikolas Klauser // <random> 12eb1c5037SNikolas Klauser 13eb1c5037SNikolas Klauser // template<class _IntType = int> 14eb1c5037SNikolas Klauser // class uniform_int_distribution 15eb1c5037SNikolas Klauser 16eb1c5037SNikolas Klauser // template<class _URNG> result_type operator()(_URNG& g); 17eb1c5037SNikolas Klauser 1824e1736dSMark de Wever 19eb1c5037SNikolas Klauser #include <cassert> 20*0a4aa8a1SNikolas Klauser #include <cstdint> 2124e1736dSMark de Wever #include <limits> 22*0a4aa8a1SNikolas Klauser #include <random> 23eb1c5037SNikolas Klauser 24eb1c5037SNikolas Klauser #include "test_macros.h" 25eb1c5037SNikolas Klauser main(int,char **)26eb1c5037SNikolas Klauserint main(int, char**) { 27eb1c5037SNikolas Klauser 28eb1c5037SNikolas Klauser #ifndef TEST_HAS_NO_INT128 29eb1c5037SNikolas Klauser 30eb1c5037SNikolas Klauser // Test that values outside of the 64-bit range can be produced. 31eb1c5037SNikolas Klauser { 32eb1c5037SNikolas Klauser std::minstd_rand0 e; 33eb1c5037SNikolas Klauser std::uniform_int_distribution<__int128_t> d; 34eb1c5037SNikolas Klauser assert(d.min() == 0 && d.max() == std::numeric_limits<__int128_t>::max()); 35eb1c5037SNikolas Klauser bool all_in_64bit_range = true; 36eb1c5037SNikolas Klauser for (int i = 0; i < 100; ++i) { 37eb1c5037SNikolas Klauser __int128_t n = d(e); 38eb1c5037SNikolas Klauser all_in_64bit_range = all_in_64bit_range && (n <= UINT64_MAX); 39eb1c5037SNikolas Klauser } 40eb1c5037SNikolas Klauser assert(!all_in_64bit_range); 41eb1c5037SNikolas Klauser } 42eb1c5037SNikolas Klauser 43eb1c5037SNikolas Klauser // Same test as above with min/max set and outside the 64-bit range. 44eb1c5037SNikolas Klauser { 45eb1c5037SNikolas Klauser __int128_t a = ((__int128_t)INT64_MIN) * 10; 46eb1c5037SNikolas Klauser __int128_t b = ((__int128_t)INT64_MAX) * 10; 47eb1c5037SNikolas Klauser std::minstd_rand0 e; 48eb1c5037SNikolas Klauser std::uniform_int_distribution<__int128_t> d(a, b); 49eb1c5037SNikolas Klauser assert(d.min() == a && d.max() == b); 50eb1c5037SNikolas Klauser bool all_in_64bit_range = true; 51eb1c5037SNikolas Klauser for (int i = 0; i < 100; ++i) { 52eb1c5037SNikolas Klauser __int128_t n = d(e); 53eb1c5037SNikolas Klauser assert(a <= n && n <= b); 54eb1c5037SNikolas Klauser all_in_64bit_range = all_in_64bit_range && (INT64_MIN <= n) && (n <= (INT64_MAX)); 55eb1c5037SNikolas Klauser } 56eb1c5037SNikolas Klauser assert(!all_in_64bit_range); 57eb1c5037SNikolas Klauser } 58eb1c5037SNikolas Klauser 59eb1c5037SNikolas Klauser // Same test as above with __uint128_t. 60eb1c5037SNikolas Klauser { 61eb1c5037SNikolas Klauser __uint128_t a = UINT64_MAX / 3; 62eb1c5037SNikolas Klauser __uint128_t b = ((__uint128_t)UINT64_MAX) * 10; 63eb1c5037SNikolas Klauser std::minstd_rand0 e; 64eb1c5037SNikolas Klauser std::uniform_int_distribution<__uint128_t> d(a, b); 65eb1c5037SNikolas Klauser assert(d.min() == a && d.max() == b); 66eb1c5037SNikolas Klauser bool all_in_64bit_range = true; 67eb1c5037SNikolas Klauser for (int i = 0; i < 100; ++i) { 68eb1c5037SNikolas Klauser __uint128_t n = d(e); 69eb1c5037SNikolas Klauser assert(a <= n && n <= b); 70eb1c5037SNikolas Klauser all_in_64bit_range = all_in_64bit_range && (n <= (UINT64_MAX)); 71eb1c5037SNikolas Klauser } 72eb1c5037SNikolas Klauser assert(!all_in_64bit_range); 73eb1c5037SNikolas Klauser } 74eb1c5037SNikolas Klauser 75eb1c5037SNikolas Klauser // Regression test for PR#51520: 76eb1c5037SNikolas Klauser { 77eb1c5037SNikolas Klauser std::minstd_rand0 e; 78eb1c5037SNikolas Klauser std::uniform_int_distribution<__int128_t> d(INT64_MIN, INT64_MAX); 79eb1c5037SNikolas Klauser assert(d.min() == INT64_MIN && d.max() == INT64_MAX); 80eb1c5037SNikolas Klauser for (int i = 0; i < 100; ++i) { 81eb1c5037SNikolas Klauser __int128_t n = d(e); 82eb1c5037SNikolas Klauser assert((INT64_MIN <= n) && (n <= INT64_MAX)); 83eb1c5037SNikolas Klauser } 84eb1c5037SNikolas Klauser } 85eb1c5037SNikolas Klauser 86eb1c5037SNikolas Klauser #endif // TEST_HAS_NO_INT128 87eb1c5037SNikolas Klauser 88eb1c5037SNikolas Klauser return 0; 89eb1c5037SNikolas Klauser } 90