home *** CD-ROM | disk | FTP | other *** search
/ RISC DISC 3 / RISC_DISC_3.iso / resources / etexts / gems / gemsv / ch7_4 / list.h < prev    next >
Encoding:
C/C++ Source or Header  |  1994-11-22  |  1.5 KB  |  74 lines

  1. // -*- C++ -*-
  2. // list.h by George Vanecek Jr. June 1994
  3.  
  4. #ifndef _LIST_H_
  5. #define _LIST_H_
  6.  
  7. #ifndef __STDLIB_H__
  8. #include <stdlib.h>
  9. #endif
  10.  
  11. #ifndef _BASIC_H_
  12. #include "basic.h"
  13. #endif
  14.  
  15. class ListNode {
  16. public:
  17.   ListNode( void* const t, ListNode* const n ) : val(t), nxt(n) {}
  18.   void*          value ( ) const { return val; }
  19.   ListNode*      next  ( ) { return nxt; }
  20.   void* operator new   ( size_t );
  21.   void  operator delete( void* );
  22.   
  23. private:
  24.   void* const val;
  25.   ListNode*   nxt;
  26.   static ListNode* freeList;
  27. };
  28.  
  29. template <class T>
  30. class List {
  31. public:
  32.   List( ) : anchor(NULL), nNodes(0) { }
  33.   Boolean   empty      ( ) const { return Boolean( anchor == NULL ); }
  34.   T*        first      ( ) const { return (T*)(anchor->value()); }
  35.   ListNode* head       ( ) const { return anchor; }
  36.   Counter   size       ( ) const { return nNodes; }
  37.   void      operator <<( T* const ); // insert (i.e. push)
  38.   Boolean   operator >>( T*& );         // remove (i.e. pop)
  39.  
  40. private:
  41.   ListNode* anchor;        // Start of List
  42.   Counter   nNodes;        // Number of Nodes on list
  43. };
  44.  
  45. template <class T>
  46. void List<T>::operator <<( T* const t )
  47. {
  48.   anchor = new ListNode( t, anchor );
  49.   ++nNodes;
  50. }
  51.  
  52. template <class T>
  53. Boolean List<T>::operator >>( T*& t )
  54. {
  55.   if( empty() ) {
  56.     t = NULL;
  57.     return FALSE;
  58.   }
  59.   t = first();
  60.   ListNode* f = anchor;
  61.   anchor = f->next();
  62.   delete f;
  63.   --nNodes;
  64.   return TRUE;
  65. }
  66.  
  67. #define forEachItemOnList(p) \
  68.      for( ListNode* pp = p.head(); pp != NULL; pp = pp->next() )
  69.  
  70. #define getItem(Type) \
  71.      (Type*)(pp->value())
  72.  
  73. #endif
  74.