Comparison

util/stanza.lua @ 4146:a361c578c1f2

util.stanza: Rewrite clone() to be more optimized.
author Waqas Hussain <waqas20@gmail.com>
date Sun, 20 Feb 2011 19:16:56 +0500
parent 4136:19f2830fbe02
child 4153:676588aed2d7
comparison
equal deleted inserted replaced
4145:e992650185c8 4146:a361c578c1f2
327 end 327 end
328 328
329 return stanza; 329 return stanza;
330 end 330 end
331 331
332 function clone(stanza) 332 local function _clone(stanza)
333 local lookup_table = {}; 333 local attr, tags = {}, {};
334 local function _copy(object) 334 for k,v in pairs(stanza.attr) do attr[k] = v; end
335 if type(object) ~= "table" then 335 local new = { name = stanza.name, attr = attr, tags = tags };
336 return object; 336 for i=1,#stanza do
337 elseif lookup_table[object] then 337 local child = stanza[i];
338 return lookup_table[object]; 338 if child.name then
339 end 339 child = _clone(child);
340 local new_table = {}; 340 t_insert(tags, child);
341 lookup_table[object] = new_table; 341 end
342 for index, value in pairs(object) do 342 t_insert(new, child);
343 new_table[_copy(index)] = _copy(value); 343 end
344 end 344 return setmetatable(new, stanza_mt);
345 return setmetatable(new_table, getmetatable(object)); 345 end
346 end 346 clone = _clone;
347
348 return _copy(stanza)
349 end
350 347
351 function message(attr, body) 348 function message(attr, body)
352 if not body then 349 if not body then
353 return stanza("message", attr); 350 return stanza("message", attr);
354 else 351 else