/** * * This file is part of the PACPUS framework distributed under the * CECILL-C License, Version 1.0. * * @author Gerald Dherbomez * @date December, 2012 * @version $Id$ * @copyright Copyright (c) UTC/CNRS Heudiasyc 2005 - 2013. All rights reserved. * */ #ifndef DEF_PACPUS_COMPONENTFACTORY_H #define DEF_PACPUS_COMPONENTFACTORY_H #include #include #include #include #include #include /** Register a component to the factory. * @className Name of the class, without the quotes. * @factoryName Name of the class in the factory. */ #define REGISTER_COMPONENT(className, factoryName) \ static pacpus::ComponentFactory sFactory(factoryName) namespace pacpus { /** ComponentFactory * @brief Use it to interface your components with the application. * * @example * REGISTER_COMPONENT("DummyComponent", DummyComponent); */ template class ComponentFactory : public ComponentFactoryBase { BOOST_STATIC_ASSERT_MSG((boost::is_base_of::value), "T must inherit from ComponentBase"); public: /** Ctor of ComponentFactory, initialize the factory of the components of type @em T. * @param type Name of the type of the components. */ ComponentFactory(const QString& type); /** Dtor of ComponentFactory. */ virtual ~ComponentFactory(); /** Get the name of the type of the components. * @return Name of the type of the components. */ const QString& getType() const; protected: virtual ComponentBase* instantiateComponent(const QString& name); private: QString mType; }; template ComponentFactory::ComponentFactory(const QString& type) : mType(type) { assert(!type.isEmpty()); addFactory(this, mType); } template ComponentFactory::~ComponentFactory() { } template const QString& ComponentFactory::getType() const { return mType; } template ComponentBase* ComponentFactory::instantiateComponent(const QString& name) { return new T(name); } } // pacpus #endif // DEF_PACPUS_DBITEEXCEPTION_H