aboutsummaryrefslogtreecommitdiff
path: root/src/util.lisp
diff options
context:
space:
mode:
Diffstat (limited to 'src/util.lisp')
-rw-r--r--src/util.lisp40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/util.lisp b/src/util.lisp
index 2fc079b..ad312eb 100644
--- a/src/util.lisp
+++ b/src/util.lisp
@@ -18,3 +18,43 @@
:key #'symbol-name)))
,@body))))
+
+(defclass queue-buffer ()
+ ((front :initform (list))
+ (back :initform (list))
+ (size :initform 0)
+ (capacity :initarg capacity)))
+
+(defun make-qb (capacity)
+ (make-instance 'queue-buffer :capacity capacity))
+
+(defun qb-empty-p (q)
+ (zerop (slot-value q 'size)))
+
+(defun qb-full-p (q)
+ (= (slot-value q 'size) (slot-value q 'capacity)))
+
+(defun enqueue-qb (q x)
+ (when (qb-full-p q) (dequeue-qb q))
+ (with-slots (size back) q
+ (push x back)
+ (incf size)))
+
+(defun dequeue-qb (q &optional default)
+ (with-slots (front back size) q
+ (cond
+ ((plusp size)
+ (when (null front)
+ (setf front (nreverse back)
+ back nil))
+ (decf size)
+ (pop front))
+
+ (t default))))
+
+(defun qb-look (q)
+ "get a list of the queue, but don't remove items from it"
+ (with-slots (front back) q
+ (nconc (copy-seq front)
+ (reverse back))))
+