Set.C

Go to the documentation of this file.
00001 
00007 #include "InfoStream.h"
00008 #include "Set.h"
00009 #include "elements.h"
00010 
00011 //#define DEBUG_IRSET
00012 
00013 #ifdef DEBUG_IRSET
00014 void NAMD_bug(const char *);
00015 #endif
00016 
00017 IRSet::IRSet() 
00018 {
00019   head = (listNode *) 0;
00020   nElements = 0;
00021 }
00022 
00023 IRSet::~IRSet() {
00024   // delete all links; don't delete the InfoRecord objects
00025   listNode *tmp;
00026   for (listNode *link = head; link; link = tmp) {
00027     tmp = link->next;
00028     delete link;
00029   }
00030 }
00031 
00032 void IRSet::unchecked_insert(InfoRecord *info) 
00033 {
00034 #ifdef DEBUG_IRSET
00035   if (find(info)) NAMD_bug("IRSet::unchecked_insert duplicate");
00036 #endif
00037     ++nElements;
00038     listNode *node = new listNode(info);
00039     node->next = head;
00040     head = node;
00041 #ifdef DEBUG_IRSET
00042   int n = 0;
00043   while (node) { ++n; node = node->next; }
00044   if ( n != nElements ) NAMD_bug("IRSet::unchecked_insert count");
00045 #endif
00046 }
00047 
00048 
00049 void IRSet::insert(InfoRecord *info) 
00050 {
00051   if (!find(info))
00052   {
00053     ++nElements;
00054     listNode *node = new listNode(info);
00055     node->next = head;
00056     head = node;
00057 #ifdef DEBUG_IRSET
00058     int n = 0;
00059     while (node) { ++n; node = node->next; }
00060     if ( n != nElements ) NAMD_bug("IRSet::insert count");
00061 #endif
00062   }
00063    
00064 }
00065 
00066 
00067 void IRSet::myRemove(listNode **n, InfoRecord *r)
00068 {
00069   if ((*n)->info == r)
00070     *n = (*n)->next;
00071   else 
00072     myRemove(&((*n)->next), r);
00073 }
00074 
00075 int IRSet::remove(InfoRecord * r) 
00076 {
00077 #ifdef DEBUG_IRSET
00078     listNode *node = head;
00079     int n = 0;
00080     while (node) { ++n; node = node->next; }
00081     if ( n != nElements ) NAMD_bug("IRSet::remove count");
00082 #endif
00083 
00084   if (!head)
00085     return 0;
00086 
00087   listNode *p = head;
00088   listNode *q = p->next;
00089 
00090   if (p->info == r){
00091     head = q;
00092     delete p;
00093     --nElements;
00094     return 1;
00095   }
00096 
00097   while (q){
00098     if (q->info == r){
00099       p->next = q->next;
00100       delete q;
00101       --nElements;
00102       return 1;
00103     }
00104     else {
00105       p = q;
00106       q = q->next;
00107     }
00108   }
00109   return 0;
00110 }
00111 
00112 int IRSet::find(InfoRecord * r) 
00113 {
00114   listNode *p = head;
00115   while (p) {
00116     if (p->info == r) return 1;
00117     else p = p->next;
00118   }
00119   return 0;
00120 }
00121 
00122 InfoRecord * IRSet::iterator(Iterator *iter)
00123 {
00124   if (head){
00125     iter->next = head->next;
00126     return head->info;
00127   }
00128   return 0;
00129 }
00130 
00131 InfoRecord * IRSet::next(Iterator *iter)
00132 {
00133   //  std::cout << "set::next: " << iter->next << "\n";
00134   if (!iter->next)
00135     { return 0;
00136     }
00137   //  std::cout << "set::next: iter->next->info=" << iter->next->info << "\n";
00138   InfoRecord *temp = iter->next->info;
00139   iter->next = iter->next->next;
00140   return temp;
00141 }
00142 
00143 
00144 int IRSet::numElements()
00145 {
00146   return nElements;
00147 }
00148 
00149 int IRSet::hasElements()
00150 {
00151   return ! ! head;
00152 }
00153 
00154 void IRSet::print() 
00155 {
00156   listNode *p = head;
00157   while (p){
00158     if ( p->info ) iout << p->info->Id << " ";
00159     else iout << "NULL ";
00160     p = p->next;
00161   }
00162 }

Generated on Sat Sep 23 01:17:15 2017 for NAMD by  doxygen 1.4.7