Mercurial > emacs
changeset 25467:cf992000b9c6
Many doc fixes.
(ring-size, ring-copy): New functions.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Mon, 30 Aug 1999 23:57:22 +0000 |
parents | 7057ab217315 |
children | 637af9b4fdbb |
files | lisp/emacs-lisp/ring.el |
diffstat | 1 files changed, 64 insertions(+), 32 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/emacs-lisp/ring.el Mon Aug 30 23:14:40 1999 +0000 +++ b/lisp/emacs-lisp/ring.el Mon Aug 30 23:57:22 1999 +0000 @@ -24,8 +24,8 @@ ;;; Commentary: -;; This code defines a ring data structure. A ring is a -;; (hd-index length . vector) +;; This code defines a ring data structure. A ring is a +;; (hd-index length . vector) ;; list. You can insert to, remove from, and rotate a ring. When the ring ;; fills up, insertions cause the oldest elts to be quietly dropped. ;; @@ -35,17 +35,29 @@ ;; ;; hd-index = vector index of the oldest ring item. ;; Newer items follow this item; at the end of the vector, -;; they wrap around to the start of the vector. +;; they wrap around to the start of the vector. ;; length = number of items currently in the ring. -;; This never exceeds the length of the vector itself. +;; This never exceeds the length of the vector itself. ;; ;; These functions are used by the input history mechanism, but they can ;; be used for other purposes as well. +;;; Change Log: + +;; Sun Aug 22 12:58:54 1999 Kevin Blake <kblake@ticnet.com> +;; * Added the `ring-size' and `ring-copy' functions. Added documentation +to +;; the `ring-empty-p' and `ring-index' functions. Enhanced the +documentation +;; of several functions. Added comments to the layout of this module to +;; make things more obvious. + ;;; Code: +;;; User Functions: + ;;;###autoload -(defun ring-p (x) +(defun ring-p (x) "Returns t if X is a ring; nil otherwise." (and (consp x) (integerp (car x)) (consp (cdr x)) (integerp (car (cdr x))) @@ -58,48 +70,66 @@ (defun ring-insert-at-beginning (ring item) "Add to RING the item ITEM. Add it at the front, as the oldest item." - (let* ((vec (cdr (cdr ring))) - (veclen (length vec)) - (hd (car ring)) - (ln (car (cdr ring)))) + (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)) + 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." + "Returns INDEX+1, with wraparound." (let ((new-index (+ index 1))) (if (= new-index veclen) 0 new-index))) (defun ring-minus1 (index veclen) - "INDEX-1, with wraparound." + "Returns INDEX-1, with wraparound." (- (if (= 0 index) veclen index) 1)) (defun ring-length (ring) - "Number of elements in the ring RING." + "Returns the number of elements in the RING." (car (cdr ring))) -(defun ring-empty-p (ring) - (= 0 (car (cdr ring)))) - (defun ring-index (index head ringlen veclen) + "Converts nominal ring index INDEX to an internal index. +The internal index refers to the items ordered from newest to oldest. +HEAD is the index of the oldest element in the ring. +RINGLEN is the number of elements currently in the ring. +VECLEN is the size of the vector in the ring." (setq index (mod index ringlen)) (mod (1- (+ head (- ringlen index))) veclen)) +(defun ring-empty-p (ring) + "Returns t if RING is empty; nil otherwise." + (= 0 (car (cdr ring)))) + +(defun ring-size (ring) + "Returns the size of RING, the maximum number of elements it can contain." + (length (cdr (cdr ring)))) + +(defun ring-copy (ring) + "Returns a copy of RING." + (let* + ((vec (cdr (cdr ring))) + (hd (car ring)) + (ln (car (cdr ring)))) + (cons hd (cons ln (copy-sequence vec))))) + (defun ring-insert (ring item) "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)))) +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 (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)))))) + (setcar ring (ring-plus1 hd veclen)) + (setcar (cdr ring) (1+ ln)))))) (defun ring-remove (ring &optional index) "Remove an item from the RING. Return the removed item. @@ -108,18 +138,18 @@ (if (ring-empty-p ring) (error "Ring empty") (let* ((hd (car ring)) - (ln (car (cdr ring))) - (vec (cdr (cdr ring))) - (veclen (length vec)) - (tl (mod (1- (+ hd ln)) veclen)) - oldelt) + (ln (car (cdr ring))) + (vec (cdr (cdr ring))) + (veclen (length vec)) + (tl (mod (1- (+ hd ln)) veclen)) + oldelt) (if (null index) - (setq index (1- ln))) + (setq index (1- ln))) (setq index (ring-index index hd ln veclen)) (setq oldelt (aref vec index)) (while (/= index tl) - (aset vec index (aref vec (ring-plus1 index veclen))) - (setq index (ring-plus1 index veclen))) + (aset vec index (aref vec (ring-plus1 index veclen))) + (setq index (ring-plus1 index veclen))) (aset vec tl nil) (setcar (cdr ring) (1- ln)) oldelt))) @@ -135,6 +165,8 @@ (let* ((hd (car ring)) (ln (car (cdr ring))) (vec (cdr (cdr ring)))) (aref vec (ring-index index hd ln (length vec)))))) +;;; provide ourself: + (provide 'ring) ;;; ring.el ends here