/*========================================================================= Library: CTK Copyright (c) 2010 Kitware Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.commontk.org/LICENSE Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. =========================================================================*/ #ifndef __ctkAbstractFactory_tpp #define __ctkAbstractFactory_tpp // QT includes #include // CTK includes #include "ctkAbstractFactory.h" //---------------------------------------------------------------------------- template ctkAbstractFactoryItem::ctkAbstractFactoryItem(const QString& _key) :Instance() ,Key(_key) { } //---------------------------------------------------------------------------- template QString ctkAbstractFactoryItem::loadErrorString()const { return QString(); } //---------------------------------------------------------------------------- template BaseClassType* ctkAbstractFactoryItem::instantiate() { if (this->Instance) { return this->Instance; } this->Instance = this->instanciator(); return this->Instance; } //---------------------------------------------------------------------------- template bool ctkAbstractFactoryItem::instantiated() { return (this->Instance != 0); } //---------------------------------------------------------------------------- template QString ctkAbstractFactoryItem::key() { return this->Key; } //---------------------------------------------------------------------------- template void ctkAbstractFactoryItem::uninstantiate() { if (!this->Instance) { return; } delete this->Instance; // Make sure the pointer is set to 0. Doing so, Will prevent attempt to // delete unextising object if uninstantiate() methods is called multiple times. this->Instance = 0; } //---------------------------------------------------------------------------- template ctkAbstractFactory::ctkAbstractFactory() { } //---------------------------------------------------------------------------- template ctkAbstractFactory::~ctkAbstractFactory() { } //---------------------------------------------------------------------------- template void ctkAbstractFactory::printAdditionalInfo() { qDebug() << "ctkAbstractFactory (" << this << ")"; // TODO } //---------------------------------------------------------------------------- template BaseClassType* ctkAbstractFactory::instantiate(const QString& itemKey) { ctkAbstractFactoryItem* _item = this->item(itemKey); return (_item ? _item->instantiate() : 0); } //---------------------------------------------------------------------------- template void ctkAbstractFactory::uninstantiate(const QString& itemKey) { ctkAbstractFactoryItem * _item = this->item(itemKey); if (!_item) { return; } _item->uninstantiate(); } //---------------------------------------------------------------------------- template QStringList ctkAbstractFactory::names() const { // Since by construction, we checked if a name was already in the QHash, // there is no need to call 'uniqueKeys' return this->RegisteredItemMap.keys(); } //---------------------------------------------------------------------------- template bool ctkAbstractFactory::registerItem( const QSharedPointer > & _item) { // Sanity checks if (!_item || _item->key().isEmpty() || this->item(_item->key())) { return false; } // Attempt to load it if (!_item->load()) { QString errorStr; if (!_item->loadErrorString().isEmpty()) { errorStr = " - " + _item->loadErrorString(); } qCritical() << "Failed to load object:" << _item->key() << errorStr ; return false; } // Store its reference using a QSharedPointer this->RegisteredItemMap[_item->key()] = _item; return true; } //---------------------------------------------------------------------------- template ctkAbstractFactoryItem * ctkAbstractFactory::item(const QString& itemKey)const { ConstIterator iter = this->RegisteredItemMap.find(itemKey); if ( iter == this->RegisteredItemMap.constEnd()) { return 0; } return iter.value().data(); } #endif