evolved.id alias

This commit is contained in:
BlackMATov
2024-11-23 10:52:30 +07:00
parent 61d0d0792e
commit 390bbd4f3b
2 changed files with 24 additions and 22 deletions

View File

@@ -6,11 +6,11 @@
``` ```
idpools.idpool -> (idpool) idpools.idpool -> (idpool)
idpools.pack -> integer -> integer -> (integer) idpools.pack -> integer -> integer -> (id)
idpools.unpack -> integer -> (integer, integer) idpools.unpack -> id -> (integer, integer)
idpools.acquire -> idpool -> (integer) idpools.acquire -> idpool -> (id)
idpools.release -> idpool -> integer -> () idpools.release -> idpool -> id -> ()
idpools.is_alive -> idpool -> integer -> (boolean) idpools.is_alive -> idpool -> id -> (boolean)
``` ```
### Module `registry` ### Module `registry`

View File

@@ -1,8 +1,10 @@
---@class evolved.idpools ---@class evolved.idpools
local idpools = {} local idpools = {}
---@alias evolved.id integer
---@class evolved.idpool ---@class evolved.idpool
---@field package __acquired_ids integer[] ---@field package __freelist_ids evolved.id[]
---@field package __available_index integer ---@field package __available_index integer
local evolved_idpool_mt = {} local evolved_idpool_mt = {}
evolved_idpool_mt.__index = evolved_idpool_mt evolved_idpool_mt.__index = evolved_idpool_mt
@@ -11,7 +13,7 @@ evolved_idpool_mt.__index = evolved_idpool_mt
function idpools.idpool() function idpools.idpool()
---@type evolved.idpool ---@type evolved.idpool
local idpool = { local idpool = {
__acquired_ids = {}, __freelist_ids = {},
__available_index = 0, __available_index = 0,
} }
return setmetatable(idpool, evolved_idpool_mt) return setmetatable(idpool, evolved_idpool_mt)
@@ -19,14 +21,14 @@ end
---@param index integer ---@param index integer
---@param version integer ---@param version integer
---@return integer ---@return evolved.id
function idpools.pack(index, version) function idpools.pack(index, version)
assert(index >= 1 and index <= 0xFFFFF, 'id index out of range [1;0xFFFFF]') assert(index >= 1 and index <= 0xFFFFF, 'id index out of range [1;0xFFFFF]')
assert(version >= 1 and version <= 0x7FF, 'id version out of range [1;0x7FF]') assert(version >= 1 and version <= 0x7FF, 'id version out of range [1;0x7FF]')
return index + version * 0x100000 return index + version * 0x100000
end end
---@param id integer ---@param id evolved.id
---@return integer index ---@return integer index
---@return integer version ---@return integer version
function idpools.unpack(id) function idpools.unpack(id)
@@ -36,39 +38,39 @@ function idpools.unpack(id)
end end
---@param idpool evolved.idpool ---@param idpool evolved.idpool
---@return integer ---@return evolved.id
---@nodiscard ---@nodiscard
function idpools.acquire(idpool) function idpools.acquire(idpool)
if idpool.__available_index ~= 0 then if idpool.__available_index ~= 0 then
local index = idpool.__available_index local index = idpool.__available_index
local available_id = idpool.__acquired_ids[index] local freelist_id = idpool.__freelist_ids[index]
idpool.__available_index = available_id % 0x100000 idpool.__available_index = freelist_id % 0x100000
local version = available_id - idpool.__available_index local version = freelist_id - idpool.__available_index
local acquired_id = index + version local acquired_id = index + version
idpool.__acquired_ids[index] = acquired_id idpool.__freelist_ids[index] = acquired_id
return acquired_id return acquired_id
else else
if #idpool.__acquired_ids == 0xFFFFF then if #idpool.__freelist_ids == 0xFFFFF then
error('id index overflow', 2) error('id index overflow', 2)
end end
local index = #idpool.__acquired_ids + 1 local index = #idpool.__freelist_ids + 1
local version = 0x100000 local version = 0x100000
local acquired_id = index + version local acquired_id = index + version
idpool.__acquired_ids[index] = acquired_id idpool.__freelist_ids[index] = acquired_id
return acquired_id return acquired_id
end end
end end
---@param idpool evolved.idpool ---@param idpool evolved.idpool
---@param id integer ---@param id evolved.id
function idpools.release(idpool, id) function idpools.release(idpool, id)
local index = id % 0x100000 local index = id % 0x100000
local version = id - index local version = id - index
if idpool.__acquired_ids[index] ~= id then if idpool.__freelist_ids[index] ~= id then
error('id is not acquired or already released', 2) error('id is not acquired or already released', 2)
end end
@@ -76,17 +78,17 @@ function idpools.release(idpool, id)
and 0x100000 and 0x100000
or version + 0x100000 or version + 0x100000
idpool.__acquired_ids[index] = idpool.__available_index + version idpool.__freelist_ids[index] = idpool.__available_index + version
idpool.__available_index = index idpool.__available_index = index
end end
---@param idpool evolved.idpool ---@param idpool evolved.idpool
---@param id integer ---@param id evolved.id
---@return boolean ---@return boolean
---@nodiscard ---@nodiscard
function idpools.is_alive(idpool, id) function idpools.is_alive(idpool, id)
local index = id % 0x100000 local index = id % 0x100000
return idpool.__acquired_ids[index] == id return idpool.__freelist_ids[index] == id
end end
return idpools return idpools