emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/compat b27914c0b6 1/2: compat-27: Add ring-resize


From: ELPA Syncer
Subject: [elpa] externals/compat b27914c0b6 1/2: compat-27: Add ring-resize
Date: Fri, 20 Jan 2023 09:57:25 -0500 (EST)

branch: externals/compat
commit b27914c0b691eb9403e44137e01f6cf5a6c65653
Author: Daniel Mendler <mail@daniel-mendler.de>
Commit: Daniel Mendler <mail@daniel-mendler.de>

    compat-27: Add ring-resize
---
 NEWS.org        |  1 +
 compat-27.el    | 24 ++++++++++++++++++++++++
 compat-tests.el | 43 +++++++++++++++++++++++++++++++++++++------
 compat.texi     |  8 ++++++--
 4 files changed, 68 insertions(+), 8 deletions(-)

diff --git a/NEWS.org b/NEWS.org
index eb9171fdde..d1049a7d1b 100644
--- a/NEWS.org
+++ b/NEWS.org
@@ -30,6 +30,7 @@
 - compat-27: Add ~fixnump~ and ~bignump~.
 - compat-27: Add ~with-minibuffer-selected-window~.
 - compat-27: Add generalized variables for ~decoded-time-*~.
+- compat-27: Add ~ring-resize~.
 - compat-28: Add ~macroexp-warn-and-return~.
 - compat-28: Add ~subr-native-elisp-p~.
 - compat-28: Add ~bounds-of-thing-at-mouse~.
diff --git a/compat-27.el b/compat-27.el
index 9f9198e07e..16a6b124cd 100644
--- a/compat-27.el
+++ b/compat-27.el
@@ -714,5 +714,29 @@ and if a matching region is found, place point at the 
start of the region."
         (and (not (eq ended t))
              ended))))))
 
+;;;; Defined in ring.el
+
+(compat-defun ring-resize (ring size)
+  "Set the size of RING to SIZE.
+If the new size is smaller, then the oldest items in the ring are
+discarded."
+  :feature ring
+  (when (integerp size)
+    (let ((length (ring-length ring))
+          (new-vec (make-vector size nil)))
+      (if (= length 0)
+          (setcdr ring (cons 0 new-vec))
+        (let* ((hd (car ring))
+               (old-size (ring-size ring))
+               (old-vec (cddr ring))
+               (copy-length (min size length))
+               (copy-hd (mod (+ hd (- length copy-length)) length)))
+          (setcdr ring (cons copy-length new-vec))
+          ;; If the ring is wrapped, the existing elements must be written
+          ;; out in the right order.
+          (dotimes (j copy-length)
+            (aset new-vec j (aref old-vec (mod (+ copy-hd j) old-size))))
+          (setcar ring 0))))))
+
 (provide 'compat-27)
 ;;; compat-27.el ends here
diff --git a/compat-tests.el b/compat-tests.el
index 1a1b2ddc84..add4f32a79 100644
--- a/compat-tests.el
+++ b/compat-tests.el
@@ -91,7 +91,7 @@
     (should sym)
     (should (symbolp sym))
     (setq list (funcall sym list "first" 1 #'string=))
-    (should (eq (compat-call plist-get list "first" #'string=) 1))))
+    (should-equal (compat-call plist-get list "first" #'string=) 1)))
 
 (defconst compat-tests--version (package-get-version))
 (ert-deftest package-get-version ()
@@ -939,7 +939,7 @@
     (insert "first\nsecond\nthird\n")
     (goto-char 7)
     (delete-line)
-    (should (equal (buffer-string) "first\nthird\n"))))
+    (should-equal (buffer-string) "first\nthird\n")))
 
 (ert-deftest list-of-strings-p ()
   (should-not (list-of-strings-p 1))
@@ -964,16 +964,16 @@
     (setq list (compat-call plist-put list 'first 1))
     (setq list (compat-call plist-put list 'second 2))
     (setq list (compat-call plist-put list 'first 10))
-    (should (eq (compat-call plist-get list 'first) 10))
-    (should (eq (compat-call plist-get list 'second) 2))
+    (should-equal (compat-call plist-get list 'first) 10)
+    (should-equal (compat-call plist-get list 'second) 2)
     (should (compat-call plist-member list 'first))
     (should-not (compat-call plist-member list 'third)))
   (let (list)
     (setq list (compat-call plist-put list "first" 1 #'string=))
     (setq list (compat-call plist-put list "second" 2 #'string=))
     (setq list (compat-call plist-put list "first" 10 #'string=))
-    (should (eq (compat-call plist-get list "first" #'string=) 10))
-    (should (eq (compat-call plist-get list "second" #'string=) 2))
+    (should-equal (compat-call plist-get list "first" #'string=) 10)
+    (should-equal (compat-call plist-get list "second" #'string=) 2)
     (should (compat-call plist-member list "first" #'string=))
     (should-not (compat-call plist-member list "third" #'string=))))
 
@@ -2678,5 +2678,36 @@
   (should-equal "*scratch*" (buffer-name (get-scratch-buffer-create)))
   (should-equal initial-major-mode (buffer-local-value 'major-mode 
(get-scratch-buffer-create))))
 
+(ert-deftest ring-resize ()
+  (let ((ring (make-ring 3)))
+    (ring-insert ring 1)
+    (ring-insert ring 2)
+    (ring-insert ring 3)
+    (ring-resize ring 5)
+    (should-equal (ring-size ring) 5)
+    (should-equal (ring-elements ring) '(3 2 1)))
+  (let ((ring (make-ring 3)))
+    (ring-resize ring 5)
+    (should (= (ring-size ring) 5))
+    (should-equal (ring-elements ring) '()))
+  (let ((ring (make-ring 3)))
+    (ring-insert ring 1)
+    (ring-insert ring 2)
+    (ring-insert ring 3)
+    (ring-insert ring 4)
+    (ring-insert ring 5)
+    (ring-resize ring 5)
+    (should-equal (ring-size ring) 5)
+    (should-equal (ring-elements ring) '(5 4 3)))
+  (let ((ring (make-ring 5)))
+    (ring-insert ring 1)
+    (ring-insert ring 2)
+    (ring-insert ring 3)
+    (ring-insert ring 4)
+    (ring-insert ring 5)
+    (ring-resize ring 3)
+    (should-equal (ring-size ring) 3)
+    (should-equal (ring-elements ring) '(5 4 3))))
+
 (provide 'compat-tests)
 ;;; compat-tests.el ends here
diff --git a/compat.texi b/compat.texi
index ea0e020d00..9668e04ec6 100644
--- a/compat.texi
+++ b/compat.texi
@@ -893,6 +893,12 @@ The function @code{string-version-lessp}.
 The following functions and macros implemented in 27.1, and are provided
 by Compat:
 
+@c copied from lispref/sequences.texi
+@defun ring-resize ring size
+Set the size of @var{ring} to @var{size}.  If the new size is smaller,
+then the oldest items in the ring are discarded.
+@end defun
+
 @c based on lisp/minibuffer.el
 @defmac with-minibuffer-selected-window &rest body
 Execute the forms in @var{body} from the minibuffer in its original
@@ -1414,8 +1420,6 @@ The function @code{file-system-info}.
 @item
 The more consistent treatment of NaN values.
 @item
-The function @code{ring-resize}.
-@item
 The function @code{group-name}.
 @item
 Additional @code{format-spec} modifiers.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]