Main Page | Modules | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members

spritelist.cpp

Go to the documentation of this file.
00001 /***************************************************************************
00002                           spritelist.cpp  -  description
00003                              -------------------
00004     begin                : Fri Mar 7 2003
00005     copyright            : (C) 2003 by Tyler Montbriand
00006     email                : tsm@accesscomm.ca
00007  ***************************************************************************/
00008 
00009 /***************************************************************************
00010  *                                                                         *
00011  *   This program is free software; you can redistribute it and/or modify  *
00012  *   it under the terms of the GNU General Public License as published by  *
00013  *   the Free Software Foundation; either version 2 of the License, or     *
00014  *   (at your option) any later version.                                   *
00015  *                                                                         *
00016  ***************************************************************************/
00017 
00024 
00025 #include "spritelist.h"
00026 
00030 SpriteList::SpriteList()
00031 {
00032   head=NULL;
00033 }
00034 
00038 void SpriteList::Destroy()
00039 {
00040   Sprite *ptr=head;
00041   while(ptr!=NULL)
00042   {
00043     Sprite *tmp=ptr->next;
00044     /* If it can be safely freed, do so */
00045     if(ptr->Deleteable())
00046     {
00047       delete ptr;
00048     }
00049     else  /* Otherwise just unlink from list */
00050     {
00051       ptr->prev=ptr->next=NULL;
00052     }
00053 
00054     ptr=tmp;
00055   }
00056 
00057   head=NULL;
00058 }
00062 SpriteList::~SpriteList()
00063 {
00064   Destroy();
00065 }
00066 
00070 Sprite *SpriteList::Head()
00071 {
00072   return(head);
00073 }
00074 
00078 Sprite *SpriteList::Tail()
00079 {
00080   Sprite *spr=head;
00081   while(spr!=NULL)
00082   {
00083     if(spr->next==NULL) return(spr);
00084     spr=spr->next;
00085   }
00086 
00087   return(NULL);
00088 }
00089 
00094 bool SpriteList::Extract(Sprite *spr)
00095 {
00096   if(spr==NULL)
00097   {
00098     return(false);
00099   }
00100   else if(!Find(spr))
00101   {
00102     return(false);
00103   }
00104   else if(spr==head)  
00105   {
00106     head=head->next;
00107     head->prev=NULL;
00108     spr->prev=spr->next=NULL;
00109     return(true);
00110   }
00111   else
00112   {
00113     if(spr->prev!=NULL) spr->prev->next=spr->next;
00114     if(spr->next!=NULL) spr->next->prev=spr->prev;
00115     spr->next=spr->prev=NULL;
00116     return(true);
00117   }
00118 }
00119 
00123 bool SpriteList::Insert(Sprite *spr)
00124 {
00125   Sprite *ptr=NULL;
00126   if(spr==NULL)   return(false);
00127   if(head==NULL)  return(Prepend(spr));
00128 
00129   ptr=head;  
00130   while(ptr!=NULL)
00131   {
00132     if(ptr==spr)                                return(false);
00133     else if(spr->DrawLayer() <= ptr->DrawLayer())  break;
00134     
00135     ptr=ptr->next;
00136   }
00137   {
00138     Sprite *tmp=ptr;
00139     while(tmp!=NULL)
00140     {
00141       if(tmp==spr)  return(false);
00142       tmp=tmp->next;
00143     }
00144   }
00145 
00146   if(ptr==NULL)
00147   {
00148     return(Append(spr));
00149   }
00150   else if(ptr==head)
00151   {
00152     return(Prepend(spr));    
00153   }
00154   else
00155   {
00156     if(ptr->prev!=NULL) ptr->prev->next=spr;
00157     spr->prev=ptr->prev;
00158     spr->next=ptr;
00159     ptr->prev=spr;
00160     return(true);    
00161   }
00162 }
00163 
00167 bool SpriteList::Find(Sprite *spr)
00168 {
00169   Sprite *ptr=NULL;
00170   if(spr==NULL) return(false);
00171 
00172   ptr=head;
00173   while(ptr!=NULL)
00174   {
00175     if(ptr==spr)
00176     {
00177       return(true);
00178     }
00179     /* TESTME - that > might actually be supposed to be a < */
00180     else if(ptr->DrawLayer() > spr->DrawLayer())
00181     {
00182       return(false);
00183     }
00184     ptr=ptr->next;
00185   }
00186   return(false);
00187 }
00188 
00193 bool SpriteList::Append(Sprite *spr)
00194 {
00195   if(spr==NULL) return(false);
00196   if(head==NULL)
00197   {
00198     return(Prepend(spr));
00199   }
00200   else
00201   {
00202     Sprite *ptr=Tail();
00203     if(ptr==NULL) return(false);
00204     spr->prev=ptr;
00205     spr->next=NULL;
00206     ptr->next=spr;
00207     return(true);
00208   }
00209 }
00210 
00215 bool SpriteList::Prepend(Sprite *spr)
00216 {    
00217   if(spr==NULL) return(false);
00218   if(head==NULL)
00219   {
00220     spr->prev=spr->next=NULL;
00221     head=spr;
00222     return(true);    
00223   }
00224   else
00225   {
00226     spr->prev=NULL;
00227     spr->next=head;
00228     head->prev=spr;
00229     head=spr;
00230     return(true);
00231   }
00232 }

Generated on Sat Oct 11 13:19:26 2003 for Spritelib by doxygen 1.3.4