template<class T> class SmartPointer {
struct SPData {
SPData(T *obj){ m_ptr = obj; m_count = 1; }
~SPData(){ delete m_ptr; }
T* m_ptr;
uint m_count;
};
public:
SmartPointer(T *obj=0){
m_data = new SPData(obj);
}
~SmartPointer(){
deref();
}
SmartPointer(SmartPointer &other){
m_data = other.m_data;
ref();
}
SmartPointer &operator=(SmartPointer &other){
if(other.m_data==m_data)
return *this;
deref();
m_data = other.m_data;
ref();
}
SmartPointer &operator=(T *obj){
if(!m_data){
m_data = new SPData(obj);
return *this;
}
if(obj==m_data->m_ptr) return *this;
m_data->deref();
m_data = new SPData(obj);
return *this;
}
bool operator==(SmartPointer &other) const{ return m_data==other.m_data; }
T operator*(){ return m_data ? m_data->m_ptr : T(); }
const T* operator T*() const { return m_data ? m_data->m_ptr : 0; }
private:
SPData *m_data;
void deref(){
if(!m_data) return;
if((--(m_data->m_count))==0){
delete m_data;
}
}
void ref(){
m_data->m_count++;
}
int m_count;
};