"Make a ring that can contain SIZE elements."
(cons 0 (cons 0 (make-vector size nil))))
+(defun ring-insert-at-beginning (ring item)
+ "Add to RING the item ITEM. Add it at the front (the early end)."
+ (let* ((vec (cdr (cdr ring)))
+ (veclen (length vec))
+ (hd (car ring))
+ (ln (car (cdr ring))))
+ (setq ln (min veclen (1+ ln))
+ hd (ring-minus1 hd veclen))
+ (aset vec hd item)
+ (setcar ring hd)
+ (setcar (cdr ring) ln)))
+
(defun ring-plus1 (index veclen)
"INDEX+1, with wraparound"
(let ((new-index (+ index 1)))
(= 0 (car (cdr ring))))
(defun ring-index (index head ringlen veclen)
- (setq index (ring-mod index ringlen))
- (ring-mod (1- (+ head (- ringlen index))) veclen))
+ (setq index (mod index ringlen))
+ (mod (1- (+ head (- ringlen index))) veclen))
(defun ring-insert (ring item)
- "Insert a new item onto the ring. If the ring is full, dump the oldest
-item to make room."
+ "Insert onto ring RING the item ITEM, as the newest (last) item.
+If the ring is full, dump the oldest item to make room."
(let* ((vec (cdr (cdr ring)))
(veclen (length vec))
(hd (car ring))
(ln (car (cdr ring))))
(prog1
- (aset vec (ring-mod (+ hd ln) veclen) item)
+ (aset vec (mod (+ hd ln) veclen) item)
(if (= ln veclen)
(setcar ring (ring-plus1 hd veclen))
(setcar (cdr ring) (1+ ln))))))
(ln (car (cdr ring)))
(vec (cdr (cdr ring)))
(veclen (length vec))
- (tl (ring-mod (1- (+ hd ln)) veclen))
+ (tl (mod (1- (+ hd ln)) veclen))
oldelt)
(if (null index)
(setq index (1- ln)))
(setcar (cdr ring) (1- ln))
oldelt)))
-(defun ring-mod (n m)
- "Returns N mod M. M is positive.
-Answer is guaranteed to be non-negative, and less than m."
- (let ((n (% n m)))
- (if (>= n 0) n
- (+ n
- (if (>= m 0) m (- m)))))) ; (abs m)
-
(defun ring-ref (ring index)
"Returns RING's INDEX element.
INDEX need not be <= the ring length, the appropriate modulo operation