brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.6 KiB · 9d60eab Raw
145 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// <random>10 11// template<class Engine, size_t w, class UIntType>12// class independent_bits_engine13 14// result_type operator()();15 16#include <random>17#include <cassert>18 19#include "test_macros.h"20 21template <class UIntType, UIntType Min, UIntType Max>22class rand123{24public:25    // types26    typedef UIntType result_type;27 28private:29    result_type x_;30 31    static_assert(Min < Max, "rand1 invalid parameters");32public:33 34#if TEST_STD_VER < 11 && defined(_LIBCPP_VERSION)35    // Workaround for lack of constexpr in C++0336    static const result_type _Min = Min;37    static const result_type _Max = Max;38#endif39 40    static TEST_CONSTEXPR result_type min() {return Min;}41    static TEST_CONSTEXPR result_type max() {return Max;}42 43    explicit rand1(result_type sd = Min) : x_(sd)44    {45        if (x_ > Max)46            x_ = Max;47    }48 49    result_type operator()()50    {51        result_type r = x_;52        if (x_ < Max)53            ++x_;54        else55            x_ = Min;56        return r;57    }58};59 60void61test1()62{63   typedef std::independent_bits_engine<rand1<unsigned, 0, 10>, 16, unsigned> E;64 65    E e;66    assert(e() == 6958);67}68 69void70test2()71{72    typedef std::independent_bits_engine<rand1<unsigned, 0, 100>, 16, unsigned> E;73 74    E e;75    assert(e() == 66);76}77 78void79test3()80{81    typedef std::independent_bits_engine<rand1<unsigned, 0, 0xFFFFFFFF>, 32, unsigned> E;82 83    E e(5);84    assert(e() == 5);85}86 87void88test4()89{90    typedef std::independent_bits_engine<rand1<unsigned, 0, 0xFFFFFFFF>, 7, unsigned> E;91 92    E e(129);93    assert(e() == 1);94}95 96void97test5()98{99    typedef std::independent_bits_engine<rand1<unsigned, 2, 3>, 1, unsigned> E;100 101    E e(6);102    assert(e() == 1);103}104 105void106test6()107{108    typedef std::independent_bits_engine<rand1<unsigned, 2, 3>, 11, unsigned> E;109 110    E e(6);111    assert(e() == 1365);112}113 114void115test7()116{117    typedef std::independent_bits_engine<rand1<unsigned, 2, 3>, 32, unsigned> E;118 119    E e(6);120    assert(e() == 2863311530u);121}122 123void124test8()125{126    typedef std::independent_bits_engine<std::mt19937, 64, unsigned long long> E;127 128    E e(6);129    assert(e() == 16470362623952407241ull);130}131 132int main(int, char**)133{134    test1();135    test2();136    test3();137    test4();138    test5();139    test6();140    test7();141    test8();142 143  return 0;144}145