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