scansion/queue.lua

Sun, 30 Dec 2018 09:43:36 +0000

author
Matthew Wild <mwild1@gmail.com>
date
Sun, 30 Dec 2018 09:43:36 +0000
changeset 164
14500a149b31
parent 40
ecad8c75ba87
permissions
-rw-r--r--

client: Ignore timeout timer if we received a stanza

40
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1 -- Prosody IM
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2 -- Copyright (C) 2008-2015 Matthew Wild
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3 -- Copyright (C) 2008-2015 Waqas Hussain
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
4 --
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5 -- This project is MIT/X11 licensed. Please see the
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6 -- COPYING file in the source package for more information.
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
7 --
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
9 -- Small ringbuffer library (i.e. an efficient FIFO queue with a size limit)
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10 -- (because unbounded dynamically-growing queues are a bad thing...)
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
11
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12 local have_utable, utable = pcall(require, "util.table"); -- For pre-allocation of table
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
14 local function new(size, allow_wrapping)
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15 -- Head is next insert, tail is next read
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
16 local head, tail = 1, 1;
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
17 local items = 0; -- Number of stored items
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
18 local t = have_utable and utable.create(size, 0) or {}; -- Table to hold items
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
19
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
20 return {
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
21 _items = t;
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22 size = size;
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
23 count = function (self) return items; end;
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24 push = function (self, item)
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
25 if items >= size then
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
26 if allow_wrapping then
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
27 tail = (tail%size)+1; -- Advance to next oldest item
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28 items = items - 1;
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29 else
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
30 return nil, "queue full";
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31 end
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32 end
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33 t[head] = item;
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34 items = items + 1;
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35 head = (head%size)+1;
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36 return true;
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
37 end;
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38 pop = function (self)
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39 if items == 0 then
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40 return nil;
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41 end
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 local item;
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43 item, t[tail] = t[tail], 0;
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44 tail = (tail%size)+1;
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45 items = items - 1;
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
46 return item;
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47 end;
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48 peek = function (self)
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49 if items == 0 then
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50 return nil;
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51 end
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52 return t[tail];
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53 end;
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54 items = function (self)
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 return function (t, pos)
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
56 if pos >= t:count() then
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
57 return nil;
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
58 end
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
59 local read_pos = tail + pos;
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60 if read_pos > t.size then
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
61 read_pos = (read_pos%size);
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
62 end
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63 return pos+1, t._items[read_pos];
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
64 end, self, 0;
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
65 end;
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
66 };
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
67 end
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
68
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
69 return {
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
70 new = new;
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
71 };
ecad8c75ba87 scansion.queue: Import util.queue from Prosody
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
72

mercurial