Cleanup C++ to Lisp translation
Annotate for file src/objects/enum.lisp
2009-04-05 tobias 1 (in-package :cxx-support)
15:36:29 ' 2
' 3 (eval-when (:compile-toplevel :load-toplevel :execute)
' 4 (use-package :smoke :cxx-support))
' 5
' 6 ;;; One could map enum-values to lisp symbols, store the type in the plist
2009-05-12 tobias 7 ;;; an use those as enums, but C++ enums may have several symbols for
2009-04-05 tobias 8 ;;; the same value and thus lisp symbols can not be used.
15:36:29 ' 9
' 10 (defclass enum ()
' 11 ((value :reader value
2009-05-28 tobias 12 :type integer
2009-04-05 tobias 13 :initarg :value)
15:36:29 ' 14 (type :reader enum-type
' 15 :initarg :type))
' 16 (:documentation "Holds the integer value and type of an C++ enum value."))
' 17
2009-05-12 tobias 18 ;; Clozure CL needs this
2009-06-30 tobias 19 ;; for the constants (e.g.: QT:+ALT+)
2009-05-12 tobias 20 (defmethod make-load-form ((enum enum) &optional environment)
13:54:46 ' 21 `(make-instance 'enum
' 22 :value ,(value enum)
2009-06-30 tobias 23 :type ,(make-load-form (enum-type enum) environment)))
2009-05-12 tobias 24
2009-04-05 tobias 25 (defmethod print-object ((enum enum) stream)
15:36:29 ' 26 (print-unreadable-object (enum stream :type t)
' 27 (format stream "~A ~A" (name (enum-type enum))
' 28 (value enum))))
' 29
' 30
' 31 (defun check-enum-type (enum enum-type)
2009-05-11 tobias 32 (assert (smoke-type= (enum-type enum)
2009-08-02 tobias 33 enum-type)
2009-04-05 tobias 34 (enum enum-type)
15:36:29 ' 35 "The enums ~A is not of type ~A." enum (name enum-type)))
' 36
' 37 (defun enum= (enum1 enum2)
' 38 "Returns true when ENUM1 and ENUM2 are equal and false otherwise."
' 39 (declare (enum enum1 enum2))
2009-05-11 tobias 40 (assert (smoke-type= (enum-type enum1)
2009-08-02 tobias 41 (enum-type enum2))
2009-04-05 tobias 42 (enum1 enum2)
15:36:29 ' 43 "The enums ~A and ~A have a different type." enum1 enum2)
' 44 (= (value enum1) (value enum2)))
' 45
' 46 (defmacro enum-xcase (case keyform &body cases)
2009-08-27 tobias 47 (let ((type (enum-type (eval (first (first cases))))))
2009-04-05 tobias 48 (loop for case in cases do
2009-08-27 tobias 49 (check-enum-type (eval (first case))
2009-04-05 tobias 50 type)))
15:36:29 ' 51 `(progn
2009-08-27 tobias 52 ; (check-enum-type (enum-type ,keyform)
11:43:13 ' 53 ; (enum-type ,(first (first cases))))
2009-04-05 tobias 54 (,case (value ,keyform)
15:36:29 ' 55 ,@(loop for case in cases
2009-08-27 tobias 56 collect `(,(value (eval (first case)))
11:43:13 ' 57 ,@(rest case))))))
2009-04-05 tobias 58
15:36:29 ' 59 (defmacro enum-case (keyform &body cases)
' 60 `(enum-xcase case ,keyform ,@cases))
' 61
' 62 (defmacro enum-ecase (keyform &body cases)
' 63 `(enum-xcase ecase ,keyform ,@cases))
' 64
' 65 (defmacro enum-cases (keyform &body cases)
' 66 "Keyform returns a number; cases are enums."
' 67 `(case ,keyform
' 68 ,@(loop for case in cases
2009-08-02 tobias 69 collect `(,(value (eval (first case)))
10:12:41 ' 70 ,@(rest case)))))
2009-04-05 tobias 71
15:36:29 ' 72 (defun enum-logand (&rest enums)
' 73 (apply #'logand (mapcar #'value enums)))
2009-06-08 tobias 74 (defun enum-logior (&rest enums)
09:20:54 ' 75 (apply #'logior (mapcar #'value enums)))
' 76