Comparison

util/stanza.lua @ 12407:b6b01724e04f

util.stanza: Create tables with correct size to avoid reallocations Potential performance gain since the tables don't need to be resized as they grow to the final size.
author Kim Alvefur <zash@zash.se>
date Fri, 18 Mar 2022 16:43:06 +0100
parent 12406:a3ddf3f42212
child 12636:e8934ce6ea0f
comparison
equal deleted inserted replaced
12406:a3ddf3f42212 12407:b6b01724e04f
20 local type = type; 20 local type = type;
21 local s_gsub = string.gsub; 21 local s_gsub = string.gsub;
22 local s_sub = string.sub; 22 local s_sub = string.sub;
23 local s_find = string.find; 23 local s_find = string.find;
24 local t_move = table.move or require "util.table".move; 24 local t_move = table.move or require "util.table".move;
25 local t_create = require"util.table".create;
25 26
26 local valid_utf8 = require "util.encodings".utf8.valid; 27 local valid_utf8 = require "util.encodings".utf8.valid;
27 28
28 local do_pretty_printing, termcolours = pcall(require, "util.termcolours"); 29 local do_pretty_printing, termcolours = pcall(require, "util.termcolours");
29 30
274 self = self:get_child(name, xmlns); 275 self = self:get_child(name, xmlns);
275 until not self 276 until not self
276 end 277 end
277 278
278 local function _clone(stanza, only_top) 279 local function _clone(stanza, only_top)
279 local attr, tags = {}, {}; 280 local attr = {};
280 for k,v in pairs(stanza.attr) do attr[k] = v; end 281 for k,v in pairs(stanza.attr) do attr[k] = v; end
281 local old_namespaces, namespaces = stanza.namespaces; 282 local old_namespaces, namespaces = stanza.namespaces;
282 if old_namespaces then 283 if old_namespaces then
283 namespaces = {}; 284 namespaces = {};
284 for k,v in pairs(old_namespaces) do namespaces[k] = v; end 285 for k,v in pairs(old_namespaces) do namespaces[k] = v; end
285 end 286 end
286 local new = { name = stanza.name, attr = attr, namespaces = namespaces, tags = tags }; 287 local tags, new;
288 if only_top then
289 tags = {};
290 new = { name = stanza.name, attr = attr, namespaces = namespaces, tags = tags };
291 else
292 tags = t_create(#stanza.tags, 0);
293 new = t_create(#stanza, 4);
294 new.name = stanza.name;
295 new.attr = attr;
296 new.namespaces = namespaces;
297 new.tags = tags;
298 end
299
287 setmetatable(new, stanza_mt); 300 setmetatable(new, stanza_mt);
288 if not only_top then 301 if not only_top then
289 t_move(stanza, 1, #stanza, 1, new); 302 t_move(stanza, 1, #stanza, 1, new);
290 t_move(stanza.tags, 1, #stanza.tags, 1, tags); 303 t_move(stanza.tags, 1, #stanza.tags, 1, tags);
291 new:maptags(_clone); 304 new:maptags(_clone);