aboutsummaryrefslogtreecommitdiffstats
path: root/lua/inet/set.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua/inet/set.lua')
-rw-r--r--lua/inet/set.lua49
1 files changed, 49 insertions, 0 deletions
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