1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
|
//##########################################################################
//# #
//# CLOUDCOMPARE #
//# #
//# This program is free software; you can redistribute it and/or modify #
//# it under the terms of the GNU General Public License as published by #
//# the Free Software Foundation; version 2 or later of the License. #
//# #
//# This program 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 General Public License for more details. #
//# #
//# COPYRIGHT: EDF R&D / TELECOM ParisTech (ENST-TSI) #
//# #
//##########################################################################
#ifndef CC_EXTERNAL_FACTORY_HEADER
#define CC_EXTERNAL_FACTORY_HEADER
//Local
#include "ccHObject.h"
//Qt
#include <QMap>
/** Provides new objects with an external factory
* This is intendend to be used into plugins.
* Each plugin may define a new factory by subclassing this class.
* Factories are then stored in a unique container and used to load custom types.
**/
class QCC_DB_LIB_API ccExternalFactory
{
public:
//! A convenience holder for all factories
class QCC_DB_LIB_API Container
{
public:
//! Default constructor
Container() {}
//! Returns factory using its (unique) name as key
/** \param factoryName unique name
\return corresponding factory (or null pointer if not found)
**/
ccExternalFactory* getFactoryByName(const QString& factoryName) const;
//! Adds a new factory to the container
/** Any previously existing factory with the same name will be overwritten.
**/
void addFactory(ccExternalFactory* factory);
//! Shared pointer type
typedef QSharedPointer<Container> Shared;
//! Returns the unqiue static instance of the external factories container
static Container::Shared GetUniqueInstance();
//! Sets the unqiue static instance of the external factories container
/** A default static instance is provided for convenience but another user defined instance
can be declared here instead.
**/
static void SetUniqueInstance(Container::Shared container);
protected:
//! Set of factories
QMap< QString, ccExternalFactory* > m_factories;
};
//! Default constructor
/** \param factoryName unique name
**/
ccExternalFactory(QString factoryName);
//! Returns the (unique) name of the factory
inline QString getFactoryName() const {return m_factoryName; }
//! Custom object building method
/** Similar to ccHObject::New but virtual so as to be reimplemented by the plugin.
\param metaName custom object name
\return corresponding instance (or 0 if an error occurred)
**/
virtual ccHObject* buildObject(const QString& metaName) = 0;
protected:
//! Name
QString m_factoryName;
};
#endif // CC_EXTERNAL_FACTORY_HEADER
|