/* 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/CloningFactory.h" #include "fl/Exception.h" #include "fl/term/Function.h" namespace fl { template CloningFactory::CloningFactory(const std::string& name) : _name(name) { } template CloningFactory::CloningFactory(const CloningFactory& other) { typename std::map::const_iterator it = other._objects.begin(); while (it != other._objects.end()) { T clone = fl::null; if (it->second) clone = it->second->clone(); this->_objects[it->first] = clone; ++it; } } template CloningFactory& CloningFactory::operator=(const CloningFactory& other) { if (this != &other) { typename std::map::const_iterator it = this->_objects.begin(); while (it != this->_objects.end()) { if (it->second) delete it->second; ++it; } this->_objects.clear(); it = other._objects.begin(); while (it != other._objects.end()) { T clone = fl::null; if (it->second) clone = it->second->clone(); this->_objects[it->first] = clone; ++it; } } return *this; } template CloningFactory::~CloningFactory() { typename std::map::const_iterator it = this->_objects.begin(); while (it != this->_objects.end()) { if (it->second) delete it->second; ++it; } } template std::string CloningFactory::name() const { return this->_name; } template void CloningFactory::registerObject(const std::string& key, T object) { this->_objects[key] = object; } template void CloningFactory::deregisterObject(const std::string& key) { typename std::map::iterator it = this->_objects.find(key); if (it != this->_objects.end()) { this->_objects.erase(it); delete it->second; } } template bool CloningFactory::hasObject(const std::string& key) const { typename std::map::const_iterator it = this->_objects.find(key); return (it != this->_objects.end()); } template T CloningFactory::getObject(const std::string& key) const { typename std::map::const_iterator it = this->_objects.find(key); if (it != this->_objects.end()) { if (it->second) return it->second; } return fl::null; } template T CloningFactory::cloneObject(const std::string& key) const { typename std::map::const_iterator it = this->_objects.find(key); if (it != this->_objects.end()) { if (it->second) return it->second->clone(); return fl::null; } throw fl::Exception("[cloning error] " + _name + " object by name <" + key + "> not registered", FL_AT); } template std::vector CloningFactory::available() const { std::vector result; typename std::map::const_iterator it = this->_objects.begin(); while (it != this->_objects.end()) { result.push_back(it->first); } return result; } template class fl::CloningFactory; }