00001 #ifndef __Q_IBUS_OBJECT_H__
00002 #define __Q_IBUS_OBJECT_H__
00003
00004 #include <QObject>
00005 #include <QMetaType>
00006 #include "qibuspointer.h"
00007
00008 #ifdef QT_USE_NAMESPACE
00009 # undef QT_USE_NAMESPACE
00010 # define QT_USE_NAMESPACE IBus
00011 #endif
00012
00013 namespace IBus {
00014
00015 class Object;
00016 typedef Pointer <Object> ObjectPointer;
00017
00018 class Object : public QObject
00019 {
00020 Q_OBJECT
00021 template <typename T> friend class Pointer;
00022
00023 public:
00024
00025 Object () : m_referenced (false), m_refcount(1) {}
00026 virtual ~Object ();
00027 virtual void destroy ();
00028
00029 private:
00030 Object * ref () {
00031 if (m_referenced) {
00032 m_refcount.ref ();
00033 }
00034 else {
00035 m_referenced = true;
00036 }
00037 return this;
00038 }
00039
00040 void unref () {
00041 if (! m_refcount.deref ()) {
00042 delete this;
00043 }
00044 }
00045
00046 bool is_referenced () const {
00047 return m_referenced;
00048 }
00049
00050 bool m_referenced;
00051 QAtomicInt m_refcount;
00052 };
00053
00054 };
00055
00056 Q_DECLARE_METATYPE(IBus::ObjectPointer)
00057
00058 #endif