sirnii's picture
Upload 1816 files
b6a38d7 verified
raw
history blame
7.92 kB
--- Search an array for a given value
-- Returns the index of the value in the array or nil
-- @cstyle int table.find(table array, string field, auto value)
-- @param array; table to search in
-- @param field; optional parameter, field to search with
-- @param value; value to search for)
-- @return index
function table.find(array, field, value)
--[[
if not array then return end
if value == nil then
value = field
for i = 1, #array do
if value == array[i] then return i end
end
else
for i = 1, #array do
if type(array[i]) ~= "boolean" and value == array[i][field] then return i end
end
end
--]]
end
--- Search an array of arrays for a value that starts with the values provided as extra parameters
-- Returns the sub_array and the index of the sub_array in the array or nil
-- @cstyle int table.ifind(table array, ...)
-- @param array; table to search in
-- @param ...; values to search for
-- @return sub_array, index
function table.ifind(array, ...)
--[[
for i, sub_array in ipairs(array) do
local found = true
for j = 1, select("#", ...) do
if sub_array[j] ~= select(j, ...) then
found = false
break
end
end
if found then return sub_array, i end
end
--]]
end
--- Search an array for the first element that matches a condition
-- Returns the index of the first matching element or nil
-- @param array; table to search in
-- @param predicate; function that return true for matching elements, getting (idx, value, ...) as parameters
-- @cstyle int table.findfirst(table array, function predicate, ...)
function table.findfirst(array, predicate, ...)
end
--- Count the elements into a table
-- See table.find for parameter details
-- As the second parameter, you may provide a predicate function to count key/value pairs that satisfy a condition
-- This function receives parameters (key, value, ...) where ... are all the rest of the table.count parameters
function table.count(array, field_or_fn, value)
end
--- Count the elements in an array
-- See table.find for parameter details
-- As the second parameter, you may provide a predicate function to count key/value pairs that satisfy a condition
-- This function receives parameters (key, value, ...) where ... are all the rest of the table.count parameters
function table.icount(array, field_or_fn, value)
end
--- Sort the elements of a table (acscending) according to a member value (a.field < b.field)
function table.sortby_field(array, field)
end
--- Sort the elements of a table (descending) according to a member value (a.field > b.field)
function table.sortby_field_descending(array, field)
end
--- Sort a table of points / objects (acscending) according to the distаnce to a position
function table.sortby_dist(array, pos)
end
--- Sort a table of points / objects (acscending) according to the 2D distаnce to a position
function table.sortby_dist2D(array, pos)
end
--- Get the closest pos / object from a table of points / objects according to the distаnce to another pos / object
function table.closest(array, pos)
end
--- Get the closest pos / object from a table of points / objects according to the 2D distаnce to a another pos / object
function table.closest2D(array, pos)
end
--- Get the farthest pos / object from a table of points / objects according to the distаnce to another pos / object
function table.farthest(array, pos)
end
--- Get the farthest pos / object from a table of points / objects according to the 2D distаnce to a another pos / object
function table.farthest2D(array, pos)
end
--- Set table[param1][param2]..[paramN-1] = paramN
function table.set(t, param1, param2, ...)
end
--- Returns table[param1][param2]..[paramN]
function table.get(t, key, ...)
end
--- Same as table.get but also supports calling methods
-- examples:
-- table.fget(obj, "GetParam") is obj.GetParam
-- table.fget(obj, "GetParam", "()") is obj:GetParam()
-- table.fget(obj, "GetParam", "()", param2) is obj:GetParam()[param2]
-- table.fget(obj, "GetParam", "(", param2, ")") is obj:GetParam(param2)
-- table.fget(obj, "GetParam", "(", param2, ")", param3) is obj:GetParam(param2)[param3]
-- table.fget(obj, "GetParam", "(", ...) is obj:GetParam(...)
function table.fget(t, key, call, ...)
end
function table.clear(t, keep_reserved_memory)
--[[
if t then
for member in pairs(t) do
t[member] = nil
end
end
return t
--]]
end
function table.iclear(t, from)
--[[
if t then
from = from or 1
for i=#t,from,-1 do
t[i] = nil
end
end
return t
--]]
end
function table.iequal(t1, t2)
--[[
if #t1 ~= #t2 then
return
end
for i=1,#t1 do
if t1[i] ~= t2[i] then
return
end
end
return true
--]]
end
--- Performs a weighted random on the table elements
-- Returns random element, its index and the used seed
-- @cstyle int table.weighted_rand(table tbl, function calc_weight, int seed)
-- @param tbl; table to rand
-- @param calc_weight; weight compute function or member name
-- @param seed; optional random seed parameter. A random value by default.
-- @return tbl[idx], idx, new_seed
function table.weighted_rand(tbl, calc_weight, seed)
--[[
seed = seed or AsyncRand()
local accum_weight = 0
for i=1,#tbl do
accum_weight = accum_weight + calc_weight(tbl[i])
end
if accum_weight == 0 then
return nil, nil, seed
end
local idx = #tbl
if #tbl > 1 then
local target_weight
target_weight, seed = BraidRandom(seed, accum_weight)
accum_weight = 0
for i=1,#tbl-1 do
accum_weight = accum_weight + calc_weight(tbl[i])
if accum_weight > target_weight then
idx = i
break
end
end
end
return tbl[idx], idx, seed
--]]
end
--- Copy the array part of a table
-- @cstyle table table.icopy(table t, bool deep = true)
function table.icopy(t, deep)
--[[
local copy = {}
for i = 1, #t do
local v = t[i]
if deep and type(v) == "table" then v = table.icopy(v, deep) end
copy[i] = v
end
return copy
--]]
end
--- Extracts the keys of a table into an array
-- @cstyle table table.keys(table t, bool sorted = false)
function table.keys(t, sorted)
--[[
local res = {}
if t and next(t) then
for k in pairs(t) do
res[#res+1] = k
end
if sorted then
table.sort(res)
end
end
return res
--]]
end
--- Inverts a table
-- @cstyle table table.invert(table t)
function table.invert(t)
--[[
local t2 = {}
for k, v in pairs(t) do
t2[v] = k
end
return t2
--]]
end
--- Compare the values in two tables (deep)
-- @cstyle bool table.equal_values(table t1, table t2)
function table.equal_values(t1, t2)
end
--- Append the key-value pairs from t2 in t1
-- @cstyle void table.append(table t1, table t2, bool forced)
function table.append(t1, t2, forced)
--[[
for key, value in pairs(t2 or empty_table) do
if forced or t1[key] == nil then
t1[key] = value
end
end
return t1
end
--]]
end
--- Overwrites the key-value pairs from t2 in t1
-- @cstyle void table.overwrite(table t1, table t2)
function table.overwrite(t1, t2)
--[[
for key, value in pairs(t2 or empty_table) do
t1[key] = value
end
return t1
end
--]]
end
--- Set the specified key-value pairs from src in dest
-- @cstyle void table.set_values(table dest, table src, string key1, string key2, ...)
function table.set_values(raw, dest, src, key1, key2, ...)
--[[
for _, key in ipairs{key1, key2, ...} do
dest[key] = src[key]
end
end
--]]
end
--- Set the specified key-value pairs from src in dest using raw access without metamethods
-- @cstyle void table.rawset_values(table dest, table src, string key1, string key2, ...)
function table.rawset_values(dest, src, key1, key2, ...)
--[[
for _, key in ipairs{key1, key2, ...} do
rawset(dest, key, rawget(src, key))
end
end
--]]
end
-- Removes all invalid objects from an array
function table.validate(t)
--[[
for i = #(t or ""), 1, -1 do
if not IsValid(t[i]) then
remove(t, i)
end
end
return t
--]]
end