+ (:metaclass proxy-class));)
+
+(defbinding %flags-class-values () pointer
+ (class pointer)
+ (n-values unsigned-int :out))
+
+(defun query-flags-values (type)
+ (%query-enum-or-flags-values #'%flags-class-values '%flags-value type))
+
+
+
+;;;;
+
+(defun expand-enum-type (type-number &optional options)
+ (let* ((super (supertype type-number))
+ (type (type-from-number type-number))
+ (mappings (getf options :mappings))
+ (expanded-mappings
+ (append
+ (delete-if
+ #'(lambda (mapping)
+ (or
+ (assoc (first mapping) mappings)
+ (rassoc (cdr mapping) mappings :test #'equal)))
+ (if (eq super 'enum)
+ (query-enum-values type-number)
+ (query-flags-values type-number)))
+ (remove-if
+ #'(lambda (mapping) (eq (second mapping) nil)) mappings))))
+ `(progn
+ (register-type ',type ,(find-type-name type-number))
+ (deftype ,type () '(,super ,@expanded-mappings)))))
+
+
+(register-derivable-type 'enum "GEnum" 'expand-enum-type)
+(register-derivable-type 'flags "GFlags" 'expand-enum-type)