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()21 list<RandomGenerator*>& get_all_generators()
22 {
23     static list<RandomGenerator*> all_generators;
24     return all_generators;
25 }
26 
get_nondet_seed()27 RandomGenerator::ResultType get_nondet_seed()
28 {
29     random_device generator;
30     return generator();
31 }
32 
33 } // namespace
34 
35 //-----------------------------------------------------------------------------
36 
RandomGenerator()37 RandomGenerator::RandomGenerator()
38 {
39     set_seed(is_seed_set ? the_seed : get_nondet_seed());
40     get_all_generators().push_back(this);
41 }
42 
~RandomGenerator()43 RandomGenerator::~RandomGenerator()
44 {
45     get_all_generators().remove(this);
46 }
47 
has_global_seed()48 bool RandomGenerator::has_global_seed()
49 {
50     return is_seed_set;
51 }
52 
set_global_seed(ResultType seed)53 void 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()61 void 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