mirror of
https://github.com/bjc/prosody.git
synced 2025-04-01 20:27:39 +03:00
util.smqueue: Simplify compat table, fix dependent modules (thanks Martin)
There was an off-by-one in the modulo calculation. Switching to a plain old array-table makes the apparent size of the queue wrong, but since some of the queue may not be available this is likely for the best.
This commit is contained in:
parent
81d747b6a4
commit
081647ea1f
3 changed files with 36 additions and 24 deletions
|
@ -52,4 +52,30 @@ describe("util.smqueue", function()
|
|||
assert.same({ [7] = true; [8] = true; [9] = true; [10] = true; [11] = true; [12] = true }, resume);
|
||||
end)
|
||||
end)
|
||||
|
||||
describe("#table", function ()
|
||||
it("produces a compat layer", function ()
|
||||
local q = smqueue.new(10);
|
||||
for i = 1,10 do q:push(i); end
|
||||
do
|
||||
local t = q:table();
|
||||
assert.same({ 1; 2; 3; 4; 5; 6; 7; 8; 9; 10 }, t);
|
||||
end
|
||||
do
|
||||
for i = 11,20 do q:push(i); end
|
||||
local t = q:table();
|
||||
assert.same({ 11; 12; 13; 14; 15; 16; 17; 18; 19; 20 }, t);
|
||||
end
|
||||
do
|
||||
q:ack(15);
|
||||
local t = q:table();
|
||||
assert.same({ 16; 17; 18; 19; 20 }, t);
|
||||
end
|
||||
do
|
||||
q:ack(20);
|
||||
local t = q:table();
|
||||
assert.same({}, t);
|
||||
end
|
||||
end)
|
||||
end)
|
||||
end);
|
||||
|
|
|
@ -70,22 +70,13 @@ function smqueue:consume() : queue.queue.consume_iter
|
|||
return self._queue:consume()
|
||||
end
|
||||
|
||||
-- Compatibility wrapper, meant to look like a plain ol' array
|
||||
local record compat_mt
|
||||
_queue : smqueue<any>
|
||||
end
|
||||
|
||||
function compat_mt:__index(i : integer) : any
|
||||
if i < self._queue._tail then return nil end
|
||||
return self._queue._queue._items[(i + self._queue._tail) % self._queue._queue.size];
|
||||
end
|
||||
|
||||
function compat_mt:__len() : integer
|
||||
return self._queue:count_unacked()
|
||||
end
|
||||
|
||||
-- Compatibility layer, plain ol' table
|
||||
function smqueue:table() : { any }
|
||||
return setmetatable({ _queue = self }, compat_mt);
|
||||
local t : { any } = {};
|
||||
for i, v in self:resume() do
|
||||
t[i] = v;
|
||||
end
|
||||
return t;
|
||||
end
|
||||
|
||||
local function freeze(q : smqueue<any>) : { string:integer }
|
||||
|
|
|
@ -38,17 +38,12 @@ function smqueue:resume() return self._queue:items() end
|
|||
|
||||
function smqueue:consume() return self._queue:consume() end
|
||||
|
||||
local compat_mt = {}
|
||||
|
||||
function compat_mt:__index(i)
|
||||
if i < self._queue._tail then return nil end
|
||||
return self._queue._queue._items[(i + self._queue._tail) % self._queue._queue.size]
|
||||
function smqueue:table()
|
||||
local t = {};
|
||||
for i, v in self:resume() do t[i] = v; end
|
||||
return t
|
||||
end
|
||||
|
||||
function compat_mt:__len() return self._queue:count_unacked() end
|
||||
|
||||
function smqueue:table() return setmetatable({ _queue = self }, compat_mt) end
|
||||
|
||||
local function freeze(q) return { head = q._head; tail = q._tail } end
|
||||
|
||||
local queue_mt = { __name = "smqueue"; __index = smqueue; __len = smqueue.count_unacked; __freeze = freeze }
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue