From bb392ca2cebf0e5c85cb10f824a1e4d8d54131ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Asbj=C3=B8rn=20Sloth=20T=C3=B8nnesen?= Date: Mon, 6 Mar 2017 11:00:14 +0000 Subject: set: basic support for looping over sets 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 | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) (limited to 'lua') diff --git a/lua/inet/set.lua b/lua/inet/set.lua index 27c9388..5999f65 100644 --- a/lua/inet/set.lua +++ b/lua/inet/set.lua @@ -52,4 +52,60 @@ function M.aggregate(t) table_compact(t, n) end +local function has(set, addr) + assert(set) + for i=1,#set do + local elem = set[i] + if elem >= addr then + local exclude = set.exclude + if exclude then + return not has(exclude, addr) + else + return true + end + end + end + return false +end + +function M.iterator(set) + local excl = set.exclude + local i = 1 + if #set < 1 then return nil, 'empty set' end + local addr = set[i] + local net = set[i]:network() + local function iter() + if not addr then return end + local ret + ret = addr/32 + addr = addr + 1 + if addr:network() ~= net then + i = i + 1 + addr = set[i] + if addr then + net = set[i]:network() + end + end + if has(excl, ret) then + return iter() + end + return ret + end + + return iter +end + +function M.loopiterator(set) + local orig_iter = M.iterator(set) + local function iter() + local addr = orig_iter() + if not addr then + orig_iter = M.iterator(set) + addr = orig_iter() + end + return addr + end + return iter +end + return M -- cgit v1.2.1