--- trunk/src/lattice/LatticeFactory.cpp 2005/04/12 21:27:33 482 +++ trunk/src/lattice/LatticeFactory.cpp 2005/04/15 22:04:00 507 @@ -1,4 +1,4 @@ - /* +/* * Copyright (c) 2005 The University of Notre Dame. All Rights Reserved. * * The University of Notre Dame grants you ("Licensee") a @@ -40,80 +40,63 @@ */ #include "lattice/LatticeFactory.hpp" -#include "lattice/BaseLattice.hpp" #include "lattice/LatticeCreator.hpp" namespace oopse { -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; } - - -}