www.pudn.com > evil¡¯s illusion Server Codes.rar > List.h


 
// ORZ: Áߺ¹ include ¹æÁö 
#pragma once 
 
typedef VOID *	PLISTNODE; 
 
template  class CWHList 
{ 
public: 
	typedef struct tagLINKEDLIST 
	{ 
		T						lpData; 
		struct tagLINKEDLIST	*prev; 
		struct tagLINKEDLIST	*next; 
	} LINKEDLIST, FAR *LPLINKEDLIST; 
 
	LPLINKEDLIST		m_lpHead; 
	LPLINKEDLIST		m_lpTail; 
 
	UINT				m_nCount; 
 
//	CRITICAL_SECTION	m_cs; 
 
public: 
	CWHList(); 
	~CWHList(); 
 
	BOOL			AddNewNode(T lpData); 
	void			Clear(); 
	PLISTNODE		RemoveNode(LPLINKEDLIST lpListNode); 
	BOOL			RemoveNodeByKey(SOCKET s); 
	PLISTNODE		RemoveNodeByData(T lpData); 
	void			*FindNode(LPLINKEDLIST lpList); 
	PLISTNODE		FindData(T t); 
 
	__inline PLISTNODE		GetHead()	 
	{  
		if (m_lpHead)  
			return (PLISTNODE)m_lpHead;  
	 
		return NULL;  
	} 
	 
	__inline PLISTNODE		GetNext(PLISTNODE pListNode) { if (pListNode) return ((LPLINKEDLIST)pListNode)->next; return NULL; } 
	__inline PLISTNODE		RemoveNode(PLISTNODE pListNode) { if (pListNode) return RemoveNode((LPLINKEDLIST)pListNode); return NULL; } 
	__inline UINT			GetCount()	{ return m_nCount; } 
	__inline T				GetData(PLISTNODE pListNode) { if (pListNode) return ((LPLINKEDLIST)pListNode)->lpData; return NULL; } 
}; 
 
template CWHList::CWHList() 
{				   
	m_lpHead = NULL; 
	m_lpTail = NULL; 
 
	m_nCount = 0; 
 
//	InitializeCriticalSection(&m_cs); 
} 
 
template CWHList::~CWHList() 
{ 
	Clear(); 
   
//	DeleteCriticalSection(&m_cs); 
} 
 
template BOOL CWHList::AddNewNode(T lpData) 
{ 
	BOOL fRet = FALSE; 
 
//	EnterCriticalSection(&m_cs); 
 
	LPLINKEDLIST lpCD = (LPLINKEDLIST)GlobalAlloc(GPTR, sizeof(LINKEDLIST)); 
 
	lpCD->lpData = lpData; 
 
	if (!m_lpHead) 
	{ 
		m_lpHead = lpCD; 
		lpCD->prev = (LPLINKEDLIST)NULL; 
	} 
	else 
	{ 
		m_lpTail->next = lpCD; 
		lpCD->prev = m_lpTail; 
	} 
 
	lpCD->next = (LPLINKEDLIST)NULL; 
	m_lpTail = lpCD; 
 
	m_nCount++; 
 
	fRet = TRUE; 
//		LeaveCriticalSection(&m_cs); 
 
	return fRet; 
} 
 
template void CWHList::Clear() 
{ 
//	EnterCriticalSection(&m_cs); 
 
	LPLINKEDLIST	lpNode	= m_lpHead; 
 
	while (lpNode) 
		lpNode = (LPLINKEDLIST)RemoveNode(lpNode); 
//		LeaveCriticalSection(&m_cs); 
} 
 
template PLISTNODE CWHList::RemoveNode(LPLINKEDLIST lpList) 
{ 
    LPLINKEDLIST prev = NULL, next; 
 
//	EnterCriticalSection(&m_cs); 
 
	next = lpList->next; 
	prev = lpList->prev; 
 
	if (prev) prev->next = next; 
	else m_lpHead = next; 
 
	if (next) next->prev = prev; 
	else m_lpTail = prev; 
 
	GlobalFree(lpList); 
	lpList = NULL; 
 
	m_nCount--; 
//		LeaveCriticalSection(&m_cs); 
 
	return (PLISTNODE)next; 
} 
 
template BOOL CWHList::RemoveNodeByKey(SOCKET s) 
{ 
//	EnterCriticalSection(&m_cs); 
 
    LPLINKEDLIST	prev	= NULL, next; 
	LPLINKEDLIST	lpNode	= m_lpHead; 
	BOOL			fFlag	= FALSE; 
 
	while (lpNode) 
	{ 
		if (((CSessionInfo*)lpNode->lpData)->sock == s) 
		{ 
			next = lpNode->next; 
			prev = lpNode->prev; 
 
			if (prev) prev->next = next; 
			else m_lpHead = next; 
 
			if (next) next->prev = prev; 
			else m_lpTail = prev; 
 
			GlobalFree(lpNode); 
			lpNode = NULL; 
 
			m_nCount--; 
 
			fFlag = TRUE; 
 
			break; 
		} 
 
		lpNode = lpNode->next; 
	} 
//		LeaveCriticalSection(&m_cs); 
 
	return fFlag; 
} 
 
template PLISTNODE CWHList::RemoveNodeByData(T lpData) 
{ 
//	EnterCriticalSection(&m_cs); 
 
    LPLINKEDLIST	prev	= NULL, next; 
	LPLINKEDLIST	lpNode	= m_lpHead; 
 
	__try 
	{ 
		while (lpNode) 
		{ 
			if ((T)lpNode->lpData == lpData) 
			{ 
				next = lpNode->next; 
				prev = lpNode->prev; 
 
				if (prev) prev->next = next; 
				else m_lpHead = next; 
 
				if (next) next->prev = prev; 
				else m_lpTail = prev; 
 
				GlobalFree(lpNode); 
				lpNode = NULL; 
 
				m_nCount--; 
 
				break; 
			} 
 
			lpNode = lpNode->next; 
		} 
	} 
	__finally 
	{ 
//		LeaveCriticalSection(&m_cs); 
	} 
 
	return (PLISTNODE)next; 
} 
 
template  void *CWHList::FindNode(LPLINKEDLIST lpList) 
{ 
//	EnterCriticalSection(&m_cs); 
 
	LPLINKEDLIST lpNode = m_lpHead; 
 
	while (lpNode) 
	{ 
		if (lpNode == lpList) 
		{ 
			// ORZ: ÄÚµå Ãß°¡ 
//			LeaveCriticalSection( &m_cs ); 
			return lpNode; 
		} 
 
		lpNode = lpNode->next; 
	} 
 
//	LeaveCriticalSection(&m_cs); 
 
	return NULL; 
} 
 
template PLISTNODE CWHList::FindData(T t) 
{ 
	LPLINKEDLIST lpNode = m_lpHead; 
 
//	EnterCriticalSection(&m_cs); 
 
	while (lpNode) 
	{ 
		if (((T)lpNode->lpData) == t) 
		{ 
			// ORZ: ÄÚµå Ãß°¡ 
//			LeaveCriticalSection( &m_cs ); 
			return (PLISTNODE)lpNode; 
		} 
 
		lpNode = lpNode->next; 
	} 
 
//	LeaveCriticalSection(&m_cs); 
 
	return (PLISTNODE) NULL; 
}