1 //----------------------------------------------------------------------------- 2 /** @file libboardgame_base/RandomGenerator.cpp 3 @author Markus Enzenberger 4 @copyright GNU General Public License version 3 or later */ 5 //----------------------------------------------------------------------------- 6 7 #include "RandomGenerator.h" 8 9 #include <list> 10 11 namespace libboardgame_base { 12 13 //---------------------------------------------------------------------------- 14 15 namespace { 16 17 bool is_seed_set = false; 18 19 RandomGenerator::ResultType the_seed; 20 get_all_generators()21list<RandomGenerator*>& get_all_generators() 22 { 23 static list<RandomGenerator*> all_generators; 24 return all_generators; 25 } 26 get_nondet_seed()27RandomGenerator::ResultType get_nondet_seed() 28 { 29 random_device generator; 30 return generator(); 31 } 32 33 } // namespace 34 35 //----------------------------------------------------------------------------- 36 RandomGenerator()37RandomGenerator::RandomGenerator() 38 { 39 set_seed(is_seed_set ? the_seed : get_nondet_seed()); 40 get_all_generators().push_back(this); 41 } 42 ~RandomGenerator()43RandomGenerator::~RandomGenerator() 44 { 45 get_all_generators().remove(this); 46 } 47 has_global_seed()48bool RandomGenerator::has_global_seed() 49 { 50 return is_seed_set; 51 } 52 set_global_seed(ResultType seed)53void RandomGenerator::set_global_seed(ResultType seed) 54 { 55 is_seed_set = true; 56 the_seed = seed; 57 for (RandomGenerator* i : get_all_generators()) 58 i->set_seed(the_seed); 59 } 60 set_global_seed_last()61void RandomGenerator::set_global_seed_last() 62 { 63 if (is_seed_set) 64 for (RandomGenerator* i : get_all_generators()) 65 i->set_seed(the_seed); 66 } 67 68 //----------------------------------------------------------------------------- 69 70 } // namespace libboardgame_base 71