home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1998 / MacHack 1998.toast / Papers / C++ Exceptions / µShell / Array Classes / (Hidden) / LinkedListOfObject.cp < prev    next >
Encoding:
Text File  |  1998-05-25  |  4.8 KB  |  203 lines  |  [TEXT/CWIE]

  1. /*
  2.     File:        LinkedListOfObject.cp
  3.  
  4.     Contains:    stuff
  5.  
  6. */
  7.  
  8. #include "LinkedListOfObject.h"
  9.  
  10. //--------------------------------------------------------------------------------
  11. bool LinkedListOfObject::IsObjectLink(void *objectPtr, ListLink* elem)
  12. {
  13.     // we need to use this mapping to alow for the one object
  14.     // to many link case
  15.  
  16.     return this->GetObjectFromLink(elem) == objectPtr;
  17. }
  18.  
  19.  
  20. //--------------------------------------------------------------------------------
  21. void* LinkedListOfObject::GetObjectFromLink(ListLink* link)
  22. {
  23.     return link->GetObjectPtr();
  24. }
  25.  
  26.  
  27. //--------------------------------------------------------------------------------
  28. ListLink* LinkedListOfObject::GetLinkFromObject(void *objectPtr)
  29. {
  30.     LinkedListIterator iter(*this);
  31.     
  32.     for (iter.FirstLink(); iter.MoreAfter(); iter.NextLink())
  33.     {
  34.         ListLink* elem = iter.CurrentLink();
  35.         
  36.         if (elem && (elem->GetObjectPtr() == objectPtr))
  37.         {
  38.             return elem;
  39.         }
  40.     }
  41.     
  42.     return nil;
  43. }
  44.  
  45. //--------------------------------------------------------------------------------
  46. void LinkedListOfObject::AppendElement(void* elem)
  47. {
  48.     this->AppendLink(*GetLinkFromObject(elem));
  49. }
  50.  
  51. //--------------------------------------------------------------------------------
  52. void LinkedListOfObject::PrependElement(void* elem)
  53. {
  54.     this->PrependLink(*GetLinkFromObject(elem));
  55. }
  56.  
  57. //--------------------------------------------------------------------------------
  58. void LinkedListOfObject::RemoveElement(void* elem)
  59. {
  60.     this->RemoveLink(*GetLinkFromObject(elem));
  61. }
  62.  
  63. //--------------------------------------------------------------------------------
  64. IteratorForLinkedListOfObject::IteratorForLinkedListOfObject(LinkedListOfObject& list, ListLink* start)
  65.     : LinkedListIterator(list, start),
  66.       fObjectList(list),
  67.       fBackwards(false),
  68.       fCurrentSeen(false),
  69.       fAtEndOfList(false),
  70.       fCurrentObject(nil) 
  71. {
  72. }
  73.  
  74.  
  75. //--------------------------------------------------------------------------------
  76. IteratorForLinkedListOfObject::~IteratorForLinkedListOfObject()
  77. {
  78. }
  79.  
  80.  
  81. //--------------------------------------------------------------------------------
  82. void IteratorForLinkedListOfObject::GotoFirst(void)
  83. {
  84.     ListLink* link = this->FirstLink();
  85.     
  86.     fCurrentObject = (link ? fObjectList.GetObjectFromLink(link) : nil);
  87.     fCurrentSeen = false;
  88.     fBackwards = false;
  89.     fAtEndOfList = true;
  90. }
  91.  
  92.  
  93. //--------------------------------------------------------------------------------
  94. void IteratorForLinkedListOfObject::GotoLast(void)
  95. {
  96.     ListLink* link = this->LastLink();
  97.  
  98.     fCurrentObject = (link ? fObjectList.GetObjectFromLink(link) : nil);
  99.     fCurrentSeen = false;
  100.     fBackwards = true;    
  101.     fAtEndOfList = true;
  102. }
  103.  
  104.  
  105. //--------------------------------------------------------------------------------
  106. void IteratorForLinkedListOfObject::GotoNext(void)
  107. {
  108.     ListLink* link = this->FirstLink();
  109.     
  110.     fCurrentObject = (link ? fObjectList.GetObjectFromLink(link) : nil);
  111.     fCurrentSeen = false;
  112.     fBackwards = false;
  113.     fAtEndOfList = (fCurrentObject == nil);
  114. }
  115.  
  116.  
  117. //--------------------------------------------------------------------------------
  118. void IteratorForLinkedListOfObject::GotoPrev(void)
  119. {
  120.     ListLink* link = this->FirstLink();
  121.     
  122.     fCurrentObject = (link ? fObjectList.GetObjectFromLink(link) : nil);
  123.     fCurrentSeen = false;
  124.     fBackwards = true;
  125.     fAtEndOfList = (fCurrentObject == nil);
  126. }
  127.  
  128.  
  129. //--------------------------------------------------------------------------------
  130. void* IteratorForLinkedListOfObject::FirstObject(void)
  131. {
  132.     fCurrentSeen = true;
  133.     return this->FirstLink();
  134. }
  135.  
  136. //--------------------------------------------------------------------------------
  137. void* IteratorForLinkedListOfObject::LastObject(void)
  138. {
  139.     fCurrentSeen = true;
  140.     return this->LastLink();
  141. }
  142.  
  143. //--------------------------------------------------------------------------------
  144. void* IteratorForLinkedListOfObject::NextObject(void)
  145. {
  146.     fCurrentSeen = true;
  147.     return this->NextLink();
  148. }
  149.  
  150. //--------------------------------------------------------------------------------
  151. void* IteratorForLinkedListOfObject::PrevObject(void)
  152. {
  153.     fCurrentSeen = true;
  154.     return this->PrevLink();
  155. }
  156.  
  157. //--------------------------------------------------------------------------------
  158. void IteratorForLinkedListOfObject::LinkInserted(ListLink& link)
  159. {
  160.     if (!fCurrentSeen)
  161.     {
  162.     
  163.     }
  164.  
  165.     Inherited::LinkInserted(link);
  166. }
  167.  
  168.  
  169. //--------------------------------------------------------------------------------
  170. void IteratorForLinkedListOfObject::RemovingLink(ListLink& link)
  171. {
  172.     if (&link == fCurrentLink)    // If we're removing the current 
  173.     {
  174.         if (fBackwards)
  175.         {
  176.             this->GotoPrev();
  177.         }
  178.         else
  179.         {
  180.             this->GotoNext();
  181.         }
  182.     }
  183.  
  184.     Inherited::RemovingLink(link);
  185.     
  186.     if (fAtEndOfList)
  187.     {
  188.         if (fBackwards)
  189.             GotoFirst();
  190.         else
  191.             GotoLast();
  192.     }
  193. }
  194.  
  195.  
  196. //--------------------------------------------------------------------------------
  197. void IteratorForLinkedListOfObject::RemovingAllLinks(void)
  198. {
  199.     fCurrentObject = nil;
  200.  
  201.     Inherited::RemovingAllLinks();
  202. }
  203.