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