99 lines
2.9 KiB
C++
99 lines
2.9 KiB
C++
#include "ID_Generator.hpp"
|
|
|
|
// 请求ID
|
|
int Independent_ID_Generator::Request_ID()
|
|
{
|
|
// 没有元素时
|
|
if (this->continuous_id_list.size() == 0)
|
|
{
|
|
this->continuous_id_list.push_back({0, 0});
|
|
|
|
// 判定分配情况
|
|
if (this->continuous_id_list.size() == 0)
|
|
return -1;
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
// 第一段未从最小 ID 开启
|
|
auto first_iterator = this->continuous_id_list.begin();
|
|
if (first_iterator->begin != 0)
|
|
{
|
|
if (first_iterator->begin == 1)
|
|
first_iterator->begin--;
|
|
else
|
|
{
|
|
// 划分新段
|
|
size_t pre_size = this->continuous_id_list.size();
|
|
first_iterator = this->continuous_id_list.insert(first_iterator, {0, 0});
|
|
if (!(this->continuous_id_list.size() > pre_size))
|
|
return -1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
// 仅第一段时
|
|
if (this->continuous_id_list.size() == 1)
|
|
{
|
|
first_iterator->end++;
|
|
return first_iterator->end;
|
|
}
|
|
|
|
// 有两段及以上时,判断是否出现合并
|
|
auto second_iterator = first_iterator + 1;
|
|
if (first_iterator->end + 2 == second_iterator->begin)
|
|
{
|
|
int target_id = first_iterator->end + 1;
|
|
first_iterator->end = second_iterator->end;
|
|
this->continuous_id_list.erase(second_iterator);
|
|
return target_id;
|
|
}
|
|
else
|
|
{
|
|
first_iterator->end++;
|
|
return first_iterator->end;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
// 释放ID true-> success / false -> fail
|
|
bool Independent_ID_Generator::Release_ID(const int ID)
|
|
{
|
|
// 遍历查找所属片
|
|
for (auto iterator = this->continuous_id_list.begin(); iterator != this->continuous_id_list.end(); iterator++)
|
|
{
|
|
// 找到对应的ID所属片
|
|
if (ID >= iterator->begin && ID <= iterator->end)
|
|
{
|
|
// 散点删除
|
|
if (iterator->begin == iterator->end)
|
|
this->continuous_id_list.erase(iterator);
|
|
else if (ID == iterator->begin) // 前端点
|
|
iterator->begin++;
|
|
else if (ID == iterator->end) // 后端点
|
|
iterator->end--;
|
|
else // 中间段
|
|
{
|
|
// 插入后返回新的迭代器
|
|
size_t pre_size = this->continuous_id_list.size();
|
|
iterator = this->continuous_id_list.insert(iterator, {iterator->begin, ID - 1});
|
|
|
|
// 判定分配是否成功
|
|
if (!(this->continuous_id_list.size() > pre_size))
|
|
return false;
|
|
|
|
// 记录ID
|
|
iterator++;
|
|
iterator->begin = ID + 1;
|
|
}
|
|
|
|
// 完成并退出
|
|
return true;
|
|
}
|
|
}
|
|
|
|
// 没有找到所属片
|
|
return false;
|
|
}
|