about summary refs log tree commit diff
path: root/third_party/lisp/alexandria/arrays.lisp
diff options
context:
space:
mode:
authorVincent Ambo <tazjin@google.com>2020-01-17T18·04+0000
committerVincent Ambo <tazjin@google.com>2020-01-17T18·04+0000
commit0a9a56953435382fa00357efb489860cee600a58 (patch)
treef7d6f418a93b5a8b1a94fe43742f48241c48daac /third_party/lisp/alexandria/arrays.lisp
parent30e4e5eefcd65c6fc1a3f37a90822ab1041576e0 (diff)
parent95aeb2ebae32a01ff79644daa523bda5d8552863 (diff)
Merge commit '95aeb2ebae32a01ff79644daa523bda5d8552863' as 'third_party/lisp/alexandria' r/394
Diffstat (limited to 'third_party/lisp/alexandria/arrays.lisp')
-rw-r--r--third_party/lisp/alexandria/arrays.lisp18
1 files changed, 18 insertions, 0 deletions
diff --git a/third_party/lisp/alexandria/arrays.lisp b/third_party/lisp/alexandria/arrays.lisp
new file mode 100644
index 0000000000..76c18791ad
--- /dev/null
+++ b/third_party/lisp/alexandria/arrays.lisp
@@ -0,0 +1,18 @@
+(in-package :alexandria)
+
+(defun copy-array (array &key (element-type (array-element-type array))
+                              (fill-pointer (and (array-has-fill-pointer-p array)
+                                                 (fill-pointer array)))
+                              (adjustable (adjustable-array-p array)))
+  "Returns an undisplaced copy of ARRAY, with same fill-pointer and
+adjustability (if any) as the original, unless overridden by the keyword
+arguments."
+ (let* ((dimensions (array-dimensions array))
+        (new-array (make-array dimensions
+                               :element-type element-type
+                               :adjustable adjustable
+                               :fill-pointer fill-pointer)))
+   (dotimes (i (array-total-size array))
+     (setf (row-major-aref new-array i)
+           (row-major-aref array i)))
+   new-array))