You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
AppFlow/FITK_Kernel/FITKAppFramework/FITKProgramDriverFactory.h

138 lines
3.9 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/**
*
* @file FITKProgramDriverFactory.h
* @brief 第三方程序驱动工厂
* @author libaojun (libaojunqd@Foxmail.com)
* @date 2024-06-09
*
*/
#ifndef _FITK_PROGRAMDRIVER_FACTORY_H___
#define _FITK_PROGRAMDRIVER_FACTORY_H___
#include "FITKAppFrameworkAPI.h"
#include "FITK_Kernel/FITKCore/FITKCoreMacros.h"
#include "FITK_Kernel/FITKCore/FITKAbstractObject.hpp"
#include <QMutex>
#include <QStringList>
namespace AppFrame
{
class FITKAbstractProgramerDriver;
/**
* @brief 驱动器创建函数
* @author LiBaojun (libaojunqd@foxmail.com)
* @date 2024-06-10
*/
#ifndef DRIVERTypeFuns
#define DRIVERTypeFuns QHash<QString,std::function<FITKAbstractProgramerDriver*()> >
#endif
class FITKProgramDriverFactoryDeleator;
/**
* @brief 第三方程序驱动工厂声明
* @author libaojun (libaojunqd@Foxmail.com)
* @date 2024-06-09
*/
class FITKAppFrameworkAPI FITKProgramDriverFactory
: public Core::FITKAbstractObject
{
friend FITKProgramDriverFactoryDeleator;
//声明为单例
DeclSingleton(FITKProgramDriverFactory);
public:
/**
* @brief 获取注册到工厂的驱动器类型
* @return QList<int>
* @author libaojun (libaojunqd@Foxmail.com)
* @date 2024-06-15
*/
QList<int> getProgramTypes();
/**
* @brief 根据类型获取驱动器名称列表
* @param[i] driverType 驱动器类型
* @return QStringList
* @author libaojun (libaojunqd@Foxmail.com)
* @date 2024-06-15
*/
QStringList getProgramDrivers(const int driverType);
/**
* @brief 获取驱动器创建函数指针
* @param[i] t 类型
* @param[i] driver 名称
* @return std::function<FITKAbstractProgramerDriver*()>
* @author libaojun (libaojunqd@Foxmail.com)
* @date 2024-06-15
*/
std::function<FITKAbstractProgramerDriver*()> getDriverCreateFun(const int t, const QString driver);
private:
/**
* @brief 初始化
* @author libaojun (libaojunqd@Foxmail.com)
* @date 2024-06-09
*/
void initialize();
/**
* @brief 结束,析构函数调用
* @author LiBaojun (libaojunqd@foxmail.com)
* @date 2024-07-17
*/
void finalize();
private:
/**
* @brief 创建驱动器的函数指针
* @author LiBaojun (libaojunqd@foxmail.com)
* @date 2024-06-10
*/
QHash<int, DRIVERTypeFuns> _createFuns{};
public:
template < typename T >
/**
* @brief 注册器
* @author LiBaojun (libaojunqd@foxmail.com)
* @date 2024-06-10
*/
class FITKDriverRegHelper
{
public:
FITKDriverRegHelper(int type, QString driverName)
{
auto ins = FITKProgramDriverFactory::getInstance();
// 注册构造函数T类型必须有默认的无参构造函数
ins->_createFuns[type][driverName] = ([&] { return new T; });
}
};
};
class FITKProgramDriverFactoryDeleator
{
public:
explicit FITKProgramDriverFactoryDeleator() = default;
virtual ~FITKProgramDriverFactoryDeleator();
};
}
/**
* @brief 声明注册宏,类型(int,抽象定义),驱动器名称
* @author LiBaojun (libaojunqd@foxmail.com)
* @date 2024-06-10
*/
#ifndef Register2FITKProgramDriverFactory
#define Register2FITKProgramDriverFactory( Type,DriverName,T, ...) \
static AppFrame::FITKProgramDriverFactory::FITKDriverRegHelper< T > \
_FITKDriverRegHelper_##T##_##DriverName##__VA_ARGS__(Type, #DriverName);
#endif
#ifndef FITKPROGRAMDRIVERFACTORY
#define FITKPROGRAMDRIVERFACTORY ( AppFrame::FITKProgramDriverFactory::getInstance() )
#endif
#endif