00001 #ifndef __Q_IBUS_POINTER_H__ 00002 #define __Q_IBUS_POINTER_H__ 00003 00004 #include <QObject> 00005 #include <QAtomicInt> 00006 00007 namespace IBus { 00008 00009 template <typename T> 00010 class Pointer 00011 { 00012 public: 00013 Pointer (T *object = 0) : p (0) { 00014 set (object); 00015 } 00016 00017 Pointer (const Pointer &src) : p (0) { 00018 set (src.get ()); 00019 } 00020 00021 template <typename T1> 00022 Pointer (const Pointer<T1> &src): p (0) { 00023 set (dynamic_cast<T *> (src.get ())); 00024 } 00025 00026 ~Pointer () { 00027 set (0); 00028 } 00029 00030 Pointer &operator= (T *object) { 00031 set (object); 00032 return *this; 00033 } 00034 00035 Pointer &operator= (const Pointer &src) { 00036 set (src.get ()); 00037 return *this; 00038 } 00039 00040 template <typename T1> 00041 Pointer &operator= (const Pointer<T1> &src) { 00042 set (dynamic_cast<T *> (src.get ())); 00043 return *this; 00044 } 00045 00046 T &operator* () const { 00047 return *get (); 00048 } 00049 00050 T *operator-> () const { 00051 return get (); 00052 } 00053 00054 operator T* () const { 00055 return get (); 00056 } 00057 00058 operator bool () const { 00059 return !isNull (); 00060 } 00061 00062 T *get () const { 00063 return p; 00064 } 00065 00066 bool isNull () const { 00067 return p == 0; 00068 } 00069 00070 protected: 00071 T *p; 00072 00073 void set (T *object) { 00074 if (p) 00075 p->unref (); 00076 if (object) 00077 object->ref (); 00078 p = object; 00079 } 00080 }; 00081 00082 }; 00083 #endif