Author: manx Date: Sat Aug 31 14:12:26 2024 New Revision: 21554 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=21554 Log: [Ref] mpt/random: Remove dependency from engine.hpp on seed.hpp. [Ref] mpt/random: Move mpt::make_prng into seed.hpp. [Ref] mpt/random: Small cleanups. Modified: trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/openmpt123/openmpt123.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/plugins/LFOPlugin.cpp trunk/OpenMPT/src/mpt/io_file_unique/unique_basename.hpp trunk/OpenMPT/src/mpt/random/engine.hpp trunk/OpenMPT/src/mpt/random/engine_lcg.hpp trunk/OpenMPT/src/mpt/random/seed.hpp trunk/OpenMPT/src/mpt/random/tests/tests_random.hpp trunk/OpenMPT/src/mpt/uuid/tests/tests_uuid.hpp trunk/OpenMPT/src/openmpt/soundbase/Dither.hpp trunk/OpenMPT/src/openmpt/soundbase/DitherSimple.hpp trunk/OpenMPT/test/PlaybackTest.cpp trunk/OpenMPT/test/test.cpp Modified: trunk/OpenMPT/mptrack/Mptrack.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp Sat Aug 31 13:20:01 2024 (r21553) +++ trunk/OpenMPT/mptrack/Mptrack.cpp Sat Aug 31 14:12:26 2024 (r21554) @@ -42,6 +42,7 @@ #include "mpt/fs/common_directories.hpp" #include "mpt/fs/fs.hpp" #include "mpt/io_file/outputfile.hpp" +#include "mpt/random/seed.hpp" #include "mpt/string/utility.hpp" #include "openmpt/sounddevice/SoundDeviceManager.hpp" Modified: trunk/OpenMPT/openmpt123/openmpt123.cpp ============================================================================== --- trunk/OpenMPT/openmpt123/openmpt123.cpp Sat Aug 31 13:20:01 2024 (r21553) +++ trunk/OpenMPT/openmpt123/openmpt123.cpp Sat Aug 31 14:12:26 2024 (r21554) @@ -48,6 +48,7 @@ #include "mpt/random/default_engines.hpp" #include "mpt/random/device.hpp" #include "mpt/random/engine.hpp" +#include "mpt/random/seed.hpp" #include <algorithm> #include <deque> Modified: trunk/OpenMPT/soundlib/Sndfile.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp Sat Aug 31 13:20:01 2024 (r21553) +++ trunk/OpenMPT/soundlib/Sndfile.cpp Sat Aug 31 14:12:26 2024 (r21554) @@ -25,6 +25,7 @@ #include "../soundlib/AudioCriticalSection.h" #include "mpt/io/io.hpp" #include "mpt/io/io_stdstream.hpp" +#include "mpt/random/seed.hpp" #ifdef MODPLUG_TRACKER #include "../mptrack/Mainfrm.h" Modified: trunk/OpenMPT/soundlib/plugins/LFOPlugin.cpp ============================================================================== --- trunk/OpenMPT/soundlib/plugins/LFOPlugin.cpp Sat Aug 31 13:20:01 2024 (r21553) +++ trunk/OpenMPT/soundlib/plugins/LFOPlugin.cpp Sat Aug 31 14:12:26 2024 (r21554) @@ -18,6 +18,7 @@ #include "../../mptrack/plugins/LFOPluginEditor.h" #endif // MODPLUG_TRACKER #include "mpt/base/numbers.hpp" +#include "mpt/random/seed.hpp" OPENMPT_NAMESPACE_BEGIN Modified: trunk/OpenMPT/src/mpt/io_file_unique/unique_basename.hpp ============================================================================== --- trunk/OpenMPT/src/mpt/io_file_unique/unique_basename.hpp Sat Aug 31 13:20:01 2024 (r21553) +++ trunk/OpenMPT/src/mpt/io_file_unique/unique_basename.hpp Sat Aug 31 14:12:26 2024 (r21554) @@ -10,6 +10,7 @@ #include "mpt/path/os_path.hpp" #include "mpt/random/default_engines.hpp" #include "mpt/random/device.hpp" +#include "mpt/random/seed.hpp" #include "mpt/string_transcode/transcode.hpp" #include "mpt/uuid/uuid.hpp" Modified: trunk/OpenMPT/src/mpt/random/engine.hpp ============================================================================== --- trunk/OpenMPT/src/mpt/random/engine.hpp Sat Aug 31 13:20:01 2024 (r21553) +++ trunk/OpenMPT/src/mpt/random/engine.hpp Sat Aug 31 14:12:26 2024 (r21554) @@ -7,10 +7,7 @@ #include "mpt/base/macros.hpp" #include "mpt/base/namespace.hpp" -#include "mpt/base/numeric.hpp" -#include "mpt/random/seed.hpp" -#include <memory> #include <random> #include <cstddef> @@ -21,15 +18,16 @@ template <typename Trng> +struct engine_seed_traits { + static inline constexpr std::size_t seed_bits = Trng::seed_bits; +}; + +template <typename Trng> struct engine_traits { - typedef typename Trng::result_type result_type; + using result_type = typename Trng::result_type; static MPT_CONSTEXPRINLINE int result_bits() { return Trng::result_bits(); } - template <typename Trd> - static inline Trng make(Trd & rd) { - return Trng(rd); - } }; // C++11 random does not provide any sane way to determine the amount of entropy @@ -37,122 +35,91 @@ // List the ones we are likely to use. template <> +struct engine_seed_traits<std::mt19937> { + static inline constexpr std::size_t seed_bits = sizeof(std::mt19937::result_type) * 8 * std::mt19937::state_size; +}; + +template <> struct engine_traits<std::mt19937> { - enum : std::size_t { - seed_bits = sizeof(std::mt19937::result_type) * 8 * std::mt19937::state_size - }; - typedef std::mt19937 rng_type; - typedef rng_type::result_type result_type; + using rng_type = std::mt19937; + using result_type = rng_type::result_type; static MPT_CONSTEXPRINLINE int result_bits() { return rng_type::word_size; } - template <typename Trd> - static inline rng_type make(Trd & rd) { - std::unique_ptr<mpt::seed_seq_values<mpt::align_up<std::size_t>(seed_bits, sizeof(unsigned int) * 8) / (sizeof(unsigned int) * 8)>> values = std::make_unique<mpt::seed_seq_values<mpt::align_up<std::size_t>(seed_bits, sizeof(unsigned int) * 8) / (sizeof(unsigned int) * 8)>>(rd); - std::seed_seq seed(values->begin(), values->end()); - return rng_type(seed); - } +}; + +template <> +struct engine_seed_traits<std::mt19937_64> { + static inline constexpr std::size_t seed_bits = sizeof(std::mt19937_64::result_type) * 8 * std::mt19937_64::state_size; }; template <> struct engine_traits<std::mt19937_64> { - enum : std::size_t { - seed_bits = sizeof(std::mt19937_64::result_type) * 8 * std::mt19937_64::state_size - }; - typedef std::mt19937_64 rng_type; - typedef rng_type::result_type result_type; + using rng_type = std::mt19937_64; + using result_type = rng_type::result_type; static MPT_CONSTEXPRINLINE int result_bits() { return rng_type::word_size; } - template <typename Trd> - static inline rng_type make(Trd & rd) { - std::unique_ptr<mpt::seed_seq_values<mpt::align_up<std::size_t>(seed_bits, sizeof(unsigned int) * 8) / (sizeof(unsigned int) * 8)>> values = std::make_unique<mpt::seed_seq_values<mpt::align_up<std::size_t>(seed_bits, sizeof(unsigned int) * 8) / (sizeof(unsigned int) * 8)>>(rd); - std::seed_seq seed(values->begin(), values->end()); - return rng_type(seed); - } +}; + +template <> +struct engine_seed_traits<std::ranlux24_base> { + static inline constexpr std::size_t seed_bits = std::ranlux24_base::word_size; }; template <> struct engine_traits<std::ranlux24_base> { - enum : std::size_t { - seed_bits = std::ranlux24_base::word_size - }; - typedef std::ranlux24_base rng_type; - typedef rng_type::result_type result_type; + using rng_type = std::ranlux24_base; + using result_type = rng_type::result_type; static MPT_CONSTEXPRINLINE int result_bits() { return rng_type::word_size; } - template <typename Trd> - static inline rng_type make(Trd & rd) { - mpt::seed_seq_values<mpt::align_up<std::size_t>(seed_bits, sizeof(unsigned int) * 8) / (sizeof(unsigned int) * 8)> values(rd); - std::seed_seq seed(values.begin(), values.end()); - return rng_type(seed); - } +}; + +template <> +struct engine_seed_traits<std::ranlux48_base> { + static inline constexpr std::size_t seed_bits = std::ranlux48_base::word_size; }; template <> struct engine_traits<std::ranlux48_base> { - enum : std::size_t { - seed_bits = std::ranlux48_base::word_size - }; - typedef std::ranlux48_base rng_type; - typedef rng_type::result_type result_type; + using rng_type = std::ranlux48_base; + using result_type = rng_type::result_type; static MPT_CONSTEXPRINLINE int result_bits() { return rng_type::word_size; } - template <typename Trd> - static inline rng_type make(Trd & rd) { - mpt::seed_seq_values<mpt::align_up<std::size_t>(seed_bits, sizeof(unsigned int) * 8) / (sizeof(unsigned int) * 8)> values(rd); - std::seed_seq seed(values.begin(), values.end()); - return rng_type(seed); - } +}; + +template <> +struct engine_seed_traits<std::ranlux24> { + static inline constexpr std::size_t seed_bits = std::ranlux24_base::word_size; }; template <> struct engine_traits<std::ranlux24> { - enum : std::size_t { - seed_bits = std::ranlux24_base::word_size - }; - typedef std::ranlux24 rng_type; - typedef rng_type::result_type result_type; + using rng_type = std::ranlux24; + using result_type = rng_type::result_type; static MPT_CONSTEXPRINLINE int result_bits() { return std::ranlux24_base::word_size; } - template <typename Trd> - static inline rng_type make(Trd & rd) { - mpt::seed_seq_values<mpt::align_up<std::size_t>(seed_bits, sizeof(unsigned int) * 8) / (sizeof(unsigned int) * 8)> values(rd); - std::seed_seq seed(values.begin(), values.end()); - return rng_type(seed); - } +}; + +template <> +struct engine_seed_traits<std::ranlux48> { + static inline constexpr std::size_t seed_bits = std::ranlux48_base::word_size; }; template <> struct engine_traits<std::ranlux48> { - enum : std::size_t { - seed_bits = std::ranlux48_base::word_size - }; - typedef std::ranlux48 rng_type; - typedef rng_type::result_type result_type; + using rng_type = std::ranlux48; + using result_type = rng_type::result_type; static MPT_CONSTEXPRINLINE int result_bits() { return std::ranlux48_base::word_size; } - template <typename Trd> - static inline rng_type make(Trd & rd) { - mpt::seed_seq_values<mpt::align_up<std::size_t>(seed_bits, sizeof(unsigned int) * 8) / (sizeof(unsigned int) * 8)> values(rd); - std::seed_seq seed(values.begin(), values.end()); - return rng_type(seed); - } }; -template <typename Trng, typename Trd> -inline Trng make_prng(Trd & rd) { - return mpt::engine_traits<Trng>::make(rd); -} - - - } // namespace MPT_INLINE_NS } // namespace mpt Modified: trunk/OpenMPT/src/mpt/random/engine_lcg.hpp ============================================================================== --- trunk/OpenMPT/src/mpt/random/engine_lcg.hpp Sat Aug 31 13:20:01 2024 (r21553) +++ trunk/OpenMPT/src/mpt/random/engine_lcg.hpp Sat Aug 31 14:12:26 2024 (r21554) @@ -10,10 +10,12 @@ #include "mpt/base/integer.hpp" #include "mpt/base/namespace.hpp" #include "mpt/base/numeric.hpp" -#include "mpt/random/random.hpp" +#include <array> #include <random> +#include <cstddef> + namespace mpt { @@ -30,14 +32,27 @@ public: typedef Tstate state_type; typedef Tvalue result_type; + static inline constexpr std::size_t seed_bits = sizeof(state_type) * 8; private: state_type state; +private: + static inline state_type seed_state(std::seed_seq & seed) { + state_type result = 0; + std::array<unsigned int, mpt::align_up<std::size_t>(seed_bits, sizeof(unsigned int) * 8) / (sizeof(unsigned int) * 8)> seeds = {}; + seed.generate(seeds.begin(), seeds.end()); + for (std::size_t i = 0; i < mpt::align_up<std::size_t>(seed_bits, sizeof(unsigned int) * 8) / (sizeof(unsigned int) * 8); ++i) { + result <<= 16; + result <<= 16; + result |= static_cast<state_type>(seeds[i]); + } + return result; + } + public: - template <typename Trng> - explicit inline lcg_engine(Trng & rd) - : state(mpt::random<state_type>(rd)) { + explicit inline lcg_engine(std::seed_seq & seed) + : state(seed_state(seed)) { operator()(); // we return results from the current state and update state after returning. results in better pipelining. } explicit inline lcg_engine(state_type seed) Modified: trunk/OpenMPT/src/mpt/random/seed.hpp ============================================================================== --- trunk/OpenMPT/src/mpt/random/seed.hpp Sat Aug 31 13:20:01 2024 (r21553) +++ trunk/OpenMPT/src/mpt/random/seed.hpp Sat Aug 31 14:12:26 2024 (r21554) @@ -6,8 +6,12 @@ #include "mpt/base/namespace.hpp" +#include "mpt/base/numeric.hpp" +#include "mpt/random/engine.hpp" +#include "mpt/random/random.hpp" #include <array> +#include <memory> #include <random> #include <cstddef> @@ -26,9 +30,8 @@ public: template <typename Trd> explicit seed_seq_values(Trd & rd) { - std::uniform_int_distribution<unsigned int> random_int{}; for (std::size_t i = 0; i < N; ++i) { - seeds[i] = random_int(rd); + seeds[i] = mpt::random<unsigned int>(rd); } } const unsigned int * begin() const { @@ -41,6 +44,22 @@ +template <typename Trng, typename Trd> +inline Trng make_prng(Trd & rd) { + constexpr std::size_t num_seed_values = mpt::align_up<std::size_t>(mpt::engine_seed_traits<Trng>::seed_bits, sizeof(unsigned int) * 8) / (sizeof(unsigned int) * 8); + if constexpr (num_seed_values > 128) { + std::unique_ptr<mpt::seed_seq_values<num_seed_values>> values = std::make_unique<mpt::seed_seq_values<num_seed_values>>(rd); + std::seed_seq seed(values.begin(), values.end()); + return Trng(seed); + } else { + mpt::seed_seq_values<num_seed_values> values(rd); + std::seed_seq seed(values.begin(), values.end()); + return Trng(seed); + } +} + + + } // namespace MPT_INLINE_NS } // namespace mpt Modified: trunk/OpenMPT/src/mpt/random/tests/tests_random.hpp ============================================================================== --- trunk/OpenMPT/src/mpt/random/tests/tests_random.hpp Sat Aug 31 13:20:01 2024 (r21553) +++ trunk/OpenMPT/src/mpt/random/tests/tests_random.hpp Sat Aug 31 14:12:26 2024 (r21554) @@ -13,6 +13,7 @@ #include "mpt/random/default_engines.hpp" #include "mpt/random/device.hpp" #include "mpt/random/random.hpp" +#include "mpt/random/seed.hpp" #include "mpt/test/test.hpp" #include "mpt/test/test_macros.hpp" Modified: trunk/OpenMPT/src/mpt/uuid/tests/tests_uuid.hpp ============================================================================== --- trunk/OpenMPT/src/mpt/uuid/tests/tests_uuid.hpp Sat Aug 31 13:20:01 2024 (r21553) +++ trunk/OpenMPT/src/mpt/uuid/tests/tests_uuid.hpp Sat Aug 31 14:12:26 2024 (r21554) @@ -9,6 +9,7 @@ #include "mpt/base/namespace.hpp" #include "mpt/random/default_engines.hpp" #include "mpt/random/device.hpp" +#include "mpt/random/seed.hpp" #include "mpt/string/types.hpp" #include "mpt/test/test.hpp" #include "mpt/test/test_macros.hpp" Modified: trunk/OpenMPT/src/openmpt/soundbase/Dither.hpp ============================================================================== --- trunk/OpenMPT/src/openmpt/soundbase/Dither.hpp Sat Aug 31 13:20:01 2024 (r21553) +++ trunk/OpenMPT/src/openmpt/soundbase/Dither.hpp Sat Aug 31 14:12:26 2024 (r21554) @@ -9,6 +9,7 @@ #include "mpt/base/macros.hpp" #include "mpt/random/default_engines.hpp" #include "mpt/random/engine.hpp" +#include "mpt/random/seed.hpp" #include "openmpt/soundbase/MixSample.hpp" #include <vector> Modified: trunk/OpenMPT/src/openmpt/soundbase/DitherSimple.hpp ============================================================================== --- trunk/OpenMPT/src/openmpt/soundbase/DitherSimple.hpp Sat Aug 31 13:20:01 2024 (r21553) +++ trunk/OpenMPT/src/openmpt/soundbase/DitherSimple.hpp Sat Aug 31 14:12:26 2024 (r21554) @@ -10,6 +10,7 @@ #include "mpt/random/engine.hpp" #include "mpt/random/default_engines.hpp" #include "mpt/random/random.hpp" +#include "mpt/random/seed.hpp" #include "openmpt/base/Types.hpp" #include "openmpt/soundbase/MixSample.hpp" #include "openmpt/soundbase/MixSampleConvert.hpp" Modified: trunk/OpenMPT/test/PlaybackTest.cpp ============================================================================== --- trunk/OpenMPT/test/PlaybackTest.cpp Sat Aug 31 13:20:01 2024 (r21553) +++ trunk/OpenMPT/test/PlaybackTest.cpp Sat Aug 31 14:12:26 2024 (r21554) @@ -20,6 +20,8 @@ #include "mpt/crc/crc.hpp" #include "mpt/io/io.hpp" #include "mpt/io/io_stdstream.hpp" +#include "mpt/random/seed.hpp" + #include "openmpt/base/Endian.hpp" #include <sstream> Modified: trunk/OpenMPT/test/test.cpp ============================================================================== --- trunk/OpenMPT/test/test.cpp Sat Aug 31 13:20:01 2024 (r21553) +++ trunk/OpenMPT/test/test.cpp Sat Aug 31 14:12:26 2024 (r21554) @@ -36,6 +36,7 @@ #include "mpt/osinfo/dos_memory.hpp" #include "mpt/parse/parse.hpp" #include "mpt/parse/split.hpp" +#include "mpt/random/seed.hpp" #include "mpt/test/test.hpp" #include "mpt/test/test_macros.hpp" #include "mpt/uuid/uuid.hpp" |