Checks now the Load_mode
[libfirm] / ir / adt / set.c
index f81fa39..f495bd1 100644 (file)
@@ -59,7 +59,6 @@
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
-#include "misc.h"
 #include "xmalloc.h"
 #ifdef PSET
 # include "pset.h"
@@ -198,7 +197,7 @@ SET *
     table->dir[i] = (Segment *)obstack_alloc (&table->obst,
                                              sizeof (Segment) * SEGMENT_SIZE);
 
-    memset (table->dir[i], 0, sizeof (Segment) * SEGMENT_SIZE);
+    memset(table->dir[i], 0, sizeof (Segment) * SEGMENT_SIZE);
     table->nseg++;
   }
 
@@ -223,6 +222,12 @@ PMANGLE(del) (SET *table)
   xfree (table);
 }
 
+int
+MANGLEP(count) (SET *table)
+{
+  return table->nkey;
+}
+
 /*
  * do one iteration step, return 1
  * if still data in the set, 0 else
@@ -263,7 +268,8 @@ MANGLEP(first) (SET *table)
 void *
 MANGLEP(next) (SET *table)
 {
-  assert (table->iter_tail);
+  if (!table->iter_tail)
+    return NULL;
 
   /* follow collision chain */
   table->iter_tail = table->iter_tail->chain;
@@ -281,7 +287,6 @@ MANGLEP(next) (SET *table)
 void
 MANGLEP(break) (SET *table)
 {
-  assert (table->iter_tail);
   table->iter_tail = NULL;
 }
 
@@ -345,6 +350,7 @@ expand_table (SET *table)
        (Segment *)obstack_alloc (&table->obst,
                                  sizeof(Segment) * SEGMENT_SIZE);
       memset(table->dir[NewSegmentDir], 0, sizeof(Segment) * SEGMENT_SIZE);
+      table->nseg++;
     }
     NewSegment = table->dir[NewSegmentDir];
 
@@ -354,7 +360,6 @@ expand_table (SET *table)
       table->maxp <<= 1;       /* table->maxp *= 2     */
       table->p = 0;
     }
-    table->nseg++;
 
     /* Relocate records to the new bucket */
     Previous = &OldSegment[OldSegmentIndex];
@@ -490,9 +495,24 @@ pset_remove (SET *table, const void *key, unsigned hash)
   stat_chain_len (table, chain_len);
 
   q = *p;
+
+  if (q == table->iter_tail) {
+    /* removing current element */
+    table->iter_tail = q->chain;
+    if (!table->iter_tail) {
+      /* go to next segment */
+      do {
+       if (!iter_step (table))
+         break;
+      } while (!table->dir[table->iter_i][table->iter_j]);
+      table->iter_tail = table->dir[table->iter_i][table->iter_j];
+    }
+  }
+
   *p = (*p)->chain;
   q->chain = table->free_list;
   table->free_list = q;
+  --table->nkey;
 
   return q->entry.dptr;
 }