LCOV - code coverage report
Current view: top level - envoy/common - random_generator.h (source / functions) Hit Total Coverage
Test: coverage.dat Lines: 7 12 58.3 %
Date: 2024-01-05 06:35:25 Functions: 3 5 60.0 %

          Line data    Source code
       1             : #pragma once
       2             : 
       3             : #include <limits>
       4             : #include <memory>
       5             : #include <string>
       6             : 
       7             : #include "envoy/common/pure.h"
       8             : 
       9             : #include "source/common/common/interval_value.h"
      10             : 
      11             : namespace Envoy {
      12             : namespace Random {
      13             : 
      14             : /**
      15             :  * Random number generator. Implementations should be thread safe.
      16             :  */
      17             : class RandomGenerator {
      18             : public:
      19        6837 :   virtual ~RandomGenerator() = default;
      20             : 
      21             :   using result_type = uint64_t; // NOLINT(readability-identifier-naming)
      22             : 
      23             :   /**
      24             :    * @return uint64_t a new random number.
      25             :    */
      26             :   virtual result_type random() PURE;
      27             : 
      28             :   /*
      29             :    * @return the smallest value that `operator()` may return. The value is
      30             :    * strictly less than `max()`.
      31             :    */
      32           0 :   constexpr static result_type min() noexcept { return std::numeric_limits<result_type>::min(); };
      33             : 
      34             :   /*
      35             :    * @return the largest value that `operator()` may return. The value is
      36             :    * strictly greater than `min()`.
      37             :    */
      38           0 :   constexpr static result_type max() noexcept { return std::numeric_limits<result_type>::max(); };
      39             : 
      40             :   /*
      41             :    * @return a value in the closed interval `[min(), max()]`. Has amortized
      42             :    * constant complexity.
      43             :    */
      44         215 :   result_type operator()() { return result_type(random()); };
      45             : 
      46             :   /**
      47             :    * @return std::string containing uuid4 of 36 char length.
      48             :    * for example, 7c25513b-0466-4558-a64c-12c6704f37ed
      49             :    */
      50             :   virtual std::string uuid() PURE;
      51             : 
      52             :   /**
      53             :    * @return a random boolean value, with probability `p` equaling true.
      54             :    */
      55        2409 :   bool bernoulli(UnitFloat p) {
      56        2409 :     if (p == UnitFloat::min()) {
      57        2409 :       return false;
      58        2409 :     } else if (p == UnitFloat::max()) {
      59           0 :       return true;
      60           0 :     }
      61           0 :     return random() < static_cast<result_type>(p.value() * static_cast<float>(max()));
      62        2409 :   }
      63             : };
      64             : 
      65             : using RandomGeneratorPtr = std::unique_ptr<RandomGenerator>;
      66             : 
      67             : } // namespace Random
      68             : } // namespace Envoy

Generated by: LCOV version 1.15