From: <sv...@op...> - 2024-08-29 15:29:04
|
Author: manx Date: Thu Aug 29 17:28:57 2024 New Revision: 21532 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=21532 Log: [Ref] mpt/random/random.hpp: Add mpt::random<T>(prng, min, max) for integers. Modified: trunk/OpenMPT/src/mpt/random/random.hpp trunk/OpenMPT/src/mpt/random/tests/tests_random.hpp Modified: trunk/OpenMPT/src/mpt/random/random.hpp ============================================================================== --- trunk/OpenMPT/src/mpt/random/random.hpp Thu Aug 29 17:04:30 2024 (r21531) +++ trunk/OpenMPT/src/mpt/random/random.hpp Thu Aug 29 17:28:57 2024 (r21532) @@ -5,6 +5,7 @@ +#include "mpt/base/detect.hpp" #include "mpt/base/namespace.hpp" #include "mpt/random/engine.hpp" @@ -98,10 +99,36 @@ }; -template <typename T, typename Trng> +template <typename T, typename Trng, typename std::enable_if<std::is_integral<T>::value, bool>::type = true> +inline T random(Trng & rng, T min, T max) { +#if MPT_COMPILER_MSVC +#pragma warning(push) +#pragma warning(disable : 4018) // '<': signed/unsigned mismatch +#endif // MPT_COMPILER_MSVC + static_assert(std::numeric_limits<T>::is_integer); + if constexpr(std::is_same<T, uint8>::value) { + using dis_type = std::uniform_int_distribution<unsigned int>; + dis_type dis(min, max); + return static_cast<T>(dis(rng)); + } else if constexpr(std::is_same<T, int8>::value) { + using dis_type = std::uniform_int_distribution<int>; + dis_type dis(min, max); + return static_cast<T>(dis(rng)); + } else { + using dis_type = std::uniform_int_distribution<T>; + dis_type dis(min, max); + return static_cast<T>(dis(rng)); + } +#if MPT_COMPILER_MSVC +#pragma warning(pop) +#endif // MPT_COMPILER_MSVC +} + + +template <typename T, typename Trng, typename std::enable_if<std::is_floating_point<T>::value, bool>::type = true> inline T random(Trng & rng, T min, T max) { static_assert(!std::numeric_limits<T>::is_integer); - typedef mpt::uniform_real_distribution<T> dis_type; + using dis_type = mpt::uniform_real_distribution<T>; dis_type dis(min, max); return static_cast<T>(dis(rng)); } Modified: trunk/OpenMPT/src/mpt/random/tests/tests_random.hpp ============================================================================== --- trunk/OpenMPT/src/mpt/random/tests/tests_random.hpp Thu Aug 29 17:04:30 2024 (r21531) +++ trunk/OpenMPT/src/mpt/random/tests/tests_random.hpp Thu Aug 29 17:28:57 2024 (r21532) @@ -64,6 +64,11 @@ failed = failed || !mpt::is_in_range(mpt::random<int16>(prng, 9), 0, 511); failed = failed || !mpt::is_in_range(mpt::random<int64>(prng, 1), 0, 1); + failed = failed || !mpt::is_in_range(mpt::random<int8>(prng, -42, 69), -42, 69); + failed = failed || !mpt::is_in_range(mpt::random<int16>(prng, -42, 69), -42, 69); + failed = failed || !mpt::is_in_range(mpt::random<int32>(prng, -42, 69), -42, 69); + failed = failed || !mpt::is_in_range(mpt::random<int64>(prng, -42, 69), -42, 69); + failed = failed || !mpt::is_in_range(mpt::random<float>(prng, 0.0f, 1.0f), 0.0f, 1.0f); failed = failed || !mpt::is_in_range(mpt::random<double>(prng, 0.0, 1.0), 0.0, 1.0); failed = failed || !mpt::is_in_range(mpt::random<double>(prng, -1.0, 1.0), -1.0, 1.0); @@ -92,6 +97,11 @@ failed = failed || !mpt::is_in_range(mpt::random<int16>(prng64, 9), 0, 511); failed = failed || !mpt::is_in_range(mpt::random<int64>(prng64, 1), 0, 1); + failed = failed || !mpt::is_in_range(mpt::random<int8>(prng64, -42, 69), -42, 69); + failed = failed || !mpt::is_in_range(mpt::random<int16>(prng64, -42, 69), -42, 69); + failed = failed || !mpt::is_in_range(mpt::random<int32>(prng64, -42, 69), -42, 69); + failed = failed || !mpt::is_in_range(mpt::random<int64>(prng64, -42, 69), -42, 69); + failed = failed || !mpt::is_in_range(mpt::random<float>(prng64, 0.0f, 1.0f), 0.0f, 1.0f); failed = failed || !mpt::is_in_range(mpt::random<double>(prng64, 0.0, 1.0), 0.0, 1.0); failed = failed || !mpt::is_in_range(mpt::random<double>(prng64, -1.0, 1.0), -1.0, 1.0); @@ -120,6 +130,11 @@ failed = failed || !mpt::is_in_range(mpt::random<int16>(prng8, 9), 0, 511); failed = failed || !mpt::is_in_range(mpt::random<int64>(prng8, 1), 0, 1); + failed = failed || !mpt::is_in_range(mpt::random<int8>(prng8, -42, 69), -42, 69); + failed = failed || !mpt::is_in_range(mpt::random<int16>(prng8, -42, 69), -42, 69); + failed = failed || !mpt::is_in_range(mpt::random<int32>(prng8, -42, 69), -42, 69); + failed = failed || !mpt::is_in_range(mpt::random<int64>(prng8, -42, 69), -42, 69); + failed = failed || !mpt::is_in_range(mpt::random<float>(prng8, 0.0f, 1.0f), 0.0f, 1.0f); failed = failed || !mpt::is_in_range(mpt::random<double>(prng8, 0.0, 1.0), 0.0, 1.0); failed = failed || !mpt::is_in_range(mpt::random<double>(prng8, -1.0, 1.0), -1.0, 1.0); |