/* * 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. */ /* * RandomNumberDistributionFactory.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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "TemplatePowerSetGenerator.hpp" #include "EmptyPrototypeTable.hpp" #include "RandomNumberDistribution_Encapsulation.hpp" #include "RandomNumberDistributionFactory.hpp" #include "RandomNumberDistributionFactory.def" //enum RandomNumberDistributionFactory::Distribution RandomNumberDistributionFactory::distribution = (enum RandomNumberDistributionFactory::Distribution) 0; RandomNumberDistributionFactory::DistributionMap RandomNumberDistributionFactory::distributions; RandomNumberDistributionFactory::DistributionNamesMap RandomNumberDistributionFactory::distributionNames; RandomNumberDistributionFactory::DistributionTable RandomNumberDistributionFactory::DistributionPrototypeTable; RandomNumberDistributionFactory::RandomNumberDistributionFactory() { FillEnumTable(); FillPrototypeTable(); } RandomNumberDistributionFactory::~RandomNumberDistributionFactory() { // 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 distributions.clear(); distributionNames.clear(); EmptyPrototypeTable (DistributionPrototypeTable); } void RandomNumberDistributionFactory::FillEnumTable() { // insert all known distributions #define BOOST_PP_LOCAL_MACRO(n) seqitems_as_string_enum_map(~, n, distribution_seq, distributions) #define BOOST_PP_LOCAL_LIMITS (0, BOOST_PP_SEQ_SIZE(distribution_seq)-1 ) #include BOOST_PP_LOCAL_ITERATE() for (DistributionMap::const_iterator iter = distributions.begin(); iter != distributions.end(); ++iter) { distributionNames.insert(make_pair(iter->second, iter->first)); } } void RandomNumberDistributionFactory::FillPrototypeTable() { // fill DistributionPrototypeTable #define BOOST_PP_LOCAL_MACRO(n) seqitems_as_enum_key_map(~, n, distribution_seq, DistributionPrototypeTable, new RandomNumberDistribution_Creator< RandomNumberDistribution_Encapsulation, boost::, <> > ) #define BOOST_PP_LOCAL_LIMITS (0, BOOST_PP_SEQ_SIZE(distribution_seq)-1 ) #include BOOST_PP_LOCAL_ITERATE() } RandomNumberDistribution* RandomNumberDistributionFactory::getDistribution(enum Distribution distribution_type) const { return DistributionPrototypeTable[distribution_type]->create(); } RandomNumberDistribution* RandomNumberDistributionFactory::getDistribution(const std::string distribution_name) const { ASSERT(distributions.count(distribution_name) != 0, "RandomNumberDistributionFactory::getDistribution() - distribution "+distribution_name+" is not registered."); return DistributionPrototypeTable[ distributions[distribution_name] ]->create(); } const std::string &RandomNumberDistributionFactory::getName(enum Distribution distribution_type) const { return distributionNames[distribution_type]; } enum RandomNumberDistributionFactory::Distribution RandomNumberDistributionFactory::getEnum(const std::string distribution_name) const { ASSERT(distributions.count(distribution_name) != 0, "RandomNumberDistributionFactory::getEnum() - distribution "+distribution_name+" is not registered."); return distributions[distribution_name]; } CONSTRUCT_SINGLETON(RandomNumberDistributionFactory) #include "RandomNumberDistributionFactory.undef"