;; 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: gtype.lisp,v 1.14 2002-01-14 01:16:08 espen Exp $
+;; $Id: gtype.lisp,v 1.16 2002-03-24 12:56:03 espen Exp $
(in-package "GLIB")
(defun supertype (type)
(type-from-number (type-parent type)))
+(defbinding %type-interfaces (type) pointer
+ ((find-type-number type t) type-number)
+ (n-interfaces unsigned-int :out))
+
+(defun type-interfaces (type)
+ (multiple-value-bind (array length) (%type-interfaces type)
+ (unwind-protect
+ (map-c-array 'list #'identity array 'type-number length)
+ (deallocate-memory array))))
+
+(defun implements (type)
+ (mapcar #'type-from-number (type-interfaces type)))
+
(defun type-hierarchy (type)
(let ((type-number (find-type-number type t)))
(unless (= type-number 0)
(let ((sorted ()))
(loop while unsorted do
(dolist (type unsorted)
- (let ((dependencies (rest (type-hierarchy type))))
+ (let ((dependencies
+ (append (rest (type-hierarchy type)) (type-interfaces type))))
(cond
((null dependencies)
(push type sorted)
#'(lambda (options)
(and
(string-prefix-p (first options) name)
- (getf (cdr options) :ignore-prefix)))
+ (getf (cdr options) :ignore-prefix)
+ (not (some
+ #'(lambda (exception)
+ (string= name exception))
+ (getf (cdr options) :except)))))
args))))
(find-types prefix))))