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.
|
|
|
|
#include "FITKOperatorRepoPrivate.h"
|
|
|
|
|
#include "FITKAbstractOperator.h"
|
|
|
|
|
|
|
|
|
|
namespace Core
|
|
|
|
|
{
|
|
|
|
|
FITKOperatorRepoPrivate::FITKOperatorRepoPrivate(QHash<QString, std::function<FITKAbstractOperator*()>>& funs)
|
|
|
|
|
:_createFuns(funs)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FITKOperatorRepoPrivate::~FITKOperatorRepoPrivate()
|
|
|
|
|
{
|
|
|
|
|
//遍历释放全部存在的operator
|
|
|
|
|
QList<FITKAbstractOperator*> opers = _existOperators.values();
|
|
|
|
|
for (auto oper : opers)
|
|
|
|
|
if(oper != nullptr)
|
|
|
|
|
delete oper;
|
|
|
|
|
//容器清空
|
|
|
|
|
_existOperators.clear();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Core::FITKAbstractOperator* FITKOperatorRepoPrivate::getOperator(const QString & key)
|
|
|
|
|
{
|
|
|
|
|
//如果已经存在则返回原来的operator
|
|
|
|
|
if (_existOperators.contains(key))
|
|
|
|
|
return _existOperators.value(key);
|
|
|
|
|
//不存在则直接创建
|
|
|
|
|
return this->createOperator(key);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Core::FITKAbstractOperator* FITKOperatorRepoPrivate::createOperator(const QString & key)
|
|
|
|
|
{
|
|
|
|
|
//查找创建函数
|
|
|
|
|
auto fun = _createFuns.value(key);
|
|
|
|
|
if (!fun) return nullptr;
|
|
|
|
|
//执行创建操作
|
|
|
|
|
FITKAbstractOperator* op = fun();
|
|
|
|
|
if (op == nullptr) return nullptr;
|
|
|
|
|
//纳入到容器管理,并关联槽函数
|
|
|
|
|
_existOperators.insert(key, op);
|
|
|
|
|
connect(op, &FITKAbstractOperator::operatorDestoryedSig,
|
|
|
|
|
this, &FITKOperatorRepoPrivate::operatorDestoryedSlot);
|
|
|
|
|
return op;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FITKOperatorRepoPrivate::operatorDestoryedSlot(FITKAbstractOperator* oper)
|
|
|
|
|
{
|
|
|
|
|
//operator被释放 delete
|
|
|
|
|
const QString name = _existOperators.key(oper);
|
|
|
|
|
if (!_existOperators.contains(name)) return;
|
|
|
|
|
//直接从管理器移除,不要重复delete
|
|
|
|
|
_existOperators.remove(name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|