#ifndef LISP_OBJECT_H #define LISP_OBJECT_H #include "cl_smoke_qt.h" #include #include #include #include extern "C" { CL_SMOKE_QT_EXPORT int cl_smoke_setup_lisp_object(void* destruct); CL_SMOKE_QT_EXPORT unsigned int cl_smoke_lisp_object_id(const void* object); CL_SMOKE_QT_EXPORT int cl_smoke_lisp_object_is_set(const void* object); CL_SMOKE_QT_EXPORT void* cl_smoke_make_lisp_object(unsigned int id); CL_SMOKE_QT_EXPORT void* cl_smoke_free_lisp_object(void* object); CL_SMOKE_QT_EXPORT void* cl_smoke_lisp_object_value(const void* variant); } namespace cl_smoke { namespace qt { class lisp_object { public: typedef void (*destructor)(unsigned int id); lisp_object(); lisp_object(unsigned int id); lisp_object(const lisp_object& other); inline unsigned int id() const { Q_ASSERT(this->set()); return d->id; } void set_id(unsigned int id); inline bool set() const { return d->is_set; } friend int ::cl_smoke_setup_lisp_object(void* destruct); private: struct data : public QSharedData { data(); data(unsigned int id); ~data(); unsigned int id; bool is_set; private: Q_DISABLE_COPY(data) }; QExplicitlySharedDataPointer d; static destructor destruct; }; } // namespace qt } // namespace cl_smoke Q_DECLARE_METATYPE(cl_smoke::qt::lisp_object); #endif // LISP_OBJECT_H