From 1a4cb94f1c9a461ab6797f5530248dec18f0287a Mon Sep 17 00:00:00 2001 From: Liam Healy <liam@thinkpad.local> Date: Mon, 21 Dec 2009 22:45:31 -0500 Subject: [PATCH] Integrate marrays into grid The GSLL marrays now function correctly as instances of grid:grid; for example, (grid:transpose *m35*) works. All previous tests pass in SBCL. --- data/marray.lisp | 11 ++++++++++- grid/foreign-array.lisp | 14 ++++++++++++-- grid/methods.lisp | 10 +++++----- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/data/marray.lisp b/data/marray.lisp index 96d48223..316ea621 100644 --- a/data/marray.lisp +++ b/data/marray.lisp @@ -1,6 +1,6 @@ ;; A "marray" is an array in both GSL and CL ;; Liam Healy 2008-04-06 21:23:41EDT -;; Time-stamp: <2009-12-21 10:47:55EST marray.lisp> +;; Time-stamp: <2009-12-21 22:26:21EST marray.lisp> (in-package :gsl) @@ -134,6 +134,15 @@ class-or-element-type)) keys)) +(pushnew 'marray grid:*grid-data-superclasses*) + +(defmethod grid:make-grid-data + ((type (eql 'marray)) dimensions rest-spec + &key (initial-element nil initial-element-p)) + (make-marray rest-spec + :dimensions dimensions + :initial-element initial-element)) + ;;; The reader macro #m will read a list of arguments, evaluating the ;;; contents, and construct a marray from it. If the symbol ^ occurs ;;; in the list, it indicates the object being made is a matrix, and diff --git a/grid/foreign-array.lisp b/grid/foreign-array.lisp index ee3aa550..75bebb27 100644 --- a/grid/foreign-array.lisp +++ b/grid/foreign-array.lisp @@ -1,6 +1,6 @@ ;; Foreign (C or C-compatible) arrays ;; Liam Healy 2008-12-28 10:44:22EST foreign-array.lisp -;; Time-stamp: <2009-12-21 19:04:46EST foreign-array.lisp> +;; Time-stamp: <2009-12-21 22:27:03EST foreign-array.lisp> (in-package :c-array) @@ -47,6 +47,16 @@ (:documentation "A superclass for arrays represented in C and CL.")) +(defun foreign-array-specification (object dimensions) + "Create the grid specification for the object, with a possibly + different set of dimensions." + (let ((class + (or + (find-if (lambda (cl) (typep object cl)) + grid:*grid-data-superclasses*) + (class-name (class-of object))))) + (list (cons class dimensions) (element-type object)))) + ;;; Allowable keys: :dimensions, :initial-contents, :initial-element. (defmethod initialize-instance :after ((object foreign-array) &rest initargs @@ -61,7 +71,7 @@ total-size (array-total-size grid:data) grid:rank (length dimensions) grid:specification - (list (cons (class-of object) dimensions) (element-type object)) + (foreign-array-specification object dimensions) grid:affi (ignore-errors (affi:make-affi dimensions))) #-native (let ((cptr (cffi:foreign-alloc diff --git a/grid/methods.lisp b/grid/methods.lisp index 6433e14b..8a5e0a2f 100644 --- a/grid/methods.lisp +++ b/grid/methods.lisp @@ -1,6 +1,6 @@ ;; Methods for grid functions ;; Liam Healy 2009-12-21 11:19:00EST methods.lisp -;; Time-stamp: <2009-12-21 13:48:59EST methods.lisp> +;; Time-stamp: <2009-12-21 21:56:38EST methods.lisp> (in-package :c-array) @@ -13,7 +13,7 @@ (defmethod grid:make-grid-data ((type (eql 'foreign-array)) dimensions rest-spec &key (initial-element nil initial-element-p)) - ;; Nothing to do here, because the data is inserted in - ;; initialize-instance :after for foreign-array. - nil) - + (make-instance 'foreign-array + :dimensions dimensions + :element-type rest-spec + :initial-element initial-element)) -- GitLab