00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
#ifndef __itkSmartPointer_h
00018
#define __itkSmartPointer_h
00019
00020
#include "itkMacro.h"
00021
#include "itkWeakPointer.h"
00022
#include <iostream>
00023
00024
namespace itk
00025 {
00026
00043
template <
class TObjectType>
00044 class ITK_EXPORT SmartPointer
00045 {
00046
public:
00047 typedef TObjectType
ObjectType;
00048
00050 SmartPointer ()
00051 { m_Pointer = 0; }
00052
00054 SmartPointer (
const SmartPointer<ObjectType> &p):
00055 m_Pointer(p.m_Pointer)
00056 { this->Register(); }
00057
00059 SmartPointer (
ObjectType *p):
00060 m_Pointer(p)
00061 { this->Register(); }
00062
00064 SmartPointer (
const WeakPointer<ObjectType> &p)
00065 {
00066 m_Pointer = p.
GetPointer();
00067 this->Register();
00068 }
00069
00071 ~SmartPointer ()
00072 {
00073 this->UnRegister();
00074 m_Pointer = 0;
00075 }
00076
00078 ObjectType *operator -> ()
const
00079
{
return m_Pointer; }
00080
00082 operator ObjectType * ()
const
00083
{
return m_Pointer; }
00084
00086
bool IsNotNull()
const
00087
{
return m_Pointer != 0; }
00088 bool IsNull()
const
00089
{
return m_Pointer == 0; }
00090
00092
template <
typename R>
00093
bool operator == ( R r )
const
00094
{
return (m_Pointer == (
ObjectType*)(r) ); }
00095
00096 template <
typename R>
00097
bool operator != ( R r )
const
00098
{
return (m_Pointer != (
ObjectType*)(r) ); }
00099
00101 ObjectType *GetPointer ()
const
00102
{
return m_Pointer; }
00103
00105
bool operator < (
const SmartPointer &r)
const
00106
{
return (
void*)m_Pointer < (
void*) r.m_Pointer; }
00107
00109
bool operator > (
const SmartPointer &r)
const
00110
{
return (
void*)m_Pointer > (
void*) r.m_Pointer; }
00111
00113
bool operator <= (
const SmartPointer &r)
const
00114
{
return (
void*)m_Pointer <= (
void*) r.m_Pointer; }
00115
00117
bool operator >= (
const SmartPointer &r)
const
00118
{
return (
void*)m_Pointer >= (
void*) r.m_Pointer; }
00119
00121 SmartPointer &operator = (
const SmartPointer &r)
00122 {
return this->operator = (r.GetPointer()); }
00123
00125 SmartPointer &operator = (
const WeakPointer<ObjectType> &r)
00126 {
return this->operator = (r.GetPointer()); }
00127
00129 SmartPointer &operator = (ObjectType *r)
00130 {
00131
if (m_Pointer != r)
00132 {
00133
ObjectType* tmp = m_Pointer;
00134 m_Pointer = r;
00135 this->Register();
00136
if ( tmp ) { tmp->UnRegister(); }
00137 }
00138
return *
this;
00139 }
00140
00142 ObjectType *Print (std::ostream& os)
const
00143
{
00144
00145 (*m_Pointer).Print(os);
00146 return m_Pointer;
00147 }
00148
00149
private:
00151 ObjectType* m_Pointer;
00152
00153
void Register()
00154 {
00155
if(m_Pointer) { m_Pointer->Register(); }
00156 }
00157
00158
void UnRegister()
00159 {
00160
if(m_Pointer) { m_Pointer->UnRegister(); }
00161 }
00162 };
00163
00164
00165
template <
typename T>
00166 std::ostream& operator<< (std::ostream& os, SmartPointer<T> p)
00167 {
00168 p.Print(os);
00169
return os;
00170 }
00171
00172 }
00173
00174
#endif