diff options
Diffstat (limited to 'libcxx/test/std/numerics/rand/rand.adapt/rand.adapt.shuf/eval.pass.cpp')
-rw-r--r-- | libcxx/test/std/numerics/rand/rand.adapt/rand.adapt.shuf/eval.pass.cpp | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/libcxx/test/std/numerics/rand/rand.adapt/rand.adapt.shuf/eval.pass.cpp b/libcxx/test/std/numerics/rand/rand.adapt/rand.adapt.shuf/eval.pass.cpp new file mode 100644 index 00000000000..c218c17dde6 --- /dev/null +++ b/libcxx/test/std/numerics/rand/rand.adapt/rand.adapt.shuf/eval.pass.cpp @@ -0,0 +1,93 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <random> + +// template<class Engine, size_t k> +// class shuffle_order_engine + +// result_type operator()(); + +#include <random> +#include <cassert> + +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: + +#ifdef _LIBCPP_HAS_NO_CONSTEXPR + // Workaround for lack of constexpr in C++03 + static const result_type _Min = Min; + static const result_type _Max = Max; +#endif + + static _LIBCPP_CONSTEXPR result_type min() {return Min;} + static _LIBCPP_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::knuth_b E; + + E e; + assert(e() == 152607844u); +} + +void +test2() +{ + typedef rand1<unsigned long long, 0, 0xFFFFFFFFFFFFFFFFull> E0; + typedef std::shuffle_order_engine<E0, 101> E; + E e; + e.discard(400); + assert(e() == 501); +} + +void +test3() +{ + typedef rand1<unsigned long long, 0, 0xFFFFFFFFFFFFFFFFull> E0; + typedef std::shuffle_order_engine<E0, 100> E; + E e; + e.discard(400); + assert(e() == 500); +} + +int main() +{ + test1(); + test2(); + test3(); +} |