61 lines
1.1 KiB
C++
61 lines
1.1 KiB
C++
#include "IDGenerator.h"
|
||
|
||
#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;
|
||
}
|