batteries/unique_mapping.lua
2020-01-31 11:56:37 +11:00

42 lines
870 B
Lua

--generate a mapping from unique values to plain numbers
--useful for arbitrarily ordering things that don't have
--a natural ordering implied (eg textures for batching)
local unique_mapping = {}
unique_mapping.mt = {
__index = unique_mapping,
__mode = "kv", --weak refs
}
--(used as storage for non-weak data)
local _MAP_VARS = setmetatable({}, {
__mode = "k" --only keys are weak
})
function unique_mapping:new()
local r = setmetatable({}, unique_mapping.mt)
--set up the actual vars
_MAP_VARS[r] = {
current_index = 0,
}
return r
end
function unique_mapping:_increment()
local vars = _MAP_VARS[self]
vars.current_index = vars.current_index + 1
return vars.current_index
end
function unique_mapping:map(value)
local val = self[value]
if val then
return val
end
local i = self:_increment()
self[value] = i
return i
end
return unique_mapping