You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
125 lines
2.4 KiB
125 lines
2.4 KiB
/////////////////////////////////////////////////////////////////////////// |
|
// Interstate Gangs : smart_ptr.inl |
|
/////////////////////////////////////////////////////////////////////////// |
|
// This file is under GPL licence |
|
/////////////////////////////////////////////////////////////////////////// |
|
// CHANGELOG |
|
// Groove - 13/06/2005 : |
|
// - Create file |
|
/////////////////////////////////////////////////////////////////////////// |
|
|
|
namespace gli |
|
{ |
|
template <typename T> |
|
util::CSmartPtr<T>::CSmartPtr() |
|
{ |
|
m_pPointer = 0; |
|
} |
|
|
|
template <typename T> |
|
util::CSmartPtr<T>::CSmartPtr(const util::CSmartPtr<T> & SmartPtr) |
|
{ |
|
m_pReference = SmartPtr.m_pReference; |
|
m_pPointer = SmartPtr.m_pPointer; |
|
(*m_pReference)++; |
|
} |
|
|
|
template <typename T> |
|
util::CSmartPtr<T>::CSmartPtr(T* pPointer) |
|
{ |
|
m_pReference = new int; |
|
m_pPointer = pPointer; |
|
(*m_pReference) = 1; |
|
} |
|
|
|
template <typename T> |
|
util::CSmartPtr<T>::~CSmartPtr() |
|
{ |
|
if(!m_pPointer) |
|
return; |
|
|
|
(*m_pReference)--; |
|
if(*m_pReference <= 0) |
|
{ |
|
delete m_pReference; |
|
delete m_pPointer; |
|
} |
|
} |
|
|
|
template <typename T> |
|
util::CSmartPtr<T>& util::CSmartPtr<T>::operator=(const util::CSmartPtr<T> & SmartPtr) |
|
{ |
|
if(m_pPointer) |
|
{ |
|
(*m_pReference)--; |
|
if(*m_pReference <= 0) |
|
{ |
|
delete m_pReference; |
|
delete m_pPointer; |
|
} |
|
} |
|
|
|
m_pReference = SmartPtr.m_pReference; |
|
m_pPointer = SmartPtr.m_pPointer; |
|
(*m_pReference)++; |
|
|
|
return *this; |
|
} |
|
|
|
template <typename T> |
|
util::CSmartPtr<T>& util::CSmartPtr<T>::operator=(T* pPointer) |
|
{ |
|
if(m_pPointer) |
|
{ |
|
(*m_pReference)--; |
|
if(*m_pReference <= 0) |
|
{ |
|
delete m_pReference; |
|
delete m_pPointer; |
|
} |
|
} |
|
|
|
m_pReference = new int; |
|
m_pPointer = pPointer; |
|
(*m_pReference) = 1; |
|
|
|
return *this; |
|
} |
|
|
|
template <typename T> |
|
bool util::CSmartPtr<T>::operator==(const util::CSmartPtr<T> & SmartPtr) const |
|
{ |
|
return m_pPointer == SmartPtr.m_pPointer; |
|
} |
|
|
|
template <typename T> |
|
bool util::CSmartPtr<T>::operator!=(const util::CSmartPtr<T> & SmartPtr) const |
|
{ |
|
return m_pPointer != SmartPtr.m_pPointer; |
|
} |
|
|
|
template <typename T> |
|
T& util::CSmartPtr<T>::operator*() |
|
{ |
|
return *m_pPointer; |
|
} |
|
|
|
template <typename T> |
|
T* util::CSmartPtr<T>::operator->() |
|
{ |
|
return m_pPointer; |
|
} |
|
|
|
template <typename T> |
|
const T& util::CSmartPtr<T>::operator*() const |
|
{ |
|
return *m_pPointer; |
|
} |
|
|
|
template <typename T> |
|
const T* util::CSmartPtr<T>::operator->() const |
|
{ |
|
return m_pPointer; |
|
} |
|
|
|
}//namespace gli
|
|
|