home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1998 / MacHack 1998.toast / Papers / C++ Exceptions / µShell / Array Classes / (Hidden) / LinkedListOfObject.h < prev    next >
Encoding:
C/C++ Source or Header  |  1998-05-25  |  3.2 KB  |  110 lines  |  [TEXT/CWIE]

  1. /*
  2.     File:        LinkedListOfObject.h
  3.  
  4.     Contains:    stuff
  5.  
  6. */
  7.  
  8. #ifndef _LINKEDLISTOFOBJECT_
  9. #define _LINKEDLISTOFOBJECT_
  10. #pragma once
  11.  
  12. #include "LinkedList.h"
  13. #include "LinkedListIterator.h"
  14. #include "ListLink.h"
  15.  
  16. //--------------------------------------------------------------------------------
  17. class LinkedListOfObject : public LinkedList
  18. {
  19. public:
  20.     LinkedListOfObject() : LinkedList() {}
  21.     LinkedListOfObject(ListLink* first, ListLink* last) : LinkedList(first, last) {}
  22.  
  23.     // these routings handle the mapping between objects and links allowing
  24.     // links to be embedded in the objects, etc.
  25.     
  26.     virtual void*        GetObjectFromLink(ListLink* elem);
  27.     virtual ListLink*    GetLinkFromObject(void *objectPtr);
  28.     virtual bool        IsObjectLink(void *objectPtr, ListLink* elem);
  29.  
  30.     virtual void        AppendElement(void* elem);
  31.     virtual void        PrependElement(void* elem);
  32.     virtual void        RemoveElement(void* elem);
  33.  
  34. private:
  35.     typedef LinkedList Inherited;
  36. };
  37.  
  38. //--------------------------------------------------------------------------------
  39. template <class AType> class LinkedListOf : public LinkedListOfObject
  40. {
  41. public:
  42.     LinkedListOf() : LinkedListOfObject() {}
  43.     LinkedListOf(AType* first, AType* last) : LinkedListOfObject(first, last) {}
  44.  
  45. protected:
  46.     virtual ListLink*    GetLinkFromObject(void *objectPtr)
  47.                         { return (ListLink*) (AType*) objectPtr; };
  48.  
  49. private:
  50.     typedef LinkedListOfObject Inherited;
  51. };
  52.  
  53.  
  54. //--------------------------------------------------------------------------------
  55. class IteratorForLinkedListOfObject : LinkedListIterator
  56. {
  57. protected:
  58.     LinkedListOfObject&        fObjectList;    // The list we're iterating
  59.     void*                    fCurrentObject;    // cached current object
  60.     Boolean                    fBackwards;        // Last step was backwards
  61.     Boolean                    fCurrentSeen;    // Current element was deleted
  62.     Boolean                    fAtEndOfList;
  63.  
  64. public:
  65.     IteratorForLinkedListOfObject(LinkedListOfObject& list, ListLink* start = nil);
  66.     ~IteratorForLinkedListOfObject();
  67.  
  68.     void*    CurrentObject(void)     { fCurrentSeen = true; return fCurrentObject; }
  69.  
  70.     virtual void GotoFirst(void);
  71.     virtual void GotoLast(void);
  72.     virtual void GotoNext(void);
  73.     virtual void GotoPrev(void);
  74.  
  75.     virtual void* FirstObject(void);
  76.     virtual void* LastObject(void);
  77.     virtual void* NextObject(void);
  78.     virtual void* PrevObject(void);
  79.  
  80. protected:
  81.     virtual void    LinkInserted(ListLink& link);    // Called after inserting a lin in list
  82.     virtual void    RemovingLink(ListLink& link);    // Called before removing a Link from list
  83.     virtual void    RemovingAllLinks(void);            // Called before clearing the list
  84.  
  85. private:
  86.     typedef LinkedListIterator Inherited;
  87. };
  88.  
  89.  
  90. //--------------------------------------------------------------------------------
  91. template <class AType> class IteratorForLinkedListOf : public IteratorForLinkedListOfObject
  92. {    
  93. public:
  94.     IteratorForLinkedListOf(LinkedListOf<AType> &list, ListLink* start = nil)
  95.                         : IteratorForLinkedListOfObject(list, start) {}
  96.  
  97.     AType*    Current(void)     { return (AType*) CurrentObject();    }
  98.     AType*    First(void)     { return (AType*) FirstObject();     }
  99.     AType*    Last(void)        { return (AType*) LastObject();        }
  100.     AType*    Next(void)        { return (AType*) NextObject();        }
  101.     AType*    Prev(void)        { return (AType*) PrevObject();        }
  102.  
  103. private:
  104.     typedef IteratorForLinkedListOfObject Inherited;
  105. };
  106.  
  107.  
  108. #endif // _LINKEDLISTOFOBJECT_
  109.  
  110.