repos
/
smoke
/ annotate_shade
summary
|
shortlog
|
log
|
tree
|
commit
|
commitdiff
|
headdiff
|
annotate
|
headblob
|
headfilediff
|
filehistory
normal
|
plain
|
shade
|
zebra
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