ibus-qt  1.3.1
/builddir/build/BUILD/ibus-qt-1.3.1-Source/src/qibuspointer.h
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
 All Classes Namespaces Functions Enumerations Enumerator