home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / vc98 / include / list.h < prev    next >
C/C++ Source or Header  |  1998-04-25  |  10KB  |  316 lines

  1.  
  2. //=============================================================================
  3. //  Microsoft (R) Bloodhound (tm). Copyright (C) 1991-1993.
  4. //
  5. //  MODULE: list.h
  6. //
  7. //  Modification History
  8. //
  9. //  raypa           03/17/93    Created.
  10. //=============================================================================
  11.  
  12. #if !defined(_LIST_)
  13.  
  14. #define _LIST_
  15. #pragma pack(1)
  16.  
  17. //=============================================================================
  18. //  The LINK structure is used to chain structures together into a list.
  19. //=============================================================================
  20.  
  21. typedef struct _LINK *LPLINK;
  22.  
  23. typedef struct _LINK
  24. {
  25.     LPLINK     PrevLink;                    //... Previous or back pointer.
  26.     LPLINK     NextLink;                    //... Next or forward pointer.
  27. } LINK;
  28.  
  29. //=============================================================================
  30. //  The LIST data structure.
  31. //=============================================================================
  32.  
  33. typedef struct _LIST
  34. {
  35.     LPLINK      Tail;                       //... List Tail pointer.
  36.     LPLINK      Head;                       //... List Head pointer.
  37.     DWORD       Length;                     //... List Length.
  38. } LIST;
  39.  
  40. typedef LIST *LPLIST;
  41.  
  42.  
  43. #ifndef NO_INLINE
  44.  
  45. #ifndef INLINE
  46. #define INLINE __inline
  47. #endif
  48.  
  49. //=============================================================================
  50. //  FUNCTIONS.
  51. //=============================================================================
  52.  
  53. INLINE LPLINK WINAPI GetPrevLink(LPLINK Link)
  54. {
  55.     return Link->PrevLink;
  56. }
  57.  
  58. INLINE LPLINK WINAPI GetNextLink(LPLINK Link)
  59. {
  60.     return Link->NextLink;
  61. }
  62.  
  63. INLINE LPLINK WINAPI GetHeadOfList(LPLIST List)
  64. {
  65.     return List->Head;
  66. }
  67.  
  68. INLINE LPLINK WINAPI GetTailOfList(LPLIST List)
  69. {
  70.     return List->Tail;
  71. }
  72.  
  73. INLINE DWORD WINAPI GetListLength(LPLIST List)
  74. {
  75.     return List->Length;
  76. }
  77.  
  78. //=============================================================================
  79. //  FUNCTION: InitializeList()
  80. //
  81. //  Modification History
  82. //                               
  83. //  raypa           04/15/93        Created
  84. //=============================================================================
  85.  
  86. INLINE LPLIST WINAPI InitializeList(LPLIST List)
  87. {
  88.     List->Head    = (LPLINK) 0L;
  89.     List->Tail    = (LPLINK) 0L;
  90.     List->Length  = 0;
  91.  
  92.     return List;
  93. }
  94.  
  95. //=============================================================================
  96. //  FUNCTION: AddLinkToLink()
  97. //
  98. //  Modification History
  99. //                               
  100. //  raypa           04/15/93        Created
  101. //=============================================================================
  102.  
  103. INLINE VOID WINAPI AddLinkToLink(LPLINK DstLink, LPLINK SrcLink)
  104. {
  105.     //=========================================================================
  106.     //  Make the source link point at the destination link.
  107.     //=========================================================================
  108.  
  109.     SrcLink->PrevLink = DstLink;
  110.     SrcLink->NextLink = DstLink->NextLink;
  111.  
  112.     //=========================================================================
  113.     //  Make the destination link point at the source link.
  114.     //=========================================================================
  115.  
  116.     DstLink->NextLink->PrevLink = SrcLink;
  117.     DstLink->NextLink = SrcLink;
  118. }
  119.  
  120. //=============================================================================
  121. //  FUNCTION: AddToList()
  122. //
  123. //  Modification History
  124. //                               
  125. //  raypa           04/15/93        Created
  126. //=============================================================================
  127.  
  128. INLINE LPLINK WINAPI AddToList(LPLIST List, LPLINK DstLink, LPLINK SrcLink)
  129. {
  130.     //=========================================================================
  131.     //  Grow the list length by one.
  132.     //=========================================================================
  133.  
  134.     List->Length++;
  135.  
  136.     //=========================================================================
  137.     //  If SrcLink is NULL then add DstLink to the end of the list.
  138.     //=========================================================================
  139.  
  140.     if ( SrcLink == (LPLINK) 0L )
  141.     {
  142.         //=====================================================================
  143.         //  If the tail pointer is NULL then the list is empty.
  144.         //=====================================================================
  145.  
  146.         if ( List->Tail != (LPLINK) 0L )
  147.         {
  148.             AddLinkToLink(List->Tail, DstLink);
  149.         }
  150.         else
  151.         {
  152.             DstLink->PrevLink = DstLink;
  153.             DstLink->NextLink = DstLink;
  154.  
  155.             List->Head = DstLink;
  156.         }
  157.  
  158.         return (List->Tail = DstLink);
  159.     }
  160.  
  161.     //=========================================================================
  162.     //  If DstLink is NULL then add SrcLink to the front of the list.
  163.     //=========================================================================
  164.  
  165.     if ( DstLink == (LPLINK) 0L )
  166.     {
  167.         //=====================================================================
  168.         //  If the head pointer is NULL then the list is empty.
  169.         //=====================================================================
  170.  
  171.         if ( List->Head != (LPLINK) 0L )
  172.         {
  173.             AddLinkToLink(List->Head, SrcLink);
  174.         }
  175.         else
  176.         {
  177.             SrcLink->PrevLink = SrcLink;
  178.             SrcLink->NextLink = SrcLink;
  179.  
  180.             List->Tail = SrcLink;
  181.         }
  182.  
  183.         return (List->Head = SrcLink);
  184.     }
  185.  
  186.     //=========================================================================
  187.     //  Neither DstLink nor SrcLink is NULL so link them together.
  188.     //=========================================================================
  189.  
  190.     AddLinkToLink(DstLink, SrcLink);
  191.  
  192.     return SrcLink;
  193. }
  194.  
  195. //=============================================================================
  196. //  FUNCTION: DeleteFromList()
  197. //
  198. //  Modification History
  199. //                               
  200. //  raypa           04/15/93        Created
  201. //=============================================================================
  202.  
  203. INLINE LPLINK WINAPI DeleteFromList(LPLIST List, LPLINK Link)
  204. {
  205.     //=========================================================================
  206.     //  If the list is empty then return NULL.
  207.     //=========================================================================
  208.  
  209.     if ( List->Length != 0 )
  210.     {
  211.         //=====================================================================
  212.         //  If the list length is not zero then we may need to fixup head and
  213.         //  tail pointers in the event we delete the first or last link,
  214.         //  respectively.
  215.         //=====================================================================
  216.  
  217.         if ( --List->Length != 0 )
  218.         {
  219.             //=================================================================
  220.             //  If we are deleting the front link then fixup the head pointer.
  221.             //=================================================================
  222.  
  223.             if ( List->Head == Link )
  224.             {
  225.                 List->Head = List->Head->NextLink;
  226.             }
  227.  
  228.             //=================================================================
  229.             //  If we are deleting the end link then fixup the tail pointer.
  230.             //=================================================================
  231.  
  232.             if ( List->Tail == Link )
  233.             {
  234.                 List->Tail = List->Tail->PrevLink;
  235.             }
  236.  
  237.             //=================================================================
  238.             //  Now we can unlink this link from the list.
  239.             //=================================================================
  240.  
  241.             Link->NextLink->PrevLink = Link->PrevLink;
  242.             Link->PrevLink->NextLink = Link->NextLink;
  243.         }
  244.         else
  245.         {
  246.             //=================================================================
  247.             //  There is only one link on the list and we just deleted it.
  248.             //=================================================================
  249.  
  250.             List->Head = (LPLINK) 0L;
  251.             List->Tail = (LPLINK) 0L;
  252.         }
  253.  
  254.         return Link;
  255.     }
  256.  
  257.     return (LPLINK) 0L;
  258. }
  259.  
  260. //=============================================================================
  261. //  FUNCTION: AddToFrontOfList()
  262. //
  263. //  Modification History
  264. //                               
  265. //  raypa           04/15/93        Created
  266. //=============================================================================
  267.  
  268. INLINE LPLINK WINAPI AddToFrontOfList(LPLIST List, LPLINK Link)
  269. {
  270.     return AddToList(List, (LPLINK) 0L, Link);
  271. }
  272.  
  273. //=============================================================================
  274. //  FUNCTION: AddToEndOfList()
  275. //
  276. //  Modification History
  277. //                               
  278. //  raypa           04/15/93        Created
  279. //=============================================================================
  280.  
  281. INLINE LPLINK WINAPI AddToEndOfList(LPLIST List, LPLINK Link)
  282. {
  283.     return AddToList(List, Link, (LPLINK) 0L);
  284. }
  285.  
  286. //=============================================================================
  287. //  FUNCTION: DeleteFromFrontOfList()
  288. //
  289. //  Modification History
  290. //                               
  291. //  raypa           04/15/93        Created
  292. //=============================================================================
  293.  
  294. INLINE LPLINK WINAPI DeleteFromFrontOfList(LPLIST List)
  295. {
  296.     return DeleteFromList(List, GetHeadOfList(List));
  297. }
  298.  
  299. //=============================================================================
  300. //  FUNCTION: DeleteFromEndOfList()
  301. //
  302. //  Modification History
  303. //                               
  304. //  raypa           04/15/93        Created
  305. //=============================================================================
  306.  
  307. INLINE LPLINK WINAPI DeleteFromEndOfList(LPLIST List)
  308. {
  309.     return DeleteFromList(List, GetTailOfList(List));
  310. }
  311.  
  312. #endif
  313.  
  314. #pragma pack()
  315. #endif
  316.