/** * * @file FITKOperatorRepo.h * @brief 操作器仓库声明 * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-03-04 * */ #ifndef __FITK_OPERATOR_REPO_H__ #define __FITK_OPERATOR_REPO_H__ #include "FITKCoreAPI.h" #include "FITKCoreMacros.h" #include "FITKAbstractObject.hpp" #include #include #include #include #include namespace Core { class FITKAbstractOperator; class FITKOperatorRepoPrivate; class FITKOperatorDeletor; /** * @brief 操作器仓库声明 * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-03-04 */ class FITKCoreAPI FITKOperatorRepo : public FITKAbstractObject { friend FITKOperatorDeletor; //声明为单例 DeclSingleton(FITKOperatorRepo); /** * @brief 获取操作器,不存在的直接创建,存在的返回原有对象 * @param[i] key Operator注册的关键字 * @return FITKAbstractOperator* * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-03-04 */ FITKAbstractOperator* getOperator(const QString& key); template /** * @brief 获取操作器并转换为T类型,不存在的直接创建,存在的返回原有对象 * @param[i] key Operator注册的关键字 * @return FITKAbstractOperator* * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-03-04 */ T* getOperatorT(const QString& key) { return dynamic_cast (this->getOperator(key)); } private: /** * @brief 初始化 * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-03-04 */ void initialize(); /** * @brief 结束,析构函数调用 * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-07-17 */ void finalize(); private: /** * @brief 注册进来的创建operator函数 * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-03-04 */ QHash> _createFuns{}; /** * @brief 实际执行创建操作 * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-03-04 */ FITKOperatorRepoPrivate* _private{}; public: template < typename T > /** * @brief 注册器 * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-03-03 */ class FITKOperatorRepoRegHelper { public: FITKOperatorRepoRegHelper(QString key) { auto ins = FITKOperatorRepo::getInstance(); qDebug() << key; // 注册构造函数,T类型必须有默认的无参构造函数 ins->_createFuns.insert( key, [&] { return new T; }); } }; }; } /** * @brief 声明注册宏 * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-03-03 */ #ifndef Register2FITKOPeratorRepo #define Register2FITKOPeratorRepo(key,Class,...) \ static Core::FITKOperatorRepo::FITKOperatorRepoRegHelper< Class > \ _FITKDataIORegHelper_##key##_##Class##__VA_ARGS__(#key) #endif /** * @brief 访问单例宏 * @author LiBaojun (libaojunqd@foxmail.com) * @date 2024-03-04 */ #ifndef FITKOPERREPO #define FITKOPERREPO Core::FITKOperatorRepo::getInstance() #endif // !FITKOPERREPO #endif // !__FITK_OPERATOR_REPO_H__