xref: /llvm-project/libcxx/test/std/numerics/rand/rand.adapt/rand.adapt.shuf/eval.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 Engine, size_t k>
125a83710eSEric Fiselier // class shuffle_order_engine
135a83710eSEric Fiselier 
145a83710eSEric Fiselier // result_type operator()();
155a83710eSEric Fiselier 
165a83710eSEric Fiselier #include <random>
175a83710eSEric Fiselier #include <cassert>
185a83710eSEric Fiselier 
196b425407SEric Fiselier #include "test_macros.h"
206b425407SEric Fiselier 
215a83710eSEric Fiselier template <class UIntType, UIntType Min, UIntType Max>
225a83710eSEric Fiselier class rand1
235a83710eSEric Fiselier {
245a83710eSEric Fiselier public:
255a83710eSEric Fiselier     // types
265a83710eSEric Fiselier     typedef UIntType result_type;
275a83710eSEric Fiselier 
285a83710eSEric Fiselier private:
295a83710eSEric Fiselier     result_type x_;
305a83710eSEric Fiselier 
315a83710eSEric Fiselier     static_assert(Min < Max, "rand1 invalid parameters");
325a83710eSEric Fiselier public:
335a83710eSEric Fiselier 
346b425407SEric Fiselier #if TEST_STD_VER < 11 && defined(_LIBCPP_VERSION)
355a83710eSEric Fiselier     // Workaround for lack of constexpr in C++03
365a83710eSEric Fiselier     static const result_type _Min = Min;
375a83710eSEric Fiselier     static const result_type _Max = Max;
385a83710eSEric Fiselier #endif
395a83710eSEric Fiselier 
min()406b425407SEric Fiselier     static TEST_CONSTEXPR result_type min() {return Min;}
max()416b425407SEric Fiselier     static TEST_CONSTEXPR result_type max() {return Max;}
425a83710eSEric Fiselier 
rand1(result_type sd=Min)435a83710eSEric Fiselier     explicit rand1(result_type sd = Min) : x_(sd)
445a83710eSEric Fiselier     {
455a83710eSEric Fiselier         if (x_ > Max)
465a83710eSEric Fiselier             x_ = Max;
475a83710eSEric Fiselier     }
485a83710eSEric Fiselier 
operator ()()495a83710eSEric Fiselier     result_type operator()()
505a83710eSEric Fiselier     {
515a83710eSEric Fiselier         result_type r = x_;
525a83710eSEric Fiselier         if (x_ < Max)
535a83710eSEric Fiselier             ++x_;
545a83710eSEric Fiselier         else
555a83710eSEric Fiselier             x_ = Min;
565a83710eSEric Fiselier         return r;
575a83710eSEric Fiselier     }
585a83710eSEric Fiselier };
595a83710eSEric Fiselier 
605a83710eSEric Fiselier void
test1()615a83710eSEric Fiselier test1()
625a83710eSEric Fiselier {
635a83710eSEric Fiselier    typedef std::knuth_b E;
645a83710eSEric Fiselier 
655a83710eSEric Fiselier     E e;
665a83710eSEric Fiselier     assert(e() == 152607844u);
675a83710eSEric Fiselier }
685a83710eSEric Fiselier 
695a83710eSEric Fiselier void
test2()705a83710eSEric Fiselier test2()
715a83710eSEric Fiselier {
725a83710eSEric Fiselier     typedef rand1<unsigned long long, 0, 0xFFFFFFFFFFFFFFFFull> E0;
735a83710eSEric Fiselier     typedef std::shuffle_order_engine<E0, 101> E;
745a83710eSEric Fiselier     E e;
755a83710eSEric Fiselier     e.discard(400);
765a83710eSEric Fiselier     assert(e() == 501);
775a83710eSEric Fiselier }
785a83710eSEric Fiselier 
795a83710eSEric Fiselier void
test3()805a83710eSEric Fiselier test3()
815a83710eSEric Fiselier {
825a83710eSEric Fiselier     typedef rand1<unsigned long long, 0, 0xFFFFFFFFFFFFFFFFull> E0;
835a83710eSEric Fiselier     typedef std::shuffle_order_engine<E0, 100> E;
845a83710eSEric Fiselier     E e;
855a83710eSEric Fiselier     e.discard(400);
865a83710eSEric Fiselier     assert(e() == 500);
875a83710eSEric Fiselier }
885a83710eSEric Fiselier 
main(int,char **)89*2df59c50SJF Bastien int main(int, char**)
905a83710eSEric Fiselier {
915a83710eSEric Fiselier     test1();
925a83710eSEric Fiselier     test2();
935a83710eSEric Fiselier     test3();
94*2df59c50SJF Bastien 
95*2df59c50SJF Bastien   return 0;
965a83710eSEric Fiselier }
97