[3f9eba] | 1 | /*
|
---|
| 2 | * RandomNumberGeneratorFactory.hpp
|
---|
| 3 | *
|
---|
| 4 | * Created on: Dec 31, 2010
|
---|
| 5 | * Author: heber
|
---|
| 6 | */
|
---|
| 7 |
|
---|
| 8 | #ifndef RANDOMNUMBERGENERATORFACTORY_HPP_
|
---|
| 9 | #define RANDOMNUMBERGENERATORFACTORY_HPP_
|
---|
| 10 |
|
---|
| 11 | // include config.h
|
---|
| 12 | #ifdef HAVE_CONFIG_H
|
---|
| 13 | #include <config.h>
|
---|
| 14 | #endif
|
---|
| 15 |
|
---|
| 16 | #include "CodePatterns/Singleton.hpp"
|
---|
| 17 |
|
---|
| 18 | #include "RandomNumberDistribution.hpp"
|
---|
| 19 | #include "RandomNumberEngine.hpp"
|
---|
| 20 | #include "RandomNumberGenerator.hpp"
|
---|
| 21 |
|
---|
| 22 | #include <map>
|
---|
| 23 |
|
---|
| 24 | #include "TemplatePowerSetGenerator.hpp"
|
---|
| 25 | #include "RandomNumberGeneratorFactory.def"
|
---|
| 26 |
|
---|
| 27 | #include "unittests/RandomNumberGeneratorFactoryUnitTest.hpp"
|
---|
| 28 |
|
---|
| 29 | /** This is the abstract factory class for random number generators.
|
---|
| 30 | *
|
---|
| 31 | * The reason for creating the generators as this is that we would like to set
|
---|
| 32 | * the generator's parameters, via some Action, and then onward only have
|
---|
| 33 | * random number generator of this type using these parameters. Hence, we have
|
---|
| 34 | * a singleton factory that is controlled by the Action and can then create
|
---|
| 35 | * generators wherever we like in the code by having the factory create one.
|
---|
| 36 | *
|
---|
| 37 | */
|
---|
| 38 | class RandomNumberGeneratorFactory : public Singleton<RandomNumberGeneratorFactory>
|
---|
| 39 | {
|
---|
| 40 | friend class Singleton<RandomNumberGeneratorFactory>;
|
---|
| 41 | friend class RandomNumberGeneratorFactoryTest;
|
---|
| 42 | public:
|
---|
| 43 |
|
---|
| 44 | protected:
|
---|
| 45 | RandomNumberGeneratorFactory();
|
---|
| 46 | virtual ~RandomNumberGeneratorFactory();
|
---|
| 47 |
|
---|
| 48 | public:
|
---|
| 49 | /** Enumeration of all (pseudo-)random number engines implemented in
|
---|
| 50 | * boost::random, see
|
---|
| 51 | * http://www.boost.org/doc/libs/1_45_0/doc/html/boost_random/reference.html#boost_random.reference.concepts
|
---|
| 52 | */
|
---|
| 53 | enum Engine {
|
---|
| 54 | BOOST_PP_REPEAT( engine_seq_size, seqitems_as_enum, engine_seq)
|
---|
| 55 | ,
|
---|
| 56 | BOOST_PP_REPEAT( engine_seq_a_size, seqitems_as_enum, engine_seq_a)
|
---|
| 57 | };
|
---|
| 58 |
|
---|
| 59 | /** Enumeration of all distribution implemented in random::boost.
|
---|
| 60 | */
|
---|
| 61 | enum Distribution {
|
---|
| 62 | BOOST_PP_REPEAT( distribution_seq_size, seqitems_as_enum, distribution_seq)
|
---|
| 63 | };
|
---|
| 64 |
|
---|
| 65 | /** Create a Generator of previously set type.
|
---|
| 66 | *
|
---|
| 67 | * \return random number generator instance
|
---|
| 68 | */
|
---|
| 69 | RandomNumberGenerator& makeRandomNumberGenerator() const;
|
---|
| 70 |
|
---|
| 71 | /** Create a Generator of desired combination of engine and distribution.
|
---|
| 72 | *
|
---|
| 73 | * Note that this does not affect the default setting of the engine or
|
---|
| 74 | * distribution type.
|
---|
| 75 | *
|
---|
| 76 | * \param engine_type name of engine, give empty string for current default
|
---|
| 77 | * \param distribution_type name of distribution, give empty string for current default
|
---|
| 78 | * \return random number generator instance
|
---|
| 79 | */
|
---|
| 80 | RandomNumberGenerator& makeRandomNumberGenerator(std::string engine_type, std::string distribution_type) const;
|
---|
| 81 |
|
---|
| 82 | /** Specify the precise type of the engine to build
|
---|
| 83 | *
|
---|
| 84 | * @param name of engine
|
---|
| 85 | */
|
---|
| 86 | void setEngine(std::string engine_type);
|
---|
| 87 |
|
---|
| 88 | /** Getter for current type of engine.
|
---|
| 89 | *
|
---|
| 90 | * @return name of engine
|
---|
| 91 | */
|
---|
| 92 | const std::string &getEngine() const;
|
---|
| 93 |
|
---|
| 94 | /** Specify the precise type of the distribution to build
|
---|
| 95 | *
|
---|
| 96 | * @param name of distribution
|
---|
| 97 | */
|
---|
| 98 | void setDistribution(std::string distribution_type);
|
---|
| 99 |
|
---|
| 100 | /** Getter for current type of distribution.
|
---|
| 101 | *
|
---|
| 102 | * @return name of distribution
|
---|
| 103 | */
|
---|
| 104 | const std::string &getDistribution() const;
|
---|
| 105 |
|
---|
| 106 | protected:
|
---|
| 107 | private:
|
---|
| 108 | /** Creates instances of all possible (engine,distribution) combinations
|
---|
| 109 | * and stores them in \a PrototypeTable.
|
---|
| 110 | */
|
---|
| 111 | void FillPrototypeTables();
|
---|
| 112 |
|
---|
| 113 | typedef std::map<
|
---|
| 114 | std::string,
|
---|
| 115 | enum Engine
|
---|
| 116 | > EngineMap;
|
---|
| 117 | typedef std::map<
|
---|
| 118 | enum Engine,
|
---|
| 119 | RandomNumberEngine *
|
---|
| 120 | > EngineTable;
|
---|
| 121 | typedef std::map<
|
---|
| 122 | enum Engine,
|
---|
| 123 | std::string
|
---|
| 124 | > EngineNamesMap;
|
---|
| 125 |
|
---|
| 126 | typedef std::map<
|
---|
| 127 | std::string,
|
---|
| 128 | enum Distribution
|
---|
| 129 | > DistributionMap;
|
---|
| 130 | typedef std::map<
|
---|
| 131 | enum Distribution,
|
---|
| 132 | RandomNumberDistribution *
|
---|
| 133 | > DistributionTable;
|
---|
| 134 | typedef std::map<
|
---|
| 135 | enum Distribution,
|
---|
| 136 | std::string
|
---|
| 137 | > DistributionNamesMap;
|
---|
| 138 |
|
---|
| 139 | typedef std::map<
|
---|
| 140 | enum Engine,
|
---|
| 141 | std::map<
|
---|
| 142 | enum Distribution,
|
---|
| 143 | RandomNumberGenerator *>
|
---|
| 144 | > EngineDistributionTable;
|
---|
| 145 |
|
---|
| 146 | static enum Engine engine;
|
---|
| 147 | static enum Distribution distribution;
|
---|
| 148 | static EngineMap engines;
|
---|
| 149 | static EngineTable EnginePrototypeTable;
|
---|
| 150 | static EngineNamesMap engineNames;
|
---|
| 151 | static DistributionMap distributions;
|
---|
| 152 | static DistributionTable DistributionPrototypeTable;
|
---|
| 153 | static DistributionNamesMap distributionNames;
|
---|
| 154 | static EngineDistributionTable GeneratorPrototypeTable;
|
---|
| 155 | };
|
---|
| 156 |
|
---|
| 157 | #include "RandomNumberGeneratorFactory.undef"
|
---|
| 158 |
|
---|
| 159 | #endif /* RANDOMNUMBERGENERATORFACTORY_HPP_ */
|
---|