mirror of
https://github.com/BlackMATov/evolved.lua.git
synced 2025-12-13 11:38:15 +07:00
evolved.id alias
This commit is contained in:
10
README.md
10
README.md
@@ -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`
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user