From 907f610040e3dfb54a83155c36527a65b7f08e78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Asbj=C3=B8rn=20Sloth=20T=C3=B8nnesen?= Date: Mon, 13 Feb 2017 16:04:41 +0000 Subject: initial commit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Asbjørn Sloth Tønnesen --- lua/inet/set.lua | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 lua/inet/set.lua (limited to 'lua/inet/set.lua') diff --git a/lua/inet/set.lua b/lua/inet/set.lua new file mode 100644 index 0000000..effb0f2 --- /dev/null +++ b/lua/inet/set.lua @@ -0,0 +1,49 @@ +local M = {} + +local function table_compact(t, n) + -- remove nil entries, and reorder + local i = 0 + for j=1,n do + if t[j] then + if i > 0 then + t[i] = t[j] + i = i + 1 + end + elseif i == 0 then + i = j + end + end + if i > 0 then + for j=i,n do + t[j] = nil + end + end +end + +function M.aggregate(t) + local flag = true + local n = #t + for i=1,n do + t[i] = t[i]:network() + end + while flag do -- loop until no aggregatable addresses are found + flag = false + for i=1,n do + local ia = t[i] + if ia then + local ib = ia:flip() -- counterpart + for j=1,n do + if j ~= i and t[j] == ib then + -- counterpart found, aggregating + t[i] = (ia ^ -1):network() + t[j] = nil + flag = true + end + end + end + end + end + table_compact(t, n) +end + +return M -- cgit v1.2.1