aboutsummaryrefslogtreecommitdiffstats
path: root/lua
diff options
context:
space:
mode:
authorAsbjørn Sloth Tønnesen <ast@2e8.dk>2019-07-17 22:08:26 +0000
committerAsbjørn Sloth Tønnesen <ast@2e8.dk>2019-07-17 22:08:26 +0000
commit54251356a23468136f6226134b0f8524a6ae3523 (patch)
tree68505000dbc9b7174d9b2a758a0d593b1dcd6391 /lua
parentd9391277ce7cf8c47346da0df9a12d7ac36c9d56 (diff)
downloadlua-inet-54251356a23468136f6226134b0f8524a6ae3523.tar.gz
lua-inet-54251356a23468136f6226134b0f8524a6ae3523.tar.xz
lua-inet-54251356a23468136f6226134b0f8524a6ae3523.zip
initial new set support
Signed-off-by: Asbjørn Sloth Tønnesen <ast@2e8.dk>
Diffstat (limited to 'lua')
-rw-r--r--lua/inet/init.lua3
-rw-r--r--lua/inet/set.lua89
2 files changed, 92 insertions, 0 deletions
diff --git a/lua/inet/init.lua b/lua/inet/init.lua
index 55ce0e4..ea35f80 100644
--- a/lua/inet/init.lua
+++ b/lua/inet/init.lua
@@ -1,4 +1,5 @@
local core = require 'inet.core'
+local set = require 'inet.set'
local new_inet = core.new_inet
@@ -13,4 +14,6 @@ M.is4 = core.is_inet4
M.is6 = core.is_inet6
M.is = core.is_inet
+M.set = set.new
+
return setmetatable(M, mt)
diff --git a/lua/inet/set.lua b/lua/inet/set.lua
index 5999f65..a353f30 100644
--- a/lua/inet/set.lua
+++ b/lua/inet/set.lua
@@ -1,3 +1,11 @@
+local core = require 'inet.core'
+
+local is_inet = core.is_inet
+
+local insert = table.insert
+local remove = table.remove
+local sort = table.sort
+
local M = {}
local function table_compact(t, n)
@@ -95,6 +103,7 @@ function M.iterator(set)
return iter
end
+-- iterate over the set repeatedly
function M.loopiterator(set)
local orig_iter = M.iterator(set)
local function iter()
@@ -108,4 +117,84 @@ function M.loopiterator(set)
return iter
end
+local inet_set = {}
+inet_set.__index = inet_set
+
+local function check_net(self, net)
+ if not is_inet(net) then return nil, 'invalid net' end
+ local set_fam = self.family
+ local net_fam = net:family()
+ if set_fam then
+ if set_fam ~= net_fam then
+ return nil, 'invalid family'
+ end
+ else
+ self.family = net_fam
+ end
+ return true
+end
+
+function inet_set:add(net)--, aggregate)
+ if not check_net(self, net) then return check_net(self, net) end
+ insert(self.nets, net)
+ M.aggregate(self.nets)
+ return true
+end
+
+function inet_set:remove(net)
+ if not check_net(self, net) then return check_net(self, net) end
+ local nets = self.nets
+ local ret = false
+ for i=1,#nets do
+ local n = nets[i]
+ if n == net then
+ ret = true
+ remove(nets, i)
+ elseif n:contains(net) then
+ ret = true
+ remove(nets, i)
+ for j=#n+1,#net do
+ local sn = (net / j):network()
+ if sn:contains(net) then
+ sn = sn:flip()
+ end
+ self:add(sn)
+ end
+ end
+ end
+ return ret
+end
+
+function inet_set:contains(net)
+ if not check_net(self, net) then return check_net(self, net) end
+ local nets = self.nets
+ for i=1,#nets do
+ local n = nets[i]
+ if n == net or n:contains(net) then
+ return true
+ end
+ end
+ return false
+end
+
+function inet_set:list()
+ local nets = self.nets
+ sort(nets)
+ return nets
+end
+
+function inet_set:flush()
+ self.nets = {}
+ self.family = nil
+ return true
+end
+
+local function new_set()
+ return setmetatable({
+ nets = {},
+ }, inet_set)
+end
+
+M.new = new_set
+
return M