diff options
Diffstat (limited to 'installerbuilder/libinstaller/kdtools/KDToolsCore/kdgenericfactory.h')
-rw-r--r-- | installerbuilder/libinstaller/kdtools/KDToolsCore/kdgenericfactory.h | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/installerbuilder/libinstaller/kdtools/KDToolsCore/kdgenericfactory.h b/installerbuilder/libinstaller/kdtools/KDToolsCore/kdgenericfactory.h new file mode 100644 index 000000000..1a0d7f854 --- /dev/null +++ b/installerbuilder/libinstaller/kdtools/KDToolsCore/kdgenericfactory.h @@ -0,0 +1,90 @@ +/**************************************************************************** +** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. All rights reserved. +** +** This file is part of the KD Tools library. +** +** Licensees holding valid commercial KD Tools licenses may use this file in +** accordance with the KD Tools Commercial License Agreement provided with +** the Software. +** +** +** This file may be distributed and/or modified under the terms of the +** GNU Lesser General Public License version 2 and version 3 as published by the +** Free Software Foundation and appearing in the file LICENSE.LGPL included. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** Contact info@kdab.com if any conditions of this licensing are not +** clear to you. +** +**********************************************************************/ + +#ifndef __KDTOOLSCORE__KDGENERICFACTORY_H__ +#define __KDTOOLSCORE__KDGENERICFACTORY_H__ + +#include <KDToolsCore/kdtoolsglobal.h> + +#include <QtCore/QHash> + +template< typename T_Product, typename T_Identifier = QString, template< typename U, typename V > class T_Map = QHash > +class MAKEINCLUDES_EXPORT KDGenericFactory +{ +public: + virtual ~KDGenericFactory() + { + } + + typedef T_Product* (*FactoryFunction)(); + + template< typename T > + void registerProduct( const T_Identifier& name ) + { +#ifdef Q_CC_MSVC + FactoryFunction function = &KDGenericFactory::create<T>; + registerProductionFunction( name, function ); +#else + registerProductionFunction( name, &create<T> ); +#endif + } + + void unregisterProduct( const T_Identifier& name ) + { + map.remove( name ); + } + + unsigned int productCount() const + { + return map.size(); + } + + QList< T_Identifier > availableProducts() const + { + return map.keys(); + } + + T_Product* create( const T_Identifier& name ) const + { + const typename T_Map< T_Identifier, FactoryFunction >::const_iterator it = map.find( name ); + if( it == map.end() ) + return 0; + return (*it)(); + } + +protected: + void registerProductionFunction( const T_Identifier& name, FactoryFunction create ) + { + map.insert( name, create ); + } + +private: + template< typename T > + static T_Product* create() + { + return new T; + } + + T_Map< T_Identifier, FactoryFunction > map; +}; + +#endif |