/ src / lib /
/src/lib/lisp_object.h
1 #ifndef LISP_OBJECT_H
2 #define LISP_OBJECT_H
3
4 #include "cl_smoke_qt.h"
5
6 #include <QMetaType>
7 #include <QSharedData>
8 #include <QExplicitlySharedDataPointer>
9 #include <smoke.h>
10
11 extern "C"
12 {
13 CL_SMOKE_QT_EXPORT int
14 cl_smoke_setup_lisp_object(void* destruct);
15
16 CL_SMOKE_QT_EXPORT unsigned int
17 cl_smoke_lisp_object_id(const void* object);
18
19 CL_SMOKE_QT_EXPORT int
20 cl_smoke_lisp_object_is_set(const void* object);
21
22 CL_SMOKE_QT_EXPORT void*
23 cl_smoke_make_lisp_object(unsigned int id);
24
25 CL_SMOKE_QT_EXPORT void*
26 cl_smoke_free_lisp_object(void* object);
27
28 CL_SMOKE_QT_EXPORT void*
29 cl_smoke_lisp_object_value(const void* variant);
30 }
31
32 namespace cl_smoke {
33 namespace qt {
34
35 class lisp_object
36 {
37 public:
38 typedef void (*destructor)(unsigned int id);
39
40 lisp_object();
41
42 lisp_object(unsigned int id);
43
44 lisp_object(const lisp_object& other);
45
46 inline unsigned int
47 id() const
48 { Q_ASSERT(this->set()); return d->id; }
49
50 void
51 set_id(unsigned int id);
52
53 inline bool
54 set() const
55 { return d->is_set; }
56
57 friend int
58 ::cl_smoke_setup_lisp_object(void* destruct);
59
60 private:
61 struct data : public QSharedData
62 {
63 data();
64 data(unsigned int id);
65 ~data();
66 unsigned int id;
67 bool is_set;
68
69 private:
70 Q_DISABLE_COPY(data)
71 };
72
73 QExplicitlySharedDataPointer<data> d;
74
75 static destructor destruct;
76 };
77
78 } // namespace qt
79 } // namespace cl_smoke
80
81 Q_DECLARE_METATYPE(cl_smoke::qt::lisp_object);
82
83 #endif // LISP_OBJECT_H