--- 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