/* * Project: MoleCuilder * Description: creates and alters molecular systems * Copyright (C) 2010 University of Bonn. All rights reserved. * Please see the LICENSE file or "Copyright notice" in builder.cpp for details. */ /* * RandomNumberEngineFactory.cpp * * Created on: Jan 03, 2011 * Author: heber */ // include config.h #ifdef HAVE_CONFIG_H #include #endif #include "CodePatterns/MemDebug.hpp" #include #include "CodePatterns/Singleton_impl.hpp" #include "CodePatterns/Assert.hpp" #include #include #include "TemplatePowerSetGenerator.hpp" #include "EmptyPrototypeTable.hpp" #include "RandomNumberEngine_Encapsulation.hpp" #include "RandomNumberEngineFactory.hpp" #include "RandomNumberEngineFactory.def" //enum RandomNumberEngineFactory::Engine RandomNumberEngineFactory::engine = (enum RandomNumberEngineFactory::Engine) 0; RandomNumberEngineFactory::EngineMap RandomNumberEngineFactory::engines; RandomNumberEngineFactory::EngineNamesMap RandomNumberEngineFactory::engineNames; RandomNumberEngineFactory::EngineTable RandomNumberEngineFactory::EnginePrototypeTable; RandomNumberEngineFactory::RandomNumberEngineFactory() { FillEnumTable(); FillPrototypeTable(); } RandomNumberEngineFactory::~RandomNumberEngineFactory() { // clear out factories map to allow boost::shared_ptr to do their work (i.e. to release mem) // this is necessary as factories is a object engines.clear(); engineNames.clear(); EmptyPrototypeTable (EnginePrototypeTable); } void RandomNumberEngineFactory::FillEnumTable() { // insert all known engines #define BOOST_PP_LOCAL_MACRO(n) seqitems_as_string_enum_map(~, n, engine_seq, engines) #define BOOST_PP_LOCAL_LIMITS (0, BOOST_PP_SEQ_SIZE(engine_seq)-1 ) #include BOOST_PP_LOCAL_ITERATE() #define BOOST_PP_LOCAL_MACRO(n) seqitems_as_string_enum_map(~, n, engine_seq_a, engines) #define BOOST_PP_LOCAL_LIMITS (0, BOOST_PP_SEQ_SIZE(engine_seq_a)-1 ) #include BOOST_PP_LOCAL_ITERATE() for (EngineMap::const_iterator iter = engines.begin(); iter != engines.end(); ++iter) { engineNames.insert(make_pair(iter->second, iter->first)); } } void RandomNumberEngineFactory::FillPrototypeTable() { // fill EnginePrototypeTable #define BOOST_PP_LOCAL_MACRO(n) seqitems_as_enum_key_map(~, n, engine_seq, EnginePrototypeTable, new RandomNumberEngine_Creator< RandomNumberEngine_Encapsulation , boost::, >) #define BOOST_PP_LOCAL_LIMITS (0, BOOST_PP_SEQ_SIZE(engine_seq)-1 ) #include BOOST_PP_LOCAL_ITERATE() #define BOOST_PP_LOCAL_MACRO(n) seqitems_as_enum_key_map(~, n, engine_seq_a, EnginePrototypeTable, new RandomNumberEngine_Creator< RandomNumberEngine_Encapsulation , boost::, >) #define BOOST_PP_LOCAL_LIMITS (0, BOOST_PP_SEQ_SIZE(engine_seq_a)-1 ) #include BOOST_PP_LOCAL_ITERATE() } RandomNumberEngine* RandomNumberEngineFactory::getEngine(enum Engine engine_type) const { return EnginePrototypeTable[engine_type]->create(); } RandomNumberEngine* RandomNumberEngineFactory::getEngine(const std::string engine_name) const { ASSERT(engines.count(engine_name) != 0, "RandomNumberEngineFactory::getEngine() - engine "+engine_name+" is not registered."); return EnginePrototypeTable[ engines[engine_name] ]->create(); } const std::string &RandomNumberEngineFactory::getName(enum Engine engine_type) const { return engineNames[engine_type]; } enum RandomNumberEngineFactory::Engine RandomNumberEngineFactory::getEnum(const std::string engine_name) const { ASSERT(engines.count(engine_name) != 0, "RandomNumberEngineFactory::getEnum() - engine "+engine_name+" is not registered."); return engines[engine_name]; } CONSTRUCT_SINGLETON(RandomNumberEngineFactory) #include "RandomNumberEngineFactory.undef"