;; 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.2 2000-08-15 23:25:18 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)
(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))))