libcxx

libcxx mirror with random patches
git clone https://git.neptards.moe/neptards/libcxx.git
Log | Files | Refs

ctor_sseq_all_zero.pass.cpp (2404B)


      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 UIntType, size_t w, size_t n, size_t m, size_t r,
     13 //           UIntType a, size_t u, UIntType d, size_t s,
     14 //           UIntType b, size_t t,
     15 //           UIntType c, size_t l, UIntType f>
     16 // class mersenne_twister_engine;
     17 
     18 // template <class Sseq> explicit mersenne_twister_engine(Sseq &q);
     19 //
     20 //     [ ... ] Finally, if the most significant $w-r$ bits of $X_{-n}$ are zero,
     21 //     and if each of the other resulting $X_i$ is $0$, changes $X_{-n}$ to
     22 //     $ 2^{w-1} $.
     23 
     24 #include <random>
     25 
     26 #include <algorithm>
     27 #include <cassert>
     28 #include <cstddef>
     29 #if TEST_STD_VER >= 11
     30 #include <initializer_list>
     31 #endif
     32 
     33 struct all_zero_seed_seq {
     34   typedef unsigned int result_type;
     35 
     36   all_zero_seed_seq() {}
     37 
     38   template <typename InputIterator>
     39   all_zero_seed_seq(InputIterator, InputIterator) {}
     40 #if TEST_STD_VER >= 11
     41   all_zero_seed_seq(std::initializer_list<result_type>) {}
     42 #endif
     43 
     44   template <typename RandomAccessIterator>
     45   void generate(RandomAccessIterator rb, RandomAccessIterator re) {
     46     std::fill(rb, re, 0u);
     47   }
     48 
     49   std::size_t size() const { return 0u; }
     50   template <typename OutputIterator> void param(OutputIterator) const {}
     51 };
     52 
     53 template <typename result_type, std::size_t word_size>
     54 void test(void) {
     55   const std::size_t state_size = 1u;
     56   const std::size_t shift_size = 1u;
     57   const std::size_t tempering_l = word_size;
     58 
     59   all_zero_seed_seq q;
     60   std::mersenne_twister_engine<result_type, word_size, state_size,
     61                                shift_size,
     62                                0u,
     63                                0x0,
     64                                0u, 0x0, 0u, 0x0, 0u, 0x0,
     65                                tempering_l,
     66                                0u>
     67       e(q);
     68 
     69   const result_type Xneg1 = result_type(1) << (word_size - 1);
     70   const result_type Y = Xneg1;
     71   const result_type X0 = Xneg1 ^ (Y >> 1);
     72   assert(e() == X0);
     73 }
     74 
     75 int main() {
     76   // Test for k == 1: word_size <= 32.
     77   test<unsigned short, 3u>();
     78 
     79   // Test for k == 2: (32 < word_size <= 64).
     80   test<unsigned long long, 33u>();
     81 }