;; License along with this library; if not, write to the Free Software
;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-;; $Id: glib.lisp,v 1.1 2000-08-14 16:44:31 espen Exp $
+;; $Id: glib.lisp,v 1.5 2000-08-23 21:36:44 espen Exp $
(in-package "GLIB")
+;;;; Quarks
+
+(deftype quark () 'unsigned)
+
+(define-foreign %quark-get-reserved () quark)
+
+(defvar *quark-from-object* (make-hash-table))
+(defvar *quark-to-object* (make-hash-table))
+
+(defun quark-from-object (object &key (test #'eq))
+ (let ((hash-code (sxhash object)))
+ (or
+ (assoc-ref object (gethash hash-code *quark-from-object*) :test test)
+ (let ((quark (%quark-get-reserved)))
+ (setf
+ (gethash hash-code *quark-from-object*)
+ (append
+ (gethash hash-code *quark-from-object*)
+ (list (cons object quark))))
+ (setf (gethash quark *quark-to-object*) object)
+ quark))))
+
+(defun quark-to-object (quark)
+ (gethash quark *quark-to-object*))
+
+(defun remove-quark (quark)
+ (let* ((object (gethash quark *quark-to-object*))
+ (hash-code (sxhash object)))
+ (remhash quark *quark-to-object*)
+ (unless (setf
+ (gethash hash-code *quark-from-object*)
+ (assoc-delete object (gethash hash-code *quark-from-object*)))
+ (remhash hash-code *quark-from-object*))))
+
+
+
;;;; Linked list
(deftype glist () 'pointer)
(to-alien (translate-to-alien element-type-spec 'element t)))
`(let ((glist (make-pointer 0)))
(dolist (element ,list glist)
- (setq glist (glist-append glist ,to-alien element-type-spec))))))
+ (setq glist (glist-append glist ,to-alien ,element-type-spec))))))
(deftype-method
translate-from-alien
- double-list (type-spec glist &optional (alloc :dynamic))
+ double-list (type-spec glist &optional (alloc :reference))
(let ((element-type-spec (second (type-expand-to 'double-list type-spec))))
`(let ((glist ,glist)
(list nil))
,(translate-from-alien
element-type-spec `(glist-data tmp ,element-type-spec) alloc)
list))
- ,(when (eq alloc :dynamic)
+ ,(when (eq alloc :reference)
'(glist-free glist))
(nreverse list))))
,(when (eq alien-type-spec 'system-area-pointer)
`(do ((tmp glist (glist-next tmp)))
((null-pointer-p tmp))
- ,(cleanup-alien element-type-spec '(glist-data tmp) t)))
+ ,(cleanup-alien
+ element-type-spec `(glist-data tmp ,element-type-spec) t)))
(glist-free glist)))))