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