126 lines
2.4 KiB
C++
126 lines
2.4 KiB
C++
///////////////////////////////////////////////////////////////////////////
|
|
// 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
|