Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members | Related Pages

Common/vtkSmartPointerBase.h

Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Visualization Toolkit
00004   Module:    $RCSfile: vtkSmartPointerBase.h,v $
00005   Language:  C++
00006 
00007   Copyright (c) 1993-2002 Ken Martin, Will Schroeder, Bill Lorensen 
00008   All rights reserved.
00009   See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
00010 
00011      This software is distributed WITHOUT ANY WARRANTY; without even 
00012      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
00013      PURPOSE.  See the above copyright notice for more information.
00014 
00015 =========================================================================*/
00029 #ifndef __vtkSmartPointerBase_h
00030 #define __vtkSmartPointerBase_h
00031 
00032 #include "vtkObjectBase.h"
00033 
00034 class VTK_COMMON_EXPORT vtkSmartPointerBase
00035 {
00036 public:
00038   vtkSmartPointerBase();
00039   
00041   vtkSmartPointerBase(vtkObjectBase* r);
00042   
00045   vtkSmartPointerBase(const vtkSmartPointerBase& r);
00046   
00048   ~vtkSmartPointerBase();
00049   
00051 
00053   vtkSmartPointerBase& operator=(vtkObjectBase* r);
00054   vtkSmartPointerBase& operator=(const vtkSmartPointerBase& r);
00056   
00058 
00059   vtkObjectBase* GetPointer() const
00060     {
00061     // Inline implementation so smart pointer comparisons can be fully
00062     // inlined.
00063     return this->Object;
00064     }
00066 protected:
00067   
00068   // Internal utility methods.
00069   void Swap(vtkSmartPointerBase& r);
00070   void Register();
00071   void UnRegister();
00072   
00073   // Pointer to the actual object.
00074   vtkObjectBase* Object;
00075 };
00076 
00077 //----------------------------------------------------------------------------
00078 // Need to switch on bool type because std::less requires bool return
00079 // type from operators.  This example should not be used to justify
00080 // using bool elsewhere in VTK.
00081 #ifdef VTK_COMPILER_HAS_BOOL
00082 # define VTK_SMART_POINTER_BASE_BOOL bool
00083 #else
00084 # define VTK_SMART_POINTER_BASE_BOOL int
00085 #endif
00086 
00087 #define VTK_SMART_POINTER_BASE_DEFINE_OPERATOR(op) \
00088   inline VTK_SMART_POINTER_BASE_BOOL \
00089   operator op (const vtkSmartPointerBase& l, const vtkSmartPointerBase& r) \
00090     { \
00091     return (static_cast<void*>(l.GetPointer()) op \
00092             static_cast<void*>(r.GetPointer())); \
00093     } \
00094   inline VTK_SMART_POINTER_BASE_BOOL \
00095   operator op (vtkObjectBase* l, const vtkSmartPointerBase& r) \
00096     { \
00097     return (static_cast<void*>(l) op static_cast<void*>(r.GetPointer())); \
00098     } \
00099   inline VTK_SMART_POINTER_BASE_BOOL \
00100   operator op (const vtkSmartPointerBase& l, vtkObjectBase* r) \
00101     { \
00102     return (static_cast<void*>(l.GetPointer()) op static_cast<void*>(r)); \
00103     }
00104 
00105 VTK_SMART_POINTER_BASE_DEFINE_OPERATOR(==)  
00106 VTK_SMART_POINTER_BASE_DEFINE_OPERATOR(!=)
00107 VTK_SMART_POINTER_BASE_DEFINE_OPERATOR(<)
00108 VTK_SMART_POINTER_BASE_DEFINE_OPERATOR(<=)
00109 VTK_SMART_POINTER_BASE_DEFINE_OPERATOR(>)
00110 VTK_SMART_POINTER_BASE_DEFINE_OPERATOR(>=)
00111 
00112 #undef VTK_SMART_POINTER_BASE_DEFINE_OPERATOR
00113 #undef VTK_SMART_POINTER_BASE_BOOL
00114 
00116 
00117 VTK_COMMON_EXPORT ostream& operator << (ostream& os,
00118                                         const vtkSmartPointerBase& p);
00120 
00121 #endif