| // Copyright 2018 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef MEDIA_LEARNING_IMPL_RANDOM_NUMBER_GENERATOR_H_ |
| #define MEDIA_LEARNING_IMPL_RANDOM_NUMBER_GENERATOR_H_ |
| |
| #include <cstdint> |
| |
| #include "base/component_export.h" |
| #include "base/macros.h" |
| |
| namespace media { |
| |
| // Class to encapsulate a random number generator with an implementation for |
| // tests that provides repeatable, platform-independent sequences. |
| class COMPONENT_EXPORT(LEARNING_IMPL) RandomNumberGenerator { |
| public: |
| RandomNumberGenerator() = default; |
| |
| RandomNumberGenerator(const RandomNumberGenerator&) = delete; |
| RandomNumberGenerator& operator=(const RandomNumberGenerator&) = delete; |
| |
| virtual ~RandomNumberGenerator() = default; |
| |
| // Return a random generator that will return unpredictable values in the |
| // //base/rand_util.h sense. See TestRandomGenerator if you'd like one that's |
| // more predictable for tests. |
| static RandomNumberGenerator* Default(); |
| |
| // Taken from rand_util.h |
| // Returns a random number in range [0, UINT64_MAX]. Thread-safe. |
| virtual uint64_t Generate() = 0; |
| |
| // Returns a random number in range [0, range). Thread-safe. |
| uint64_t Generate(uint64_t range); |
| |
| // Returns a floating point number in the range [0, range). Thread-safe. |
| // This isn't an overload of Generate() to be sure that one isn't surprised by |
| // the result. |
| double GenerateDouble(double range); |
| }; |
| |
| // Handy mix-in class if you want to support rng injection. |
| class COMPONENT_EXPORT(LEARNING_IMPL) HasRandomNumberGenerator { |
| public: |
| // If |rng| is null, then we'll create a new one as a convenience. |
| explicit HasRandomNumberGenerator(RandomNumberGenerator* rng = nullptr); |
| ~HasRandomNumberGenerator(); |
| |
| void SetRandomNumberGeneratorForTesting(RandomNumberGenerator* rng); |
| |
| protected: |
| RandomNumberGenerator* rng() const { return rng_; } |
| |
| private: |
| RandomNumberGenerator* rng_ = nullptr; |
| }; |
| |
| } // namespace media |
| |
| #endif // MEDIA_LEARNING_IMPL_RANDOM_NUMBER_GENERATOR_H_ |