1
;; Copyright (C) 1994 M. Hagiya, W. Schelter, T. Yuasa
3
;; This file is part of GNU Common Lisp, herein referred to as GCL
5
;; GCL is free software; you can redistribute it and/or modify it under
6
;; the terms of the GNU LIBRARY GENERAL PUBLIC LICENSE as published by
7
;; the Free Software Foundation; either version 2, or (at your option)
10
;; GCL is distributed in the hope that it will be useful, but WITHOUT
11
;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12
;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
13
;; License for more details.
15
;; You should have received a copy of the GNU Library General Public License
16
;; along with GCL; see the file COPYING. If not, write to the Free Software
17
;; Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
28
(export '(make-array array-displacement vector
29
array-element-type array-rank array-dimension
31
array-in-bounds-p array-row-major-index
34
bit-and bit-ior bit-xor bit-eqv bit-nand bit-nor
35
bit-andc1 bit-andc2 bit-orc1 bit-orc2 bit-not
36
array-has-fill-pointer-p fill-pointer
37
vector-push vector-push-extend vector-pop
38
adjust-array upgraded-array-element-type))
43
(proclaim '(optimize (safety 2) (space 3)))
45
(defun best-array-element-type (type)
46
(cond ((or (eql t type) (null type))
48
((memq type '(bit unsigned-char signed-char
52
((subtypep type 'fixnum)
53
(dolist (v '(bit unsigned-char signed-char
57
(cond ((subtypep type v)
59
((eql type 'character) 'string-char)
60
(t (or (dolist (v '(string-char bit short-float
62
(cond ((subtypep type v)
66
(defun upgraded-array-element-type (type &optional environment)
67
(declare (ignore environment))
68
(best-array-element-type type))
70
;(defun array-displacement (array)
71
; (let ((x (si:array-displacement1 array)))
72
; (values (car x) (cdr x)))
75
(defun make-array (dimensions
78
(initial-contents nil initial-contents-supplied-p)
79
adjustable fill-pointer
80
displaced-to (displaced-index-offset 0)
82
(when (integerp dimensions) (setq dimensions (list dimensions)))
83
(setq element-type (best-array-element-type element-type))
84
(cond ((= (length dimensions) 1)
85
(let ((x (si:make-vector element-type (car dimensions)
86
adjustable fill-pointer
87
displaced-to displaced-index-offset
88
static initial-element)))
89
(when initial-contents-supplied-p
90
(do ((n (car dimensions))
93
(declare (fixnum n i))
94
(si:aset x i (elt initial-contents i))))
99
(the fixnum(get-aelttype element-type))
100
static initial-element
101
displaced-to (the fixnum displaced-index-offset)
103
(if fill-pointer (error "fill pointer for 1 dimensional arrays only"))
104
(unless (member 0 dimensions)
105
(when initial-contents-supplied-p
107
(make-list (length dimensions)
108
:initial-element 0)))
110
(declare (:dynamic-extent cursor))
112
(sequence-cursor initial-contents
115
(when (increment-cursor cursor dimensions)
120
(defun increment-cursor (cursor dimensions)
123
(let ((carry (increment-cursor (cdr cursor) (cdr dimensions))))
125
(cond ((>= (the fixnum (1+ (the fixnum (car cursor))))
126
(the fixnum (car dimensions)))
131
(the fixnum (1+ (the fixnum (car cursor)))))
136
(defun sequence-cursor (sequence cursor)
139
(sequence-cursor (elt sequence (the fixnum (car cursor)))
143
(defun vector (&rest objects &aux (l (list (length objects))))
144
(declare (:dynamic-extent objects l))
147
:initial-contents objects))
150
(defun array-dimensions (array)
151
(do ((i (array-rank array))
155
(setq d (cons (array-dimension array i) d))))
158
(defun array-in-bounds-p (array &rest indices &aux (r (array-rank array)))
159
(declare (:dynamic-extent indices))
160
(when (/= r (length indices))
161
(error "The rank of the array is ~R,~%~
162
~7@Tbut ~R ~:*~[indices are~;index is~:;indices are~] ~
168
(when (or (< (car s) 0)
169
(>= (car s) (array-dimension array i)))
173
(defun array-row-major-index (array &rest indices)
174
(declare (:dynamic-extent indices))
176
(j 0 (+ (* j (array-dimension array i)) (car s)))
181
(defun bit (bit-array &rest indices)
182
(declare (:dynamic-extent indices))
183
(apply #'aref bit-array indices))
186
(defun sbit (bit-array &rest indices)
187
(declare (:dynamic-extent indices))
188
(apply #'aref bit-array indices))
191
(defun bit-and (bit-array1 bit-array2 &optional result-bit-array)
192
(bit-array-op boole-and bit-array1 bit-array2 result-bit-array))
195
(defun bit-ior (bit-array1 bit-array2 &optional result-bit-array)
196
(bit-array-op boole-ior bit-array1 bit-array2 result-bit-array))
199
(defun bit-xor (bit-array1 bit-array2 &optional result-bit-array)
200
(bit-array-op boole-xor bit-array1 bit-array2 result-bit-array))
203
(defun bit-eqv (bit-array1 bit-array2 &optional result-bit-array)
204
(bit-array-op boole-eqv bit-array1 bit-array2 result-bit-array))
207
(defun bit-nand (bit-array1 bit-array2 &optional result-bit-array)
208
(bit-array-op boole-nand bit-array1 bit-array2 result-bit-array))
211
(defun bit-nor (bit-array1 bit-array2 &optional result-bit-array)
212
(bit-array-op boole-nor bit-array1 bit-array2 result-bit-array))
215
(defun bit-andc1 (bit-array1 bit-array2 &optional result-bit-array)
216
(bit-array-op boole-andc1 bit-array1 bit-array2 result-bit-array))
219
(defun bit-andc2 (bit-array1 bit-array2 &optional result-bit-array)
220
(bit-array-op boole-andc2 bit-array1 bit-array2 result-bit-array))
223
(defun bit-orc1 (bit-array1 bit-array2 &optional result-bit-array)
224
(bit-array-op boole-orc1 bit-array1 bit-array2 result-bit-array))
227
(defun bit-orc2 (bit-array1 bit-array2 &optional result-bit-array)
228
(bit-array-op boole-orc2 bit-array1 bit-array2 result-bit-array))
231
(defun bit-not (bit-array &optional result-bit-array)
232
(bit-array-op boole-c1 bit-array bit-array result-bit-array))
235
(defun vector-push (new-element vector)
236
(let ((fp (fill-pointer vector)))
237
(declare (fixnum fp))
238
(cond ((< fp (the fixnum (array-dimension vector 0)))
239
(si:aset vector fp new-element)
240
(si:fill-pointer-set vector (the fixnum (1+ fp)))
245
(defun vector-push-extend (new-element vector &optional extension)
246
(let ((fp (fill-pointer vector)))
247
(declare (fixnum fp))
248
(cond ((< fp (the fixnum (array-dimension vector 0)))
249
(si:aset vector fp new-element)
250
(si:fill-pointer-set vector (the fixnum (1+ fp)))
254
(list (+ (array-dimension vector 0)
256
(if (> (array-dimension vector 0) 0)
257
(array-dimension vector 0)
259
:element-type (array-element-type vector)
261
(si:aset vector fp new-element)
262
(si:fill-pointer-set vector (the fixnum (1+ fp)))
266
(defun vector-pop (vector)
267
(let ((fp (fill-pointer vector)))
268
(declare (fixnum fp))
270
(error "The fill pointer of the vector ~S zero." vector))
271
(si:fill-pointer-set vector (the fixnum (1- fp)))
272
(aref vector (the fixnum (1- fp)))))
275
(defun adjust-array (array new-dimensions
282
displaced-index-offset
284
&aux fill-pointer-spec
291
displaced-index-offset
293
(declare (:dynamic-extent r new-dimensions))
294
(when (integerp new-dimensions)
295
(setq new-dimensions (list new-dimensions)))
296
(if (setq fill-pointer-spec (member :fill-pointer r))
297
(unless (array-has-fill-pointer-p array)
298
(error ":fill-pointer specified for array with no fill pointer"))
299
(when (array-has-fill-pointer-p array)
300
(push (fill-pointer array) r) (push :fill-pointer r)))
302
(setq element-type (array-element-type array))
303
(unless (eq element-type t) (push element-type r)
304
(push :element-type r))
305
(unless (member :static r)
306
(push (staticp array) r) (push :static r))
307
(let ((x (apply #'make-array new-dimensions :adjustable t r)))
308
(cond ((or (null (cdr new-dimensions))
309
(and (equal (cdr new-dimensions)
310
(cdr (array-dimensions array)))
311
(or (not (eq element-type 'bit))
314
(the fixnum (car (last new-dimensions)))
316
(copy-array-portion array x
318
(min (array-total-size x)
319
(array-total-size array))))
321
(do ((cursor (make-list (length new-dimensions)
322
:initial-element 0)))
324
(declare (:dynamic-extent cursor))
325
(when (apply #'array-in-bounds-p array cursor)
327
(apply #'aref array cursor)
329
(when (increment-cursor cursor new-dimensions)
332
(si:replace-array array x)
333
(setf fill-pointer-spec (cadr fill-pointer-spec))
334
(when fill-pointer-spec
335
(cond ((eql t fill-pointer-spec)
336
(setf (fill-pointer array) (array-total-size array)))
337
((typep fill-pointer-spec 'fixnum)
338
(setf (fill-pointer array) fill-pointer-spec))
339
(t (error "bad :fill-pointer arg: ~a" fill-pointer-spec))))