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

  1. #include "ListLink.h"
  2. #include "LinkedList.h"
  3.  
  4. //--------------------------------------------------------------------------------
  5.  
  6. ListLink::~ListLink()
  7. {
  8.     Unlink();
  9. }
  10.  
  11. //--------------------------------------------------------------------------------
  12.  
  13. void* ListLink::GetObjectPtr()
  14. {
  15.     return nil;
  16. }
  17.  
  18. //--------------------------------------------------------------------------------
  19.  
  20. void ListLink::Link(ListLink *prev, ListLink *next, LinkedList* list)
  21. {
  22.     ListLink*    prevNext;
  23.     ListLink*    nextPrev;
  24.     ListLink*    oldHead;
  25.     ListLink*    oldTail;
  26.  
  27.     if (prev != nil)
  28.     {
  29.         prevNext = prev->GetNextLink();
  30.     
  31.         if (list == nil)
  32.         {
  33.             list = prev->GetList();
  34.         }
  35.     }
  36.  
  37.     if (next != nil)
  38.     {
  39.         nextPrev = next->GetPrevLink();
  40.     
  41.         if (list == nil)
  42.         {
  43.             list = next->GetList();
  44.         }
  45.     }
  46.  
  47.     if (list != nil)
  48.     {
  49.         oldHead = list->fFirstLink;
  50.         oldTail = list->fLastLink;
  51.     }
  52.     
  53.     try
  54.     {
  55.         fPrevLink    = prev;
  56.         fNextLink    = next;
  57.         fList        = list;
  58.  
  59.         if (prev != nil)
  60.         {
  61.             prev->SetNextLink(this);
  62.         }
  63.         
  64.         if (next != nil)
  65.         {
  66.             next->SetPrevLink(this);
  67.         }
  68.         
  69.         if (list != nil)
  70.         {
  71.             if (!next)        // end of list, or empty
  72.             {
  73.                 list->fLastLink = this;
  74.             }
  75.             
  76.             if (!prev)        // beginning of list, or empty
  77.             {
  78.                 list->fFirstLink = this;
  79.             }
  80.         
  81.             list->LinkInserted(*this);
  82.         }
  83.     }
  84.     catch(...)
  85.     {
  86.         fPrevLink = nil;
  87.         fNextLink = nil;
  88.  
  89.         if (list)
  90.         {
  91.             list->fFirstLink = oldHead;
  92.             list->fLastLink  = oldTail;
  93.         }
  94.         
  95.         if (prev)
  96.         {
  97.             prev->SetNextLink(prevNext);
  98.         }
  99.         
  100.         if (next)
  101.         {
  102.             next->SetPrevLink(nextPrev);
  103.         }
  104.         
  105.         throw;
  106.     }
  107. }
  108.  
  109. //--------------------------------------------------------------------------------
  110.  
  111. void ListLink::Unlink(void)
  112. {
  113.     ListLink* prev = fPrevLink;
  114.     ListLink* next = fNextLink;
  115.  
  116.     if (prev != nil)
  117.     {
  118.         prev->SetNextLink(next);
  119.     }
  120.     
  121.     if (next != nil)
  122.     {
  123.         next->SetPrevLink(prev);
  124.     }
  125.  
  126.     LinkedList* list = fList;
  127.  
  128.     if (list != nil)
  129.     {
  130.         if (list->fFirstLink == this)
  131.         {
  132.             list->fFirstLink = next;
  133.         }
  134.     
  135.         if (list->fLastLink == this)
  136.         {
  137.             list->fLastLink = prev;
  138.         }
  139.     
  140.         list->LinkRemoved(*this);
  141.     }
  142.  
  143.     fPrevLink = nil;
  144.     fNextLink = nil;
  145.     fList      = nil;
  146. }
  147.  
  148. //--------------------------------------------------------------------------------
  149.  
  150. bool ListLink::IsBefore(ListLink *before)
  151. {
  152.     ListLink *link = before;
  153.  
  154.     while (link)
  155.     {
  156.         if (link == this)
  157.             return true;
  158.             
  159.         link = link->GetPrevLink();
  160.     }
  161.     
  162.     return false;
  163. }
  164.  
  165. //--------------------------------------------------------------------------------
  166.  
  167. bool ListLink::IsAfter(ListLink *after)
  168. {
  169.     ListLink *link = after;
  170.  
  171.     while (link)
  172.     {
  173.         if (link == this)
  174.             return true;
  175.             
  176.         link = link->GetNextLink();
  177.     }
  178.     
  179.     return false;
  180. }
  181.  
  182. //--------------------------------------------------------------------------------
  183.  
  184. ObjectLink::~ObjectLink()
  185. {
  186. }
  187.  
  188. //--------------------------------------------------------------------------------
  189.  
  190. void* ObjectLink::GetObjectPtr()
  191. {
  192.     return fObject;
  193. }
  194.  
  195. //--------------------------------------------------------------------------------
  196.  
  197.