diff --git a/Framework/Random/RNGManager.cc b/Framework/Random/RNGManager.cc index ab60ff721f876d728a2f4ee04e3a31b33d121d43..8b595f12302d4109241118199a824ba58f5cd897 100644 --- a/Framework/Random/RNGManager.cc +++ b/Framework/Random/RNGManager.cc @@ -7,6 +7,7 @@ */ #include <corsika/random/RNGManager.h> +#include <sstream> void corsika::random::RNGManager::RegisterRandomStream(std::string const& pStreamName) { corsika::random::RNG rng; @@ -20,7 +21,15 @@ void corsika::random::RNGManager::RegisterRandomStream(std::string const& pStrea corsika::random::RNG& corsika::random::RNGManager::GetRandomStream( std::string const& pStreamName) { - return rngs.at(pStreamName); + if (IsRegistered(pStreamName)) { + return rngs.at(pStreamName); + } else { // this stream name is not in the map + throw std::runtime_error(pStreamName + " is not a registered stream."); + } +} + +bool corsika::random::RNGManager::IsRegistered(std::string const& pStreamName) const { + return rngs.count(pStreamName) > 0; } std::stringstream corsika::random::RNGManager::dumpState() const { @@ -44,10 +53,3 @@ void corsika::random::RNGManager::SeedAll() { entry.second.seed(sseq); } } - -/* -void corsika::random::RNGManager::SetSeedSeq(std::string const& pStreamName, - std::seed_seq const& pSeedSeq) { - seeds[pStreamName] = pSeedSeq; -} -*/ diff --git a/Framework/Random/RNGManager.h b/Framework/Random/RNGManager.h index 15e90d69a294824a3e58d0e60eab38d4ebd37e07..0826642a86e57df9f25ab0c297e5ce080839565b 100644 --- a/Framework/Random/RNGManager.h +++ b/Framework/Random/RNGManager.h @@ -12,7 +12,6 @@ #include <map> #include <random> -#include <sstream> #include <string> /*! @@ -23,7 +22,10 @@ namespace corsika::random { using RNG = std::mt19937; //!< the actual RNG type that will be used - class RNGManager : public corsika::utl::Singleton<RNGManager> { + /*! + * Manage random number generators. + */ + class RNGManager final : public corsika::utl::Singleton<RNGManager> { friend class corsika::utl::Singleton<RNGManager>; @@ -48,17 +50,17 @@ namespace corsika::random { */ RNG& GetRandomStream(std::string const& pStreamName); + /*! + * Check whether a stream has been registered. + */ + bool IsRegistered(std::string const& pStreamName) const; + /*! * dumps the names and states of all registered random-number streams * into a std::stringstream. */ std::stringstream dumpState() const; - /** - * set seed_seq of \a pStreamName to \a pSeedSeq - */ - // void SetSeedSeq(std::string const& pStreamName, std::seed_seq& const pSeedSeq); - /** * Set explicit seeds for all currently registered streams. The actual seed values * are incremented from \a vSeed. diff --git a/Framework/Random/testRandom.cc b/Framework/Random/testRandom.cc index 9a1d96fbb7a1dd426643a4fe4eba51c65403330a..14971167d1517e8cef0dfc2a3860f86f25e1c386 100644 --- a/Framework/Random/testRandom.cc +++ b/Framework/Random/testRandom.cc @@ -23,18 +23,32 @@ SCENARIO("random-number streams can be registered and retrieved") { GIVEN("a RNGManager") { RNGManager& rngManager = RNGManager::GetInstance(); - WHEN("a sequence is registered by name") { - rngManager.RegisterRandomStream("stream_A"); + WHEN("the sequence name is not registered") { + REQUIRE(rngManager.IsRegistered("stream_A") == false); - THEN("the sequence can be retrieved") { - REQUIRE_NOTHROW(rngManager.GetRandomStream("stream_A")); - } + THEN("a sequence is registered by name") { + rngManager.RegisterRandomStream("stream_A"); - THEN("an unknown sequence cannot be retrieved") { - REQUIRE_THROWS(rngManager.GetRandomStream("stream_UNKNOWN")); - } + THEN("the sequence can be retrieved") { + REQUIRE_NOTHROW(rngManager.GetRandomStream("stream_A")); + + THEN("we can check that the sequence exists") { + REQUIRE_NOTHROW(rngManager.GetRandomStream("stream_A")); - // seeding not covered yet + THEN("an unknown sequence cannot be retrieved") { + REQUIRE(rngManager.IsRegistered("stream_A") == true); + + THEN("an unknown sequence cannot be retrieved") { + REQUIRE_THROWS(rngManager.GetRandomStream("stream_UNKNOWN")); + + THEN("an unknown sequence is not registered") { + REQUIRE(rngManager.IsRegistered("stream_UNKNOWN") == false); + } + } + } + } + } + } } } }