+(defun %query-enum-or-flags-values (query-function class type)
+ (multiple-value-bind (sap length)
+ (funcall query-function (type-class-ref type))
+ (let ((values nil)
+ (size (proxy-instance-size (find-class class)))
+ (proxy (make-instance class :location sap)))
+ (dotimes (i length)
+ (with-slots (location nickname value) proxy
+ (setf location sap)
+ (setq sap (sap+ sap size))
+ (push
+ (list
+ (intern (substitute #\- #\_ (string-upcase nickname)) "KEYWORD")
+ value)
+ values)))
+ values)))
+
+
+(defclass %enum-value (struct)
+ ((value :allocation :alien :type int)
+ (name :allocation :alien :type string)
+ (nickname :allocation :alien :type string))
+ (:metaclass static-struct-class))
+
+(defbinding %enum-class-values () pointer
+ (class pointer)
+ (n-values unsigned-int :out))
+
+(defun query-enum-values (type)
+ (%query-enum-or-flags-values #'%enum-class-values '%enum-value type))
+
+
+(defclass %flags-value (struct)
+ ((value :allocation :alien :type unsigned-int)
+ (name :allocation :alien :type string)
+ (nickname :allocation :alien :type string))
+ (:metaclass static-struct-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))
+
+