home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_09_06 / 9n06057b < prev    next >
Text File  |  1991-02-25  |  2KB  |  97 lines

  1. //  class ThingList    --  a list of things
  2. //
  3. //    Version 1.0    --  2/25/91
  4. //
  5. //    Michael Kelly    --  Author
  6. //
  7. #pragma warn -pia  // nix "Possibly incorrect assignment"
  8. #include "th_list.hpp"
  9.  
  10. static Thing dummy_thing;
  11.  
  12.  
  13. ThingList::~ThingList()
  14. {
  15.     while( head )  {
  16.     rover = head;
  17.     head = head->next;
  18.     delete rover;
  19.     rover = NULL;
  20.     }
  21. }
  22.  
  23. int ThingList::add( Thing &some_thing )
  24. {
  25.     if( ! ( rover = head ) )  {
  26.     if( ! ( head = new thing_node ) )
  27.         return 0;
  28.     head->this_thing = &some_thing;
  29.     head->next = NULL;
  30.     }
  31.     else  {
  32.     while( rover->next )
  33.         rover = rover->next;
  34.     if( ! ( rover->next = new thing_node ) )
  35.         return 0;
  36.     rover = rover->next;
  37.     rover->this_thing = &some_thing;
  38.     rover->next = NULL;
  39.     }
  40.  
  41.     ++nodes;
  42.     return 1;
  43. }
  44.     
  45. Thing* ThingList::operator[]( unsigned index )
  46. {
  47.     if( 
  48.     ( ! ( rover = head ) ) ||
  49.     ( index >= nodes )
  50.     )
  51.     return &dummy_thing;
  52.  
  53.     while( index-- )  {
  54.     if( ! rover->next )
  55.         return &dummy_thing;
  56.     rover = rover->next;
  57.     }
  58.     return rover->this_thing;
  59. }
  60.  
  61. unsigned ThingList::iterate( void ( Thing::*funcptr )() )
  62. {
  63.     if( ! ( rover = head ) )
  64.     return 0;
  65.  
  66.     do  {
  67.  
  68.       if( rover->this_thing )
  69.       (rover->this_thing->*funcptr)();
  70.  
  71.     }
  72.     while( rover = rover->next );
  73.  
  74.     return nodes;
  75. }
  76.  
  77. unsigned ThingList::iterate( int  ( Thing::*funcptr )() )
  78. {
  79.     unsigned successes = 0;
  80.  
  81.     if( ! ( rover = head ) )
  82.     return 0;
  83.  
  84.     do  {
  85.  
  86.       if( rover->this_thing )
  87.       successes += (rover->this_thing->*funcptr)();
  88.  
  89.     }
  90.     while( rover = rover->next );
  91.  
  92.     return successes;
  93. }
  94.  
  95.  
  96. #pragma warn .pia  // restore warning to default state
  97.