/**************************************************************************** ** ** https://www.qxorm.com/ ** Copyright (C) 2013 XDL Team (ic-east.com) ** ** This file is part of the QxOrm library ** ** This software is provided 'as-is', without any express or implied ** warranty. In no event will the authors be held liable for any ** damages arising from the use of this software ** ** Commercial Usage ** Licensees holding valid commercial QxOrm licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and XDL Team ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file 'license.gpl3.txt' included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met : http://www.gnu.org/copyleft/gpl.html ** ** If you are unsure which license is appropriate for your use, or ** if you have questions regarding the use of this file, please contact : ** ic-east.com ** ****************************************************************************/ #ifndef _QX_FACTORY_X_H_ #define _QX_FACTORY_X_H_ #ifdef _MSC_VER #pragma once #endif /*! * \file QxFactoryX.h * \author XDL Team * \ingroup QxFactory * \brief List of all classes registered with QxOrm library factory pattern to create object instance dynamically using the class name */ #include #include #include #include namespace qx { inline qx::any create(const QString &sKey, bool bRawPointer = false); template inline T *create_nude_ptr(const QString &sKey); inline void *create_void_ptr(const QString &sKey); class QxClassX; /*! * \ingroup QxFactory * \brief qx::QxFactoryX : list of all classes registered with QxOrm library factory pattern to create object instance dynamically using the class name */ class QX_DLL_EXPORT QxFactoryX : public QxSingleton { friend class QxClassX; friend class IxFactory; friend class QxSingleton; friend inline qx::any create(const QString &sKey, bool bRawPointer); template friend inline T *create_nude_ptr(const QString &sKey); friend inline void *create_void_ptr(const QString &sKey); protected: QHash m_mapFactoryX; //!< Collection of all 'IxFactory' pointer QMutex m_oMutexFactoryX; //!< Mutex -> 'QxFactoryX' is thread-safe private: QxFactoryX() : QxSingleton("qx::QxFactoryX") { ; } virtual ~QxFactoryX() { ; } QHash *getAllFactory() { return (&m_mapFactoryX); } void registerFactory(const QString &sKey, IxFactory *pFactory); void unregisterFactory(const QString &sKey); qx::any createObject(const QString &sKey, bool bRawPointer = false) const; void *createObjectNudePtr(const QString &sKey) const; #ifndef _QX_NO_RTTI const std::type_info &typeInfo(const QString &sKey) const; #endif // _QX_NO_RTTI static inline qx::any createInstance(const QString &sKey, bool bRawPointer = false) { return QxFactoryX::getSingleton()->createObject(sKey, bRawPointer); } static inline void *createInstanceNudePtr(const QString &sKey) { return QxFactoryX::getSingleton()->createObjectNudePtr(sKey); } #ifndef _QX_NO_RTTI static inline const std::type_info &getTypeInfo(const QString &sKey) { return QxFactoryX::getSingleton()->typeInfo(sKey); } #endif // _QX_NO_RTTI }; /*! * \ingroup QxFactory * \brief Return a smart-pointer new instance of object (std::shared_ptr) associated by key sKey using qx::any type (for example : qx::create("drug") return a new instance of smart-pointer drug class into qx::any type) */ inline qx::any create(const QString &sKey, bool bRawPointer /* = false */) { return qx::QxFactoryX::createInstance(sKey, bRawPointer); } /*! * \ingroup QxFactory * \brief Return a nude pointer (be careful with memory leak) of type T associated by key sKey, or return NULL if sKey is not registered into factory engine */ template inline T *create_nude_ptr(const QString &sKey) #ifdef _QX_NO_RTTI { return static_cast(qx::QxFactoryX::createInstanceNudePtr(sKey)); } #else // _QX_NO_RTTI { return dynamic_cast(static_cast(qx::QxFactoryX::createInstanceNudePtr(sKey))); } #endif // _QX_NO_RTTI /*! * \ingroup QxFactory * \brief Return a void * pointer (be careful with memory leak) associated by key sKey, or return NULL if sKey is not registered into factory engine */ inline void *create_void_ptr(const QString &sKey) { return qx::QxFactoryX::createInstanceNudePtr(sKey); } } // namespace qx QX_DLL_EXPORT_QX_SINGLETON_HPP(qx::QxFactoryX) #endif // _QX_FACTORY_X_H_