util.queue: Allow optional wrap-around when pushing, overwriting oldest unread item
authorMatthew Wild <mwild1@gmail.com>
Wed, 3 Jun 2015 14:51:07 +0000 (15:51 +0100)
committerMatthew Wild <mwild1@gmail.com>
Wed, 3 Jun 2015 14:51:07 +0000 (15:51 +0100)
util/queue.lua

index afdcaf453e22d7d7898de4e28e6655edce16b0d6..203da0e3f6ee590a7dc3ec3631a7a90b5de0fbb9 100644 (file)
@@ -11,7 +11,7 @@
 
 local have_utable, utable = pcall(require, "util.table"); -- For pre-allocation of table
 
-local function new(size)
+local function new(size, allow_wrapping)
        -- Head is next insert, tail is next read
        local head, tail = 1, 1;
        local items = 0; -- Number of stored items
@@ -22,7 +22,12 @@ local function new(size)
                count = function (self) return items; end;
                push = function (self, item)
                        if items >= size then
-                               return nil, "queue full";
+                               if allow_wrapping then
+                                       tail = (tail%size)+1; -- Advance to next oldest item
+                                       items = items - 1;
+                               else
+                                       return nil, "queue full";
+                               end
                        end
                        t[head] = item;
                        items = items + 1;