mirror of
https://github.com/akaAgar/the-universal-mission-for-dcs-world.git
synced 2025-11-25 19:31:01 +00:00
251 lines
7.0 KiB
Lua
251 lines
7.0 KiB
Lua
-- ====================================================================================
|
|
-- DCSEX.TABLE - FUNCTIONS RELATED TO TABLE MANIPULATION
|
|
-- ====================================================================================
|
|
-- DCSEx.table.contains(t, val)
|
|
-- DCSEx.table.containsKey(t, k)
|
|
-- DCSEx.table.containsAll(t, values)
|
|
-- DCSEx.table.containsAny(t, values)
|
|
-- DCSEx.table.containsAllKeys(t, keys)
|
|
-- DCSEx.table.containsAnyKeys(t, keys)
|
|
-- DCSEx.table.countNonNils(t)
|
|
-- DCSEx.table.deepCopy(orig)
|
|
-- DCSEx.table.dump(t)
|
|
-- DCSEx.table.getKeyFromValue(t, val)
|
|
-- DCSEx.table.getKeys(t)
|
|
-- DCSEx.table.getRandom(t)
|
|
-- DCSEx.table.getRandomIndex(t)
|
|
-- DCSEx.table.shuffle(t)
|
|
-- ====================================================================================
|
|
|
|
DCSEx.table = {}
|
|
|
|
-------------------------------------
|
|
-- Returns true if table t contains value val
|
|
-------------------------------------
|
|
-- @param t A table
|
|
-- @param val A value
|
|
-- @return True if the table contains the value, false otherwise
|
|
-------------------------------------
|
|
function DCSEx.table.contains(t, val)
|
|
if not t then return false end
|
|
|
|
for _,v in pairs(t) do
|
|
if v == val then return true end
|
|
end
|
|
|
|
return false
|
|
end
|
|
|
|
-------------------------------------
|
|
-- Returns true if table t contains key k
|
|
-------------------------------------
|
|
-- @param t A table
|
|
-- @param k A key
|
|
-- @return True if the table contains the key, false otherwise
|
|
-------------------------------------
|
|
function DCSEx.table.containsKey(t, k)
|
|
if not t then return false end
|
|
if t[k] then return true end
|
|
|
|
return false
|
|
end
|
|
|
|
-------------------------------------
|
|
-- Returns true if table t contains ALL values from the "values" table
|
|
-------------------------------------
|
|
-- @param t A table
|
|
-- @param values A table of values
|
|
-- @return True if the table contains ALL values, false otherwise
|
|
-------------------------------------
|
|
function DCSEx.table.containsAll(t, values)
|
|
if not t then return false end
|
|
|
|
for _,v in pairs(values) do
|
|
if not DCSEx.table.contains(t, v) then
|
|
return false
|
|
end
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
-------------------------------------
|
|
-- Returns true if table t contains AT LEAST ONE value from the "values" table
|
|
-------------------------------------
|
|
-- @param t A table
|
|
-- @param values A table of values
|
|
-- @return True if the table contains AT LEAST ONE value, false otherwise
|
|
-------------------------------------
|
|
function DCSEx.table.containsAny(t, values)
|
|
if not t then return false end
|
|
|
|
for _,v in pairs(values) do
|
|
if DCSEx.table.contains(t, v) then
|
|
return true
|
|
end
|
|
end
|
|
|
|
return false
|
|
end
|
|
|
|
-------------------------------------
|
|
-- Returns true if table t contains ALL keys from the "keys" table
|
|
-------------------------------------
|
|
-- @param t A table
|
|
-- @param keys A table of keys
|
|
-- @return True if the table contains ALL keys, false otherwise
|
|
-------------------------------------
|
|
function DCSEx.table.containsAllKeys(t, keys)
|
|
if not t then return false end
|
|
|
|
for _,k in pairs(keys) do
|
|
if not DCSEx.table.containsKey(t, k) then
|
|
return false
|
|
end
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
-------------------------------------
|
|
-- Returns true if table t contains AT LEAST ONE key from the "keys" table
|
|
-------------------------------------
|
|
-- @param t A table
|
|
-- @param values A table of keys
|
|
-- @return True if the table contains AT LEAST ONE key, false otherwise
|
|
-------------------------------------
|
|
function DCSEx.table.containsAnyKeys(t, keys)
|
|
if not t then return false end
|
|
|
|
for _,k in pairs(keys) do
|
|
if DCSEx.table.containsKey(t, k) then
|
|
return true
|
|
end
|
|
end
|
|
|
|
return false
|
|
end
|
|
|
|
-------------------------------------
|
|
-- Returns the number of non-nils elements in a table
|
|
-------------------------------------
|
|
-- @param t A table
|
|
-- @return A number
|
|
-------------------------------------
|
|
function DCSEx.table.countNonNils(t)
|
|
local count = 0
|
|
for _,v in pairs(t) do
|
|
if v ~= nil then count = count + 1 end
|
|
end
|
|
|
|
return count
|
|
end
|
|
|
|
-------------------------------------
|
|
-- Returns a deep copy of the table, doesn't work with recursive tables (code from http://lua-users.org/wiki/CopyTable)
|
|
-------------------------------------
|
|
-- @param orig A table
|
|
-- @return A deep copied clone of the table
|
|
-------------------------------------
|
|
function DCSEx.table.deepCopy(orig)
|
|
-- Not a table
|
|
if type(orig) ~= "table" then
|
|
return orig
|
|
end
|
|
|
|
local copy = {}
|
|
for orig_key, orig_value in next, orig, nil do
|
|
copy[DCSEx.table.deepCopy(orig_key)] = DCSEx.table.deepCopy(orig_value)
|
|
end
|
|
setmetatable(copy, DCSEx.table.deepCopy(getmetatable(orig)))
|
|
|
|
return copy
|
|
end
|
|
|
|
-------------------------------------
|
|
-- Dumps the content of a table as a string
|
|
-------------------------------------
|
|
-- @param orig A table
|
|
-- @return A string representaton of the table
|
|
-------------------------------------
|
|
function DCSEx.table.dump(t)
|
|
if type(t) == 'table' then
|
|
local s = '{ '
|
|
for k,v in pairs(t) do
|
|
if type(k) ~= 'number' then k = '"'..k..'"' end
|
|
s = s .. '['..k..'] = ' .. DCSEx.table.dump(v) .. ','
|
|
end
|
|
return s .. '} '
|
|
else
|
|
return tostring(t)
|
|
end
|
|
end
|
|
|
|
-------------------------------------
|
|
-- Returns the key associated to a value in a table, or nil if not found
|
|
-------------------------------------
|
|
-- @param t A table
|
|
-- @param val A value
|
|
-- @return The key associated to this value in the table, or nil
|
|
-------------------------------------
|
|
function DCSEx.table.getKeyFromValue(t, val)
|
|
for k, v in pairs(t) do
|
|
if v == val then return k end
|
|
end
|
|
return nil
|
|
end
|
|
|
|
-------------------------------------
|
|
-- Returns all the keys in an associative table
|
|
-------------------------------------
|
|
-- @param t A table
|
|
-- @return An array of keys
|
|
-------------------------------------
|
|
function DCSEx.table.getKeys(t)
|
|
local keys = {}
|
|
local n = 1
|
|
|
|
for k,_ in pairs(t) do
|
|
keys[n] = k
|
|
n = n + 1
|
|
end
|
|
|
|
table.sort(keys)
|
|
return keys
|
|
end
|
|
|
|
-------------------------------------
|
|
-- Returns a random value from a numerically-indexed table
|
|
-------------------------------------
|
|
-- @param t A table
|
|
-- @return A random element from the table
|
|
-------------------------------------
|
|
function DCSEx.table.getRandom(t)
|
|
return t[math.random(#t)]
|
|
end
|
|
|
|
-------------------------------------
|
|
-- Returns a random index from a numerically-indexed table
|
|
-------------------------------------
|
|
-- @param t A table
|
|
-- @return A random index from the table
|
|
-------------------------------------
|
|
function DCSEx.table.getRandomIndex(t)
|
|
return math.random(#t)
|
|
end
|
|
|
|
-------------------------------------
|
|
-- Randomly shuffles a numerically-indexed table
|
|
-------------------------------------
|
|
-- @param t A table
|
|
-- @return A table with shuffled values
|
|
-------------------------------------
|
|
function DCSEx.table.shuffle(t)
|
|
local len, random = #t, math.random
|
|
for i = len, 2, -1 do
|
|
local j = random(1, i)
|
|
t[i], t[j] = t[j], t[i]
|
|
end
|
|
return t
|
|
end
|