Home | History | Annotate | Download | only in test
      1 /*
      2  *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 #ifndef TEST_ACM_RANDOM_H_
     12 #define TEST_ACM_RANDOM_H_
     13 
     14 #include "third_party/googletest/src/include/gtest/gtest.h"
     15 
     16 #include "vpx/vpx_integer.h"
     17 
     18 namespace libvpx_test {
     19 
     20 class ACMRandom {
     21  public:
     22   ACMRandom() : random_(DeterministicSeed()) {}
     23 
     24   explicit ACMRandom(int seed) : random_(seed) {}
     25 
     26   void Reset(int seed) {
     27     random_.Reseed(seed);
     28   }
     29   uint16_t Rand16(void) {
     30     const uint32_t value =
     31         random_.Generate(testing::internal::Random::kMaxRange);
     32     return (value >> 16) & 0xffff;
     33   }
     34 
     35   uint8_t Rand8(void) {
     36     const uint32_t value =
     37         random_.Generate(testing::internal::Random::kMaxRange);
     38     // There's a bit more entropy in the upper bits of this implementation.
     39     return (value >> 24) & 0xff;
     40   }
     41 
     42   uint8_t Rand8Extremes(void) {
     43     // Returns a random value near 0 or near 255, to better exercise
     44     // saturation behavior.
     45     const uint8_t r = Rand8();
     46     return r < 128 ? r << 4 : r >> 4;
     47   }
     48 
     49   int PseudoUniform(int range) {
     50     return random_.Generate(range);
     51   }
     52 
     53   int operator()(int n) {
     54     return PseudoUniform(n);
     55   }
     56 
     57   static int DeterministicSeed(void) {
     58     return 0xbaba;
     59   }
     60 
     61  private:
     62   testing::internal::Random random_;
     63 };
     64 
     65 }  // namespace libvpx_test
     66 
     67 #endif  // TEST_ACM_RANDOM_H_
     68