Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef GDCMSMARTPOINTER_H
00016 #define GDCMSMARTPOINTER_H
00017
00018 #include "gdcmObject.h"
00019
00020 namespace gdcm
00021 {
00039 template<class ObjectType>
00040 class SmartPointer
00041 {
00042 public:
00043 SmartPointer():Pointer(0) {}
00044 SmartPointer(const SmartPointer<ObjectType>& p):Pointer(p.Pointer)
00045 { Register(); }
00046 SmartPointer(ObjectType* p):Pointer(p)
00047 { Register(); }
00048 SmartPointer(ObjectType const & p)
00049 {
00050 Pointer = const_cast<ObjectType*>(&p);
00051 Register();
00052 }
00053 ~SmartPointer() {
00054 UnRegister();
00055 Pointer = 0;
00056 }
00057
00059 ObjectType *operator -> () const
00060 { return Pointer; }
00061
00062 ObjectType& operator * () const
00063 { return *Pointer; }
00064
00066 operator ObjectType * () const
00067 { return Pointer; }
00068
00070 SmartPointer &operator = (SmartPointer const &r)
00071 { return operator = (r.Pointer); }
00072
00074 SmartPointer &operator = (ObjectType *r)
00075 {
00076
00077
00078
00079
00080 if( Pointer != r )
00081 {
00082 ObjectType* old = Pointer;
00083 Pointer = r;
00084 Register();
00085 if ( old ) { old->UnRegister(); }
00086 }
00087 return *this;
00088 }
00089
00090 SmartPointer &operator = (ObjectType const &r)
00091 {
00092 ObjectType* tmp = const_cast<ObjectType*>(&r);
00093 return operator = (tmp);
00094 }
00095
00097 ObjectType *GetPointer() const
00098 { return Pointer; }
00099
00100 private:
00101 void Register()
00102 {
00103 if(Pointer) Pointer->Register();
00104 }
00105
00106 void UnRegister()
00107 {
00108 if(Pointer) Pointer->UnRegister();
00109 }
00110
00111 ObjectType* Pointer;
00112 };
00113
00114 }
00115
00116 #endif //GDCMSMARTPOINTER_H
00117