xref: /llvm-project/libcxx/test/std/numerics/rand/rand.eng/rand.eng.mers/values.pass.cpp (revision 2df59c50688c122bbcae7467d3eaf862c3ea3088)
15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
85a83710eSEric Fiselier 
95a83710eSEric Fiselier // <random>
105a83710eSEric Fiselier 
115a83710eSEric Fiselier // template <class UIntType, size_t w, size_t n, size_t m, size_t r,
125a83710eSEric Fiselier //           UIntType a, size_t u, UIntType d, size_t s,
135a83710eSEric Fiselier //           UIntType b, size_t t, UIntType c, size_t l, UIntType f>
145a83710eSEric Fiselier // class mersenne_twister_engine
155a83710eSEric Fiselier // {
165a83710eSEric Fiselier // public:
175a83710eSEric Fiselier //     // types
185a83710eSEric Fiselier //     typedef UIntType result_type;
195a83710eSEric Fiselier //
205a83710eSEric Fiselier //     // engine characteristics
215a83710eSEric Fiselier //     static constexpr size_t word_size = w;
225a83710eSEric Fiselier //     static constexpr size_t state_size = n;
235a83710eSEric Fiselier //     static constexpr size_t shift_size = m;
245a83710eSEric Fiselier //     static constexpr size_t mask_bits = r;
255a83710eSEric Fiselier //     static constexpr result_type xor_mask = a;
265a83710eSEric Fiselier //     static constexpr size_t tempering_u = u;
275a83710eSEric Fiselier //     static constexpr result_type tempering_d = d;
285a83710eSEric Fiselier //     static constexpr size_t tempering_s = s;
295a83710eSEric Fiselier //     static constexpr result_type tempering_b = b;
305a83710eSEric Fiselier //     static constexpr size_t tempering_t = t;
315a83710eSEric Fiselier //     static constexpr result_type tempering_c = c;
325a83710eSEric Fiselier //     static constexpr size_t tempering_l = l;
335a83710eSEric Fiselier //     static constexpr result_type initialization_multiplier = f;
345a83710eSEric Fiselier //     static constexpr result_type min () { return 0; }
355a83710eSEric Fiselier //     static constexpr result_type max() { return 2^w - 1; }
365a83710eSEric Fiselier //     static constexpr result_type default_seed = 5489u;
375a83710eSEric Fiselier 
385a83710eSEric Fiselier #include <random>
395a83710eSEric Fiselier #include <type_traits>
405a83710eSEric Fiselier #include <cassert>
415a83710eSEric Fiselier 
4269154d6eSEric Fiselier #include "test_macros.h"
4369154d6eSEric Fiselier 
44aae63566SStephan T. Lavavej template <class T>
where(const T &)45aae63566SStephan T. Lavavej void where(const T &) {}
465a83710eSEric Fiselier 
475a83710eSEric Fiselier void
test1()485a83710eSEric Fiselier test1()
495a83710eSEric Fiselier {
505a83710eSEric Fiselier     typedef std::mt19937 E;
515a83710eSEric Fiselier     static_assert((E::word_size == 32), "");
525a83710eSEric Fiselier     static_assert((E::state_size == 624), "");
535a83710eSEric Fiselier     static_assert((E::shift_size == 397), "");
545a83710eSEric Fiselier     static_assert((E::mask_bits == 31), "");
555a83710eSEric Fiselier     static_assert((E::xor_mask == 0x9908b0df), "");
565a83710eSEric Fiselier     static_assert((E::tempering_u == 11), "");
575a83710eSEric Fiselier     static_assert((E::tempering_d == 0xffffffff), "");
585a83710eSEric Fiselier     static_assert((E::tempering_s == 7), "");
595a83710eSEric Fiselier     static_assert((E::tempering_b == 0x9d2c5680), "");
605a83710eSEric Fiselier     static_assert((E::tempering_t == 15), "");
615a83710eSEric Fiselier     static_assert((E::tempering_c == 0xefc60000), "");
625a83710eSEric Fiselier     static_assert((E::tempering_l == 18), "");
635a83710eSEric Fiselier     static_assert((E::initialization_multiplier == 1812433253), "");
64ae3c4eecSStephan T. Lavavej #if TEST_STD_VER >= 11
65ae3c4eecSStephan T. Lavavej     static_assert((E::min() == 0), "");
66ae3c4eecSStephan T. Lavavej     static_assert((E::max() == 0xFFFFFFFF), "");
67ae3c4eecSStephan T. Lavavej #else
68ae3c4eecSStephan T. Lavavej     assert((E::min() == 0));
69ae3c4eecSStephan T. Lavavej     assert((E::max() == 0xFFFFFFFF));
70ae3c4eecSStephan T. Lavavej #endif
715a83710eSEric Fiselier     static_assert((E::default_seed == 5489u), "");
725a83710eSEric Fiselier     where(E::word_size);
735a83710eSEric Fiselier     where(E::state_size);
745a83710eSEric Fiselier     where(E::shift_size);
755a83710eSEric Fiselier     where(E::mask_bits);
765a83710eSEric Fiselier     where(E::xor_mask);
775a83710eSEric Fiselier     where(E::tempering_u);
785a83710eSEric Fiselier     where(E::tempering_d);
795a83710eSEric Fiselier     where(E::tempering_s);
805a83710eSEric Fiselier     where(E::tempering_b);
815a83710eSEric Fiselier     where(E::tempering_t);
825a83710eSEric Fiselier     where(E::tempering_c);
835a83710eSEric Fiselier     where(E::tempering_l);
845a83710eSEric Fiselier     where(E::initialization_multiplier);
855a83710eSEric Fiselier     where(E::default_seed);
865a83710eSEric Fiselier }
875a83710eSEric Fiselier 
885a83710eSEric Fiselier void
test2()895a83710eSEric Fiselier test2()
905a83710eSEric Fiselier {
915a83710eSEric Fiselier     typedef std::mt19937_64 E;
925a83710eSEric Fiselier     static_assert((E::word_size == 64), "");
935a83710eSEric Fiselier     static_assert((E::state_size == 312), "");
945a83710eSEric Fiselier     static_assert((E::shift_size == 156), "");
955a83710eSEric Fiselier     static_assert((E::mask_bits == 31), "");
965a83710eSEric Fiselier     static_assert((E::xor_mask == 0xb5026f5aa96619e9ull), "");
975a83710eSEric Fiselier     static_assert((E::tempering_u == 29), "");
985a83710eSEric Fiselier     static_assert((E::tempering_d == 0x5555555555555555ull), "");
995a83710eSEric Fiselier     static_assert((E::tempering_s == 17), "");
1005a83710eSEric Fiselier     static_assert((E::tempering_b == 0x71d67fffeda60000ull), "");
1015a83710eSEric Fiselier     static_assert((E::tempering_t == 37), "");
1025a83710eSEric Fiselier     static_assert((E::tempering_c == 0xfff7eee000000000ull), "");
1035a83710eSEric Fiselier     static_assert((E::tempering_l == 43), "");
1045a83710eSEric Fiselier     static_assert((E::initialization_multiplier == 6364136223846793005ull), "");
105ae3c4eecSStephan T. Lavavej #if TEST_STD_VER >= 11
106ae3c4eecSStephan T. Lavavej     static_assert((E::min() == 0), "");
107ae3c4eecSStephan T. Lavavej     static_assert((E::max() == 0xFFFFFFFFFFFFFFFFull), "");
108ae3c4eecSStephan T. Lavavej #else
109ae3c4eecSStephan T. Lavavej     assert((E::min() == 0));
110ae3c4eecSStephan T. Lavavej     assert((E::max() == 0xFFFFFFFFFFFFFFFFull));
111ae3c4eecSStephan T. Lavavej #endif
1125a83710eSEric Fiselier     static_assert((E::default_seed == 5489u), "");
1135a83710eSEric Fiselier     where(E::word_size);
1145a83710eSEric Fiselier     where(E::state_size);
1155a83710eSEric Fiselier     where(E::shift_size);
1165a83710eSEric Fiselier     where(E::mask_bits);
1175a83710eSEric Fiselier     where(E::xor_mask);
1185a83710eSEric Fiselier     where(E::tempering_u);
1195a83710eSEric Fiselier     where(E::tempering_d);
1205a83710eSEric Fiselier     where(E::tempering_s);
1215a83710eSEric Fiselier     where(E::tempering_b);
1225a83710eSEric Fiselier     where(E::tempering_t);
1235a83710eSEric Fiselier     where(E::tempering_c);
1245a83710eSEric Fiselier     where(E::tempering_l);
1255a83710eSEric Fiselier     where(E::initialization_multiplier);
1265a83710eSEric Fiselier     where(E::default_seed);
1275a83710eSEric Fiselier }
1285a83710eSEric Fiselier 
main(int,char **)129*2df59c50SJF Bastien int main(int, char**)
1305a83710eSEric Fiselier {
1315a83710eSEric Fiselier     test1();
1325a83710eSEric Fiselier     test2();
133*2df59c50SJF Bastien 
134*2df59c50SJF Bastien   return 0;
1355a83710eSEric Fiselier }
136