vanilla-wow-addons – Rev 1
?pathlinks?
--[[
--
-- Sea.table
--
-- LUA Table manipulation functions
--
-- $LastChangedBy: karlkfi $
-- $Rev: 2849 $
-- $Date: 2005-12-08 07:21:15 -0600 (Thu, 08 Dec 2005) $
--]]
Sea.table = {
--
-- getValueIndex(table, value)
--
-- Returns the key associated with the value in the table/list.
--
-- Args:
-- (table t, object item)
-- t - table to search
-- item - item to find the index of
--
-- Returns:
-- nil - if empty
-- index - if found
getValueIndex = function (table, item)
if ( table ) then
for k,v in table do
if ( v == item ) then return k; end
end
end
return nil;
end;
--
-- isInTable(table, value )
--
-- Returns:
-- true if the item is in the list/table
-- false if not in the list/table
--
isInTable = function(table, value)
return (Sea.table.getValueIndex(table,value) ~= nil )
end;
--
-- isStringInTableValue(table[string] table, string word)
--
-- Returns:
-- true if word exists in a string value of table
-- false if word is never used
--
-- Aliases:
-- isWordInList()
--
isStringInTableValue = function (table, word)
if ( type(table) == "nil" ) then return false; end
for k,v in table do
if ( type(v) == "string" ) then
if ( string.find(word,v) ~= nil ) then
return true;
end
end
end
return false;
end;
--
-- Aliases:
-- Sea.table.getIndexInList
-- Sea.list.getIndexInList
--
--
-- push( table, value )
--
-- Adds a value to the end of the table.
--
-- Arg:
-- table - the table
-- value - the value for the end of the table
--
-- Written by Thott (thott@thottbot.com)
push = function (table,val)
if(not table or not table.n) then
Sea.IO.derror(nil, "Bad table passed to Sea.table.push by ", this);
return nil;
end
--table.insert(table, val);
table.n = table.n+1;
table[table.n] = val;
end;
--
-- pop ( table )
--
-- Removes an indexed value from the end of the table and returns it.
-- Difference from table.remove: doesn't nil index - more memory usages, less GC
-- (Good for tables that are constantly filled and emptied with a consistant number of entries)
--
-- Arg:
-- table - the table
--
-- Written by Thott (thott@thottbot.com)
pop = function (table)
if(not table or not table.n) then
Sea.IO.derror(nil,"Bad table passed to Sea.table.pop by ", this);
return nil;
end
if ( table.n == 0 ) then
return nil;
end
local v = table[table.n];
table.n = table.n - 1;
--v = table.remove(table);
return v;
end;
--
-- getKeyList ( table )
--
-- Returns a table of keys (integer indexing), empty table if empty table.
--
-- Arg:
-- table - the table
--
-- Written by AnduinLothar (KarlKFI@cosmosui.org)
getKeyList = function (passedTable)
if( type(passedTable) ~= "table" ) then
return nil;
end
local keyList = { };
for key, value in passedTable do
--Sea.io.print(key);
table.insert(keyList, key)
end
return keyList;
end;
--
-- copy( table [, recursionList ] )
-- Copies the values of a table
-- If you use tables as keys, it will probably fail.
--
-- args:
-- table - the table you want copied
-- recursionList - don't use this
--
-- returns:
-- table - the table containing the copy of the values
--
copy = function ( t, recursionList )
if ( not recursionList ) then recursionList = {} end
if ( type(t) ~= "table" ) then
return t;
end
local newTable = {};
if ( recursionList[t] ) then
return recursionList[t];
else
recursionList[t] = newTable;
for k,v in t do
--If it's a table we want to recurse. But the second half of this if checks to see if it
--is a reference to a frame, which looks like a table, and does a normal copy in such a
--case
if ( ( type(v) == "table" ) and not ( v[0] and ( type(v[0]) == "userdata" ) ) ) then
newTable[k] = Sea.table.copy(v, recursionList);
else
newTable[k] = v;
end
end
return newTable;
end
end;
--
-- isEquivalent(table1, table2 [, recursedList])
-- returns true if all of the keys in a single-layer
-- table point to the same values
--
-- This is not fully tested using recursive tables
--
-- args:
-- table1 - the first table
-- table2 - the second table
--
isEquivalent = function (table1, table2, recursedList )
if ( not recursedList ) then
recursedList = {};
end
if ( type ( table1 ) ~= "table" or type(table2) ~= "table" ) then
if ( table1 == table2 ) then
return true;
else
return false;
end
end
recursedList[table1] = true;
recursedList[table2] = true;
local keyList1 = Sea.table.getKeyList(table1);
local keyList2 = Sea.table.getKeyList(table2);
if ( table.getn(keyList1) ~= table.getn(keyList2) ) then
return false;
else
for k,v in keyList1 do
local t1v, t2v = table1[v], table2[v];
if ( type(t1v) ~= type(t2v) ) then
return false;
elseif ( type(t1v) ~= 'table' ) then
if (table1[v] ~= table2[v]) then
return false;
end
else
if ( recursedList[t1v] or recursedList[t2v] ) then
if ( t1v ~= t2v ) then
return false;
end
else
if ( not Sea.table.isEquivalent(t1v, t2v, recursedList) ) then
return false;
end
end
end
end
end
return true;
end;
};
-- Aliases
Sea.table.getIndexInList = Sea.table.getValueIndex;
Sea.table.isWordInList = Sea.table.isStringInTableValue;
Sea.table.isInList = Sea.table.isInTable;
-- List and tables are equal in lua
Sea.list = Sea.table;