/* Author: Juan Rada-Vilela, Ph.D. Copyright (C) 2010-2014 FuzzyLite Limited All rights reserved This file is part of fuzzylite. fuzzylite is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. fuzzylite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with fuzzylite. If not, see . fuzzyliteâ„¢ is a trademark of FuzzyLite Limited. */ #include "fl/factory/ConstructionFactory.h" #include "fl/Exception.h" #include "fl/defuzzifier/Defuzzifier.h" #include "fl/hedge/Hedge.h" #include "fl/norm/SNorm.h" #include "fl/norm/TNorm.h" #include "fl/term/Function.h" #include "fl/term/Term.h" namespace fl { template ConstructionFactory::ConstructionFactory(const std::string& name) : _name(name) { } template ConstructionFactory::~ConstructionFactory() { } template std::string ConstructionFactory::name() const { return this->_name; } template void ConstructionFactory::registerConstructor(const std::string& key, Constructor constructor) { this->_constructors[key] = constructor; } template void ConstructionFactory::deregisterConstructor(const std::string& key) { typename std::map::iterator it = this->_constructors.find(key); if (it != this->_constructors.end()) { this->_constructors.erase(it); } } template bool ConstructionFactory::hasConstructor(const std::string& key) const { typename std::map::const_iterator it = this->_constructors.find(key); return (it != this->_constructors.end()); } template typename ConstructionFactory::Constructor ConstructionFactory::getConstructor(const std::string& key) const { typename std::map::const_iterator it = this->_constructors.find(key); if (it != this->_constructors.end()) { return it->second; } return fl::null; } template T ConstructionFactory::constructObject(const std::string& key) const { typename std::map::const_iterator it = this->_constructors.find(key); if (it != this->_constructors.end()) { if (it->second) { return it->second(); } return fl::null; } std::ostringstream ss; ss << "[factory error] constructor of " + _name + " <" << key << "> not registered"; throw fl::Exception(ss.str(), FL_AT); } template std::vector ConstructionFactory::available() const { std::vector result; typename std::map::const_iterator it = this->_constructors.begin(); while (it != this->_constructors.end()) { result.push_back(it->first); ++it; } return result; } template class ConstructionFactory; template class ConstructionFactory; template class ConstructionFactory; template class ConstructionFactory; template class ConstructionFactory; }