Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

179 lines
4.2 KiB

  1. #pragma once
  2. #include <macros.h>
  3. //////////////////////////////////////////////////////////////////////////////
  4. // slink
  5. //////////////////////////////////////////////////////////////////////////////
  6. struct slink
  7. {
  8. DWORD _dwSig;
  9. slink* next;
  10. slink() { _dwSig = 'KNLS'; next = NULL; }
  11. slink(slink* p) { next = p; }
  12. };
  13. //////////////////////////////////////////////////////////////////////////////
  14. // tlink
  15. //////////////////////////////////////////////////////////////////////////////
  16. template<class T> struct tlink : public slink
  17. {
  18. T info;
  19. tlink( T& t) : info(t) { }
  20. };
  21. //////////////////////////////////////////////////////////////////////////////
  22. // slist
  23. // slist of slinks
  24. //////////////////////////////////////////////////////////////////////////////
  25. class slist
  26. {
  27. DWORD _dwSig;
  28. slink *last;
  29. public:
  30. void insert(slink* p);
  31. void append(slink* p);
  32. slink* get();
  33. slist() { _dwSig = 'TSLS'; last = NULL; }
  34. slist(slink* p) { last = p->next = p; }
  35. friend class slist_iter;
  36. };
  37. //////////////////////////////////////////////////////////////////////////////
  38. // slist iterator
  39. //////////////////////////////////////////////////////////////////////////////
  40. class slist_iter
  41. {
  42. slink* ce;
  43. slist* cs;
  44. public:
  45. inline slist_iter(slist& s);
  46. inline slink* next();
  47. };
  48. //-----------------------------------------------------------------------------
  49. // slist_iter ctor
  50. //-----------------------------------------------------------------------------
  51. slist_iter::slist_iter(slist& s)
  52. {
  53. cs = &s;
  54. ce = cs->last;
  55. }
  56. //-----------------------------------------------------------------------------
  57. // slist_iter::next
  58. //-----------------------------------------------------------------------------
  59. slink* slist_iter::next()
  60. {
  61. slink* p = ce ? (ce=ce->next) : 0;
  62. if (ce == cs->last)
  63. ce = 0;
  64. return p;
  65. }
  66. template<class T> class TList_Iter;
  67. //////////////////////////////////////////////////////////////////////////////
  68. // TList
  69. // list of tlinks
  70. //////////////////////////////////////////////////////////////////////////////
  71. template<class T> class TList : private slist
  72. {
  73. public:
  74. HRESULT Insert( T& t);
  75. HRESULT Append( T& t);
  76. void Destruct();
  77. friend class TList_Iter<T>;
  78. };
  79. //-----------------------------------------------------------------------------
  80. // TList::Insert
  81. //-----------------------------------------------------------------------------
  82. template<class T> HRESULT TList<T>::Insert( T& t)
  83. {
  84. HRESULT hr = S_OK;
  85. MAKE_ERROR_MACROS_STATIC(hr);
  86. tlink<T> *pt = new tlink<T>(t);
  87. IF_ALLOC_FAILED_EXIT(pt);
  88. slist::insert(pt);
  89. exit:
  90. return hr;
  91. }
  92. //-----------------------------------------------------------------------------
  93. // TList::Append
  94. //-----------------------------------------------------------------------------
  95. template<class T> HRESULT TList<T>::Append( T& t)
  96. {
  97. HRESULT hr = S_OK;
  98. MAKE_ERROR_MACROS_STATIC(hr);
  99. tlink<T> *pt = new tlink<T>(t);
  100. IF_ALLOC_FAILED_EXIT(pt);
  101. slist::append(pt);
  102. exit:
  103. return hr;
  104. }
  105. //-----------------------------------------------------------------------------
  106. // TList::Destruct
  107. //-----------------------------------------------------------------------------
  108. template<class T> void TList<T>::Destruct()
  109. {
  110. tlink<T>* lnk;
  111. while (lnk = (tlink<T>*) slist::get())
  112. {
  113. delete lnk->info;
  114. delete lnk;
  115. }
  116. }
  117. //////////////////////////////////////////////////////////////////////////////
  118. // TList iterator.
  119. //////////////////////////////////////////////////////////////////////////////
  120. template<class T> class TList_Iter : private slist_iter
  121. {
  122. public:
  123. TList_Iter(TList<T>& s) : slist_iter(s) { }
  124. inline T* Next ();
  125. };
  126. //-----------------------------------------------------------------------------
  127. // TList_Iter::next
  128. //-----------------------------------------------------------------------------
  129. template<class T> T* TList_Iter<T>::Next ()
  130. {
  131. slink* p = slist_iter::next();
  132. return p ? &(((tlink<T>*) p)->info) : NULL;
  133. }