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