--- trunk/src/lattice/LatticeFactory.cpp 2005/04/12 21:27:33 482 +++ trunk/src/lattice/LatticeFactory.cpp 2009/11/25 20:02:06 1390 @@ -1,4 +1,4 @@ - /* +/* * Copyright (c) 2005 The University of Notre Dame. All Rights Reserved. * * The University of Notre Dame grants you ("Licensee") a @@ -6,19 +6,10 @@ * redistribute this software in source and binary code form, provided * that the following conditions are met: * - * 1. Acknowledgement of the program authors must be made in any - * publication of scientific results based in part on use of the - * program. An acceptable form of acknowledgement is citation of - * the article in which the program was described (Matthew - * A. Meineke, Charles F. Vardeman II, Teng Lin, Christopher - * J. Fennell and J. Daniel Gezelter, "OOPSE: An Object-Oriented - * Parallel Simulation Engine for Molecular Dynamics," - * J. Comput. Chem. 26, pp. 252-271 (2005)) - * - * 2. Redistributions of source code must retain the above copyright + * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - * 3. Redistributions in binary form must reproduce the above copyright + * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. @@ -37,83 +28,75 @@ * arising out of the use of or inability to use software, even if the * University of Notre Dame has been advised of the possibility of * such damages. + * + * SUPPORT OPEN SCIENCE! If you use OpenMD or its source code in your + * research, please cite the appropriate papers when you publish your + * work. Good starting points are: + * + * [1] Meineke, et al., J. Comp. Chem. 26, 252-271 (2005). + * [2] Fennell & Gezelter, J. Chem. Phys. 124, 234104 (2006). + * [3] Sun, Lin & Gezelter, J. Chem. Phys. 128, 24107 (2008). + * [4] Vardeman & Gezelter, in progress (2009). */ #include "lattice/LatticeFactory.hpp" -#include "lattice/BaseLattice.hpp" #include "lattice/LatticeCreator.hpp" -namespace oopse { +namespace OpenMD { -LatticeFactory* LatticeFactory::instance = NULL; -LatticeFactory::~LatticeFactory(){ - std::map::iterator mapIter; - for (mapIter = creatorMap.begin(); mapIter == creatorMap.end(); ++mapIter) { - delete mapIter->second; - } -} + //initialize instance of LatticeFactory + LatticeFactory* LatticeFactory::instance_ = NULL; - LatticeFactory* LatticeFactory::getInstance(){ - if (instance == NULL) - instance = new LatticeFactory(); - - return instance; -} + LatticeFactory::~LatticeFactory() { + CreatorMapType::iterator i; + for (i = creatorMap_.begin(); i != creatorMap_.end(); ++i) { + delete i->second; + } + creatorMap_.clear(); + } -bool LatticeFactory::registerCreator( BaseLatticeCreator* latCreator ){ - std::string latticeType = latCreator->getType(); - std::map::iterator mapIter; + bool LatticeFactory::registerLattice(LatticeCreator* creator) { + return creatorMap_.insert( + CreatorMapType::value_type(creator->getIdent(), creator)).second; + } - mapIter = creatorMap.find(latticeType); + bool LatticeFactory::unregisterLattice(const std::string& id) { + return creatorMap_.erase(id) == 1; + } - if (mapIter == creatorMap.end()) { - creatorMap[ latticeType ] = latCreator; - return true; + Lattice* LatticeFactory::createLattice(const std::string& id) { + CreatorMapType::iterator i = creatorMap_.find(id); + if (i != creatorMap_.end()) { + //invoke functor to create object + return (i->second)->create(); + } else { + return NULL; + } } - else{ - delete mapIter->second; - mapIter->second = latCreator; - return false; - } -} -BaseLattice* LatticeFactory::createLattice( const std::string& latticeType ){ - std::map::iterator mapIter; - - mapIter = creatorMap.find(latticeType); + std::vector LatticeFactory::getIdents() { + IdentVectorType idents; + CreatorMapType::iterator i; - if (mapIter != creatorMap.end()) { - return (mapIter->second)->createLattice(); + for (i = creatorMap_.begin(); i != creatorMap_.end(); ++i) { + idents.push_back(i->first); + } + + return idents; } - else - return NULL; -} -bool LatticeFactory::hasLatticeCreator( const std::string& latticeType ){ - std::map::iterator mapIter; + std::ostream& operator <<(std::ostream& o, LatticeFactory& factory) { + LatticeFactory::IdentVectorType idents; + LatticeFactory::IdentVectorIterator i; - mapIter = creatorMap.find(latticeType); + idents = factory.getIdents(); - if (mapIter != creatorMap.end()) - return true; - else - return false; -} + o << "Avaliable type identifiers in this factory: " << std::endl; + for (i = idents.begin(); i != idents.end(); ++i) { + o << *i << std::endl; + } -const std::string LatticeFactory::toString(){ - std::string result; - std::map::iterator mapIter; - - result = "Avaliable lattice creators in LatticeFactory are:\n"; - - for(mapIter = creatorMap.begin(); mapIter != creatorMap.end(); ++mapIter){ - result += mapIter->first + " "; + return o; } - - result += "\n"; - return result; } - - -}