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
 | 
						|
 |