#pragma once
template<class T_C> class T_SmartRefPtr
{
T_C* m_Ptr;
int* m_Ref;
public:
friend class T_SmartRefPtr;
T_C* operator->(){return m_Ptr;}
T_C& operator *(){return *m_Ptr;}
T_SmartRefPtr()
:m_Ptr(new T_C)
,m_Ref(new int(1))
{}
T_SmartRefPtr(T_C* ptr)
:m_Ptr(ptr)
,m_Ref(new int(1))
{}
T_SmartRefPtr(const T_SmartRefPtr& h)
:m_Ptr(h.m_Ptr)
,m_Ref(h.m_Ref)
{
(*m_Ref)++;
}
template<class T_CP1>T_SmartRefPtr(const T_SmartRefPtr<T_CP1>& h)
:m_Ptr(h.m_Ptr)
,m_Ref(h.m_Ref)
{
(*m_Ref)++;
}
T_SmartRefPtr& operator=(const T_SmartRefPtr& h)
{
if(m_Ptr==h.m_Ptr) return *this;
if(--(*m_Ref)==0)
{
delete m_Ptr;
delete m_Ref;
}
m_Ptr=h.m_Ptr;
m_Ref=h.m_Ref;
(*m_Ref)++;
return *this;
}
template<class T_CP1>T_SmartRefPtr& operator=(const T_SmartRefPtr<T_CP1>& h)
{
if(m_Ptr==h.m_Ptr) return *this;
if(--(*m_Ref)==0)
{
delete m_Ptr;
delete m_Ref;
}
m_Ptr=h.m_Ptr;
m_Ref=h.m_Ref;
(*m_Ref)++;
return *this;
}
~T_SmartRefPtr()
{
if(--(*m_Ref)==0)
{
delete m_Ptr;
delete m_Ref;
}
}
};