diff options
author | pasta <pasta@dashboost.org> | 2022-01-31 19:32:59 +0700 |
---|---|---|
committer | pasta <pasta@dashboost.org> | 2022-04-22 09:04:39 -0500 |
commit | ab1ea29ba1b8379a21fabd3dc859552c470a6421 (patch) | |
tree | 799d831027961f820f5472ce75e93f14cd3e5217 /src/random.h | |
parent | 505ba3966562b10d6dd4162f3216a120c73a4edb (diff) |
refactor: make GetRand a template, remove GetRandInt
Diffstat (limited to 'src/random.h')
-rw-r--r-- | src/random.h | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/src/random.h b/src/random.h index 285158b1c3..40adf29010 100644 --- a/src/random.h +++ b/src/random.h @@ -69,7 +69,17 @@ */ void GetRandBytes(Span<unsigned char> bytes) noexcept; /** Generate a uniform random integer in the range [0..range). Precondition: range > 0 */ -uint64_t GetRand(uint64_t nMax) noexcept; +uint64_t GetRandInternal(uint64_t nMax) noexcept; +/** Generate a uniform random integer of type T in the range [0..nMax) + * nMax defaults to std::numeric_limits<T>::max() + * Precondition: nMax > 0, T is an integral type, no larger than uint64_t + */ +template<typename T> +T GetRand(T nMax=std::numeric_limits<T>::max()) noexcept { + static_assert(std::is_integral<T>(), "T must be integral"); + static_assert(std::numeric_limits<T>::max() <= std::numeric_limits<uint64_t>::max(), "GetRand only supports up to uint64_t"); + return T(GetRandInternal(nMax)); +} /** Generate a uniform random duration in the range [0..max). Precondition: max.count() > 0 */ template <typename D> D GetRandomDuration(typename std::common_type<D>::type max) noexcept @@ -95,7 +105,6 @@ constexpr auto GetRandMillis = GetRandomDuration<std::chrono::milliseconds>; * */ std::chrono::microseconds GetExponentialRand(std::chrono::microseconds now, std::chrono::seconds average_interval); -int GetRandInt(int nMax) noexcept; uint256 GetRandHash() noexcept; /** |