2025-06-23 18:01:09 +08:00
|
|
|
|
#include "IDGenerator.h"
|
2025-06-23 10:41:33 +08:00
|
|
|
|
|
|
|
|
|
#include <QDataStream>
|
|
|
|
|
#include <QVariant>
|
|
|
|
|
#include<QIODevice>
|
|
|
|
|
|
|
|
|
|
qint64 IDGenerator::new_id()
|
|
|
|
|
{
|
|
|
|
|
if (!m_recycle_id.isEmpty())
|
|
|
|
|
{
|
|
|
|
|
int id = m_recycle_id.begin().key();
|
|
|
|
|
m_recycle_id.erase(m_recycle_id.begin());
|
|
|
|
|
return id;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(!m_use_id.isEmpty())
|
|
|
|
|
{
|
|
|
|
|
while (m_use_id.contains(m_id))
|
|
|
|
|
{
|
|
|
|
|
m_id++;
|
|
|
|
|
}
|
|
|
|
|
return m_id;
|
|
|
|
|
}
|
|
|
|
|
return m_id++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void IDGenerator::recylce_id(qint64 id)
|
|
|
|
|
{
|
|
|
|
|
m_recycle_id.insert(id, 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
qint64 IDGenerator::next_id()
|
|
|
|
|
{
|
|
|
|
|
if (!m_recycle_id.isEmpty())
|
|
|
|
|
{
|
|
|
|
|
int id = m_recycle_id.cbegin().key();
|
|
|
|
|
return id;
|
|
|
|
|
}
|
|
|
|
|
return m_id;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void IDGenerator::use_id(qint64 id)
|
|
|
|
|
{
|
|
|
|
|
m_use_id.insert(id, 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QByteArray IDGenerator::to_bytes() const
|
|
|
|
|
{
|
|
|
|
|
QByteArray bytes;
|
|
|
|
|
QDataStream stream(&bytes, QIODevice::WriteOnly);
|
|
|
|
|
stream << m_id << m_recycle_id;
|
|
|
|
|
return bytes.toBase64(); //目的:QVariant转换成字符串时会截断'\0'
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void IDGenerator::from_bytes(const QByteArray& bytes)
|
|
|
|
|
{
|
|
|
|
|
QByteArray _bytes = QByteArray::fromBase64(bytes);
|
|
|
|
|
QDataStream stream(&_bytes, QIODevice::ReadOnly);
|
|
|
|
|
stream >> m_id >> m_recycle_id;
|
|
|
|
|
}
|