NodeList.h
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:2k
源码类别:

模拟服务器

开发平台:

C/C++

  1. /********************************************************************
  2. created: 2003/02/14
  3. file base: NodeList
  4. file ext: h
  5. author: liupeng
  6. purpose: Data struct and define
  7. *********************************************************************/
  8. #ifndef __INCLUDE_NODELIST_H__
  9. #define __INCLUDE_NODELIST_H__
  10. #if defined (_MSC_VER) && (_MSC_VER >= 1020)
  11. #pragma once
  12. #endif
  13. #include <wtypes.h>
  14. /*
  15.  * namespace OnlineGameLib
  16.  */
  17. namespace OnlineGameLib {
  18. /*
  19.  * CNodeList
  20.  */
  21. class CNodeList
  22. {
  23. public:
  24. class Node
  25.     {
  26. public:
  27. Node *Next() const { return m_pNext; };
  28. void Next( Node *pNext );
  29. void AddToList( CNodeList *pList );
  30. void RemoveFromList();
  31. protected:
  32. Node();
  33. ~Node();
  34. private:
  35. friend class CNodeList;
  36. void Unlink();
  37. Node *m_pNext;
  38. Node *m_pPrev;
  39. CNodeList *m_pList;
  40. };
  41. CNodeList();
  42. void PushNode( Node *pNode );
  43. Node *PopNode();
  44. Node *Head() const { return m_pHead; };
  45. size_t Count() const { return m_numNodes; };
  46. bool Empty() const { return ( 0 == m_numNodes ); };
  47. private:
  48. friend void Node::RemoveFromList();
  49. void RemoveNode( Node *pNode );
  50. Node *m_pHead; 
  51. size_t m_numNodes;
  52. };
  53. inline void CNodeList::Node::Next( Node *pNext )
  54. {
  55. m_pNext = pNext;
  56. if ( pNext )
  57. {
  58. pNext->m_pPrev = this;
  59. }
  60. }
  61. /*
  62.  * TNodeList
  63.  */
  64. template <class T> class TNodeList : public CNodeList
  65. {
  66. public:
  67.          
  68. T *PopNode();
  69.    
  70. T *Head() const;
  71. static T *Next( const T *pNode );
  72. };
  73. template <class T>
  74. T *TNodeList<T>::PopNode()
  75. {
  76. return static_cast< T* >( CNodeList::PopNode() );
  77. }
  78. template <class T>
  79. T *TNodeList<T>::Head() const
  80. {
  81. return static_cast< T* >( CNodeList::Head() );
  82. }
  83. template <class T>
  84. T *TNodeList<T>::Next( const T *pNode )
  85. {
  86. return static_cast< T* >( pNode->Next() );
  87. }
  88. } // End of namespace OnlineGameLib
  89. #endif // __INCLUDE_NODELIST_H__