home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / Dloads / OTHERUTI / TCPP30-1.ZIP / CLASSINC.ZIP / LIST.H < prev    next >
C/C++ Source or Header  |  1992-02-18  |  4KB  |  181 lines

  1. /*------------------------------------------------------------------------*/
  2. /*                                                                        */
  3. /*  LIST.H                                                                */
  4. /*                                                                        */
  5. /*  Copyright Borland International 1991                                  */
  6. /*  All Rights Reserved                                                   */
  7. /*                                                                        */
  8. /*------------------------------------------------------------------------*/
  9.  
  10. #if !defined( __LIST_H )
  11. #define __LIST_H
  12.  
  13. #if !defined( __MEMMGR_H )
  14. #include <MemMgr.h>
  15. #endif  // __MEMMGR_H
  16.  
  17. #if !defined( __COLLECT_H )
  18. #include <Collect.h>
  19. #endif  // __COLLECT_H
  20.  
  21. _CLASSDEF(List)
  22. _CLASSDEF(ListIterator)
  23.  
  24. class _CLASSTYPE ListBlockInitializer
  25. {
  26.  
  27. protected:
  28.  
  29.     ListBlockInitializer();
  30.     ~ListBlockInitializer();
  31.  
  32.     static unsigned count;
  33.  
  34. };
  35.  
  36. class _CLASSTYPE List : public Collection, private ListBlockInitializer
  37. {
  38.  
  39. public:
  40.  
  41.     List() :
  42.         headEntry( 0, &tailEntry ),
  43.         tailEntry( 0, &tailEntry ),
  44.         head(&headEntry),
  45.         tail(&tailEntry),
  46.         itemsInContainer(0)
  47.         {
  48.         }
  49.  
  50.     virtual ~List()
  51.         {
  52.         flush();
  53.         }
  54.     
  55.     Object _FAR & peekHead() const
  56.         {
  57.         return ptrToRef(head->next->data);
  58.         }
  59.  
  60.     void add( Object _FAR & );
  61.     virtual void detach( Object _FAR &, DeleteType = NoDelete );
  62.     virtual void flush( DeleteType = DefDelete );
  63.  
  64.     virtual int isEmpty() const
  65.         {
  66.         return itemsInContainer == 0;
  67.         }
  68.  
  69.     virtual countType getItemsInContainer() const
  70.         {
  71.         return itemsInContainer;
  72.         }
  73.  
  74.     virtual ContainerIterator _FAR & initIterator() const;
  75.  
  76.     virtual classType isA() const
  77.         {
  78.         return listClass;
  79.         }
  80.  
  81.     virtual char _FAR *nameOf() const
  82.         {
  83.         return "List";
  84.         }
  85.  
  86. private:
  87.  
  88.     class _CLASSTYPE ListElement
  89.     {
  90.  
  91.     public:
  92.  
  93.         ListElement( Object _FAR *o, ListElement _FAR *n = 0 )
  94.             {
  95.             data = o; next = n;
  96.             }
  97.  
  98.     private:
  99.  
  100.         ListElement _FAR *next;
  101.         Object _FAR *data;
  102.  
  103.         void *operator new( size_t sz )
  104.             {
  105.             PRECONDITION( mgr != 0 );
  106.             return mgr->allocate( sz );
  107.             }
  108.         void operator delete( void *b )
  109.             {
  110.             PRECONDITION( mgr != 0 );
  111.             mgr->free( b );
  112.             }
  113.  
  114.         static MemBlocks *mgr;
  115.  
  116.         friend class List;
  117.         friend class ListIterator;
  118.         friend class ListBlockInitializer;
  119.  
  120.     };
  121.  
  122.     ListElement _FAR *head;
  123.     ListElement _FAR *tail;
  124.  
  125.     ListElement headEntry, tailEntry;
  126.  
  127.     unsigned itemsInContainer;
  128.  
  129.     ListElement _FAR *findPred( const Object _FAR & o );
  130.  
  131.     friend class ListIterator;
  132.     friend class ListBlockInitializer;
  133.  
  134. };
  135.  
  136. inline ListBlockInitializer::ListBlockInitializer()
  137. {
  138.     PRECONDITION( count != UINT_MAX );
  139.     if( count++ == 0 )
  140.         List::ListElement::mgr = 
  141.             new MemBlocks( sizeof(List::ListElement), 20 );
  142. }
  143.  
  144. inline ListBlockInitializer::~ListBlockInitializer()
  145. {
  146.     PRECONDITION( count != 0 );
  147.     if( --count == 0 )
  148.         {
  149.         delete List::ListElement::mgr;
  150.         List::ListElement::mgr = 0;
  151.         }
  152. }
  153.  
  154. class _CLASSTYPE ListIterator : public ContainerIterator
  155. {
  156.  
  157. public:
  158.  
  159.     ListIterator( const List _FAR & );
  160.     virtual ~ListIterator();
  161.  
  162.     virtual operator int();
  163.     virtual Object _FAR & current();
  164.     virtual Object _FAR & operator ++ ( int );
  165.     virtual Object _FAR & operator ++ ();
  166.     virtual void restart();
  167.  
  168. private:
  169.  
  170.     List::ListElement _FAR *currentElement;
  171.     List::ListElement _FAR *startingElement;
  172. };
  173.  
  174. inline ListIterator::ListIterator( const List _FAR & toIterate )
  175. {
  176.     startingElement = currentElement = toIterate.head->next;
  177. }
  178.  
  179. #endif  // __LIST_H
  180.  
  181.