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 template <class UIntType, UIntType Min, UIntType Max>
     21 class rand1
     22 {
     23 public:
     24     // types
     25     typedef UIntType result_type;
     26 
     27 private:
     28     result_type x_;
     29 
     30     static_assert(Min < Max, "rand1 invalid parameters");
     31 public:
     32 
     33 #ifdef _LIBCPP_HAS_NO_CONSTEXPR
     34     // Workaround for lack of constexpr in C++03
     35     static const result_type _Min = Min;
     36     static const result_type _Max = Max;
     37 #endif
     38 
     39     static _LIBCPP_CONSTEXPR result_type min() {return Min;}
     40     static _LIBCPP_CONSTEXPR result_type max() {return Max;}
     41 
     42     explicit rand1(result_type sd = Min) : x_(sd)
     43     {
     44         if (x_ > Max)
     45             x_ = Max;
     46     }
     47 
     48     result_type operator()()
     49     {
     50         result_type r = x_;
     51         if (x_ < Max)
     52             ++x_;
     53         else
     54             x_ = Min;
     55         return r;
     56     }
     57 };
     58 
     59 void
     60 test1()
     61 {
     62    typedef std::independent_bits_engine<rand1<unsigned, 0, 10>, 16, unsigned> E;
     63 
     64     E e;
     65     assert(e() == 6958);
     66 }
     67 
     68 void
     69 test2()
     70 {
     71     typedef std::independent_bits_engine<rand1<unsigned, 0, 100>, 16, unsigned> E;
     72 
     73     E e;
     74     assert(e() == 66);
     75 }
     76 
     77 void
     78 test3()
     79 {
     80     typedef std::independent_bits_engine<rand1<unsigned, 0, 0xFFFFFFFF>, 32, unsigned> E;
     81 
     82     E e(5);
     83     assert(e() == 5);
     84 }
     85 
     86 void
     87 test4()
     88 {
     89     typedef std::independent_bits_engine<rand1<unsigned, 0, 0xFFFFFFFF>, 7, unsigned> E;
     90 
     91     E e(129);
     92     assert(e() == 1);
     93 }
     94 
     95 void
     96 test5()
     97 {
     98     typedef std::independent_bits_engine<rand1<unsigned, 2, 3>, 1, unsigned> E;
     99 
    100     E e(6);
    101     assert(e() == 1);
    102 }
    103 
    104 void
    105 test6()
    106 {
    107     typedef std::independent_bits_engine<rand1<unsigned, 2, 3>, 11, unsigned> E;
    108 
    109     E e(6);
    110     assert(e() == 1365);
    111 }
    112 
    113 void
    114 test7()
    115 {
    116     typedef std::independent_bits_engine<rand1<unsigned, 2, 3>, 32, unsigned> E;
    117 
    118     E e(6);
    119     assert(e() == 2863311530u);
    120 }
    121 
    122 void
    123 test8()
    124 {
    125     typedef std::independent_bits_engine<std::mt19937, 64, unsigned long long> E;
    126 
    127     E e(6);
    128     assert(e() == 16470362623952407241ull);
    129 }
    130 
    131 int main()
    132 {
    133     test1();
    134     test2();
    135     test3();
    136     test4();
    137     test5();
    138     test6();
    139     test7();
    140     test8();
    141 }
    142