MeVisLabToolboxReference
MeVis/Foundation/Sources/OSXSupport/macSmartPtr.h
Go to the documentation of this file.
00001 // **InsertLicense** code author="Felix Ritter" version="1.0"
00002 
00006 
00007 #ifndef __macSmartPtr_H
00008 #define __macSmartPtr_H
00009 #if defined(__APPLE__)
00010 
00011 #include <stdlib.h>
00012 
00013 namespace macx {
00014   
00016   template <class T>
00017   class SmartPtr
00018   {
00019   public:
00020     
00021     SmartPtr() : _object(NULL) {}
00022     
00023     SmartPtr(const SmartPtr<T> &p) : _object(NULL) {
00024       setObject(p.object());
00025     }
00026     
00027     SmartPtr(T *o) {
00028       _object = o;
00029       if (o) o->retain();
00030     }
00031     
00032     ~SmartPtr() {
00033       if (_object) _object->release();
00034     }
00035     
00036     SmartPtr<T> &operator=(const SmartPtr<T> &p) {
00037       setObject(p.object());
00038       return *this;
00039     }
00040     
00041     SmartPtr<T> &operator=(T *o) {
00042       setObject(o);
00043       return *this;
00044     }
00045     
00046     bool operator==(const SmartPtr<T> &p) const {
00047       return object() == p.object();
00048     }
00049     
00050     bool operator!= (const SmartPtr<T>& p) const {
00051       return !(*this == p);
00052     }
00053     
00054     bool operator==(T *p) const {
00055       return object() == p;
00056     }
00057     
00058     bool operator!= (T *p) const {
00059       return object() != p;
00060     }
00061     
00062     bool isNull() const { return !object(); }
00063     
00064     T* operator->() const { return object(); }
00065     
00066     T& operator*() const { return *(object()); }
00067     
00068     operator T*() const { return object(); }
00069     
00070   protected:
00071     
00072     T *object() const {
00073       return _object;
00074     }
00075     
00076     void setObject(T *o) {
00077       if (o != _object) {
00078         if (_object) _object->release();
00079         _object = o;
00080         if (_object) _object->retain();
00081       }
00082     }
00083     
00084   private:
00085     
00086     T *_object;
00087   };
00088   
00089 }
00090 
00091 #endif  // __APPLE__
00092 #endif  // __macSmartPtr_H