VTK
|
00001 /*========================================================================= 00002 00003 Program: Visualization Toolkit 00004 Module: vtkSmartPointer.h 00005 00006 Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen 00007 All rights reserved. 00008 See Copyright.txt or http://www.kitware.com/Copyright.htm for details. 00009 00010 This software is distributed WITHOUT ANY WARRANTY; without even 00011 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 00012 PURPOSE. See the above copyright notice for more information. 00013 00014 =========================================================================*/ 00028 #ifndef __vtkSmartPointer_h 00029 #define __vtkSmartPointer_h 00030 00031 #include "vtkSmartPointerBase.h" 00032 00033 template <class T> 00034 class vtkSmartPointer: public vtkSmartPointerBase 00035 { 00036 static T* CheckType(T* t) { return t; } 00037 public: 00039 vtkSmartPointer() {} 00040 00042 vtkSmartPointer(T* r): vtkSmartPointerBase(r) {} 00043 00045 00047 template <class U> 00048 vtkSmartPointer(const vtkSmartPointer<U>& r): 00049 vtkSmartPointerBase(CheckType(r.GetPointer())) {} 00051 00053 00055 vtkSmartPointer& operator=(T* r) 00056 { 00057 this->vtkSmartPointerBase::operator=(r); 00058 return *this; 00059 } 00061 00063 00065 template <class U> 00066 vtkSmartPointer& operator=(const vtkSmartPointer<U>& r) 00067 { 00068 this->vtkSmartPointerBase::operator=(CheckType(r.GetPointer())); 00069 return *this; 00070 } 00072 00074 00075 T* GetPointer() const 00076 { 00077 return static_cast<T*>(this->Object); 00078 } 00079 T* Get() const 00080 { 00081 return static_cast<T*>(this->Object); 00082 } 00084 00086 00087 operator T* () const 00088 { 00089 return static_cast<T*>(this->Object); 00090 } 00092 00094 00096 T& operator*() const 00097 { 00098 return *static_cast<T*>(this->Object); 00099 } 00101 00103 00104 T* operator->() const 00105 { 00106 return static_cast<T*>(this->Object); 00107 } 00109 00111 00118 void TakeReference(T* t) 00119 { 00120 *this = vtkSmartPointer<T>(t, NoReference()); 00121 } 00123 00125 00126 static vtkSmartPointer<T> New() 00127 { 00128 return vtkSmartPointer<T>(T::New(), NoReference()); 00129 } 00131 00133 00134 static vtkSmartPointer<T> NewInstance(T* t) 00135 { 00136 return vtkSmartPointer<T>(t->NewInstance(), NoReference()); 00137 } 00139 00141 00149 static vtkSmartPointer<T> Take(T* t) 00150 { 00151 return vtkSmartPointer<T>(t, NoReference()); 00152 } 00154 00155 // Work-around for HP and IBM overload resolution bug. Since 00156 // NullPointerOnly is a private type the only pointer value that can 00157 // be passed by user code is a null pointer. This operator will be 00158 // chosen by the compiler when comparing against null explicitly and 00159 // avoid the bogus ambiguous overload error. 00160 #if defined(__HP_aCC) || defined(__IBMCPP__) 00161 # define VTK_SMART_POINTER_DEFINE_OPERATOR_WORKAROUND(op) \ 00162 bool operator op (NullPointerOnly*) const \ 00163 { \ 00164 return ::operator op (*this, 0); \ 00165 } 00166 private: 00167 class NullPointerOnly {}; 00168 public: 00169 VTK_SMART_POINTER_DEFINE_OPERATOR_WORKAROUND(==) 00170 VTK_SMART_POINTER_DEFINE_OPERATOR_WORKAROUND(!=) 00171 VTK_SMART_POINTER_DEFINE_OPERATOR_WORKAROUND(<) 00172 VTK_SMART_POINTER_DEFINE_OPERATOR_WORKAROUND(<=) 00173 VTK_SMART_POINTER_DEFINE_OPERATOR_WORKAROUND(>) 00174 VTK_SMART_POINTER_DEFINE_OPERATOR_WORKAROUND(>=) 00175 # undef VTK_SMART_POINTER_DEFINE_OPERATOR_WORKAROUND 00176 #endif 00177 protected: 00178 vtkSmartPointer(T* r, const NoReference& n): vtkSmartPointerBase(r, n) {} 00179 private: 00180 // These are purposely not implemented to prevent callers from 00181 // trying to take references from other smart pointers. 00182 void TakeReference(const vtkSmartPointerBase&); // Not implemented. 00183 static void Take(const vtkSmartPointerBase&); // Not implemented. 00184 }; 00185 00186 #define VTK_SMART_POINTER_DEFINE_OPERATOR(op) \ 00187 template <class T> \ 00188 inline bool \ 00189 operator op (const vtkSmartPointer<T>& l, const vtkSmartPointer<T>& r) \ 00190 { \ 00191 return (l.GetPointer() op r.GetPointer()); \ 00192 } \ 00193 template <class T> \ 00194 inline bool operator op (T* l, const vtkSmartPointer<T>& r) \ 00195 { \ 00196 return (l op r.GetPointer()); \ 00197 } \ 00198 template <class T> \ 00199 inline bool operator op (const vtkSmartPointer<T>& l, T* r) \ 00200 { \ 00201 return (l.GetPointer() op r); \ 00202 } 00203 00204 00205 VTK_SMART_POINTER_DEFINE_OPERATOR(==) 00206 VTK_SMART_POINTER_DEFINE_OPERATOR(!=) 00207 VTK_SMART_POINTER_DEFINE_OPERATOR(<) 00208 VTK_SMART_POINTER_DEFINE_OPERATOR(<=) 00209 VTK_SMART_POINTER_DEFINE_OPERATOR(>) 00210 VTK_SMART_POINTER_DEFINE_OPERATOR(>=) 00212 00213 #undef VTK_SMART_POINTER_DEFINE_OPERATOR 00214 00216 00217 template <class T> 00218 inline ostream& operator << (ostream& os, const vtkSmartPointer<T>& p) 00219 { 00220 return os << static_cast<const vtkSmartPointerBase&>(p); 00221 } 00223 00224 #endif 00225 // VTK-HeaderTest-Exclude: vtkSmartPointer.h