www.pudn.com > GameEngine_src.rar > CMyStack.h


#ifndef CMyStack_h 
#define CMyStack_h 
 
 
#include  
#include  
 
template  
class CMyStack 
{ 
public: 
	CMyStack(); 
	CMyStack( int size ); 
	~CMyStack(); 
 
	bool Init( int size ); 
	void Free(); 
 
	bool Push( T &t ); 
	bool Pop( T &t ); 
 
	void Clear(); 
 
	bool IsEmpty() {return m_top == -1;} 
	bool IsFull() {return m_top + 1 >= m_size;} 
private: 
	T	*m_stack; 
	int m_top; 
	int m_size; 
}; 
 
const int DEFAULT_STACK_SIZE = 4; 
 
/////////////////////////////////////////////////////////////// 
// 
/////////////////////////////////////////////////////////////// 
template  
CMyStack::CMyStack() 
{ 
	m_stack = NULL; 
	m_top = -1; 
	m_size = 0; 
} 
 
/////////////////////////////////////////////////////////////// 
// 
/////////////////////////////////////////////////////////////// 
template  
CMyStack::CMyStack( int size ) 
{ 
	m_stack = NULL; 
	m_top = -1; 
	m_size = 0; 
	Init( size ); 
} 
 
/////////////////////////////////////////////////////////////// 
// 
/////////////////////////////////////////////////////////////// 
template  
CMyStack::~CMyStack() 
{ 
	Free(); 
} 
 
 
/////////////////////////////////////////////////////////////// 
// 
/////////////////////////////////////////////////////////////// 
template  
bool CMyStack::Init( int size ) 
{ 
	if ( m_stack == NULL ) 
	{ 
		if ( size < DEFAULT_STACK_SIZE ) 
			size = DEFAULT_STACK_SIZE; 
 
		m_stack = (T *)malloc( size * sizeof(T) ); 
		if ( m_stack != NULL ) 
		{ 
			m_size = size; 
			return true; 
		} 
	} 
 
	return false; 
} 
 
 
/////////////////////////////////////////////////////////////// 
// 
/////////////////////////////////////////////////////////////// 
template  
void CMyStack::Free() 
{ 
	if ( m_stack != NULL ) 
	{ 
		Clear(); 
		free( m_stack ); 
		m_stack = NULL; 
		m_top = 0; 
		m_size = 0; 
	} 
} 
 
 
/////////////////////////////////////////////////////////////// 
// 
/////////////////////////////////////////////////////////////// 
template  
bool CMyStack::Push( T &t ) 
{ 
	if ( m_top+1 < m_size ) 
	{ 
		++m_top; 
		::new ( &m_stack[m_top] ) T; 
		m_stack[m_top] = t; 
		 
		return true; 
	} 
 
	return false; 
} 
 
/////////////////////////////////////////////////////////////// 
// 
/////////////////////////////////////////////////////////////// 
template  
bool CMyStack::Pop( T &t ) 
{ 
	if ( m_top > -1 ) 
	{ 
		t = m_stack[m_top]; 
		m_stack[m_top].~T(); 
		--m_top; 
		return true; 
	} 
 
	return false; 
} 
 
 
/////////////////////////////////////////////////////////////// 
// 
/////////////////////////////////////////////////////////////// 
template  
void CMyStack::Clear() 
{ 
	for ( int i = m_top; i >= 0; --i ) 
	{ 
		m_stack[i].~T(); 
	} 
 
	m_top = -1; 
} 
 
 
template  
class CStaticStack 
{ 
public: 
	CStaticStack(); 
	~CStaticStack(); 
 
	bool Push( const T &t ); 
	bool Pop( T &t ); 
 
	void Clear(); 
 
	bool IsEmpty() {return m_top == -1;} 
	bool IsFull() {return m_top + 1 >= n;} 
 
	T *GetStack() { return m_stack; } 
	int GetTop() { return m_top; } 
private: 
	T	m_stack[n]; 
	int m_top; 
}; 
 
 
/////////////////////////////////////////////////////////////// 
// 
/////////////////////////////////////////////////////////////// 
template  
CStaticStack::CStaticStack() 
{ 
	m_top = -1; 
} 
 
 
/////////////////////////////////////////////////////////////// 
// 
/////////////////////////////////////////////////////////////// 
template  
CStaticStack::~CStaticStack() 
{ 
	Clear(); 
} 
 
 
/////////////////////////////////////////////////////////////// 
// 
/////////////////////////////////////////////////////////////// 
template  
bool CStaticStack::Push( const T &t ) 
{ 
	if ( m_top+1 < n ) 
	{ 
		++m_top; 
		::new ( &m_stack[m_top] ) T; 
		m_stack[m_top] = t; 
		 
		return true; 
	} 
 
	return false; 
} 
 
/////////////////////////////////////////////////////////////// 
// 
/////////////////////////////////////////////////////////////// 
template  
bool CStaticStack::Pop( T &t ) 
{ 
	if ( m_top > -1 ) 
	{ 
		t = m_stack[m_top]; 
		m_stack[m_top].~T(); 
		--m_top; 
		return true; 
	} 
 
	return false; 
} 
 
 
/////////////////////////////////////////////////////////////// 
// 
/////////////////////////////////////////////////////////////// 
template  
void CStaticStack::Clear() 
{ 
	for ( int i = m_top; i >= 0; --i ) 
	{ 
		m_stack[i].~T(); 
	} 
 
	m_top = -1; 
} 
#endif