xref: /llvm-project/libcxx/test/std/numerics/rand/rand.dist/rand.dist.uni/rand.dist.uni.int/int128.pass.cpp (revision 0a4aa8a122aa097499c498b639a75b5e9a73e9f0)
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 Klauser int 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