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/FITKCore/FITKAbstractDataObject.cpp

133 lines
3.4 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.

#include "FITKAbstractDataObject.h"
#include "FITKDataRepo.h"
#include <QMutex>
#include <QMutexLocker>
namespace Core
{
static int ID = 0;
static QMutex MUTEX;
FITKAbstractDataObject::FITKAbstractDataObject(const int pid )
{
QMutexLocker locker(&MUTEX);
//自动分配ID
_absDataID = FITKAbstractDataIDAlter::GetAValidDataID();
ID = ID > _absDataID ? ID : _absDataID;
_parentDataID = pid;
//存储到全局数据仓库
FITKDataRepo::getInstance()->addDataObj(this);
}
FITKAbstractDataObject::~FITKAbstractDataObject()
{
//触发对象释放信号
emit dataObjectDestoried(this);
//移出全局数据仓库
FITKDataRepo::getInstance()->removeDataObj(this);
}
int FITKAbstractDataObject::getDataObjectID() const
{
return _absDataID;
}
void FITKAbstractDataObject::setParentDataID(const int id)
{
_parentDataID = id;
}
int FITKAbstractDataObject::getParentDataID() const
{
return _parentDataID;
}
QVariant FITKAbstractDataObject::getUserData(int userData)
{
return _userData.value(userData);
}
void FITKAbstractDataObject::setUserData(int ud, QVariant va)
{
//键值重复直接覆盖
_userData.insert(ud, va);
}
QList<int> FITKAbstractDataObject::getUserDataKeys()
{
return _userData.uniqueKeys();
}
bool FITKAbstractDataObject::copy(FITKAbstractDataObject* obj)
{
//拷贝父对象
_parentDataID = obj->getParentDataID();
//拷贝用户数据
QList<int > ks = obj->getUserDataKeys();
for (int k : ks)
{
QVariant v = obj->getUserData(k);
this->setUserData(k, v);
}
return true;
}
FITKAbstractDataObject* FITKAbstractDataObject::getParentObject()
{
return FITKDATAREPO->getDataByID(_parentDataID);
}
void FITKAbstractDataObject::ResetMaxID(const int maxid /*=0*/)
{
ID = maxid;
}
int FITKAbstractDataObject::GetMaxID()
{
return ID;
}
void FITKAbstractDataObject::setAbsDataID(const int id)
{
_absDataID = id;
//自动调大ID
ID = _absDataID > ID ? _absDataID : ID;
}
bool FITKAbstractDataIDAlter::modifyDataID(FITKAbstractDataObject* d, const int id)
{
if (d == nullptr) return false;
//判断ID是否被占用
FITKAbstractDataObject* dobj = FITKDATAREPO->getDataByID(id);
//id被占用
if (dobj != nullptr)
{
int validID = this->GetAValidDataID();
FITKAbstractDataIDAlter alter;
alter.modifyDataID(dobj, validID);
//重置最大ID
FITKAbstractDataObject::ResetMaxID(++validID);
}
//修改原始数据ID
d->setAbsDataID(id);
int maxID = FITKAbstractDataObject::GetMaxID();
maxID = maxID > id ? maxID : id;
//重置最大ID
FITKAbstractDataObject::ResetMaxID(maxID);
return true;
}
int FITKAbstractDataIDAlter::GetAValidDataID()
{
int id = FITKAbstractDataObject::GetMaxID();
//数据仓库不存在这个ID否则自增一直找到没有被占用的ID
while (FITKDATAREPO->getDataByID(id) != nullptr)
++id;
return id;
}
}